sqlspec 0.36.0__cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (531) hide show
  1. ac8f31065839703b4e70__mypyc.cpython-310-aarch64-linux-gnu.so +0 -0
  2. sqlspec/__init__.py +140 -0
  3. sqlspec/__main__.py +12 -0
  4. sqlspec/__metadata__.py +14 -0
  5. sqlspec/_serialization.py +315 -0
  6. sqlspec/_typing.py +700 -0
  7. sqlspec/adapters/__init__.py +0 -0
  8. sqlspec/adapters/adbc/__init__.py +5 -0
  9. sqlspec/adapters/adbc/_typing.py +82 -0
  10. sqlspec/adapters/adbc/adk/__init__.py +5 -0
  11. sqlspec/adapters/adbc/adk/store.py +1273 -0
  12. sqlspec/adapters/adbc/config.py +295 -0
  13. sqlspec/adapters/adbc/core.cpython-310-aarch64-linux-gnu.so +0 -0
  14. sqlspec/adapters/adbc/core.py +735 -0
  15. sqlspec/adapters/adbc/data_dictionary.py +334 -0
  16. sqlspec/adapters/adbc/driver.py +529 -0
  17. sqlspec/adapters/adbc/events/__init__.py +5 -0
  18. sqlspec/adapters/adbc/events/store.py +285 -0
  19. sqlspec/adapters/adbc/litestar/__init__.py +5 -0
  20. sqlspec/adapters/adbc/litestar/store.py +502 -0
  21. sqlspec/adapters/adbc/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  22. sqlspec/adapters/adbc/type_converter.py +140 -0
  23. sqlspec/adapters/aiosqlite/__init__.py +25 -0
  24. sqlspec/adapters/aiosqlite/_typing.py +82 -0
  25. sqlspec/adapters/aiosqlite/adk/__init__.py +5 -0
  26. sqlspec/adapters/aiosqlite/adk/store.py +818 -0
  27. sqlspec/adapters/aiosqlite/config.py +334 -0
  28. sqlspec/adapters/aiosqlite/core.cpython-310-aarch64-linux-gnu.so +0 -0
  29. sqlspec/adapters/aiosqlite/core.py +315 -0
  30. sqlspec/adapters/aiosqlite/data_dictionary.py +208 -0
  31. sqlspec/adapters/aiosqlite/driver.py +313 -0
  32. sqlspec/adapters/aiosqlite/events/__init__.py +5 -0
  33. sqlspec/adapters/aiosqlite/events/store.py +20 -0
  34. sqlspec/adapters/aiosqlite/litestar/__init__.py +5 -0
  35. sqlspec/adapters/aiosqlite/litestar/store.py +279 -0
  36. sqlspec/adapters/aiosqlite/pool.py +533 -0
  37. sqlspec/adapters/asyncmy/__init__.py +21 -0
  38. sqlspec/adapters/asyncmy/_typing.py +87 -0
  39. sqlspec/adapters/asyncmy/adk/__init__.py +5 -0
  40. sqlspec/adapters/asyncmy/adk/store.py +703 -0
  41. sqlspec/adapters/asyncmy/config.py +302 -0
  42. sqlspec/adapters/asyncmy/core.cpython-310-aarch64-linux-gnu.so +0 -0
  43. sqlspec/adapters/asyncmy/core.py +360 -0
  44. sqlspec/adapters/asyncmy/data_dictionary.py +124 -0
  45. sqlspec/adapters/asyncmy/driver.py +383 -0
  46. sqlspec/adapters/asyncmy/events/__init__.py +5 -0
  47. sqlspec/adapters/asyncmy/events/store.py +104 -0
  48. sqlspec/adapters/asyncmy/litestar/__init__.py +5 -0
  49. sqlspec/adapters/asyncmy/litestar/store.py +296 -0
  50. sqlspec/adapters/asyncpg/__init__.py +19 -0
  51. sqlspec/adapters/asyncpg/_typing.py +88 -0
  52. sqlspec/adapters/asyncpg/adk/__init__.py +5 -0
  53. sqlspec/adapters/asyncpg/adk/store.py +748 -0
  54. sqlspec/adapters/asyncpg/config.py +569 -0
  55. sqlspec/adapters/asyncpg/core.cpython-310-aarch64-linux-gnu.so +0 -0
  56. sqlspec/adapters/asyncpg/core.py +367 -0
  57. sqlspec/adapters/asyncpg/data_dictionary.py +162 -0
  58. sqlspec/adapters/asyncpg/driver.py +487 -0
  59. sqlspec/adapters/asyncpg/events/__init__.py +6 -0
  60. sqlspec/adapters/asyncpg/events/backend.py +286 -0
  61. sqlspec/adapters/asyncpg/events/store.py +40 -0
  62. sqlspec/adapters/asyncpg/litestar/__init__.py +5 -0
  63. sqlspec/adapters/asyncpg/litestar/store.py +251 -0
  64. sqlspec/adapters/bigquery/__init__.py +14 -0
  65. sqlspec/adapters/bigquery/_typing.py +86 -0
  66. sqlspec/adapters/bigquery/adk/__init__.py +5 -0
  67. sqlspec/adapters/bigquery/adk/store.py +827 -0
  68. sqlspec/adapters/bigquery/config.py +353 -0
  69. sqlspec/adapters/bigquery/core.cpython-310-aarch64-linux-gnu.so +0 -0
  70. sqlspec/adapters/bigquery/core.py +715 -0
  71. sqlspec/adapters/bigquery/data_dictionary.py +128 -0
  72. sqlspec/adapters/bigquery/driver.py +548 -0
  73. sqlspec/adapters/bigquery/events/__init__.py +5 -0
  74. sqlspec/adapters/bigquery/events/store.py +139 -0
  75. sqlspec/adapters/bigquery/litestar/__init__.py +5 -0
  76. sqlspec/adapters/bigquery/litestar/store.py +325 -0
  77. sqlspec/adapters/bigquery/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  78. sqlspec/adapters/bigquery/type_converter.py +107 -0
  79. sqlspec/adapters/cockroach_asyncpg/__init__.py +24 -0
  80. sqlspec/adapters/cockroach_asyncpg/_typing.py +72 -0
  81. sqlspec/adapters/cockroach_asyncpg/adk/__init__.py +3 -0
  82. sqlspec/adapters/cockroach_asyncpg/adk/store.py +410 -0
  83. sqlspec/adapters/cockroach_asyncpg/config.py +238 -0
  84. sqlspec/adapters/cockroach_asyncpg/core.cpython-310-aarch64-linux-gnu.so +0 -0
  85. sqlspec/adapters/cockroach_asyncpg/core.py +55 -0
  86. sqlspec/adapters/cockroach_asyncpg/data_dictionary.py +107 -0
  87. sqlspec/adapters/cockroach_asyncpg/driver.py +144 -0
  88. sqlspec/adapters/cockroach_asyncpg/events/__init__.py +3 -0
  89. sqlspec/adapters/cockroach_asyncpg/events/store.py +20 -0
  90. sqlspec/adapters/cockroach_asyncpg/litestar/__init__.py +3 -0
  91. sqlspec/adapters/cockroach_asyncpg/litestar/store.py +142 -0
  92. sqlspec/adapters/cockroach_psycopg/__init__.py +38 -0
  93. sqlspec/adapters/cockroach_psycopg/_typing.py +129 -0
  94. sqlspec/adapters/cockroach_psycopg/adk/__init__.py +13 -0
  95. sqlspec/adapters/cockroach_psycopg/adk/store.py +868 -0
  96. sqlspec/adapters/cockroach_psycopg/config.py +484 -0
  97. sqlspec/adapters/cockroach_psycopg/core.cpython-310-aarch64-linux-gnu.so +0 -0
  98. sqlspec/adapters/cockroach_psycopg/core.py +63 -0
  99. sqlspec/adapters/cockroach_psycopg/data_dictionary.py +215 -0
  100. sqlspec/adapters/cockroach_psycopg/driver.py +284 -0
  101. sqlspec/adapters/cockroach_psycopg/events/__init__.py +6 -0
  102. sqlspec/adapters/cockroach_psycopg/events/store.py +34 -0
  103. sqlspec/adapters/cockroach_psycopg/litestar/__init__.py +3 -0
  104. sqlspec/adapters/cockroach_psycopg/litestar/store.py +325 -0
  105. sqlspec/adapters/duckdb/__init__.py +25 -0
  106. sqlspec/adapters/duckdb/_typing.py +81 -0
  107. sqlspec/adapters/duckdb/adk/__init__.py +14 -0
  108. sqlspec/adapters/duckdb/adk/store.py +850 -0
  109. sqlspec/adapters/duckdb/config.py +463 -0
  110. sqlspec/adapters/duckdb/core.cpython-310-aarch64-linux-gnu.so +0 -0
  111. sqlspec/adapters/duckdb/core.py +257 -0
  112. sqlspec/adapters/duckdb/data_dictionary.py +140 -0
  113. sqlspec/adapters/duckdb/driver.py +430 -0
  114. sqlspec/adapters/duckdb/events/__init__.py +5 -0
  115. sqlspec/adapters/duckdb/events/store.py +57 -0
  116. sqlspec/adapters/duckdb/litestar/__init__.py +5 -0
  117. sqlspec/adapters/duckdb/litestar/store.py +330 -0
  118. sqlspec/adapters/duckdb/pool.py +293 -0
  119. sqlspec/adapters/duckdb/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  120. sqlspec/adapters/duckdb/type_converter.py +118 -0
  121. sqlspec/adapters/mock/__init__.py +72 -0
  122. sqlspec/adapters/mock/_typing.py +147 -0
  123. sqlspec/adapters/mock/config.py +483 -0
  124. sqlspec/adapters/mock/core.py +319 -0
  125. sqlspec/adapters/mock/data_dictionary.py +366 -0
  126. sqlspec/adapters/mock/driver.py +721 -0
  127. sqlspec/adapters/mysqlconnector/__init__.py +36 -0
  128. sqlspec/adapters/mysqlconnector/_typing.py +141 -0
  129. sqlspec/adapters/mysqlconnector/adk/__init__.py +15 -0
  130. sqlspec/adapters/mysqlconnector/adk/store.py +1060 -0
  131. sqlspec/adapters/mysqlconnector/config.py +394 -0
  132. sqlspec/adapters/mysqlconnector/core.cpython-310-aarch64-linux-gnu.so +0 -0
  133. sqlspec/adapters/mysqlconnector/core.py +303 -0
  134. sqlspec/adapters/mysqlconnector/data_dictionary.py +235 -0
  135. sqlspec/adapters/mysqlconnector/driver.py +483 -0
  136. sqlspec/adapters/mysqlconnector/events/__init__.py +8 -0
  137. sqlspec/adapters/mysqlconnector/events/store.py +98 -0
  138. sqlspec/adapters/mysqlconnector/litestar/__init__.py +5 -0
  139. sqlspec/adapters/mysqlconnector/litestar/store.py +426 -0
  140. sqlspec/adapters/oracledb/__init__.py +60 -0
  141. sqlspec/adapters/oracledb/_numpy_handlers.py +141 -0
  142. sqlspec/adapters/oracledb/_typing.py +182 -0
  143. sqlspec/adapters/oracledb/_uuid_handlers.py +166 -0
  144. sqlspec/adapters/oracledb/adk/__init__.py +10 -0
  145. sqlspec/adapters/oracledb/adk/store.py +2369 -0
  146. sqlspec/adapters/oracledb/config.py +550 -0
  147. sqlspec/adapters/oracledb/core.cpython-310-aarch64-linux-gnu.so +0 -0
  148. sqlspec/adapters/oracledb/core.py +543 -0
  149. sqlspec/adapters/oracledb/data_dictionary.py +536 -0
  150. sqlspec/adapters/oracledb/driver.py +1229 -0
  151. sqlspec/adapters/oracledb/events/__init__.py +16 -0
  152. sqlspec/adapters/oracledb/events/backend.py +347 -0
  153. sqlspec/adapters/oracledb/events/store.py +420 -0
  154. sqlspec/adapters/oracledb/litestar/__init__.py +5 -0
  155. sqlspec/adapters/oracledb/litestar/store.py +781 -0
  156. sqlspec/adapters/oracledb/migrations.py +535 -0
  157. sqlspec/adapters/oracledb/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  158. sqlspec/adapters/oracledb/type_converter.py +211 -0
  159. sqlspec/adapters/psqlpy/__init__.py +17 -0
  160. sqlspec/adapters/psqlpy/_typing.py +79 -0
  161. sqlspec/adapters/psqlpy/adk/__init__.py +5 -0
  162. sqlspec/adapters/psqlpy/adk/store.py +766 -0
  163. sqlspec/adapters/psqlpy/config.py +304 -0
  164. sqlspec/adapters/psqlpy/core.cpython-310-aarch64-linux-gnu.so +0 -0
  165. sqlspec/adapters/psqlpy/core.py +480 -0
  166. sqlspec/adapters/psqlpy/data_dictionary.py +126 -0
  167. sqlspec/adapters/psqlpy/driver.py +438 -0
  168. sqlspec/adapters/psqlpy/events/__init__.py +6 -0
  169. sqlspec/adapters/psqlpy/events/backend.py +310 -0
  170. sqlspec/adapters/psqlpy/events/store.py +20 -0
  171. sqlspec/adapters/psqlpy/litestar/__init__.py +5 -0
  172. sqlspec/adapters/psqlpy/litestar/store.py +270 -0
  173. sqlspec/adapters/psqlpy/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  174. sqlspec/adapters/psqlpy/type_converter.py +113 -0
  175. sqlspec/adapters/psycopg/__init__.py +32 -0
  176. sqlspec/adapters/psycopg/_typing.py +164 -0
  177. sqlspec/adapters/psycopg/adk/__init__.py +10 -0
  178. sqlspec/adapters/psycopg/adk/store.py +1387 -0
  179. sqlspec/adapters/psycopg/config.py +576 -0
  180. sqlspec/adapters/psycopg/core.cpython-310-aarch64-linux-gnu.so +0 -0
  181. sqlspec/adapters/psycopg/core.py +450 -0
  182. sqlspec/adapters/psycopg/data_dictionary.py +289 -0
  183. sqlspec/adapters/psycopg/driver.py +975 -0
  184. sqlspec/adapters/psycopg/events/__init__.py +20 -0
  185. sqlspec/adapters/psycopg/events/backend.py +458 -0
  186. sqlspec/adapters/psycopg/events/store.py +42 -0
  187. sqlspec/adapters/psycopg/litestar/__init__.py +5 -0
  188. sqlspec/adapters/psycopg/litestar/store.py +552 -0
  189. sqlspec/adapters/psycopg/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  190. sqlspec/adapters/psycopg/type_converter.py +93 -0
  191. sqlspec/adapters/pymysql/__init__.py +21 -0
  192. sqlspec/adapters/pymysql/_typing.py +71 -0
  193. sqlspec/adapters/pymysql/adk/__init__.py +5 -0
  194. sqlspec/adapters/pymysql/adk/store.py +540 -0
  195. sqlspec/adapters/pymysql/config.py +195 -0
  196. sqlspec/adapters/pymysql/core.cpython-310-aarch64-linux-gnu.so +0 -0
  197. sqlspec/adapters/pymysql/core.py +299 -0
  198. sqlspec/adapters/pymysql/data_dictionary.py +122 -0
  199. sqlspec/adapters/pymysql/driver.py +259 -0
  200. sqlspec/adapters/pymysql/events/__init__.py +5 -0
  201. sqlspec/adapters/pymysql/events/store.py +50 -0
  202. sqlspec/adapters/pymysql/litestar/__init__.py +5 -0
  203. sqlspec/adapters/pymysql/litestar/store.py +232 -0
  204. sqlspec/adapters/pymysql/pool.py +137 -0
  205. sqlspec/adapters/spanner/__init__.py +40 -0
  206. sqlspec/adapters/spanner/_typing.py +86 -0
  207. sqlspec/adapters/spanner/adk/__init__.py +5 -0
  208. sqlspec/adapters/spanner/adk/store.py +732 -0
  209. sqlspec/adapters/spanner/config.py +352 -0
  210. sqlspec/adapters/spanner/core.cpython-310-aarch64-linux-gnu.so +0 -0
  211. sqlspec/adapters/spanner/core.py +188 -0
  212. sqlspec/adapters/spanner/data_dictionary.py +120 -0
  213. sqlspec/adapters/spanner/dialect/__init__.py +6 -0
  214. sqlspec/adapters/spanner/dialect/_spangres.py +57 -0
  215. sqlspec/adapters/spanner/dialect/_spanner.py +130 -0
  216. sqlspec/adapters/spanner/driver.py +373 -0
  217. sqlspec/adapters/spanner/events/__init__.py +5 -0
  218. sqlspec/adapters/spanner/events/store.py +187 -0
  219. sqlspec/adapters/spanner/litestar/__init__.py +5 -0
  220. sqlspec/adapters/spanner/litestar/store.py +291 -0
  221. sqlspec/adapters/spanner/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  222. sqlspec/adapters/spanner/type_converter.py +331 -0
  223. sqlspec/adapters/sqlite/__init__.py +19 -0
  224. sqlspec/adapters/sqlite/_typing.py +80 -0
  225. sqlspec/adapters/sqlite/adk/__init__.py +5 -0
  226. sqlspec/adapters/sqlite/adk/store.py +958 -0
  227. sqlspec/adapters/sqlite/config.py +280 -0
  228. sqlspec/adapters/sqlite/core.cpython-310-aarch64-linux-gnu.so +0 -0
  229. sqlspec/adapters/sqlite/core.py +312 -0
  230. sqlspec/adapters/sqlite/data_dictionary.py +202 -0
  231. sqlspec/adapters/sqlite/driver.py +359 -0
  232. sqlspec/adapters/sqlite/events/__init__.py +5 -0
  233. sqlspec/adapters/sqlite/events/store.py +20 -0
  234. sqlspec/adapters/sqlite/litestar/__init__.py +5 -0
  235. sqlspec/adapters/sqlite/litestar/store.py +316 -0
  236. sqlspec/adapters/sqlite/pool.py +198 -0
  237. sqlspec/adapters/sqlite/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  238. sqlspec/adapters/sqlite/type_converter.py +114 -0
  239. sqlspec/base.py +747 -0
  240. sqlspec/builder/__init__.py +179 -0
  241. sqlspec/builder/_base.cpython-310-aarch64-linux-gnu.so +0 -0
  242. sqlspec/builder/_base.py +1022 -0
  243. sqlspec/builder/_column.cpython-310-aarch64-linux-gnu.so +0 -0
  244. sqlspec/builder/_column.py +521 -0
  245. sqlspec/builder/_ddl.cpython-310-aarch64-linux-gnu.so +0 -0
  246. sqlspec/builder/_ddl.py +1642 -0
  247. sqlspec/builder/_delete.cpython-310-aarch64-linux-gnu.so +0 -0
  248. sqlspec/builder/_delete.py +95 -0
  249. sqlspec/builder/_dml.cpython-310-aarch64-linux-gnu.so +0 -0
  250. sqlspec/builder/_dml.py +365 -0
  251. sqlspec/builder/_explain.cpython-310-aarch64-linux-gnu.so +0 -0
  252. sqlspec/builder/_explain.py +579 -0
  253. sqlspec/builder/_expression_wrappers.cpython-310-aarch64-linux-gnu.so +0 -0
  254. sqlspec/builder/_expression_wrappers.py +46 -0
  255. sqlspec/builder/_factory.cpython-310-aarch64-linux-gnu.so +0 -0
  256. sqlspec/builder/_factory.py +1697 -0
  257. sqlspec/builder/_insert.cpython-310-aarch64-linux-gnu.so +0 -0
  258. sqlspec/builder/_insert.py +328 -0
  259. sqlspec/builder/_join.cpython-310-aarch64-linux-gnu.so +0 -0
  260. sqlspec/builder/_join.py +499 -0
  261. sqlspec/builder/_merge.cpython-310-aarch64-linux-gnu.so +0 -0
  262. sqlspec/builder/_merge.py +821 -0
  263. sqlspec/builder/_parsing_utils.cpython-310-aarch64-linux-gnu.so +0 -0
  264. sqlspec/builder/_parsing_utils.py +297 -0
  265. sqlspec/builder/_select.cpython-310-aarch64-linux-gnu.so +0 -0
  266. sqlspec/builder/_select.py +1660 -0
  267. sqlspec/builder/_temporal.cpython-310-aarch64-linux-gnu.so +0 -0
  268. sqlspec/builder/_temporal.py +139 -0
  269. sqlspec/builder/_update.cpython-310-aarch64-linux-gnu.so +0 -0
  270. sqlspec/builder/_update.py +173 -0
  271. sqlspec/builder/_vector_expressions.py +267 -0
  272. sqlspec/cli.py +911 -0
  273. sqlspec/config.py +1755 -0
  274. sqlspec/core/__init__.py +374 -0
  275. sqlspec/core/_correlation.cpython-310-aarch64-linux-gnu.so +0 -0
  276. sqlspec/core/_correlation.py +176 -0
  277. sqlspec/core/cache.cpython-310-aarch64-linux-gnu.so +0 -0
  278. sqlspec/core/cache.py +1069 -0
  279. sqlspec/core/compiler.cpython-310-aarch64-linux-gnu.so +0 -0
  280. sqlspec/core/compiler.py +954 -0
  281. sqlspec/core/explain.cpython-310-aarch64-linux-gnu.so +0 -0
  282. sqlspec/core/explain.py +275 -0
  283. sqlspec/core/filters.cpython-310-aarch64-linux-gnu.so +0 -0
  284. sqlspec/core/filters.py +952 -0
  285. sqlspec/core/hashing.cpython-310-aarch64-linux-gnu.so +0 -0
  286. sqlspec/core/hashing.py +262 -0
  287. sqlspec/core/metrics.cpython-310-aarch64-linux-gnu.so +0 -0
  288. sqlspec/core/metrics.py +83 -0
  289. sqlspec/core/parameters/__init__.py +71 -0
  290. sqlspec/core/parameters/_alignment.cpython-310-aarch64-linux-gnu.so +0 -0
  291. sqlspec/core/parameters/_alignment.py +270 -0
  292. sqlspec/core/parameters/_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  293. sqlspec/core/parameters/_converter.py +543 -0
  294. sqlspec/core/parameters/_processor.cpython-310-aarch64-linux-gnu.so +0 -0
  295. sqlspec/core/parameters/_processor.py +505 -0
  296. sqlspec/core/parameters/_registry.cpython-310-aarch64-linux-gnu.so +0 -0
  297. sqlspec/core/parameters/_registry.py +206 -0
  298. sqlspec/core/parameters/_transformers.cpython-310-aarch64-linux-gnu.so +0 -0
  299. sqlspec/core/parameters/_transformers.py +292 -0
  300. sqlspec/core/parameters/_types.cpython-310-aarch64-linux-gnu.so +0 -0
  301. sqlspec/core/parameters/_types.py +499 -0
  302. sqlspec/core/parameters/_validator.cpython-310-aarch64-linux-gnu.so +0 -0
  303. sqlspec/core/parameters/_validator.py +180 -0
  304. sqlspec/core/pipeline.cpython-310-aarch64-linux-gnu.so +0 -0
  305. sqlspec/core/pipeline.py +319 -0
  306. sqlspec/core/query_modifiers.cpython-310-aarch64-linux-gnu.so +0 -0
  307. sqlspec/core/query_modifiers.py +437 -0
  308. sqlspec/core/result/__init__.py +23 -0
  309. sqlspec/core/result/_base.cpython-310-aarch64-linux-gnu.so +0 -0
  310. sqlspec/core/result/_base.py +1121 -0
  311. sqlspec/core/result/_io.cpython-310-aarch64-linux-gnu.so +0 -0
  312. sqlspec/core/result/_io.py +28 -0
  313. sqlspec/core/splitter.cpython-310-aarch64-linux-gnu.so +0 -0
  314. sqlspec/core/splitter.py +966 -0
  315. sqlspec/core/stack.cpython-310-aarch64-linux-gnu.so +0 -0
  316. sqlspec/core/stack.py +163 -0
  317. sqlspec/core/statement.cpython-310-aarch64-linux-gnu.so +0 -0
  318. sqlspec/core/statement.py +1503 -0
  319. sqlspec/core/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  320. sqlspec/core/type_converter.py +339 -0
  321. sqlspec/data_dictionary/__init__.py +22 -0
  322. sqlspec/data_dictionary/_loader.py +123 -0
  323. sqlspec/data_dictionary/_registry.cpython-310-aarch64-linux-gnu.so +0 -0
  324. sqlspec/data_dictionary/_registry.py +74 -0
  325. sqlspec/data_dictionary/_types.cpython-310-aarch64-linux-gnu.so +0 -0
  326. sqlspec/data_dictionary/_types.py +121 -0
  327. sqlspec/data_dictionary/dialects/__init__.py +21 -0
  328. sqlspec/data_dictionary/dialects/bigquery.cpython-310-aarch64-linux-gnu.so +0 -0
  329. sqlspec/data_dictionary/dialects/bigquery.py +49 -0
  330. sqlspec/data_dictionary/dialects/cockroachdb.cpython-310-aarch64-linux-gnu.so +0 -0
  331. sqlspec/data_dictionary/dialects/cockroachdb.py +43 -0
  332. sqlspec/data_dictionary/dialects/duckdb.cpython-310-aarch64-linux-gnu.so +0 -0
  333. sqlspec/data_dictionary/dialects/duckdb.py +47 -0
  334. sqlspec/data_dictionary/dialects/mysql.cpython-310-aarch64-linux-gnu.so +0 -0
  335. sqlspec/data_dictionary/dialects/mysql.py +42 -0
  336. sqlspec/data_dictionary/dialects/oracle.cpython-310-aarch64-linux-gnu.so +0 -0
  337. sqlspec/data_dictionary/dialects/oracle.py +34 -0
  338. sqlspec/data_dictionary/dialects/postgres.cpython-310-aarch64-linux-gnu.so +0 -0
  339. sqlspec/data_dictionary/dialects/postgres.py +46 -0
  340. sqlspec/data_dictionary/dialects/spanner.cpython-310-aarch64-linux-gnu.so +0 -0
  341. sqlspec/data_dictionary/dialects/spanner.py +37 -0
  342. sqlspec/data_dictionary/dialects/sqlite.cpython-310-aarch64-linux-gnu.so +0 -0
  343. sqlspec/data_dictionary/dialects/sqlite.py +42 -0
  344. sqlspec/data_dictionary/sql/.gitkeep +0 -0
  345. sqlspec/data_dictionary/sql/bigquery/columns.sql +23 -0
  346. sqlspec/data_dictionary/sql/bigquery/foreign_keys.sql +34 -0
  347. sqlspec/data_dictionary/sql/bigquery/indexes.sql +19 -0
  348. sqlspec/data_dictionary/sql/bigquery/tables.sql +33 -0
  349. sqlspec/data_dictionary/sql/bigquery/version.sql +3 -0
  350. sqlspec/data_dictionary/sql/cockroachdb/columns.sql +34 -0
  351. sqlspec/data_dictionary/sql/cockroachdb/foreign_keys.sql +40 -0
  352. sqlspec/data_dictionary/sql/cockroachdb/indexes.sql +32 -0
  353. sqlspec/data_dictionary/sql/cockroachdb/tables.sql +44 -0
  354. sqlspec/data_dictionary/sql/cockroachdb/version.sql +3 -0
  355. sqlspec/data_dictionary/sql/duckdb/columns.sql +23 -0
  356. sqlspec/data_dictionary/sql/duckdb/foreign_keys.sql +36 -0
  357. sqlspec/data_dictionary/sql/duckdb/indexes.sql +19 -0
  358. sqlspec/data_dictionary/sql/duckdb/tables.sql +38 -0
  359. sqlspec/data_dictionary/sql/duckdb/version.sql +3 -0
  360. sqlspec/data_dictionary/sql/mysql/columns.sql +23 -0
  361. sqlspec/data_dictionary/sql/mysql/foreign_keys.sql +28 -0
  362. sqlspec/data_dictionary/sql/mysql/indexes.sql +26 -0
  363. sqlspec/data_dictionary/sql/mysql/tables.sql +33 -0
  364. sqlspec/data_dictionary/sql/mysql/version.sql +3 -0
  365. sqlspec/data_dictionary/sql/oracle/columns.sql +23 -0
  366. sqlspec/data_dictionary/sql/oracle/foreign_keys.sql +48 -0
  367. sqlspec/data_dictionary/sql/oracle/indexes.sql +44 -0
  368. sqlspec/data_dictionary/sql/oracle/tables.sql +25 -0
  369. sqlspec/data_dictionary/sql/oracle/version.sql +20 -0
  370. sqlspec/data_dictionary/sql/postgres/columns.sql +34 -0
  371. sqlspec/data_dictionary/sql/postgres/foreign_keys.sql +40 -0
  372. sqlspec/data_dictionary/sql/postgres/indexes.sql +56 -0
  373. sqlspec/data_dictionary/sql/postgres/tables.sql +44 -0
  374. sqlspec/data_dictionary/sql/postgres/version.sql +3 -0
  375. sqlspec/data_dictionary/sql/spanner/columns.sql +23 -0
  376. sqlspec/data_dictionary/sql/spanner/foreign_keys.sql +70 -0
  377. sqlspec/data_dictionary/sql/spanner/indexes.sql +30 -0
  378. sqlspec/data_dictionary/sql/spanner/tables.sql +9 -0
  379. sqlspec/data_dictionary/sql/spanner/version.sql +3 -0
  380. sqlspec/data_dictionary/sql/sqlite/columns.sql +23 -0
  381. sqlspec/data_dictionary/sql/sqlite/foreign_keys.sql +22 -0
  382. sqlspec/data_dictionary/sql/sqlite/indexes.sql +7 -0
  383. sqlspec/data_dictionary/sql/sqlite/tables.sql +28 -0
  384. sqlspec/data_dictionary/sql/sqlite/version.sql +3 -0
  385. sqlspec/driver/__init__.py +32 -0
  386. sqlspec/driver/_async.cpython-310-aarch64-linux-gnu.so +0 -0
  387. sqlspec/driver/_async.py +1737 -0
  388. sqlspec/driver/_common.cpython-310-aarch64-linux-gnu.so +0 -0
  389. sqlspec/driver/_common.py +1478 -0
  390. sqlspec/driver/_sql_helpers.cpython-310-aarch64-linux-gnu.so +0 -0
  391. sqlspec/driver/_sql_helpers.py +148 -0
  392. sqlspec/driver/_storage_helpers.cpython-310-aarch64-linux-gnu.so +0 -0
  393. sqlspec/driver/_storage_helpers.py +144 -0
  394. sqlspec/driver/_sync.cpython-310-aarch64-linux-gnu.so +0 -0
  395. sqlspec/driver/_sync.py +1710 -0
  396. sqlspec/exceptions.py +338 -0
  397. sqlspec/extensions/__init__.py +0 -0
  398. sqlspec/extensions/adk/__init__.py +70 -0
  399. sqlspec/extensions/adk/_types.py +51 -0
  400. sqlspec/extensions/adk/converters.py +172 -0
  401. sqlspec/extensions/adk/memory/__init__.py +69 -0
  402. sqlspec/extensions/adk/memory/_types.py +30 -0
  403. sqlspec/extensions/adk/memory/converters.py +149 -0
  404. sqlspec/extensions/adk/memory/service.py +217 -0
  405. sqlspec/extensions/adk/memory/store.py +569 -0
  406. sqlspec/extensions/adk/migrations/0001_create_adk_tables.py +246 -0
  407. sqlspec/extensions/adk/migrations/__init__.py +0 -0
  408. sqlspec/extensions/adk/service.py +225 -0
  409. sqlspec/extensions/adk/store.py +567 -0
  410. sqlspec/extensions/events/__init__.py +51 -0
  411. sqlspec/extensions/events/_channel.py +703 -0
  412. sqlspec/extensions/events/_hints.py +45 -0
  413. sqlspec/extensions/events/_models.py +23 -0
  414. sqlspec/extensions/events/_payload.py +69 -0
  415. sqlspec/extensions/events/_protocols.py +134 -0
  416. sqlspec/extensions/events/_queue.py +461 -0
  417. sqlspec/extensions/events/_store.py +209 -0
  418. sqlspec/extensions/events/migrations/0001_create_event_queue.py +59 -0
  419. sqlspec/extensions/events/migrations/__init__.py +3 -0
  420. sqlspec/extensions/fastapi/__init__.py +19 -0
  421. sqlspec/extensions/fastapi/extension.py +351 -0
  422. sqlspec/extensions/fastapi/providers.py +607 -0
  423. sqlspec/extensions/flask/__init__.py +37 -0
  424. sqlspec/extensions/flask/_state.py +76 -0
  425. sqlspec/extensions/flask/_utils.py +71 -0
  426. sqlspec/extensions/flask/extension.py +519 -0
  427. sqlspec/extensions/litestar/__init__.py +28 -0
  428. sqlspec/extensions/litestar/_utils.py +52 -0
  429. sqlspec/extensions/litestar/channels.py +165 -0
  430. sqlspec/extensions/litestar/cli.py +102 -0
  431. sqlspec/extensions/litestar/config.py +90 -0
  432. sqlspec/extensions/litestar/handlers.py +316 -0
  433. sqlspec/extensions/litestar/migrations/0001_create_session_table.py +137 -0
  434. sqlspec/extensions/litestar/migrations/__init__.py +3 -0
  435. sqlspec/extensions/litestar/plugin.py +671 -0
  436. sqlspec/extensions/litestar/providers.py +526 -0
  437. sqlspec/extensions/litestar/store.py +296 -0
  438. sqlspec/extensions/otel/__init__.py +58 -0
  439. sqlspec/extensions/prometheus/__init__.py +113 -0
  440. sqlspec/extensions/starlette/__init__.py +19 -0
  441. sqlspec/extensions/starlette/_state.py +30 -0
  442. sqlspec/extensions/starlette/_utils.py +96 -0
  443. sqlspec/extensions/starlette/extension.py +346 -0
  444. sqlspec/extensions/starlette/middleware.py +235 -0
  445. sqlspec/loader.cpython-310-aarch64-linux-gnu.so +0 -0
  446. sqlspec/loader.py +702 -0
  447. sqlspec/migrations/__init__.py +36 -0
  448. sqlspec/migrations/base.py +731 -0
  449. sqlspec/migrations/commands.py +1232 -0
  450. sqlspec/migrations/context.py +157 -0
  451. sqlspec/migrations/fix.py +204 -0
  452. sqlspec/migrations/loaders.py +443 -0
  453. sqlspec/migrations/runner.py +1172 -0
  454. sqlspec/migrations/templates.py +234 -0
  455. sqlspec/migrations/tracker.py +611 -0
  456. sqlspec/migrations/utils.py +256 -0
  457. sqlspec/migrations/validation.py +207 -0
  458. sqlspec/migrations/version.py +446 -0
  459. sqlspec/observability/__init__.py +55 -0
  460. sqlspec/observability/_common.cpython-310-aarch64-linux-gnu.so +0 -0
  461. sqlspec/observability/_common.py +77 -0
  462. sqlspec/observability/_config.cpython-310-aarch64-linux-gnu.so +0 -0
  463. sqlspec/observability/_config.py +348 -0
  464. sqlspec/observability/_diagnostics.cpython-310-aarch64-linux-gnu.so +0 -0
  465. sqlspec/observability/_diagnostics.py +74 -0
  466. sqlspec/observability/_dispatcher.cpython-310-aarch64-linux-gnu.so +0 -0
  467. sqlspec/observability/_dispatcher.py +152 -0
  468. sqlspec/observability/_formatters/__init__.py +13 -0
  469. sqlspec/observability/_formatters/_aws.cpython-310-aarch64-linux-gnu.so +0 -0
  470. sqlspec/observability/_formatters/_aws.py +102 -0
  471. sqlspec/observability/_formatters/_azure.cpython-310-aarch64-linux-gnu.so +0 -0
  472. sqlspec/observability/_formatters/_azure.py +96 -0
  473. sqlspec/observability/_formatters/_base.cpython-310-aarch64-linux-gnu.so +0 -0
  474. sqlspec/observability/_formatters/_base.py +57 -0
  475. sqlspec/observability/_formatters/_gcp.cpython-310-aarch64-linux-gnu.so +0 -0
  476. sqlspec/observability/_formatters/_gcp.py +131 -0
  477. sqlspec/observability/_formatting.py +58 -0
  478. sqlspec/observability/_observer.cpython-310-aarch64-linux-gnu.so +0 -0
  479. sqlspec/observability/_observer.py +357 -0
  480. sqlspec/observability/_runtime.cpython-310-aarch64-linux-gnu.so +0 -0
  481. sqlspec/observability/_runtime.py +420 -0
  482. sqlspec/observability/_sampling.cpython-310-aarch64-linux-gnu.so +0 -0
  483. sqlspec/observability/_sampling.py +188 -0
  484. sqlspec/observability/_spans.cpython-310-aarch64-linux-gnu.so +0 -0
  485. sqlspec/observability/_spans.py +161 -0
  486. sqlspec/protocols.py +916 -0
  487. sqlspec/py.typed +0 -0
  488. sqlspec/storage/__init__.py +48 -0
  489. sqlspec/storage/_utils.py +104 -0
  490. sqlspec/storage/backends/__init__.py +1 -0
  491. sqlspec/storage/backends/base.py +253 -0
  492. sqlspec/storage/backends/fsspec.py +529 -0
  493. sqlspec/storage/backends/local.py +441 -0
  494. sqlspec/storage/backends/obstore.py +916 -0
  495. sqlspec/storage/errors.py +104 -0
  496. sqlspec/storage/pipeline.py +582 -0
  497. sqlspec/storage/registry.py +301 -0
  498. sqlspec/typing.py +395 -0
  499. sqlspec/utils/__init__.py +7 -0
  500. sqlspec/utils/arrow_helpers.py +318 -0
  501. sqlspec/utils/config_tools.py +332 -0
  502. sqlspec/utils/correlation.cpython-310-aarch64-linux-gnu.so +0 -0
  503. sqlspec/utils/correlation.py +134 -0
  504. sqlspec/utils/deprecation.py +190 -0
  505. sqlspec/utils/fixtures.cpython-310-aarch64-linux-gnu.so +0 -0
  506. sqlspec/utils/fixtures.py +258 -0
  507. sqlspec/utils/logging.py +222 -0
  508. sqlspec/utils/module_loader.py +306 -0
  509. sqlspec/utils/portal.cpython-310-aarch64-linux-gnu.so +0 -0
  510. sqlspec/utils/portal.py +375 -0
  511. sqlspec/utils/schema.cpython-310-aarch64-linux-gnu.so +0 -0
  512. sqlspec/utils/schema.py +485 -0
  513. sqlspec/utils/serializers.cpython-310-aarch64-linux-gnu.so +0 -0
  514. sqlspec/utils/serializers.py +408 -0
  515. sqlspec/utils/singleton.cpython-310-aarch64-linux-gnu.so +0 -0
  516. sqlspec/utils/singleton.py +41 -0
  517. sqlspec/utils/sync_tools.cpython-310-aarch64-linux-gnu.so +0 -0
  518. sqlspec/utils/sync_tools.py +311 -0
  519. sqlspec/utils/text.cpython-310-aarch64-linux-gnu.so +0 -0
  520. sqlspec/utils/text.py +108 -0
  521. sqlspec/utils/type_converters.cpython-310-aarch64-linux-gnu.so +0 -0
  522. sqlspec/utils/type_converters.py +128 -0
  523. sqlspec/utils/type_guards.cpython-310-aarch64-linux-gnu.so +0 -0
  524. sqlspec/utils/type_guards.py +1360 -0
  525. sqlspec/utils/uuids.cpython-310-aarch64-linux-gnu.so +0 -0
  526. sqlspec/utils/uuids.py +225 -0
  527. sqlspec-0.36.0.dist-info/METADATA +205 -0
  528. sqlspec-0.36.0.dist-info/RECORD +531 -0
  529. sqlspec-0.36.0.dist-info/WHEEL +7 -0
  530. sqlspec-0.36.0.dist-info/entry_points.txt +2 -0
  531. sqlspec-0.36.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,671 @@
