dblift 2.2.2__tar.gz → 2.4.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.
Files changed (470) hide show
  1. {dblift-2.2.2 → dblift-2.4.0}/PKG-INFO +19 -2
  2. {dblift-2.2.2 → dblift-2.4.0}/cli/main.py +40 -10
  3. {dblift-2.2.2 → dblift-2.4.0}/core/migration/commands/repair_command.py +17 -1
  4. dblift-2.4.0/db/plugins/alloydb/__init__.py +12 -0
  5. dblift-2.4.0/db/plugins/alloydb/plugin.py +28 -0
  6. dblift-2.4.0/db/plugins/alloydb/provider.py +14 -0
  7. dblift-2.4.0/db/plugins/alloydb/quirks.py +32 -0
  8. dblift-2.4.0/db/plugins/aurora_postgresql/__init__.py +12 -0
  9. dblift-2.4.0/db/plugins/aurora_postgresql/plugin.py +28 -0
  10. dblift-2.4.0/db/plugins/aurora_postgresql/provider.py +14 -0
  11. dblift-2.4.0/db/plugins/aurora_postgresql/quirks.py +32 -0
  12. dblift-2.4.0/db/plugins/citus/__init__.py +12 -0
  13. dblift-2.4.0/db/plugins/citus/plugin.py +28 -0
  14. dblift-2.4.0/db/plugins/citus/provider.py +14 -0
  15. dblift-2.4.0/db/plugins/citus/quirks.py +32 -0
  16. dblift-2.4.0/db/plugins/duckdb/__init__.py +12 -0
  17. dblift-2.4.0/db/plugins/duckdb/config.py +81 -0
  18. dblift-2.4.0/db/plugins/duckdb/parser/__init__.py +5 -0
  19. dblift-2.4.0/db/plugins/duckdb/parser/duckdb_regex_parser.py +180 -0
  20. dblift-2.4.0/db/plugins/duckdb/parser/parser_config.py +203 -0
  21. dblift-2.4.0/db/plugins/duckdb/plugin.py +22 -0
  22. dblift-2.4.0/db/plugins/duckdb/provider.py +368 -0
  23. dblift-2.4.0/db/plugins/duckdb/quirks.py +96 -0
  24. dblift-2.4.0/db/plugins/duckdb/sqlalchemy_url.py +30 -0
  25. dblift-2.4.0/db/plugins/neon/__init__.py +12 -0
  26. dblift-2.4.0/db/plugins/neon/plugin.py +28 -0
  27. dblift-2.4.0/db/plugins/neon/provider.py +14 -0
  28. dblift-2.4.0/db/plugins/neon/quirks.py +32 -0
  29. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/postgresql/config.py +20 -1
  30. dblift-2.4.0/db/plugins/supabase/__init__.py +12 -0
  31. dblift-2.4.0/db/plugins/supabase/plugin.py +28 -0
  32. dblift-2.4.0/db/plugins/supabase/provider.py +14 -0
  33. dblift-2.4.0/db/plugins/supabase/quirks.py +32 -0
  34. dblift-2.4.0/db/plugins/timescaledb/__init__.py +12 -0
  35. dblift-2.4.0/db/plugins/timescaledb/plugin.py +28 -0
  36. dblift-2.4.0/db/plugins/timescaledb/provider.py +14 -0
  37. dblift-2.4.0/db/plugins/timescaledb/quirks.py +32 -0
  38. dblift-2.4.0/db/plugins/yugabytedb/__init__.py +12 -0
  39. dblift-2.4.0/db/plugins/yugabytedb/plugin.py +28 -0
  40. dblift-2.4.0/db/plugins/yugabytedb/provider.py +14 -0
  41. dblift-2.4.0/db/plugins/yugabytedb/quirks.py +32 -0
  42. {dblift-2.2.2 → dblift-2.4.0}/db/sqlalchemy_provider.py +6 -0
  43. {dblift-2.2.2 → dblift-2.4.0}/dblift.egg-info/PKG-INFO +19 -2
  44. {dblift-2.2.2 → dblift-2.4.0}/dblift.egg-info/SOURCES.txt +37 -0
  45. {dblift-2.2.2 → dblift-2.4.0}/dblift.egg-info/entry_points.txt +8 -0
  46. {dblift-2.2.2 → dblift-2.4.0}/dblift.egg-info/requires.txt +26 -1
  47. {dblift-2.2.2 → dblift-2.4.0}/pyproject.toml +67 -2
  48. {dblift-2.2.2 → dblift-2.4.0}/LICENSE +0 -0
  49. {dblift-2.2.2 → dblift-2.4.0}/README.md +0 -0
  50. {dblift-2.2.2 → dblift-2.4.0}/api/__init__.py +0 -0
  51. {dblift-2.2.2 → dblift-2.4.0}/api/_cli_support.py +0 -0
  52. {dblift-2.2.2 → dblift-2.4.0}/api/_client_factory.py +0 -0
  53. {dblift-2.2.2 → dblift-2.4.0}/api/_client_operations.py +0 -0
  54. {dblift-2.2.2 → dblift-2.4.0}/api/_engine_config.py +0 -0
  55. {dblift-2.2.2 → dblift-2.4.0}/api/async_client.py +0 -0
  56. {dblift-2.2.2 → dblift-2.4.0}/api/client.py +0 -0
  57. {dblift-2.2.2 → dblift-2.4.0}/api/events.py +0 -0
  58. {dblift-2.2.2 → dblift-2.4.0}/api/migrations.py +0 -0
  59. {dblift-2.2.2 → dblift-2.4.0}/api/py.typed +0 -0
  60. {dblift-2.2.2 → dblift-2.4.0}/cli/__init__.py +0 -0
  61. {dblift-2.2.2 → dblift-2.4.0}/cli/_command_handlers.py +0 -0
  62. {dblift-2.2.2 → dblift-2.4.0}/cli/_config_helpers.py +0 -0
  63. {dblift-2.2.2 → dblift-2.4.0}/cli/_constants.py +0 -0
  64. {dblift-2.2.2 → dblift-2.4.0}/cli/_output.py +0 -0
  65. {dblift-2.2.2 → dblift-2.4.0}/cli/_parser_setup.py +0 -0
  66. {dblift-2.2.2 → dblift-2.4.0}/cli/commands/__init__.py +0 -0
  67. {dblift-2.2.2 → dblift-2.4.0}/cli/commands/config_command.py +0 -0
  68. {dblift-2.2.2 → dblift-2.4.0}/cli/db_utils.py +0 -0
  69. {dblift-2.2.2 → dblift-2.4.0}/cli/extensions.py +0 -0
  70. {dblift-2.2.2 → dblift-2.4.0}/cli/handlers/__init__.py +0 -0
  71. {dblift-2.2.2 → dblift-2.4.0}/cli/handlers/_shared.py +0 -0
  72. {dblift-2.2.2 → dblift-2.4.0}/cli/handlers/baseline.py +0 -0
  73. {dblift-2.2.2 → dblift-2.4.0}/cli/handlers/clean.py +0 -0
  74. {dblift-2.2.2 → dblift-2.4.0}/cli/handlers/import_flyway.py +0 -0
  75. {dblift-2.2.2 → dblift-2.4.0}/cli/handlers/info.py +0 -0
  76. {dblift-2.2.2 → dblift-2.4.0}/cli/handlers/migrate.py +0 -0
  77. {dblift-2.2.2 → dblift-2.4.0}/cli/handlers/repair.py +0 -0
  78. {dblift-2.2.2 → dblift-2.4.0}/cli/handlers/undo.py +0 -0
  79. {dblift-2.2.2 → dblift-2.4.0}/cli/handlers/validate.py +0 -0
  80. {dblift-2.2.2 → dblift-2.4.0}/config/__init__.py +0 -0
  81. {dblift-2.2.2 → dblift-2.4.0}/config/_credential_masking.py +0 -0
  82. {dblift-2.2.2 → dblift-2.4.0}/config/_subclasses/__init__.py +0 -0
  83. {dblift-2.2.2 → dblift-2.4.0}/config/_subclasses/dummy_config.py +0 -0
  84. {dblift-2.2.2 → dblift-2.4.0}/config/_url_builder_mixin.py +0 -0
  85. {dblift-2.2.2 → dblift-2.4.0}/config/config_builder.py +0 -0
  86. {dblift-2.2.2 → dblift-2.4.0}/config/database_config.py +0 -0
  87. {dblift-2.2.2 → dblift-2.4.0}/config/dblift_config.py +0 -0
  88. {dblift-2.2.2 → dblift-2.4.0}/config/errors.py +0 -0
  89. {dblift-2.2.2 → dblift-2.4.0}/config/property_registry.py +0 -0
  90. {dblift-2.2.2 → dblift-2.4.0}/config/secrets/__init__.py +0 -0
  91. {dblift-2.2.2 → dblift-2.4.0}/config/secrets/_cache.py +0 -0
  92. {dblift-2.2.2 → dblift-2.4.0}/config/secrets/_provider_base.py +0 -0
  93. {dblift-2.2.2 → dblift-2.4.0}/config/secrets/_registry.py +0 -0
  94. {dblift-2.2.2 → dblift-2.4.0}/config/secrets/_resolver.py +0 -0
  95. {dblift-2.2.2 → dblift-2.4.0}/config/secrets/_secrets_config.py +0 -0
  96. {dblift-2.2.2 → dblift-2.4.0}/core/__init__.py +0 -0
  97. {dblift-2.2.2 → dblift-2.4.0}/core/constants.py +0 -0
  98. {dblift-2.2.2 → dblift-2.4.0}/core/dialect_boundary.py +0 -0
  99. {dblift-2.2.2 → dblift-2.4.0}/core/exceptions.py +0 -0
  100. {dblift-2.2.2 → dblift-2.4.0}/core/introspection/__init__.py +0 -0
  101. {dblift-2.2.2 → dblift-2.4.0}/core/introspection/_column_enricher.py +0 -0
  102. {dblift-2.2.2 → dblift-2.4.0}/core/introspection/_partition_enricher.py +0 -0
  103. {dblift-2.2.2 → dblift-2.4.0}/core/introspection/_schema_orchestrator.py +0 -0
  104. {dblift-2.2.2 → dblift-2.4.0}/core/introspection/_utils.py +0 -0
  105. {dblift-2.2.2 → dblift-2.4.0}/core/introspection/_vendor_property_applier.py +0 -0
  106. {dblift-2.2.2 → dblift-2.4.0}/core/introspection/base_introspector.py +0 -0
  107. {dblift-2.2.2 → dblift-2.4.0}/core/introspection/extractors/__init__.py +0 -0
  108. {dblift-2.2.2 → dblift-2.4.0}/core/introspection/extractors/base_extractor.py +0 -0
  109. {dblift-2.2.2 → dblift-2.4.0}/core/introspection/extractors/column_extractor.py +0 -0
  110. {dblift-2.2.2 → dblift-2.4.0}/core/introspection/extractors/constraint_extractor.py +0 -0
  111. {dblift-2.2.2 → dblift-2.4.0}/core/introspection/extractors/index_extractor.py +0 -0
  112. {dblift-2.2.2 → dblift-2.4.0}/core/introspection/extractors/misc_extractor.py +0 -0
  113. {dblift-2.2.2 → dblift-2.4.0}/core/introspection/extractors/procedure_extractor.py +0 -0
  114. {dblift-2.2.2 → dblift-2.4.0}/core/introspection/extractors/sequence_extractor.py +0 -0
  115. {dblift-2.2.2 → dblift-2.4.0}/core/introspection/extractors/table_extractor.py +0 -0
  116. {dblift-2.2.2 → dblift-2.4.0}/core/introspection/extractors/trigger_extractor.py +0 -0
  117. {dblift-2.2.2 → dblift-2.4.0}/core/introspection/extractors/view_extractor.py +0 -0
  118. {dblift-2.2.2 → dblift-2.4.0}/core/introspection/introspector_factory.py +0 -0
  119. {dblift-2.2.2 → dblift-2.4.0}/core/introspection/result.py +0 -0
  120. {dblift-2.2.2 → dblift-2.4.0}/core/introspection/schema_introspector.py +0 -0
  121. {dblift-2.2.2 → dblift-2.4.0}/core/introspection/vendor_queries_base.py +0 -0
  122. {dblift-2.2.2 → dblift-2.4.0}/core/introspection/vendor_queries_factory.py +0 -0
  123. {dblift-2.2.2 → dblift-2.4.0}/core/introspection/vendor_queries_protocols.py +0 -0
  124. {dblift-2.2.2 → dblift-2.4.0}/core/introspection/version_detector.py +0 -0
  125. {dblift-2.2.2 → dblift-2.4.0}/core/logger/__init__.py +0 -0
  126. {dblift-2.2.2 → dblift-2.4.0}/core/logger/_base.py +0 -0
  127. {dblift-2.2.2 → dblift-2.4.0}/core/logger/_factory.py +0 -0
  128. {dblift-2.2.2 → dblift-2.4.0}/core/logger/_formatters.py +0 -0
  129. {dblift-2.2.2 → dblift-2.4.0}/core/logger/_levels.py +0 -0
  130. {dblift-2.2.2 → dblift-2.4.0}/core/logger/_multi.py +0 -0
  131. {dblift-2.2.2 → dblift-2.4.0}/core/logger/_null.py +0 -0
  132. {dblift-2.2.2 → dblift-2.4.0}/core/logger/console.py +0 -0
  133. {dblift-2.2.2 → dblift-2.4.0}/core/logger/formatters/__init__.py +0 -0
  134. {dblift-2.2.2 → dblift-2.4.0}/core/logger/formatters/_formatter_impl.py +0 -0
  135. {dblift-2.2.2 → dblift-2.4.0}/core/logger/formatters/factory.py +0 -0
  136. {dblift-2.2.2 → dblift-2.4.0}/core/logger/formatters/formatter.py +0 -0
  137. {dblift-2.2.2 → dblift-2.4.0}/core/logger/formatters/htmlformatter.py +0 -0
  138. {dblift-2.2.2 → dblift-2.4.0}/core/logger/formatters/jsonformatter.py +0 -0
  139. {dblift-2.2.2 → dblift-2.4.0}/core/logger/log.py +0 -0
  140. {dblift-2.2.2 → dblift-2.4.0}/core/logger/results.py +0 -0
  141. {dblift-2.2.2 → dblift-2.4.0}/core/logger/templates/oldreport.html +0 -0
  142. {dblift-2.2.2 → dblift-2.4.0}/core/logger/templates/report.html +0 -0
  143. {dblift-2.2.2 → dblift-2.4.0}/core/migration/__init__.py +0 -0
  144. {dblift-2.2.2 → dblift-2.4.0}/core/migration/_type_match.py +0 -0
  145. {dblift-2.2.2 → dblift-2.4.0}/core/migration/clean_summary.py +0 -0
  146. {dblift-2.2.2 → dblift-2.4.0}/core/migration/commands/__init__.py +0 -0
  147. {dblift-2.2.2 → dblift-2.4.0}/core/migration/commands/_script_events.py +0 -0
  148. {dblift-2.2.2 → dblift-2.4.0}/core/migration/commands/base_command.py +0 -0
  149. {dblift-2.2.2 → dblift-2.4.0}/core/migration/commands/baseline_command.py +0 -0
  150. {dblift-2.2.2 → dblift-2.4.0}/core/migration/commands/clean_command.py +0 -0
  151. {dblift-2.2.2 → dblift-2.4.0}/core/migration/commands/import_flyway_command.py +0 -0
  152. {dblift-2.2.2 → dblift-2.4.0}/core/migration/commands/info_command.py +0 -0
  153. {dblift-2.2.2 → dblift-2.4.0}/core/migration/commands/migrate_command.py +0 -0
  154. {dblift-2.2.2 → dblift-2.4.0}/core/migration/commands/undo_command.py +0 -0
  155. {dblift-2.2.2 → dblift-2.4.0}/core/migration/commands/validate_command.py +0 -0
  156. {dblift-2.2.2 → dblift-2.4.0}/core/migration/encoding.py +0 -0
  157. {dblift-2.2.2 → dblift-2.4.0}/core/migration/executor/__init__.py +0 -0
  158. {dblift-2.2.2 → dblift-2.4.0}/core/migration/executor/execution_engine.py +0 -0
  159. {dblift-2.2.2 → dblift-2.4.0}/core/migration/executor/migration_executor.py +0 -0
  160. {dblift-2.2.2 → dblift-2.4.0}/core/migration/executor/migration_helpers.py +0 -0
  161. {dblift-2.2.2 → dblift-2.4.0}/core/migration/executor/placeholder_manager.py +0 -0
  162. {dblift-2.2.2 → dblift-2.4.0}/core/migration/executor/transaction_policy.py +0 -0
  163. {dblift-2.2.2 → dblift-2.4.0}/core/migration/executors/__init__.py +0 -0
  164. {dblift-2.2.2 → dblift-2.4.0}/core/migration/executors/base_executor.py +0 -0
  165. {dblift-2.2.2 → dblift-2.4.0}/core/migration/executors/executor_factory.py +0 -0
  166. {dblift-2.2.2 → dblift-2.4.0}/core/migration/executors/python_executor.py +0 -0
  167. {dblift-2.2.2 → dblift-2.4.0}/core/migration/executors/sql_executor.py +0 -0
  168. {dblift-2.2.2 → dblift-2.4.0}/core/migration/formats/__init__.py +0 -0
  169. {dblift-2.2.2 → dblift-2.4.0}/core/migration/formats/format_detector.py +0 -0
  170. {dblift-2.2.2 → dblift-2.4.0}/core/migration/formats/migration_format.py +0 -0
  171. {dblift-2.2.2 → dblift-2.4.0}/core/migration/history/__init__.py +0 -0
  172. {dblift-2.2.2 → dblift-2.4.0}/core/migration/history/migration_history_manager.py +0 -0
  173. {dblift-2.2.2 → dblift-2.4.0}/core/migration/journals/__init__.py +0 -0
  174. {dblift-2.2.2 → dblift-2.4.0}/core/migration/journals/migration_journal.py +0 -0
  175. {dblift-2.2.2 → dblift-2.4.0}/core/migration/migration.py +0 -0
  176. {dblift-2.2.2 → dblift-2.4.0}/core/migration/placeholders/__init__.py +0 -0
  177. {dblift-2.2.2 → dblift-2.4.0}/core/migration/placeholders/placeholder_service.py +0 -0
  178. {dblift-2.2.2 → dblift-2.4.0}/core/migration/rules/__init__.py +0 -0
  179. {dblift-2.2.2 → dblift-2.4.0}/core/migration/rules/migration_rules.py +0 -0
  180. {dblift-2.2.2 → dblift-2.4.0}/core/migration/scripting/__init__.py +0 -0
  181. {dblift-2.2.2 → dblift-2.4.0}/core/migration/scripting/migration_script_manager.py +0 -0
  182. {dblift-2.2.2 → dblift-2.4.0}/core/migration/scripting/undo_script_generator/__init__.py +0 -0
  183. {dblift-2.2.2 → dblift-2.4.0}/core/migration/scripting/undo_script_generator/_ddl_reversers.py +0 -0
  184. {dblift-2.2.2 → dblift-2.4.0}/core/migration/scripting/undo_script_generator/_dml_reversers.py +0 -0
  185. {dblift-2.2.2 → dblift-2.4.0}/core/migration/scripting/undo_script_generator/_extractors.py +0 -0
  186. {dblift-2.2.2 → dblift-2.4.0}/core/migration/scripting/undo_script_generator/_generator.py +0 -0
  187. {dblift-2.2.2 → dblift-2.4.0}/core/migration/scripting/undo_script_generator/_helpers.py +0 -0
  188. {dblift-2.2.2 → dblift-2.4.0}/core/migration/scripting/undo_script_generator/_models.py +0 -0
  189. {dblift-2.2.2 → dblift-2.4.0}/core/migration/scripting/undo_script_generator/_reversers.py +0 -0
  190. {dblift-2.2.2 → dblift-2.4.0}/core/migration/sql/__init__.py +0 -0
  191. {dblift-2.2.2 → dblift-2.4.0}/core/migration/sql/execution_statement.py +0 -0
  192. {dblift-2.2.2 → dblift-2.4.0}/core/migration/sql/sql_analyzer.py +0 -0
  193. {dblift-2.2.2 → dblift-2.4.0}/core/migration/sql/sql_execution_service.py +0 -0
  194. {dblift-2.2.2 → dblift-2.4.0}/core/migration/sql/statement_splitter.py +0 -0
  195. {dblift-2.2.2 → dblift-2.4.0}/core/migration/state/__init__.py +0 -0
  196. {dblift-2.2.2 → dblift-2.4.0}/core/migration/state/migration_data_service.py +0 -0
  197. {dblift-2.2.2 → dblift-2.4.0}/core/migration/state/migration_display_state.py +0 -0
  198. {dblift-2.2.2 → dblift-2.4.0}/core/migration/state/migration_formatter.py +0 -0
  199. {dblift-2.2.2 → dblift-2.4.0}/core/migration/state/migration_state.py +0 -0
  200. {dblift-2.2.2 → dblift-2.4.0}/core/migration/state/migration_state_manager.py +0 -0
  201. {dblift-2.2.2 → dblift-2.4.0}/core/migration/state/migration_state_service.py +0 -0
  202. {dblift-2.2.2 → dblift-2.4.0}/core/migration/ui/__init__.py +0 -0
  203. {dblift-2.2.2 → dblift-2.4.0}/core/migration/ui/data_collector.py +0 -0
  204. {dblift-2.2.2 → dblift-2.4.0}/core/migration/ui/display_formatters.py +0 -0
  205. {dblift-2.2.2 → dblift-2.4.0}/core/migration/ui/migration_analyzer.py +0 -0
  206. {dblift-2.2.2 → dblift-2.4.0}/core/migration/ui/migration_ui.py +0 -0
  207. {dblift-2.2.2 → dblift-2.4.0}/core/migration/ui/table_renderer.py +0 -0
  208. {dblift-2.2.2 → dblift-2.4.0}/core/migration/version_utils.py +0 -0
  209. {dblift-2.2.2 → dblift-2.4.0}/core/normalization/__init__.py +0 -0
  210. {dblift-2.2.2 → dblift-2.4.0}/core/normalization/dependency_resolver.py +0 -0
  211. {dblift-2.2.2 → dblift-2.4.0}/core/normalization/identifier_normalizer.py +0 -0
  212. {dblift-2.2.2 → dblift-2.4.0}/core/normalization/object_orderer.py +0 -0
  213. {dblift-2.2.2 → dblift-2.4.0}/core/normalization/type_constants.py +0 -0
  214. {dblift-2.2.2 → dblift-2.4.0}/core/normalization/type_mapper.py +0 -0
  215. {dblift-2.2.2 → dblift-2.4.0}/core/normalization/type_mappings.py +0 -0
  216. {dblift-2.2.2 → dblift-2.4.0}/core/normalization/type_normalizer.py +0 -0
  217. {dblift-2.2.2 → dblift-2.4.0}/core/seams/__init__.py +0 -0
  218. {dblift-2.2.2 → dblift-2.4.0}/core/seams/capabilities.py +0 -0
  219. {dblift-2.2.2 → dblift-2.4.0}/core/seams/event_listeners.py +0 -0
  220. {dblift-2.2.2 → dblift-2.4.0}/core/seams/feature_loading.py +0 -0
  221. {dblift-2.2.2 → dblift-2.4.0}/core/seams/introspection.py +0 -0
  222. {dblift-2.2.2 → dblift-2.4.0}/core/seams/license_info.py +0 -0
  223. {dblift-2.2.2 → dblift-2.4.0}/core/seams/runtime_checks.py +0 -0
  224. {dblift-2.2.2 → dblift-2.4.0}/core/seams/sql_generators.py +0 -0
  225. {dblift-2.2.2 → dblift-2.4.0}/core/seams/tier_resolver.py +0 -0
  226. {dblift-2.2.2 → dblift-2.4.0}/core/sql_generator/__init__.py +0 -0
  227. {dblift-2.2.2 → dblift-2.4.0}/core/sql_generator/alter/__init__.py +0 -0
  228. {dblift-2.2.2 → dblift-2.4.0}/core/sql_generator/alter/alter_generator_factory.py +0 -0
  229. {dblift-2.2.2 → dblift-2.4.0}/core/sql_generator/alter/base_alter_generator.py +0 -0
  230. {dblift-2.2.2 → dblift-2.4.0}/core/sql_generator/alter_generator.py +0 -0
  231. {dblift-2.2.2 → dblift-2.4.0}/core/sql_generator/base_generator.py +0 -0
  232. {dblift-2.2.2 → dblift-2.4.0}/core/sql_generator/basic_table_ddl_generator.py +0 -0
  233. {dblift-2.2.2 → dblift-2.4.0}/core/sql_generator/dependency_analyzer.py +0 -0
  234. {dblift-2.2.2 → dblift-2.4.0}/core/sql_generator/diff_converters/__init__.py +0 -0
  235. {dblift-2.2.2 → dblift-2.4.0}/core/sql_generator/diff_converters/base_converter.py +0 -0
  236. {dblift-2.2.2 → dblift-2.4.0}/core/sql_generator/formatter.py +0 -0
  237. {dblift-2.2.2 → dblift-2.4.0}/core/sql_generator/generator_factory.py +0 -0
  238. {dblift-2.2.2 → dblift-2.4.0}/core/sql_generator/options.py +0 -0
  239. {dblift-2.2.2 → dblift-2.4.0}/core/sql_generator/script_organizer.py +0 -0
  240. {dblift-2.2.2 → dblift-2.4.0}/core/sql_generator/sql_generator.py +0 -0
  241. {dblift-2.2.2 → dblift-2.4.0}/core/sql_generator/sql_statement.py +0 -0
  242. {dblift-2.2.2 → dblift-2.4.0}/core/sql_generator/table_ddl_render.py +0 -0
  243. {dblift-2.2.2 → dblift-2.4.0}/core/sql_model/__init__.py +0 -0
  244. {dblift-2.2.2 → dblift-2.4.0}/core/sql_model/_base_parse_result.py +0 -0
  245. {dblift-2.2.2 → dblift-2.4.0}/core/sql_model/_base_sql_column.py +0 -0
  246. {dblift-2.2.2 → dblift-2.4.0}/core/sql_model/_base_sql_constraint.py +0 -0
  247. {dblift-2.2.2 → dblift-2.4.0}/core/sql_model/_base_sql_object.py +0 -0
  248. {dblift-2.2.2 → dblift-2.4.0}/core/sql_model/_base_sql_statement.py +0 -0
  249. {dblift-2.2.2 → dblift-2.4.0}/core/sql_model/base.py +0 -0
  250. {dblift-2.2.2 → dblift-2.4.0}/core/sql_model/constraint_validator.py +0 -0
  251. {dblift-2.2.2 → dblift-2.4.0}/core/sql_model/database_link.py +0 -0
  252. {dblift-2.2.2 → dblift-2.4.0}/core/sql_model/dialect.py +0 -0
  253. {dblift-2.2.2 → dblift-2.4.0}/core/sql_model/event.py +0 -0
  254. {dblift-2.2.2 → dblift-2.4.0}/core/sql_model/extension.py +0 -0
  255. {dblift-2.2.2 → dblift-2.4.0}/core/sql_model/foreign_data_wrapper.py +0 -0
  256. {dblift-2.2.2 → dblift-2.4.0}/core/sql_model/foreign_server.py +0 -0
  257. {dblift-2.2.2 → dblift-2.4.0}/core/sql_model/index.py +0 -0
  258. {dblift-2.2.2 → dblift-2.4.0}/core/sql_model/linked_server.py +0 -0
  259. {dblift-2.2.2 → dblift-2.4.0}/core/sql_model/module.py +0 -0
  260. {dblift-2.2.2 → dblift-2.4.0}/core/sql_model/package.py +0 -0
  261. {dblift-2.2.2 → dblift-2.4.0}/core/sql_model/partition.py +0 -0
  262. {dblift-2.2.2 → dblift-2.4.0}/core/sql_model/procedure.py +0 -0
  263. {dblift-2.2.2 → dblift-2.4.0}/core/sql_model/sequence.py +0 -0
  264. {dblift-2.2.2 → dblift-2.4.0}/core/sql_model/synonym.py +0 -0
  265. {dblift-2.2.2 → dblift-2.4.0}/core/sql_model/table.py +0 -0
  266. {dblift-2.2.2 → dblift-2.4.0}/core/sql_model/table_canonicalizer.py +0 -0
  267. {dblift-2.2.2 → dblift-2.4.0}/core/sql_model/table_options.py +0 -0
  268. {dblift-2.2.2 → dblift-2.4.0}/core/sql_model/trigger.py +0 -0
  269. {dblift-2.2.2 → dblift-2.4.0}/core/sql_model/user_defined_type.py +0 -0
  270. {dblift-2.2.2 → dblift-2.4.0}/core/sql_model/view.py +0 -0
  271. {dblift-2.2.2 → dblift-2.4.0}/core/sql_model/view_options.py +0 -0
  272. {dblift-2.2.2 → dblift-2.4.0}/core/sql_parser/__init__.py +0 -0
  273. {dblift-2.2.2 → dblift-2.4.0}/core/sql_parser/_partition_handler.py +0 -0
  274. {dblift-2.2.2 → dblift-2.4.0}/core/sql_parser/_sqlglot_builders.py +0 -0
  275. {dblift-2.2.2 → dblift-2.4.0}/core/sql_parser/base_statement_parser.py +0 -0
  276. {dblift-2.2.2 → dblift-2.4.0}/core/sql_parser/base_tokenizer.py +0 -0
  277. {dblift-2.2.2 → dblift-2.4.0}/core/sql_parser/common/__init__.py +0 -0
  278. {dblift-2.2.2 → dblift-2.4.0}/core/sql_parser/common/base_parser.py +0 -0
  279. {dblift-2.2.2 → dblift-2.4.0}/core/sql_parser/dialects/__init__.py +0 -0
  280. {dblift-2.2.2 → dblift-2.4.0}/core/sql_parser/dialects/base_config.py +0 -0
  281. {dblift-2.2.2 → dblift-2.4.0}/core/sql_parser/enhanced_regex_parser.py +0 -0
  282. {dblift-2.2.2 → dblift-2.4.0}/core/sql_parser/hybrid_parser.py +0 -0
  283. {dblift-2.2.2 → dblift-2.4.0}/core/sql_parser/parser_context.py +0 -0
  284. {dblift-2.2.2 → dblift-2.4.0}/core/sql_parser/parser_factory.py +0 -0
  285. {dblift-2.2.2 → dblift-2.4.0}/core/sql_parser/parser_interface.py +0 -0
  286. {dblift-2.2.2 → dblift-2.4.0}/core/sql_parser/sqlglot_parser.py +0 -0
  287. {dblift-2.2.2 → dblift-2.4.0}/core/sql_parser/tokens.py +0 -0
  288. {dblift-2.2.2 → dblift-2.4.0}/core/sql_parser/unified_regex_parser.py +0 -0
  289. {dblift-2.2.2 → dblift-2.4.0}/core/sql_validator/__init__.py +0 -0
  290. {dblift-2.2.2 → dblift-2.4.0}/core/sql_validator/_checksum_validator.py +0 -0
  291. {dblift-2.2.2 → dblift-2.4.0}/core/sql_validator/_flyway_compatibility.py +0 -0
  292. {dblift-2.2.2 → dblift-2.4.0}/core/sql_validator/_migration_filter.py +0 -0
  293. {dblift-2.2.2 → dblift-2.4.0}/core/sql_validator/_sql_syntax_validator.py +0 -0
  294. {dblift-2.2.2 → dblift-2.4.0}/core/sql_validator/_strict_mode_validator.py +0 -0
  295. {dblift-2.2.2 → dblift-2.4.0}/core/sql_validator/migration_validator.py +0 -0
  296. {dblift-2.2.2 → dblift-2.4.0}/core/state/sql_script_formatter.py +0 -0
  297. {dblift-2.2.2 → dblift-2.4.0}/core/state/sql_statement.py +0 -0
  298. {dblift-2.2.2 → dblift-2.4.0}/core/utils/__init__.py +0 -0
  299. {dblift-2.2.2 → dblift-2.4.0}/core/utils/database_url_parser.py +0 -0
  300. {dblift-2.2.2 → dblift-2.4.0}/core/utils/metadata_helpers.py +0 -0
  301. {dblift-2.2.2 → dblift-2.4.0}/core/utils/row_access.py +0 -0
  302. {dblift-2.2.2 → dblift-2.4.0}/core/utils/string_utils.py +0 -0
  303. {dblift-2.2.2 → dblift-2.4.0}/core/utils/url_masking.py +0 -0
  304. {dblift-2.2.2 → dblift-2.4.0}/db/__init__.py +0 -0
  305. {dblift-2.2.2 → dblift-2.4.0}/db/base_provider.py +0 -0
  306. {dblift-2.2.2 → dblift-2.4.0}/db/base_quirks.py +0 -0
  307. {dblift-2.2.2 → dblift-2.4.0}/db/constants.py +0 -0
  308. {dblift-2.2.2 → dblift-2.4.0}/db/dml_analysis.py +0 -0
  309. {dblift-2.2.2 → dblift-2.4.0}/db/error.py +0 -0
  310. {dblift-2.2.2 → dblift-2.4.0}/db/error_handler.py +0 -0
  311. {dblift-2.2.2 → dblift-2.4.0}/db/exceptions.py +0 -0
  312. {dblift-2.2.2 → dblift-2.4.0}/db/native_connection_manager.py +0 -0
  313. {dblift-2.2.2 → dblift-2.4.0}/db/object_naming.py +0 -0
  314. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/__init__.py +0 -0
  315. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/base_history_manager.py +0 -0
  316. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/base_locking_manager.py +0 -0
  317. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/base_query_executor.py +0 -0
  318. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/base_schema_operations.py +0 -0
  319. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/base_snapshot_manager.py +0 -0
  320. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/base_undo_manager.py +0 -0
  321. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/cosmosdb/__init__.py +0 -0
  322. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/cosmosdb/config.py +0 -0
  323. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/cosmosdb/cosmosdb/__init__.py +0 -0
  324. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/cosmosdb/cosmosdb/_sdk.py +0 -0
  325. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/cosmosdb/cosmosdb/connection_manager.py +0 -0
  326. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/cosmosdb/cosmosdb/history_manager.py +0 -0
  327. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/cosmosdb/cosmosdb/locking_manager.py +0 -0
  328. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/cosmosdb/cosmosdb/query_executor.py +0 -0
  329. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/cosmosdb/cosmosdb/schema_operations.py +0 -0
  330. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/cosmosdb/introspection/__init__.py +0 -0
  331. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/cosmosdb/parser/__init__.py +0 -0
  332. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/cosmosdb/parser/cosmosdb_regex_parser.py +0 -0
  333. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/cosmosdb/plugin.py +0 -0
  334. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/cosmosdb/provider.py +0 -0
  335. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/cosmosdb/quirks.py +0 -0
  336. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/cosmosdb/sdk_translator/__init__.py +0 -0
  337. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/cosmosdb/sdk_translator/_executor.py +0 -0
  338. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/cosmosdb/sdk_translator/_executors.py +0 -0
  339. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/cosmosdb/sdk_translator/_parsing.py +0 -0
  340. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/cosmosdb/sdk_translator/_script_generation.py +0 -0
  341. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/cosmosdb/sdk_translator/_translator.py +0 -0
  342. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/cosmosdb/sdk_translator/_translators.py +0 -0
  343. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/db2/__init__.py +0 -0
  344. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/db2/config.py +0 -0
  345. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/db2/db2/__init__.py +0 -0
  346. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/db2/db2/history_manager.py +0 -0
  347. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/db2/db2/locking_manager.py +0 -0
  348. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/db2/db2/schema_operations.py +0 -0
  349. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/db2/introspection/__init__.py +0 -0
  350. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/db2/parser/__init__.py +0 -0
  351. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/db2/parser/db2_regex_parser.py +0 -0
  352. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/db2/parser/parser_config.py +0 -0
  353. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/db2/plugin.py +0 -0
  354. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/db2/provider.py +0 -0
  355. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/db2/quirks.py +0 -0
  356. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/db2/sqlalchemy_url.py +0 -0
  357. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/mariadb/__init__.py +0 -0
  358. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/mariadb/plugin.py +0 -0
  359. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/mariadb/provider.py +0 -0
  360. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/mariadb/quirks.py +0 -0
  361. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/mysql/__init__.py +0 -0
  362. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/mysql/config.py +0 -0
  363. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/mysql/introspection/__init__.py +0 -0
  364. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/mysql/mysql/__init__.py +0 -0
  365. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/mysql/mysql/history_manager.py +0 -0
  366. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/mysql/mysql/locking_manager.py +0 -0
  367. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/mysql/mysql/schema_operations.py +0 -0
  368. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/mysql/parser/__init__.py +0 -0
  369. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/mysql/parser/mysql_regex_parser.py +0 -0
  370. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/mysql/parser/mysql_statement_parser.py +0 -0
  371. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/mysql/parser/mysql_tokenizer.py +0 -0
  372. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/mysql/parser/parser_config.py +0 -0
  373. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/mysql/plugin.py +0 -0
  374. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/mysql/provider.py +0 -0
  375. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/mysql/quirks.py +0 -0
  376. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/mysql/sqlalchemy_url.py +0 -0
  377. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/oracle/__init__.py +0 -0
  378. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/oracle/config.py +0 -0
  379. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/oracle/introspection/__init__.py +0 -0
  380. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/oracle/introspection/oracle_utils.py +0 -0
  381. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/oracle/oracle/__init__.py +0 -0
  382. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/oracle/oracle/dbms_output.py +0 -0
  383. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/oracle/oracle/history_manager.py +0 -0
  384. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/oracle/oracle/locking_manager.py +0 -0
  385. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/oracle/oracle/schema_operations.py +0 -0
  386. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/oracle/parser/__init__.py +0 -0
  387. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/oracle/parser/_comments.py +0 -0
  388. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/oracle/parser/_object_extractor.py +0 -0
  389. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/oracle/parser/_plsql_block.py +0 -0
  390. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/oracle/parser/_sqlplus.py +0 -0
  391. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/oracle/parser/_statement_splitter.py +0 -0
  392. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/oracle/parser/oracle_parser.py +0 -0
  393. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/oracle/parser/oracle_statement_parser.py +0 -0
  394. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/oracle/parser/oracle_tokenizer.py +0 -0
  395. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/oracle/parser/parser_config.py +0 -0
  396. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/oracle/parser/sqlplus_context.py +0 -0
  397. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/oracle/plugin.py +0 -0
  398. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/oracle/provider.py +0 -0
  399. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/oracle/quirks.py +0 -0
  400. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/oracle/sqlalchemy_url.py +0 -0
  401. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/postgresql/__init__.py +0 -0
  402. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/postgresql/_provider_query_executor.py +0 -0
  403. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/postgresql/introspection/__init__.py +0 -0
  404. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/postgresql/parser/__init__.py +0 -0
  405. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/postgresql/parser/parser_config.py +0 -0
  406. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/postgresql/parser/postgresql_regex_parser.py +0 -0
  407. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/postgresql/parser/postgresql_statement_parser.py +0 -0
  408. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/postgresql/parser/postgresql_tokenizer.py +0 -0
  409. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/postgresql/plugin.py +0 -0
  410. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/postgresql/postgresql/__init__.py +0 -0
  411. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/postgresql/postgresql/history_manager.py +0 -0
  412. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/postgresql/postgresql/locking_manager.py +0 -0
  413. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/postgresql/postgresql/schema_operations.py +0 -0
  414. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/postgresql/provider.py +0 -0
  415. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/postgresql/quirks.py +0 -0
  416. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/postgresql/sqlalchemy_url.py +0 -0
  417. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlite/__init__.py +0 -0
  418. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlite/config.py +0 -0
  419. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlite/introspection/__init__.py +0 -0
  420. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlite/parser/__init__.py +0 -0
  421. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlite/parser/parser_config.py +0 -0
  422. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlite/parser/sqlite_regex_parser.py +0 -0
  423. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlite/plugin.py +0 -0
  424. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlite/provider.py +0 -0
  425. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlite/quirks.py +0 -0
  426. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlite/sqlalchemy_url.py +0 -0
  427. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlite/sqlite/__init__.py +0 -0
  428. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlite/sqlite/connection_manager.py +0 -0
  429. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlite/sqlite/history_manager.py +0 -0
  430. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlite/sqlite/locking_manager.py +0 -0
  431. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlite/sqlite/query_executor.py +0 -0
  432. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlite/sqlite/schema_operations.py +0 -0
  433. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlserver/__init__.py +0 -0
  434. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlserver/config.py +0 -0
  435. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlserver/introspection/__init__.py +0 -0
  436. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlserver/parser/__init__.py +0 -0
  437. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlserver/parser/parser_config.py +0 -0
  438. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlserver/parser/sqlserver_regex_parser.py +0 -0
  439. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlserver/parser/sqlserver_statement_parser.py +0 -0
  440. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlserver/parser/sqlserver_tokenizer.py +0 -0
  441. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlserver/parser/tsql_batch_separator.py +0 -0
  442. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlserver/plugin.py +0 -0
  443. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlserver/provider.py +0 -0
  444. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlserver/quirks.py +0 -0
  445. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlserver/sqlalchemy_url.py +0 -0
  446. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlserver/sqlserver/__init__.py +0 -0
  447. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlserver/sqlserver/history_manager.py +0 -0
  448. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlserver/sqlserver/locking_manager.py +0 -0
  449. {dblift-2.2.2 → dblift-2.4.0}/db/plugins/sqlserver/sqlserver/schema_operations.py +0 -0
  450. {dblift-2.2.2 → dblift-2.4.0}/db/provider_capabilities.py +0 -0
  451. {dblift-2.2.2 → dblift-2.4.0}/db/provider_interfaces.py +0 -0
  452. {dblift-2.2.2 → dblift-2.4.0}/db/provider_registry.py +0 -0
  453. {dblift-2.2.2 → dblift-2.4.0}/db/value_utils.py +0 -0
  454. {dblift-2.2.2 → dblift-2.4.0}/dblift.egg-info/dependency_links.txt +0 -0
  455. {dblift-2.2.2 → dblift-2.4.0}/dblift.egg-info/top_level.txt +0 -0
  456. {dblift-2.2.2 → dblift-2.4.0}/integrations/__init__.py +0 -0
  457. {dblift-2.2.2 → dblift-2.4.0}/integrations/django/__init__.py +0 -0
  458. {dblift-2.2.2 → dblift-2.4.0}/integrations/django/_client.py +0 -0
  459. {dblift-2.2.2 → dblift-2.4.0}/integrations/django/_engine.py +0 -0
  460. {dblift-2.2.2 → dblift-2.4.0}/integrations/django/apps.py +0 -0
  461. {dblift-2.2.2 → dblift-2.4.0}/integrations/django/checks.py +0 -0
  462. {dblift-2.2.2 → dblift-2.4.0}/integrations/django/management/__init__.py +0 -0
  463. {dblift-2.2.2 → dblift-2.4.0}/integrations/django/management/commands/__init__.py +0 -0
  464. {dblift-2.2.2 → dblift-2.4.0}/integrations/django/management/commands/dblift_info.py +0 -0
  465. {dblift-2.2.2 → dblift-2.4.0}/integrations/django/management/commands/dblift_migrate.py +0 -0
  466. {dblift-2.2.2 → dblift-2.4.0}/integrations/django/management/commands/dblift_validate.py +0 -0
  467. {dblift-2.2.2 → dblift-2.4.0}/integrations/fastapi.py +0 -0
  468. {dblift-2.2.2 → dblift-2.4.0}/integrations/flask.py +0 -0
  469. {dblift-2.2.2 → dblift-2.4.0}/integrations/opentelemetry.py +0 -0
  470. {dblift-2.2.2 → dblift-2.4.0}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dblift
