velocity-python 0.1.11__tar.gz → 0.1.12__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.
- {velocity_python-0.1.11/src/velocity_python.egg-info → velocity_python-0.1.12}/PKG-INFO +1 -1
- {velocity_python-0.1.11 → velocity_python-0.1.12}/pyproject.toml +1 -1
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/__init__.py +1 -1
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/migrations.py +24 -43
- {velocity_python-0.1.11 → velocity_python-0.1.12/src/velocity_python.egg-info}/PKG-INFO +1 -1
- {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_schema_migrations.py +37 -38
- {velocity_python-0.1.11 → velocity_python-0.1.12}/LICENSE +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/README.md +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/setup.cfg +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/app/__init__.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/app/formbuilder/__init__.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/app/formbuilder/reshaper.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/app/invoices.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/app/orders.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/app/payments.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/app/purchase_orders.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/app/tests/__init__.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/app/tests/test_email_processing.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/app/tests/test_payment_profile_sorting.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/app/tests/test_spreadsheet_functions.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/app/validators/__init__.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/app/validators/formbuilder_template.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/aws/__init__.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/aws/amplify.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/aws/amplify_build.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/aws/handlers/__init__.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/aws/handlers/base_handler.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/aws/handlers/context.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/aws/handlers/context_factory.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/aws/handlers/exceptions.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/aws/handlers/lambda_handler.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/aws/handlers/mixins/__init__.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/aws/handlers/mixins/data_service.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/aws/handlers/mixins/web_handler.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/aws/handlers/perf.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/aws/handlers/response.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/aws/handlers/sqs_handler.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/aws/tests/__init__.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/aws/tests/test_base_handler_error_response.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/aws/tests/test_lambda_handler_json_serialization.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/aws/tests/test_response.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/__init__.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/core/__init__.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/core/async_support.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/core/column.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/core/database.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/core/decorators.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/core/engine.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/core/result.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/core/row.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/core/sequence.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/core/table.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/core/transaction.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/core/view.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/exceptions.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/__init__.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/base/__init__.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/base/initializer.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/base/operators.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/base/sql.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/base/types.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/mysql/__init__.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/mysql/operators.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/mysql/reserved.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/mysql/sql.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/mysql/types.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/postgres/__init__.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/postgres/operators.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/postgres/reserved.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/postgres/sql.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/postgres/types.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/sqlite/__init__.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/sqlite/operators.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/sqlite/reserved.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/sqlite/sql.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/sqlite/types.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/sqlserver/__init__.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/sqlserver/operators.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/sqlserver/reserved.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/sqlserver/sql.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/sqlserver/types.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/tablehelper.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/__init__.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/common_db_test.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/postgres/__init__.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/postgres/common.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/postgres/test_column.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/postgres/test_connections.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/postgres/test_database.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/postgres/test_engine.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/postgres/test_general_usage.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/postgres/test_imports.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/postgres/test_result.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/postgres/test_row.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/postgres/test_row_comprehensive.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/postgres/test_schema_locking.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/postgres/test_schema_locking_unit.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/postgres/test_sequence.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/postgres/test_sql_comprehensive.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/postgres/test_table.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/postgres/test_table_comprehensive.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/postgres/test_transaction.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/sql/__init__.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/sql/common.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/sql/test_postgres_select_advanced.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/sql/test_postgres_select_variances.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/test_cursor_rowcount_fix.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/test_db_utils.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/test_postgres.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/test_postgres_unchanged.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/test_process_error_robustness.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/test_result_caching.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/test_result_sql_aware.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/test_row_get_missing_column.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/test_schema_locking_initializers.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/test_schema_locking_simple.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/test_sql_builder.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/test_tablehelper.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/test_view_helper.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/utils.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/logging.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/misc/__init__.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/misc/conv/__init__.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/misc/conv/iconv.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/misc/conv/oconv.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/misc/db.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/misc/export.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/misc/format.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/misc/mail.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/misc/merge.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/misc/tests/__init__.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/misc/tests/test_db.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/misc/tests/test_fix.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/misc/tests/test_format.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/misc/tests/test_iconv.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/misc/tests/test_merge.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/misc/tests/test_oconv.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/misc/tests/test_original_error.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/misc/tests/test_timer.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/misc/timer.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/misc/tools.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/payment/__init__.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/payment/authorizenet_adapter.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/payment/base_adapter.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/payment/braintree_adapter.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/payment/charge_rules.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/payment/demo_profiles.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/payment/profiles.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/payment/router.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/payment/stripe_adapter.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity_python.egg-info/SOURCES.txt +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity_python.egg-info/dependency_links.txt +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity_python.egg-info/entry_points.txt +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity_python.egg-info/requires.txt +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity_python.egg-info/top_level.txt +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_amplify_build.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_async_support.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_batch_operations.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_concurrency_safety.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_connection_pool.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_connection_resilience.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_decorators.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_formbuilder_reshaper.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_formbuilder_template_validator.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_iconv_money_to_cents.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_lambda_handler.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_lambda_handler_auth.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_mixins_import.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_n_plus_one.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_observability.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_payment_braintree_adapter.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_payment_demo_profiles.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_payment_profiles.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_payment_router.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_payment_stripe_adapter.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_prepared_statements.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_psycopg3_upgrade.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_query_cache.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_row_batch_update.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_row_cache_staleness.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_row_dirty_tracking.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_security_hardening.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_sqs_per_record_transactions.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_sys_modified_count_postgres_demo.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_table_alter.py +0 -0
- {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_where_clause_validation.py +0 -0
|
@@ -100,14 +100,17 @@ class MigrationRunner:
|
|
|
100
100
|
"""
|
|
101
101
|
Discovers, applies, and rolls back schema migrations.
|
|
102
102
|
|
|
103
|
-
Migrations are tracked in a ``velocity_migrations`` table
|
|
103
|
+
Migrations are tracked in a ``velocity_migrations`` table managed by
|
|
104
|
+
velocity (with standard system columns like ``sys_id``, ``sys_created``,
|
|
105
|
+
etc.). User columns:
|
|
104
106
|
|
|
105
|
-
- ``version`` (INT
|
|
107
|
+
- ``version`` (INT) — migration version number
|
|
106
108
|
- ``description`` (TEXT) — human-readable description
|
|
107
|
-
- ``applied_at`` (TIMESTAMPTZ) — when the migration was applied
|
|
108
109
|
- ``checksum`` (TEXT) — SHA-256 of the migration function source
|
|
109
110
|
- ``execution_ms`` (INT) — how long the migration took in milliseconds
|
|
110
111
|
|
|
112
|
+
The ``sys_created`` system column serves as the applied-at timestamp.
|
|
113
|
+
|
|
111
114
|
Args:
|
|
112
115
|
engine: A velocity Engine instance.
|
|
113
116
|
migrations_dir: Optional path to a directory containing migration .py files.
|
|
@@ -145,43 +148,23 @@ class MigrationRunner:
|
|
|
145
148
|
"""Create the velocity_migrations tracking table if it doesn't exist."""
|
|
146
149
|
table = tx.table(TRACKING_TABLE)
|
|
147
150
|
if not table.exists():
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
elif server == 'SQL Server':
|
|
155
|
-
ts_col = "applied_at DATETIMEOFFSET NOT NULL DEFAULT SYSDATETIMEOFFSET()"
|
|
156
|
-
else:
|
|
157
|
-
ts_col = "applied_at TIMESTAMPTZ NOT NULL DEFAULT NOW()"
|
|
158
|
-
tx.execute(
|
|
159
|
-
f"""
|
|
160
|
-
CREATE TABLE IF NOT EXISTS {TRACKING_TABLE} (
|
|
161
|
-
version INTEGER PRIMARY KEY,
|
|
162
|
-
description TEXT NOT NULL DEFAULT '',
|
|
163
|
-
{ts_col},
|
|
164
|
-
checksum TEXT NOT NULL DEFAULT '',
|
|
165
|
-
execution_ms INTEGER NOT NULL DEFAULT 0
|
|
166
|
-
)
|
|
167
|
-
""",
|
|
168
|
-
cursor=tx.cursor(),
|
|
169
|
-
)
|
|
151
|
+
table.create(columns={
|
|
152
|
+
"version": int,
|
|
153
|
+
"description": str,
|
|
154
|
+
"checksum": str,
|
|
155
|
+
"execution_ms": int,
|
|
156
|
+
})
|
|
170
157
|
logger.info("Created tracking table: %s", TRACKING_TABLE)
|
|
171
158
|
|
|
172
159
|
def _get_applied_versions(self, tx) -> Dict[int, Dict[str, Any]]:
|
|
173
160
|
"""Return dict of {version: {description, applied_at, checksum, execution_ms}}."""
|
|
174
161
|
self._ensure_tracking_table(tx)
|
|
175
|
-
|
|
176
|
-
f"SELECT version, description, applied_at, checksum, execution_ms "
|
|
177
|
-
f"FROM {TRACKING_TABLE} ORDER BY version",
|
|
178
|
-
cursor=tx.cursor(),
|
|
179
|
-
)
|
|
162
|
+
table = tx.table(TRACKING_TABLE)
|
|
180
163
|
applied = {}
|
|
181
|
-
for row in
|
|
164
|
+
for row in table.select(orderby="version").all():
|
|
182
165
|
applied[row["version"]] = {
|
|
183
166
|
"description": row["description"],
|
|
184
|
-
"applied_at": row["
|
|
167
|
+
"applied_at": row["sys_created"],
|
|
185
168
|
"checksum": row["checksum"],
|
|
186
169
|
"execution_ms": row["execution_ms"],
|
|
187
170
|
}
|
|
@@ -189,20 +172,18 @@ class MigrationRunner:
|
|
|
189
172
|
|
|
190
173
|
def _record_migration(self, tx, version: int, description: str, checksum: str, execution_ms: int) -> None:
|
|
191
174
|
"""Insert a record into the tracking table."""
|
|
192
|
-
tx.
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
175
|
+
table = tx.table(TRACKING_TABLE)
|
|
176
|
+
table.insert({
|
|
177
|
+
"version": version,
|
|
178
|
+
"description": description,
|
|
179
|
+
"checksum": checksum,
|
|
180
|
+
"execution_ms": execution_ms,
|
|
181
|
+
})
|
|
198
182
|
|
|
199
183
|
def _remove_migration_record(self, tx, version: int) -> None:
|
|
200
184
|
"""Delete a record from the tracking table."""
|
|
201
|
-
tx.
|
|
202
|
-
|
|
203
|
-
(version,),
|
|
204
|
-
cursor=tx.cursor(),
|
|
205
|
-
)
|
|
185
|
+
table = tx.table(TRACKING_TABLE)
|
|
186
|
+
table.delete(where={"version": version})
|
|
206
187
|
|
|
207
188
|
# ── Checksum ────────────────────────────────────────────────
|
|
208
189
|
|
|
@@ -57,10 +57,14 @@ def _mock_result(rows, columns=None):
|
|
|
57
57
|
return result
|
|
58
58
|
|
|
59
59
|
|
|
60
|
-
def _make_mock_table(exists=False):
|
|
61
|
-
"""Return a mock Table
|
|
60
|
+
def _make_mock_table(exists=False, select_rows=None):
|
|
61
|
+
"""Return a mock Table with exists(), create(), select(), insert(), delete()."""
|
|
62
62
|
table = MagicMock()
|
|
63
63
|
table.exists.return_value = exists
|
|
64
|
+
if select_rows is not None:
|
|
65
|
+
table.select.return_value = _mock_result(select_rows)
|
|
66
|
+
else:
|
|
67
|
+
table.select.return_value = _mock_result([])
|
|
64
68
|
return table
|
|
65
69
|
|
|
66
70
|
|
|
@@ -90,23 +94,18 @@ def _make_mock_engine(schema_locked=False):
|
|
|
90
94
|
def _make_mock_tx(applied_rows=None, table_exists=True):
|
|
91
95
|
"""
|
|
92
96
|
Build a mock Transaction that supports:
|
|
93
|
-
- tx.table(name) -> mock table
|
|
94
|
-
- tx.execute(sql, ...) -> mock result (context-dependent)
|
|
97
|
+
- tx.table(name) -> mock table with select/insert/delete
|
|
95
98
|
- tx.cursor() -> mock cursor
|
|
96
99
|
- tx.commit(), tx.rollback(), tx.close()
|
|
97
100
|
"""
|
|
98
101
|
tx = MagicMock()
|
|
99
102
|
tx.cursor.return_value = MagicMock()
|
|
100
103
|
|
|
101
|
-
mock_table = _make_mock_table(exists=table_exists)
|
|
102
|
-
tx.table.return_value = mock_table
|
|
103
|
-
|
|
104
|
-
# Default: return empty result for SELECT queries, no-op for others
|
|
105
104
|
if applied_rows is None:
|
|
106
105
|
applied_rows = []
|
|
107
106
|
|
|
108
|
-
|
|
109
|
-
tx.
|
|
107
|
+
mock_table = _make_mock_table(exists=table_exists, select_rows=applied_rows)
|
|
108
|
+
tx.table.return_value = mock_table
|
|
110
109
|
|
|
111
110
|
return tx
|
|
112
111
|
|
|
@@ -223,7 +222,7 @@ class TestMigrationRunnerPending:
|
|
|
223
222
|
tx = _make_mock_tx(
|
|
224
223
|
applied_rows=[{
|
|
225
224
|
"version": 1, "description": "v1",
|
|
226
|
-
"
|
|
225
|
+
"sys_created": "2024-01-01", "checksum": "abc", "execution_ms": 10,
|
|
227
226
|
}],
|
|
228
227
|
table_exists=True,
|
|
229
228
|
)
|
|
@@ -249,7 +248,7 @@ class TestMigrationRunnerPending:
|
|
|
249
248
|
tx = _make_mock_tx(
|
|
250
249
|
applied_rows=[{
|
|
251
250
|
"version": 1, "description": "v1",
|
|
252
|
-
"
|
|
251
|
+
"sys_created": "2024-01-01", "checksum": "abc", "execution_ms": 10,
|
|
253
252
|
}],
|
|
254
253
|
table_exists=True,
|
|
255
254
|
)
|
|
@@ -281,7 +280,7 @@ class TestMigrationRunnerStatus:
|
|
|
281
280
|
tx = _make_mock_tx(
|
|
282
281
|
applied_rows=[{
|
|
283
282
|
"version": 1, "description": "v1",
|
|
284
|
-
"
|
|
283
|
+
"sys_created": "2024-01-01", "checksum": MigrationRunner._checksum(up1),
|
|
285
284
|
"execution_ms": 15,
|
|
286
285
|
}],
|
|
287
286
|
table_exists=True,
|
|
@@ -370,7 +369,7 @@ class TestMigrationRunnerMigrate:
|
|
|
370
369
|
tx = _make_mock_tx(
|
|
371
370
|
applied_rows=[{
|
|
372
371
|
"version": 1, "description": "v1",
|
|
373
|
-
"
|
|
372
|
+
"sys_created": "2024-01-01", "checksum": "abc", "execution_ms": 10,
|
|
374
373
|
}],
|
|
375
374
|
table_exists=True,
|
|
376
375
|
)
|
|
@@ -476,8 +475,8 @@ class TestMigrationRunnerRollback:
|
|
|
476
475
|
engine = _make_mock_engine()
|
|
477
476
|
tx_check = _make_mock_tx(
|
|
478
477
|
applied_rows=[
|
|
479
|
-
{"version": 1, "description": "v1", "
|
|
480
|
-
{"version": 2, "description": "v2", "
|
|
478
|
+
{"version": 1, "description": "v1", "sys_created": "2024-01-01", "checksum": "a", "execution_ms": 10},
|
|
479
|
+
{"version": 2, "description": "v2", "sys_created": "2024-01-02", "checksum": "b", "execution_ms": 20},
|
|
481
480
|
],
|
|
482
481
|
table_exists=True,
|
|
483
482
|
)
|
|
@@ -521,9 +520,9 @@ class TestMigrationRunnerRollback:
|
|
|
521
520
|
engine = _make_mock_engine()
|
|
522
521
|
tx_check = _make_mock_tx(
|
|
523
522
|
applied_rows=[
|
|
524
|
-
{"version": 1, "description": "v1", "
|
|
525
|
-
{"version": 2, "description": "v2", "
|
|
526
|
-
{"version": 3, "description": "v3", "
|
|
523
|
+
{"version": 1, "description": "v1", "sys_created": "2024-01-01", "checksum": "a", "execution_ms": 10},
|
|
524
|
+
{"version": 2, "description": "v2", "sys_created": "2024-01-02", "checksum": "b", "execution_ms": 20},
|
|
525
|
+
{"version": 3, "description": "v3", "sys_created": "2024-01-03", "checksum": "c", "execution_ms": 30},
|
|
527
526
|
],
|
|
528
527
|
table_exists=True,
|
|
529
528
|
)
|
|
@@ -546,7 +545,7 @@ class TestMigrationRunnerRollback:
|
|
|
546
545
|
engine = _make_mock_engine()
|
|
547
546
|
tx_check = _make_mock_tx(
|
|
548
547
|
applied_rows=[
|
|
549
|
-
{"version": 1, "description": "v1", "
|
|
548
|
+
{"version": 1, "description": "v1", "sys_created": "2024-01-01", "checksum": "a", "execution_ms": 10},
|
|
550
549
|
],
|
|
551
550
|
table_exists=True,
|
|
552
551
|
)
|
|
@@ -568,7 +567,7 @@ class TestMigrationRunnerRollback:
|
|
|
568
567
|
engine = _make_mock_engine()
|
|
569
568
|
tx_check = _make_mock_tx(
|
|
570
569
|
applied_rows=[
|
|
571
|
-
{"version": 1, "description": "v1", "
|
|
570
|
+
{"version": 1, "description": "v1", "sys_created": "2024-01-01", "checksum": "a", "execution_ms": 10},
|
|
572
571
|
],
|
|
573
572
|
table_exists=True,
|
|
574
573
|
)
|
|
@@ -593,7 +592,7 @@ class TestMigrationRunnerRollback:
|
|
|
593
592
|
engine = _make_mock_engine(schema_locked=True)
|
|
594
593
|
tx_check = _make_mock_tx(
|
|
595
594
|
applied_rows=[
|
|
596
|
-
{"version": 1, "description": "v1", "
|
|
595
|
+
{"version": 1, "description": "v1", "sys_created": "2024-01-01", "checksum": "a", "execution_ms": 10},
|
|
597
596
|
],
|
|
598
597
|
table_exists=True,
|
|
599
598
|
)
|
|
@@ -643,7 +642,7 @@ class TestMigrationRunnerDiff:
|
|
|
643
642
|
tx = _make_mock_tx(
|
|
644
643
|
applied_rows=[{
|
|
645
644
|
"version": 1, "description": "v1",
|
|
646
|
-
"
|
|
645
|
+
"sys_created": "2024-01-01",
|
|
647
646
|
"checksum": MigrationRunner._checksum(up1),
|
|
648
647
|
"execution_ms": 10,
|
|
649
648
|
}],
|
|
@@ -667,7 +666,7 @@ class TestMigrationRunnerDiff:
|
|
|
667
666
|
tx = _make_mock_tx(
|
|
668
667
|
applied_rows=[{
|
|
669
668
|
"version": 1, "description": "v1",
|
|
670
|
-
"
|
|
669
|
+
"sys_created": "2024-01-01",
|
|
671
670
|
"checksum": "old_checksum_not_matching",
|
|
672
671
|
"execution_ms": 10,
|
|
673
672
|
}],
|
|
@@ -685,7 +684,7 @@ class TestMigrationRunnerDiff:
|
|
|
685
684
|
tx = _make_mock_tx(
|
|
686
685
|
applied_rows=[{
|
|
687
686
|
"version": 99, "description": "ghost",
|
|
688
|
-
"
|
|
687
|
+
"sys_created": "2024-01-01",
|
|
689
688
|
"checksum": "abc",
|
|
690
689
|
"execution_ms": 10,
|
|
691
690
|
}],
|
|
@@ -800,15 +799,18 @@ class TestTrackingTable:
|
|
|
800
799
|
runner = MigrationRunner(engine)
|
|
801
800
|
runner.pending()
|
|
802
801
|
|
|
803
|
-
# Should have called
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
]
|
|
808
|
-
assert
|
|
802
|
+
# Should have called table.create() with column definitions
|
|
803
|
+
mock_table = tx.table.return_value
|
|
804
|
+
mock_table.create.assert_called_once()
|
|
805
|
+
create_kwargs = mock_table.create.call_args
|
|
806
|
+
columns = create_kwargs[1].get("columns") or create_kwargs[0][0]
|
|
807
|
+
assert "version" in columns
|
|
808
|
+
assert "description" in columns
|
|
809
|
+
assert "checksum" in columns
|
|
810
|
+
assert "execution_ms" in columns
|
|
809
811
|
|
|
810
812
|
def test_tracking_table_not_recreated_when_exists(self):
|
|
811
|
-
"""If tracking table exists, no
|
|
813
|
+
"""If tracking table exists, no create() is issued."""
|
|
812
814
|
@migration(version=1, description="v1")
|
|
813
815
|
def up1(tx):
|
|
814
816
|
pass
|
|
@@ -820,12 +822,9 @@ class TestTrackingTable:
|
|
|
820
822
|
runner = MigrationRunner(engine)
|
|
821
823
|
runner.pending()
|
|
822
824
|
|
|
823
|
-
# Should NOT have
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
if "CREATE TABLE" in str(c)
|
|
827
|
-
]
|
|
828
|
-
assert len(create_calls) == 0
|
|
825
|
+
# Should NOT have called table.create()
|
|
826
|
+
mock_table = tx.table.return_value
|
|
827
|
+
mock_table.create.assert_not_called()
|
|
829
828
|
|
|
830
829
|
|
|
831
830
|
# ── CLI tests ──────────────────────────────────────────────────────
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/app/tests/test_email_processing.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/aws/handlers/context_factory.py
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/aws/handlers/lambda_handler.py
RENAMED
|
File without changes
|
{velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/aws/handlers/mixins/__init__.py
RENAMED
|
File without changes
|
{velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/aws/handlers/mixins/data_service.py
RENAMED
|
File without changes
|
{velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/aws/handlers/mixins/web_handler.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/base/initializer.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/mysql/operators.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/postgres/__init__.py
RENAMED
|
File without changes
|
{velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/postgres/operators.py
RENAMED
|
File without changes
|
{velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/postgres/reserved.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/sqlite/__init__.py
RENAMED
|
File without changes
|
{velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/sqlite/operators.py
RENAMED
|
File without changes
|
{velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/sqlite/reserved.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/sqlserver/__init__.py
RENAMED
|
File without changes
|
{velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/sqlserver/operators.py
RENAMED
|
File without changes
|
{velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/sqlserver/reserved.py
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/sqlserver/types.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/postgres/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/postgres/test_column.py
RENAMED
|
File without changes
|
{velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/postgres/test_connections.py
RENAMED
|
File without changes
|
{velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/postgres/test_database.py
RENAMED
|
File without changes
|
{velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/postgres/test_engine.py
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/postgres/test_imports.py
RENAMED
|
File without changes
|
{velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/postgres/test_result.py
RENAMED
|
File without changes
|
{velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/postgres/test_row.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/postgres/test_sequence.py
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/postgres/test_table.py
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/postgres/test_transaction.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/test_cursor_rowcount_fix.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/test_postgres_unchanged.py
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/test_result_caching.py
RENAMED
|
File without changes
|
{velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/test_result_sql_aware.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/misc/tests/test_original_error.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/payment/authorizenet_adapter.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity_python.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
{velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity_python.egg-info/entry_points.txt
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity_python.egg-info/top_level.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_formbuilder_template_validator.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_sys_modified_count_postgres_demo.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|