Skip to content

Commit 7f77dcc

Browse files
authored
feat: improve config typing (#221)
Updated extension config type for all drivers
1 parent d1a061f commit 7f77dcc

File tree

14 files changed

+95
-127
lines changed

14 files changed

+95
-127
lines changed

sqlspec/adapters/adbc/config.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
from sqlspec.adapters.adbc._types import AdbcConnection
1111
from sqlspec.adapters.adbc.driver import AdbcCursor, AdbcDriver, get_adbc_statement_config
12-
from sqlspec.config import NoPoolSyncConfig
12+
from sqlspec.config import ADKConfig, FastAPIConfig, FlaskConfig, LitestarConfig, NoPoolSyncConfig, StarletteConfig
1313
from sqlspec.core.statement import StatementConfig
1414
from sqlspec.exceptions import ImproperConfigurationError
1515
from sqlspec.utils.module_loader import import_string
@@ -110,7 +110,7 @@ def __init__(
110110
statement_config: StatementConfig | None = None,
111111
driver_features: "AdbcDriverFeatures | dict[str, Any] | None" = None,
112112
bind_key: str | None = None,
113-
extension_config: "dict[str, dict[str, Any]] | None" = None,
113+
extension_config: "dict[str, dict[str, Any]] | LitestarConfig | FastAPIConfig | StarletteConfig | FlaskConfig | ADKConfig | None" = None,
114114
) -> None:
115115
"""Initialize configuration.
116116

sqlspec/adapters/aiosqlite/config.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
AiosqlitePoolClosedError,
1515
AiosqlitePoolConnection,
1616
)
17-
from sqlspec.config import AsyncDatabaseConfig
17+
from sqlspec.config import ADKConfig, AsyncDatabaseConfig, FastAPIConfig, FlaskConfig, LitestarConfig, StarletteConfig
1818
from sqlspec.utils.serializers import from_json, to_json
1919

2020
if TYPE_CHECKING:
@@ -84,7 +84,7 @@ def __init__(
8484
statement_config: "StatementConfig | None" = None,
8585
driver_features: "AiosqliteDriverFeatures | dict[str, Any] | None" = None,
8686
bind_key: "str | None" = None,
87-
extension_config: "dict[str, dict[str, Any]] | None" = None,
87+
extension_config: "dict[str, dict[str, Any]] | LitestarConfig | FastAPIConfig | StarletteConfig | FlaskConfig | ADKConfig | None" = None,
8888
) -> None:
8989
"""Initialize AioSQLite configuration.
9090

sqlspec/adapters/asyncmy/config.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
from sqlspec.adapters.asyncmy._types import AsyncmyConnection
1414
from sqlspec.adapters.asyncmy.driver import AsyncmyCursor, AsyncmyDriver, asyncmy_statement_config
15-
from sqlspec.config import AsyncDatabaseConfig
15+
from sqlspec.config import ADKConfig, AsyncDatabaseConfig, FastAPIConfig, FlaskConfig, LitestarConfig, StarletteConfig
1616
from sqlspec.utils.serializers import from_json, to_json
1717

1818
if TYPE_CHECKING:
@@ -94,7 +94,7 @@ def __init__(
9494
statement_config: "StatementConfig | None" = None,
9595
driver_features: "AsyncmyDriverFeatures | dict[str, Any] | None" = None,
9696
bind_key: "str | None" = None,
97-
extension_config: "dict[str, dict[str, Any]] | None" = None,
97+
extension_config: "dict[str, dict[str, Any]] | LitestarConfig | FastAPIConfig | StarletteConfig | FlaskConfig | ADKConfig | None" = None,
9898
) -> None:
9999
"""Initialize Asyncmy configuration.
100100

sqlspec/adapters/asyncpg/config.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
from sqlspec.adapters.asyncpg._types import AsyncpgConnection
1515
from sqlspec.adapters.asyncpg.driver import AsyncpgCursor, AsyncpgDriver, asyncpg_statement_config
16-
from sqlspec.config import AsyncDatabaseConfig
16+
from sqlspec.config import ADKConfig, AsyncDatabaseConfig, FastAPIConfig, FlaskConfig, LitestarConfig, StarletteConfig
1717
from sqlspec.typing import PGVECTOR_INSTALLED
1818
from sqlspec.utils.serializers import from_json, to_json
1919

@@ -107,7 +107,7 @@ def __init__(
107107
statement_config: "StatementConfig | None" = None,
108108
driver_features: "AsyncpgDriverFeatures | dict[str, Any] | None" = None,
109109
bind_key: "str | None" = None,
110-
extension_config: "dict[str, dict[str, Any]] | None" = None,
110+
extension_config: "dict[str, dict[str, Any]] | LitestarConfig | FastAPIConfig | StarletteConfig | FlaskConfig | ADKConfig | None" = None,
111111
) -> None:
112112
"""Initialize AsyncPG configuration.
113113

sqlspec/adapters/bigquery/config.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
from sqlspec.adapters.bigquery._types import BigQueryConnection
1111
from sqlspec.adapters.bigquery.driver import BigQueryCursor, BigQueryDriver, bigquery_statement_config
12-
from sqlspec.config import NoPoolSyncConfig
12+
from sqlspec.config import ADKConfig, FastAPIConfig, FlaskConfig, LitestarConfig, NoPoolSyncConfig, StarletteConfig
1313
from sqlspec.exceptions import ImproperConfigurationError
1414
from sqlspec.typing import Empty
1515

@@ -109,7 +109,7 @@ def __init__(
109109
statement_config: "StatementConfig | None" = None,
110110
driver_features: "BigQueryDriverFeatures | dict[str, Any] | None" = None,
111111
bind_key: "str | None" = None,
112-
extension_config: "dict[str, dict[str, Any]] | None" = None,
112+
extension_config: "dict[str, dict[str, Any]] | LitestarConfig | FastAPIConfig | StarletteConfig | FlaskConfig | ADKConfig | None" = None,
113113
) -> None:
114114
"""Initialize BigQuery configuration.
115115

sqlspec/adapters/duckdb/config.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from sqlspec.adapters.duckdb._types import DuckDBConnection
1010
from sqlspec.adapters.duckdb.driver import DuckDBCursor, DuckDBDriver, duckdb_statement_config
1111
from sqlspec.adapters.duckdb.pool import DuckDBConnectionPool
12-
from sqlspec.config import SyncDatabaseConfig
12+
from sqlspec.config import ADKConfig, FastAPIConfig, FlaskConfig, LitestarConfig, StarletteConfig, SyncDatabaseConfig
1313

1414
if TYPE_CHECKING:
1515
from collections.abc import Callable, Generator
@@ -187,7 +187,7 @@ def __init__(
187187
statement_config: "StatementConfig | None" = None,
188188
driver_features: "DuckDBDriverFeatures | dict[str, Any] | None" = None,
189189
bind_key: "str | None" = None,
190-
extension_config: "dict[str, dict[str, Any]] | None" = None,
190+
extension_config: "dict[str, dict[str, Any]] | LitestarConfig | FastAPIConfig | StarletteConfig | FlaskConfig | ADKConfig | None" = None,
191191
) -> None:
192192
"""Initialize DuckDB configuration.
193193

sqlspec/adapters/oracledb/config.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,15 @@
2323
oracledb_statement_config,
2424
)
2525
from sqlspec.adapters.oracledb.migrations import OracleAsyncMigrationTracker, OracleSyncMigrationTracker
26-
from sqlspec.config import AsyncDatabaseConfig, SyncDatabaseConfig
26+
from sqlspec.config import (
27+
ADKConfig,
28+
AsyncDatabaseConfig,
29+
FastAPIConfig,
30+
FlaskConfig,
31+
LitestarConfig,
32+
StarletteConfig,
33+
SyncDatabaseConfig,
34+
)
2735
from sqlspec.typing import NUMPY_INSTALLED
2836