3
- Version: 2.2.2
3
+ Version: 2.4.0
4
4
  Summary: A database migration tool that supports multiple databases with native Python drivers
5
5
  Classifier: Development Status :: 5 - Production/Stable
6
6
  Classifier: Intended Audience :: Developers
@@ -66,6 +66,23 @@ Requires-Dist: pymssql>=2.3; extra == "sqlserver"
66
66
  Provides-Extra: db2
67
67
  Requires-Dist: ibm_db>=3.2; extra == "db2"
68
68
  Requires-Dist: ibm_db_sa>=0.4; extra == "db2"
69
+ Provides-Extra: duckdb
70
+ Requires-Dist: duckdb>=1.0; extra == "duckdb"
71
+ Requires-Dist: duckdb_engine>=0.13; extra == "duckdb"
72
+ Provides-Extra: neon
73
+ Requires-Dist: psycopg[binary]>=3.1; extra == "neon"
74
+ Provides-Extra: supabase
75
+ Requires-Dist: psycopg[binary]>=3.1; extra == "supabase"
76
+ Provides-Extra: aurora-postgresql
77
+ Requires-Dist: psycopg[binary]>=3.1; extra == "aurora-postgresql"
78
+ Provides-Extra: alloydb
79
+ Requires-Dist: psycopg[binary]>=3.1; extra == "alloydb"
80
+ Provides-Extra: yugabytedb
81
+ Requires-Dist: psycopg[binary]>=3.1; extra == "yugabytedb"
82
+ Provides-Extra: timescaledb
83
+ Requires-Dist: psycopg[binary]>=3.1; extra == "timescaledb"
84
+ Provides-Extra: citus
85
+ Requires-Dist: psycopg[binary]>=3.1; extra == "citus"
69
86
  Provides-Extra: fastapi
