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,76 @@
1
+ """Flask configuration state management."""
2
+
3
+ from dataclasses import dataclass
4
+ from typing import TYPE_CHECKING, Any, Literal
5
+
6
+ if TYPE_CHECKING:
7
+ from sqlspec.config import DatabaseConfigProtocol
8
+
9
+ __all__ = ("FlaskConfigState",)
10
+
11
+ HTTP_SUCCESS_MIN = 200
12
+ HTTP_SUCCESS_MAX = 300
13
+ HTTP_REDIRECT_MAX = 400
14
+
15
+
16
+ @dataclass
17
+ class FlaskConfigState:
18
+ """Internal state for each database configuration in Flask extension.
19
+
20
+ Holds configuration, state keys, commit settings, and transaction logic.
21
+ """
22
+
23
+ config: "DatabaseConfigProtocol[Any, Any, Any]"
24
+ connection_key: str
25
+ session_key: str
26
+ commit_mode: Literal["manual", "autocommit", "autocommit_include_redirect"]
27
+ extra_commit_statuses: "set[int] | None"
28
+ extra_rollback_statuses: "set[int] | None"
29
+ is_async: bool
30
+ disable_di: bool
31
+ enable_correlation_middleware: bool = False
32
+ correlation_header: str = "x-request-id"
33
+ correlation_headers: "tuple[str, ...] | None" = None
34
+ auto_trace_headers: bool = True
35
+
36
+ def should_commit(self, status_code: int) -> bool:
37
+ """Determine if HTTP status code should trigger commit.
38
+
39
+ Args:
40
+ status_code: HTTP response status code.
41
+
42
+ Returns:
43
+ True if status should trigger commit, False otherwise.
44
+ """
45
+ if self.extra_commit_statuses and status_code in self.extra_commit_statuses:
46
+ return True
47
+
48
+ if self.extra_rollback_statuses and status_code in self.extra_rollback_statuses:
49
+ return False
50
+
51
+ if self.commit_mode == "manual":
52
+ return False
53
+
54
+ if self.commit_mode == "autocommit":
55
+ return HTTP_SUCCESS_MIN <= status_code < HTTP_SUCCESS_MAX
56
+
57
+ if self.commit_mode == "autocommit_include_redirect":
58
+ return HTTP_SUCCESS_MIN <= status_code < HTTP_REDIRECT_MAX
59
+
60
+ return False
61
+
62
+ def should_rollback(self, status_code: int) -> bool:
63
+ """Determine if HTTP status code should trigger rollback.
64
+
65
+ In autocommit modes, anything that doesn't commit should rollback.
66
+
67
+ Args:
68
+ status_code: HTTP response status code.
69
+
70
+ Returns:
71
+ True if status should trigger rollback, False otherwise.
72
+ """
73
+ if self.commit_mode == "manual":
74
+ return False
75
+
76
+ return not self.should_commit(status_code)
@@ -0,0 +1,71 @@
1
+ """Helper utilities for Flask extension."""
2
+
3
+ from typing import TYPE_CHECKING, Any, cast
4
+
5
+ if TYPE_CHECKING:
6
+ from sqlspec.extensions.flask._state import FlaskConfigState
7
+ from sqlspec.protocols import DictProtocol
8
+ from sqlspec.utils.portal import Portal
9
+
10
+ __all__ = ("get_context_value", "get_or_create_session", "has_context_value", "pop_context_value", "set_context_value")
11
+
12
+ _MISSING = object()
13
+
14
+
15
+ def _get_context_dict(target: Any) -> dict[str, Any]:
16
+ """Return the underlying context dictionary."""
17
+ return cast("DictProtocol", target).__dict__
18
+
19
+
20
+ def get_context_value(target: Any, key: str, default: Any = _MISSING) -> Any:
21
+ """Get a value from a Flask context object."""
22
+ data = _get_context_dict(target)
23
+ if default is _MISSING:
24
+ return data[key]
25
+ return data.get(key, default)
26
+
27
+
28
+ def set_context_value(target: Any, key: str, value: Any) -> None:
29
+ """Set a value on a Flask context object."""
30
+ _get_context_dict(target)[key] = value
31
+
32
+
33
+ def pop_context_value(target: Any, key: str) -> Any | None:
34
+ """Remove a value from a Flask context object."""
35
+ return _get_context_dict(target).pop(key, None)
36
+
37
+
38
+ def has_context_value(target: Any, key: str) -> bool:
39
+ """Check if a Flask context object has a stored value."""
40
+ return key in _get_context_dict(target)
41
+
42
+
43
+ def get_or_create_session(config_state: "FlaskConfigState", portal: "Portal | None") -> Any:
44
+ """Get or create database session for current request.
45
+
46
+ Sessions are cached per request in Flask g object to ensure
47
+ the same session is reused throughout the request lifecycle.
48
+
49
+ Args:
50
+ config_state: Configuration state for this database.
51
+ portal: Portal for async operations (None for sync).
52
+
53
+ Returns:
54
+ Database session (driver instance).
55
+ """
56
+ from flask import g
57
+
58
+ cache_key = f"sqlspec_session_cache_{config_state.session_key}"
59
+
60
+ cached_session = get_context_value(g, cache_key, None)
61
+ if cached_session is not None:
62
+ return cached_session
63
+
64
+ connection = get_context_value(g, config_state.connection_key)
65
+
66
+ session = config_state.config.driver_type(
67
+ connection=connection, statement_config=config_state.config.statement_config
68
+ )
69
+
70
+ set_context_value(g, cache_key, session)
71
+ return session
@@ -0,0 +1,519 @@
1
+ """Flask extension for SQLSpec database integration."""
2
+
3
+ import atexit
4
+ import logging
5
+ from typing import TYPE_CHECKING, Any, Literal
6
+
7
+ from sqlspec.base import SQLSpec
8
+ from sqlspec.config import AsyncDatabaseConfig, NoPoolAsyncConfig
9
+ from sqlspec.core import CorrelationExtractor
10
+ from sqlspec.exceptions import ImproperConfigurationError
11
+ from sqlspec.extensions.flask._state import FlaskConfigState
12
+ from sqlspec.extensions.flask._utils import (
13
+ get_context_value,
14
+ get_or_create_session,
15
+ has_context_value,
16
+ pop_context_value,
17
+ set_context_value,
18
+ )
19
+ from sqlspec.utils.correlation import CorrelationContext
20
+ from sqlspec.utils.logging import get_logger, log_with_context
21
+ from sqlspec.utils.portal import PortalProvider
22
+
23
+ if TYPE_CHECKING:
24
+ from flask import Flask, Response
25
+
26
+ __all__ = ("SQLSpecPlugin",)
27
+
28
+ logger = get_logger("sqlspec.extensions.flask")
29
+
30
+ DEFAULT_COMMIT_MODE: Literal["manual"] = "manual"
31
+ DEFAULT_SESSION_KEY = "db_session"
32
+
33
+
34
+ class SQLSpecPlugin:
35
+ """Flask extension for SQLSpec database integration.
36
+
37
+ Provides request-scoped session management, automatic transaction handling,
38
+ and async adapter support via portal pattern.
39
+
40
+ Example:
41
+ from flask import Flask
42
+ from sqlspec import SQLSpec
43
+ from sqlspec.adapters.sqlite import SqliteConfig
44
+ from sqlspec.extensions.flask import SQLSpecPlugin
45
+
46
+ sqlspec = SQLSpec()
47
+ config = SqliteConfig(
48
+ connection_config={"database": "app.db"},
49
+ extension_config={
50
+ "flask": {
51
+ "commit_mode": "autocommit",
52
+ "session_key": "db"
53
+ }
54
+ }
55
+ )
56
+ sqlspec.add_config(config)
57
+
58
+ app = Flask(__name__)
59
+ plugin = SQLSpecPlugin(sqlspec, app)
60
+
61
+ @app.route("/users")
62
+ def list_users():
63
+ db = plugin.get_session()
64
+ result = db.execute("SELECT * FROM users")
65
+ return {"users": result.all()}
66
+ """
67
+
68
+ def __init__(self, sqlspec: SQLSpec, app: "Flask | None" = None) -> None:
69
+ """Initialize Flask extension with SQLSpec instance.
70
+
71
+ Args:
72
+ sqlspec: SQLSpec instance with registered configs.
73
+ app: Optional Flask application to initialize immediately.
74
+ """
75
+ self._sqlspec = sqlspec
76
+ self._config_states: list[FlaskConfigState] = []
77
+ self._portal: PortalProvider | None = None
78
+ self._has_async_configs = False
79
+ self._cleanup_registered = False
80
+ self._shutdown_complete = False
81
+ self._enable_correlation = False
82
+ self._extractor: CorrelationExtractor | None = None
83
+
84
+ for cfg in self._sqlspec.configs.values():
85
+ state = self._create_config_state(cfg)
86
+ self._config_states.append(state)
87
+
88
+ if state.is_async:
89
+ self._has_async_configs = True
90
+
91
+ if state.enable_correlation_middleware and not self._enable_correlation:
92
+ self._enable_correlation = True
93
+ self._extractor = CorrelationExtractor(
94
+ primary_header=state.correlation_header,
95
+ additional_headers=state.correlation_headers,
96
+ auto_trace_headers=state.auto_trace_headers,
97
+ )
98
+
99
+ if app is not None:
100
+ self.init_app(app)
101
+
102
+ def _create_config_state(self, config: Any) -> FlaskConfigState:
103
+ """Create configuration state from database config.
104
+
105
+ Args:
106
+ config: Database configuration instance.
107
+
108
+ Returns:
109
+ FlaskConfigState instance.
110
+ """
111
+ flask_config = config.extension_config.get("flask", {})
112
+
113
+ session_key = flask_config.get("session_key", DEFAULT_SESSION_KEY)
114
+ connection_key = flask_config.get("connection_key", f"sqlspec_connection_{session_key}")
115
+ commit_mode = flask_config.get("commit_mode", DEFAULT_COMMIT_MODE)
116
+ extra_commit_statuses = flask_config.get("extra_commit_statuses")
117
+ extra_rollback_statuses = flask_config.get("extra_rollback_statuses")
118
+ disable_di = flask_config.get("disable_di", False)
119
+
120
+ enable_correlation = flask_config.get("enable_correlation_middleware", False)
121
+ correlation_header = flask_config.get("correlation_header", "x-request-id")
122
+ correlation_headers = flask_config.get("correlation_headers")
123
+ if correlation_headers is not None:
124
+ correlation_headers = tuple(correlation_headers)
125
+ auto_trace_headers = flask_config.get("auto_trace_headers", True)
126
+
127
+ is_async = isinstance(config, (AsyncDatabaseConfig, NoPoolAsyncConfig))
128
+
129
+ return FlaskConfigState(
130
+ config=config,
131
+ connection_key=connection_key,
132
+ session_key=session_key,
133
+ commit_mode=commit_mode,
134
+ extra_commit_statuses=extra_commit_statuses,
135
+ extra_rollback_statuses=extra_rollback_statuses,
136
+ is_async=is_async,
137
+ disable_di=disable_di,
138
+ enable_correlation_middleware=enable_correlation,
139
+ correlation_header=correlation_header,
140
+ correlation_headers=correlation_headers,
141
+ auto_trace_headers=auto_trace_headers,
142
+ )
143
+
144
+ def init_app(self, app: "Flask") -> None:
145
+ """Initialize Flask application with SQLSpec.
146
+
147
+ Validates configuration, creates portal if needed, creates pools,
148
+ and registers hooks.
149
+
150
+ Args:
151
+ app: Flask application to initialize.
152
+
153
+ Raises:
154
+ ImproperConfigurationError: If extension already registered or keys not unique.
155
+ """
156
+ if "sqlspec" in app.extensions:
157
+ msg = "SQLSpec extension already registered on this Flask application"
158
+ raise ImproperConfigurationError(msg)
159
+
160
+ self._validate_unique_keys()
161
+
162
+ if self._has_async_configs:
163
+ self._portal = PortalProvider()
164
+ self._portal.start()
165
+ log_with_context(logger, logging.DEBUG, "extension.init", framework="flask", stage="portal_started")
166
+
167
+ pools: dict[str, Any] = {}
168
+ for config_state in self._config_states:
169
+ if config_state.config.supports_connection_pooling:
170
+ if config_state.is_async:
171
+ pool = self._portal.portal.call(config_state.config.create_pool) # type: ignore[union-attr,arg-type]
172
+ else:
173
+ pool = config_state.config.create_pool()
174
+ pools[config_state.session_key] = pool
175
+ log_with_context(
176
+ logger, logging.DEBUG, "session.create", framework="flask", session_key=config_state.session_key
177
+ )
178
+
179
+ app.extensions["sqlspec"] = {"plugin": self, "pools": pools}
180
+
181
+ if any(not state.disable_di for state in self._config_states):
182
+ app.before_request(self._before_request_handler)
183
+ app.after_request(self._after_request_handler)
184
+ app.teardown_appcontext(self._teardown_appcontext_handler)
185
+
186
+ self._register_shutdown_hook()
187
+
188
+ log_with_context(
189
+ logger,
190
+ logging.DEBUG,
191
+ "extension.init",
192
+ framework="flask",
193
+ stage="configured",
194
+ config_count=len(self._config_states),
195
+ async_enabled=self._has_async_configs,
196
+ )
197
+
198
+ def _validate_unique_keys(self) -> None:
199
+ """Validate that all state keys are unique across configs.
200
+
201
+ Raises:
202
+ ImproperConfigurationError: If duplicate keys found.
203
+ """
204
+ all_keys: set[str] = set()
205
+
206
+ for state in self._config_states:
207
+ keys = {state.connection_key, state.session_key}
208
+ duplicates = all_keys & keys
209
+
210
+ if duplicates:
211
+ msg = f"Duplicate state keys found: {duplicates}. Use unique session_key values."
212
+ raise ImproperConfigurationError(msg)
213
+
214
+ all_keys.update(keys)
215
+
216
+ def _register_shutdown_hook(self) -> None:
217
+ """Register shutdown hook for pool and portal cleanup."""
218
+
219
+ if self._cleanup_registered:
220
+ return
221
+
222
+ atexit.register(self.shutdown)
223
+ self._cleanup_registered = True
224
+
225
+ def _before_request_handler(self) -> None:
226
+ """Acquire connection before request.
227
+
228
+ Stores connection in Flask g object for each configured database.
229
+ Also stores context managers for proper cleanup.
230
+ Extracts correlation ID if correlation middleware is enabled.
231
+ """
232
+ from flask import current_app, g, request
233
+
234
+ if self._enable_correlation and self._extractor is not None:
235
+ correlation_id = self._extractor.extract(lambda h: request.headers.get(h))
236
+ set_context_value(g, "correlation_id", correlation_id)
237
+ CorrelationContext.set(correlation_id)
238
+
239
+ for config_state in self._config_states:
240
+ if config_state.disable_di:
241
+ continue
242
+
243
+ if config_state.config.supports_connection_pooling:
244
+ pool = current_app.extensions["sqlspec"]["pools"][config_state.session_key]
245
+ conn_ctx = config_state.config.provide_connection(pool)
246
+
247
+ if config_state.is_async:
248
+ connection = self._portal.portal.call(conn_ctx.__aenter__) # type: ignore[union-attr]
249
+ else:
250
+ connection = conn_ctx.__enter__() # type: ignore[union-attr]
251
+
252
+ set_context_value(g, f"{config_state.connection_key}_ctx", conn_ctx)
253
+ elif config_state.is_async:
254
+ connection = self._portal.portal.call(config_state.config.create_connection) # type: ignore[union-attr,arg-type]
255
+ else:
256
+ connection = config_state.config.create_connection()
257
+
258
+ set_context_value(g, config_state.connection_key, connection)
259
+
260
+ def _after_request_handler(self, response: "Response") -> "Response":
261
+ """Handle transaction after request based on response status.
262
+
263
+ Args:
264
+ response: Flask response object.
265
+
266
+ Returns:
267
+ Response object with correlation ID header if enabled.
268
+ """
269
+ from flask import g
270
+
271
+ if self._enable_correlation:
272
+ correlation_id = get_context_value(g, "correlation_id", None)
273
+ if correlation_id:
274
+ response.headers["X-Correlation-ID"] = correlation_id
275
+
276
+ for config_state in self._config_states:
277
+ if config_state.disable_di:
278
+ continue
279
+
280
+ if config_state.commit_mode == "manual":
281
+ continue
282
+
283
+ cache_key = f"sqlspec_session_cache_{config_state.session_key}"
284
+ session = get_context_value(g, cache_key, None)
285
+
286
+ if session is None:
287
+ continue
288
+
289
+ if config_state.should_commit(response.status_code):
290
+ self._execute_commit(session, config_state)
291
+ elif config_state.should_rollback(response.status_code):
292
+ self._execute_rollback(session, config_state)
293
+
294
+ return response
295
+
296
+ def _teardown_appcontext_handler(self, _exc: "BaseException | None" = None) -> None:
297
+ """Clean up connections when request context ends.
298
+
299
+ Closes all connections, cleans up g object, and clears correlation context.
300
+
301
+ Args:
302
+ _exc: Exception that occurred (if any).
303
+ """
304
+ from flask import g
305
+
306
+ if self._enable_correlation:
307
+ CorrelationContext.clear()
308
+ if has_context_value(g, "correlation_id"):
309
+ pop_context_value(g, "correlation_id")
310
+
311
+ for config_state in self._config_states:
312
+ if config_state.disable_di:
313
+ continue
314
+
315
+ connection = get_context_value(g, config_state.connection_key, None)
316
+ ctx_key = f"{config_state.connection_key}_ctx"
317
+ conn_ctx = get_context_value(g, ctx_key, None)
318
+
319
+ if connection is not None:
320
+ try:
321
+ if conn_ctx is not None:
322
+ if config_state.is_async:
323
+ self._portal.portal.call(conn_ctx.__aexit__, None, None, None) # type: ignore[union-attr]
324
+ else:
325
+ conn_ctx.__exit__(None, None, None)
326
+ elif config_state.is_async:
327
+ self._portal.portal.call(connection.close) # type: ignore[union-attr]
328
+ else:
329
+ connection.close()
330
+ except Exception as exc:
331
+ log_with_context(
332
+ logger,
333
+ logging.ERROR,
334
+ "session.close",
335
+ framework="flask",
336
+ session_key=config_state.session_key,
337
+ operation="connection",
338
+ status="failed",
339
+ error_type=type(exc).__name__,
340
+ )
341
+
342
+ if has_context_value(g, config_state.connection_key):
343
+ pop_context_value(g, config_state.connection_key)
344
+ if has_context_value(g, ctx_key):
345
+ pop_context_value(g, ctx_key)
346
+
347
+ cache_key = f"sqlspec_session_cache_{config_state.session_key}"
348
+ if has_context_value(g, cache_key):
349
+ pop_context_value(g, cache_key)
350
+
351
+ def get_session(self, key: "str | None" = None) -> Any:
352
+ """Get or create database session for current request.
353
+
354
+ Sessions are cached per request for consistency.
355
+
356
+ Args:
357
+ key: Session key for multi-database configs. Defaults to first config if None.
358
+
359
+ Returns:
360
+ Database session (driver instance).
361
+ """
362
+ config_state = self._config_states[0] if key is None else self._get_config_state_by_key(key)
363
+
364
+ return get_or_create_session(config_state, self._portal.portal if self._portal else None)
365
+
366
+ def get_connection(self, key: "str | None" = None) -> Any:
367
+ """Get database connection for current request.
368
+
369
+ Args:
370
+ key: Session key for multi-database configs. Defaults to first config if None.
371
+
372
+ Returns:
373
+ Raw database connection.
374
+ """
375
+ from flask import g
376
+
377
+ config_state = self._config_states[0] if key is None else self._get_config_state_by_key(key)
378
+
379
+ return get_context_value(g, config_state.connection_key)
380
+
381
+ def _get_config_state_by_key(self, key: str) -> FlaskConfigState:
382
+ """Get config state by session key.
383
+
384
+ Args:
385
+ key: Session key to look up.
386
+
387
+ Returns:
388
+ FlaskConfigState for the key.
389
+
390
+ Raises:
391
+ ImproperConfigurationError: If key not found.
392
+ """
393
+ for state in self._config_states:
394
+ if state.session_key == key:
395
+ return state
396
+
397
+ msg = f"No configuration found for key: {key}"
398
+ raise ImproperConfigurationError(msg)
399
+
400
+ def shutdown(self) -> None:
401
+ """Dispose connection pools and stop async portal."""
402
+
403
+ if self._shutdown_complete:
404
+ return
405
+
406
+ self._shutdown_complete = True
407
+
408
+ for config_state in self._config_states:
409
+ if config_state.config.supports_connection_pooling:
410
+ self._close_pool_state(config_state)
411
+
412
+ if self._portal is not None:
413
+ try:
414
+ self._portal.stop()
415
+ except Exception as exc:
416
+ log_with_context(
417
+ logger,
418
+ logging.ERROR,
419
+ "extension.init",
420
+ framework="flask",
421
+ stage="shutdown",
422
+ status="failed",
423
+ error_type=type(exc).__name__,
424
+ )
425
+ finally:
426
+ self._portal = None
427
+
428
+ def _close_pool_state(self, config_state: FlaskConfigState) -> None:
429
+ """Close pool associated with configuration state."""
430
+
431
+ try:
432
+ if config_state.is_async:
433
+ if self._portal is None:
434
+ log_with_context(
435
+ logger,
436
+ logging.DEBUG,
437
+ "session.close",
438
+ framework="flask",
439
+ session_key=config_state.session_key,
440
+ operation="pool",
441
+ status="skipped",
442
+ reason="portal_not_initialized",
443
+ )
444
+ return
445
+ _ = self._portal.portal.call(config_state.config.close_pool) # type: ignore[arg-type]
446
+ else:
447
+ config_state.config.close_pool()
448
+ log_with_context(
449
+ logger,
450
+ logging.DEBUG,
451
+ "session.close",
452
+ framework="flask",
453
+ session_key=config_state.session_key,
454
+ operation="pool",
455
+ status="complete",
456
+ )
457
+ except Exception as exc:
458
+ log_with_context(
459
+ logger,
460
+ logging.ERROR,
461
+ "session.close",
462
+ framework="flask",
463
+ session_key=config_state.session_key,
464
+ operation="pool",
465
+ status="failed",
466
+ error_type=type(exc).__name__,
467
+ )
468
+
469
+ def _execute_commit(self, session: Any, config_state: FlaskConfigState) -> None:
470
+ """Execute commit on session.
471
+
472
+ Args:
473
+ session: Database session.
474
+ config_state: Configuration state.
475
+ """
476
+ try:
477
+ if config_state.is_async:
478
+ connection = self.get_connection(config_state.session_key)
479
+ self._portal.portal.call(connection.commit) # type: ignore[union-attr]
480
+ else:
481
+ connection = self.get_connection(config_state.session_key)
482
+ connection.commit()
483
+ except Exception as exc:
484
+ log_with_context(
485
+ logger,
486
+ logging.ERROR,
487
+ "session.close",
488
+ framework="flask",
489
+ session_key=config_state.session_key,
490
+ operation="commit",
491
+ status="failed",
492
+ error_type=type(exc).__name__,
493
+ )
494
+
495
+ def _execute_rollback(self, session: Any, config_state: FlaskConfigState) -> None:
496
+ """Execute rollback on session.
497
+
498
+ Args:
499
+ session: Database session.
500
+ config_state: Configuration state.
501
+ """
502
+ try:
503
+ if config_state.is_async:
504
+ connection = self.get_connection(config_state.session_key)
505
+ self._portal.portal.call(connection.rollback) # type: ignore[union-attr]
506
+ else:
507
+ connection = self.get_connection(config_state.session_key)
508
+ connection.rollback()
509
+ except Exception as exc:
510
+ log_with_context(
511
+ logger,
512
+ logging.DEBUG,
513
+ "session.close",
514
+ framework="flask",
515
+ session_key=config_state.session_key,
516
+ operation="rollback",
517
+ status="failed",
518
+ error_type=type(exc).__name__,
519
+ )
@@ -0,0 +1,28 @@
1
+ from sqlspec.extensions.litestar._utils import get_sqlspec_scope_state, set_sqlspec_scope_state
2
+ from sqlspec.extensions.litestar.channels import SQLSpecChannelsBackend
3
+ from sqlspec.extensions.litestar.cli import database_group
4
+ from sqlspec.extensions.litestar.config import LitestarConfig
5
+ from sqlspec.extensions.litestar.plugin import (
6
+ DEFAULT_COMMIT_MODE,
7
+ DEFAULT_CONNECTION_KEY,
8
+ DEFAULT_POOL_KEY,
9
+ DEFAULT_SESSION_KEY,
10
+ CommitMode,
11
+ SQLSpecPlugin,
12
+ )
13
+ from sqlspec.extensions.litestar.store import BaseSQLSpecStore
14
+
15
+ __all__ = (
16
+ "DEFAULT_COMMIT_MODE",
17
+ "DEFAULT_CONNECTION_KEY",
18
+ "DEFAULT_POOL_KEY",
19
+ "DEFAULT_SESSION_KEY",
20
+ "BaseSQLSpecStore",
21
+ "CommitMode",
22
+ "LitestarConfig",
23
+ "SQLSpecChannelsBackend",
24
+ "SQLSpecPlugin",
25
+ "database_group",
26
+ "get_sqlspec_scope_state",
27
+ "set_sqlspec_scope_state",
28
+ )