sqlspec 0.21.1__tar.gz → 0.22.0__tar.gz

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.

Potentially problematic release.


This version of sqlspec might be problematic. Click here for more details.

Files changed (335) hide show
  1. {sqlspec-0.21.1 → sqlspec-0.22.0}/.pre-commit-config.yaml +1 -1
  2. {sqlspec-0.21.1 → sqlspec-0.22.0}/PKG-INFO +1 -1
  3. {sqlspec-0.21.1 → sqlspec-0.22.0}/pyproject.toml +3 -1
  4. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/base.py +4 -4
  5. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/loader.py +65 -68
  6. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/protocols.py +3 -5
  7. sqlspec-0.22.0/sqlspec/storage/__init__.py +13 -0
  8. sqlspec-0.22.0/sqlspec/storage/backends/__init__.py +1 -0
  9. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/storage/backends/fsspec.py +87 -147
  10. sqlspec-0.22.0/sqlspec/storage/backends/local.py +310 -0
  11. sqlspec-0.22.0/sqlspec/storage/backends/obstore.py +474 -0
  12. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/storage/registry.py +101 -70
  13. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/utils/sync_tools.py +8 -5
  14. sqlspec-0.22.0/tests/integration/test_loader/test_file_system_loading.py +773 -0
  15. sqlspec-0.22.0/tests/integration/test_storage/__init__.py +1 -0
  16. sqlspec-0.22.0/tests/integration/test_storage/test_storage_integration.py +866 -0
  17. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/unit/test_loader/test_loading_patterns.py +148 -133
  18. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/unit/test_loader/test_sql_file_loader.py +207 -176
  19. sqlspec-0.22.0/tests/unit/test_storage/__init__.py +1 -0
  20. sqlspec-0.22.0/tests/unit/test_storage/test_fsspec_backend.py +499 -0
  21. sqlspec-0.22.0/tests/unit/test_storage/test_local_store.py +484 -0
  22. sqlspec-0.22.0/tests/unit/test_storage/test_obstore_backend.py +488 -0
  23. sqlspec-0.22.0/tests/unit/test_storage/test_storage_registry.py +238 -0
  24. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/unit/test_utils/test_sync_tools.py +9 -6
  25. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/unit/test_utils/test_type_guards.py +1 -1
  26. {sqlspec-0.21.1 → sqlspec-0.22.0}/uv.lock +223 -124
  27. sqlspec-0.21.1/sqlspec/storage/__init__.py +0 -23
  28. sqlspec-0.21.1/sqlspec/storage/backends/obstore.py +0 -456
  29. sqlspec-0.21.1/sqlspec/storage/capabilities.py +0 -102
  30. sqlspec-0.21.1/tests/integration/test_loader/test_file_system_loading.py +0 -693
  31. sqlspec-0.21.1/tools/__init__.py +0 -0
  32. {sqlspec-0.21.1 → sqlspec-0.22.0}/.gitignore +0 -0
  33. {sqlspec-0.21.1 → sqlspec-0.22.0}/CONTRIBUTING.rst +0 -0
  34. {sqlspec-0.21.1 → sqlspec-0.22.0}/LICENSE +0 -0
  35. {sqlspec-0.21.1 → sqlspec-0.22.0}/Makefile +0 -0
  36. {sqlspec-0.21.1 → sqlspec-0.22.0}/NOTICE +0 -0
  37. {sqlspec-0.21.1 → sqlspec-0.22.0}/README.md +0 -0
  38. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/__init__.py +0 -0
  39. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/__main__.py +0 -0
  40. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/__metadata__.py +0 -0
  41. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/_serialization.py +0 -0
  42. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/_sql.py +0 -0
  43. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/_typing.py +0 -0
  44. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/adapters/__init__.py +0 -0
  45. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/adapters/adbc/__init__.py +0 -0
  46. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/adapters/adbc/_types.py +0 -0
  47. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/adapters/adbc/config.py +0 -0
  48. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/adapters/adbc/driver.py +0 -0
  49. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/adapters/aiosqlite/__init__.py +0 -0
  50. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/adapters/aiosqlite/_types.py +0 -0
  51. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/adapters/aiosqlite/config.py +0 -0
  52. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/adapters/aiosqlite/driver.py +0 -0
  53. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/adapters/aiosqlite/pool.py +0 -0
  54. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/adapters/asyncmy/__init__.py +0 -0
  55. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/adapters/asyncmy/_types.py +0 -0
  56. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/adapters/asyncmy/config.py +0 -0
  57. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/adapters/asyncmy/driver.py +0 -0
  58. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/adapters/asyncpg/__init__.py +0 -0
  59. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/adapters/asyncpg/_types.py +0 -0
  60. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/adapters/asyncpg/config.py +0 -0
  61. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/adapters/asyncpg/driver.py +0 -0
  62. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/adapters/bigquery/__init__.py +0 -0
  63. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/adapters/bigquery/_types.py +0 -0
  64. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/adapters/bigquery/config.py +0 -0
  65. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/adapters/bigquery/driver.py +0 -0
  66. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/adapters/duckdb/__init__.py +0 -0
  67. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/adapters/duckdb/_types.py +0 -0
  68. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/adapters/duckdb/config.py +0 -0
  69. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/adapters/duckdb/driver.py +0 -0
  70. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/adapters/duckdb/pool.py +0 -0
  71. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/adapters/oracledb/__init__.py +0 -0
  72. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/adapters/oracledb/_types.py +0 -0
  73. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/adapters/oracledb/config.py +0 -0
  74. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/adapters/oracledb/driver.py +0 -0
  75. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/adapters/oracledb/migrations.py +0 -0
  76. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/adapters/psqlpy/__init__.py +0 -0
  77. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/adapters/psqlpy/_types.py +0 -0
  78. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/adapters/psqlpy/config.py +0 -0
  79. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/adapters/psqlpy/driver.py +0 -0
  80. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/adapters/psycopg/__init__.py +0 -0
  81. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/adapters/psycopg/_types.py +0 -0
  82. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/adapters/psycopg/config.py +0 -0
  83. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/adapters/psycopg/driver.py +0 -0
  84. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/adapters/sqlite/__init__.py +0 -0
  85. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/adapters/sqlite/_types.py +0 -0
  86. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/adapters/sqlite/config.py +0 -0
  87. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/adapters/sqlite/driver.py +0 -0
  88. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/adapters/sqlite/pool.py +0 -0
  89. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/builder/__init__.py +0 -0
  90. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/builder/_base.py +0 -0
  91. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/builder/_column.py +0 -0
  92. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/builder/_ddl.py +0 -0
  93. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/builder/_delete.py +0 -0
  94. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/builder/_expression_wrappers.py +0 -0
  95. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/builder/_insert.py +0 -0
  96. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/builder/_merge.py +0 -0
  97. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/builder/_parsing_utils.py +0 -0
  98. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/builder/_select.py +0 -0
  99. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/builder/_update.py +0 -0
  100. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/builder/mixins/__init__.py +0 -0
  101. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/builder/mixins/_cte_and_set_ops.py +0 -0
  102. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/builder/mixins/_delete_operations.py +0 -0
  103. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/builder/mixins/_insert_operations.py +0 -0
  104. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/builder/mixins/_join_operations.py +0 -0
  105. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/builder/mixins/_merge_operations.py +0 -0
  106. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/builder/mixins/_order_limit_operations.py +0 -0
  107. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/builder/mixins/_pivot_operations.py +0 -0
  108. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/builder/mixins/_select_operations.py +0 -0
  109. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/builder/mixins/_update_operations.py +0 -0
  110. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/builder/mixins/_where_clause.py +0 -0
  111. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/cli.py +0 -0
  112. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/config.py +0 -0
  113. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/core/__init__.py +0 -0
  114. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/core/cache.py +0 -0
  115. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/core/compiler.py +0 -0
  116. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/core/filters.py +0 -0
  117. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/core/hashing.py +0 -0
  118. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/core/parameters.py +0 -0
  119. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/core/result.py +0 -0
  120. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/core/splitter.py +0 -0
  121. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/core/statement.py +0 -0
  122. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/driver/__init__.py +0 -0
  123. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/driver/_async.py +0 -0
  124. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/driver/_common.py +0 -0
  125. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/driver/_sync.py +0 -0
  126. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/driver/mixins/__init__.py +0 -0
  127. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/driver/mixins/_result_tools.py +0 -0
  128. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/driver/mixins/_sql_translator.py +0 -0
  129. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/exceptions.py +0 -0
  130. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/extensions/__init__.py +0 -0
  131. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/extensions/aiosql/__init__.py +0 -0
  132. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/extensions/aiosql/adapter.py +0 -0
  133. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/extensions/litestar/__init__.py +0 -0
  134. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/extensions/litestar/_utils.py +0 -0
  135. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/extensions/litestar/cli.py +0 -0
  136. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/extensions/litestar/config.py +0 -0
  137. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/extensions/litestar/handlers.py +0 -0
  138. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/extensions/litestar/plugin.py +0 -0
  139. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/extensions/litestar/providers.py +0 -0
  140. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/migrations/__init__.py +0 -0
  141. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/migrations/base.py +0 -0
  142. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/migrations/commands.py +0 -0
  143. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/migrations/loaders.py +0 -0
  144. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/migrations/runner.py +0 -0
  145. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/migrations/tracker.py +0 -0
  146. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/migrations/utils.py +0 -0
  147. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/py.typed +0 -0
  148. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/storage/backends/base.py +0 -0
  149. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/typing.py +0 -0
  150. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/utils/__init__.py +0 -0
  151. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/utils/correlation.py +0 -0
  152. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/utils/data_transformation.py +0 -0
  153. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/utils/deprecation.py +0 -0
  154. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/utils/fixtures.py +0 -0
  155. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/utils/logging.py +0 -0
  156. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/utils/module_loader.py +0 -0
  157. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/utils/serializers.py +0 -0
  158. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/utils/singleton.py +0 -0
  159. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/utils/text.py +0 -0
  160. {sqlspec-0.21.1 → sqlspec-0.22.0}/sqlspec/utils/type_guards.py +0 -0
  161. {sqlspec-0.21.1/sqlspec/storage/backends → sqlspec-0.22.0/tests}/__init__.py +0 -0
  162. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/conftest.py +0 -0
  163. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/fixtures/__init__.py +0 -0
  164. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/fixtures/asset_maintenance.sql +0 -0
  165. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/fixtures/ddls-mysql-collection.sql +0 -0
  166. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/fixtures/ddls-postgres-collection.sql +0 -0
  167. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/fixtures/example_usage.py +0 -0
  168. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/fixtures/init.sql +0 -0
  169. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/fixtures/mysql/collection-config.sql +0 -0
  170. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/fixtures/mysql/collection-data_types.sql +0 -0
  171. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/fixtures/mysql/collection-database_details.sql +0 -0
  172. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/fixtures/mysql/collection-engines.sql +0 -0
  173. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/fixtures/mysql/collection-hostname.sql +0 -0
  174. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/fixtures/mysql/collection-plugins.sql +0 -0
  175. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/fixtures/mysql/collection-process_list.sql +0 -0
  176. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/fixtures/mysql/collection-resource-groups.sql +0 -0
  177. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/fixtures/mysql/collection-schema_objects.sql +0 -0
  178. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/fixtures/mysql/collection-table_details.sql +0 -0
  179. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/fixtures/mysql/collection-users.sql +0 -0
  180. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/fixtures/mysql/init.sql +0 -0
  181. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/fixtures/oracle.ddl.sql +0 -0
  182. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/fixtures/postgres/collection-applications.sql +0 -0
  183. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/fixtures/postgres/collection-aws_extension_dependency.sql +0 -0
  184. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/fixtures/postgres/collection-aws_oracle_exists.sql +0 -0
  185. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/fixtures/postgres/collection-bg_writer_stats.sql +0 -0
  186. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/fixtures/postgres/collection-calculated_metrics.sql +0 -0
  187. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/fixtures/postgres/collection-data_types.sql +0 -0
  188. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/fixtures/postgres/collection-database_details.sql +0 -0
  189. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/fixtures/postgres/collection-extensions.sql +0 -0
  190. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/fixtures/postgres/collection-index_details.sql +0 -0
  191. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/fixtures/postgres/collection-pglogical-details.sql +0 -0
  192. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/fixtures/postgres/collection-privileges.sql +0 -0
  193. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/fixtures/postgres/collection-replication_slots.sql +0 -0
  194. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/fixtures/postgres/collection-replication_stats.sql +0 -0
  195. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/fixtures/postgres/collection-schema_details.sql +0 -0
  196. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/fixtures/postgres/collection-schema_objects.sql +0 -0
  197. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/fixtures/postgres/collection-settings.sql +0 -0
  198. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/fixtures/postgres/collection-source_details.sql +0 -0
  199. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/fixtures/postgres/collection-table_details.sql +0 -0
  200. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/fixtures/postgres/extended-collection-all-databases.sql +0 -0
  201. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/fixtures/postgres/init.sql +0 -0
  202. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/fixtures/readiness-check.sql +0 -0
  203. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/fixtures/sql_utils.py +0 -0
  204. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/__init__.py +0 -0
  205. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/conftest.py +0 -0
  206. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/__init__.py +0 -0
  207. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_adbc/__init__.py +0 -0
  208. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_adbc/conftest.py +0 -0
  209. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_adbc/test_adbc_arrow_features.py +0 -0
  210. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_adbc/test_adbc_backends.py +0 -0
  211. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_adbc/test_adbc_connection.py +0 -0
  212. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_adbc/test_adbc_driver.py +0 -0
  213. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_adbc/test_adbc_edge_cases.py +0 -0
  214. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_adbc/test_adbc_results.py +0 -0
  215. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_adbc/test_migrations.py +0 -0
  216. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_adbc/test_parameter_styles.py +0 -0
  217. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_aiosqlite/__init__.py +0 -0
  218. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_aiosqlite/conftest.py +0 -0
  219. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_aiosqlite/test_connection.py +0 -0
  220. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_aiosqlite/test_driver.py +0 -0
  221. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_aiosqlite/test_migrations.py +0 -0
  222. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_aiosqlite/test_parameter_styles.py +0 -0
  223. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_aiosqlite/test_pooling.py +0 -0
  224. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_asyncmy/__init__.py +0 -0
  225. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_asyncmy/conftest.py +0 -0
  226. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_asyncmy/test_asyncmy_features.py +0 -0
  227. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_asyncmy/test_config.py +0 -0
  228. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_asyncmy/test_driver.py +0 -0
  229. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_asyncmy/test_migrations.py +0 -0
  230. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_asyncmy/test_parameter_styles.py +0 -0
  231. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_asyncpg/__init__.py +0 -0
  232. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_asyncpg/conftest.py +0 -0
  233. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_asyncpg/test_connection.py +0 -0
  234. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_asyncpg/test_driver.py +0 -0
  235. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_asyncpg/test_execute_many.py +0 -0
  236. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_asyncpg/test_migrations.py +0 -0
  237. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_asyncpg/test_parameter_styles.py +0 -0
  238. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_bigquery/__init__.py +0 -0
  239. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_bigquery/conftest.py +0 -0
  240. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_bigquery/test_bigquery_features.py +0 -0
  241. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_bigquery/test_config.py +0 -0
  242. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_bigquery/test_connection.py +0 -0
  243. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_bigquery/test_driver.py +0 -0
  244. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_duckdb/__init__.py +0 -0
  245. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_duckdb/test_connection.py +0 -0
  246. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_duckdb/test_driver.py +0 -0
  247. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_duckdb/test_execute_many.py +0 -0
  248. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_duckdb/test_migrations.py +0 -0
  249. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_duckdb/test_mixed_parameter_styles.py +0 -0
  250. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_duckdb/test_parameter_styles.py +0 -0
  251. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_duckdb/test_pooling.py +0 -0
  252. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_duckdb/utils.py +0 -0
  253. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_oracledb/__init__.py +0 -0
  254. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_oracledb/conftest.py +0 -0
  255. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_oracledb/test_connection.py +0 -0
  256. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_oracledb/test_driver_async.py +0 -0
  257. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_oracledb/test_driver_sync.py +0 -0
  258. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_oracledb/test_execute_many.py +0 -0
  259. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_oracledb/test_migrations.py +0 -0
  260. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_oracledb/test_oracle_features.py +0 -0
  261. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_oracledb/test_parameter_styles.py +0 -0
  262. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_psqlpy/__init__.py +0 -0
  263. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_psqlpy/conftest.py +0 -0
  264. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_psqlpy/test_connection.py +0 -0
  265. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_psqlpy/test_driver.py +0 -0
  266. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_psqlpy/test_migrations.py +0 -0
  267. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_psqlpy/test_parameter_styles.py +0 -0
  268. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_psqlpy/test_psqlpy_features.py +0 -0
  269. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_psycopg/__init__.py +0 -0
  270. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_psycopg/conftest.py +0 -0
  271. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_psycopg/test_async_copy.py +0 -0
  272. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_psycopg/test_connection.py +0 -0
  273. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_psycopg/test_driver.py +0 -0
  274. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_psycopg/test_execute_many.py +0 -0
  275. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_psycopg/test_migrations.py +0 -0
  276. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_psycopg/test_parameter_styles.py +0 -0
  277. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_sqlite/__init__.py +0 -0
  278. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_sqlite/conftest.py +0 -0
  279. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_sqlite/test_driver.py +0 -0
  280. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_sqlite/test_migrations.py +0 -0
  281. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_sqlite/test_parameter_styles.py +0 -0
  282. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_sqlite/test_pooling.py +0 -0
  283. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_adapters/test_sqlite/test_query_mixin.py +0 -0
  284. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_loader/__init__.py +0 -0
  285. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/integration/test_migrations/__init__.py +0 -0
  286. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/unit/conftest.py +0 -0
  287. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/unit/test_adapters/__init__.py +0 -0
  288. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/unit/test_adapters/conftest.py +0 -0
  289. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/unit/test_adapters/test_adapter_implementations.py +0 -0
  290. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/unit/test_adapters/test_async_adapters.py +0 -0
  291. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/unit/test_adapters/test_sync_adapters.py +0 -0
  292. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/unit/test_base/__init__.py +0 -0
  293. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/unit/test_base/test_sql_integration.py +0 -0
  294. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/unit/test_base/test_sqlspec_class.py +0 -0
  295. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/unit/test_builder/__init__.py +0 -0
  296. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/unit/test_builder/test_insert_builder.py +0 -0
  297. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/unit/test_builder/test_parameter_naming.py +0 -0
  298. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/unit/test_builder_parameter_naming.py +0 -0
  299. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/unit/test_core/test_cache.py +0 -0
  300. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/unit/test_core/test_compiler.py +0 -0
  301. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/unit/test_core/test_filters.py +0 -0
  302. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/unit/test_core/test_hashing.py +0 -0
  303. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/unit/test_core/test_parameters.py +0 -0
  304. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/unit/test_core/test_result.py +0 -0
  305. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/unit/test_core/test_statement.py +0 -0
  306. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/unit/test_extensions/__init__.py +0 -0
  307. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/unit/test_extensions/test_litestar/__init__.py +0 -0
  308. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/unit/test_extensions/test_litestar/test_config.py +0 -0
  309. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/unit/test_loader/__init__.py +0 -0
  310. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/unit/test_loader/test_cache_integration.py +0 -0
  311. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/unit/test_loader/test_fixtures_directory_loading.py +0 -0
  312. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/unit/test_migrations/__init__.py +0 -0
  313. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/unit/test_migrations/test_migration.py +0 -0
  314. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/unit/test_migrations/test_migration_commands.py +0 -0
  315. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/unit/test_migrations/test_migration_execution.py +0 -0
  316. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/unit/test_migrations/test_migration_runner.py +0 -0
  317. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/unit/test_parsing_utils.py +0 -0
  318. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/unit/test_sql_factory.py +0 -0
  319. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/unit/test_utils/__init__.py +0 -0
  320. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/unit/test_utils/test_correlation.py +0 -0
  321. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/unit/test_utils/test_data_transformation.py +0 -0
  322. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/unit/test_utils/test_deprecation.py +0 -0
  323. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/unit/test_utils/test_fixtures.py +0 -0
  324. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/unit/test_utils/test_logging.py +0 -0
  325. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/unit/test_utils/test_module_loader.py +0 -0
  326. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/unit/test_utils/test_serializers.py +0 -0
  327. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/unit/test_utils/test_singleton.py +0 -0
  328. {sqlspec-0.21.1 → sqlspec-0.22.0}/tests/unit/test_utils/test_text.py +0 -0
  329. {sqlspec-0.21.1/tests → sqlspec-0.22.0/tools}/__init__.py +0 -0
  330. {sqlspec-0.21.1 → sqlspec-0.22.0}/tools/build_docs.py +0 -0
  331. {sqlspec-0.21.1 → sqlspec-0.22.0}/tools/local-infra.sh +0 -0
  332. {sqlspec-0.21.1 → sqlspec-0.22.0}/tools/pypi_readme.py +0 -0
  333. {sqlspec-0.21.1 → sqlspec-0.22.0}/tools/sphinx_ext/__init__.py +0 -0
  334. {sqlspec-0.21.1 → sqlspec-0.22.0}/tools/sphinx_ext/changelog.py +0 -0
  335. {sqlspec-0.21.1 → sqlspec-0.22.0}/tools/sphinx_ext/missing_references.py +0 -0