70
87
  Requires-Dist: fastapi>=0.100; extra == "fastapi"
71
88
  Provides-Extra: flask
@@ -75,7 +92,7 @@ Requires-Dist: Django>=4.2; extra == "django"
75
92
  Provides-Extra: otel
76
93
  Requires-Dist: opentelemetry-api>=1.20; extra == "otel"
77
94
  Provides-Extra: all
78
- Requires-Dist: dblift[db2,mariadb,mysql,oracle,postgresql,sqlserver]; extra == "all"
95
+ Requires-Dist: dblift[db2,duckdb,mariadb,mysql,oracle,postgresql,sqlserver]; extra == "all"
79
96
  Dynamic: license-file
80
97
 
81
98
  # DBLift — Database release safety for Python teams
@@ -145,6 +145,44 @@ class _CliContext:
145
145
  license_info: Optional[Any] = None
146
146
 
147
147
 
148
+ def _format_version() -> str:
149
+ """Render the ``--version`` output.
150
+
151
+ The published ``dblift`` wheel is the OSS *core*. The paid tiers ship as
152
+ separate distributions (``dblift-pro`` / ``dblift-enterprise``) bundled into
153
+ the compiled binary, each on its own release lifecycle — so their versions
154
+ need not match the core's. Report the most-derived installed tier as the
155
+ headline (that is the product the user actually runs) and, when a paid tier
156
+ is present, list every component so a bare number is never ambiguous. In a
157
+ plain OSS install only the core is present, so the output stays a single
158
+ ``dblift version X`` line — unchanged from before.
159
+ """
160
+ from importlib.metadata import PackageNotFoundError
161
+ from importlib.metadata import version as _version
162
+
163
+ def _get(dist: str) -> Optional[str]:
164
+ try:
165
+ return _version(dist)
166
+ except PackageNotFoundError:
167
+ return None
168
+
169
+ core = _get("dblift")
170
+ pro = _get("dblift-pro")
171
+ enterprise = _get("dblift-enterprise")
172
+
173
+ # Headline = most-derived installed tier (the product actually running).
174
+ product = enterprise or pro or core
175
+ lines = [f"dblift version {product}"]
176
+ # Component manifest only when a paid tier is present; OSS stays one line.
177
+ if pro or enterprise:
178
+ lines.append(f" core (OSS): {core}")
179
+ if pro:
180
+ lines.append(f" pro: {pro}")
181
+ if enterprise:
182
+ lines.append(f" enterprise: {enterprise}")
183
+ return "\n".join(lines)
184
+
185
+
148
186
  def main() -> None:
