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,526 @@
1
+ # ruff: noqa: B008
2
+ """Application dependency providers generators.
3
+
4
+ This module contains functions to create dependency providers for services and filters.
5
+ """
6
+
7
+ import datetime
8
+ import inspect
9
+ from collections.abc import Callable
10
+ from typing import Any, Literal, NamedTuple, TypedDict, cast
11
+ from uuid import UUID
12
+
13
+ from litestar.di import Provide
14
+ from litestar.params import Dependency, Parameter
15
+ from typing_extensions import NotRequired
16
+
17
+ from sqlspec.core import (
18
+ BeforeAfterFilter,
19
+ FilterTypes,
20
+ InCollectionFilter,
21
+ LimitOffsetFilter,
22
+ NotInCollectionFilter,
23
+ NotNullFilter,
24
+ NullFilter,
25
+ OrderByFilter,
26
+ SearchFilter,
27
+ )
28
+ from sqlspec.utils.singleton import SingletonMeta
29
+ from sqlspec.utils.text import camelize
30
+
31
+ __all__ = (
32
+ "DEPENDENCY_DEFAULTS",
33
+ "BooleanOrNone",
34
+ "DTorNone",
35
+ "DependencyDefaults",
36
+ "FieldNameType",
37
+ "FilterConfig",
38
+ "HashableType",
39
+ "HashableValue",
40
+ "IntOrNone",
41
+ "SortOrder",
42
+ "SortOrderOrNone",
43
+ "StringOrNone",
44
+ "UuidOrNone",
45
+ "create_filter_dependencies",
46
+ "dep_cache",
47
+ )
48
+
49
+ DTorNone = datetime.datetime | None
50
+ StringOrNone = str | None
51
+ UuidOrNone = UUID | None
52
+ IntOrNone = int | None
53
+ BooleanOrNone = bool | None
54
+ SortOrder = Literal["asc", "desc"]
55
+ SortOrderOrNone = SortOrder | None
56
+ HashableValue = str | int | float | bool | None
57
+ HashableType = HashableValue | tuple[Any, ...] | tuple[tuple[str, Any], ...] | tuple[HashableValue, ...]
58
+
59
+
60
+ class DependencyDefaults:
61
+ FILTERS_DEPENDENCY_KEY: str = "filters"
62
+ CREATED_FILTER_DEPENDENCY_KEY: str = "created_filter"
63
+ ID_FILTER_DEPENDENCY_KEY: str = "id_filter"
64
+ LIMIT_OFFSET_FILTER_DEPENDENCY_KEY: str = "limit_offset_filter"
65
+ UPDATED_FILTER_DEPENDENCY_KEY: str = "updated_filter"
66
+ ORDER_BY_FILTER_DEPENDENCY_KEY: str = "order_by_filter"
67
+ SEARCH_FILTER_DEPENDENCY_KEY: str = "search_filter"
68
+ DEFAULT_PAGINATION_SIZE: int = 20
69
+
70
+
71
+ DEPENDENCY_DEFAULTS = DependencyDefaults()
72
+
73
+
74
+ class FieldNameType(NamedTuple):
75
+ """Type for field name and associated type information for filter configuration."""
76
+
77
+ name: str
78
+ type_hint: type[Any] = str
79
+
80
+
81
+ class FilterConfig(TypedDict):
82
+ """Configuration for generating dynamic filters."""
83
+
84
+ id_filter: NotRequired[type[UUID | int | str]]
85
+ id_field: NotRequired[str]
86
+ sort_field: NotRequired[str]
87
+ sort_order: NotRequired[SortOrder]
88
+ pagination_type: NotRequired[Literal["limit_offset"]]
89
+ pagination_size: NotRequired[int]
90
+ search: NotRequired[str | set[str] | list[str]]
91
+ search_ignore_case: NotRequired[bool]
92
+ created_at: NotRequired[bool]
93
+ updated_at: NotRequired[bool]
94
+ not_in_fields: NotRequired[FieldNameType | set[FieldNameType] | list[str | FieldNameType]]
95
+ in_fields: NotRequired[FieldNameType | set[FieldNameType] | list[str | FieldNameType]]
96
+ null_fields: NotRequired[str | set[str] | list[str]]
97
+ """Fields that support IS NULL filtering."""
98
+ not_null_fields: NotRequired[str | set[str] | list[str]]
99
+ """Fields that support IS NOT NULL filtering."""
100
+
101
+
102
+ class DependencyCache(metaclass=SingletonMeta):
103
+ """Dependency cache for memoizing dynamically generated dependencies."""
104
+
105
+ def __init__(self) -> None:
106
+ self.dependencies: dict[int | str, dict[str, Provide]] = {}
107
+
108
+ def add_dependencies(self, key: int | str, dependencies: dict[str, Provide]) -> None:
109
+ self.dependencies[key] = dependencies
110
+
111
+ def get_dependencies(self, key: int | str) -> dict[str, Provide] | None:
112
+ return self.dependencies.get(key)
113
+
114
+
115
+ dep_cache = DependencyCache()
116
+
117
+
118
+ def create_filter_dependencies(
119
+ config: FilterConfig, dep_defaults: DependencyDefaults = DEPENDENCY_DEFAULTS
120
+ ) -> dict[str, Provide]:
121
+ """Create a dependency provider for the combined filter function.
122
+
123
+ Args:
124
+ config: FilterConfig instance with desired settings.
125
+ dep_defaults: Dependency defaults to use for the filter dependencies
126
+
127
+ Returns:
128
+ A dependency provider function for the combined filter function.
129
+ """
130
+ if (deps := dep_cache.get_dependencies(cache_key := hash(_make_hashable(config)))) is not None:
131
+ return deps
132
+ deps = _create_statement_filters(config, dep_defaults)
133
+ dep_cache.add_dependencies(cache_key, deps)
134
+ return deps
135
+
136
+
137
+ def _make_hashable(value: Any) -> HashableType:
138
+ """Convert a value into a hashable type for caching purposes.
139
+
140
+ Args:
141
+ value: Any value that needs to be made hashable.
142
+
143
+ Returns:
144
+ A hashable version of the value.
145
+ """
146
+ if isinstance(value, dict):
147
+ items = []
148
+ for k in sorted(value.keys()): # pyright: ignore
149
+ v = value[k]
150
+ items.append((str(k), _make_hashable(v)))
151
+ return tuple(items)
152
+ if isinstance(value, (list, set)):
153
+ hashable_items = [_make_hashable(item) for item in value]
154
+ filtered_items = [item for item in hashable_items if item is not None]
155
+ return tuple(sorted(filtered_items, key=str))
156
+ if isinstance(value, (str, int, float, bool, type(None))):
157
+ return value
158
+ return str(value)
159
+
160
+
161
+ def _create_statement_filters( # noqa: C901
162
+ config: FilterConfig, dep_defaults: DependencyDefaults = DEPENDENCY_DEFAULTS
163
+ ) -> dict[str, Provide]:
164
+ """Create filter dependencies based on configuration.
165
+
166
+ Args:
167
+ config: Configuration dictionary specifying which filters to enable
168
+ dep_defaults: Dependency defaults to use for the filter dependencies
169
+
170
+ Returns:
171
+ Dictionary of filter provider functions
172
+ """
173
+ filters: dict[str, Provide] = {}
174
+
175
+ if config.get("id_filter", False):
176
+
177
+ def provide_id_filter( # pyright: ignore[reportUnknownParameterType]
178
+ ids: list[str] | None = Parameter(query="ids", default=None, required=False),
179
+ ) -> InCollectionFilter: # pyright: ignore[reportMissingTypeArgument]
180
+ return InCollectionFilter(field_name=config.get("id_field", "id"), values=ids)
181
+
182
+ filters[dep_defaults.ID_FILTER_DEPENDENCY_KEY] = Provide(provide_id_filter, sync_to_thread=False) # pyright: ignore[reportUnknownArgumentType]
183
+
184
+ if config.get("created_at", False):
185
+
186
+ def provide_created_filter(
187
+ before: DTorNone = Parameter(query="createdBefore", default=None, required=False),
188
+ after: DTorNone = Parameter(query="createdAfter", default=None, required=False),
189
+ ) -> BeforeAfterFilter:
190
+ return BeforeAfterFilter("created_at", before, after)
191
+
192
+ filters[dep_defaults.CREATED_FILTER_DEPENDENCY_KEY] = Provide(provide_created_filter, sync_to_thread=False)
193
+
194
+ if config.get("updated_at", False):
195
+
196
+ def provide_updated_filter(
197
+ before: DTorNone = Parameter(query="updatedBefore", default=None, required=False),
198
+ after: DTorNone = Parameter(query="updatedAfter", default=None, required=False),
199
+ ) -> BeforeAfterFilter:
200
+ return BeforeAfterFilter("updated_at", before, after)
201
+
202
+ filters[dep_defaults.UPDATED_FILTER_DEPENDENCY_KEY] = Provide(provide_updated_filter, sync_to_thread=False)
203
+
204
+ if config.get("pagination_type") == "limit_offset":
205
+
206
+ def provide_limit_offset_pagination(
207
+ current_page: int = Parameter(ge=1, query="currentPage", default=1, required=False),
208
+ page_size: int = Parameter(
209
+ query="pageSize",
210
+ ge=1,
211
+ default=config.get("pagination_size", dep_defaults.DEFAULT_PAGINATION_SIZE),
212
+ required=False,
213
+ ),
214
+ ) -> LimitOffsetFilter:
215
+ return LimitOffsetFilter(page_size, page_size * (current_page - 1))
216
+
217
+ filters[dep_defaults.LIMIT_OFFSET_FILTER_DEPENDENCY_KEY] = Provide(
218
+ provide_limit_offset_pagination, sync_to_thread=False
219
+ )
220
+
221
+ if search_fields := config.get("search"):
222
+
223
+ def provide_search_filter(
224
+ search_string: StringOrNone = Parameter(
225
+ title="Field to search", query="searchString", default=None, required=False
226
+ ),
227
+ ignore_case: BooleanOrNone = Parameter(
228
+ title="Search should be case sensitive",
229
+ query="searchIgnoreCase",
230
+ default=config.get("search_ignore_case", False),
231
+ required=False,
232
+ ),
233
+ ) -> SearchFilter:
234
+ field_names = set(search_fields.split(",")) if isinstance(search_fields, str) else set(search_fields)
235
+ return SearchFilter(field_name=field_names, value=search_string, ignore_case=ignore_case or False)
236
+
237
+ filters[dep_defaults.SEARCH_FILTER_DEPENDENCY_KEY] = Provide(provide_search_filter, sync_to_thread=False)
238
+
239
+ if sort_field := config.get("sort_field"):
240
+
241
+ def provide_order_by(
242
+ field_name: StringOrNone = Parameter(
243
+ title="Order by field", query="orderBy", default=sort_field, required=False
244
+ ),
245
+ sort_order: SortOrderOrNone = Parameter(
246
+ title="Field to search", query="sortOrder", default=config.get("sort_order", "desc"), required=False
247
+ ),
248
+ ) -> OrderByFilter:
249
+ return OrderByFilter(field_name=field_name, sort_order=sort_order) # type: ignore[arg-type]
250
+
251
+ filters[dep_defaults.ORDER_BY_FILTER_DEPENDENCY_KEY] = Provide(provide_order_by, sync_to_thread=False)
252
+
253
+ if not_in_fields := config.get("not_in_fields"):
254
+ not_in_fields = {not_in_fields} if isinstance(not_in_fields, (str, FieldNameType)) else not_in_fields
255
+
256
+ for field_def in not_in_fields:
257
+ field_def = FieldNameType(name=field_def, type_hint=str) if isinstance(field_def, str) else field_def
258
+
259
+ def create_not_in_filter_provider( # pyright: ignore
260
+ field_name: FieldNameType,
261
+ ) -> Callable[..., NotInCollectionFilter[field_def.type_hint] | None]: # type: ignore
262
+ def provide_not_in_filter( # pyright: ignore
263
+ values: list[field_name.type_hint] | None = Parameter( # type: ignore
264
+ query=camelize(f"{field_name.name}_not_in"), default=None, required=False
265
+ ),
266
+ ) -> NotInCollectionFilter[field_name.type_hint] | None: # type: ignore
267
+ return (
268
+ NotInCollectionFilter[field_name.type_hint](field_name=field_name.name, values=values) # type: ignore
269
+ if values
270
+ else None
271
+ )
272
+
273
+ return provide_not_in_filter # pyright: ignore
274
+
275
+ provider = create_not_in_filter_provider(field_def) # pyright: ignore
276
+ filters[f"{field_def.name}_not_in_filter"] = Provide(provider, sync_to_thread=False) # pyright: ignore
277
+
278
+ if in_fields := config.get("in_fields"):
279
+ in_fields = {in_fields} if isinstance(in_fields, (str, FieldNameType)) else in_fields
280
+
281
+ for field_def in in_fields:
282
+ field_def = FieldNameType(name=field_def, type_hint=str) if isinstance(field_def, str) else field_def
283
+
284
+ def create_in_filter_provider( # pyright: ignore
285
+ field_name: FieldNameType,
286
+ ) -> Callable[..., InCollectionFilter[field_def.type_hint] | None]: # type: ignore # pyright: ignore
287
+ def provide_in_filter( # pyright: ignore
288
+ values: list[field_name.type_hint] | None = Parameter( # type: ignore # pyright: ignore
289
+ query=camelize(f"{field_name.name}_in"), default=None, required=False
290
+ ),
291
+ ) -> InCollectionFilter[field_name.type_hint] | None: # type: ignore # pyright: ignore
292
+ return (
293
+ InCollectionFilter[field_name.type_hint](field_name=field_name.name, values=values) # type: ignore # pyright: ignore
294
+ if values
295
+ else None
296
+ )
297
+
298
+ return provide_in_filter # pyright: ignore
299
+
300
+ provider = create_in_filter_provider(field_def) # type: ignore
301
+ filters[f"{field_def.name}_in_filter"] = Provide(provider, sync_to_thread=False) # pyright: ignore
302
+
303
+ if null_fields := config.get("null_fields"):
304
+ null_fields = {null_fields} if isinstance(null_fields, str) else set(null_fields)
305
+
306
+ for field_name in null_fields:
307
+
308
+ def create_null_filter_provider(fname: str) -> Callable[..., NullFilter | None]:
309
+ def provide_null_filter(
310
+ is_null: bool | None = Parameter(query=camelize(f"{fname}_is_null"), default=None, required=False),
311
+ ) -> NullFilter | None:
312
+ return NullFilter(field_name=fname) if is_null else None
313
+
314
+ return provide_null_filter
315
+
316
+ null_provider = create_null_filter_provider(field_name)
317
+ filters[f"{field_name}_null_filter"] = Provide(null_provider, sync_to_thread=False)
318
+
319
+ if not_null_fields := config.get("not_null_fields"):
320
+ not_null_fields = {not_null_fields} if isinstance(not_null_fields, str) else set(not_null_fields)
321
+
322
+ for field_name in not_null_fields:
323
+
324
+ def create_not_null_filter_provider(fname: str) -> Callable[..., NotNullFilter | None]:
325
+ def provide_not_null_filter(
326
+ is_not_null: bool | None = Parameter(
327
+ query=camelize(f"{fname}_is_not_null"), default=None, required=False
328
+ ),
329
+ ) -> NotNullFilter | None:
330
+ return NotNullFilter(field_name=fname) if is_not_null else None
331
+
332
+ return provide_not_null_filter
333
+
334
+ not_null_provider = create_not_null_filter_provider(field_name)
335
+ filters[f"{field_name}_not_null_filter"] = Provide(not_null_provider, sync_to_thread=False)
336
+
337
+ if filters:
338
+ filters[dep_defaults.FILTERS_DEPENDENCY_KEY] = Provide(
339
+ _create_filter_aggregate_function(config), sync_to_thread=False
340
+ )
341
+
342
+ return filters
343
+
344
+
345
+ def _create_filter_aggregate_function(config: FilterConfig) -> Callable[..., list[FilterTypes]]: # noqa: C901
346
+ """Create filter aggregation function based on configuration.
347
+
348
+ Args:
349
+ config: The filter configuration.
350
+
351
+ Returns:
352
+ Function that returns list of configured filters.
353
+ """
354
+
355
+ parameters: dict[str, inspect.Parameter] = {}
356
+ annotations: dict[str, Any] = {}
357
+
358
+ if cls := config.get("id_filter"):
359
+ parameters["id_filter"] = inspect.Parameter(
360
+ name="id_filter",
361
+ kind=inspect.Parameter.POSITIONAL_OR_KEYWORD,
362
+ default=Dependency(skip_validation=True),
363
+ annotation=InCollectionFilter[cls], # type: ignore[valid-type]
364
+ )
365
+ annotations["id_filter"] = InCollectionFilter[cls] # type: ignore[valid-type]
366
+
367
+ if config.get("created_at"):
368
+ parameters["created_filter"] = inspect.Parameter(
369
+ name="created_filter",
370
+ kind=inspect.Parameter.POSITIONAL_OR_KEYWORD,
371
+ default=Dependency(skip_validation=True),
372
+ annotation=BeforeAfterFilter,
373
+ )
374
+ annotations["created_filter"] = BeforeAfterFilter
375
+
376
+ if config.get("updated_at"):
377
+ parameters["updated_filter"] = inspect.Parameter(
378
+ name="updated_filter",
379
+ kind=inspect.Parameter.POSITIONAL_OR_KEYWORD,
380
+ default=Dependency(skip_validation=True),
381
+ annotation=BeforeAfterFilter,
382
+ )
383
+ annotations["updated_filter"] = BeforeAfterFilter
384
+
385
+ if config.get("search"):
386
+ parameters["search_filter"] = inspect.Parameter(
387
+ name="search_filter",
388
+ kind=inspect.Parameter.POSITIONAL_OR_KEYWORD,
389
+ default=Dependency(skip_validation=True),
390
+ annotation=SearchFilter,
391
+ )
392
+ annotations["search_filter"] = SearchFilter
393
+
394
+ if config.get("pagination_type") == "limit_offset":
395
+ parameters["limit_offset_filter"] = inspect.Parameter(
396
+ name="limit_offset_filter",
397
+ kind=inspect.Parameter.POSITIONAL_OR_KEYWORD,
398
+ default=Dependency(skip_validation=True),
399
+ annotation=LimitOffsetFilter,
400
+ )
401
+ annotations["limit_offset_filter"] = LimitOffsetFilter
402
+
403
+ if config.get("sort_field"):
404
+ parameters["order_by_filter"] = inspect.Parameter(
405
+ name="order_by_filter",
406
+ kind=inspect.Parameter.POSITIONAL_OR_KEYWORD,
407
+ default=Dependency(skip_validation=True),
408
+ annotation=OrderByFilter,
409
+ )
410
+ annotations["order_by_filter"] = OrderByFilter
411
+
412
+ if not_in_fields := config.get("not_in_fields"):
413
+ for field_def in not_in_fields:
414
+ field_def = FieldNameType(name=field_def, type_hint=str) if isinstance(field_def, str) else field_def
415
+ parameters[f"{field_def.name}_not_in_filter"] = inspect.Parameter(
416
+ name=f"{field_def.name}_not_in_filter",
417
+ kind=inspect.Parameter.POSITIONAL_OR_KEYWORD,
418
+ default=Dependency(skip_validation=True),
419
+ annotation=NotInCollectionFilter[field_def.type_hint], # type: ignore
420
+ )
421
+ annotations[f"{field_def.name}_not_in_filter"] = NotInCollectionFilter[field_def.type_hint] # type: ignore
422
+
423
+ if in_fields := config.get("in_fields"):
424
+ for field_def in in_fields:
425
+ field_def = FieldNameType(name=field_def, type_hint=str) if isinstance(field_def, str) else field_def
426
+ parameters[f"{field_def.name}_in_filter"] = inspect.Parameter(
427
+ name=f"{field_def.name}_in_filter",
428
+ kind=inspect.Parameter.POSITIONAL_OR_KEYWORD,
429
+ default=Dependency(skip_validation=True),
430
+ annotation=InCollectionFilter[field_def.type_hint], # type: ignore
431
+ )
432
+ annotations[f"{field_def.name}_in_filter"] = InCollectionFilter[field_def.type_hint] # type: ignore
433
+
434
+ if null_fields := config.get("null_fields"):
435
+ null_fields = {null_fields} if isinstance(null_fields, str) else set(null_fields)
436
+ for field_name in null_fields:
437
+ parameters[f"{field_name}_null_filter"] = inspect.Parameter(
438
+ name=f"{field_name}_null_filter",
439
+ kind=inspect.Parameter.POSITIONAL_OR_KEYWORD,
440
+ default=Dependency(skip_validation=True),
441
+ annotation=NullFilter | None,
442
+ )
443
+ annotations[f"{field_name}_null_filter"] = NullFilter | None
444
+
445
+ if not_null_fields := config.get("not_null_fields"):
446
+ not_null_fields = {not_null_fields} if isinstance(not_null_fields, str) else set(not_null_fields)
447
+ for field_name in not_null_fields:
448
+ parameters[f"{field_name}_not_null_filter"] = inspect.Parameter(
449
+ name=f"{field_name}_not_null_filter",
450
+ kind=inspect.Parameter.POSITIONAL_OR_KEYWORD,
451
+ default=Dependency(skip_validation=True),
452
+ annotation=NotNullFilter | None,
453
+ )
454
+ annotations[f"{field_name}_not_null_filter"] = NotNullFilter | None
455
+
456
+ def provide_filters(**kwargs: FilterTypes) -> list[FilterTypes]:
457
+ """Aggregate filter dependencies based on configuration.
458
+
459
+ Args:
460
+ **kwargs: Filter parameters dynamically provided based on configuration.
461
+
462
+ Returns:
463
+ List of configured filters.
464
+ """
465
+ filters: list[FilterTypes] = []
466
+ if id_filter := kwargs.get("id_filter"):
467
+ filters.append(id_filter)
468
+ if created_filter := kwargs.get("created_filter"):
469
+ filters.append(created_filter)
470
+ if limit_offset := kwargs.get("limit_offset_filter"):
471
+ filters.append(limit_offset)
472
+ if updated_filter := kwargs.get("updated_filter"):
473
+ filters.append(updated_filter)
474
+ if (
475
+ (search_filter := cast("SearchFilter | None", kwargs.get("search_filter")))
476
+ and search_filter is not None # pyright: ignore[reportUnnecessaryComparison]
477
+ and search_filter.field_name is not None # pyright: ignore[reportUnnecessaryComparison]
478
+ and search_filter.value is not None # pyright: ignore[reportUnnecessaryComparison]
479
+ ):
480
+ filters.append(search_filter)
481
+ if (
482
+ (order_by := cast("OrderByFilter | None", kwargs.get("order_by_filter")))
483
+ and order_by is not None # pyright: ignore[reportUnnecessaryComparison]
484
+ and order_by.field_name is not None # pyright: ignore[reportUnnecessaryComparison]
485
+ ):
486
+ filters.append(order_by)
487
+
488
+ if not_in_fields := config.get("not_in_fields"):
489
+ not_in_fields = {not_in_fields} if isinstance(not_in_fields, (str, FieldNameType)) else not_in_fields
490
+ for field_def in not_in_fields:
491
+ field_def = FieldNameType(name=field_def, type_hint=str) if isinstance(field_def, str) else field_def
492
+ filter_ = kwargs.get(f"{field_def.name}_not_in_filter")
493
+ if filter_ is not None:
494
+ filters.append(filter_)
495
+
496
+ if in_fields := config.get("in_fields"):
497
+ in_fields = {in_fields} if isinstance(in_fields, (str, FieldNameType)) else in_fields
498
+ for field_def in in_fields:
499
+ field_def = FieldNameType(name=field_def, type_hint=str) if isinstance(field_def, str) else field_def
500
+ filter_ = kwargs.get(f"{field_def.name}_in_filter")
501
+ if filter_ is not None:
502
+ filters.append(filter_)
503
+
504
+ if null_fields := config.get("null_fields"):
505
+ null_fields = {null_fields} if isinstance(null_fields, str) else set(null_fields)
506
+ for field_name in null_fields:
507
+ filter_ = kwargs.get(f"{field_name}_null_filter")
508
+ if filter_ is not None:
509
+ filters.append(filter_)
510
+
511
+ if not_null_fields := config.get("not_null_fields"):
512
+ not_null_fields = {not_null_fields} if isinstance(not_null_fields, str) else set(not_null_fields)
513
+ for field_name in not_null_fields:
514
+ filter_ = kwargs.get(f"{field_name}_not_null_filter")
515
+ if filter_ is not None:
516
+ filters.append(filter_)
517
+
518
+ return filters
519
+
520
+ provide_filters.__signature__ = inspect.Signature( # type: ignore
521
+ parameters=list(parameters.values()), return_annotation=list[FilterTypes]
522
+ )
523
+ provide_filters.__annotations__ = annotations
524
+ provide_filters.__annotations__["return"] = list[FilterTypes]
525
+
526
+ return provide_filters