2937
if TYPE_CHECKING:
@@ -121,7 +129,7 @@ def __init__(
121129
statement_config: "StatementConfig | None" = None,
122130
driver_features: "OracleDriverFeatures | dict[str, Any] | None" = None,
123131
bind_key: "str | None" = None,
124-
extension_config: "dict[str, dict[str, Any]] | None" = None,
132+
extension_config: "dict[str, dict[str, Any]] | LitestarConfig | FastAPIConfig | StarletteConfig | FlaskConfig | ADKConfig | None" = None,
125133
) -> None:
126134
"""Initialize Oracle synchronous configuration.
127135
@@ -281,7 +289,7 @@ def __init__(
281289
statement_config: "StatementConfig | None" = None,
282290
driver_features: "OracleDriverFeatures | dict[str, Any] | None" = None,
283291
bind_key: "str | None" = None,
284-
extension_config: "dict[str, dict[str, Any]] | None" = None,
292+
extension_config: "dict[str, dict[str, Any]] | LitestarConfig | FastAPIConfig | StarletteConfig | FlaskConfig | ADKConfig | None" = None,
285293
) -> None:
286294
"""Initialize Oracle asynchronous configuration.
287295

sqlspec/adapters/oracledb/driver.py

Lines changed: 18 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ async def __aexit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> None:
202202
self.cursor.close()
203203

204204