149
187
  """Main entry point for DBLift CLI application.
150
188
 
@@ -211,22 +249,14 @@ def _parse_argv_and_load_config(argv: List[str]) -> _CliContext:
211
249
  if commands and commands[0] in terminal_commands:
212
250
  args = _build_terminal_args(commands[0], global_arguments, subcommand_args)
213
251
  if hasattr(args, "version") and args.version:
214
- from importlib.metadata import version as _version
215
-
216
- __version__ = _version("dblift")
217
-
218
- print(f"dblift version {__version__}") # lint: allow-print --version terminal action
252
+ print(_format_version()) # lint: allow-print --version terminal action
219
253
  sys.exit(0)
220
254
  sys.exit(terminal_commands[commands[0]](args))
221
255
 
222
256
  args, _unknown_args = _build_args_namespace(commands, global_arguments, subcommand_args)
223
257
 
224
258
  if hasattr(args, "version") and args.version:
225
- from importlib.metadata import version as _version
226
-
227
- __version__ = _version("dblift")
228
-
229
- print(f"dblift version {__version__}") # lint: allow-print --version terminal action
259
+ print(_format_version()) # lint: allow-print --version terminal action
230
260
  sys.exit(0)
231
261
 
232
262
  if not commands and (not hasattr(args, "command") or not args.command):
@@ -498,7 +498,23 @@ class RepairCommand(BaseCommand):
498
498
  params=[script_name],
499
499
  )
500
500
 
501
- if rows_affected > 0:
501
+ row_removed = rows_affected > 0
502
+ if (
503
+ rows_affected < 0
504
+ and not is_non_transactional
505
+ and hasattr(self.provider, "execute_query")
506
+ ):
507
+ # Some DBAPIs report an "unknown" rowcount of -1 for DML
508
+ # (e.g. duckdb_engine), so ``rows_affected > 0`` would wrongly
509
+ # read as "nothing removed". Verify the failed row is gone.
510
+ remaining = self.provider.execute_query(
511
+ f"SELECT 1 FROM {qualified_table} "
512
+ f"WHERE script = ? AND success = {false_literal}",
513
+ [script_name],
514
+ )
515
+ row_removed = not remaining
516
+
517
+ if row_removed:
502
518
  result.failed_migrations_removed = (
503
519
  getattr(result, "failed_migrations_removed", 0) + 1
504
520
  )
@@ -0,0 +1,12 @@
1
+ """Google AlloyDB for PostgreSQL database provider plugin (PostgreSQL-compatible)."""
2
+
3
+ __plugin_name__ = "alloydb"
4
+ __plugin_version__ = "1.0.0"
5
+ __plugin_description__ = "Google AlloyDB for PostgreSQL database provider"
6
+ __plugin_dialects__ = ["alloydb"]
7
+ __plugin_transport__ = "native"
8
+ __plugin_class__ = "AlloydbProvider"
9
+
10
+ from .provider import AlloydbProvider
11
+
12
+ __all__ = ["AlloydbProvider"]
@@ -0,0 +1,28 @@
1
+ """Entry-point declaration for the Google AlloyDB for PostgreSQL plugin.
2
+
3
+ Google AlloyDB for PostgreSQL is wire-compatible with PostgreSQL: this plugin reuses PostgreSQL's
4
+ config class (``config_dialect="postgresql"``), SQLAlchemy URL builder, and
5
+ ``psycopg`` driver, attaching only a distinct identity + quirks subclass. Users
6
+ keep their ``postgresql://`` connection string and select this engine via
7
+ ``type: alloydb``.
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ from db.plugins.alloydb.provider import AlloydbProvider
13
+ from db.plugins.alloydb.quirks import AlloydbQuirks
14
+ from db.plugins.postgresql.sqlalchemy_url import build_sqlalchemy_url
15
+ from db.provider_registry import PluginInfo
16
+
17
+ PLUGIN: PluginInfo = PluginInfo(
18
+ name="alloydb",
19
+ version="1.0.0",
20
+ description="Google AlloyDB for PostgreSQL database provider",
21
+ dialects=["alloydb"],
22
+ provider_class=AlloydbProvider,
23
+ transport="native",
24
+ quirks_class=AlloydbQuirks,
25
+ config_dialect="postgresql", # Google AlloyDB for PostgreSQL shares PostgreSQL's config class
26
+ sqlalchemy_url_builder=build_sqlalchemy_url,
27
+ native_driver_module="psycopg",
28
+ )
@@ -0,0 +1,14 @@
1
+ """Google AlloyDB for PostgreSQL native provider (PostgreSQL-compatible)."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from db.plugins.postgresql.provider import PostgreSqlProvider
6
+
7
+
8
+ class AlloydbProvider(PostgreSqlProvider):
9
+ """Google AlloyDB for PostgreSQL — wire-compatible with PostgreSQL; reuses the PostgreSQL provider."""
10
+
11
+ canonical_dialect_key = "alloydb"
12
+
13
+
14
+ __all__ = ["AlloydbProvider"]
@@ -0,0 +1,32 @@
1
+ """Google AlloyDB for PostgreSQL :class:`DialectQuirks` — inherits PostgreSQL behavior."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from db.plugins.postgresql.quirks import PostgresqlQuirks
6
+
7
+
8
+ class AlloydbQuirks(PostgresqlQuirks):
9
+ """Google AlloyDB for PostgreSQL quirks, inheriting every PostgreSQL quirk.
10
+
11
+ Google AlloyDB for PostgreSQL speaks the PostgreSQL wire protocol, so statement splitting,
12
+ rendering, comparison, and introspection all reuse PostgreSQL's behavior.
13
+ Only the ANSI-reference flag is overridden: exactly one registered plugin
14
+ (PostgreSQL) may be the reference dialect, so PostgreSQL-derived plugins
15
+ must not re-claim it. Engine-specific deviations land here if and when the
16
+ codebase needs them.
17
+ """
18
+
19
+ # Exactly one plugin owns the ANSI reference dialect (PostgreSQL); a
20
+ # PG-derived plugin that inherited ``True`` would break
21
+ # ``ProviderRegistry.reference_dialect_name`` (which requires a single
22
+ # winner), so reset it here.
23
+ is_ansi_reference_dialect = False
24
+ # PostgreSQL is likewise the single owner of the sqlglot read-dialect
25
+ # fallback; a PG-derived plugin must not claim it either.
26
+ is_default_sqlglot_read_fallback = False
27
+
28
+ def __init__(self, dialect_name: str = "alloydb") -> None:
29
+ super().__init__(dialect_name=dialect_name)
30
+
31
+
32
+ __all__ = ["AlloydbQuirks"]
@@ -0,0 +1,12 @@
1
+ """Amazon Aurora PostgreSQL database provider plugin (PostgreSQL-compatible)."""
2
+
3
+ __plugin_name__ = "aurora-postgresql"
4
+ __plugin_version__ = "1.0.0"
5
+ __plugin_description__ = "Amazon Aurora PostgreSQL database provider"
6
+ __plugin_dialects__ = ["aurora-postgresql"]
7
+ __plugin_transport__ = "native"
8
+ __plugin_class__ = "AuroraPostgresqlProvider"
9
+
10
+ from .provider import AuroraPostgresqlProvider
11
+
12
+ __all__ = ["AuroraPostgresqlProvider"]
@@ -0,0 +1,28 @@
1
+ """Entry-point declaration for the Amazon Aurora PostgreSQL plugin.
2
+
3
+ Amazon Aurora PostgreSQL is wire-compatible with PostgreSQL: this plugin reuses PostgreSQL's
4
+ config class (``config_dialect="postgresql"``), SQLAlchemy URL builder, and
5
+ ``psycopg`` driver, attaching only a distinct identity + quirks subclass. Users
6
+ keep their ``postgresql://`` connection string and select this engine via
7
+ ``type: aurora-postgresql``.
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ from db.plugins.aurora_postgresql.provider import AuroraPostgresqlProvider
13
+ from db.plugins.aurora_postgresql.quirks import AuroraPostgresqlQuirks
14
+ from db.plugins.postgresql.sqlalchemy_url import build_sqlalchemy_url
15
+ from db.provider_registry import PluginInfo
16
+
17
+ PLUGIN: PluginInfo = PluginInfo(
18
+ name="aurora-postgresql",
19
+ version="1.0.0",
20
+ description="Amazon Aurora PostgreSQL database provider",
21
+ dialects=["aurora-postgresql"],
22
+ provider_class=AuroraPostgresqlProvider,
23
+ transport="native",
24
+ quirks_class=AuroraPostgresqlQuirks,
25
+ config_dialect="postgresql", # Amazon Aurora PostgreSQL shares PostgreSQL's config class
26
+ sqlalchemy_url_builder=build_sqlalchemy_url,
27
+ native_driver_module="psycopg",
28
+ )
@@ -0,0 +1,14 @@
1
+ """Amazon Aurora PostgreSQL native provider (PostgreSQL-compatible)."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from db.plugins.postgresql.provider import PostgreSqlProvider
6
+
7
+
8
+ class AuroraPostgresqlProvider(PostgreSqlProvider):
9
+ """Amazon Aurora PostgreSQL — wire-compatible with PostgreSQL; reuses the PostgreSQL provider."""
10
+
11
+ canonical_dialect_key = "aurora-postgresql"
12
+
13
+
14
+ __all__ = ["AuroraPostgresqlProvider"]
@@ -0,0 +1,32 @@
1
+ """Amazon Aurora PostgreSQL :class:`DialectQuirks` — inherits PostgreSQL behavior."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from db.plugins.postgresql.quirks import PostgresqlQuirks
6
+
7
+
8
+ class AuroraPostgresqlQuirks(PostgresqlQuirks):
9
+ """Amazon Aurora PostgreSQL quirks, inheriting every PostgreSQL quirk.
10
+
11
+ Amazon Aurora PostgreSQL speaks the PostgreSQL wire protocol, so statement splitting,
12
+ rendering, comparison, and introspection all reuse PostgreSQL's behavior.
13
+ Only the ANSI-reference flag is overridden: exactly one registered plugin
14
+ (PostgreSQL) may be the reference dialect, so PostgreSQL-derived plugins
15
+ must not re-claim it. Engine-specific deviations land here if and when the
16
+ codebase needs them.
17
+ """
18
+
19
+ # Exactly one plugin owns the ANSI reference dialect (PostgreSQL); a
20
+ # PG-derived plugin that inherited ``True`` would break
21
+ # ``ProviderRegistry.reference_dialect_name`` (which requires a single
22
+ # winner), so reset it here.
23
+ is_ansi_reference_dialect = False
24
+ # PostgreSQL is likewise the single owner of the sqlglot read-dialect
25
+ # fallback; a PG-derived plugin must not claim it either.
26
+ is_default_sqlglot_read_fallback = False
27
+
28
+ def __init__(self, dialect_name: str = "aurora-postgresql") -> None:
29
+ super().__init__(dialect_name=dialect_name)
30
+
31
+
32
+ __all__ = ["AuroraPostgresqlQuirks"]
@@ -0,0 +1,12 @@
1
+ """Citus (distributed PostgreSQL) database provider plugin (PostgreSQL-compatible)."""
2
+
3
+ __plugin_name__ = "citus"
4
+ __plugin_version__ = "1.0.0"
5
+ __plugin_description__ = "Citus (distributed PostgreSQL) database provider"
6
+ __plugin_dialects__ = ["citus"]
7
+ __plugin_transport__ = "native"
8
+ __plugin_class__ = "CitusProvider"
9
+
10
+ from .provider import CitusProvider
11
+
12
+ __all__ = ["CitusProvider"]
@@ -0,0 +1,28 @@
1
+ """Entry-point declaration for the Citus (distributed PostgreSQL) plugin.
2
+
3
+ Citus (distributed PostgreSQL) is wire-compatible with PostgreSQL: this plugin reuses PostgreSQL's
4
+ config class (``config_dialect="postgresql"``), SQLAlchemy URL builder, and
5
+ ``psycopg`` driver, attaching only a distinct identity + quirks subclass. Users
6
+ keep their ``postgresql://`` connection string and select this engine via
7
+ ``type: citus``.
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ from db.plugins.citus.provider import CitusProvider
13
+ from db.plugins.citus.quirks import CitusQuirks
14
+ from db.plugins.postgresql.sqlalchemy_url import build_sqlalchemy_url
15
+ from db.provider_registry import PluginInfo
16
+
17
+ PLUGIN: PluginInfo = PluginInfo(
18
+ name="citus",
19
+ version="1.0.0",
20
+ description="Citus (distributed PostgreSQL) database provider",
21
+ dialects=["citus"],
22
+ provider_class=CitusProvider,
23
+ transport="native",
24
+ quirks_class=CitusQuirks,
25
+ config_dialect="postgresql", # Citus (distributed PostgreSQL) shares PostgreSQL's config class
26
+ sqlalchemy_url_builder=build_sqlalchemy_url,
27
+ native_driver_module="psycopg",
28
+ )
@@ -0,0 +1,14 @@
1
+ """Citus (distributed PostgreSQL) native provider (PostgreSQL-compatible)."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from db.plugins.postgresql.provider import PostgreSqlProvider
6
+
7
+
8
+ class CitusProvider(PostgreSqlProvider):
9
+ """Citus (distributed PostgreSQL) — wire-compatible with PostgreSQL; reuses the PostgreSQL provider."""
10
+
11
+ canonical_dialect_key = "citus"
12
+
13
+
14
+ __all__ = ["CitusProvider"]
@@ -0,0 +1,32 @@
1
+ """Citus (distributed PostgreSQL) :class:`DialectQuirks` — inherits PostgreSQL behavior."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from db.plugins.postgresql.quirks import PostgresqlQuirks
6
+
7
+
8
+ class CitusQuirks(PostgresqlQuirks):
9
+ """Citus (distributed PostgreSQL) quirks, inheriting every PostgreSQL quirk.
10
+
11
+ Citus (distributed PostgreSQL) speaks the PostgreSQL wire protocol, so statement splitting,
12
+ rendering, comparison, and introspection all reuse PostgreSQL's behavior.
13
+ Only the ANSI-reference flag is overridden: exactly one registered plugin
14
+ (PostgreSQL) may be the reference dialect, so PostgreSQL-derived plugins
15
+ must not re-claim it. Engine-specific deviations land here if and when the
16
+ codebase needs them.
17
+ """
18
+
19
+ # Exactly one plugin owns the ANSI reference dialect (PostgreSQL); a
20
+ # PG-derived plugin that inherited ``True`` would break
21
+ # ``ProviderRegistry.reference_dialect_name`` (which requires a single
22
+ # winner), so reset it here.
23
+ is_ansi_reference_dialect = False
24
+ # PostgreSQL is likewise the single owner of the sqlglot read-dialect
25
+ # fallback; a PG-derived plugin must not claim it either.
26
+ is_default_sqlglot_read_fallback = False
27
+
28
+ def __init__(self, dialect_name: str = "citus") -> None:
29
+ super().__init__(dialect_name=dialect_name)
30
+
31
+
32
+ __all__ = ["CitusQuirks"]
@@ -0,0 +1,12 @@
1
+ """DuckDB database provider plugin."""
2
+
3
+ __plugin_name__ = "duckdb"
4
+ __plugin_version__ = "1.0.0"
5
+ __plugin_description__ = "DuckDB database provider (SQLAlchemy via duckdb_engine)"
6
+ __plugin_dialects__ = ["duckdb"]
7
+ __plugin_transport__ = "native"
8
+ __plugin_class__ = "DuckDBProvider"
9
+
10
+ from .provider import DuckDBProvider
11
+
12
+ __all__ = ["DuckDBProvider"]
@@ -0,0 +1,81 @@
1
+ """DuckDB-specific ``BaseDatabaseConfig`` subclass."""
2
+
3
+ from dataclasses import dataclass
4
+ from typing import Any, Dict, Optional
5
+
6
+ from config.database_config import BaseDatabaseConfig, register_database_type
7
+
8
+
9
+ # lint: allow-dialect-string: config type registration
10
+ @register_database_type("duckdb")
11
+ @dataclass
12
+ class DuckDBConfig(BaseDatabaseConfig):
13
+ """Configuration for DuckDB connections.
14
+
15
+ DuckDB is embedded/file-based (like SQLite): no server, no
16
+ credentials, ``"main"`` default schema. Connections resolve to a
17
+ file path (or ``:memory:``) rather than a host/port.
18
+ """
19
+
20
+ # DuckDB specific fields
21
+ path: Optional[str] = None # Path to the DuckDB file (or :memory: for in-memory)
22
+
23
+ def __post_init__(self) -> None:
24
+ """Resolve the file path from path/url/database and apply defaults."""
25
+ super().__post_init__()
26
+
27
+ if not self.path:
28
+ if self.url:
29
+ url = self.url
30
+ if url.startswith("duckdb://"):
31
+ # Match duckdb_engine's URL convention:
32
+ # duckdb:///rel.db (3 slashes) -> relative "rel.db"
33
+ # duckdb:////abs.db (4 slashes) -> absolute "/abs.db"
34
+ # duckdb:///:memory: -> ":memory:"
35
+ self.path = url[len("duckdb://") :]
36
+ if self.path in ("/:memory:", ":memory:"):
37
+ self.path = ":memory:"
38
+ elif self.path.startswith("//"):
39
+ self.path = "/" + self.path.lstrip("/")
40
+ elif self.path.startswith("/"):
41
+ self.path = self.path[1:]
42
+ else:
43
+ self.path = url
44
+ elif self.database:
45
+ self.path = self.database
46
+
47
+ if not self.path:
48
+ raise ValueError(
49
+ "Database path is required for DuckDB (use 'path' or 'database' field)"
50
+ )
51
+
52
+ # DuckDB's default schema is 'main'; no credentials required.
53
+ if not self.schema:
54
+ self.schema = "main"
55
+ if not self.username:
56
+ self.username = ""
57
+ if not self.password:
58
+ self.password = ""
59
+
60
+ def build_connection_string(self) -> str:
61
+ """Build a DuckDB connection string (file path)."""
62
+ return self.path or ""
63
+
64
+ def build_database_url(self) -> str:
65
+ """Build the DuckDB plugin-owned SQLAlchemy URL."""
66
+ from db.provider_registry import ProviderRegistry
67
+
68
+ return ProviderRegistry.build_sqlalchemy_url(self)
69
+
70
+ def to_dict(self) -> Dict[str, Any]:
71
+ """Convert to dictionary with DuckDB specific parameters."""
72
+ result = super().to_dict()
73
+ result["path"] = self.path
74
+ return result
75
+
76
+ def get_connection_props(self) -> Dict[str, str]:
77
+ """Get connection properties for DuckDB connection."""
78
+ props: Dict[str, str] = {}
79
+ if self.path:
80
+ props["path"] = self.path
81
+ return props
@@ -0,0 +1,5 @@
1
+ """DuckDB SQL parser module."""
2
+
3
+ from .duckdb_regex_parser import DuckDBRegexParser
4
+
5
+ __all__ = ["DuckDBRegexParser"]