velocity-python 0.1.36__tar.gz → 0.1.37__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.36/src/velocity_python.egg-info → velocity_python-0.1.37}/PKG-INFO +1 -1
- {velocity_python-0.1.36 → velocity_python-0.1.37}/pyproject.toml +1 -1
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/__init__.py +1 -1
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/payment/braintree_mirror.py +32 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37/src/velocity_python.egg-info}/PKG-INFO +1 -1
- velocity_python-0.1.37/tests/test_payment_braintree_mirror.py +130 -0
- velocity_python-0.1.36/tests/test_payment_braintree_mirror.py +0 -50
- {velocity_python-0.1.36 → velocity_python-0.1.37}/LICENSE +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/README.md +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/setup.cfg +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/aws/__init__.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/aws/amplify.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/aws/amplify_build.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/aws/assets/__init__.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/aws/assets/backfill.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/aws/assets/indexing.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/aws/assets/references.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/aws/assets/service.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/aws/assets/usage_index.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/aws/dirty_pipeline.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/aws/handlers/__init__.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/aws/handlers/base_handler.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/aws/handlers/context.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/aws/handlers/context_factory.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/aws/handlers/exceptions.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/aws/handlers/lambda_handler.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/aws/handlers/mixins/__init__.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/aws/handlers/mixins/data_service.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/aws/handlers/mixins/web_handler.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/aws/handlers/perf.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/aws/handlers/response.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/aws/handlers/sqs_handler.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/aws/s3.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/aws/ssm_config.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/aws/tests/__init__.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/aws/tests/test_base_handler_error_response.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/aws/tests/test_lambda_handler_json_serialization.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/aws/tests/test_response.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/__init__.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/core/__init__.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/core/async_support.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/core/column.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/core/database.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/core/decorators.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/core/engine.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/core/result.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/core/row.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/core/sequence.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/core/table.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/core/transaction.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/core/view.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/exceptions.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/migrations.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/servers/__init__.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/servers/base/__init__.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/servers/base/initializer.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/servers/base/operators.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/servers/base/sql.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/servers/base/types.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/servers/mysql/__init__.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/servers/mysql/operators.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/servers/mysql/reserved.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/servers/mysql/sql.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/servers/mysql/types.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/servers/postgres/__init__.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/servers/postgres/operators.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/servers/postgres/reserved.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/servers/postgres/sql.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/servers/postgres/types.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/servers/sqlite/__init__.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/servers/sqlite/operators.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/servers/sqlite/reserved.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/servers/sqlite/sql.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/servers/sqlite/types.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/servers/sqlserver/__init__.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/servers/sqlserver/operators.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/servers/sqlserver/reserved.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/servers/sqlserver/sql.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/servers/sqlserver/types.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/servers/tablehelper.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/tests/__init__.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/tests/common_db_test.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/tests/postgres/__init__.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/tests/postgres/common.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/tests/postgres/test_column.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/tests/postgres/test_connections.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/tests/postgres/test_database.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/tests/postgres/test_engine.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/tests/postgres/test_general_usage.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/tests/postgres/test_imports.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/tests/postgres/test_result.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/tests/postgres/test_row.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/tests/postgres/test_row_comprehensive.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/tests/postgres/test_schema_locking.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/tests/postgres/test_schema_locking_unit.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/tests/postgres/test_sequence.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/tests/postgres/test_sql_comprehensive.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/tests/postgres/test_table.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/tests/postgres/test_table_comprehensive.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/tests/postgres/test_transaction.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/tests/sql/__init__.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/tests/sql/common.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/tests/sql/test_postgres_select_advanced.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/tests/sql/test_postgres_select_variances.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/tests/test_cursor_rowcount_fix.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/tests/test_db_utils.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/tests/test_postgres.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/tests/test_postgres_unchanged.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/tests/test_process_error_robustness.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/tests/test_result_caching.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/tests/test_result_sql_aware.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/tests/test_row_get_missing_column.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/tests/test_schema_locking_initializers.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/tests/test_schema_locking_simple.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/tests/test_sql_builder.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/tests/test_tablehelper.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/tests/test_view_helper.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/utils.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/logging.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/misc/__init__.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/misc/conv/__init__.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/misc/conv/iconv.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/misc/conv/oconv.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/misc/db.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/misc/export.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/misc/format.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/misc/mail.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/misc/merge.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/misc/pdf.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/misc/tests/__init__.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/misc/tests/test_db.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/misc/tests/test_fix.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/misc/tests/test_format.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/misc/tests/test_iconv.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/misc/tests/test_merge.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/misc/tests/test_oconv.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/misc/tests/test_original_error.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/misc/tests/test_timer.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/misc/timer.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/misc/tools.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/payment/__init__.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/payment/authorizenet_adapter.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/payment/authorizenet_mirror.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/payment/base_adapter.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/payment/braintree_adapter.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/payment/charge_rules.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/payment/stripe_adapter.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/payment/stripe_mirror.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity_python.egg-info/SOURCES.txt +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity_python.egg-info/dependency_links.txt +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity_python.egg-info/entry_points.txt +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity_python.egg-info/requires.txt +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity_python.egg-info/top_level.txt +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/tests/test_amplify_build.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/tests/test_asset_indexing.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/tests/test_asset_references.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/tests/test_assets_service.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/tests/test_async_support.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/tests/test_batch_operations.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/tests/test_concurrency_safety.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/tests/test_connection_pool.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/tests/test_connection_resilience.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/tests/test_decorators.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/tests/test_dirty_pipeline_fast_path.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/tests/test_email_processing.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/tests/test_iconv_money_to_cents.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/tests/test_lambda_handler.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/tests/test_lambda_handler_auth.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/tests/test_mixins_import.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/tests/test_n_plus_one.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/tests/test_observability.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/tests/test_payment_authorizenet_adapter.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/tests/test_payment_braintree_adapter.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/tests/test_payment_profile_sorting.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/tests/test_payment_stripe_adapter.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/tests/test_pdf.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/tests/test_prepared_statements.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/tests/test_psycopg3_upgrade.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/tests/test_query_cache.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/tests/test_row_batch_update.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/tests/test_row_cache_staleness.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/tests/test_row_dirty_tracking.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/tests/test_schema_migrations.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/tests/test_security_hardening.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/tests/test_server_cursor.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/tests/test_spreadsheet_functions.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/tests/test_sqs_per_record_transactions.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/tests/test_sys_modified_count_postgres_demo.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/tests/test_table_alter.py +0 -0
- {velocity_python-0.1.36 → velocity_python-0.1.37}/tests/test_where_clause_validation.py +0 -0
|
@@ -23,6 +23,13 @@ def _recursive_marker(value: Any) -> str:
|
|
|
23
23
|
return f"<recursive:{type(value).__name__}>"
|
|
24
24
|
|
|
25
25
|
|
|
26
|
+
def _attribute_getter_fields(value: Any):
|
|
27
|
+
fields = getattr(value, "_setattrs", None)
|
|
28
|
+
if not isinstance(fields, (list, tuple, set)):
|
|
29
|
+
return None
|
|
30
|
+
return [str(field) for field in fields if not str(field).startswith("_")]
|
|
31
|
+
|
|
32
|
+
|
|
26
33
|
def _to_jsonable(value: Any, _stack: Optional[Set[int]] = None) -> Any:
|
|
27
34
|
if value is None or isinstance(value, (str, int, float, bool)):
|
|
28
35
|
return value
|
|
@@ -47,6 +54,16 @@ def _to_jsonable(value: Any, _stack: Optional[Set[int]] = None) -> Any:
|
|
|
47
54
|
return [_to_jsonable(item, _stack) for item in value]
|
|
48
55
|
finally:
|
|
49
56
|
_stack.remove(value_id)
|
|
57
|
+
attribute_fields = _attribute_getter_fields(value)
|
|
58
|
+
if attribute_fields is not None:
|
|
59
|
+
_stack.add(value_id)
|
|
60
|
+
try:
|
|
61
|
+
return {
|
|
62
|
+
key: _to_jsonable(getattr(value, key, None), _stack)
|
|
63
|
+
for key in attribute_fields
|
|
64
|
+
}
|
|
65
|
+
finally:
|
|
66
|
+
_stack.remove(value_id)
|
|
50
67
|
if hasattr(value, "__dict__"):
|
|
51
68
|
_stack.add(value_id)
|
|
52
69
|
try:
|
|
@@ -81,10 +98,25 @@ def _table(tx, table_name: str):
|
|
|
81
98
|
return table
|
|
82
99
|
|
|
83
100
|
|
|
101
|
+
def _filtered_payload_for_table(table, payload: Dict[str, Any]) -> Dict[str, Any]:
|
|
102
|
+
try:
|
|
103
|
+
existing_columns = {
|
|
104
|
+
str(column).lower() for column in (table.sys_columns() or [])
|
|
105
|
+
}
|
|
106
|
+
except Exception:
|
|
107
|
+
return payload
|
|
108
|
+
if not existing_columns:
|
|
109
|
+
return payload
|
|
110
|
+
return {
|
|
111
|
+
key: value for key, value in payload.items() if str(key).lower() in existing_columns
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
|
|
84
115
|
def _upsert(tx, table_name: str, payload: Dict[str, Any], key: Dict[str, Any]):
|
|
85
116
|
table = _table(tx, table_name)
|
|
86
117
|
if not table:
|
|
87
118
|
return None
|
|
119
|
+
payload = _filtered_payload_for_table(table, payload)
|
|
88
120
|
table.upsert(payload, key)
|
|
89
121
|
return payload
|
|
90
122
|
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import json
|
|
2
|
+
|
|
3
|
+
from velocity.payment.braintree_mirror import upsert_braintree_transaction_record
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class FakeTable:
|
|
7
|
+
def __init__(self):
|
|
8
|
+
self.upserts = []
|
|
9
|
+
|
|
10
|
+
def exists(self):
|
|
11
|
+
return True
|
|
12
|
+
|
|
13
|
+
def upsert(self, payload, key):
|
|
14
|
+
self.upserts.append((payload, key))
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class ColumnAwareTable(FakeTable):
|
|
18
|
+
def __init__(self, columns):
|
|
19
|
+
super().__init__()
|
|
20
|
+
self._columns = columns
|
|
21
|
+
|
|
22
|
+
def sys_columns(self):
|
|
23
|
+
return list(self._columns)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class FakeTx:
|
|
27
|
+
def __init__(self):
|
|
28
|
+
self._table = FakeTable()
|
|
29
|
+
|
|
30
|
+
def table(self, table_name):
|
|
31
|
+
assert table_name == "braintree_transaction"
|
|
32
|
+
return self._table
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class ColumnAwareTx(FakeTx):
|
|
36
|
+
def __init__(self, columns):
|
|
37
|
+
self._table = ColumnAwareTable(columns)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class RecursiveTransaction:
|
|
41
|
+
def __init__(self):
|
|
42
|
+
self.id = "txn_recursive"
|
|
43
|
+
self.status = "submitted_for_settlement"
|
|
44
|
+
self.amount = "10.50"
|
|
45
|
+
self.custom_fields = {"client_id": "client_1"}
|
|
46
|
+
self.credit_card_details = None
|
|
47
|
+
self.paypal_details = None
|
|
48
|
+
self.customer_details = None
|
|
49
|
+
self.billing_details = None
|
|
50
|
+
self.child = self
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
class GatewayInternal:
|
|
54
|
+
def __init__(self):
|
|
55
|
+
self.configuration = {"private_key": "secret"}
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
class AttributeGetterStyleTransaction:
|
|
59
|
+
def __init__(self):
|
|
60
|
+
self._setattrs = [
|
|
61
|
+
"id",
|
|
62
|
+
"status",
|
|
63
|
+
"amount",
|
|
64
|
+
"custom_fields",
|
|
65
|
+
"credit_card_details",
|
|
66
|
+
"paypal_details",
|
|
67
|
+
"customer_details",
|
|
68
|
+
"billing_details",
|
|
69
|
+
"child",
|
|
70
|
+
]
|
|
71
|
+
self.id = "txn_gateway_trimmed"
|
|
72
|
+
self.status = "submitted_for_settlement"
|
|
73
|
+
self.amount = "42.00"
|
|
74
|
+
self.custom_fields = {"client_id": "client_2"}
|
|
75
|
+
self.credit_card_details = None
|
|
76
|
+
self.paypal_details = None
|
|
77
|
+
self.customer_details = None
|
|
78
|
+
self.billing_details = None
|
|
79
|
+
self.child = self
|
|
80
|
+
self.gateway = GatewayInternal()
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def test_upsert_braintree_transaction_record_handles_recursive_objects():
|
|
84
|
+
tx = FakeTx()
|
|
85
|
+
transaction = RecursiveTransaction()
|
|
86
|
+
|
|
87
|
+
payload = upsert_braintree_transaction_record(tx, transaction)
|
|
88
|
+
|
|
89
|
+
assert payload is not None
|
|
90
|
+
assert payload["braintree_id"] == "txn_recursive"
|
|
91
|
+
raw_response = json.loads(payload["raw_response"])
|
|
92
|
+
assert raw_response["id"] == "txn_recursive"
|
|
93
|
+
assert raw_response["child"] == "<recursive:RecursiveTransaction>"
|
|
94
|
+
assert tx._table.upserts
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def test_upsert_braintree_transaction_record_skips_gateway_internals():
|
|
98
|
+
tx = FakeTx()
|
|
99
|
+
transaction = AttributeGetterStyleTransaction()
|
|
100
|
+
|
|
101
|
+
payload = upsert_braintree_transaction_record(tx, transaction)
|
|
102
|
+
|
|
103
|
+
assert payload is not None
|
|
104
|
+
raw_response = json.loads(payload["raw_response"])
|
|
105
|
+
assert raw_response["id"] == "txn_gateway_trimmed"
|
|
106
|
+
assert raw_response["child"] == "<recursive:AttributeGetterStyleTransaction>"
|
|
107
|
+
assert "gateway" not in raw_response
|
|
108
|
+
assert tx._table.upserts
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def test_upsert_braintree_transaction_record_omits_missing_columns():
|
|
112
|
+
tx = ColumnAwareTx(
|
|
113
|
+
[
|
|
114
|
+
"braintree_id",
|
|
115
|
+
"status",
|
|
116
|
+
"amount",
|
|
117
|
+
"amount_attempted",
|
|
118
|
+
"authorized_amount",
|
|
119
|
+
"payment_ok",
|
|
120
|
+
]
|
|
121
|
+
)
|
|
122
|
+
transaction = RecursiveTransaction()
|
|
123
|
+
|
|
124
|
+
payload = upsert_braintree_transaction_record(tx, transaction)
|
|
125
|
+
|
|
126
|
+
assert payload is not None
|
|
127
|
+
assert payload["braintree_id"] == "txn_recursive"
|
|
128
|
+
assert "raw_response" not in payload
|
|
129
|
+
assert "update_source" not in payload
|
|
130
|
+
assert tx._table.upserts
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import json
|
|
2
|
-
|
|
3
|
-
from velocity.payment.braintree_mirror import upsert_braintree_transaction_record
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
class FakeTable:
|
|
7
|
-
def __init__(self):
|
|
8
|
-
self.upserts = []
|
|
9
|
-
|
|
10
|
-
def exists(self):
|
|
11
|
-
return True
|
|
12
|
-
|
|
13
|
-
def upsert(self, payload, key):
|
|
14
|
-
self.upserts.append((payload, key))
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
class FakeTx:
|
|
18
|
-
def __init__(self):
|
|
19
|
-
self._table = FakeTable()
|
|
20
|
-
|
|
21
|
-
def table(self, table_name):
|
|
22
|
-
assert table_name == "braintree_transaction"
|
|
23
|
-
return self._table
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
class RecursiveTransaction:
|
|
27
|
-
def __init__(self):
|
|
28
|
-
self.id = "txn_recursive"
|
|
29
|
-
self.status = "submitted_for_settlement"
|
|
30
|
-
self.amount = "10.50"
|
|
31
|
-
self.custom_fields = {"client_id": "client_1"}
|
|
32
|
-
self.credit_card_details = None
|
|
33
|
-
self.paypal_details = None
|
|
34
|
-
self.customer_details = None
|
|
35
|
-
self.billing_details = None
|
|
36
|
-
self.child = self
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
def test_upsert_braintree_transaction_record_handles_recursive_objects():
|
|
40
|
-
tx = FakeTx()
|
|
41
|
-
transaction = RecursiveTransaction()
|
|
42
|
-
|
|
43
|
-
payload = upsert_braintree_transaction_record(tx, transaction)
|
|
44
|
-
|
|
45
|
-
assert payload is not None
|
|
46
|
-
assert payload["braintree_id"] == "txn_recursive"
|
|
47
|
-
raw_response = json.loads(payload["raw_response"])
|
|
48
|
-
assert raw_response["id"] == "txn_recursive"
|
|
49
|
-
assert raw_response["child"] == "<recursive:RecursiveTransaction>"
|
|
50
|
-
assert tx._table.upserts
|
|
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.36 → velocity_python-0.1.37}/src/velocity/aws/handlers/context_factory.py
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/aws/handlers/lambda_handler.py
RENAMED
|
File without changes
|
{velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/aws/handlers/mixins/__init__.py
RENAMED
|
File without changes
|
{velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/aws/handlers/mixins/data_service.py
RENAMED
|
File without changes
|
{velocity_python-0.1.36 → velocity_python-0.1.37}/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
|
|
File without changes
|
{velocity_python-0.1.36 → velocity_python-0.1.37}/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.36 → velocity_python-0.1.37}/src/velocity/db/servers/mysql/operators.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/servers/postgres/__init__.py
RENAMED
|
File without changes
|
{velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/servers/postgres/operators.py
RENAMED
|
File without changes
|
{velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/servers/postgres/reserved.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/servers/sqlite/__init__.py
RENAMED
|
File without changes
|
{velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/servers/sqlite/operators.py
RENAMED
|
File without changes
|
{velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/servers/sqlite/reserved.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/servers/sqlserver/__init__.py
RENAMED
|
File without changes
|
{velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/servers/sqlserver/operators.py
RENAMED
|
File without changes
|
{velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/servers/sqlserver/reserved.py
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/servers/sqlserver/types.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/tests/postgres/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/tests/postgres/test_column.py
RENAMED
|
File without changes
|
{velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/tests/postgres/test_connections.py
RENAMED
|
File without changes
|
{velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/tests/postgres/test_database.py
RENAMED
|
File without changes
|
{velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/tests/postgres/test_engine.py
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/tests/postgres/test_imports.py
RENAMED
|
File without changes
|
{velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/tests/postgres/test_result.py
RENAMED
|
File without changes
|
{velocity_python-0.1.36 → velocity_python-0.1.37}/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.36 → velocity_python-0.1.37}/src/velocity/db/tests/postgres/test_sequence.py
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/tests/postgres/test_table.py
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.36 → velocity_python-0.1.37}/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.36 → velocity_python-0.1.37}/src/velocity/db/tests/test_cursor_rowcount_fix.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/tests/test_postgres_unchanged.py
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity/db/tests/test_result_caching.py
RENAMED
|
File without changes
|
{velocity_python-0.1.36 → velocity_python-0.1.37}/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.36 → velocity_python-0.1.37}/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.36 → velocity_python-0.1.37}/src/velocity/payment/authorizenet_adapter.py
RENAMED
|
File without changes
|
{velocity_python-0.1.36 → velocity_python-0.1.37}/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.36 → velocity_python-0.1.37}/src/velocity_python.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
{velocity_python-0.1.36 → velocity_python-0.1.37}/src/velocity_python.egg-info/entry_points.txt
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.36 → velocity_python-0.1.37}/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
|
{velocity_python-0.1.36 → velocity_python-0.1.37}/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
|
{velocity_python-0.1.36 → velocity_python-0.1.37}/tests/test_sys_modified_count_postgres_demo.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|