205-
class OracleSyncExceptionHandler:
205+
class OracleExceptionHandler:
206206
"""Context manager for handling Oracle database exceptions.
207207
208208
Maps Oracle ORA-XXXXX error codes to specific SQLSpec exceptions
@@ -211,16 +211,6 @@ class OracleSyncExceptionHandler:
211211

212212
__slots__ = ()
213213

214-
def __enter__(self) -> None:
215-
return None
216-
217-
def __exit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> None:
218-
_ = exc_tb
219-
if exc_type is None:
220-
return
221-
if issubclass(exc_type, oracledb.DatabaseError):
222-
self._map_oracle_exception(exc_val)
223-
224214
def _map_oracle_exception(self, e: Any) -> None:
225215
"""Map Oracle exception to SQLSpec exception.
226216
@@ -304,106 +294,40 @@ def _raise_generic_error(self, e: Any, code: "int | None") -> None:
304294
raise SQLSpecError(msg) from e
305295

306296

307-
class OracleAsyncExceptionHandler:
308-
"""Async context manager for handling Oracle database exceptions.
297+
class OracleSyncExceptionHandler(OracleExceptionHandler):
298+
"""Sync Context manager for handling Oracle database exceptions.
309299
310300
Maps Oracle ORA-XXXXX error codes to specific SQLSpec exceptions
311301
for better error handling in application code.
312302
"""
313303

314-
__slots__ = ()
315-
316-
async def __aenter__(self) -> None:
304+
def __enter__(self) -> None:
317305
return None
318306

319-
async def __aexit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> None:
307+
def __exit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> None:
320308
_ = exc_tb
321309
if exc_type is None:
322310
return
323311
if issubclass(exc_type, oracledb.DatabaseError):
324312
self._map_oracle_exception(exc_val)
325313

326-
def _map_oracle_exception(self, e: Any) -> None:
327-
"""Map Oracle exception to SQLSpec exception.
328-
329-
Args:
330-
e: oracledb.DatabaseError instance
331-
"""
332-
error_obj = e.args[0] if e.args else None
333-
if not error_obj:
334-
self._raise_generic_error(e, None)
335-
336-
error_code = getattr(error_obj, "code", None)
337-
338-
if not error_code:
339-
self._raise_generic_error(e, None)
340-
341-
if error_code == 1:
342-
self._raise_unique_violation(e, error_code)
343-
elif error_code in {2291, 2292}:
344-
self._raise_foreign_key_violation(e, error_code)
345-
elif error_code == ORA_CHECK_CONSTRAINT:
346-
self._raise_check_violation(e, error_code)
347-
elif error_code in {1400, 1407}:
348-
self._raise_not_null_violation(e, error_code)
349-
elif error_code and ORA_INTEGRITY_RANGE_START <= error_code < ORA_INTEGRITY_RANGE_END:
350-
self._raise_integrity_error(e, error_code)
351-
elif error_code in {1017, 12154, 12541, 12545, 12514, 12505}:
352-
self._raise_connection_error(e, error_code)
353-
elif error_code in {60, 8176}:
354-
self._raise_transaction_error(e, error_code)
355-
elif error_code in {1722, 1858, 1840}:
356-
self._raise_data_error(e, error_code)
357-
elif error_code and ORA_PARSING_RANGE_START <= error_code < ORA_PARSING_RANGE_END:
358-
self._raise_parsing_error(e, error_code)
359-
elif error_code == ORA_TABLESPACE_FULL:
360-
self._raise_operational_error(e, error_code)
361-
else:
362-
self._raise_generic_error(e, error_code)
363-
364-
def _raise_unique_violation(self, e: Any, code: int) -> None:
365-
msg = f"Oracle unique constraint violation [ORA-{code:05d}]: {e}"
366-
raise UniqueViolationError(msg) from e
367-
368-
def _raise_foreign_key_violation(self, e: Any, code: int) -> None:
369-
msg = f"Oracle foreign key constraint violation [ORA-{code:05d}]: {e}"
370-
raise ForeignKeyViolationError(msg) from e
371-
372-
def _raise_check_violation(self, e: Any, code: int) -> None:
373-
msg = f"Oracle check constraint violation [ORA-{code:05d}]: {e}"
374-
raise CheckViolationError(msg) from e
375314

376-
def _raise_not_null_violation(self, e: Any, code: int) -> None:
377-
msg = f"Oracle not-null constraint violation [ORA-{code:05d}]: {e}"
378-
raise NotNullViolationError(msg) from e
379-
380-
def _raise_integrity_error(self, e: Any, code: int) -> None:
381-
msg = f"Oracle integrity constraint violation [ORA-{code:05d}]: {e}"
382-
raise IntegrityError(msg) from e
383-
384-
def _raise_parsing_error(self, e: Any, code: int) -> None:
385-
msg = f"Oracle SQL syntax error [ORA-{code:05d}]: {e}"
386-
raise SQLParsingError(msg) from e
387-
388-
def _raise_connection_error(self, e: Any, code: int) -> None:
389-
msg = f"Oracle connection error [ORA-{code:05d}]: {e}"
390-
raise DatabaseConnectionError(msg) from e
391-
392-
def _raise_transaction_error(self, e: Any, code: int) -> None:
393-
msg = f"Oracle transaction error [ORA-{code:05d}]: {e}"
394-
raise TransactionError(msg) from e
315+
class OracleAsyncExceptionHandler(OracleExceptionHandler):
316+
"""Async context manager for handling Oracle database exceptions.
395317
396-
def _raise_data_error(self, e: Any, code: int) -> None:
397-
msg = f"Oracle data error [ORA-{code:05d}]: {e}"
398-
raise DataError(msg) from e
318+
Maps Oracle ORA-XXXXX error codes to specific SQLSpec exceptions
319+
for better error handling in application code.
320+
"""
399321

400-
def _raise_operational_error(self, e: Any, code: int) -> None:
401-
msg = f"Oracle operational error [ORA-{code:05d}]: {e}"
402-
raise OperationalError(msg) from e
322+
async def __aenter__(self) -> None:
323+
return None
403324

404-
def _raise_generic_error(self, e: Any, code: "int | None") -> None:
405-
msg = f"Oracle database error [ORA-{code:05d}]: {e}" if code else f"Oracle database error: {e}"
406-
raise SQLSpecError(msg) from e
325+
async def __aexit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> None:
326+
_ = exc_tb
327+
if exc_type is None:
328+
return
329+
if issubclass(exc_type, oracledb.DatabaseError):
330+
self._map_oracle_exception(exc_val)
407331

408332

409333
class OracleSyncDriver(SyncDriverAdapterBase):

sqlspec/adapters/psqlpy/config.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
from sqlspec.adapters.psqlpy._types import PsqlpyConnection
1212
from sqlspec.adapters.psqlpy.driver import PsqlpyCursor, PsqlpyDriver, psqlpy_statement_config
13-
from sqlspec.config import AsyncDatabaseConfig
13+
from sqlspec.config import ADKConfig, AsyncDatabaseConfig, FastAPIConfig, FlaskConfig, LitestarConfig, StarletteConfig
1414
from sqlspec.core.statement import StatementConfig
1515
from sqlspec.typing import PGVECTOR_INSTALLED
1616

@@ -105,7 +105,7 @@ def __init__(
105105
statement_config: StatementConfig | None = None,
106106
driver_features: "PsqlpyDriverFeatures | dict[str, Any] | None" = None,
107107
bind_key: str | None = None,
108-
extension_config: "dict[str, dict[str, Any]] | None" = None,
108+
extension_config: "dict[str, dict[str, Any]] | LitestarConfig | FastAPIConfig | StarletteConfig | FlaskConfig | ADKConfig | None" = None,
109109
) -> None:
110110
"""Initialize Psqlpy configuration.
111111

