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,348 @@
1
+ """Configuration objects for the observability suite."""
2
+
3
+ from collections.abc import Callable, Iterable
4
+ from typing import TYPE_CHECKING, Any, cast
5
+
6
+ if TYPE_CHECKING: # pragma: no cover - import cycle guard
7
+ from sqlspec.config import LifecycleConfig
8
+ from sqlspec.observability._formatters._base import CloudLogFormatter
9
+ from sqlspec.observability._observer import StatementEvent
10
+ from sqlspec.observability._sampling import SamplingConfig
11
+
12
+
13
+ StatementObserver = Callable[["StatementEvent"], None]
14
+ LifecycleHook = Callable[[dict[str, Any]], None]
15
+
16
+
17
+ class RedactionConfig:
18
+ """Controls SQL and parameter redaction before observers run."""
19
+
20
+ __slots__ = ("mask_literals", "mask_parameters", "parameter_allow_list")
21
+
22
+ def __init__(
23
+ self,
24
+ *,
25
+ mask_parameters: bool | None = None,
26
+ mask_literals: bool | None = None,
27
+ parameter_allow_list: tuple[str, ...] | Iterable[str] | None = None,
28
+ ) -> None:
29
+ self.mask_parameters = mask_parameters
30
+ self.mask_literals = mask_literals
31
+ self.parameter_allow_list = tuple(parameter_allow_list) if parameter_allow_list is not None else None
32
+
33
+ def __hash__(self) -> int: # pragma: no cover - explicit to mirror dataclass behavior
34
+ msg = "RedactionConfig objects are mutable and unhashable"
35
+ raise TypeError(msg)
36
+
37
+ def copy(self) -> "RedactionConfig":
38
+ """Return a copy to avoid sharing mutable state."""
39
+
40
+ allow_list = tuple(self.parameter_allow_list) if self.parameter_allow_list else None
41
+ return RedactionConfig(
42
+ mask_parameters=self.mask_parameters, mask_literals=self.mask_literals, parameter_allow_list=allow_list
43
+ )
44
+
45
+ def __repr__(self) -> str:
46
+ return f"RedactionConfig(mask_parameters={self.mask_parameters!r}, mask_literals={self.mask_literals!r}, parameter_allow_list={self.parameter_allow_list!r})"
47
+
48
+ def __eq__(self, other: object) -> bool:
49
+ if not isinstance(other, RedactionConfig):
50
+ return NotImplemented
51
+ return (
52
+ self.mask_parameters == other.mask_parameters
53
+ and self.mask_literals == other.mask_literals
54
+ and self.parameter_allow_list == other.parameter_allow_list
55
+ )
56
+
57
+
58
+ class TelemetryConfig:
59
+ """Span emission and tracer provider settings."""
60
+
61
+ __slots__ = ("enable_spans", "provider_factory", "resource_attributes")
62
+
63
+ def __init__(
64
+ self,
65
+ *,
66
+ enable_spans: bool = False,
67
+ provider_factory: Callable[[], Any] | None = None,
68
+ resource_attributes: dict[str, Any] | None = None,
69
+ ) -> None:
70
+ self.enable_spans = enable_spans
71
+ self.provider_factory = provider_factory
72
+ self.resource_attributes = dict(resource_attributes) if resource_attributes else None
73
+
74
+ def __hash__(self) -> int: # pragma: no cover - explicit to mirror dataclass behavior
75
+ msg = "TelemetryConfig objects are mutable and unhashable"
76
+ raise TypeError(msg)
77
+
78
+ def copy(self) -> "TelemetryConfig":
79
+ """Return a shallow copy preserving optional dictionaries."""
80
+
81
+ attributes = dict(self.resource_attributes) if self.resource_attributes else None
82
+ return TelemetryConfig(
83
+ enable_spans=self.enable_spans, provider_factory=self.provider_factory, resource_attributes=attributes
84
+ )
85
+
86
+ def __repr__(self) -> str:
87
+ return f"TelemetryConfig(enable_spans={self.enable_spans!r}, provider_factory={self.provider_factory!r}, resource_attributes={self.resource_attributes!r})"
88
+
89
+ def __eq__(self, other: object) -> bool:
90
+ if not isinstance(other, TelemetryConfig):
91
+ return NotImplemented
92
+ return (
93
+ self.enable_spans == other.enable_spans
94
+ and self.provider_factory == other.provider_factory
95
+ and self.resource_attributes == other.resource_attributes
96
+ )
97
+
98
+
99
+ class LoggingConfig:
100
+ """Controls log output format and verbosity."""
101
+
102
+ __slots__ = ("include_sql_hash", "include_trace_context", "parameter_truncation_count", "sql_truncation_length")
103
+
104
+ def __init__(
105
+ self,
106
+ *,
107
+ include_sql_hash: bool = True,
108
+ sql_truncation_length: int = 2000,
109
+ parameter_truncation_count: int = 100,
110
+ include_trace_context: bool = True,
111
+ ) -> None:
112
+ self.include_sql_hash = include_sql_hash
113
+ self.sql_truncation_length = sql_truncation_length
114
+ self.parameter_truncation_count = parameter_truncation_count
115
+ self.include_trace_context = include_trace_context
116
+
117
+ def __hash__(self) -> int: # pragma: no cover - explicit to mirror dataclass behavior
118
+ msg = "LoggingConfig objects are mutable and unhashable"
119
+ raise TypeError(msg)
120
+
121
+ def copy(self) -> "LoggingConfig":
122
+ """Return a shallow copy of the logging configuration."""
123
+
124
+ return LoggingConfig(
125
+ include_sql_hash=self.include_sql_hash,
126
+ sql_truncation_length=self.sql_truncation_length,
127
+ parameter_truncation_count=self.parameter_truncation_count,
128
+ include_trace_context=self.include_trace_context,
129
+ )
130
+
131
+ def __repr__(self) -> str:
132
+ return (
133
+ f"LoggingConfig(include_sql_hash={self.include_sql_hash!r}, sql_truncation_length={self.sql_truncation_length!r}, "
134
+ f"parameter_truncation_count={self.parameter_truncation_count!r}, include_trace_context={self.include_trace_context!r})"
135
+ )
136
+
137
+ def __eq__(self, other: object) -> bool:
138
+ if not isinstance(other, LoggingConfig):
139
+ return NotImplemented
140
+ return (
141
+ self.include_sql_hash == other.include_sql_hash
142
+ and self.sql_truncation_length == other.sql_truncation_length
143
+ and self.parameter_truncation_count == other.parameter_truncation_count
144
+ and self.include_trace_context == other.include_trace_context
145
+ )
146
+
147
+
148
+ class ObservabilityConfig:
149
+ """Aggregates lifecycle hooks, observers, and telemetry toggles."""
150
+
151
+ __slots__ = (
152
+ "cloud_formatter",
153
+ "lifecycle",
154
+ "logging",
155
+ "print_sql",
156
+ "redaction",
157
+ "sampling",
158
+ "statement_observers",
159
+ "telemetry",
160
+ )
161
+
162
+ def __init__(
163
+ self,
164
+ *,
165
+ lifecycle: "LifecycleConfig | None" = None,
166
+ print_sql: bool | None = None,
167
+ statement_observers: tuple[StatementObserver, ...] | Iterable[StatementObserver] | None = None,
168
+ telemetry: "TelemetryConfig | None" = None,
169
+ redaction: "RedactionConfig | None" = None,
170
+ logging: "LoggingConfig | None" = None,
171
+ sampling: "SamplingConfig | None" = None,
172
+ cloud_formatter: "CloudLogFormatter | None" = None,
173
+ ) -> None:
174
+ self.lifecycle = lifecycle
175
+ self.print_sql = print_sql
176
+ self.statement_observers = tuple(statement_observers) if statement_observers is not None else None
177
+ self.telemetry = telemetry
178
+ self.redaction = redaction
179
+ self.logging = logging
180
+ self.sampling = sampling
181
+ self.cloud_formatter = cloud_formatter
182
+
183
+ def __hash__(self) -> int: # pragma: no cover - explicit to mirror dataclass behavior
184
+ msg = "ObservabilityConfig objects are mutable and unhashable"
185
+ raise TypeError(msg)
186
+
187
+ def copy(self) -> "ObservabilityConfig":
188
+ """Return a deep copy of the configuration."""
189
+
190
+ lifecycle_copy = _normalize_lifecycle(self.lifecycle)
191
+ observers = tuple(self.statement_observers) if self.statement_observers else None
192
+ telemetry_copy = self.telemetry.copy() if self.telemetry else None
193
+ redaction_copy = self.redaction.copy() if self.redaction else None
194
+ logging_copy = self.logging.copy() if self.logging else None
195
+ sampling_copy = self.sampling.copy() if self.sampling else None
196
+ return ObservabilityConfig(
197
+ lifecycle=lifecycle_copy,
198
+ print_sql=self.print_sql,
199
+ statement_observers=observers,
200
+ telemetry=telemetry_copy,
201
+ redaction=redaction_copy,
202
+ logging=logging_copy,
203
+ sampling=sampling_copy,
204
+ cloud_formatter=self.cloud_formatter,
205
+ )
206
+
207
+ @classmethod
208
+ def merge(
209
+ cls, base_config: "ObservabilityConfig | None", override_config: "ObservabilityConfig | None"
210
+ ) -> "ObservabilityConfig":
211
+ """Merge registry-level and adapter-level configuration objects."""
212
+
213
+ if base_config is None and override_config is None:
214
+ return cls()
215
+
216
+ base = base_config.copy() if base_config else cls()
217
+ override = override_config
218
+ if override is None:
219
+ return base
220
+
221
+ lifecycle = _merge_lifecycle(base.lifecycle, override.lifecycle)
222
+ observers: tuple[StatementObserver, ...] | None
223
+ if base.statement_observers and override.statement_observers:
224
+ observers = base.statement_observers + tuple(override.statement_observers)
225
+ elif override.statement_observers:
226
+ observers = tuple(override.statement_observers)
227
+ else:
228
+ observers = base.statement_observers
229
+
230
+ print_sql = base.print_sql
231
+ if override.print_sql is not None:
232
+ print_sql = override.print_sql
233
+
234
+ telemetry = override.telemetry.copy() if override.telemetry else base.telemetry
235
+ redaction = _merge_redaction(base.redaction, override.redaction)
236
+ logging = _merge_logging(base.logging, override.logging)
237
+ sampling = _merge_sampling(base.sampling, override.sampling)
238
+ cloud_formatter = override.cloud_formatter if override.cloud_formatter is not None else base.cloud_formatter
239
+
240
+ return ObservabilityConfig(
241
+ lifecycle=lifecycle,
242
+ print_sql=print_sql,
243
+ statement_observers=observers,
244
+ telemetry=telemetry,
245
+ redaction=redaction,
246
+ logging=logging,
247
+ sampling=sampling,
248
+ cloud_formatter=cloud_formatter,
249
+ )
250
+
251
+ def __repr__(self) -> str:
252
+ return (
253
+ f"ObservabilityConfig(lifecycle={self.lifecycle!r}, print_sql={self.print_sql!r}, statement_observers={self.statement_observers!r}, telemetry={self.telemetry!r}, "
254
+ f"redaction={self.redaction!r}, logging={self.logging!r}, sampling={self.sampling!r}, cloud_formatter={self.cloud_formatter!r})"
255
+ )
256
+
257
+ def __eq__(self, other: object) -> bool:
258
+ if not isinstance(other, ObservabilityConfig):
259
+ return NotImplemented
260
+ return (
261
+ _normalize_lifecycle(self.lifecycle) == _normalize_lifecycle(other.lifecycle)
262
+ and self.print_sql == other.print_sql
263
+ and self.statement_observers == other.statement_observers
264
+ and self.telemetry == other.telemetry
265
+ and self.redaction == other.redaction
266
+ and self.logging == other.logging
267
+ and self.sampling == other.sampling
268
+ and self.cloud_formatter == other.cloud_formatter
269
+ )
270
+
271
+
272
+ def _merge_redaction(base: "RedactionConfig | None", override: "RedactionConfig | None") -> "RedactionConfig | None":
273
+ if base is None and override is None:
274
+ return None
275
+ if override is None:
276
+ return base.copy() if base else None
277
+ if base is None:
278
+ return override.copy()
279
+ merged = base.copy()
280
+ if override.mask_parameters is not None:
281
+ merged.mask_parameters = override.mask_parameters
282
+ if override.mask_literals is not None:
283
+ merged.mask_literals = override.mask_literals
284
+ if override.parameter_allow_list is not None:
285
+ merged.parameter_allow_list = tuple(override.parameter_allow_list)
286
+ return merged
287
+
288
+
289
+ def _merge_logging(base: "LoggingConfig | None", override: "LoggingConfig | None") -> "LoggingConfig | None":
290
+ if base is None and override is None:
291
+ return None
292
+ if override is None:
293
+ return base.copy() if base else None
294
+ return override.copy()
295
+
296
+
297
+ def _merge_sampling(base: "SamplingConfig | None", override: "SamplingConfig | None") -> "SamplingConfig | None":
298
+ if base is None and override is None:
299
+ return None
300
+ if override is None:
301
+ return base.copy() if base else None
302
+ if base is None:
303
+ return override.copy()
304
+ merged = base.copy()
305
+ if override.sample_rate != 1.0:
306
+ merged.sample_rate = override.sample_rate
307
+ if override.deterministic:
308
+ merged.deterministic = override.deterministic
309
+ if override.force_sample_on_error:
310
+ merged.force_sample_on_error = override.force_sample_on_error
311
+ if override.force_sample_slow_queries_ms is not None:
312
+ merged.force_sample_slow_queries_ms = override.force_sample_slow_queries_ms
313
+ return merged
314
+
315
+
316
+ def _normalize_lifecycle(config: "LifecycleConfig | None") -> "LifecycleConfig | None":
317
+ if config is None:
318
+ return None
319
+ normalized: dict[str, list[LifecycleHook]] = {}
320
+ for event, hooks in config.items():
321
+ normalized[event] = list(cast("Iterable[LifecycleHook]", hooks))
322
+ return cast("LifecycleConfig", normalized)
323
+
324
+
325
+ def _merge_lifecycle(base: "LifecycleConfig | None", override: "LifecycleConfig | None") -> "LifecycleConfig | None":
326
+ if base is None and override is None:
327
+ return None
328
+ if base is None:
329
+ return _normalize_lifecycle(override)
330
+ if override is None:
331
+ return _normalize_lifecycle(base)
332
+ merged_dict: dict[str, list[LifecycleHook]] = (
333
+ cast("dict[str, list[LifecycleHook]]", _normalize_lifecycle(base)) or {}
334
+ )
335
+ for event, hooks in override.items():
336
+ merged_dict.setdefault(event, [])
337
+ merged_dict[event].extend(cast("Iterable[LifecycleHook]", hooks))
338
+ return cast("LifecycleConfig", merged_dict)
339
+
340
+
341
+ __all__ = (
342
+ "LifecycleHook",
343
+ "LoggingConfig",
344
+ "ObservabilityConfig",
345
+ "RedactionConfig",
346
+ "StatementObserver",
347
+ "TelemetryConfig",
348
+ )
@@ -0,0 +1,74 @@
1
+ """Diagnostics aggregation utilities for observability exports."""
2
+
3
+ from collections.abc import Iterable
4
+
5
+ from sqlspec.storage.pipeline import (
6
+ StorageDiagnostics,
7
+ StorageTelemetry,
8
+ get_recent_storage_events,
9
+ get_storage_bridge_diagnostics,
10
+ )
11
+
12
+ DiagnosticsPayload = dict[str, float | list[StorageTelemetry]]
13
+
14
+
15
+ def _increment_metric(payload: "dict[str, float]", metric: str, amount: float) -> None:
16
+ payload[metric] = payload.get(metric, 0.0) + amount
17
+
18
+
19
+ class TelemetryDiagnostics:
20
+ """Aggregates lifecycle counters, custom metrics, and storage telemetry."""
21
+
22
+ __slots__ = ("_lifecycle_sections", "_metrics")
23
+
24
+ def __init__(self) -> None:
25
+ self._lifecycle_sections: list[tuple[str, dict[str, float]]] = []
26
+ self._metrics: StorageDiagnostics = {}
27
+
28
+ def add_lifecycle_snapshot(self, config_key: str, counters: dict[str, int]) -> None:
29
+ """Store lifecycle counters for later snapshot generation."""
30
+
31
+ if not counters:
32
+ return
33
+ float_counters = {metric: float(value) for metric, value in counters.items()}
34
+ self._lifecycle_sections.append((config_key, float_counters))
35
+
36
+ def add_metric_snapshot(self, metrics: StorageDiagnostics) -> None:
37
+ """Store custom metric snapshots."""
38
+
39
+ for key, value in metrics.items():
40
+ if key in self._metrics:
41
+ self._metrics[key] += value
42
+ else:
43
+ self._metrics[key] = value
44
+
45
+ def snapshot(self) -> "DiagnosticsPayload":
46
+ """Return aggregated diagnostics payload."""
47
+
48
+ numeric_payload: dict[str, float] = {}
49
+
50
+ for key, value in get_storage_bridge_diagnostics().items():
51
+ _increment_metric(numeric_payload, key, float(value))
52
+ for _prefix, counters in self._lifecycle_sections:
53
+ for metric, value in counters.items():
54
+ _increment_metric(numeric_payload, metric, value)
55
+ for metric, value in self._metrics.items():
56
+ _increment_metric(numeric_payload, metric, float(value))
57
+
58
+ payload: DiagnosticsPayload = dict(numeric_payload)
59
+ recent_jobs = get_recent_storage_events()
60
+ if recent_jobs:
61
+ payload["storage_bridge.recent_jobs"] = recent_jobs
62
+ return payload
63
+
64
+
65
+ def collect_diagnostics(sections: Iterable[tuple[str, dict[str, int]]]) -> DiagnosticsPayload:
66
+ """Convenience helper for aggregating sections without constructing a class."""
67
+
68
+ diag = TelemetryDiagnostics()
69
+ for prefix, counters in sections:
70
+ diag.add_lifecycle_snapshot(prefix, counters)
71
+ return diag.snapshot()
72
+
73
+
74
+ __all__ = ("DiagnosticsPayload", "TelemetryDiagnostics", "collect_diagnostics")
@@ -0,0 +1,152 @@
1
+ """Lifecycle dispatcher used by drivers and registry hooks."""
2
+
3
+ from collections.abc import Callable, Iterable
4
+ from typing import Any, Literal
5
+
6
+ from sqlspec.utils.logging import get_logger
7
+
8
+ logger = get_logger("sqlspec.observability.lifecycle")
9
+
10
+ LifecycleContext = dict[str, Any]
11
+ LifecycleHook = Callable[[LifecycleContext], None]
12
+
13
+ LifecycleEvent = Literal[
14
+ "on_pool_create",
15
+ "on_pool_destroy",
16
+ "on_connection_create",
17
+ "on_connection_destroy",
18
+ "on_session_start",
19
+ "on_session_end",
20
+ "on_query_start",
21
+ "on_query_complete",
22
+ "on_error",
23
+ ]
24
+ EVENT_ATTRS: tuple[LifecycleEvent, ...] = (
25
+ "on_pool_create",
26
+ "on_pool_destroy",
27
+ "on_connection_create",
28
+ "on_connection_destroy",
29
+ "on_session_start",
30
+ "on_session_end",
31
+ "on_query_start",
32
+ "on_query_complete",
33
+ "on_error",
34
+ )
35
+ GUARD_ATTRS = tuple(f"has_{name[3:]}" for name in EVENT_ATTRS)
36
+
37
+
38
+ class LifecycleDispatcher:
39
+ """Dispatches lifecycle hooks with guard flags and diagnostics counters."""
40
+
41
+ __slots__ = (
42
+ "_counters",
43
+ "_hooks",
44
+ "has_connection_create",
45
+ "has_connection_destroy",
46
+ "has_error",
47
+ "has_pool_create",
48
+ "has_pool_destroy",
49
+ "has_query_complete",
50
+ "has_query_start",
51
+ "has_session_end",
52
+ "has_session_start",
53
+ )
54
+
55
+ def __init__(self, hooks: "dict[str, Iterable[LifecycleHook]] | None" = None) -> None:
56
+ self.has_pool_create = False
57
+ self.has_pool_destroy = False
58
+ self.has_connection_create = False
59
+ self.has_connection_destroy = False
60
+ self.has_session_start = False
61
+ self.has_session_end = False
62
+ self.has_query_start = False
63
+ self.has_query_complete = False
64
+ self.has_error = False
65
+
66
+ normalized: dict[LifecycleEvent, tuple[LifecycleHook, ...]] = {}
67
+ for event_name, guard_attr in zip(EVENT_ATTRS, GUARD_ATTRS, strict=False):
68
+ callables = hooks.get(event_name) if hooks else None
69
+ normalized[event_name] = tuple(callables) if callables else ()
70
+ setattr(self, guard_attr, bool(normalized[event_name]))
71
+ self._hooks: dict[LifecycleEvent, tuple[LifecycleHook, ...]] = normalized
72
+ self._counters: dict[LifecycleEvent, int] = dict.fromkeys(EVENT_ATTRS, 0)
73
+
74
+ @property
75
+ def is_enabled(self) -> bool:
76
+ """Return True when at least one hook is registered."""
77
+
78
+ return any(self._hooks[name] for name in EVENT_ATTRS)
79
+
80
+ def emit_pool_create(self, context: "LifecycleContext") -> None:
81
+ """Fire pool creation hooks."""
82
+
83
+ self._emit("on_pool_create", context)
84
+
85
+ def emit_pool_destroy(self, context: "LifecycleContext") -> None:
86
+ """Fire pool destruction hooks."""
87
+
88
+ self._emit("on_pool_destroy", context)
89
+
90
+ def emit_connection_create(self, context: "LifecycleContext") -> None:
91
+ """Fire connection creation hooks."""
92
+
93
+ self._emit("on_connection_create", context)
94
+
95
+ def emit_connection_destroy(self, context: "LifecycleContext") -> None:
96
+ """Fire connection teardown hooks."""
97
+
98
+ self._emit("on_connection_destroy", context)
99
+
100
+ def emit_session_start(self, context: "LifecycleContext") -> None:
101
+ """Fire session start hooks."""
102
+
103
+ self._emit("on_session_start", context)
104
+
105
+ def emit_session_end(self, context: "LifecycleContext") -> None:
106
+ """Fire session end hooks."""
107
+
108
+ self._emit("on_session_end", context)
109
+
110
+ def emit_query_start(self, context: "LifecycleContext") -> None:
111
+ """Fire query start hooks."""
112
+
113
+ self._emit("on_query_start", context)
114
+
115
+ def emit_query_complete(self, context: "LifecycleContext") -> None:
116
+ """Fire query completion hooks."""
117
+
118
+ self._emit("on_query_complete", context)
119
+
120
+ def emit_error(self, context: "LifecycleContext") -> None:
121
+ """Fire error hooks with failure context."""
122
+
123
+ self._emit("on_error", context)
124
+
125
+ def snapshot(self, *, prefix: str | None = None) -> "dict[str, int]":
126
+ """Return counter snapshot keyed for diagnostics export."""
127
+
128
+ metrics: dict[str, int] = {}
129
+ for event_name, count in self._counters.items():
130
+ key = event_name.replace("on_", "lifecycle.")
131
+ if prefix:
132
+ key = f"{prefix}.{key}"
133
+ metrics[key] = count
134
+ return metrics
135
+
136
+ def _emit(self, event: LifecycleEvent, context: "LifecycleContext") -> None:
137
+ callbacks = self._hooks.get(event)
138
+ if not callbacks:
139
+ return
140
+ self._counters[event] += 1
141
+ for callback in callbacks:
142
+ self._invoke_callback(callback, context, event)
143
+
144
+ @staticmethod
145
+ def _invoke_callback(callback: LifecycleHook, context: "LifecycleContext", event: LifecycleEvent) -> None:
146
+ try:
147
+ callback(context)
148
+ except Exception as exc: # pragma: no cover - defensive logging
149
+ logger.warning("Lifecycle hook failed: event=%s error=%s", event, exc)
150
+
151
+
152
+ __all__ = ("LifecycleContext", "LifecycleDispatcher", "LifecycleHook")
@@ -0,0 +1,13 @@
1
+ """Cloud log formatters for observability.
2
+
3
+ This module provides cloud-specific log formatters for GCP, AWS, and Azure
4
+ that produce structured JSON output compatible with each provider's logging
5
+ requirements.
6
+ """
7
+
8
+ from sqlspec.observability._formatters._aws import AWSLogFormatter
9
+ from sqlspec.observability._formatters._azure import AzureLogFormatter
10
+ from sqlspec.observability._formatters._base import CloudLogFormatter
11
+ from sqlspec.observability._formatters._gcp import GCPLogFormatter
12
+
13
+ __all__ = ("AWSLogFormatter", "AzureLogFormatter", "CloudLogFormatter", "GCPLogFormatter")