@@ -17,7 +17,7 @@ repos:
17
17
  - id: mixed-line-ending
18
18
  - id: trailing-whitespace
19
19
  - repo: https://github.com/charliermarsh/ruff-pre-commit
20
- rev: "v0.12.10"
20
+ rev: "v0.12.11"
21
21
  hooks:
22
22
  - id: ruff
23
23
  args: ["--fix"]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sqlspec
3
- Version: 0.21.1
3
+ Version: 0.22.0
4
4
  Summary: SQL Experiments in Python
5
5
  Project-URL: Discord, https://discord.gg/litestar
6
6
  Project-URL: Issue, https://github.com/litestar-org/sqlspec/issues/
@@ -13,7 +13,7 @@ maintainers = [{ name = "Litestar Developers", email = "hello@litestar.dev" }]
13
13
  name = "sqlspec"
14
14
  readme = "README.md"
15
15
  requires-python = ">=3.9, <4.0"
16
- version = "0.21.1"
16
+ version = "0.22.0"
17
17
 
18
18
  [project.urls]
19
19
  Discord = "https://discord.gg/litestar"
@@ -83,6 +83,7 @@ doc = [
83
83
  ]
84
84
  extras = [
85
85
  "adbc_driver_manager",
86
+ "fsspec[s3]",
86
87
  "pgvector",
87
88
  "pyarrow",
88
89
  "polars",
@@ -341,6 +342,7 @@ module = [
341
342
  "sqlglot.*",
342
343
  "pgvector",
343
344
  "pgvector.*",
345
+ "minio",
344
346
  ]
345
347
 
346
348
  [[tool.mypy.overrides]]
@@ -64,7 +64,7 @@ class SQLSpec:
64
64
  config.close_pool()
65
65
  cleaned_count += 1
66
66
  except Exception as e:
67
- logger.warning("Failed to clean up sync pool for config %s: %s", config_type.__name__, e)
67
+ logger.debug("Failed to clean up sync pool for config %s: %s", config_type.__name__, e)
68
68
 
69
69
  if cleaned_count > 0:
70
70
  logger.debug("Sync pool cleanup completed. Cleaned %d pools.", cleaned_count)
@@ -87,14 +87,14 @@ class SQLSpec:
87
87
  else:
88
88
  sync_configs.append((config_type, config))
89
89
  except Exception as e:
90
- logger.warning("Failed to prepare cleanup for config %s: %s", config_type.__name__, e)
90
+ logger.debug("Failed to prepare cleanup for config %s: %s", config_type.__name__, e)
91
91
 
92
92
  if cleanup_tasks:
93
93
  try:
94
94
  await asyncio.gather(*cleanup_tasks, return_exceptions=True)
95
95
  logger.debug("Async pool cleanup completed. Cleaned %d pools.", len(cleanup_tasks))
96
96
  except Exception as e:
97
- logger.warning("Failed to complete async pool cleanup: %s", e)
97
+ logger.debug("Failed to complete async pool cleanup: %s", e)
98
98
 
99
99
  for _config_type, config in sync_configs:
100
100
  config.close_pool()
@@ -129,7 +129,7 @@ class SQLSpec:
129
129
  """
130
130
  config_type = type(config)
131
131
  if config_type in self._configs:
132
- logger.warning("Configuration for %s already exists. Overwriting.", config_type.__name__)
132
+ logger.debug("Configuration for %s already exists. Overwriting.", config_type.__name__)
133
133
  self._configs[config_type] = config
134
134
  return config_type
135
135
 
@@ -10,18 +10,15 @@ import time
10
10
  from datetime import datetime, timezone
11
11
  from pathlib import Path
12
12
  from typing import TYPE_CHECKING, Any, Final, Optional, Union
13
+ from urllib.parse import unquote, urlparse
13
14
 
14
15
  from sqlspec.core.cache import CacheKey, get_cache_config, get_default_cache
15
16
  from sqlspec.core.statement import SQL
16
- from sqlspec.exceptions import (
17
- MissingDependencyError,
18
- SQLFileNotFoundError,
19
- SQLFileParseError,
20
- StorageOperationFailedError,
21
- )
17
+ from sqlspec.exceptions import SQLFileNotFoundError, SQLFileParseError, StorageOperationFailedError
22
18
  from sqlspec.storage.registry import storage_registry as default_storage_registry
23
19
  from sqlspec.utils.correlation import CorrelationContext
24
20
  from sqlspec.utils.logging import get_logger
21
+ from sqlspec.utils.text import slugify
25
22
 
26
23
  if TYPE_CHECKING:
27
24
  from sqlspec.storage.registry import StorageRegistry
@@ -54,13 +51,25 @@ MIN_QUERY_PARTS: Final = 3
54
51
  def _normalize_query_name(name: str) -> str:
55
52
  """Normalize query name to be a valid Python identifier.
56
53
 
54
+ Convert hyphens to underscores, preserve dots for namespacing,
55
+ and remove invalid characters.
56
+
57
57
  Args:
58
58
  name: Raw query name from SQL file.
59
59
 
60
60
  Returns:
61
61
  Normalized query name suitable as Python identifier.
62
62
  """
63
- return TRIM_SPECIAL_CHARS.sub("", name).replace("-", "_")
63
+ # Handle namespace parts separately to preserve dots
64
+ parts = name.split(".")
65
+ normalized_parts = []
66
+
67
+ for part in parts:
68
+ # Use slugify with underscore separator and remove any remaining invalid chars
69
+ normalized_part = slugify(part, separator="_")
70
+ normalized_parts.append(normalized_part)
71
+
72
+ return ".".join(normalized_parts)
64
73
 
65
74
 
66
75
  def _normalize_dialect(dialect: str) -> str:
@@ -76,19 +85,6 @@ def _normalize_dialect(dialect: str) -> str:
76
85
  return DIALECT_ALIASES.get(normalized, normalized)
77
86
 
78
87
 
79
- def _normalize_dialect_for_sqlglot(dialect: str) -> str:
80
- """Normalize dialect name for SQLGlot compatibility.
81
-
82
- Args:
83
- dialect: Dialect name from SQL file or parameter.
84
-
85
- Returns:
86
- SQLGlot-compatible dialect name.
87
- """
88
- normalized = dialect.lower().strip()
89
- return DIALECT_ALIASES.get(normalized, normalized)
90
-
91
-
92
88
  class NamedStatement:
93
89
  """Represents a parsed SQL statement with metadata.
94
90
 
@@ -218,8 +214,7 @@ class SQLFileLoader:
218
214
  SQLFileParseError: If file cannot be read.
219
215
  """
220
216
  try:
221
- content = self._read_file_content(path)
222
- return hashlib.md5(content.encode(), usedforsecurity=False).hexdigest()
217
+ return hashlib.md5(self._read_file_content(path).encode(), usedforsecurity=False).hexdigest()
223
218
  except Exception as e:
224
219
  raise SQLFileParseError(str(path), str(path), e) from e
225
220
 
@@ -253,19 +248,22 @@ class SQLFileLoader:
253
248
  SQLFileNotFoundError: If file does not exist.
254
249
  SQLFileParseError: If file cannot be read or parsed.
255
250
  """
256
-
257
251
  path_str = str(path)
258
252
 
259
253
  try:
260
254
  backend = self.storage_registry.get(path)
255
+ # For file:// URIs, extract just the filename for the backend call
256
+ if path_str.startswith("file://"):
257
+ parsed = urlparse(path_str)
258
+ file_path = unquote(parsed.path)
259
+ # Handle Windows paths (file:///C:/path)
260
+ if file_path and len(file_path) > 2 and file_path[2] == ":": # noqa: PLR2004
261
+ file_path = file_path[1:] # Remove leading slash for Windows
262
+ filename = Path(file_path).name
263
+ return backend.read_text(filename, encoding=self.encoding)
261
264
  return backend.read_text(path_str, encoding=self.encoding)
262
265
  except KeyError as e:
263
266
  raise SQLFileNotFoundError(path_str) from e
264
- except MissingDependencyError:
265
- try:
266
- return path.read_text(encoding=self.encoding) # type: ignore[union-attr]
267
- except FileNotFoundError as e:
268
- raise SQLFileNotFoundError(path_str) from e
269
267
  except StorageOperationFailedError as e:
270
268
  if "not found" in str(e).lower() or "no such file" in str(e).lower():
271
269
  raise SQLFileNotFoundError(path_str) from e
@@ -419,8 +417,7 @@ class SQLFileLoader:
419
417
  for file_path in sql_files:
420
418
  relative_path = file_path.relative_to(dir_path)
421
419
  namespace_parts = relative_path.parent.parts
422
- namespace = ".".join(namespace_parts) if namespace_parts else None
423
- self._load_single_file(file_path, namespace)
420
+ self._load_single_file(file_path, ".".join(namespace_parts) if namespace_parts else None)
424
421
  return len(sql_files)
425
422
 
426
423
  def _load_single_file(self, file_path: Union[str, Path], namespace: Optional[str]) -> None:
@@ -533,44 +530,6 @@ class SQLFileLoader:
533
530
  self._queries[normalized_name] = statement
534
531
  self._query_to_file[normalized_name] = "<directly added>"
535
532
 
536
- def get_sql(self, name: str) -> "SQL":
537
- """Get a SQL object by statement name.
538
-
539
- Args:
540
- name: Name of the statement (from -- name: in SQL file).
541
- Hyphens in names are converted to underscores.
542
-
543
- Returns:
544
- SQL object ready for execution.
545
-
546
- Raises:
547
- SQLFileNotFoundError: If statement name not found.
548
- """
549
- correlation_id = CorrelationContext.get()
550
-
551
- safe_name = _normalize_query_name(name)
552
-
553
- if safe_name not in self._queries:
554
- available = ", ".join(sorted(self._queries.keys())) if self._queries else "none"
555
- logger.error(
556
- "Statement not found: %s",
557
- name,
558
- extra={
559
- "statement_name": name,
560
- "safe_name": safe_name,
561
- "available_statements": len(self._queries),
562
- "correlation_id": correlation_id,
563
- },
564
- )
565
- raise SQLFileNotFoundError(name, path=f"Statement '{name}' not found. Available statements: {available}")
566
-
567
- parsed_statement = self._queries[safe_name]
568
- sqlglot_dialect = None
569
- if parsed_statement.dialect:
570
- sqlglot_dialect = _normalize_dialect_for_sqlglot(parsed_statement.dialect)
571
-
572
- return SQL(parsed_statement.sql, dialect=sqlglot_dialect)
573
-
574
533
  def get_file(self, path: Union[str, Path]) -> "Optional[SQLFile]":
575
534
  """Get a loaded SQLFile object by path.
576
535
 
@@ -659,3 +618,41 @@ class SQLFileLoader:
659
618
  if safe_name not in self._queries:
660
619
  raise SQLFileNotFoundError(name)
661
620
  return self._queries[safe_name].sql
621
+
622
+ def get_sql(self, name: str) -> "SQL":
623
+ """Get a SQL object by statement name.
624
+
625
+ Args:
626
+ name: Name of the statement (from -- name: in SQL file).
627
+ Hyphens in names are converted to underscores.
628
+
629
+ Returns:
630
+ SQL object ready for execution.
631
+
632
+ Raises:
633
+ SQLFileNotFoundError: If statement name not found.
634
+ """
635
+ correlation_id = CorrelationContext.get()
636
+
637
+ safe_name = _normalize_query_name(name)
638
+
639
+ if safe_name not in self._queries:
640
+ available = ", ".join(sorted(self._queries.keys())) if self._queries else "none"
641
+ logger.error(
642
+ "Statement not found: %s",
643
+ name,
644
+ extra={
645
+ "statement_name": name,
646
+ "safe_name": safe_name,
647
+ "available_statements": len(self._queries),
648
+ "correlation_id": correlation_id,
649
+ },
650
+ )
651
+ raise SQLFileNotFoundError(name, path=f"Statement '{name}' not found. Available statements: {available}")
652
+
653
+ parsed_statement = self._queries[safe_name]
654
+ sqlglot_dialect = None
655
+ if parsed_statement.dialect:
656
+ sqlglot_dialect = _normalize_dialect(parsed_statement.dialect)
657
+
658
+ return SQL(parsed_statement.sql, dialect=sqlglot_dialect)
@@ -4,7 +4,7 @@ This module provides protocols that can be used for static type checking
4
4
  and runtime isinstance() checks.
5
5
  """
6
6
 
7
- from typing import TYPE_CHECKING, Any, ClassVar, Optional, Protocol, Union, runtime_checkable
7
+ from typing import TYPE_CHECKING, Any, Optional, Protocol, Union, runtime_checkable
8
8
 
9
9
  from typing_extensions import Self
10
10
 
@@ -14,7 +14,6 @@ if TYPE_CHECKING:
14
14
 
15
15
  from sqlglot import exp
16
16
 
17
- from sqlspec.storage.capabilities import StorageCapabilities
18
17
  from sqlspec.typing import ArrowRecordBatch, ArrowTable
19
18
 
20
19
  __all__ = (
@@ -194,9 +193,8 @@ class ObjectStoreItemProtocol(Protocol):
194
193
  class ObjectStoreProtocol(Protocol):
195
194
  """Protocol for object storage operations."""
196
195
 
197
- capabilities: ClassVar["StorageCapabilities"]
198
-
199
196
  protocol: str
197
+ backend_type: str
200
198
 
201
199
  def __init__(self, uri: str, **kwargs: Any) -> None:
202
200
  return
@@ -330,7 +328,7 @@ class ObjectStoreProtocol(Protocol):
330
328
  msg = "Async arrow writing not implemented"
331
329
  raise NotImplementedError(msg)
332
330
 
333
- async def stream_arrow_async(self, pattern: str, **kwargs: Any) -> "AsyncIterator[ArrowRecordBatch]":
331
+ def stream_arrow_async(self, pattern: str, **kwargs: Any) -> "AsyncIterator[ArrowRecordBatch]":
334
332
  """Async stream Arrow record batches from matching objects."""
335
333
  msg = "Async arrow streaming not implemented"
336
334
  raise NotImplementedError(msg)
@@ -0,0 +1,13 @@
1
+ """Storage abstraction layer for SQLSpec.
2
+
3
+ Provides a storage system with:
4
+ - Multiple backend support (local, fsspec, obstore)
5
+ - Configuration-based registration
6
+ - URI scheme-based backend resolution
7
+ - Named storage configurations
8
+ - Capability-based backend selection
9
+ """
10
+
11
+ from sqlspec.storage.registry import StorageRegistry, storage_registry
12
+
13
+ __all__ = ("StorageRegistry", "storage_registry")
@@ -0,0 +1 @@
1
+ """Storage backends."""