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,222 @@
1
+ """Logging utilities for SQLSpec.
2
+
3
+ This module provides utilities for structured logging with correlation IDs.
4
+ Users should configure their own logging handlers and levels as needed.
5
+ SQLSpec provides StructuredFormatter for JSON-formatted logs if desired.
6
+ """
7
+
8
+ import logging
9
+ from logging import LogRecord
10
+ from typing import TYPE_CHECKING, Any, cast
11
+
12
+ from sqlspec._serialization import encode_json
13
+ from sqlspec.utils.correlation import CorrelationContext
14
+ from sqlspec.utils.correlation import correlation_id_var as _correlation_id_var
15
+
16
+ if TYPE_CHECKING:
17
+ from contextvars import ContextVar
18
+
19
+ __all__ = (
20
+ "SqlglotCommandFallbackFilter",
21
+ "StructuredFormatter",
22
+ "correlation_id_var",
23
+ "get_correlation_id",
24
+ "get_logger",
25
+ "set_correlation_id",
26
+ "suppress_erroneous_sqlglot_log_messages",
27
+ )
28
+
29
+ _BASE_RECORD_KEYS: "set[str] | None" = None
30
+
31
+
32
+ def _get_base_record_keys() -> "set[str]":
33
+ """Get base LogRecord keys lazily to avoid mypyc module-level dict issues."""
34
+ global _BASE_RECORD_KEYS
35
+ if _BASE_RECORD_KEYS is None:
36
+ _BASE_RECORD_KEYS = set(
37
+ logging.LogRecord(
38
+ name="sqlspec", level=logging.INFO, pathname="(unknown file)", lineno=0, msg="", args=(), exc_info=None
39
+ ).__dict__.keys()
40
+ )
41
+ _BASE_RECORD_KEYS.update({"message", "asctime"})
42
+ return _BASE_RECORD_KEYS
43
+
44
+
45
+ correlation_id_var: "ContextVar[str | None]" = _correlation_id_var
46
+
47
+
48
+ def _get_trace_context() -> "tuple[str | None, str | None]":
49
+ """Resolve trace context lazily to avoid import cycles.
50
+
51
+ Returns:
52
+ Tuple of (trace_id, span_id) or (None, None) if unavailable.
53
+ """
54
+ try:
55
+ from sqlspec.observability import get_trace_context
56
+ except Exception:
57
+ return (None, None)
58
+ return get_trace_context()
59
+
60
+
61
+ def set_correlation_id(correlation_id: "str | None") -> None:
62
+ """Set the correlation ID for the current context.
63
+
64
+ Args:
65
+ correlation_id: The correlation ID to set, or None to clear
66
+ """
67
+ CorrelationContext.set(correlation_id)
68
+
69
+
70
+ def get_correlation_id() -> "str | None":
71
+ """Get the current correlation ID.
72
+
73
+ Returns:
74
+ The current correlation ID or None if not set
75
+ """
76
+ return CorrelationContext.get()
77
+
78
+
79
+ class StructuredFormatter(logging.Formatter):
80
+ """Structured JSON formatter with correlation ID support."""
81
+
82
+ def format(self, record: LogRecord) -> str:
83
+ """Format log record as structured JSON.
84
+
85
+ Args:
86
+ record: The log record to format
87
+
88
+ Returns:
89
+ JSON formatted log entry
90
+ """
91
+ log_entry = {
92
+ "timestamp": self.formatTime(record, self.datefmt),
93
+ "level": record.levelname,
94
+ "logger": record.name,
95
+ "message": record.getMessage(),
96
+ "module": record.module,
97
+ "function": record.funcName,
98
+ "line": record.lineno,
99
+ }
100
+
101
+ record_dict = record.__dict__
102
+ correlation_id = cast("str | None", record_dict.get("correlation_id")) or get_correlation_id()
103
+ if correlation_id:
104
+ log_entry["correlation_id"] = correlation_id
105
+ trace_id = cast("str | None", record_dict.get("trace_id"))
106
+ span_id = cast("str | None", record_dict.get("span_id"))
107
+ if trace_id is None or span_id is None:
108
+ trace_id, span_id = _get_trace_context()
109
+ if trace_id:
110
+ log_entry["trace_id"] = trace_id
111
+ if span_id:
112
+ log_entry["span_id"] = span_id
113
+
114
+ extra_fields = record_dict.get("extra_fields")
115
+ if isinstance(extra_fields, dict):
116
+ log_entry.update(extra_fields)
117
+
118
+ extras = {
119
+ key: value
120
+ for key, value in record_dict.items()
121
+ if key not in _get_base_record_keys() and key not in {"extra_fields", "correlation_id"}
122
+ }
123
+ if extras:
124
+ log_entry.update(extras)
125
+
126
+ if record.exc_info:
127
+ log_entry["exception"] = self.formatException(record.exc_info)
128
+
129
+ return encode_json(log_entry)
130
+
131
+
132
+ class CorrelationIDFilter(logging.Filter):
133
+ """Filter that adds correlation ID to log records."""
134
+
135
+ def filter(self, record: LogRecord) -> bool:
136
+ """Add correlation ID to record if available.
137
+
138
+ Args:
139
+ record: The log record to filter
140
+
141
+ Returns:
142
+ Always True to pass the record through
143
+ """
144
+ if correlation_id := get_correlation_id():
145
+ record.correlation_id = correlation_id
146
+ return True
147
+
148
+
149
+ class SqlglotCommandFallbackFilter(logging.Filter):
150
+ """Filter to suppress sqlglot warnings we consider benign.
151
+
152
+ - "Falling back to parsing as a 'Command'": emitted when sqlglot hits syntax it
153
+ intentionally downgrades; expected in SQLSpec usage.
154
+ - "Cannot traverse scope …": emitted by sqlglot's scope analysis in cases where
155
+ SQLSpec feeds partially constructed expressions; harmless for our flows.
156
+ """
157
+
158
+ _suppressed_substrings = (
159
+ "falling back to parsing as a 'command'",
160
+ "cannot traverse scope",
161
+ "locking reads using 'for update/share' are not supported",
162
+ )
163
+
164
+ def filter(self, record: LogRecord) -> bool:
165
+ """Suppress known-safe sqlglot warnings.
166
+
167
+ Args:
168
+ record: The log record to evaluate
169
+
170
+ Returns:
171
+ False if the record message matches a suppressed pattern, True otherwise.
172
+ """
173
+ message = record.getMessage().lower()
174
+ return not any(substr in message for substr in self._suppressed_substrings)
175
+
176
+
177
+ def get_logger(name: "str | None" = None) -> logging.Logger:
178
+ """Get a logger instance with standardized configuration.
179
+
180
+ Args:
181
+ name: Logger name. If not provided, returns the root sqlspec logger.
182
+
183
+ Returns:
184
+ Configured logger instance
185
+ """
186
+ if name is None:
187
+ return logging.getLogger("sqlspec")
188
+
189
+ if not name.startswith("sqlspec"):
190
+ name = f"sqlspec.{name}"
191
+
192
+ logger = logging.getLogger(name)
193
+
194
+ if not any(isinstance(f, CorrelationIDFilter) for f in logger.filters):
195
+ logger.addFilter(CorrelationIDFilter())
196
+
197
+ return logger
198
+
199
+
200
+ def log_with_context(logger: logging.Logger, level: int, message: str, **extra_fields: Any) -> None:
201
+ """Log a message with structured extra fields.
202
+
203
+ Args:
204
+ logger: The logger to use
205
+ level: Log level
206
+ message: Log message
207
+ **extra_fields: Additional fields to include in structured logs
208
+ """
209
+ logger.log(level, message, extra={"extra_fields": extra_fields}, stacklevel=2)
210
+
211
+
212
+ def suppress_erroneous_sqlglot_log_messages() -> None:
213
+ """Suppress confusing sqlglot warning messages.
214
+
215
+ Adds a filter to the sqlglot logger to suppress the warning message
216
+ about falling back to parsing as a Command. This is expected behavior
217
+ in SQLSpec and the warning is confusing to users.
218
+ """
219
+ for logger_name in ("sqlglot", "sqlglot.scope", "sqlglot.generator"):
220
+ sqlglot_logger = logging.getLogger(logger_name)
221
+ if not any(isinstance(f, SqlglotCommandFallbackFilter) for f in sqlglot_logger.filters):
222
+ sqlglot_logger.addFilter(SqlglotCommandFallbackFilter())
@@ -0,0 +1,306 @@
1
+ """Module loading utilities for SQLSpec.
2
+
3
+ Provides functions for dynamic module imports, path resolution, and dependency
4
+ availability checking. Used for loading modules from dotted paths, converting
5
+ module paths to filesystem paths, and ensuring optional dependencies are installed.
6
+ """
7
+
8
+ import importlib
9
+ from importlib.util import find_spec
10
+ from pathlib import Path
11
+ from typing import TYPE_CHECKING, Any
12
+
13
+ from sqlspec.exceptions import MissingDependencyError
14
+
15
+ if TYPE_CHECKING:
16
+ from types import ModuleType
17
+
18
+ __all__ = (
19
+ "OptionalDependencyFlag",
20
+ "dependency_flag",
21
+ "ensure_attrs",
22
+ "ensure_cattrs",
23
+ "ensure_fsspec",
24
+ "ensure_litestar",
25
+ "ensure_msgspec",
26
+ "ensure_numpy",
27
+ "ensure_obstore",
28
+ "ensure_opentelemetry",
29
+ "ensure_orjson",
30
+ "ensure_pandas",
31
+ "ensure_pgvector",
32
+ "ensure_polars",
33
+ "ensure_prometheus",
34
+ "ensure_pyarrow",
35
+ "ensure_pydantic",
36
+ "ensure_uvloop",
37
+ "import_string",
38
+ "module_available",
39
+ "module_to_os_path",
40
+ "reset_dependency_cache",
41
+ )
42
+
43
+
44
+ # =============================================================================
45
+ # Dependency Availability Checking
46
+ # =============================================================================
47
+
48
+ _dependency_cache: "dict[str, bool]" = {}
49
+
50
+
51
+ def module_available(module_name: str) -> bool:
52
+ """Return True if the given module can be resolved.
53
+
54
+ The result is cached per interpreter session. Call
55
+ :func:`reset_dependency_cache` to invalidate cached entries when
56
+ tests manipulate ``sys.path``.
57
+
58
+ Args:
59
+ module_name: Dotted module path to check.
60
+
61
+ Returns:
62
+ True if :mod:`importlib` can find the module, False otherwise.
63
+ """
64
+
65
+ cached = _dependency_cache.get(module_name)
66
+ if cached is not None:
67
+ return cached
68
+
69
+ try:
70
+ is_available = find_spec(module_name) is not None
71
+ except ModuleNotFoundError:
72
+ is_available = False
73
+
74
+ _dependency_cache[module_name] = is_available
75
+ return is_available
76
+
77
+
78
+ def reset_dependency_cache(module_name: str | None = None) -> None:
79
+ """Clear cached availability for one module or the entire cache.
80
+
81
+ Args:
82
+ module_name: Specific dotted module path to drop from the cache.
83
+ Clears the full cache when ``None``.
84
+ """
85
+
86
+ if module_name is None:
87
+ _dependency_cache.clear()
88
+ return
89
+
90
+ _dependency_cache.pop(module_name, None)
91
+
92
+
93
+ class OptionalDependencyFlag:
94
+ """Boolean-like wrapper that evaluates module availability lazily."""
95
+
96
+ __slots__ = ("module_name",)
97
+
98
+ def __init__(self, module_name: str) -> None:
99
+ self.module_name = module_name
100
+
101
+ def __bool__(self) -> bool:
102
+ return module_available(self.module_name)
103
+
104
+ def __repr__(self) -> str:
105
+ status = "available" if module_available(self.module_name) else "missing"
106
+ return f"OptionalDependencyFlag(module='{self.module_name}', status='{status}')"
107
+
108
+
109
+ def dependency_flag(module_name: str) -> "OptionalDependencyFlag":
110
+ """Return a lazily evaluated flag for the supplied module name.
111
+
112
+ Args:
113
+ module_name: Dotted module path to guard.
114
+
115
+ Returns:
116
+ :class:`OptionalDependencyFlag` tracking the module.
117
+ """
118
+
119
+ return OptionalDependencyFlag(module_name)
120
+
121
+
122
+ # =============================================================================
123
+ # Module Loading and Import Utilities
124
+ # =============================================================================
125
+
126
+
127
+ def _require_dependency(
128
+ module_name: str, *, package_name: str | None = None, install_package: str | None = None
129
+ ) -> None:
130
+ """Raise MissingDependencyError when an optional dependency is absent."""
131
+
132
+ if module_available(module_name):
133
+ return
134
+
135
+ package = package_name or module_name
136
+ install = install_package or package
137
+ raise MissingDependencyError(package=package, install_package=install)
138
+
139
+
140
+ def _raise_import_error(msg: str, exc: "Exception | None" = None) -> None:
141
+ """Raise an ImportError with optional exception chaining."""
142
+ if exc is not None:
143
+ raise ImportError(msg) from exc
144
+ raise ImportError(msg)
145
+
146
+
147
+ def _resolve_import_attr(obj: Any, attr: str, module: "ModuleType | None", dotted_path: str) -> Any:
148
+ """Resolve a dotted attribute path segment on a module or object."""
149
+ try:
150
+ return obj.__getattribute__(attr)
151
+ except AttributeError as exc:
152
+ module_name = module.__name__ if module is not None else "unknown"
153
+ _raise_import_error(f"Module '{module_name}' has no attribute '{attr}' in '{dotted_path}'", exc)
154
+ raise
155
+
156
+
157
+ def module_to_os_path(dotted_path: str = "app") -> "Path":
158
+ """Convert a module dotted path to filesystem path.
159
+
160
+ Args:
161
+ dotted_path: The path to the module.
162
+
163
+ Raises:
164
+ TypeError: The module could not be found.
165
+
166
+ Returns:
167
+ The path to the module.
168
+ """
169
+ try:
170
+ if (src := find_spec(dotted_path)) is None: # pragma: no cover
171
+ msg = f"Couldn't find the path for {dotted_path}"
172
+ raise TypeError(msg)
173
+ except ModuleNotFoundError as e:
174
+ msg = f"Couldn't find the path for {dotted_path}"
175
+ raise TypeError(msg) from e
176
+
177
+ path = Path(str(src.origin))
178
+ return path.parent if path.is_file() else path
179
+
180
+
181
+ def import_string(dotted_path: str) -> "Any":
182
+ """Import a module or attribute from a dotted path string.
183
+
184
+ Args:
185
+ dotted_path: The path of the module to import.
186
+
187
+ Returns:
188
+ The imported object.
189
+ """
190
+
191
+ obj: Any = None
192
+ try:
193
+ parts = dotted_path.split(".")
194
+ module = None
195
+ i = len(parts)
196
+
197
+ for i in range(len(parts), 0, -1):
198
+ module_path = ".".join(parts[:i])
199
+ try:
200
+ module = importlib.import_module(module_path)
201
+ break
202
+ except ModuleNotFoundError:
203
+ continue
204
+ else:
205
+ _raise_import_error(f"{dotted_path} doesn't look like a module path")
206
+
207
+ if module is None:
208
+ _raise_import_error(f"Failed to import any module from {dotted_path}")
209
+
210
+ obj = module
211
+ attrs = parts[i:]
212
+ if not attrs and i == len(parts) and len(parts) > 1:
213
+ parent_module_path = ".".join(parts[:-1])
214
+ attr = parts[-1]
215
+ try:
216
+ parent_module = importlib.import_module(parent_module_path)
217
+ except Exception:
218
+ return obj
219
+ if attr not in parent_module.__dict__:
220
+ _raise_import_error(f"Module '{parent_module_path}' has no attribute '{attr}' in '{dotted_path}'")
221
+
222
+ for attr in attrs:
223
+ obj = _resolve_import_attr(obj, attr, module, dotted_path)
224
+ except Exception as e: # pylint: disable=broad-exception-caught
225
+ _raise_import_error(f"Could not import '{dotted_path}': {e}", e)
226
+ return obj
227
+
228
+
229
+ def ensure_attrs() -> None:
230
+ """Ensure attrs is available."""
231
+ _require_dependency("attrs")
232
+
233
+
234
+ def ensure_cattrs() -> None:
235
+ """Ensure cattrs is available."""
236
+ _require_dependency("cattrs")
237
+
238
+
239
+ def ensure_fsspec() -> None:
240
+ """Ensure fsspec is available for filesystem operations."""
241
+ _require_dependency("fsspec")
242
+
243
+
244
+ def ensure_litestar() -> None:
245
+ """Ensure Litestar is available."""
246
+ _require_dependency("litestar")
247
+
248
+
249
+ def ensure_msgspec() -> None:
250
+ """Ensure msgspec is available for serialization."""
251
+ _require_dependency("msgspec")
252
+
253
+
254
+ def ensure_numpy() -> None:
255
+ """Ensure NumPy is available for array operations."""
256
+ _require_dependency("numpy")
257
+
258
+
259
+ def ensure_obstore() -> None:
260
+ """Ensure obstore is available for object storage operations."""
261
+ _require_dependency("obstore")
262
+
263
+
264
+ def ensure_opentelemetry() -> None:
265
+ """Ensure OpenTelemetry is available for tracing."""
266
+ _require_dependency("opentelemetry", package_name="opentelemetry-api", install_package="opentelemetry")
267
+
268
+
269
+ def ensure_orjson() -> None:
270
+ """Ensure orjson is available for fast JSON operations."""
271
+ _require_dependency("orjson")
272
+
273
+
274
+ def ensure_pandas() -> None:
275
+ """Ensure pandas is available for DataFrame operations."""
276
+ _require_dependency("pandas")
277
+
278
+
279
+ def ensure_pgvector() -> None:
280
+ """Ensure pgvector is available for vector operations."""
281
+ _require_dependency("pgvector")
282
+
283
+
284
+ def ensure_polars() -> None:
285
+ """Ensure Polars is available for DataFrame operations."""
286
+ _require_dependency("polars")
287
+
288
+
289
+ def ensure_prometheus() -> None:
290
+ """Ensure Prometheus client is available for metrics."""
291
+ _require_dependency("prometheus_client", package_name="prometheus-client", install_package="prometheus")
292
+
293
+
294
+ def ensure_pyarrow() -> None:
295
+ """Ensure PyArrow is available for Arrow operations."""
296
+ _require_dependency("pyarrow")
297
+
298
+
299
+ def ensure_pydantic() -> None:
300
+ """Ensure Pydantic is available for data validation."""
301
+ _require_dependency("pydantic")
302
+
303
+
304
+ def ensure_uvloop() -> None:
305
+ """Ensure uvloop is available for fast event loops."""
306
+ _require_dependency("uvloop")