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,446 @@
1
+ """Migration version parsing and comparison utilities.
2
+
3
+ Provides structured parsing of migration versions supporting both legacy sequential
4
+ (0001) and timestamp-based (20251011120000) formats with type-safe comparison.
5
+ """
6
+
7
+ import re
8
+ from dataclasses import dataclass
9
+ from datetime import datetime, timezone
10
+ from enum import Enum
11
+ from typing import Any
12
+
13
+ from sqlspec.utils.logging import get_logger
14
+
15
+ __all__ = (
16
+ "MigrationVersion",
17
+ "VersionType",
18
+ "convert_to_sequential_version",
19
+ "generate_conversion_map",
20
+ "generate_timestamp_version",
21
+ "get_next_sequential_number",
22
+ "is_sequential_version",
23
+ "is_timestamp_version",
24
+ "parse_version",
25
+ )
26
+
27
+ logger = get_logger(__name__)
28
+
29
+ SEQUENTIAL_PATTERN = re.compile(r"^(?!\d{14}$)\d+$")
30
+ TIMESTAMP_PATTERN = re.compile(r"^(\d{14})$")
31
+ EXTENSION_PATTERN = re.compile(r"^ext_(\w+)_(.+)$")
32
+
33
+
34
+ class VersionType(Enum):
35
+ """Migration version format type."""
36
+
37
+ SEQUENTIAL = "sequential"
38
+ TIMESTAMP = "timestamp"
39
+
40
+
41
+ @dataclass(frozen=True)
42
+ class MigrationVersion:
43
+ """Parsed migration version with structured comparison support.
44
+
45
+ Attributes:
46
+ raw: Original version string (e.g., "0001", "20251011120000", "ext_litestar_0001").
47
+ type: Version format type (sequential or timestamp).
48
+ sequence: Numeric value for sequential versions (e.g., 1, 2, 42).
49
+ timestamp: Parsed datetime for timestamp versions (UTC).
50
+ extension: Extension name for extension-prefixed versions (e.g., "litestar").
51
+ """
52
+
53
+ raw: str
54
+ type: VersionType
55
+ sequence: "int | None"
56
+ timestamp: "datetime | None"
57
+ extension: "str | None"
58
+
59
+ def __lt__(self, other: "MigrationVersion") -> bool:
60
+ """Compare versions supporting mixed formats.
61
+
62
+ Comparison Rules:
63
+ 1. Extension migrations sort by extension name first, then version
64
+ 2. Sequential < Timestamp (legacy migrations first)
65
+ 3. Sequential vs Sequential: numeric comparison
66
+ 4. Timestamp vs Timestamp: chronological comparison
67
+
68
+ Args:
69
+ other: Version to compare against.
70
+
71
+ Returns:
72
+ True if this version sorts before other.
73
+
74
+ Raises:
75
+ TypeError: If comparing against non-MigrationVersion.
76
+ """
77
+ if not isinstance(other, MigrationVersion):
78
+ return NotImplemented
79
+
80
+ if self.extension != other.extension:
81
+ if self.extension is None:
82
+ return True
83
+ if other.extension is None:
84
+ return False
85
+ return self.extension < other.extension
86
+
87
+ if self.type == other.type:
88
+ if self.type == VersionType.SEQUENTIAL:
89
+ return (self.sequence or 0) < (other.sequence or 0)
90
+ return (self.timestamp or datetime.min.replace(tzinfo=timezone.utc)) < (
91
+ other.timestamp or datetime.min.replace(tzinfo=timezone.utc)
92
+ )
93
+
94
+ return self.type == VersionType.SEQUENTIAL
95
+
96
+ def __le__(self, other: "MigrationVersion") -> bool:
97
+ """Check if version is less than or equal to another.
98
+
99
+ Args:
100
+ other: Version to compare against.
101
+
102
+ Returns:
103
+ True if this version is less than or equal to other.
104
+ """
105
+ return self == other or self < other
106
+
107
+ def __eq__(self, other: object) -> bool:
108
+ """Check version equality.
109
+
110
+ Args:
111
+ other: Version to compare against.
112
+
113
+ Returns:
114
+ True if versions are equal.
115
+ """
116
+ if not isinstance(other, MigrationVersion):
117
+ return NotImplemented
118
+ return self.raw == other.raw
119
+
120
+ def __hash__(self) -> int:
121
+ """Hash version for use in sets and dicts.
122
+
123
+ Returns:
124
+ Hash value based on raw version string.
125
+ """
126
+ return hash(self.raw)
127
+
128
+ def __repr__(self) -> str:
129
+ """Get string representation for debugging.
130
+
131
+ Returns:
132
+ String representation with type and value.
133
+ """
134
+ if self.extension:
135
+ return f"MigrationVersion(ext={self.extension}, {self.type.value}={self.raw})"
136
+ return f"MigrationVersion({self.type.value}={self.raw})"
137
+
138
+
139
+ def is_sequential_version(version_str: "str | None") -> bool:
140
+ """Check if version string is sequential format.
141
+
142
+ Sequential format: Any sequence of digits (0001, 42, 9999, 10000+).
143
+
144
+ Args:
145
+ version_str: Version string to check.
146
+
147
+ Returns:
148
+ True if sequential format, False if None or whitespace.
149
+
150
+ Examples:
151
+ >>> is_sequential_version("0001")
152
+ True
153
+ >>> is_sequential_version("42")
154
+ True
155
+ >>> is_sequential_version("10000")
156
+ True
157
+ >>> is_sequential_version("20251011120000")
158
+ False
159
+ >>> is_sequential_version(None)
160
+ False
161
+ """
162
+ if version_str is None or not version_str.strip():
163
+ return False
164
+ return bool(SEQUENTIAL_PATTERN.match(version_str))
165
+
166
+
167
+ def is_timestamp_version(version_str: "str | None") -> bool:
168
+ """Check if version string is timestamp format.
169
+
170
+ Timestamp format: 14-digit YYYYMMDDHHmmss (20251011120000).
171
+
172
+ Args:
173
+ version_str: Version string to check.
174
+
175
+ Returns:
176
+ True if timestamp format, False if None or whitespace.
177
+
178
+ Examples:
179
+ >>> is_timestamp_version("20251011120000")
180
+ True
181
+ >>> is_timestamp_version("0001")
182
+ False
183
+ >>> is_timestamp_version(None)
184
+ False
185
+ """
186
+ if version_str is None or not version_str.strip():
187
+ return False
188
+ if not TIMESTAMP_PATTERN.match(version_str):
189
+ return False
190
+
191
+ try:
192
+ datetime.strptime(version_str, "%Y%m%d%H%M%S").replace(tzinfo=timezone.utc)
193
+ except ValueError:
194
+ return False
195
+ else:
196
+ return True
197
+
198
+
199
+ def parse_version(version_str: "str | None") -> MigrationVersion:
200
+ """Parse version string into structured format.
201
+
202
+ Supports:
203
+ - Sequential: "0001", "42", "9999"
204
+ - Timestamp: "20251011120000"
205
+ - Extension: "ext_litestar_0001", "ext_litestar_20251011120000"
206
+
207
+ Args:
208
+ version_str: Version string to parse.
209
+
210
+ Returns:
211
+ Parsed migration version.
212
+
213
+ Raises:
214
+ ValueError: If version format is invalid, None, or whitespace-only.
215
+
216
+ Examples:
217
+ >>> v = parse_version("0001")
218
+ >>> v.type == VersionType.SEQUENTIAL
219
+ True
220
+ >>> v.sequence
221
+ 1
222
+
223
+ >>> v = parse_version("20251011120000")
224
+ >>> v.type == VersionType.TIMESTAMP
225
+ True
226
+
227
+ >>> v = parse_version("ext_litestar_0001")
228
+ >>> v.extension
229
+ 'litestar'
230
+ """
231
+ if version_str is None or not version_str.strip():
232
+ msg = "Invalid migration version: version string is None or empty"
233
+ raise ValueError(msg)
234
+
235
+ extension_match = EXTENSION_PATTERN.match(version_str)
236
+ if extension_match:
237
+ extension_name = extension_match.group(1)
238
+ base_version = extension_match.group(2)
239
+ parsed = parse_version(base_version)
240
+
241
+ return MigrationVersion(
242
+ raw=version_str,
243
+ type=parsed.type,
244
+ sequence=parsed.sequence,
245
+ timestamp=parsed.timestamp,
246
+ extension=extension_name,
247
+ )
248
+
249
+ if is_timestamp_version(version_str):
250
+ dt = datetime.strptime(version_str, "%Y%m%d%H%M%S").replace(tzinfo=timezone.utc)
251
+ return MigrationVersion(
252
+ raw=version_str, type=VersionType.TIMESTAMP, sequence=None, timestamp=dt, extension=None
253
+ )
254
+
255
+ if is_sequential_version(version_str):
256
+ return MigrationVersion(
257
+ raw=version_str, type=VersionType.SEQUENTIAL, sequence=int(version_str), timestamp=None, extension=None
258
+ )
259
+
260
+ msg = f"Invalid migration version format: {version_str}. Expected sequential (0001) or timestamp (YYYYMMDDHHmmss)."
261
+ raise ValueError(msg)
262
+
263
+
264
+ def _try_parse_version(version_str: str) -> "MigrationVersion | None":
265
+ """Parse version string, returning None for invalid versions."""
266
+ try:
267
+ return parse_version(version_str)
268
+ except ValueError:
269
+ logger.warning("Skipping invalid migration version: %s", version_str)
270
+ return None
271
+
272
+
273
+ def generate_timestamp_version() -> str:
274
+ """Generate new timestamp version in UTC.
275
+
276
+ Format: YYYYMMDDHHmmss (14 digits).
277
+
278
+ Returns:
279
+ Timestamp version string.
280
+
281
+ Examples:
282
+ >>> version = generate_timestamp_version()
283
+ >>> len(version)
284
+ 14
285
+ >>> is_timestamp_version(version)
286
+ True
287
+ """
288
+ return datetime.now(tz=timezone.utc).strftime("%Y%m%d%H%M%S")
289
+
290
+
291
+ def get_next_sequential_number(migrations: "list[MigrationVersion]", extension: "str | None" = None) -> int:
292
+ """Find highest sequential number and return next available.
293
+
294
+ Scans migrations for sequential versions and returns the next number in sequence.
295
+ When extension is specified, only that extension's migrations are considered.
296
+ When extension is None, only core (non-extension) migrations are considered.
297
+
298
+ Args:
299
+ migrations: List of parsed migration versions.
300
+ extension: Optional extension name to filter by (e.g., "litestar", "adk").
301
+ None means core migrations only.
302
+
303
+ Returns:
304
+ Next available sequential number (1 if no sequential migrations exist).
305
+
306
+ Examples:
307
+ >>> v1 = parse_version("0001")
308
+ >>> v2 = parse_version("0002")
309
+ >>> get_next_sequential_number([v1, v2])
310
+ 3
311
+
312
+ >>> get_next_sequential_number([])
313
+ 1
314
+
315
+ >>> ext = parse_version("ext_litestar_0001")
316
+ >>> core = parse_version("0001")
317
+ >>> get_next_sequential_number([ext, core])
318
+ 2
319
+
320
+ >>> ext1 = parse_version("ext_litestar_0001")
321
+ >>> get_next_sequential_number([ext1], extension="litestar")
322
+ 2
323
+ """
324
+ sequential = [
325
+ m.sequence for m in migrations if m.type == VersionType.SEQUENTIAL and m.extension == extension and m.sequence
326
+ ]
327
+
328
+ if not sequential:
329
+ return 1
330
+
331
+ return max(sequential) + 1
332
+
333
+
334
+ def convert_to_sequential_version(timestamp_version: MigrationVersion, sequence_number: int) -> str:
335
+ """Convert timestamp MigrationVersion to sequential string format.
336
+
337
+ Preserves extension prefixes during conversion. Format uses zero-padded
338
+ 4-digit numbers (0001, 0002, etc.).
339
+
340
+ Args:
341
+ timestamp_version: Parsed timestamp version to convert.
342
+ sequence_number: Sequential number to assign.
343
+
344
+ Returns:
345
+ Sequential version string with extension prefix if applicable.
346
+
347
+ Raises:
348
+ ValueError: If input is not a timestamp version.
349
+
350
+ Examples:
351
+ >>> v = parse_version("20251011120000")
352
+ >>> convert_to_sequential_version(v, 3)
353
+ '0003'
354
+
355
+ >>> v = parse_version("ext_litestar_20251011120000")
356
+ >>> convert_to_sequential_version(v, 1)
357
+ 'ext_litestar_0001'
358
+
359
+ >>> v = parse_version("0001")
360
+ >>> convert_to_sequential_version(v, 2)
361
+ Traceback (most recent call last):
362
+ ...
363
+ ValueError: Can only convert timestamp versions to sequential
364
+ """
365
+ if timestamp_version.type != VersionType.TIMESTAMP:
366
+ msg = "Can only convert timestamp versions to sequential"
367
+ raise ValueError(msg)
368
+
369
+ seq_str = str(sequence_number).zfill(4)
370
+
371
+ if timestamp_version.extension:
372
+ return f"ext_{timestamp_version.extension}_{seq_str}"
373
+
374
+ return seq_str
375
+
376
+
377
+ def generate_conversion_map(migrations: "list[tuple[str, Any]]") -> "dict[str, str]":
378
+ """Generate mapping from timestamp versions to sequential versions.
379
+
380
+ Separates timestamp migrations from sequential, sorts timestamps chronologically,
381
+ and assigns sequential numbers starting after the highest existing sequential
382
+ number. Extension migrations maintain separate numbering within their namespace.
383
+
384
+ Args:
385
+ migrations: List of tuples (version_string, migration_path).
386
+
387
+ Returns:
388
+ Dictionary mapping old timestamp versions to new sequential versions.
389
+
390
+ Examples:
391
+ >>> migrations = [
392
+ ... ("0001", Path("0001_init.sql")),
393
+ ... ("0002", Path("0002_users.sql")),
394
+ ... ("20251011120000", Path("20251011120000_products.sql")),
395
+ ... ("20251012130000", Path("20251012130000_orders.sql")),
396
+ ... ]
397
+ >>> result = generate_conversion_map(migrations)
398
+ >>> result
399
+ {'20251011120000': '0003', '20251012130000': '0004'}
400
+
401
+ >>> migrations = [
402
+ ... ("20251011120000", Path("20251011120000_first.sql")),
403
+ ... ("20251010090000", Path("20251010090000_earlier.sql")),
404
+ ... ]
405
+ >>> result = generate_conversion_map(migrations)
406
+ >>> result
407
+ {'20251010090000': '0001', '20251011120000': '0002'}
408
+
409
+ >>> migrations = []
410
+ >>> generate_conversion_map(migrations)
411
+ {}
412
+ """
413
+ if not migrations:
414
+ return {}
415
+
416
+ parsed_versions = [v for version_str, _path in migrations if (v := _try_parse_version(version_str)) is not None]
417
+
418
+ timestamp_migrations = sorted([v for v in parsed_versions if v.type == VersionType.TIMESTAMP])
419
+
420
+ if not timestamp_migrations:
421
+ return {}
422
+
423
+ core_timestamps = [m for m in timestamp_migrations if m.extension is None]
424
+ ext_timestamps_by_name: dict[str, list[MigrationVersion]] = {}
425
+ for m in timestamp_migrations:
426
+ if m.extension:
427
+ ext_timestamps_by_name.setdefault(m.extension, []).append(m)
428
+
429
+ conversion_map: dict[str, str] = {}
430
+
431
+ if core_timestamps:
432
+ next_seq = get_next_sequential_number(parsed_versions)
433
+ for timestamp_version in core_timestamps:
434
+ sequential_version = convert_to_sequential_version(timestamp_version, next_seq)
435
+ conversion_map[timestamp_version.raw] = sequential_version
436
+ next_seq += 1
437
+
438
+ for ext_name, ext_migrations in ext_timestamps_by_name.items():
439
+ ext_parsed = [v for v in parsed_versions if v.extension == ext_name]
440
+ next_seq = get_next_sequential_number(ext_parsed, extension=ext_name)
441
+ for timestamp_version in ext_migrations:
442
+ sequential_version = convert_to_sequential_version(timestamp_version, next_seq)
443
+ conversion_map[timestamp_version.raw] = sequential_version
444
+ next_seq += 1
445
+
446
+ return conversion_map
@@ -0,0 +1,55 @@
1
+ """Public observability exports."""
2
+
3
+ from sqlspec.observability._common import compute_sql_hash, get_trace_context, resolve_db_system
4
+ from sqlspec.observability._config import (
5
+ LifecycleHook,
6
+ LoggingConfig,
7
+ ObservabilityConfig,
8
+ RedactionConfig,
9
+ StatementObserver,
10
+ TelemetryConfig,
11
+ )
12
+ from sqlspec.observability._diagnostics import DiagnosticsPayload, TelemetryDiagnostics
13
+ from sqlspec.observability._dispatcher import LifecycleContext, LifecycleDispatcher
14
+ from sqlspec.observability._formatters import AWSLogFormatter, AzureLogFormatter, CloudLogFormatter, GCPLogFormatter
15
+ from sqlspec.observability._formatting import OTelConsoleFormatter, OTelJSONFormatter
16
+ from sqlspec.observability._observer import (
17
+ StatementEvent,
18
+ create_event,
19
+ create_statement_observer,
20
+ default_statement_observer,
21
+ format_statement_event,
22
+ )
23
+ from sqlspec.observability._runtime import ObservabilityRuntime
24
+ from sqlspec.observability._sampling import SamplingConfig
25
+ from sqlspec.observability._spans import SpanManager
26
+
27
+ __all__ = (
28
+ "AWSLogFormatter",
29
+ "AzureLogFormatter",
30
+ "CloudLogFormatter",
31
+ "DiagnosticsPayload",
32
+ "GCPLogFormatter",
33
+ "LifecycleContext",
34
+ "LifecycleDispatcher",
35
+ "LifecycleHook",
36
+ "LoggingConfig",
37
+ "OTelConsoleFormatter",
38
+ "OTelJSONFormatter",
39
+ "ObservabilityConfig",
40
+ "ObservabilityRuntime",
41
+ "RedactionConfig",
42
+ "SamplingConfig",
43
+ "SpanManager",
44
+ "StatementEvent",
45
+ "StatementObserver",
46
+ "TelemetryConfig",
47
+ "TelemetryDiagnostics",
48
+ "compute_sql_hash",
49
+ "create_event",
50
+ "create_statement_observer",
51
+ "default_statement_observer",
52
+ "format_statement_event",
53
+ "get_trace_context",
54
+ "resolve_db_system",
55
+ )
@@ -0,0 +1,77 @@
1
+ """Shared utilities for observability instrumentation."""
2
+
3
+ import hashlib
4
+ from typing import Any
5
+
6
+ __all__ = ("compute_sql_hash", "get_trace_context", "resolve_db_system")
7
+
8
+ _DB_SYSTEM_MAP: "tuple[tuple[str, str], ...]" = (
9
+ ("asyncpg", "postgresql"),
10
+ ("psycopg", "postgresql"),
11
+ ("psqlpy", "postgresql"),
12
+ ("postgres", "postgresql"),
13
+ ("asyncmy", "mysql"),
14
+ ("mysql", "mysql"),
15
+ ("mariadb", "mysql"),
16
+ ("aiosqlite", "sqlite"),
17
+ ("sqlite", "sqlite"),
18
+ ("duckdb", "duckdb"),
19
+ ("bigquery", "bigquery"),
20
+ ("spanner", "spanner"),
21
+ ("oracle", "oracle"),
22
+ ("oracledb", "oracle"),
23
+ ("adbc", "adbc"),
24
+ )
25
+
26
+
27
+ def resolve_db_system(adapter_or_driver: str) -> str:
28
+ """Resolve adapter/driver name to OTel db.system value.
29
+
30
+ Args:
31
+ adapter_or_driver: Adapter or driver name.
32
+
33
+ Returns:
34
+ OTel db.system value.
35
+ """
36
+ normalized = adapter_or_driver.lower()
37
+ for needle, system in _DB_SYSTEM_MAP:
38
+ if needle in normalized:
39
+ return system
40
+ return "other_sql"
41
+
42
+
43
+ def get_trace_context() -> "tuple[str | None, str | None]":
44
+ """Extract trace_id and span_id from the current OTel context.
45
+
46
+ Returns:
47
+ Tuple of trace_id and span_id if available, otherwise (None, None).
48
+ """
49
+ try:
50
+ from opentelemetry import trace
51
+ except ImportError:
52
+ return None, None
53
+
54
+ span: Any | None = trace.get_current_span()
55
+ if span is None or not span.is_recording():
56
+ return None, None
57
+
58
+ ctx = span.get_span_context()
59
+ if not ctx or not ctx.is_valid:
60
+ return None, None
61
+
62
+ if not ctx.trace_id or not ctx.span_id:
63
+ return None, None
64
+
65
+ return format(ctx.trace_id, "032x"), format(ctx.span_id, "016x")
66
+
67
+
68
+ def compute_sql_hash(sql: str) -> str:
69
+ """Return the 16-character SHA256 hash for SQL text.
70
+
71
+ Args:
72
+ sql: SQL statement text.
73
+
74
+ Returns:
75
+ SHA256 hash prefix.
76
+ """
77
+ return hashlib.sha256(sql.encode("utf-8")).hexdigest()[:16]