velocity-python 0.1.34__tar.gz → 0.1.36__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.34/src/velocity_python.egg-info → velocity_python-0.1.36}/PKG-INFO +1 -1
- {velocity_python-0.1.34 → velocity_python-0.1.36}/pyproject.toml +1 -1
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/__init__.py +1 -1
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/aws/handlers/mixins/data_service.py +59 -23
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/payment/braintree_mirror.py +34 -9
- {velocity_python-0.1.34 → velocity_python-0.1.36/src/velocity_python.egg-info}/PKG-INFO +1 -1
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity_python.egg-info/SOURCES.txt +1 -0
- velocity_python-0.1.36/tests/test_payment_braintree_mirror.py +50 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/LICENSE +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/README.md +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/setup.cfg +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/aws/__init__.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/aws/amplify.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/aws/amplify_build.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/aws/assets/__init__.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/aws/assets/backfill.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/aws/assets/indexing.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/aws/assets/references.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/aws/assets/service.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/aws/assets/usage_index.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/aws/dirty_pipeline.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/aws/handlers/__init__.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/aws/handlers/base_handler.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/aws/handlers/context.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/aws/handlers/context_factory.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/aws/handlers/exceptions.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/aws/handlers/lambda_handler.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/aws/handlers/mixins/__init__.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/aws/handlers/mixins/web_handler.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/aws/handlers/perf.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/aws/handlers/response.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/aws/handlers/sqs_handler.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/aws/s3.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/aws/ssm_config.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/aws/tests/__init__.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/aws/tests/test_base_handler_error_response.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/aws/tests/test_lambda_handler_json_serialization.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/aws/tests/test_response.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/__init__.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/core/__init__.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/core/async_support.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/core/column.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/core/database.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/core/decorators.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/core/engine.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/core/result.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/core/row.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/core/sequence.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/core/table.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/core/transaction.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/core/view.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/exceptions.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/migrations.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/servers/__init__.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/servers/base/__init__.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/servers/base/initializer.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/servers/base/operators.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/servers/base/sql.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/servers/base/types.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/servers/mysql/__init__.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/servers/mysql/operators.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/servers/mysql/reserved.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/servers/mysql/sql.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/servers/mysql/types.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/servers/postgres/__init__.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/servers/postgres/operators.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/servers/postgres/reserved.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/servers/postgres/sql.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/servers/postgres/types.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/servers/sqlite/__init__.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/servers/sqlite/operators.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/servers/sqlite/reserved.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/servers/sqlite/sql.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/servers/sqlite/types.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/servers/sqlserver/__init__.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/servers/sqlserver/operators.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/servers/sqlserver/reserved.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/servers/sqlserver/sql.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/servers/sqlserver/types.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/servers/tablehelper.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/tests/__init__.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/tests/common_db_test.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/tests/postgres/__init__.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/tests/postgres/common.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/tests/postgres/test_column.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/tests/postgres/test_connections.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/tests/postgres/test_database.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/tests/postgres/test_engine.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/tests/postgres/test_general_usage.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/tests/postgres/test_imports.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/tests/postgres/test_result.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/tests/postgres/test_row.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/tests/postgres/test_row_comprehensive.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/tests/postgres/test_schema_locking.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/tests/postgres/test_schema_locking_unit.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/tests/postgres/test_sequence.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/tests/postgres/test_sql_comprehensive.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/tests/postgres/test_table.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/tests/postgres/test_table_comprehensive.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/tests/postgres/test_transaction.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/tests/sql/__init__.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/tests/sql/common.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/tests/sql/test_postgres_select_advanced.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/tests/sql/test_postgres_select_variances.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/tests/test_cursor_rowcount_fix.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/tests/test_db_utils.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/tests/test_postgres.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/tests/test_postgres_unchanged.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/tests/test_process_error_robustness.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/tests/test_result_caching.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/tests/test_result_sql_aware.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/tests/test_row_get_missing_column.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/tests/test_schema_locking_initializers.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/tests/test_schema_locking_simple.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/tests/test_sql_builder.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/tests/test_tablehelper.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/tests/test_view_helper.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/utils.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/logging.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/misc/__init__.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/misc/conv/__init__.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/misc/conv/iconv.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/misc/conv/oconv.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/misc/db.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/misc/export.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/misc/format.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/misc/mail.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/misc/merge.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/misc/pdf.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/misc/tests/__init__.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/misc/tests/test_db.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/misc/tests/test_fix.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/misc/tests/test_format.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/misc/tests/test_iconv.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/misc/tests/test_merge.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/misc/tests/test_oconv.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/misc/tests/test_original_error.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/misc/tests/test_timer.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/misc/timer.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/misc/tools.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/payment/__init__.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/payment/authorizenet_adapter.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/payment/authorizenet_mirror.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/payment/base_adapter.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/payment/braintree_adapter.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/payment/charge_rules.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/payment/stripe_adapter.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/payment/stripe_mirror.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity_python.egg-info/dependency_links.txt +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity_python.egg-info/entry_points.txt +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity_python.egg-info/requires.txt +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity_python.egg-info/top_level.txt +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/tests/test_amplify_build.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/tests/test_asset_indexing.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/tests/test_asset_references.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/tests/test_assets_service.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/tests/test_async_support.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/tests/test_batch_operations.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/tests/test_concurrency_safety.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/tests/test_connection_pool.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/tests/test_connection_resilience.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/tests/test_decorators.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/tests/test_dirty_pipeline_fast_path.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/tests/test_email_processing.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/tests/test_iconv_money_to_cents.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/tests/test_lambda_handler.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/tests/test_lambda_handler_auth.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/tests/test_mixins_import.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/tests/test_n_plus_one.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/tests/test_observability.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/tests/test_payment_authorizenet_adapter.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/tests/test_payment_braintree_adapter.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/tests/test_payment_profile_sorting.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/tests/test_payment_stripe_adapter.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/tests/test_pdf.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/tests/test_prepared_statements.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/tests/test_psycopg3_upgrade.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/tests/test_query_cache.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/tests/test_row_batch_update.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/tests/test_row_cache_staleness.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/tests/test_row_dirty_tracking.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/tests/test_schema_migrations.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/tests/test_security_hardening.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/tests/test_server_cursor.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/tests/test_spreadsheet_functions.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/tests/test_sqs_per_record_transactions.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/tests/test_sys_modified_count_postgres_demo.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/tests/test_table_alter.py +0 -0
- {velocity_python-0.1.34 → velocity_python-0.1.36}/tests/test_where_clause_validation.py +0 -0
{velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/aws/handlers/mixins/data_service.py
RENAMED
|
@@ -654,6 +654,15 @@ class DataServiceMixin:
|
|
|
654
654
|
md = "\n".join([header_row, separator] + data_rows)
|
|
655
655
|
return md.encode("utf-8"), f"{filename_base}.md", "text/markdown"
|
|
656
656
|
|
|
657
|
+
if result_format == "excel":
|
|
658
|
+
buf = BytesIO()
|
|
659
|
+
export.create_spreadsheet(headers, rows, buf)
|
|
660
|
+
return (
|
|
661
|
+
buf.getvalue(),
|
|
662
|
+
f"{filename_base}.xlsx",
|
|
663
|
+
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
|
664
|
+
)
|
|
665
|
+
|
|
657
666
|
if result_format == "xlsx":
|
|
658
667
|
try:
|
|
659
668
|
from openpyxl import Workbook
|
|
@@ -673,30 +682,57 @@ class DataServiceMixin:
|
|
|
673
682
|
)
|
|
674
683
|
|
|
675
684
|
if result_format == "ods":
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
685
|
+
# Build ODS directly as a ZIP+XML — avoids odfpy's DOM approach
|
|
686
|
+
# which creates a Python object per cell and hangs on large datasets.
|
|
687
|
+
import zipfile
|
|
688
|
+
|
|
689
|
+
def _ods_escape(v):
|
|
690
|
+
s = "" if v is None else str(v)
|
|
691
|
+
return s.replace("&", "&").replace("<", "<").replace(">", ">")
|
|
692
|
+
|
|
693
|
+
def _ods_row(values):
|
|
694
|
+
cells = "".join(
|
|
695
|
+
f'<table:table-cell office:value-type="string">'
|
|
696
|
+
f'<text:p>{_ods_escape(v)}</text:p>'
|
|
697
|
+
f'</table:table-cell>'
|
|
698
|
+
for v in values
|
|
699
|
+
)
|
|
700
|
+
return f"<table:table-row>{cells}</table:table-row>"
|
|
701
|
+
|
|
702
|
+
content_xml = (
|
|
703
|
+
'<?xml version="1.0" encoding="UTF-8"?>'
|
|
704
|
+
'<office:document-content'
|
|
705
|
+
' xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"'
|
|
706
|
+
' xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0"'
|
|
707
|
+
' xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"'
|
|
708
|
+
' office:version="1.2">'
|
|
709
|
+
'<office:body><office:spreadsheet>'
|
|
710
|
+
'<table:table table:name="Sheet1">'
|
|
711
|
+
+ _ods_row(headers)
|
|
712
|
+
+ "".join(_ods_row(row) for row in rows)
|
|
713
|
+
+ '</table:table></office:spreadsheet></office:body>'
|
|
714
|
+
'</office:document-content>'
|
|
715
|
+
).encode("utf-8")
|
|
716
|
+
manifest_xml = (
|
|
717
|
+
'<?xml version="1.0" encoding="UTF-8"?>'
|
|
718
|
+
'<manifest:manifest'
|
|
719
|
+
' xmlns:manifest="urn:oasis:names:tc:opendocument:xmlns:manifest:1.0"'
|
|
720
|
+
' manifest:version="1.2">'
|
|
721
|
+
'<manifest:file-entry'
|
|
722
|
+
' manifest:media-type="application/vnd.oasis.opendocument.spreadsheet"'
|
|
723
|
+
' manifest:full-path="/"/>'
|
|
724
|
+
'<manifest:file-entry'
|
|
725
|
+
' manifest:media-type="text/xml"'
|
|
726
|
+
' manifest:full-path="content.xml"/>'
|
|
727
|
+
'</manifest:manifest>'
|
|
728
|
+
).encode("utf-8")
|
|
698
729
|
buf = BytesIO()
|
|
699
|
-
|
|
730
|
+
with zipfile.ZipFile(buf, "w", compression=zipfile.ZIP_DEFLATED) as zf:
|
|
731
|
+
# mimetype must be first and stored uncompressed per ODS spec
|
|
732
|
+
zf.writestr(zipfile.ZipInfo("mimetype"),
|
|
733
|
+
"application/vnd.oasis.opendocument.spreadsheet")
|
|
734
|
+
zf.writestr("META-INF/manifest.xml", manifest_xml)
|
|
735
|
+
zf.writestr("content.xml", content_xml)
|
|
700
736
|
return (
|
|
701
737
|
buf.getvalue(),
|
|
702
738
|
f"{filename_base}.ods",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import json
|
|
2
2
|
from datetime import datetime, timezone
|
|
3
|
-
from typing import Any, Dict, Optional
|
|
3
|
+
from typing import Any, Dict, Optional, Set
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
SUCCESS_STATUSES = {
|
|
@@ -19,19 +19,44 @@ def _get_value(data: Any, key: str, default: Any = None) -> Any:
|
|
|
19
19
|
return getattr(data, key, default)
|
|
20
20
|
|
|
21
21
|
|
|
22
|
-
def
|
|
22
|
+
def _recursive_marker(value: Any) -> str:
|
|
23
|
+
return f"<recursive:{type(value).__name__}>"
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def _to_jsonable(value: Any, _stack: Optional[Set[int]] = None) -> Any:
|
|
23
27
|
if value is None or isinstance(value, (str, int, float, bool)):
|
|
24
28
|
return value
|
|
29
|
+
if _stack is None:
|
|
30
|
+
_stack = set()
|
|
31
|
+
|
|
32
|
+
value_id = id(value)
|
|
33
|
+
if value_id in _stack:
|
|
34
|
+
return _recursive_marker(value)
|
|
35
|
+
|
|
25
36
|
if isinstance(value, dict):
|
|
26
|
-
|
|
37
|
+
_stack.add(value_id)
|
|
38
|
+
try:
|
|
39
|
+
return {
|
|
40
|
+
str(key): _to_jsonable(item, _stack) for key, item in value.items()
|
|
41
|
+
}
|
|
42
|
+
finally:
|
|
43
|
+
_stack.remove(value_id)
|
|
27
44
|
if isinstance(value, (list, tuple, set)):
|
|
28
|
-
|
|
45
|
+
_stack.add(value_id)
|
|
46
|
+
try:
|
|
47
|
+
return [_to_jsonable(item, _stack) for item in value]
|
|
48
|
+
finally:
|
|
49
|
+
_stack.remove(value_id)
|
|
29
50
|
if hasattr(value, "__dict__"):
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
51
|
+
_stack.add(value_id)
|
|
52
|
+
try:
|
|
53
|
+
return {
|
|
54
|
+
str(key): _to_jsonable(item, _stack)
|
|
55
|
+
for key, item in vars(value).items()
|
|
56
|
+
if not str(key).startswith("_")
|
|
57
|
+
}
|
|
58
|
+
finally:
|
|
59
|
+
_stack.remove(value_id)
|
|
35
60
|
return str(value)
|
|
36
61
|
|
|
37
62
|
|
|
@@ -167,6 +167,7 @@ tests/test_n_plus_one.py
|
|
|
167
167
|
tests/test_observability.py
|
|
168
168
|
tests/test_payment_authorizenet_adapter.py
|
|
169
169
|
tests/test_payment_braintree_adapter.py
|
|
170
|
+
tests/test_payment_braintree_mirror.py
|
|
170
171
|
tests/test_payment_profile_sorting.py
|
|
171
172
|
tests/test_payment_stripe_adapter.py
|
|
172
173
|
tests/test_pdf.py
|
|
@@ -0,0 +1,50 @@
|
|
|
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.34 → velocity_python-0.1.36}/src/velocity/aws/handlers/context_factory.py
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/aws/handlers/lambda_handler.py
RENAMED
|
File without changes
|
{velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/aws/handlers/mixins/__init__.py
RENAMED
|
File without changes
|
{velocity_python-0.1.34 → velocity_python-0.1.36}/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.34 → velocity_python-0.1.36}/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.34 → velocity_python-0.1.36}/src/velocity/db/servers/mysql/operators.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/servers/postgres/__init__.py
RENAMED
|
File without changes
|
{velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/servers/postgres/operators.py
RENAMED
|
File without changes
|
{velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/servers/postgres/reserved.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/servers/sqlite/__init__.py
RENAMED
|
File without changes
|
{velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/servers/sqlite/operators.py
RENAMED
|
File without changes
|
{velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/servers/sqlite/reserved.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/servers/sqlserver/__init__.py
RENAMED
|
File without changes
|
{velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/servers/sqlserver/operators.py
RENAMED
|
File without changes
|
{velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/servers/sqlserver/reserved.py
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/servers/sqlserver/types.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/tests/postgres/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/tests/postgres/test_column.py
RENAMED
|
File without changes
|
{velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/tests/postgres/test_connections.py
RENAMED
|
File without changes
|
{velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/tests/postgres/test_database.py
RENAMED
|
File without changes
|
{velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/tests/postgres/test_engine.py
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/tests/postgres/test_imports.py
RENAMED
|
File without changes
|
{velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/tests/postgres/test_result.py
RENAMED
|
File without changes
|
{velocity_python-0.1.34 → velocity_python-0.1.36}/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.34 → velocity_python-0.1.36}/src/velocity/db/tests/postgres/test_sequence.py
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/tests/postgres/test_table.py
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.34 → velocity_python-0.1.36}/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.34 → velocity_python-0.1.36}/src/velocity/db/tests/test_cursor_rowcount_fix.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/tests/test_postgres_unchanged.py
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity/db/tests/test_result_caching.py
RENAMED
|
File without changes
|
{velocity_python-0.1.34 → velocity_python-0.1.36}/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.34 → velocity_python-0.1.36}/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.34 → velocity_python-0.1.36}/src/velocity/payment/authorizenet_adapter.py
RENAMED
|
File without changes
|
{velocity_python-0.1.34 → velocity_python-0.1.36}/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
|
{velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity_python.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
{velocity_python-0.1.34 → velocity_python-0.1.36}/src/velocity_python.egg-info/entry_points.txt
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.34 → velocity_python-0.1.36}/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.34 → velocity_python-0.1.36}/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.34 → velocity_python-0.1.36}/tests/test_sys_modified_count_postgres_demo.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|