dblift 2.3.0__tar.gz → 2.4.1__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.
- {dblift-2.3.0 → dblift-2.4.1}/PKG-INFO +15 -1
- {dblift-2.3.0 → dblift-2.4.1}/cli/_command_handlers.py +5 -0
- {dblift-2.3.0 → dblift-2.4.1}/cli/_config_helpers.py +12 -2
- {dblift-2.3.0 → dblift-2.4.1}/cli/main.py +98 -12
- dblift-2.4.1/db/plugins/alloydb/__init__.py +12 -0
- dblift-2.4.1/db/plugins/alloydb/plugin.py +28 -0
- dblift-2.4.1/db/plugins/alloydb/provider.py +14 -0
- dblift-2.4.1/db/plugins/alloydb/quirks.py +32 -0
- dblift-2.4.1/db/plugins/aurora_postgresql/__init__.py +12 -0
- dblift-2.4.1/db/plugins/aurora_postgresql/plugin.py +28 -0
- dblift-2.4.1/db/plugins/aurora_postgresql/provider.py +14 -0
- dblift-2.4.1/db/plugins/aurora_postgresql/quirks.py +32 -0
- dblift-2.4.1/db/plugins/citus/__init__.py +12 -0
- dblift-2.4.1/db/plugins/citus/plugin.py +28 -0
- dblift-2.4.1/db/plugins/citus/provider.py +14 -0
- dblift-2.4.1/db/plugins/citus/quirks.py +32 -0
- dblift-2.4.1/db/plugins/neon/__init__.py +12 -0
- dblift-2.4.1/db/plugins/neon/plugin.py +28 -0
- dblift-2.4.1/db/plugins/neon/provider.py +14 -0
- dblift-2.4.1/db/plugins/neon/quirks.py +32 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/postgresql/config.py +20 -1
- dblift-2.4.1/db/plugins/supabase/__init__.py +12 -0
- dblift-2.4.1/db/plugins/supabase/plugin.py +28 -0
- dblift-2.4.1/db/plugins/supabase/provider.py +14 -0
- dblift-2.4.1/db/plugins/supabase/quirks.py +32 -0
- dblift-2.4.1/db/plugins/timescaledb/__init__.py +12 -0
- dblift-2.4.1/db/plugins/timescaledb/plugin.py +28 -0
- dblift-2.4.1/db/plugins/timescaledb/provider.py +14 -0
- dblift-2.4.1/db/plugins/timescaledb/quirks.py +32 -0
- dblift-2.4.1/db/plugins/yugabytedb/__init__.py +12 -0
- dblift-2.4.1/db/plugins/yugabytedb/plugin.py +28 -0
- dblift-2.4.1/db/plugins/yugabytedb/provider.py +14 -0
- dblift-2.4.1/db/plugins/yugabytedb/quirks.py +32 -0
- {dblift-2.3.0 → dblift-2.4.1}/dblift.egg-info/PKG-INFO +15 -1
- {dblift-2.3.0 → dblift-2.4.1}/dblift.egg-info/SOURCES.txt +28 -0
- {dblift-2.3.0 → dblift-2.4.1}/dblift.egg-info/entry_points.txt +7 -0
- {dblift-2.3.0 → dblift-2.4.1}/dblift.egg-info/requires.txt +21 -0
- {dblift-2.3.0 → dblift-2.4.1}/pyproject.toml +64 -1
- {dblift-2.3.0 → dblift-2.4.1}/LICENSE +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/README.md +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/api/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/api/_cli_support.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/api/_client_factory.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/api/_client_operations.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/api/_engine_config.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/api/async_client.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/api/client.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/api/events.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/api/migrations.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/api/py.typed +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/cli/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/cli/_constants.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/cli/_output.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/cli/_parser_setup.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/cli/commands/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/cli/commands/config_command.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/cli/db_utils.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/cli/extensions.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/cli/handlers/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/cli/handlers/_shared.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/cli/handlers/baseline.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/cli/handlers/clean.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/cli/handlers/import_flyway.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/cli/handlers/info.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/cli/handlers/migrate.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/cli/handlers/repair.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/cli/handlers/undo.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/cli/handlers/validate.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/config/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/config/_credential_masking.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/config/_subclasses/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/config/_subclasses/dummy_config.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/config/_url_builder_mixin.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/config/config_builder.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/config/database_config.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/config/dblift_config.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/config/errors.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/config/property_registry.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/config/secrets/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/config/secrets/_cache.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/config/secrets/_provider_base.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/config/secrets/_registry.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/config/secrets/_resolver.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/config/secrets/_secrets_config.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/constants.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/dialect_boundary.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/exceptions.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/introspection/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/introspection/_column_enricher.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/introspection/_partition_enricher.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/introspection/_schema_orchestrator.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/introspection/_utils.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/introspection/_vendor_property_applier.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/introspection/base_introspector.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/introspection/extractors/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/introspection/extractors/base_extractor.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/introspection/extractors/column_extractor.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/introspection/extractors/constraint_extractor.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/introspection/extractors/index_extractor.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/introspection/extractors/misc_extractor.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/introspection/extractors/procedure_extractor.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/introspection/extractors/sequence_extractor.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/introspection/extractors/table_extractor.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/introspection/extractors/trigger_extractor.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/introspection/extractors/view_extractor.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/introspection/introspector_factory.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/introspection/result.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/introspection/schema_introspector.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/introspection/vendor_queries_base.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/introspection/vendor_queries_factory.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/introspection/vendor_queries_protocols.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/introspection/version_detector.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/logger/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/logger/_base.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/logger/_factory.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/logger/_formatters.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/logger/_levels.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/logger/_multi.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/logger/_null.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/logger/console.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/logger/formatters/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/logger/formatters/_formatter_impl.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/logger/formatters/factory.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/logger/formatters/formatter.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/logger/formatters/htmlformatter.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/logger/formatters/jsonformatter.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/logger/log.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/logger/results.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/logger/templates/oldreport.html +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/logger/templates/report.html +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/_type_match.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/clean_summary.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/commands/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/commands/_script_events.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/commands/base_command.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/commands/baseline_command.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/commands/clean_command.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/commands/import_flyway_command.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/commands/info_command.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/commands/migrate_command.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/commands/repair_command.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/commands/undo_command.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/commands/validate_command.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/encoding.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/executor/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/executor/execution_engine.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/executor/migration_executor.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/executor/migration_helpers.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/executor/placeholder_manager.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/executor/transaction_policy.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/executors/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/executors/base_executor.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/executors/executor_factory.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/executors/python_executor.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/executors/sql_executor.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/formats/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/formats/format_detector.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/formats/migration_format.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/history/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/history/migration_history_manager.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/journals/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/journals/migration_journal.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/migration.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/placeholders/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/placeholders/placeholder_service.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/rules/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/rules/migration_rules.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/scripting/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/scripting/migration_script_manager.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/scripting/undo_script_generator/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/scripting/undo_script_generator/_ddl_reversers.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/scripting/undo_script_generator/_dml_reversers.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/scripting/undo_script_generator/_extractors.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/scripting/undo_script_generator/_generator.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/scripting/undo_script_generator/_helpers.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/scripting/undo_script_generator/_models.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/scripting/undo_script_generator/_reversers.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/sql/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/sql/execution_statement.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/sql/sql_analyzer.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/sql/sql_execution_service.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/sql/statement_splitter.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/state/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/state/migration_data_service.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/state/migration_display_state.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/state/migration_formatter.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/state/migration_state.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/state/migration_state_manager.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/state/migration_state_service.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/ui/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/ui/data_collector.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/ui/display_formatters.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/ui/migration_analyzer.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/ui/migration_ui.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/ui/table_renderer.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/migration/version_utils.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/normalization/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/normalization/dependency_resolver.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/normalization/identifier_normalizer.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/normalization/object_orderer.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/normalization/type_constants.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/normalization/type_mapper.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/normalization/type_mappings.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/normalization/type_normalizer.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/seams/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/seams/capabilities.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/seams/event_listeners.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/seams/feature_loading.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/seams/introspection.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/seams/license_info.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/seams/runtime_checks.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/seams/sql_generators.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/seams/tier_resolver.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_generator/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_generator/alter/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_generator/alter/alter_generator_factory.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_generator/alter/base_alter_generator.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_generator/alter_generator.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_generator/base_generator.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_generator/basic_table_ddl_generator.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_generator/dependency_analyzer.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_generator/diff_converters/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_generator/diff_converters/base_converter.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_generator/formatter.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_generator/generator_factory.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_generator/options.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_generator/script_organizer.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_generator/sql_generator.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_generator/sql_statement.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_generator/table_ddl_render.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_model/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_model/_base_parse_result.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_model/_base_sql_column.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_model/_base_sql_constraint.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_model/_base_sql_object.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_model/_base_sql_statement.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_model/base.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_model/constraint_validator.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_model/database_link.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_model/dialect.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_model/event.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_model/extension.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_model/foreign_data_wrapper.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_model/foreign_server.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_model/index.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_model/linked_server.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_model/module.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_model/package.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_model/partition.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_model/procedure.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_model/sequence.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_model/synonym.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_model/table.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_model/table_canonicalizer.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_model/table_options.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_model/trigger.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_model/user_defined_type.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_model/view.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_model/view_options.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_parser/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_parser/_partition_handler.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_parser/_sqlglot_builders.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_parser/base_statement_parser.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_parser/base_tokenizer.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_parser/common/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_parser/common/base_parser.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_parser/dialects/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_parser/dialects/base_config.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_parser/enhanced_regex_parser.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_parser/hybrid_parser.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_parser/parser_context.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_parser/parser_factory.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_parser/parser_interface.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_parser/sqlglot_parser.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_parser/tokens.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_parser/unified_regex_parser.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_validator/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_validator/_checksum_validator.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_validator/_flyway_compatibility.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_validator/_migration_filter.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_validator/_sql_syntax_validator.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_validator/_strict_mode_validator.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/sql_validator/migration_validator.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/state/sql_script_formatter.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/state/sql_statement.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/utils/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/utils/database_url_parser.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/utils/metadata_helpers.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/utils/row_access.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/utils/string_utils.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/core/utils/url_masking.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/base_provider.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/base_quirks.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/constants.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/dml_analysis.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/error.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/error_handler.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/exceptions.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/native_connection_manager.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/object_naming.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/base_history_manager.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/base_locking_manager.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/base_query_executor.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/base_schema_operations.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/base_snapshot_manager.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/base_undo_manager.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/cosmosdb/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/cosmosdb/config.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/cosmosdb/cosmosdb/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/cosmosdb/cosmosdb/_sdk.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/cosmosdb/cosmosdb/connection_manager.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/cosmosdb/cosmosdb/history_manager.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/cosmosdb/cosmosdb/locking_manager.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/cosmosdb/cosmosdb/query_executor.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/cosmosdb/cosmosdb/schema_operations.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/cosmosdb/introspection/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/cosmosdb/parser/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/cosmosdb/parser/cosmosdb_regex_parser.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/cosmosdb/plugin.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/cosmosdb/provider.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/cosmosdb/quirks.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/cosmosdb/sdk_translator/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/cosmosdb/sdk_translator/_executor.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/cosmosdb/sdk_translator/_executors.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/cosmosdb/sdk_translator/_parsing.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/cosmosdb/sdk_translator/_script_generation.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/cosmosdb/sdk_translator/_translator.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/cosmosdb/sdk_translator/_translators.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/db2/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/db2/config.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/db2/db2/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/db2/db2/history_manager.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/db2/db2/locking_manager.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/db2/db2/schema_operations.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/db2/introspection/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/db2/parser/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/db2/parser/db2_regex_parser.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/db2/parser/parser_config.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/db2/plugin.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/db2/provider.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/db2/quirks.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/db2/sqlalchemy_url.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/duckdb/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/duckdb/config.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/duckdb/parser/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/duckdb/parser/duckdb_regex_parser.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/duckdb/parser/parser_config.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/duckdb/plugin.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/duckdb/provider.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/duckdb/quirks.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/duckdb/sqlalchemy_url.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/mariadb/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/mariadb/plugin.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/mariadb/provider.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/mariadb/quirks.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/mysql/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/mysql/config.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/mysql/introspection/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/mysql/mysql/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/mysql/mysql/history_manager.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/mysql/mysql/locking_manager.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/mysql/mysql/schema_operations.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/mysql/parser/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/mysql/parser/mysql_regex_parser.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/mysql/parser/mysql_statement_parser.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/mysql/parser/mysql_tokenizer.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/mysql/parser/parser_config.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/mysql/plugin.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/mysql/provider.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/mysql/quirks.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/mysql/sqlalchemy_url.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/oracle/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/oracle/config.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/oracle/introspection/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/oracle/introspection/oracle_utils.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/oracle/oracle/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/oracle/oracle/dbms_output.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/oracle/oracle/history_manager.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/oracle/oracle/locking_manager.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/oracle/oracle/schema_operations.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/oracle/parser/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/oracle/parser/_comments.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/oracle/parser/_object_extractor.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/oracle/parser/_plsql_block.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/oracle/parser/_sqlplus.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/oracle/parser/_statement_splitter.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/oracle/parser/oracle_parser.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/oracle/parser/oracle_statement_parser.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/oracle/parser/oracle_tokenizer.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/oracle/parser/parser_config.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/oracle/parser/sqlplus_context.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/oracle/plugin.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/oracle/provider.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/oracle/quirks.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/oracle/sqlalchemy_url.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/postgresql/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/postgresql/_provider_query_executor.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/postgresql/introspection/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/postgresql/parser/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/postgresql/parser/parser_config.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/postgresql/parser/postgresql_regex_parser.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/postgresql/parser/postgresql_statement_parser.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/postgresql/parser/postgresql_tokenizer.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/postgresql/plugin.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/postgresql/postgresql/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/postgresql/postgresql/history_manager.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/postgresql/postgresql/locking_manager.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/postgresql/postgresql/schema_operations.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/postgresql/provider.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/postgresql/quirks.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/postgresql/sqlalchemy_url.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlite/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlite/config.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlite/introspection/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlite/parser/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlite/parser/parser_config.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlite/parser/sqlite_regex_parser.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlite/plugin.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlite/provider.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlite/quirks.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlite/sqlalchemy_url.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlite/sqlite/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlite/sqlite/connection_manager.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlite/sqlite/history_manager.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlite/sqlite/locking_manager.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlite/sqlite/query_executor.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlite/sqlite/schema_operations.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlserver/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlserver/config.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlserver/introspection/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlserver/parser/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlserver/parser/parser_config.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlserver/parser/sqlserver_regex_parser.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlserver/parser/sqlserver_statement_parser.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlserver/parser/sqlserver_tokenizer.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlserver/parser/tsql_batch_separator.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlserver/plugin.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlserver/provider.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlserver/quirks.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlserver/sqlalchemy_url.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlserver/sqlserver/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlserver/sqlserver/history_manager.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlserver/sqlserver/locking_manager.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/plugins/sqlserver/sqlserver/schema_operations.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/provider_capabilities.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/provider_interfaces.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/provider_registry.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/sqlalchemy_provider.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/db/value_utils.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/dblift.egg-info/dependency_links.txt +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/dblift.egg-info/top_level.txt +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/integrations/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/integrations/django/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/integrations/django/_client.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/integrations/django/_engine.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/integrations/django/apps.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/integrations/django/checks.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/integrations/django/management/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/integrations/django/management/commands/__init__.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/integrations/django/management/commands/dblift_info.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/integrations/django/management/commands/dblift_migrate.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/integrations/django/management/commands/dblift_validate.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/integrations/fastapi.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/integrations/flask.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/integrations/opentelemetry.py +0 -0
- {dblift-2.3.0 → dblift-2.4.1}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dblift
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.4.1
|
|
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
|
|
@@ -69,6 +69,20 @@ Requires-Dist: ibm_db_sa>=0.4; extra == "db2"
|
|
|
69
69
|
Provides-Extra: duckdb
|
|
70
70
|
Requires-Dist: duckdb>=1.0; extra == "duckdb"
|
|
71
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"
|
|
72
86
|
Provides-Extra: fastapi
|
|
73
87
|
Requires-Dist: fastapi>=0.100; extra == "fastapi"
|
|
74
88
|
Provides-Extra: flask
|
|
@@ -22,6 +22,7 @@ from cli.handlers.migrate import _handle_migrate
|
|
|
22
22
|
from cli.handlers.repair import _handle_repair
|
|
23
23
|
from cli.handlers.undo import _handle_undo
|
|
24
24
|
from cli.handlers.validate import _handle_validate
|
|
25
|
+
from core.seams.tier_resolver import resolve_tier
|
|
25
26
|
|
|
26
27
|
_COMMAND_HANDLERS: Dict[str, Callable[[CliCommandContext], Tuple[bool, Any]]] = {
|
|
27
28
|
"migrate": _handle_migrate,
|
|
@@ -72,6 +73,10 @@ def execute_single_command(
|
|
|
72
73
|
recursive=recursive,
|
|
73
74
|
placeholders=placeholders,
|
|
74
75
|
dir_recursive_map=dir_recursive_map,
|
|
76
|
+
# Resolve the license tier through the seam so paid-feature gates
|
|
77
|
+
# (``require_tier(FEATURE, ctx.license_tier)``) see the real tier. In a
|
|
78
|
+
# pure-OSS install no resolver is registered and this is ``None``.
|
|
79
|
+
license_tier=resolve_tier(args),
|
|
75
80
|
)
|
|
76
81
|
return handler(ctx)
|
|
77
82
|
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import argparse
|
|
4
4
|
import sys
|
|
5
5
|
from pathlib import Path
|
|
6
|
-
from typing import Any, Dict, List, Optional, Tuple
|
|
6
|
+
from typing import Any, Dict, Iterable, List, Optional, Tuple
|
|
7
7
|
|
|
8
8
|
from api._cli_support import ConnectionProvider
|
|
9
9
|
from cli._parser_setup import create_parser, parse_with_selective_errors
|
|
@@ -70,12 +70,22 @@ def _extract_commands_from_argv(
|
|
|
70
70
|
argv_list: List[str],
|
|
71
71
|
available_commands: List[str],
|
|
72
72
|
global_only_args: List[str],
|
|
73
|
+
global_boolean_flags: Optional[Iterable[str]] = None,
|
|
73
74
|
) -> Tuple[List[str], List[str], List[str]]:
|
|
74
75
|
"""Extract commands, global arguments, and subcommand arguments from argv.
|
|
75
76
|
|
|
77
|
+
``global_boolean_flags`` names the global flags that take no value (so the
|
|
78
|
+
lookahead must not swallow the next token — usually a command name). It
|
|
79
|
+
defaults to the static :data:`_GLOBAL_BOOLEAN_FLAGS`; callers pass a
|
|
80
|
+
superset when dynamically-derived global flags (e.g. paid-extension
|
|
81
|
+
root-only flags) include boolean ones the static set can't see.
|
|
82
|
+
|
|
76
83
|
Returns:
|
|
77
84
|
Tuple of (commands, global_arguments, subcommand_args)
|
|
78
85
|
"""
|
|
86
|
+
boolean_flags = (
|
|
87
|
+
_GLOBAL_BOOLEAN_FLAGS if global_boolean_flags is None else frozenset(global_boolean_flags)
|
|
88
|
+
)
|
|
79
89
|
commands = []
|
|
80
90
|
global_arguments = []
|
|
81
91
|
subcommand_args = []
|
|
@@ -103,7 +113,7 @@ def _extract_commands_from_argv(
|
|
|
103
113
|
|
|
104
114
|
arg_name = safe_split_first(arg, "=", default=arg)
|
|
105
115
|
is_global_only = arg_name in global_only_args
|
|
106
|
-
is_boolean_flag = arg_name in
|
|
116
|
+
is_boolean_flag = arg_name in boolean_flags
|
|
107
117
|
|
|
108
118
|
if is_global_only:
|
|
109
119
|
global_arguments.append(arg)
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
"""Main CLI module for dblift."""
|
|
2
2
|
|
|
3
|
+
import argparse
|
|
3
4
|
import sys
|
|
4
5
|
from dataclasses import dataclass
|
|
5
6
|
from pathlib import Path
|
|
6
|
-
from typing import Any, List, Optional
|
|
7
|
+
from typing import Any, List, Optional, Set
|
|
7
8
|
|
|
8
9
|
# Add project root to Python path when running as a script
|
|
9
10
|
# This allows imports to work when running: python3 cli/main.py
|
|
@@ -38,6 +39,7 @@ from cli._command_handlers import ( # noqa: F401
|
|
|
38
39
|
execute_single_command,
|
|
39
40
|
)
|
|
40
41
|
from cli._config_helpers import ( # noqa: F401
|
|
42
|
+
_GLOBAL_BOOLEAN_FLAGS,
|
|
41
43
|
_build_args_namespace,
|
|
42
44
|
_close_logs,
|
|
43
45
|
_collect_placeholders,
|
|
@@ -108,6 +110,49 @@ _GLOBAL_ONLY_ARGS: List[str] = [
|
|
|
108
110
|
"--max-snapshots",
|
|
109
111
|
]
|
|
110
112
|
|
|
113
|
+
|
|
114
|
+
def _root_only_long_flags(parser: argparse.ArgumentParser) -> Set[str]:
|
|
115
|
+
"""Long flags defined only on the root parser, not on any subparser.
|
|
116
|
+
|
|
117
|
+
Paid extensions register their own root-only value flags on the parser
|
|
118
|
+
(``load_feature_extensions`` runs before the parser is built). Those flags
|
|
119
|
+
live only on the root parser, so — exactly like the static root-only flags
|
|
120
|
+
in ``_GLOBAL_ONLY_ARGS`` — the argv preprocessor must classify them as
|
|
121
|
+
global, or it relocates them past the subcommand token and the subparser
|
|
122
|
+
rejects them as "unrecognized arguments". Deriving them from the built
|
|
123
|
+
parser keeps the classification correct without the OSS core having to name
|
|
124
|
+
each extension flag. Mirrors the invariant asserted by
|
|
125
|
+
tests/unit/cli/test_global_only_args_completeness.py.
|
|
126
|
+
"""
|
|
127
|
+
root = {o for a in parser._actions for o in a.option_strings if o.startswith("--")}
|
|
128
|
+
sub: Set[str] = set()
|
|
129
|
+
for action in parser._actions:
|
|
130
|
+
choices = getattr(action, "choices", None)
|
|
131
|
+
if isinstance(choices, dict):
|
|
132
|
+
for sub_parser in choices.values():
|
|
133
|
+
if isinstance(sub_parser, argparse.ArgumentParser):
|
|
134
|
+
sub.update(
|
|
135
|
+
o
|
|
136
|
+
for a in sub_parser._actions
|
|
137
|
+
for o in a.option_strings
|
|
138
|
+
if o.startswith("--")
|
|
139
|
+
)
|
|
140
|
+
return root - sub - {"--help"}
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
def _root_only_boolean_flags(parser: argparse.ArgumentParser) -> Set[str]:
|
|
144
|
+
"""Root-only long flags that take no value (``store_true``/``store_const``).
|
|
145
|
+
|
|
146
|
+
The argv preprocessor must know these so it does NOT run its value-lookahead
|
|
147
|
+
on them — otherwise the token after a boolean flag (typically a command
|
|
148
|
+
name) gets swallowed into the global bucket and the command is lost. The
|
|
149
|
+
static ``_GLOBAL_BOOLEAN_FLAGS`` covers OSS flags; this derives the same for
|
|
150
|
+
dynamically-discovered paid-extension boolean root flags.
|
|
151
|
+
"""
|
|
152
|
+
root_only = _root_only_long_flags(parser)
|
|
153
|
+
return {o for a in parser._actions if a.nargs == 0 for o in a.option_strings if o in root_only}
|
|
154
|
+
|
|
155
|
+
|
|
111
156
|
# Tool-level flag aliases for subcommands that take their own version-like
|
|
112
157
|
# argument. Used by the B10-BUG-04 footgun guard in phase 1 to redirect
|
|
113
158
|
# `dblift baseline --version 1.0.0` to the correct flag instead of
|
|
@@ -145,6 +190,44 @@ class _CliContext:
|
|
|
145
190
|
license_info: Optional[Any] = None
|
|
146
191
|
|
|
147
192
|
|
|
193
|
+
def _format_version() -> str:
|
|
194
|
+
"""Render the ``--version`` output.
|
|
195
|
+
|
|
196
|
+
The published ``dblift`` wheel is the OSS *core*. The paid tiers ship as
|
|
197
|
+
separate distributions (``dblift-pro`` / ``dblift-enterprise``) bundled into
|
|
198
|
+
the compiled binary, each on its own release lifecycle — so their versions
|
|
199
|
+
need not match the core's. Report the most-derived installed tier as the
|
|
200
|
+
headline (that is the product the user actually runs) and, when a paid tier
|
|
201
|
+
is present, list every component so a bare number is never ambiguous. In a
|
|
202
|
+
plain OSS install only the core is present, so the output stays a single
|
|
203
|
+
``dblift version X`` line — unchanged from before.
|
|
204
|
+
"""
|
|
205
|
+
from importlib.metadata import PackageNotFoundError
|
|
206
|
+
from importlib.metadata import version as _version
|
|
207
|
+
|
|
208
|
+
def _get(dist: str) -> Optional[str]:
|
|
209
|
+
try:
|
|
210
|
+
return _version(dist)
|
|
211
|
+
except PackageNotFoundError:
|
|
212
|
+
return None
|
|
213
|
+
|
|
214
|
+
core = _get("dblift")
|
|
215
|
+
pro = _get("dblift-pro")
|
|
216
|
+
enterprise = _get("dblift-enterprise")
|
|
217
|
+
|
|
218
|
+
# Headline = most-derived installed tier (the product actually running).
|
|
219
|
+
product = enterprise or pro or core
|
|
220
|
+
lines = [f"dblift version {product}"]
|
|
221
|
+
# Component manifest only when a paid tier is present; OSS stays one line.
|
|
222
|
+
if pro or enterprise:
|
|
223
|
+
lines.append(f" core (OSS): {core}")
|
|
224
|
+
if pro:
|
|
225
|
+
lines.append(f" pro: {pro}")
|
|
226
|
+
if enterprise:
|
|
227
|
+
lines.append(f" enterprise: {enterprise}")
|
|
228
|
+
return "\n".join(lines)
|
|
229
|
+
|
|
230
|
+
|
|
148
231
|
def main() -> None:
|
|
149
232
|
"""Main entry point for DBLift CLI application.
|
|
150
233
|
|
|
@@ -187,8 +270,19 @@ def _parse_argv_and_load_config(argv: List[str]) -> _CliContext:
|
|
|
187
270
|
"""
|
|
188
271
|
terminal_commands = load_terminal_commands()
|
|
189
272
|
available_commands = list(dict.fromkeys(_AVAILABLE_COMMANDS + list(terminal_commands)))
|
|
273
|
+
# Union the static root-only classification with root-only flags derived
|
|
274
|
+
# from the built parser, so paid-extension root flags (e.g. an
|
|
275
|
+
# override-the-license-file flag) are classified as global without the OSS
|
|
276
|
+
# core naming them. Boolean extension flags must also feed the splitter's
|
|
277
|
+
# boolean set, or its value-lookahead swallows the following command token.
|
|
278
|
+
# See _root_only_long_flags / _root_only_boolean_flags.
|
|
279
|
+
_parser = create_parser()
|
|
280
|
+
global_only_args = list(_GLOBAL_ONLY_ARGS) + sorted(
|
|
281
|
+
_root_only_long_flags(_parser) - set(_GLOBAL_ONLY_ARGS)
|
|
282
|
+
)
|
|
283
|
+
global_boolean_flags = set(_GLOBAL_BOOLEAN_FLAGS) | _root_only_boolean_flags(_parser)
|
|
190
284
|
commands, global_arguments, subcommand_args = _extract_commands_from_argv(
|
|
191
|
-
argv, available_commands,
|
|
285
|
+
argv, available_commands, global_only_args, global_boolean_flags
|
|
192
286
|
)
|
|
193
287
|
|
|
194
288
|
# B10-BUG-04: Flyway users type ``dblift baseline --version 1.0.0``
|
|
@@ -211,22 +305,14 @@ def _parse_argv_and_load_config(argv: List[str]) -> _CliContext:
|
|
|
211
305
|
if commands and commands[0] in terminal_commands:
|
|
212
306
|
args = _build_terminal_args(commands[0], global_arguments, subcommand_args)
|
|
213
307
|
if hasattr(args, "version") and args.version:
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
__version__ = _version("dblift")
|
|
217
|
-
|
|
218
|
-
print(f"dblift version {__version__}") # lint: allow-print --version terminal action
|
|
308
|
+
print(_format_version()) # lint: allow-print --version terminal action
|
|
219
309
|
sys.exit(0)
|
|
220
310
|
sys.exit(terminal_commands[commands[0]](args))
|
|
221
311
|
|
|
222
312
|
args, _unknown_args = _build_args_namespace(commands, global_arguments, subcommand_args)
|
|
223
313
|
|
|
224
314
|
if hasattr(args, "version") and args.version:
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
__version__ = _version("dblift")
|
|
228
|
-
|
|
229
|
-
print(f"dblift version {__version__}") # lint: allow-print --version terminal action
|
|
315
|
+
print(_format_version()) # lint: allow-print --version terminal action
|
|
230
316
|
sys.exit(0)
|
|
231
317
|
|
|
232
318
|
if not commands and (not hasattr(args, "command") or not args.command):
|
|
@@ -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
|
+
"""Neon (serverless PostgreSQL) database provider plugin (PostgreSQL-compatible)."""
|
|
2
|
+
|
|
3
|
+
__plugin_name__ = "neon"
|
|
4
|
+
__plugin_version__ = "1.0.0"
|
|
5
|
+
__plugin_description__ = "Neon (serverless PostgreSQL) database provider"
|
|
6
|
+
__plugin_dialects__ = ["neon"]
|
|
7
|
+
__plugin_transport__ = "native"
|
|
8
|
+
__plugin_class__ = "NeonProvider"
|
|
9
|
+
|
|
10
|
+
from .provider import NeonProvider
|
|
11
|
+
|
|
12
|
+
__all__ = ["NeonProvider"]
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"""Entry-point declaration for the Neon (serverless PostgreSQL) plugin.
|
|
2
|
+
|
|
3
|
+
Neon (serverless 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: neon``.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
from db.plugins.neon.provider import NeonProvider
|
|
13
|
+
from db.plugins.neon.quirks import NeonQuirks
|
|
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="neon",
|
|
19
|
+
version="1.0.0",
|
|
20
|
+
description="Neon (serverless PostgreSQL) database provider",
|
|
21
|
+
dialects=["neon"],
|
|
22
|
+
provider_class=NeonProvider,
|
|
23
|
+
transport="native",
|
|
24
|
+
quirks_class=NeonQuirks,
|
|
25
|
+
config_dialect="postgresql", # Neon (serverless PostgreSQL) shares PostgreSQL's config class
|
|
26
|
+
sqlalchemy_url_builder=build_sqlalchemy_url,
|
|
27
|
+
native_driver_module="psycopg",
|
|
28
|
+
)
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"""Neon (serverless PostgreSQL) native provider (PostgreSQL-compatible)."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from db.plugins.postgresql.provider import PostgreSqlProvider
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class NeonProvider(PostgreSqlProvider):
|
|
9
|
+
"""Neon (serverless PostgreSQL) — wire-compatible with PostgreSQL; reuses the PostgreSQL provider."""
|
|
10
|
+
|
|
11
|
+
canonical_dialect_key = "neon"
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
__all__ = ["NeonProvider"]
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"""Neon (serverless 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 NeonQuirks(PostgresqlQuirks):
|
|
9
|
+
"""Neon (serverless PostgreSQL) quirks, inheriting every PostgreSQL quirk.
|
|
10
|
+
|
|
11
|
+
Neon (serverless 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 = "neon") -> None:
|
|
29
|
+
super().__init__(dialect_name=dialect_name)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
__all__ = ["NeonQuirks"]
|
|
@@ -15,9 +15,28 @@ class PostgreSqlConfig(BaseDatabaseConfig):
|
|
|
15
15
|
# PostgreSQL specific attributes
|
|
16
16
|
ssl_mode: Optional[str] = None
|
|
17
17
|
|
|
18
|
+
# PostgreSQL-compatible distributions share this config class via
|
|
19
|
+
# ``PluginInfo.config_dialect="postgresql"``. Membership here preserves their
|
|
20
|
+
# own ``type`` identity (mirrors MySQL/MariaDB's ``_MYSQL_FAMILY``); anything
|
|
21
|
+
# else — including the ``postgres`` alias — normalises to ``postgresql``.
|
|
22
|
+
# lint: allow-dialect-string: config family membership
|
|
23
|
+
_POSTGRESQL_FAMILY = frozenset(
|
|
24
|
+
{
|
|
25
|
+
"postgresql",
|
|
26
|
+
"neon",
|
|
27
|
+
"supabase",
|
|
28
|
+
"aurora-postgresql",
|
|
29
|
+
"alloydb",
|
|
30
|
+
"yugabytedb",
|
|
31
|
+
"timescaledb",
|
|
32
|
+
"citus",
|
|
33
|
+
}
|
|
34
|
+
)
|
|
35
|
+
|
|
18
36
|
def __post_init__(self) -> None:
|
|
19
37
|
super().__post_init__()
|
|
20
|
-
self.type
|
|
38
|
+
if self.type not in self._POSTGRESQL_FAMILY:
|
|
39
|
+
self.type = "postgresql" # lint: allow-dialect-string: config type identity
|
|
21
40
|
|
|
22
41
|
def to_dict(self) -> Dict[str, Any]:
|
|
23
42
|
"""Convert to dictionary with PostgreSQL specific parameters."""
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"""Supabase (PostgreSQL) database provider plugin (PostgreSQL-compatible)."""
|
|
2
|
+
|
|
3
|
+
__plugin_name__ = "supabase"
|
|
4
|
+
__plugin_version__ = "1.0.0"
|
|
5
|
+
__plugin_description__ = "Supabase (PostgreSQL) database provider"
|
|
6
|
+
__plugin_dialects__ = ["supabase"]
|
|
7
|
+
__plugin_transport__ = "native"
|
|
8
|
+
__plugin_class__ = "SupabaseProvider"
|
|
9
|
+
|
|
10
|
+
from .provider import SupabaseProvider
|
|
11
|
+
|
|
12
|
+
__all__ = ["SupabaseProvider"]
|