velocity-python 0.1.117__tar.gz → 0.1.120__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.117/src/velocity_python.egg-info → velocity_python-0.1.120}/PKG-INFO +1 -1
- {velocity_python-0.1.117 → velocity_python-0.1.120}/pyproject.toml +1 -1
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/__init__.py +1 -1
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/facets.py +72 -5
- {velocity_python-0.1.117 → velocity_python-0.1.120/src/velocity_python.egg-info}/PKG-INFO +1 -1
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_facets.py +86 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/LICENSE +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/README.md +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/setup.cfg +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/__init__.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/amplify.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/amplify_build.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/assets/__init__.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/assets/backfill.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/assets/indexing.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/assets/references.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/assets/service.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/assets/usage_index.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/blobs.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/capabilities/__init__.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/capabilities/base.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/capabilities/dispatch.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/capabilities/infra.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/capabilities/jobs.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/capabilities/provisioning.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/capabilities/retention.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/capabilities/security.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/capabilities/single_session.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/deploy/__init__.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/deploy/config.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/deploy/operations.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/deploy/policies.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/deploy/reconcile.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/deploy/targets.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/dirty_pipeline.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/email.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/feature_flags.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/handlers/__init__.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/handlers/base_handler.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/handlers/context.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/handlers/context_factory.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/handlers/exceptions.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/handlers/lambda_handler.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/handlers/masquerade.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/handlers/mixins/__init__.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/handlers/mixins/data_service.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/handlers/mixins/job_handler.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/handlers/mixins/session_control.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/handlers/mixins/web_handler.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/handlers/perf.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/handlers/response.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/handlers/sqs_handler.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/job_lifecycle.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/job_results.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/mirror.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/ops.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/s3.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/sms.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/ssm_config.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/tests/__init__.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/tests/test_amplify_build_policy_size.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/tests/test_amplify_build_shim.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/tests/test_base_handler_error_response.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/tests/test_deploy_policies.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/tests/test_deploy_reconcile.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/tests/test_email.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/tests/test_lambda_handler_json_serialization.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/tests/test_response.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/tests/test_sms.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/cache.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/__init__.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/core/__init__.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/core/async_support.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/core/column.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/core/database.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/core/decorators.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/core/engine.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/core/jsonproxy.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/core/lazy_engine.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/core/result.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/core/row.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/core/sequence.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/core/table.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/core/transaction.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/core/view.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/exceptions.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/maintenance.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/migrations.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/servers/__init__.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/servers/base/__init__.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/servers/base/initializer.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/servers/base/operators.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/servers/base/sql.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/servers/base/types.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/servers/mysql/__init__.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/servers/mysql/operators.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/servers/mysql/reserved.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/servers/mysql/sql.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/servers/mysql/types.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/servers/postgres/__init__.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/servers/postgres/operators.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/servers/postgres/reserved.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/servers/postgres/sql.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/servers/postgres/types.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/servers/sqlite/__init__.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/servers/sqlite/operators.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/servers/sqlite/reserved.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/servers/sqlite/sql.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/servers/sqlite/types.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/servers/sqlserver/__init__.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/servers/sqlserver/operators.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/servers/sqlserver/reserved.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/servers/sqlserver/sql.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/servers/sqlserver/types.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/servers/tablehelper.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/tests/__init__.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/tests/common_db_test.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/tests/postgres/__init__.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/tests/postgres/common.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/tests/postgres/conftest.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/tests/postgres/test_column.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/tests/postgres/test_connections.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/tests/postgres/test_database.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/tests/postgres/test_engine.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/tests/postgres/test_general_usage.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/tests/postgres/test_imports.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/tests/postgres/test_result.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/tests/postgres/test_row.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/tests/postgres/test_row_comprehensive.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/tests/postgres/test_schema_locking.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/tests/postgres/test_schema_locking_unit.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/tests/postgres/test_sequence.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/tests/postgres/test_sql_comprehensive.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/tests/postgres/test_table.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/tests/postgres/test_table_comprehensive.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/tests/postgres/test_transaction.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/tests/sql/__init__.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/tests/sql/common.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/tests/sql/test_postgres_select_advanced.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/tests/sql/test_postgres_select_variances.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/tests/test_cursor_rowcount_fix.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/tests/test_db_utils.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/tests/test_postgres.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/tests/test_postgres_unchanged.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/tests/test_process_error_robustness.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/tests/test_result_caching.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/tests/test_result_sql_aware.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/tests/test_row_get_missing_column.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/tests/test_schema_locking_initializers.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/tests/test_schema_locking_simple.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/tests/test_sql_builder.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/tests/test_tablehelper.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/tests/test_view_helper.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/utils.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/logging.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/misc/__init__.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/misc/conv/__init__.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/misc/conv/iconv.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/misc/conv/oconv.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/misc/db.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/misc/export.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/misc/format.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/misc/mail.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/misc/merge.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/misc/pdf.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/misc/tests/__init__.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/misc/tests/test_db.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/misc/tests/test_fix.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/misc/tests/test_format.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/misc/tests/test_iconv.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/misc/tests/test_mail_send.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/misc/tests/test_merge.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/misc/tests/test_oconv.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/misc/tests/test_original_error.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/misc/tests/test_timer.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/misc/timer.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/misc/tools.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/nosql/__init__.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/nosql/core/__init__.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/nosql/core/capabilities.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/nosql/core/store.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/nosql/core/where.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/nosql/exceptions.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/nosql/servers/__init__.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/nosql/servers/base/__init__.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/nosql/servers/cassandra/__init__.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/nosql/servers/cassandra/translation.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/nosql/servers/couchbase/__init__.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/nosql/servers/couchbase/translation.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/nosql/servers/dynamodb/__init__.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/nosql/servers/dynamodb/translation.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/nosql/servers/elasticsearch/__init__.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/nosql/servers/elasticsearch/translation.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/nosql/servers/memory/__init__.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/nosql/servers/mongodb/__init__.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/nosql/servers/mongodb/translation.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/nosql/servers/redis/__init__.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/payment/__init__.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/payment/authorizenet_adapter.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/payment/authorizenet_mirror.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/payment/base_adapter.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/payment/braintree_adapter.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/payment/braintree_mirror.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/payment/charge_rules.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/payment/stripe_adapter.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/payment/stripe_mirror.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity_python.egg-info/SOURCES.txt +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity_python.egg-info/dependency_links.txt +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity_python.egg-info/entry_points.txt +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity_python.egg-info/requires.txt +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity_python.egg-info/top_level.txt +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_access_error_403.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_activity_tracking_aborted_tx.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_amplify_build.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_asset_indexing.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_asset_references.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_assets_service.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_async_support.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_batch_operations.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_blob_store.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_capabilities.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_capability_catalog.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_cognito_user_cache.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_column_tx_arg.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_concurrency_safety.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_connection_pool.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_connection_resilience.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_context_flags_loader.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_context_job_descriptions.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_data_service_query_cap.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_data_service_renumber.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_data_service_save_as.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_db_credentials_ssm_cascade.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_db_maintenance.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_decorators.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_delete_hook_fk_blocked.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_dirty_pipeline_fast_path.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_email_processing.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_enqueue_send_failures.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_feature_flags.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_get_cognito_user_provider.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_http_handler_rollback.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_iconv_money_to_cents.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_identifier_injection_guard.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_job_handler.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_job_lifecycle.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_job_results.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_json_columns.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_jsonb_dict_adapter.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_lambda_handler.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_lambda_handler_auth.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_lambda_handler_masquerade.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_lambda_handler_user_cache.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_lazy_engine.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_masquerade_grant.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_mirror.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_mixins_import.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_n_plus_one.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_nosql_dynamodb.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_nosql_memory.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_nosql_mongodb.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_nosql_redis.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_nosql_translation.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_nosql_where.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_observability.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_on_commit.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_ops.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_payment_authorizenet_adapter.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_payment_braintree_adapter.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_payment_braintree_mirror.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_payment_mirror_empty_table.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_payment_profile_sorting.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_payment_stripe_adapter.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_pdf.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_prepared_statements.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_psycopg3_upgrade.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_query_cache.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_query_missing_table_unlocked.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_read_cache.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_response.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_restricted_direct_tables.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_result_returning.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_retry_side_effect_guard.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_return_default_safety.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_row_batch_update.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_row_cache_staleness.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_schema_migrations.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_security_capability.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_security_hardening.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_server_cursor.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_session_control.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_single_autocommit_safety.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_single_session_capability.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_spreadsheet_functions.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_sqlite_backend.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_sqs_per_record_transactions.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_ssm_config.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_store_user_data.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_sys_modified_count_postgres_demo.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_table_alter.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_table_find_cache.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_table_purge.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_transaction_class_wrapping.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_transaction_commit_and_ownership.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_transaction_edge_cases.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_where_clause_validation.py +0 -0
- {velocity_python-0.1.117 → velocity_python-0.1.120}/tests/test_write_hook_create_flow.py +0 -0
|
@@ -18,6 +18,8 @@ The wire shape is one list under ``params.facets``::
|
|
|
18
18
|
{"field": "internal_date", "kind": "since", "value": "30d"},
|
|
19
19
|
{"field": "from_domain", "kind": "text", "value": "example.com",
|
|
20
20
|
"match": "contains"},
|
|
21
|
+
{"field": "from_domain", "kind": "domain", "values": ["example.com"],
|
|
22
|
+
"exclude": true},
|
|
21
23
|
]
|
|
22
24
|
|
|
23
25
|
Facets AND together; the values of one facet OR together. Kinds:
|
|
@@ -34,7 +36,17 @@ Facets AND together; the values of one facet OR together. Kinds:
|
|
|
34
36
|
database's session time zone.
|
|
35
37
|
``text`` a write-in, case-insensitive, against ``field::text``:
|
|
36
38
|
``match`` is ``contains`` (default), ``equals`` or ``starts``.
|
|
37
|
-
The user's ``%`` and ``_`` are literal.
|
|
39
|
+
The user's ``%`` and ``_`` are literal. With ``fields`` (a list
|
|
40
|
+
of columns) the term is matched against each, OR'd — one box
|
|
41
|
+
that searches subject *or* snippet.
|
|
42
|
+
``domain`` a domain and every subdomain of it: each value (``example.com``)
|
|
43
|
+
matches ``field`` equal to it or ending in ``.example.com``,
|
|
44
|
+
case-insensitively; values OR together. "This top-level
|
|
45
|
+
domain", from a cell that reads ``em1.mail.example.com``.
|
|
46
|
+
|
|
47
|
+
Any facet may carry ``"exclude": true``: its predicate is negated, NULL-safe
|
|
48
|
+
— ``NOT COALESCE((…), false)`` — so a row the predicate cannot judge (the
|
|
49
|
+
column is NULL) is kept, not hidden. "Hide everything from this domain."
|
|
38
50
|
|
|
39
51
|
Anything malformed — an unknown kind, a field that is not a bare identifier,
|
|
40
52
|
too many or too long values — raises :class:`FacetError` rather than being
|
|
@@ -47,7 +59,7 @@ no column types are needed here.
|
|
|
47
59
|
from __future__ import annotations
|
|
48
60
|
|
|
49
61
|
import re
|
|
50
|
-
from typing import Any, Dict, List, Optional,
|
|
62
|
+
from typing import Any, Dict, List, Optional, Tuple
|
|
51
63
|
|
|
52
64
|
# The SQL emitted here is PostgreSQL's (jsonb ``@>``, ``make_interval``,
|
|
53
65
|
# ``ILIKE``), and importing the postgres SQL module is what fills in
|
|
@@ -57,11 +69,12 @@ from velocity.db.servers.tablehelper import TableHelper
|
|
|
57
69
|
|
|
58
70
|
PARAM_KEY = "facets"
|
|
59
71
|
|
|
60
|
-
KINDS = ("values", "contains", "presence", "since", "text")
|
|
72
|
+
KINDS = ("values", "contains", "presence", "since", "text", "domain")
|
|
61
73
|
MATCHES = ("contains", "equals", "starts")
|
|
62
74
|
PRESENCE = ("present", "absent")
|
|
63
75
|
|
|
64
76
|
MAX_FACETS = 40
|
|
77
|
+
MAX_FIELDS = 10
|
|
65
78
|
MAX_VALUES = 200
|
|
66
79
|
MAX_VALUE_CHARS = 500
|
|
67
80
|
MAX_DAYS = 3660
|
|
@@ -183,6 +196,27 @@ def _kind_since(column: str, entry: Dict[str, Any], field: str) -> Optional[Pred
|
|
|
183
196
|
return f"{column} >= now() - make_interval(days => %s)", (days,)
|
|
184
197
|
|
|
185
198
|
|
|
199
|
+
def _columns(entry: Dict[str, Any], column: str, field: str) -> List[str]:
|
|
200
|
+
"""The column(s) a text facet matches: ``fields`` when given, else the field."""
|
|
201
|
+
fields = entry.get("fields")
|
|
202
|
+
if fields in (None, "", []):
|
|
203
|
+
return [column]
|
|
204
|
+
if not isinstance(fields, (list, tuple)):
|
|
205
|
+
raise FacetError(f"facet {field}: 'fields' must be a list of column names")
|
|
206
|
+
if len(fields) > MAX_FIELDS:
|
|
207
|
+
raise FacetError(f"facet {field}: more than {MAX_FIELDS} fields")
|
|
208
|
+
out = []
|
|
209
|
+
for name in fields:
|
|
210
|
+
if not isinstance(name, str) or not _IDENTIFIER.match(name):
|
|
211
|
+
raise FacetError(
|
|
212
|
+
f"facet {field}: fields must be column names, got {name!r}"
|
|
213
|
+
)
|
|
214
|
+
quoted = TableHelper.quote(name)
|
|
215
|
+
if quoted not in out:
|
|
216
|
+
out.append(quoted)
|
|
217
|
+
return out
|
|
218
|
+
|
|
219
|
+
|
|
186
220
|
def _kind_text(column: str, entry: Dict[str, Any], field: str) -> Optional[Predicate]:
|
|
187
221
|
value = _one(entry, field)
|
|
188
222
|
if not value:
|
|
@@ -196,7 +230,30 @@ def _kind_text(column: str, entry: Dict[str, Any], field: str) -> Optional[Predi
|
|
|
196
230
|
"starts": f"{escaped}%",
|
|
197
231
|
"equals": escaped,
|
|
198
232
|
}[match]
|
|
199
|
-
|
|
233
|
+
columns = _columns(entry, column, field)
|
|
234
|
+
if len(columns) == 1:
|
|
235
|
+
return f"{columns[0]}::text ILIKE %s", (pattern,)
|
|
236
|
+
parts = " OR ".join(f"{name}::text ILIKE %s" for name in columns)
|
|
237
|
+
return f"({parts})", tuple(pattern for _ in columns)
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+
def _kind_domain(column: str, entry: Dict[str, Any], field: str) -> Optional[Predicate]:
|
|
241
|
+
parts: List[str] = []
|
|
242
|
+
params: List[str] = []
|
|
243
|
+
for value in _values(entry, field):
|
|
244
|
+
domain = value.strip().lower().strip(".")
|
|
245
|
+
if not domain:
|
|
246
|
+
continue
|
|
247
|
+
if "@" in domain or any(ch.isspace() for ch in domain):
|
|
248
|
+
raise FacetError(f"facet {field}: {value!r} is not a domain")
|
|
249
|
+
escaped = _LIKE_SPECIAL.sub(r"\\\1", domain)
|
|
250
|
+
parts.append(f"({column}::text ILIKE %s OR {column}::text ILIKE %s)")
|
|
251
|
+
params.extend((escaped, f"%.{escaped}"))
|
|
252
|
+
if not parts:
|
|
253
|
+
return None
|
|
254
|
+
if len(parts) == 1:
|
|
255
|
+
return parts[0], tuple(params)
|
|
256
|
+
return f"({' OR '.join(parts)})", tuple(params)
|
|
200
257
|
|
|
201
258
|
|
|
202
259
|
_BUILDERS = {
|
|
@@ -205,6 +262,7 @@ _BUILDERS = {
|
|
|
205
262
|
"presence": _kind_presence,
|
|
206
263
|
"since": _kind_since,
|
|
207
264
|
"text": _kind_text,
|
|
265
|
+
"domain": _kind_domain,
|
|
208
266
|
}
|
|
209
267
|
|
|
210
268
|
|
|
@@ -216,8 +274,17 @@ def predicate(entry: Any) -> Optional[Predicate]:
|
|
|
216
274
|
kind = str(entry.get("kind") or "values").lower()
|
|
217
275
|
if kind not in _BUILDERS:
|
|
218
276
|
raise FacetError(f"facet {field}: unknown kind {kind!r}")
|
|
277
|
+
exclude = entry.get("exclude", False)
|
|
278
|
+
if not isinstance(exclude, bool):
|
|
279
|
+
raise FacetError(f"facet {field}: 'exclude' must be true or false")
|
|
219
280
|
column = TableHelper.quote(field)
|
|
220
|
-
|
|
281
|
+
built = _BUILDERS[kind](column, entry, field)
|
|
282
|
+
if built is None or not exclude:
|
|
283
|
+
return built
|
|
284
|
+
sql, params = built
|
|
285
|
+
# NULL-safe negation: a NULL column makes the inner predicate NULL, and
|
|
286
|
+
# plain NOT would drop the row; COALESCE keeps it.
|
|
287
|
+
return f"NOT COALESCE(({sql}), false)", params
|
|
221
288
|
|
|
222
289
|
|
|
223
290
|
def build_where(facets: Any) -> Optional[Predicate]:
|
|
@@ -81,6 +81,91 @@ def test_text_matches_are_case_insensitive_and_escape_like_wildcards():
|
|
|
81
81
|
facets.predicate({"field": "x", "kind": "text", "value": "a", "match": "regex"})
|
|
82
82
|
|
|
83
83
|
|
|
84
|
+
def test_text_over_several_fields_ors_one_term_across_them():
|
|
85
|
+
sql, params = facets.predicate(
|
|
86
|
+
{
|
|
87
|
+
"field": "subject",
|
|
88
|
+
"kind": "text",
|
|
89
|
+
"value": "invoice",
|
|
90
|
+
"fields": ["subject", "snippet"],
|
|
91
|
+
}
|
|
92
|
+
)
|
|
93
|
+
assert sql == "(subject::text ILIKE %s OR snippet::text ILIKE %s)"
|
|
94
|
+
assert params == ("%invoice%", "%invoice%")
|
|
95
|
+
# one field, or the facet's own field, is the plain form
|
|
96
|
+
assert facets.predicate(
|
|
97
|
+
{"field": "subject", "kind": "text", "value": "x", "fields": ["snippet"]}
|
|
98
|
+
) == ("snippet::text ILIKE %s", ("%x%",))
|
|
99
|
+
assert facets.predicate(
|
|
100
|
+
{"field": "subject", "kind": "text", "value": "x", "fields": []}
|
|
101
|
+
) == (
|
|
102
|
+
"subject::text ILIKE %s",
|
|
103
|
+
("%x%",),
|
|
104
|
+
)
|
|
105
|
+
# duplicates collapse, reserved words are quoted, junk is refused
|
|
106
|
+
sql, _params = facets.predicate(
|
|
107
|
+
{"field": "a", "kind": "text", "value": "x", "fields": ["order", "order", "b"]}
|
|
108
|
+
)
|
|
109
|
+
assert sql == '("order"::text ILIKE %s OR b::text ILIKE %s)'
|
|
110
|
+
for fields in ("subject", ["subject; drop"], [1], ["a"] * (facets.MAX_FIELDS + 1)):
|
|
111
|
+
with pytest.raises(facets.FacetError):
|
|
112
|
+
facets.predicate(
|
|
113
|
+
{"field": "a", "kind": "text", "value": "x", "fields": fields}
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def test_domain_matches_the_domain_and_every_subdomain_case_insensitively():
|
|
118
|
+
assert facets.predicate(
|
|
119
|
+
{"field": "from_domain", "kind": "domain", "values": ["Example.com"]}
|
|
120
|
+
) == (
|
|
121
|
+
"(from_domain::text ILIKE %s OR from_domain::text ILIKE %s)",
|
|
122
|
+
("example.com", "%.example.com"),
|
|
123
|
+
)
|
|
124
|
+
sql, params = facets.predicate(
|
|
125
|
+
{"field": "from_domain", "kind": "domain", "values": ["a.com", ".b.org."]}
|
|
126
|
+
)
|
|
127
|
+
assert sql == (
|
|
128
|
+
"((from_domain::text ILIKE %s OR from_domain::text ILIKE %s) OR "
|
|
129
|
+
"(from_domain::text ILIKE %s OR from_domain::text ILIKE %s))"
|
|
130
|
+
)
|
|
131
|
+
assert params == ("a.com", "%.a.com", "b.org", "%.b.org")
|
|
132
|
+
# LIKE wildcards in a value are literal characters
|
|
133
|
+
_sql, params = facets.predicate(
|
|
134
|
+
{"field": "d", "kind": "domain", "values": ["100%_x.com"]}
|
|
135
|
+
)
|
|
136
|
+
assert params == ("100\\%\\_x.com", "%.100\\%\\_x.com")
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
def test_domain_refuses_an_address_or_whitespace_and_ignores_blanks():
|
|
140
|
+
for bad in ("user@example.com", "two words.com", "a\tb.com"):
|
|
141
|
+
with pytest.raises(facets.FacetError):
|
|
142
|
+
facets.predicate({"field": "d", "kind": "domain", "values": [bad]})
|
|
143
|
+
assert facets.predicate({"field": "d", "kind": "domain", "values": ["", ".", " "]}) is None
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
def test_exclude_negates_null_safely_for_any_kind():
|
|
147
|
+
assert facets.predicate(
|
|
148
|
+
{"field": "from_address", "values": ["test@example.com"], "exclude": True}
|
|
149
|
+
) == ("NOT COALESCE((from_address = %s), false)", ("test@example.com",))
|
|
150
|
+
assert facets.predicate(
|
|
151
|
+
{"field": "from_domain", "kind": "domain", "values": ["y.com"], "exclude": True}
|
|
152
|
+
) == (
|
|
153
|
+
"NOT COALESCE(((from_domain::text ILIKE %s OR from_domain::text ILIKE %s)), false)",
|
|
154
|
+
("y.com", "%.y.com"),
|
|
155
|
+
)
|
|
156
|
+
assert facets.predicate(
|
|
157
|
+
{"field": "subject", "kind": "text", "value": "spam", "exclude": True}
|
|
158
|
+
) == ("NOT COALESCE((subject::text ILIKE %s), false)", ("%spam%",))
|
|
159
|
+
# the flag is explicit: false and absent are the plain predicate
|
|
160
|
+
plain = facets.predicate({"field": "a", "values": ["1"]})
|
|
161
|
+
assert facets.predicate({"field": "a", "values": ["1"], "exclude": False}) == plain
|
|
162
|
+
# nothing selected excludes nothing
|
|
163
|
+
assert facets.predicate({"field": "a", "values": [], "exclude": True}) is None
|
|
164
|
+
for bad in ("true", 1, None):
|
|
165
|
+
with pytest.raises(facets.FacetError):
|
|
166
|
+
facets.predicate({"field": "a", "values": ["1"], "exclude": bad})
|
|
167
|
+
|
|
168
|
+
|
|
84
169
|
def test_an_empty_selection_is_no_predicate_not_an_error():
|
|
85
170
|
for entry in (
|
|
86
171
|
{"field": "a", "values": []},
|
|
@@ -89,6 +174,7 @@ def test_an_empty_selection_is_no_predicate_not_an_error():
|
|
|
89
174
|
{"field": "a", "kind": "presence", "value": ""},
|
|
90
175
|
{"field": "a", "kind": "since", "value": None},
|
|
91
176
|
{"field": "a", "kind": "text", "value": " "},
|
|
177
|
+
{"field": "a", "kind": "domain", "values": []},
|
|
92
178
|
):
|
|
93
179
|
assert facets.predicate(entry) is None
|
|
94
180
|
assert facets.build_where([{"field": "a", "values": []}]) is None
|
|
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.117 → velocity_python-0.1.120}/src/velocity/aws/capabilities/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/capabilities/dispatch.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/capabilities/provisioning.py
RENAMED
|
File without changes
|
{velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/capabilities/retention.py
RENAMED
|
File without changes
|
{velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/capabilities/security.py
RENAMED
|
File without changes
|
{velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/capabilities/single_session.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/handlers/base_handler.py
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/handlers/context_factory.py
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/handlers/lambda_handler.py
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/handlers/mixins/__init__.py
RENAMED
|
File without changes
|
{velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/handlers/mixins/data_service.py
RENAMED
|
File without changes
|
{velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/handlers/mixins/job_handler.py
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/handlers/mixins/web_handler.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/handlers/sqs_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
|
{velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/tests/test_deploy_policies.py
RENAMED
|
File without changes
|
{velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/aws/tests/test_deploy_reconcile.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/servers/base/__init__.py
RENAMED
|
File without changes
|
{velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/servers/base/initializer.py
RENAMED
|
File without changes
|
{velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/servers/base/operators.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/servers/mysql/__init__.py
RENAMED
|
File without changes
|
{velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/servers/mysql/operators.py
RENAMED
|
File without changes
|
{velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/servers/mysql/reserved.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/servers/postgres/__init__.py
RENAMED
|
File without changes
|
{velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/servers/postgres/operators.py
RENAMED
|
File without changes
|
{velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/servers/postgres/reserved.py
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/servers/postgres/types.py
RENAMED
|
File without changes
|
{velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/servers/sqlite/__init__.py
RENAMED
|
File without changes
|
{velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/servers/sqlite/operators.py
RENAMED
|
File without changes
|
{velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/servers/sqlite/reserved.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/servers/sqlserver/__init__.py
RENAMED
|
File without changes
|
{velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/servers/sqlserver/operators.py
RENAMED
|
File without changes
|
{velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/servers/sqlserver/reserved.py
RENAMED
|
File without changes
|
{velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/servers/sqlserver/sql.py
RENAMED
|
File without changes
|
{velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/servers/sqlserver/types.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/tests/postgres/__init__.py
RENAMED
|
File without changes
|
{velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/tests/postgres/common.py
RENAMED
|
File without changes
|
{velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/tests/postgres/conftest.py
RENAMED
|
File without changes
|
{velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/tests/postgres/test_column.py
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/tests/postgres/test_database.py
RENAMED
|
File without changes
|
{velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/tests/postgres/test_engine.py
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/tests/postgres/test_imports.py
RENAMED
|
File without changes
|
{velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/tests/postgres/test_result.py
RENAMED
|
File without changes
|
{velocity_python-0.1.117 → velocity_python-0.1.120}/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.117 → velocity_python-0.1.120}/src/velocity/db/tests/postgres/test_sequence.py
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.1.117 → velocity_python-0.1.120}/src/velocity/db/tests/postgres/test_table.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|