velocity-python 0.1.55__tar.gz → 0.1.56__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.55 → velocity_python-0.1.56}/PKG-INFO +1 -1
- {velocity_python-0.1.55 → velocity_python-0.1.56}/pyproject.toml +1 -1
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/__init__.py +1 -1
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/core/engine.py +37 -3
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity_python.egg-info/PKG-INFO +1 -1
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity_python.egg-info/SOURCES.txt +1 -0
- velocity_python-0.1.56/tests/test_jsonb_dict_adapter.py +82 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/LICENSE +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/README.md +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/setup.cfg +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/aws/__init__.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/aws/amplify.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/aws/amplify_build.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/aws/assets/__init__.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/aws/assets/backfill.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/aws/assets/indexing.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/aws/assets/references.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/aws/assets/service.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/aws/assets/usage_index.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/aws/dirty_pipeline.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/aws/handlers/__init__.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/aws/handlers/base_handler.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/aws/handlers/context.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/aws/handlers/context_factory.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/aws/handlers/exceptions.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/aws/handlers/lambda_handler.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/aws/handlers/mixins/__init__.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/aws/handlers/mixins/data_service.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/aws/handlers/mixins/web_handler.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/aws/handlers/perf.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/aws/handlers/response.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/aws/handlers/sqs_handler.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/aws/s3.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/aws/ssm_config.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/aws/tests/__init__.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/aws/tests/test_base_handler_error_response.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/aws/tests/test_lambda_handler_json_serialization.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/aws/tests/test_response.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/__init__.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/core/__init__.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/core/async_support.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/core/column.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/core/database.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/core/decorators.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/core/result.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/core/row.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/core/sequence.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/core/table.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/core/transaction.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/core/view.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/exceptions.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/migrations.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/servers/__init__.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/servers/base/__init__.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/servers/base/initializer.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/servers/base/operators.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/servers/base/sql.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/servers/base/types.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/servers/mysql/__init__.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/servers/mysql/operators.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/servers/mysql/reserved.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/servers/mysql/sql.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/servers/mysql/types.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/servers/postgres/__init__.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/servers/postgres/operators.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/servers/postgres/reserved.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/servers/postgres/sql.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/servers/postgres/types.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/servers/sqlite/__init__.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/servers/sqlite/operators.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/servers/sqlite/reserved.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/servers/sqlite/sql.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/servers/sqlite/types.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/servers/sqlserver/__init__.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/servers/sqlserver/operators.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/servers/sqlserver/reserved.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/servers/sqlserver/sql.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/servers/sqlserver/types.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/servers/tablehelper.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/tests/__init__.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/tests/common_db_test.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/tests/postgres/__init__.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/tests/postgres/common.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/tests/postgres/conftest.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/tests/postgres/test_column.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/tests/postgres/test_connections.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/tests/postgres/test_database.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/tests/postgres/test_engine.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/tests/postgres/test_general_usage.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/tests/postgres/test_imports.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/tests/postgres/test_result.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/tests/postgres/test_row.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/tests/postgres/test_row_comprehensive.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/tests/postgres/test_schema_locking.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/tests/postgres/test_schema_locking_unit.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/tests/postgres/test_sequence.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/tests/postgres/test_sql_comprehensive.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/tests/postgres/test_table.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/tests/postgres/test_table_comprehensive.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/tests/postgres/test_transaction.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/tests/sql/__init__.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/tests/sql/common.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/tests/sql/test_postgres_select_advanced.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/tests/sql/test_postgres_select_variances.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/tests/test_cursor_rowcount_fix.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/tests/test_db_utils.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/tests/test_postgres.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/tests/test_postgres_unchanged.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/tests/test_process_error_robustness.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/tests/test_result_caching.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/tests/test_result_sql_aware.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/tests/test_row_get_missing_column.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/tests/test_schema_locking_initializers.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/tests/test_schema_locking_simple.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/tests/test_sql_builder.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/tests/test_tablehelper.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/tests/test_view_helper.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/utils.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/logging.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/misc/__init__.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/misc/conv/__init__.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/misc/conv/iconv.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/misc/conv/oconv.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/misc/db.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/misc/export.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/misc/format.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/misc/mail.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/misc/merge.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/misc/pdf.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/misc/tests/__init__.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/misc/tests/test_db.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/misc/tests/test_fix.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/misc/tests/test_format.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/misc/tests/test_iconv.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/misc/tests/test_merge.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/misc/tests/test_oconv.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/misc/tests/test_original_error.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/misc/tests/test_timer.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/misc/timer.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/misc/tools.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/payment/__init__.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/payment/authorizenet_adapter.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/payment/authorizenet_mirror.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/payment/base_adapter.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/payment/braintree_adapter.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/payment/braintree_mirror.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/payment/charge_rules.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/payment/stripe_adapter.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/payment/stripe_mirror.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity_python.egg-info/dependency_links.txt +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity_python.egg-info/entry_points.txt +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity_python.egg-info/requires.txt +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity_python.egg-info/top_level.txt +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/tests/test_amplify_build.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/tests/test_asset_indexing.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/tests/test_asset_references.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/tests/test_assets_service.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/tests/test_async_support.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/tests/test_batch_operations.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/tests/test_concurrency_safety.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/tests/test_connection_pool.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/tests/test_connection_resilience.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/tests/test_context_job_descriptions.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/tests/test_decorators.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/tests/test_dirty_pipeline_fast_path.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/tests/test_email_processing.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/tests/test_iconv_money_to_cents.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/tests/test_lambda_handler.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/tests/test_lambda_handler_auth.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/tests/test_mixins_import.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/tests/test_n_plus_one.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/tests/test_observability.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/tests/test_payment_authorizenet_adapter.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/tests/test_payment_braintree_adapter.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/tests/test_payment_braintree_mirror.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/tests/test_payment_profile_sorting.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/tests/test_payment_stripe_adapter.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/tests/test_pdf.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/tests/test_prepared_statements.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/tests/test_psycopg3_upgrade.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/tests/test_query_cache.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/tests/test_retry_side_effect_guard.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/tests/test_return_default_safety.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/tests/test_row_batch_update.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/tests/test_row_cache_staleness.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/tests/test_row_dirty_tracking.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/tests/test_schema_migrations.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/tests/test_security_hardening.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/tests/test_server_cursor.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/tests/test_single_autocommit_safety.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/tests/test_spreadsheet_functions.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/tests/test_sqs_per_record_transactions.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/tests/test_ssm_config.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/tests/test_sys_modified_count_postgres_demo.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/tests/test_table_alter.py +0 -0
- {velocity_python-0.1.55 → velocity_python-0.1.56}/tests/test_where_clause_validation.py +0 -0
|
@@ -421,13 +421,13 @@ class Engine:
|
|
|
421
421
|
config = self.config.copy()
|
|
422
422
|
if timeout_key not in config:
|
|
423
423
|
config[timeout_key] = timeout_val
|
|
424
|
-
|
|
424
|
+
conn = self.driver.connect(**config)
|
|
425
425
|
|
|
426
426
|
elif isinstance(self.config, str):
|
|
427
427
|
conn_str = self.config
|
|
428
428
|
if timeout_key not in conn_str:
|
|
429
429
|
conn_str += f" {timeout_key}={timeout_val}"
|
|
430
|
-
|
|
430
|
+
conn = self.driver.connect(conn_str)
|
|
431
431
|
|
|
432
432
|
elif isinstance(self.config, (tuple, list)):
|
|
433
433
|
config_args = list(self.config)
|
|
@@ -436,16 +436,50 @@ class Engine:
|
|
|
436
436
|
config_args[-1][timeout_key] = timeout_val
|
|
437
437
|
else:
|
|
438
438
|
config_args.append({timeout_key: timeout_val})
|
|
439
|
-
|
|
439
|
+
conn = self.driver.connect(*config_args)
|
|
440
440
|
|
|
441
441
|
else:
|
|
442
442
|
raise TypeError(
|
|
443
443
|
f"Unhandled configuration parameter type: {type(self.config)}"
|
|
444
444
|
)
|
|
445
445
|
|
|
446
|
+
self._register_connection_adapters(conn)
|
|
447
|
+
return conn
|
|
448
|
+
|
|
446
449
|
except Exception as e:
|
|
447
450
|
raise self.process_error(e)
|
|
448
451
|
|
|
452
|
+
def _register_connection_adapters(self, conn):
|
|
453
|
+
"""
|
|
454
|
+
Register driver-specific type adapters on a freshly opened connection.
|
|
455
|
+
|
|
456
|
+
For PostgreSQL (psycopg v3) this teaches the connection to send a bare
|
|
457
|
+
``dict`` as JSONB. psycopg has no built-in ``dict`` dumper, so without
|
|
458
|
+
this any dict passed for a JSON/JSONB column raises
|
|
459
|
+
``cannot adapt type 'dict'``. Registering it here keeps velocity's
|
|
460
|
+
"dicts in, dicts out" contract: callers pass a dict, it lands as JSONB.
|
|
461
|
+
|
|
462
|
+
Only ``dict`` is mapped — ``list`` is intentionally left alone so it
|
|
463
|
+
keeps adapting to PostgreSQL arrays (``= ANY(%s)``, array columns).
|
|
464
|
+
Callers that already serialize to a JSON string keep working: a str is
|
|
465
|
+
sent as text and cast into the JSONB column.
|
|
466
|
+
"""
|
|
467
|
+
if "postgre" not in self.sql.server.lower():
|
|
468
|
+
return
|
|
469
|
+
try:
|
|
470
|
+
from psycopg.types.json import JsonbDumper, JsonbBinaryDumper
|
|
471
|
+
except Exception:
|
|
472
|
+
return
|
|
473
|
+
try:
|
|
474
|
+
# Register both text and binary dumpers so dict adapts regardless of
|
|
475
|
+
# the negotiated parameter format (mirrors psycopg's own default
|
|
476
|
+
# registration for its Jsonb wrapper type).
|
|
477
|
+
conn.adapters.register_dumper(dict, JsonbDumper)
|
|
478
|
+
conn.adapters.register_dumper(dict, JsonbBinaryDumper)
|
|
479
|
+
except Exception:
|
|
480
|
+
# Never let adapter registration break connection establishment.
|
|
481
|
+
pass
|
|
482
|
+
|
|
449
483
|
def transaction(self, func_or_cls=None):
|
|
450
484
|
"""
|
|
451
485
|
Decorator that provides a Transaction. If `tx` is passed in, uses it; otherwise, creates a new one.
|
|
@@ -162,6 +162,7 @@ tests/test_decorators.py
|
|
|
162
162
|
tests/test_dirty_pipeline_fast_path.py
|
|
163
163
|
tests/test_email_processing.py
|
|
164
164
|
tests/test_iconv_money_to_cents.py
|
|
165
|
+
tests/test_jsonb_dict_adapter.py
|
|
165
166
|
tests/test_lambda_handler.py
|
|
166
167
|
tests/test_lambda_handler_auth.py
|
|
167
168
|
tests/test_mixins_import.py
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"""Tests for automatic dict -> JSONB adaptation on PostgreSQL connections.
|
|
2
|
+
|
|
3
|
+
Regression for the production failure in client_payment_accounts upserts
|
|
4
|
+
(stripe/braintree/authorizenet mirrors): a bare ``dict`` passed for a JSONB
|
|
5
|
+
column raised ``psycopg.ProgrammingError: cannot adapt type 'dict'`` because
|
|
6
|
+
psycopg v3 ships no built-in dict dumper.
|
|
7
|
+
|
|
8
|
+
The engine now registers ``JsonbDumper`` for ``dict`` on each new PostgreSQL
|
|
9
|
+
connection, so callers keep velocity's "dicts in, dicts out" contract.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
import os
|
|
13
|
+
from unittest.mock import MagicMock, patch
|
|
14
|
+
|
|
15
|
+
import pytest
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
_PG_ENV = {
|
|
19
|
+
"DBDatabase": "testdb",
|
|
20
|
+
"DBHost": "localhost",
|
|
21
|
+
"DBPort": "5432",
|
|
22
|
+
"DBUser": "user",
|
|
23
|
+
"DBPassword": "pass",
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class TestDictJsonbAdapterRegistration:
|
|
28
|
+
@patch.dict(os.environ, _PG_ENV)
|
|
29
|
+
def test_dict_dumper_registered_on_postgres_connect(self):
|
|
30
|
+
from velocity.db.servers.postgres import initialize
|
|
31
|
+
from psycopg.types.json import JsonbDumper, JsonbBinaryDumper
|
|
32
|
+
|
|
33
|
+
conn = MagicMock(closed=False)
|
|
34
|
+
with patch("psycopg.connect", return_value=conn):
|
|
35
|
+
engine = initialize(pool_enabled=False)
|
|
36
|
+
engine.connect()
|
|
37
|
+
|
|
38
|
+
conn.adapters.register_dumper.assert_any_call(dict, JsonbDumper)
|
|
39
|
+
conn.adapters.register_dumper.assert_any_call(dict, JsonbBinaryDumper)
|
|
40
|
+
|
|
41
|
+
@patch.dict(os.environ, _PG_ENV)
|
|
42
|
+
def test_connection_still_returned_if_registration_fails(self):
|
|
43
|
+
"""Adapter registration must never break connection establishment."""
|
|
44
|
+
from velocity.db.servers.postgres import initialize
|
|
45
|
+
|
|
46
|
+
conn = MagicMock(closed=False)
|
|
47
|
+
conn.adapters.register_dumper.side_effect = RuntimeError("boom")
|
|
48
|
+
with patch("psycopg.connect", return_value=conn):
|
|
49
|
+
engine = initialize(pool_enabled=False)
|
|
50
|
+
result = engine.connect()
|
|
51
|
+
|
|
52
|
+
assert result is conn
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
class TestJsonbDumperSerializesBareDict:
|
|
56
|
+
"""The registered dumper must actually serialize a bare dict to JSONB."""
|
|
57
|
+
|
|
58
|
+
def test_text_dumper_dumps_bare_dict_to_json(self):
|
|
59
|
+
from psycopg.types.json import JsonbDumper
|
|
60
|
+
|
|
61
|
+
out = bytes(JsonbDumper(dict).dump({"card_payments": "active"}))
|
|
62
|
+
assert out == b'{"card_payments": "active"}'
|
|
63
|
+
|
|
64
|
+
def test_binary_dumper_dumps_bare_dict_to_jsonb(self):
|
|
65
|
+
from psycopg.types.json import JsonbBinaryDumper
|
|
66
|
+
|
|
67
|
+
out = bytes(JsonbBinaryDumper(dict).dump({"card_payments": "active"}))
|
|
68
|
+
# JSONB binary wire format is a 0x01 version byte followed by JSON text.
|
|
69
|
+
assert out[:1] == b"\x01"
|
|
70
|
+
assert b'"card_payments"' in out
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
class TestNonPostgresUnaffected:
|
|
74
|
+
def test_sqlite_connect_does_not_register_dict_dumper(self):
|
|
75
|
+
"""Non-PostgreSQL engines must not attempt psycopg adapter registration."""
|
|
76
|
+
from velocity.db.servers.sqlite import initialize
|
|
77
|
+
|
|
78
|
+
engine = initialize(config={"database": ":memory:"})
|
|
79
|
+
conn = engine.connect()
|
|
80
|
+
# A sqlite3 connection has no `.adapters`; reaching it would have raised.
|
|
81
|
+
assert conn is not None
|
|
82
|
+
conn.close()
|
|
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.55 → velocity_python-0.1.56}/src/velocity/aws/handlers/context_factory.py
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/aws/handlers/lambda_handler.py
RENAMED
|
File without changes
|
{velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/aws/handlers/mixins/__init__.py
RENAMED
|
File without changes
|
{velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/aws/handlers/mixins/data_service.py
RENAMED
|
File without changes
|
{velocity_python-0.1.55 → velocity_python-0.1.56}/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
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.55 → velocity_python-0.1.56}/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.55 → velocity_python-0.1.56}/src/velocity/db/servers/mysql/operators.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/servers/postgres/__init__.py
RENAMED
|
File without changes
|
{velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/servers/postgres/operators.py
RENAMED
|
File without changes
|
{velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/servers/postgres/reserved.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/servers/sqlite/__init__.py
RENAMED
|
File without changes
|
{velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/servers/sqlite/operators.py
RENAMED
|
File without changes
|
{velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/servers/sqlite/reserved.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/servers/sqlserver/__init__.py
RENAMED
|
File without changes
|
{velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/servers/sqlserver/operators.py
RENAMED
|
File without changes
|
{velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/servers/sqlserver/reserved.py
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/servers/sqlserver/types.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/tests/postgres/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/tests/postgres/conftest.py
RENAMED
|
File without changes
|
{velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/tests/postgres/test_column.py
RENAMED
|
File without changes
|
{velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/tests/postgres/test_connections.py
RENAMED
|
File without changes
|
{velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/tests/postgres/test_database.py
RENAMED
|
File without changes
|
{velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/tests/postgres/test_engine.py
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/tests/postgres/test_imports.py
RENAMED
|
File without changes
|
{velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/tests/postgres/test_result.py
RENAMED
|
File without changes
|
{velocity_python-0.1.55 → velocity_python-0.1.56}/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.55 → velocity_python-0.1.56}/src/velocity/db/tests/postgres/test_sequence.py
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/tests/postgres/test_table.py
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.55 → velocity_python-0.1.56}/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.55 → velocity_python-0.1.56}/src/velocity/db/tests/test_cursor_rowcount_fix.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/tests/test_postgres_unchanged.py
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/db/tests/test_result_caching.py
RENAMED
|
File without changes
|
{velocity_python-0.1.55 → velocity_python-0.1.56}/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
|
|
File without changes
|
{velocity_python-0.1.55 → velocity_python-0.1.56}/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.55 → velocity_python-0.1.56}/src/velocity/payment/authorizenet_adapter.py
RENAMED
|
File without changes
|
{velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity/payment/authorizenet_mirror.py
RENAMED
|
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.55 → velocity_python-0.1.56}/src/velocity_python.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
{velocity_python-0.1.55 → velocity_python-0.1.56}/src/velocity_python.egg-info/entry_points.txt
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.55 → velocity_python-0.1.56}/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
|
|
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.55 → velocity_python-0.1.56}/tests/test_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
|
|
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.55 → velocity_python-0.1.56}/tests/test_sys_modified_count_postgres_demo.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|