sqlspec/adapters/psycopg/config.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,15 @@
1717
PsycopgSyncDriver,
1818
psycopg_statement_config,
1919
)
20-
from sqlspec.config import AsyncDatabaseConfig, SyncDatabaseConfig
20+
from sqlspec.config import (
21+
ADKConfig,
22+
AsyncDatabaseConfig,
23+
FastAPIConfig,
24+
FlaskConfig,
25+
LitestarConfig,
26+
StarletteConfig,
27+
SyncDatabaseConfig,
28+
)
2129
from sqlspec.typing import PGVECTOR_INSTALLED
2230

2331
if TYPE_CHECKING:
@@ -106,7 +114,7 @@ def __init__(
106114
statement_config: "StatementConfig | None" = None,
107115
driver_features: "dict[str, Any] | None" = None,
108116
bind_key: "str | None" = None,
109-
extension_config: "dict[str, dict[str, Any]] | None" = None,
117+
extension_config: "dict[str, dict[str, Any]] | LitestarConfig | FastAPIConfig | StarletteConfig | FlaskConfig | ADKConfig | None" = None,
110118
) -> None:
111119
"""Initialize Psycopg synchronous configuration.
112120
@@ -297,7 +305,7 @@ def __init__(
297305
statement_config: "StatementConfig | None" = None,
298306
driver_features: "dict[str, Any] | None" = None,
299307
bind_key: "str | None" = None,
300-
extension_config: "dict[str, dict[str, Any]] | None" = None,
308+
extension_config: "dict[str, dict[str, Any]] | LitestarConfig | FastAPIConfig | StarletteConfig | FlaskConfig | ADKConfig | None" = None,
301309
) -> None:
302310
"""Initialize Psycopg asynchronous configuration.
303311

0 commit comments

Comments
 (0)