1
+ import logging
2
+ from collections.abc import Iterable
3
+ from contextlib import suppress
4
+ from dataclasses import dataclass, field
5
+ from typing import TYPE_CHECKING, Any, Literal, NoReturn, cast, overload
6
+
7
+ from litestar.di import Provide
8
+ from litestar.middleware import DefineMiddleware
9
+ from litestar.plugins import CLIPlugin, InitPluginProtocol
10
+
11
+ from sqlspec.base import SQLSpec
12
+ from sqlspec.config import (
13
+ AsyncConfigT,
14
+ AsyncDatabaseConfig,
15
+ DatabaseConfigProtocol,
16
+ DriverT,
17
+ NoPoolAsyncConfig,
18
+ NoPoolSyncConfig,
19
+ SyncConfigT,
20
+ SyncDatabaseConfig,
21
+ )
22
+ from sqlspec.core.filters import OffsetPagination
23
+ from sqlspec.exceptions import ImproperConfigurationError
24
+ from sqlspec.extensions.litestar._utils import (
25
+ delete_sqlspec_scope_state,
26
+ get_sqlspec_scope_state,
27
+ set_sqlspec_scope_state,
28
+ )
29
+ from sqlspec.extensions.litestar.handlers import (
30
+ autocommit_handler_maker,
31
+ connection_provider_maker,
32
+ lifespan_handler_maker,
33
+ manual_handler_maker,
34
+ pool_provider_maker,
35
+ session_provider_maker,
36
+ )
37
+ from sqlspec.typing import NUMPY_INSTALLED, ConnectionT, PoolT, SchemaT
38
+ from sqlspec.utils.correlation import CorrelationContext
39
+ from sqlspec.utils.logging import get_logger, log_with_context
40
+ from sqlspec.utils.serializers import numpy_array_dec_hook, numpy_array_enc_hook, numpy_array_predicate
41
+
42
+ if TYPE_CHECKING:
43
+ from collections.abc import AsyncGenerator, Callable
44
+ from contextlib import AbstractAsyncContextManager
45
+
46
+ from litestar import Litestar
47
+ from litestar.config.app import AppConfig
48
+ from litestar.datastructures.state import State
49
+ from litestar.types import ASGIApp, BeforeMessageSendHookHandler, Receive, Scope, Send
50
+ from rich_click import Group
51
+
52
+ from sqlspec.driver import AsyncDriverAdapterBase, SyncDriverAdapterBase
53
+ from sqlspec.loader import SQLFileLoader
54
+
55
+ logger = get_logger("sqlspec.extensions.litestar")
56
+
57
+ CommitMode = Literal["manual", "autocommit", "autocommit_include_redirect"]
58
+ DEFAULT_COMMIT_MODE: CommitMode = "manual"
59
+ DEFAULT_CONNECTION_KEY = "db_connection"
60
+ DEFAULT_POOL_KEY = "db_pool"
61
+ DEFAULT_SESSION_KEY = "db_session"
62
+ DEFAULT_CORRELATION_HEADER = "x-request-id"
63
+ TRACE_CONTEXT_FALLBACK_HEADERS: tuple[str, ...] = (
64
+ DEFAULT_CORRELATION_HEADER,
65
+ "x-correlation-id",
66
+ "traceparent",
67
+ "x-cloud-trace-context",
68
+ "grpc-trace-bin",
69
+ "x-amzn-trace-id",
70
+ "x-b3-traceid",
71
+ "x-client-trace-id",
72
+ )
73
+ CORRELATION_STATE_KEY = "sqlspec_correlation_id"
74
+
75
+ __all__ = (
76
+ "CORRELATION_STATE_KEY",
77
+ "DEFAULT_COMMIT_MODE",
78
+ "DEFAULT_CONNECTION_KEY",
79
+ "DEFAULT_CORRELATION_HEADER",
80
+ "DEFAULT_POOL_KEY",
81
+ "DEFAULT_SESSION_KEY",
82
+ "TRACE_CONTEXT_FALLBACK_HEADERS",
83
+ "CommitMode",
84
+ "CorrelationMiddleware",
85
+ "PluginConfigState",
86
+ "SQLSpecPlugin",
87
+ )
88
+
89
+
90
+ def _encode_offset_pagination(value: OffsetPagination[Any]) -> dict[str, Any]:
91
+ return {"items": value.items, "limit": value.limit, "offset": value.offset, "total": value.total}
92
+
93
+
94
+ def _normalize_header_list(headers: Any) -> list[str]:
95
+ if headers is None:
96
+ return []
97
+ if isinstance(headers, str):
98
+ return [headers.lower()]
99
+ if isinstance(headers, Iterable):
100
+ normalized: list[str] = []
101
+ for header in headers:
102
+ if not isinstance(header, str):
103
+ msg = "litestar correlation headers must be strings"
104
+ raise ImproperConfigurationError(msg)
105
+ normalized.append(header.lower())
106
+ return normalized
107
+ msg = "litestar correlation_headers must be a string or iterable of strings"
108
+ raise ImproperConfigurationError(msg)
109
+
110
+
111
+ def _dedupe_headers(headers: Iterable[str]) -> list[str]:
112
+ seen: set[str] = set()
113
+ ordered: list[str] = []
114
+ for header in headers:
115
+ lowered = header.lower()
116
+ if lowered in seen or not lowered:
117
+ continue
118
+ seen.add(lowered)
119
+ ordered.append(lowered)
120
+ return ordered
121
+
122
+
123
+ def _build_correlation_headers(*, primary: str, configured: list[str], auto_trace_headers: bool) -> tuple[str, ...]:
124
+ header_order: list[str] = [primary.lower()]
125
+ header_order.extend(configured)
126
+ if auto_trace_headers:
127
+ header_order.extend(TRACE_CONTEXT_FALLBACK_HEADERS)
128
+ return tuple(_dedupe_headers(header_order))
129
+
130
+
131
+ class CorrelationMiddleware:
132
+ __slots__ = ("_app", "_headers")
133
+
134
+ def __init__(self, app: "ASGIApp", *, headers: tuple[str, ...]) -> None:
135
+ self._app = app
136
+ self._headers = headers
137
+
138
+ async def __call__(self, scope: "Scope", receive: "Receive", send: "Send") -> None:
139
+ scope_type = scope.get("type")
140
+ if str(scope_type) != "http" or not self._headers:
141
+ await self._app(scope, receive, send)
142
+ return
143
+
144
+ header_value: str | None = None
145
+ raw_headers = scope.get("headers") or []
146
+ for header in self._headers:
147
+ for name, value in raw_headers:
148
+ if name.decode().lower() == header:
149
+ header_value = value.decode()
150
+ break
151
+ if header_value:
152
+ break
153
+ if not header_value:
154
+ header_value = CorrelationContext.generate()
155
+
156
+ previous_correlation_id = CorrelationContext.get()
157
+ CorrelationContext.set(header_value)
158
+ set_sqlspec_scope_state(scope, CORRELATION_STATE_KEY, header_value)
159
+ try:
160
+ await self._app(scope, receive, send)
161
+ finally:
162
+ with suppress(KeyError):
163
+ delete_sqlspec_scope_state(scope, CORRELATION_STATE_KEY)
164
+ CorrelationContext.set(previous_correlation_id)
165
+
166
+
167
+ @dataclass
168
+ class PluginConfigState:
169
+ """Internal state for each database configuration."""
170
+
171
+ config: "DatabaseConfigProtocol[Any, Any, Any]"
172
+ connection_key: str
173
+ pool_key: str
174
+ session_key: str
175
+ commit_mode: CommitMode
176
+ extra_commit_statuses: "set[int] | None"
177
+ extra_rollback_statuses: "set[int] | None"
178
+ enable_correlation_middleware: bool
179
+ correlation_header: str
180
+ correlation_headers: tuple[str, ...] = field(init=False)
181
+ disable_di: bool
182
+ connection_provider: "Callable[[State, Scope], AsyncGenerator[Any, None]]" = field(init=False)
183
+ pool_provider: "Callable[[State, Scope], Any]" = field(init=False)
184
+ session_provider: "Callable[..., AsyncGenerator[Any, None]]" = field(init=False)
185
+ before_send_handler: "BeforeMessageSendHookHandler" = field(init=False)
186
+ lifespan_handler: "Callable[[Litestar], AbstractAsyncContextManager[None]]" = field(init=False)
187
+ annotation: "type[DatabaseConfigProtocol[Any, Any, Any]]" = field(init=False)
188
+
189
+
190
+ class SQLSpecPlugin(InitPluginProtocol, CLIPlugin):
191
+ """Litestar plugin for SQLSpec database integration.
192
+
193
+ Automatically configures NumPy array serialization when NumPy is installed,
194
+ enabling seamless bidirectional conversion between NumPy arrays and JSON
195
+ for vector embedding workflows.
196
+
197
+ Session Table Migrations:
198
+ The Litestar extension includes migrations for creating session storage tables.
199
+ To include these migrations in your database migration workflow, add 'litestar'
200
+ to the include_extensions list in your migration configuration.
201
+
202
+ Example:
203
+ config = AsyncpgConfig(
204
+ connection_config={"dsn": "postgresql://localhost/db"},
205
+ extension_config={
206
+ "litestar": {
207
+ "session_table": "custom_sessions" # Optional custom table name
208
+ }
209
+ },
210
+ migration_config={
211
+ "script_location": "migrations",
212
+ "include_extensions": ["litestar"], # Simple string list only
213
+ }
214
+ )
215
+
216
+ The session table migration will automatically use the appropriate column types
217
+ for your database dialect (JSONB for PostgreSQL, JSON for MySQL, TEXT for SQLite).
218
+
219
+ Extension migrations use the ext_litestar_ prefix (e.g., ext_litestar_0001) to
220
+ prevent version conflicts with application migrations.
221
+ """
222
+
223
+ __slots__ = ("_correlation_headers", "_plugin_configs", "_sqlspec")
224
+
225
+ def __init__(self, sqlspec: SQLSpec, *, loader: "SQLFileLoader | None" = None) -> None:
226
+ """Initialize SQLSpec plugin.
227
+
228
+ Args:
229
+ sqlspec: Pre-configured SQLSpec instance with registered database configs.
230
+ loader: Optional SQL file loader instance (SQLSpec may already have one).
231
+ """
232
+ self._sqlspec = sqlspec
233
+
234
+ self._plugin_configs: list[PluginConfigState] = []
235
+ for cfg in self._sqlspec.configs.values():
236
+ config_union = cast(
237
+ "SyncDatabaseConfig[Any, Any, Any] | NoPoolSyncConfig[Any, Any] | AsyncDatabaseConfig[Any, Any, Any] | NoPoolAsyncConfig[Any, Any]",
238
+ cfg,
239
+ )
240
+ settings = self._extract_litestar_settings(config_union)
241
+ state = self._create_config_state(config_union, settings)
242
+ self._plugin_configs.append(state)
243
+
244
+ correlation_headers: list[str] = []
245
+ for state in self._plugin_configs:
246
+ if not state.enable_correlation_middleware:
247
+ continue
248
+ for header in state.correlation_headers:
249
+ if header not in correlation_headers:
250
+ correlation_headers.append(header)
251
+ self._correlation_headers = tuple(correlation_headers)
252
+ log_with_context(
253
+ logger,
254
+ logging.DEBUG,
255
+ "extension.init",
256
+ framework="litestar",
257
+ stage="init",
258
+ config_count=len(self._plugin_configs),
259
+ correlation_headers=len(self._correlation_headers),
260
+ )
261
+
262
+ def _extract_litestar_settings(
263
+ self,
264
+ config: "SyncDatabaseConfig[Any, Any, Any] | NoPoolSyncConfig[Any, Any] | AsyncDatabaseConfig[Any, Any, Any] | NoPoolAsyncConfig[Any, Any]",
265
+ ) -> "dict[str, Any]":
266
+ """Extract Litestar settings from config.extension_config."""
267
+ litestar_config = config.extension_config.get("litestar", {})
268
+
269
+ connection_key = litestar_config.get("connection_key", DEFAULT_CONNECTION_KEY)
270
+ pool_key = litestar_config.get("pool_key", DEFAULT_POOL_KEY)
271
+ session_key = litestar_config.get("session_key", DEFAULT_SESSION_KEY)
272
+ commit_mode = litestar_config.get("commit_mode", DEFAULT_COMMIT_MODE)
273
+
274
+ if not config.supports_connection_pooling and pool_key == DEFAULT_POOL_KEY:
275
+ pool_key = f"_{DEFAULT_POOL_KEY}_{id(config)}"
276
+
277
+ correlation_header = str(litestar_config.get("correlation_header", DEFAULT_CORRELATION_HEADER)).lower()
278
+ configured_headers = _normalize_header_list(litestar_config.get("correlation_headers"))
279
+ auto_trace_headers = bool(litestar_config.get("auto_trace_headers", True))
280
+
281
+ return {
282
+ "connection_key": connection_key,
283
+ "pool_key": pool_key,
284
+ "session_key": session_key,
285
+ "commit_mode": commit_mode,
286
+ "extra_commit_statuses": litestar_config.get("extra_commit_statuses"),
287
+ "extra_rollback_statuses": litestar_config.get("extra_rollback_statuses"),
288
+ "enable_correlation_middleware": litestar_config.get("enable_correlation_middleware", True),
289
+ "correlation_header": correlation_header,
290
+ "correlation_headers": _build_correlation_headers(
291
+ primary=correlation_header, configured=configured_headers, auto_trace_headers=auto_trace_headers
292
+ ),
293
+ "disable_di": litestar_config.get("disable_di", False),
294
+ }
295
+
296
+ def _create_config_state(
297
+ self,
298
+ config: "SyncDatabaseConfig[Any, Any, Any] | NoPoolSyncConfig[Any, Any] | AsyncDatabaseConfig[Any, Any, Any] | NoPoolAsyncConfig[Any, Any]",
299
+ settings: "dict[str, Any]",
300
+ ) -> PluginConfigState:
301
+ """Create plugin state with handlers for the given configuration."""
302
+ state = PluginConfigState(
303
+ config=config,
304
+ connection_key=settings["connection_key"],
305
+ pool_key=settings["pool_key"],
306
+ session_key=settings["session_key"],
307
+ commit_mode=settings["commit_mode"],
308
+ extra_commit_statuses=settings.get("extra_commit_statuses"),
309
+ extra_rollback_statuses=settings.get("extra_rollback_statuses"),
310
+ enable_correlation_middleware=settings["enable_correlation_middleware"],
311
+ correlation_header=settings["correlation_header"],
312
+ disable_di=settings["disable_di"],
313
+ )
314
+ state.correlation_headers = tuple(settings["correlation_headers"])
315
+
316
+ if not state.disable_di:
317
+ self._setup_handlers(state)
318
+ return state
319
+
320
+ def _setup_handlers(self, state: PluginConfigState) -> None:
321
+ """Setup handlers for the plugin state."""
322
+ connection_key = state.connection_key
323
+ pool_key = state.pool_key
324
+ commit_mode = state.commit_mode
325
+ config = state.config
326
+ is_async = config.is_async
327
+
328
+ state.connection_provider = connection_provider_maker(config, pool_key, connection_key)
329
+ state.pool_provider = pool_provider_maker(config, pool_key)
330
+ state.session_provider = session_provider_maker(config, connection_key)
331
+ state.lifespan_handler = lifespan_handler_maker(config, pool_key)
332
+
333
+ if commit_mode == "manual":
334
+ state.before_send_handler = manual_handler_maker(connection_key, is_async)
335
+ else:
336
+ commit_on_redirect = commit_mode == "autocommit_include_redirect"
337
+ state.before_send_handler = autocommit_handler_maker(
338
+ connection_key, is_async, commit_on_redirect, state.extra_commit_statuses, state.extra_rollback_statuses
339
+ )
340
+
341
+ @property
342
+ def config(
343
+ self,
344
+ ) -> "list[SyncDatabaseConfig[Any, Any, Any] | NoPoolSyncConfig[Any, Any] | AsyncDatabaseConfig[Any, Any, Any] | NoPoolAsyncConfig[Any, Any]]":
345
+ """Return the plugin configurations.
346
+
347
+ Returns:
348
+ List of database configurations.
349
+ """
350
+ return [
351
+ cast(
352
+ "SyncDatabaseConfig[Any, Any, Any] | NoPoolSyncConfig[Any, Any] | AsyncDatabaseConfig[Any, Any, Any] | NoPoolAsyncConfig[Any, Any]",
353
+ state.config,
354
+ )
355
+ for state in self._plugin_configs
356
+ ]
357
+
358
+ def on_cli_init(self, cli: "Group") -> None:
359
+ """Configure CLI commands for SQLSpec database operations.
360
+
361
+ Args:
362
+ cli: The Click command group to add commands to.
363
+ """
364
+ from sqlspec.extensions.litestar.cli import database_group
365
+
366
+ cli.add_command(database_group)
367
+
368
+ def on_app_init(self, app_config: "AppConfig") -> "AppConfig":
369
+ """Configure Litestar application with SQLSpec database integration.
370
+
371
+ Automatically registers NumPy array serialization when NumPy is installed.
372
+
373
+ Args:
374
+ app_config: The Litestar application configuration instance.
375
+
376
+ Returns:
377
+ The updated application configuration instance.
378
+ """
379
+ self._validate_dependency_keys()
380
+
381
+ def store_sqlspec_in_state() -> None:
382
+ app_config.state.sqlspec = self
383
+
384
+ app_config.on_startup.append(store_sqlspec_in_state)
385
+ app_config.signature_types.extend([SQLSpec, DatabaseConfigProtocol, SyncConfigT, AsyncConfigT])
386
+
387
+ signature_namespace = {"ConnectionT": ConnectionT, "PoolT": PoolT, "DriverT": DriverT, "SchemaT": SchemaT}
388
+
389
+ for state in self._plugin_configs:
390
+ state.annotation = type(state.config)
391
+ app_config.signature_types.append(state.annotation)
392
+ app_config.signature_types.append(state.config.connection_type)
393
+ app_config.signature_types.append(state.config.driver_type)
394
+
395
+ signature_namespace.update(state.config.get_signature_namespace())
396
+
397
+ if not state.disable_di:
398
+ app_config.before_send.append(state.before_send_handler)
399
+ app_config.lifespan.append(state.lifespan_handler)
400
+ app_config.dependencies.update({
401
+ state.connection_key: Provide(state.connection_provider),
402
+ state.pool_key: Provide(state.pool_provider),
403
+ state.session_key: Provide(state.session_provider),
404
+ })
405
+
406
+ if signature_namespace:
407
+ app_config.signature_namespace.update(signature_namespace)
408
+
409
+ if app_config.type_encoders is None:
410
+ app_config.type_encoders = {OffsetPagination: _encode_offset_pagination}
411
+ else:
412
+ encoders_dict = dict(app_config.type_encoders)
413
+ encoders_dict[OffsetPagination] = _encode_offset_pagination
414
+ app_config.type_encoders = encoders_dict
415
+
416
+ if NUMPY_INSTALLED:
417
+ import numpy as np
418
+
419
+ if app_config.type_encoders is None:
420
+ app_config.type_encoders = {np.ndarray: numpy_array_enc_hook}
421
+ else:
422
+ encoders_dict = dict(app_config.type_encoders)
423
+ encoders_dict[np.ndarray] = numpy_array_enc_hook
424
+ app_config.type_encoders = encoders_dict
425
+
426
+ if app_config.type_decoders is None:
427
+ app_config.type_decoders = [(numpy_array_predicate, numpy_array_dec_hook)] # type: ignore[list-item]
428
+ else:
429
+ decoders_list = list(app_config.type_decoders)
430
+ decoders_list.append((numpy_array_predicate, numpy_array_dec_hook)) # type: ignore[arg-type]
431
+ app_config.type_decoders = decoders_list
432
+
433
+ if self._correlation_headers:
434
+ middleware = DefineMiddleware(CorrelationMiddleware, headers=self._correlation_headers)
435
+ existing_middleware = list(app_config.middleware or [])
436
+ existing_middleware.append(middleware)
437
+ app_config.middleware = existing_middleware
438
+
439
+ log_with_context(
440
+ logger,
441
+ logging.DEBUG,
442
+ "extension.init",
443
+ framework="litestar",
444
+ stage="configured",
445
+ config_count=len(self._plugin_configs),
446
+ correlation_headers=len(self._correlation_headers),
447
+ numpy_enabled=bool(NUMPY_INSTALLED),
448
+ )
449
+ return app_config
450
+
451
+ def get_annotations(
452
+ self,
453
+ ) -> "list[type[SyncDatabaseConfig[Any, Any, Any] | NoPoolSyncConfig[Any, Any] | AsyncDatabaseConfig[Any, Any, Any] | NoPoolAsyncConfig[Any, Any]]]":
454
+ """Return the list of annotations.
455
+
456
+ Returns:
457
+ List of annotations.
458
+ """
459
+ return [
460
+ cast(
461
+ "type[SyncDatabaseConfig[Any, Any, Any] | NoPoolSyncConfig[Any, Any] | AsyncDatabaseConfig[Any, Any, Any] | NoPoolAsyncConfig[Any, Any]]",
462
+ state.annotation,
463
+ )
464
+ for state in self._plugin_configs
465
+ ]
466
+
467
+ def get_annotation(
468
+ self,
469
+ key: "str | SyncDatabaseConfig[Any, Any, Any] | NoPoolSyncConfig[Any, Any] | AsyncDatabaseConfig[Any, Any, Any] | NoPoolAsyncConfig[Any, Any] | type[SyncDatabaseConfig[Any, Any, Any] | NoPoolSyncConfig[Any, Any] | AsyncDatabaseConfig[Any, Any, Any] | NoPoolAsyncConfig[Any, Any]]",
470
+ ) -> "type[SyncDatabaseConfig[Any, Any, Any] | NoPoolSyncConfig[Any, Any] | AsyncDatabaseConfig[Any, Any, Any] | NoPoolAsyncConfig[Any, Any]]":
471
+ """Return the annotation for the given configuration.
472
+
473
+ Args:
474
+ key: The configuration instance or key to lookup.
475
+
476
+ Raises:
477
+ KeyError: If no configuration is found for the given key.
478
+
479
+ Returns:
480
+ The annotation for the configuration.
481
+ """
482
+ for state in self._plugin_configs:
483
+ if key in {state.config, state.annotation} or key in {state.connection_key, state.pool_key}:
484
+ return cast(
485
+ "type[SyncDatabaseConfig[Any, Any, Any] | NoPoolSyncConfig[Any, Any] | AsyncDatabaseConfig[Any, Any, Any] | NoPoolAsyncConfig[Any, Any]]",
486
+ state.annotation,
487
+ )
488
+
489
+ msg = f"No configuration found for {key}"
490
+ raise KeyError(msg)
491
+
492
+ @overload
493
+ def get_config(
494
+ self, name: "type[SyncDatabaseConfig[Any, Any, Any] | NoPoolSyncConfig[Any, Any]]"
495
+ ) -> "SyncDatabaseConfig[Any, Any, Any] | NoPoolSyncConfig[Any, Any]": ...
496
+
497
+ @overload
498
+ def get_config(
499
+ self, name: "type[AsyncDatabaseConfig[Any, Any, Any] | NoPoolAsyncConfig[Any, Any]]"
500
+ ) -> "AsyncDatabaseConfig[Any, Any, Any] | NoPoolAsyncConfig[Any, Any]": ...
501
+
502
+ @overload
503
+ def get_config(
504
+ self, name: str
505
+ ) -> "SyncDatabaseConfig[Any, Any, Any] | NoPoolSyncConfig[Any, Any] | AsyncDatabaseConfig[Any, Any, Any] | NoPoolAsyncConfig[Any, Any]": ...
506
+
507
+ def get_config(
508
+ self, name: "type[DatabaseConfigProtocol[Any, Any, Any]] | str | Any"
509
+ ) -> "DatabaseConfigProtocol[Any, Any, Any]":
510
+ """Get a configuration instance by name.
511
+
512
+ Args:
513
+ name: The configuration identifier.
514
+
515
+ Raises:
516
+ KeyError: If no configuration is found for the given name.
517
+
518
+ Returns:
519
+ The configuration instance for the specified name.
520
+ """
521
+ if isinstance(name, str):
522
+ for state in self._plugin_configs:
523
+ if name in {state.connection_key, state.pool_key, state.session_key}:
524
+ return cast("DatabaseConfigProtocol[Any, Any, Any]", state.config) # type: ignore[redundant-cast]
525
+
526
+ for state in self._plugin_configs:
527
+ if name in {state.config, state.annotation}:
528
+ return cast("DatabaseConfigProtocol[Any, Any, Any]", state.config) # type: ignore[redundant-cast]
529
+
530
+ msg = f"No database configuration found for name '{name}'. Available keys: {self._get_available_keys()}"
531
+ raise KeyError(msg)
532
+
533
+ def provide_request_session(
534
+ self, key: "str | SyncConfigT | AsyncConfigT | type[SyncConfigT | AsyncConfigT]", state: "State", scope: "Scope"
535
+ ) -> "SyncDriverAdapterBase | AsyncDriverAdapterBase":
536
+ """Provide a database session for the specified configuration key from request scope.
537
+
538
+ Args:
539
+ key: The configuration identifier (same as get_config).
540
+ state: The Litestar application State object.
541
+ scope: The ASGI scope containing the request context.
542
+
543
+ Returns:
544
+ A driver session instance for the specified database configuration.
545
+ """
546
+ plugin_state = self._get_plugin_state(key)
547
+ session_scope_key = f"{plugin_state.session_key}_instance"
548
+
549
+ session = get_sqlspec_scope_state(scope, session_scope_key)
550
+ if session is not None:
551
+ return cast("SyncDriverAdapterBase | AsyncDriverAdapterBase", session)
552
+
553
+ connection = get_sqlspec_scope_state(scope, plugin_state.connection_key)
554
+ if connection is None:
555
+ self._raise_missing_connection(plugin_state.connection_key)
556
+
557
+ session = plugin_state.config.driver_type(
558
+ connection=connection,
559
+ statement_config=plugin_state.config.statement_config,
560
+ driver_features=plugin_state.config.driver_features,
561
+ )
562
+ set_sqlspec_scope_state(scope, session_scope_key, session)
563
+
564
+ return cast("SyncDriverAdapterBase | AsyncDriverAdapterBase", session)
565
+
566
+ def provide_sync_request_session(
567
+ self, key: "str | SyncConfigT | type[SyncConfigT]", state: "State", scope: "Scope"
568
+ ) -> "SyncDriverAdapterBase":
569
+ """Provide a sync database session for the specified configuration key from request scope.
570
+
571
+ Args:
572
+ key: The sync configuration identifier.
573
+ state: The Litestar application State object.
574
+ scope: The ASGI scope containing the request context.
575
+
576
+ Returns:
577
+ A sync driver session instance for the specified database configuration.
578
+ """
579
+ session = self.provide_request_session(key, state, scope)
580
+ return cast("SyncDriverAdapterBase", session)
581
+
582
+ def provide_async_request_session(
583
+ self, key: "str | AsyncConfigT | type[AsyncConfigT]", state: "State", scope: "Scope"
584
+ ) -> "AsyncDriverAdapterBase":
585
+ """Provide an async database session for the specified configuration key from request scope.
586
+
587
+ Args:
588
+ key: The async configuration identifier.
589
+ state: The Litestar application State object.
590
+ scope: The ASGI scope containing the request context.
591
+
592
+ Returns:
593
+ An async driver session instance for the specified database configuration.
594
+ """
595
+ session = self.provide_request_session(key, state, scope)
596
+ return cast("AsyncDriverAdapterBase", session)
597
+
598
+ def provide_request_connection(
599
+ self, key: "str | SyncConfigT | AsyncConfigT | type[SyncConfigT | AsyncConfigT]", state: "State", scope: "Scope"
600
+ ) -> "Any":
601
+ """Provide a database connection for the specified configuration key from request scope.
602
+
603
+ Args:
604
+ key: The configuration identifier (same as get_config).
605
+ state: The Litestar application State object.
606
+ scope: The ASGI scope containing the request context.
607
+
608
+ Returns:
609
+ A database connection instance for the specified database configuration.
610
+ """
611
+ plugin_state = self._get_plugin_state(key)
612
+ connection = get_sqlspec_scope_state(scope, plugin_state.connection_key)
613
+ if connection is None:
614
+ self._raise_missing_connection(plugin_state.connection_key)
615
+
616
+ return connection
617
+
618
+ def _get_plugin_state(
619
+ self, key: "str | SyncConfigT | AsyncConfigT | type[SyncConfigT | AsyncConfigT]"
620
+ ) -> PluginConfigState:
621
+ """Get plugin state for a configuration by key."""
622
+ if isinstance(key, str):
623
+ for state in self._plugin_configs:
624
+ if key in {state.connection_key, state.pool_key, state.session_key}:
625
+ return state
626
+
627
+ for state in self._plugin_configs:
628
+ if key in {state.config, state.annotation}:
629
+ return state
630
+
631
+ self._raise_config_not_found(key)
632
+ return None
633
+
634
+ def _get_available_keys(self) -> "list[str]":
635
+ """Get a list of all available configuration keys for error messages."""
636
+ keys = []
637
+ for state in self._plugin_configs:
638
+ keys.extend([state.connection_key, state.pool_key, state.session_key])
639
+ return keys
640
+
641
+ def _validate_dependency_keys(self) -> None:
642
+ """Validate that connection and pool keys are unique across configurations."""
643
+ connection_keys = [state.connection_key for state in self._plugin_configs]
644
+ pool_keys = [state.pool_key for state in self._plugin_configs]
645
+
646
+ if len(set(connection_keys)) != len(connection_keys):
647
+ self._raise_duplicate_connection_keys()
648
+
649
+ if len(set(pool_keys)) != len(pool_keys):
650
+ self._raise_duplicate_pool_keys()
651
+
652
+ def _raise_missing_connection(self, connection_key: str) -> None:
653
+ """Raise error when connection is not found in scope."""
654
+ msg = f"No database connection found in scope for key '{connection_key}'. "
655
+ msg += "Ensure the connection dependency is properly configured and available."
656
+ raise ImproperConfigurationError(detail=msg)
657
+
658
+ def _raise_config_not_found(self, key: Any) -> NoReturn:
659
+ """Raise error when configuration is not found."""
660
+ msg = f"No database configuration found for name '{key}'. Available keys: {self._get_available_keys()}"
661
+ raise KeyError(msg)
662
+
663
+ def _raise_duplicate_connection_keys(self) -> None:
664
+ """Raise error when connection keys are not unique."""
665
+ msg = "When using multiple database configuration, each configuration must have a unique `connection_key`."
666
+ raise ImproperConfigurationError(detail=msg)
667
+
668
+ def _raise_duplicate_pool_keys(self) -> None:
669
+ """Raise error when pool keys are not unique."""
670
+ msg = "When using multiple database configuration, each configuration must have a unique `pool_key`."
671
+ raise ImproperConfigurationError(detail=msg)