"""Snowflake config.""" from dataclasses import dataclass from snowflake.sqlalchemy import URL from sqlalchemy import Engine, create_engine from ..utils.strings import decrypt_rsa_file, encode_der from .db_config import DBConfig @dataclass class SnowflakeConfig(DBConfig): account: str user: str role: str database: str password: str | None = '' private_key_pass: str | None = None private_key_path: str | None = None schema: str | None = 'public' timezone: str | None = 'UTC' warehouse: str | None = None def get_engine(self) -> Engine: """Get SQLAlchemy engine.""" args = {} url = self.get_url() if self.private_key_path is not None: key = decrypt_rsa_file(self.private_key_path, self.private_key_pass) args['private_key'] = encode_der(key) return create_engine(url, connect_args=args) def get_url(self) -> URL: """Get a connection URL.""" return URL( account=self.account, user=self.user, password=self.password or '', database=self.database, schema=self.schema, warehouse=self.warehouse, role=self.role, timezone=self.timezone, ) def get_vendor(self) -> str: """Get database vendor.""" return 'snowflake' def __repr__(self) -> str: """Represent the config as a string.""" return f'{self.get_url()}'