velocity-python 0.2.4__tar.gz → 0.2.6__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.
Files changed (409) hide show
  1. {velocity_python-0.2.4/src/velocity_python.egg-info → velocity_python-0.2.6}/PKG-INFO +1 -1
  2. {velocity_python-0.2.4 → velocity_python-0.2.6}/pyproject.toml +1 -1
  3. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/__init__.py +1 -1
  4. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/authz.py +23 -2
  5. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/core/async_support.py +3 -13
  6. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/core/transaction.py +74 -18
  7. {velocity_python-0.2.4 → velocity_python-0.2.6/src/velocity_python.egg-info}/PKG-INFO +1 -1
  8. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_async_support.py +4 -2
  9. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_authz.py +53 -0
  10. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_observability.py +37 -6
  11. {velocity_python-0.2.4 → velocity_python-0.2.6}/LICENSE +0 -0
  12. {velocity_python-0.2.4 → velocity_python-0.2.6}/README.md +0 -0
  13. {velocity_python-0.2.4 → velocity_python-0.2.6}/setup.cfg +0 -0
  14. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/__init__.py +0 -0
  15. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/amplify.py +0 -0
  16. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/assets/__init__.py +0 -0
  17. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/assets/backfill.py +0 -0
  18. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/assets/indexing.py +0 -0
  19. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/assets/references.py +0 -0
  20. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/assets/service.py +0 -0
  21. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/assets/usage_index.py +0 -0
  22. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/blobs.py +0 -0
  23. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/capabilities/__init__.py +0 -0
  24. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/capabilities/base.py +0 -0
  25. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/capabilities/dispatch.py +0 -0
  26. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/capabilities/infra.py +0 -0
  27. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/capabilities/jobs.py +0 -0
  28. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/capabilities/provisioning.py +0 -0
  29. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/capabilities/retention.py +0 -0
  30. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/capabilities/security.py +0 -0
  31. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/capabilities/single_session.py +0 -0
  32. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/deploy/__init__.py +0 -0
  33. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/deploy/ci_gate.py +0 -0
  34. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/deploy/config.py +0 -0
  35. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/deploy/frontend_checks.py +0 -0
  36. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/deploy/operations.py +0 -0
  37. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/deploy/policies.py +0 -0
  38. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/deploy/reconcile.py +0 -0
  39. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/deploy/targets.py +0 -0
  40. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/dirty_pipeline.py +0 -0
  41. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/email.py +0 -0
  42. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/facets.py +0 -0
  43. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/failures.py +0 -0
  44. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/feature_flags.py +0 -0
  45. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/handlers/__init__.py +0 -0
  46. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/handlers/base_handler.py +0 -0
  47. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/handlers/context.py +0 -0
  48. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/handlers/context_factory.py +0 -0
  49. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/handlers/exceptions.py +0 -0
  50. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/handlers/lambda_handler.py +0 -0
  51. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/handlers/masquerade.py +0 -0
  52. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/handlers/mixins/__init__.py +0 -0
  53. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/handlers/mixins/action_names.py +0 -0
  54. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/handlers/mixins/audit_trail.py +0 -0
  55. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/handlers/mixins/client_errors.py +0 -0
  56. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/handlers/mixins/client_input.py +0 -0
  57. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/handlers/mixins/data_service.py +0 -0
  58. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/handlers/mixins/job_handler.py +0 -0
  59. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/handlers/mixins/permissions_actions.py +0 -0
  60. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/handlers/mixins/row_scoped.py +0 -0
  61. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/handlers/mixins/session_control.py +0 -0
  62. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/handlers/mixins/tiles_actions.py +0 -0
  63. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/handlers/mixins/web_handler.py +0 -0
  64. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/handlers/perf.py +0 -0
  65. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/handlers/response.py +0 -0
  66. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/handlers/sqs_handler.py +0 -0
  67. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/identity.py +0 -0
  68. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/job_lifecycle.py +0 -0
  69. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/job_results.py +0 -0
  70. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/mirror.py +0 -0
  71. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/ops.py +0 -0
  72. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/permissions.py +0 -0
  73. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/queue_defaults.py +0 -0
  74. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/s3.py +0 -0
  75. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/schema.py +0 -0
  76. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/sms.py +0 -0
  77. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/ssm_config.py +0 -0
  78. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/tests/__init__.py +0 -0
  79. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/tests/test_base_handler_error_response.py +0 -0
  80. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/tests/test_deploy_least_privilege.py +0 -0
  81. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/tests/test_deploy_policies.py +0 -0
  82. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/tests/test_deploy_policy_size.py +0 -0
  83. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/tests/test_deploy_reconcile.py +0 -0
  84. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/tests/test_email.py +0 -0
  85. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/tests/test_lambda_handler_json_serialization.py +0 -0
  86. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/tests/test_response.py +0 -0
  87. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/tests/test_sms.py +0 -0
  88. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/tiles.py +0 -0
  89. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/aws/user_data.py +0 -0
  90. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/cache.py +0 -0
  91. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/__init__.py +0 -0
  92. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/core/__init__.py +0 -0
  93. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/core/column.py +0 -0
  94. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/core/database.py +0 -0
  95. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/core/decorators.py +0 -0
  96. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/core/engine.py +0 -0
  97. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/core/jsonproxy.py +0 -0
  98. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/core/lazy_engine.py +0 -0
  99. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/core/result.py +0 -0
  100. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/core/row.py +0 -0
  101. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/core/sequence.py +0 -0
  102. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/core/table.py +0 -0
  103. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/core/view.py +0 -0
  104. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/exceptions.py +0 -0
  105. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/fragments.py +0 -0
  106. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/maintenance.py +0 -0
  107. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/migrations.py +0 -0
  108. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/servers/__init__.py +0 -0
  109. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/servers/base/__init__.py +0 -0
  110. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/servers/base/initializer.py +0 -0
  111. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/servers/base/operators.py +0 -0
  112. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/servers/base/sql.py +0 -0
  113. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/servers/base/types.py +0 -0
  114. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/servers/mysql/__init__.py +0 -0
  115. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/servers/mysql/operators.py +0 -0
  116. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/servers/mysql/reserved.py +0 -0
  117. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/servers/mysql/sql.py +0 -0
  118. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/servers/mysql/types.py +0 -0
  119. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/servers/postgres/__init__.py +0 -0
  120. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/servers/postgres/operators.py +0 -0
  121. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/servers/postgres/reserved.py +0 -0
  122. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/servers/postgres/sql.py +0 -0
  123. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/servers/postgres/types.py +0 -0
  124. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/servers/sqlite/__init__.py +0 -0
  125. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/servers/sqlite/operators.py +0 -0
  126. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/servers/sqlite/reserved.py +0 -0
  127. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/servers/sqlite/sql.py +0 -0
  128. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/servers/sqlite/types.py +0 -0
  129. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/servers/sqlserver/__init__.py +0 -0
  130. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/servers/sqlserver/operators.py +0 -0
  131. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/servers/sqlserver/reserved.py +0 -0
  132. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/servers/sqlserver/sql.py +0 -0
  133. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/servers/sqlserver/types.py +0 -0
  134. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/servers/tablehelper.py +0 -0
  135. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/tests/__init__.py +0 -0
  136. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/tests/common_db_test.py +0 -0
  137. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/tests/postgres/__init__.py +0 -0
  138. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/tests/postgres/common.py +0 -0
  139. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/tests/postgres/conftest.py +0 -0
  140. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/tests/postgres/test_column.py +0 -0
  141. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/tests/postgres/test_connections.py +0 -0
  142. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/tests/postgres/test_database.py +0 -0
  143. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/tests/postgres/test_engine.py +0 -0
  144. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/tests/postgres/test_general_usage.py +0 -0
  145. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/tests/postgres/test_imports.py +0 -0
  146. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/tests/postgres/test_result.py +0 -0
  147. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/tests/postgres/test_row.py +0 -0
  148. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/tests/postgres/test_row_comprehensive.py +0 -0
  149. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/tests/postgres/test_schema_locking.py +0 -0
  150. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/tests/postgres/test_schema_locking_unit.py +0 -0
  151. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/tests/postgres/test_sequence.py +0 -0
  152. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/tests/postgres/test_sql_comprehensive.py +0 -0
  153. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/tests/postgres/test_table.py +0 -0
  154. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/tests/postgres/test_table_comprehensive.py +0 -0
  155. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/tests/postgres/test_transaction.py +0 -0
  156. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/tests/sql/__init__.py +0 -0
  157. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/tests/sql/common.py +0 -0
  158. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/tests/sql/test_postgres_select_advanced.py +0 -0
  159. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/tests/sql/test_postgres_select_variances.py +0 -0
  160. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/tests/test_cursor_rowcount_fix.py +0 -0
  161. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/tests/test_db_utils.py +0 -0
  162. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/tests/test_postgres.py +0 -0
  163. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/tests/test_postgres_unchanged.py +0 -0
  164. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/tests/test_process_error_robustness.py +0 -0
  165. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/tests/test_result_caching.py +0 -0
  166. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/tests/test_result_sql_aware.py +0 -0
  167. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/tests/test_row_get_missing_column.py +0 -0
  168. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/tests/test_schema_locking_initializers.py +0 -0
  169. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/tests/test_schema_locking_simple.py +0 -0
  170. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/tests/test_sql_builder.py +0 -0
  171. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/tests/test_tablehelper.py +0 -0
  172. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/tests/test_view_helper.py +0 -0
  173. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/tunnel.py +0 -0
  174. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/db/utils.py +0 -0
  175. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/logging.py +0 -0
  176. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/misc/__init__.py +0 -0
  177. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/misc/conv/__init__.py +0 -0
  178. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/misc/conv/iconv.py +0 -0
  179. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/misc/conv/oconv.py +0 -0
  180. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/misc/db.py +0 -0
  181. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/misc/export.py +0 -0
  182. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/misc/format.py +0 -0
  183. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/misc/mail.py +0 -0
  184. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/misc/merge.py +0 -0
  185. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/misc/pdf.py +0 -0
  186. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/misc/tests/__init__.py +0 -0
  187. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/misc/tests/test_db.py +0 -0
  188. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/misc/tests/test_fix.py +0 -0
  189. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/misc/tests/test_format.py +0 -0
  190. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/misc/tests/test_iconv.py +0 -0
  191. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/misc/tests/test_mail_send.py +0 -0
  192. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/misc/tests/test_merge.py +0 -0
  193. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/misc/tests/test_oconv.py +0 -0
  194. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/misc/tests/test_original_error.py +0 -0
  195. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/misc/tests/test_timer.py +0 -0
  196. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/misc/timer.py +0 -0
  197. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/misc/tools.py +0 -0
  198. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/nosql/__init__.py +0 -0
  199. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/nosql/core/__init__.py +0 -0
  200. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/nosql/core/capabilities.py +0 -0
  201. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/nosql/core/store.py +0 -0
  202. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/nosql/core/where.py +0 -0
  203. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/nosql/exceptions.py +0 -0
  204. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/nosql/servers/__init__.py +0 -0
  205. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/nosql/servers/base/__init__.py +0 -0
  206. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/nosql/servers/cassandra/__init__.py +0 -0
  207. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/nosql/servers/cassandra/translation.py +0 -0
  208. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/nosql/servers/couchbase/__init__.py +0 -0
  209. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/nosql/servers/couchbase/translation.py +0 -0
  210. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/nosql/servers/dynamodb/__init__.py +0 -0
  211. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/nosql/servers/dynamodb/translation.py +0 -0
  212. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/nosql/servers/elasticsearch/__init__.py +0 -0
  213. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/nosql/servers/elasticsearch/translation.py +0 -0
  214. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/nosql/servers/memory/__init__.py +0 -0
  215. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/nosql/servers/mongodb/__init__.py +0 -0
  216. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/nosql/servers/mongodb/translation.py +0 -0
  217. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/nosql/servers/redis/__init__.py +0 -0
  218. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/payment/__init__.py +0 -0
  219. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/payment/_mirror_core.py +0 -0
  220. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/payment/authorizenet_adapter.py +0 -0
  221. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/payment/authorizenet_mirror.py +0 -0
  222. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/payment/base_adapter.py +0 -0
  223. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/payment/braintree_adapter.py +0 -0
  224. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/payment/braintree_mirror.py +0 -0
  225. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/payment/charge_rules.py +0 -0
  226. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/payment/money.py +0 -0
  227. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/payment/plaid_api.py +0 -0
  228. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/payment/plaid_webhook.py +0 -0
  229. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/payment/redact.py +0 -0
  230. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/payment/schema.py +0 -0
  231. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/payment/stripe_adapter.py +0 -0
  232. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/payment/stripe_mirror.py +0 -0
  233. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/testing/__init__.py +0 -0
  234. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity/testing/fake_db.py +0 -0
  235. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity_python.egg-info/SOURCES.txt +0 -0
  236. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity_python.egg-info/dependency_links.txt +0 -0
  237. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity_python.egg-info/entry_points.txt +0 -0
  238. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity_python.egg-info/requires.txt +0 -0
  239. {velocity_python-0.2.4 → velocity_python-0.2.6}/src/velocity_python.egg-info/top_level.txt +0 -0
  240. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_access_error_403.py +0 -0
  241. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_action_names.py +0 -0
  242. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_activity_tracking_aborted_tx.py +0 -0
  243. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_amplify_redirects.py +0 -0
  244. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_asset_indexing.py +0 -0
  245. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_asset_references.py +0 -0
  246. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_assets_service.py +0 -0
  247. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_audit_mixin.py +0 -0
  248. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_aws_package_hygiene.py +0 -0
  249. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_batch_operations.py +0 -0
  250. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_blob_store.py +0 -0
  251. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_business_objects.py +0 -0
  252. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_capabilities.py +0 -0
  253. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_capability_catalog.py +0 -0
  254. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_check_changelog.py +0 -0
  255. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_ci_gate.py +0 -0
  256. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_client_errors_mixin.py +0 -0
  257. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_client_input_contract_export.py +0 -0
  258. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_client_sql_boundary.py +0 -0
  259. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_client_table_gate_case_and_pointers.py +0 -0
  260. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_cognito_user_cache.py +0 -0
  261. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_column_tx_arg.py +0 -0
  262. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_concurrency_safety.py +0 -0
  263. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_connection_pool.py +0 -0
  264. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_connection_resilience.py +0 -0
  265. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_context_flags_loader.py +0 -0
  266. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_context_job_descriptions.py +0 -0
  267. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_context_queue_job.py +0 -0
  268. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_conv_combine.py +0 -0
  269. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_data_service_owner_scope.py +0 -0
  270. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_data_service_query_cap.py +0 -0
  271. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_data_service_renumber.py +0 -0
  272. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_data_service_row_number.py +0 -0
  273. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_data_service_save_as.py +0 -0
  274. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_data_service_security_gates.py +0 -0
  275. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_db_credentials_ssm_cascade.py +0 -0
  276. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_db_maintenance.py +0 -0
  277. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_db_tunnel.py +0 -0
  278. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_declared_column_types.py +0 -0
  279. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_decorators.py +0 -0
  280. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_delete_hook_fk_blocked.py +0 -0
  281. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_deploy_config_fields.py +0 -0
  282. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_deploy_engine.py +0 -0
  283. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_deploy_frontend_checks.py +0 -0
  284. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_deploy_operations_queue.py +0 -0
  285. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_deploy_policies.py +0 -0
  286. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_dirty_pipeline_fast_path.py +0 -0
  287. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_dlq_constant.py +0 -0
  288. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_docs_snippets.py +0 -0
  289. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_email_processing.py +0 -0
  290. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_enqueue_metric_namespace.py +0 -0
  291. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_enqueue_send_failures.py +0 -0
  292. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_ensure_infrastructure.py +0 -0
  293. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_export_workbook.py +0 -0
  294. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_facets.py +0 -0
  295. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_facets_and_where.py +0 -0
  296. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_failures.py +0 -0
  297. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_feature_flags.py +0 -0
  298. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_get_cognito_user_provider.py +0 -0
  299. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_http_handler_rollback.py +0 -0
  300. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_iconv_money_to_cents.py +0 -0
  301. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_identifier_injection_guard.py +0 -0
  302. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_identity.py +0 -0
  303. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_job_handler.py +0 -0
  304. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_job_lifecycle.py +0 -0
  305. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_job_results.py +0 -0
  306. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_json_columns.py +0 -0
  307. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_jsonb_dict_adapter.py +0 -0
  308. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_lambda_handler.py +0 -0
  309. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_lambda_handler_auth.py +0 -0
  310. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_lambda_handler_masquerade.py +0 -0
  311. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_lambda_handler_user_cache.py +0 -0
  312. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_lazy_engine.py +0 -0
  313. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_masquerade_grant.py +0 -0
  314. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_merge_on_conflict.py +0 -0
  315. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_mirror.py +0 -0
  316. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_mirror_upsert_public.py +0 -0
  317. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_mixins_import.py +0 -0
  318. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_n_plus_one.py +0 -0
  319. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_nosql_dynamodb.py +0 -0
  320. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_nosql_memory.py +0 -0
  321. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_nosql_mongodb.py +0 -0
  322. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_nosql_redis.py +0 -0
  323. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_nosql_translation.py +0 -0
  324. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_nosql_where.py +0 -0
  325. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_on_action_default.py +0 -0
  326. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_on_commit.py +0 -0
  327. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_ops.py +0 -0
  328. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_payment_audit_fixes.py +0 -0
  329. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_payment_authorizenet_adapter.py +0 -0
  330. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_payment_braintree_adapter.py +0 -0
  331. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_payment_braintree_mirror.py +0 -0
  332. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_payment_business_agnostic.py +0 -0
  333. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_payment_charge_reference.py +0 -0
  334. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_payment_extra_bounds.py +0 -0
  335. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_payment_lazy_imports.py +0 -0
  336. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_payment_mirror_empty_table.py +0 -0
  337. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_payment_profile_sorting.py +0 -0
  338. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_payment_stripe_adapter.py +0 -0
  339. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_pdf.py +0 -0
  340. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_permissions.py +0 -0
  341. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_permissions_actions.py +0 -0
  342. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_permissions_notices.py +0 -0
  343. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_permissions_review.py +0 -0
  344. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_pgserver_bulk_cache.py +0 -0
  345. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_pgserver_capability_types.py +0 -0
  346. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_pgserver_ensure_infrastructure.py +0 -0
  347. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_pgserver_get_tables.py +0 -0
  348. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_pgserver_permissions.py +0 -0
  349. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_pgserver_pointer_joins.py +0 -0
  350. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_pgserver_row_scope.py +0 -0
  351. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_pgserver_search_export.py +0 -0
  352. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_pgserver_tiles.py +0 -0
  353. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_pgserver_user_data.py +0 -0
  354. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_plaid_api.py +0 -0
  355. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_plaid_webhook.py +0 -0
  356. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_pointer_join_sql.py +0 -0
  357. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_postgres_initializer_config.py +0 -0
  358. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_postgres_py_type.py +0 -0
  359. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_prepared_statements.py +0 -0
  360. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_psycopg3_upgrade.py +0 -0
  361. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_query_cache.py +0 -0
  362. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_query_missing_table_unlocked.py +0 -0
  363. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_raw_sql_prefix_policy.py +0 -0
  364. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_read_cache.py +0 -0
  365. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_readme_imports.py +0 -0
  366. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_response.py +0 -0
  367. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_restricted_direct_tables.py +0 -0
  368. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_result_returning.py +0 -0
  369. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_retry_side_effect_guard.py +0 -0
  370. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_return_default_safety.py +0 -0
  371. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_row_batch_update.py +0 -0
  372. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_row_cache_staleness.py +0 -0
  373. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_row_scoped_data_service.py +0 -0
  374. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_s3_bucket_config.py +0 -0
  375. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_s3_list_client_files.py +0 -0
  376. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_s3_upload.py +0 -0
  377. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_schema_lock_config_other_backends.py +0 -0
  378. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_schema_migrations.py +0 -0
  379. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_search_paging_export.py +0 -0
  380. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_security_capability.py +0 -0
  381. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_security_hardening.py +0 -0
  382. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_server_cursor.py +0 -0
  383. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_session_control.py +0 -0
  384. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_single_autocommit_safety.py +0 -0
  385. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_single_session_capability.py +0 -0
  386. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_sms_twilio_signature.py +0 -0
  387. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_spreadsheet_functions.py +0 -0
  388. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_sqlite_backend.py +0 -0
  389. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_sqs_per_record_transactions.py +0 -0
  390. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_ssm_config.py +0 -0
  391. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_ssm_config_require.py +0 -0
  392. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_store_user_data.py +0 -0
  393. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_sys_modified_count_postgres_demo.py +0 -0
  394. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_table_alter.py +0 -0
  395. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_table_claim.py +0 -0
  396. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_table_find_cache.py +0 -0
  397. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_table_purge.py +0 -0
  398. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_testing_fake_db.py +0 -0
  399. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_tiles.py +0 -0
  400. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_transaction_class_wrapping.py +0 -0
  401. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_transaction_commit_and_ownership.py +0 -0
  402. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_transaction_edge_cases.py +0 -0
  403. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_tx_lifecycle_retry.py +0 -0
  404. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_tx_read_cache_and_bulk.py +0 -0
  405. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_user_data.py +0 -0
  406. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_user_not_provisioned.py +0 -0
  407. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_where_clause_validation.py +0 -0
  408. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_write_hook_create_flow.py +0 -0
  409. {velocity_python-0.2.4 → velocity_python-0.2.6}/tests/test_write_hook_empty_strings.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: velocity-python
3
- Version: 0.2.4
3
+ Version: 0.2.6
4
4
  Summary: A rapid application development library for interfacing with data storage
5
5
  Author-email: Velocity Team <info@codeclubs.org>
6
6
  License-Expression: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "velocity-python"
7
- version = "0.2.4"
7
+ version = "0.2.6"
8
8
  authors = [
9
9
  { name="Velocity Team", email="info@codeclubs.org" },
10
10
  ]
@@ -1,4 +1,4 @@
1
- __version__ = version = "0.2.4"
1
+ __version__ = version = "0.2.6"
2
2
 
3
3
  import importlib as _importlib
4
4
 
@@ -80,6 +80,7 @@ from __future__ import annotations
80
80
 
81
81
  import logging
82
82
  import re
83
+ import sys
83
84
  from dataclasses import dataclass, field, replace
84
85
  from fnmatch import fnmatchcase
85
86
  from typing import Any, Callable, Optional
@@ -379,22 +380,42 @@ BUILTIN_RULES = (permit("data.ordinary_tables", DATA_ACCESS, when=_ordinary_tabl
379
380
 
380
381
  _REGISTERED = {}
381
382
  _REGISTERED_TUPLE = None
383
+ # name -> the globals of the module that registered it. A module imported a
384
+ # second time (importlib.reload, a test that patches sys.modules) runs with
385
+ # new globals under the same __name__ and builds new condition closures, so
386
+ # its rules never compare equal to the first import's.
387
+ _OWNERS = {}
382
388
 
383
389
 
384
390
  def register(*rules):
385
391
  """Add rules to the ones every handler evaluates. Registering the same
386
- rule again is a no-op; a different rule under a taken name is an error."""
392
+ rule again is a no-op, and so is a module re-registering its own rules
393
+ when it is imported again (the new rules replace the old). A different
394
+ rule under a taken name is otherwise an error."""
387
395
  global _REGISTERED_TUPLE
396
+ caller = sys._getframe(1).f_globals
388
397
  for rule in rules:
389
398
  if not isinstance(rule, Rule):
390
399
  raise ValueError("register() takes rules made by permit() or forbid().")
391
400
  known = _REGISTERED.get(rule.name)
392
- if known is not None and known != rule:
401
+ if known is not None and known != rule and not _reimported(rule.name, caller):
393
402
  raise ValueError(f"An authorization rule named '{rule.name}' exists.")
394
403
  _REGISTERED[rule.name] = rule
404
+ _OWNERS[rule.name] = caller
395
405
  _REGISTERED_TUPLE = None
396
406
 
397
407
 
408
+ def _reimported(name, caller):
409
+ """True when ``caller`` is a fresh import of the module that registered
410
+ ``name``: same module name, different globals."""
411
+ owner = _OWNERS.get(name)
412
+ return (
413
+ owner is not None
414
+ and owner is not caller
415
+ and owner.get("__name__") == caller.get("__name__")
416
+ )
417
+
418
+
398
419
  def registered():
399
420
  """Every rule a handler evaluates before its own. The same tuple object
400
421
  until a rule is registered, so its action index is built once."""
@@ -528,19 +528,9 @@ class AsyncTransaction:
528
528
 
529
529
  # R12 — Slow query logging
530
530
  if _SLOW_QUERY_MS and elapsed_ms > _SLOW_QUERY_MS:
531
- from velocity.db.core.transaction import _summarize_sql
532
-
533
- sql_preview = _summarize_sql(sql)
534
- _logger.warning(
535
- "Slow async query: %.1f ms sql=%s",
536
- elapsed_ms,
537
- sql_preview,
538
- extra={
539
- "query_duration_ms": round(elapsed_ms, 1),
540
- "sql_preview": sql_preview,
541
- },
542
- stack_info=True,
543
- )
531
+ from velocity.db.core.transaction import _slow_query_log
532
+
533
+ _slow_query_log(_logger, sql, elapsed_ms)
544
534
 
545
535
  # R14 — N+1 detection / R33 — raw-write cache invalidation
546
536
  from velocity.db.core.transaction import _classify_sql, _extract_table_name
@@ -30,6 +30,15 @@ _DEFAULT_QUERY_CACHE_SIZE = int(os.environ.get("VELOCITY_QUERY_CACHE_SIZE", "100
30
30
  # Slow-query threshold in milliseconds (0 = disabled).
31
31
  _SLOW_QUERY_MS = int(os.environ.get("VELOCITY_SLOW_QUERY_MS", "500"))
32
32
  _SLOW_QUERY_SQL_CHARS = int(os.environ.get("VELOCITY_SLOW_QUERY_SQL_CHARS", "4000"))
33
+ # The slow-query line is for people: this much SQL, the caller's file:line,
34
+ # no traceback unless VELOCITY_SLOW_QUERY_STACK=1 asks for one. The full
35
+ # preview (VELOCITY_SLOW_QUERY_SQL_CHARS) still rides on the record's `extra`.
36
+ _SLOW_QUERY_LINE_CHARS = 200
37
+ _SLOW_QUERY_STACK = os.environ.get("VELOCITY_SLOW_QUERY_STACK", "").strip().lower() in (
38
+ "1",
39
+ "true",
40
+ "yes",
41
+ )
33
42
 
34
43
  # N+1 detection: warn when the same table is SELECTed more than this many
35
44
  # times within a single transaction. 0 = disabled. Only active when the
@@ -174,16 +183,79 @@ def _written_tables_from_sql(sql):
174
183
  return tags or None
175
184
 
176
185
 
186
+ # a run of three or more bind placeholders: "IN (%s, %s, %s, …)"
187
+ _PLACEHOLDER_RUN_RE = re.compile(r"(%s|\?)(?:\s*,\s*\1){2,}")
188
+
189
+
190
+ def _collapse_placeholders(text):
191
+ """``%s, %s, … (812 of them)`` -> ``%s × 812``."""
192
+
193
+ def collapse(match):
194
+ token = match.group(1)
195
+ return f"{token} × {match.group(0).count(token)}"
196
+
197
+ return _PLACEHOLDER_RUN_RE.sub(collapse, text)
198
+
199
+
177
200
  def _summarize_sql(sql, limit=None):
178
201
  if not sql:
179
202
  return None
180
- compact = " ".join(str(sql).split())
203
+ compact = _collapse_placeholders(" ".join(str(sql).split()))
181
204
  max_chars = _SLOW_QUERY_SQL_CHARS if limit is None else limit
182
205
  if max_chars and len(compact) > max_chars:
183
206
  return compact[:max_chars] + "... [truncated]"
184
207
  return compact
185
208
 
186
209
 
210
+ _VELOCITY_DIR = os.path.dirname(
211
+ os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
212
+ )
213
+
214
+
215
+ def _caller_location():
216
+ """``file.py:line`` of the first stack frame outside velocity (the code
217
+ that ran the query), or ``None``."""
218
+ import traceback
219
+
220
+ for frame in reversed(traceback.extract_stack()[:-1]):
221
+ filename = os.path.abspath(frame.filename)
222
+ if filename.startswith(_VELOCITY_DIR + os.sep) or "<frozen" in frame.filename:
223
+ continue
224
+ return f"{os.path.basename(frame.filename)}:{frame.lineno}"
225
+ return None
226
+
227
+
228
+ def _slow_query_log(logger, sql, elapsed_ms, *, op=None, table=None):
229
+ """One readable line for a slow query: what, on which table, how long,
230
+ from where, and the start of the SQL (placeholders collapsed). The fields
231
+ for log tooling go in ``extra``; a traceback only with
232
+ VELOCITY_SLOW_QUERY_STACK=1."""
233
+ op = op or _classify_sql(sql)
234
+ table = table if table is not None else _extract_table_name(sql)
235
+ preview = _summarize_sql(sql)
236
+ line = _summarize_sql(sql, limit=_SLOW_QUERY_LINE_CHARS)
237
+ caller = _caller_location()
238
+ took = (
239
+ f"{elapsed_ms / 1000:.1f} s" if elapsed_ms >= 1000 else f"{elapsed_ms:.0f} ms"
240
+ )
241
+ logger.warning(
242
+ "Slow %s%s: %s%s — %s",
243
+ op or "query",
244
+ f" on {table}" if table else "",
245
+ took,
246
+ f" at {caller}" if caller else "",
247
+ line,
248
+ extra={
249
+ "query_duration_ms": round(elapsed_ms, 1),
250
+ "table_name": table,
251
+ "operation": op,
252
+ "sql_preview": preview,
253
+ "caller": caller,
254
+ },
255
+ stack_info=_SLOW_QUERY_STACK,
256
+ )
257
+
258
+
187
259
  def _is_prepare_kw_type_error(error):
188
260
  """True for the TypeError a DB-API driver raises when ``execute()`` has
189
261
  no ``prepare`` keyword (``unexpected keyword argument 'prepare'``)."""
@@ -650,23 +722,7 @@ class Transaction:
650
722
 
651
723
  # R12 — Slow query logging.
652
724
  if _SLOW_QUERY_MS and elapsed_ms > _SLOW_QUERY_MS:
653
- op = _classify_sql(sql)
654
- tbl = _extract_table_name(sql)
655
- sql_preview = _summarize_sql(sql)
656
- _logger.warning(
657
- "Slow query (%s): %.1f ms table=%s sql=%s",
658
- op,
659
- elapsed_ms,
660
- tbl,
661
- sql_preview,
662
- extra={
663
- "query_duration_ms": round(elapsed_ms, 1),
664
- "table_name": tbl,
665
- "operation": op,
666
- "sql_preview": sql_preview,
667
- },
668
- stack_info=True,
669
- )
725
+ _slow_query_log(_logger, sql, elapsed_ms)
670
726
 
671
727
  # R14 — N+1 detection (only when debug=True).
672
728
  if debug and _N_PLUS_1_THRESHOLD:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: velocity-python
3
- Version: 0.2.4
3
+ Version: 0.2.6
4
4
  Summary: A rapid application development library for interfacing with data storage
5
5
  Author-email: Velocity Team <info@codeclubs.org>
6
6
  License-Expression: MIT
@@ -728,6 +728,8 @@ class TestAsyncSlowQueryLogging:
728
728
  assert len(slow_calls) >= 1
729
729
  args = slow_calls[0].args
730
730
  kwargs = slow_calls[0].kwargs
731
- assert args[2] == "SELECT * FROM large_table"
731
+ # the same one-line form as the sync path: op, table, SQL last
732
+ assert args[1:3] == ("SELECT", " on large_table")
733
+ assert args[-1] == "SELECT * FROM large_table"
732
734
  assert kwargs["extra"]["sql_preview"] == "SELECT * FROM large_table"
733
- assert kwargs["stack_info"] is True
735
+ assert kwargs["stack_info"] is False
@@ -7,6 +7,7 @@ each ``_any`` permission, masquerade, and the audit row.
7
7
  """
8
8
 
9
9
  import logging
10
+ import sys
10
11
  from unittest.mock import MagicMock, patch
11
12
 
12
13
  import pytest
@@ -137,6 +138,55 @@ def test_rules_are_validated_and_registered_once():
137
138
  authz.register(authz.permit("test.once", "t.write"))
138
139
  finally:
139
140
  authz._REGISTERED.pop("test.once", None)
141
+ authz._OWNERS.pop("test.once", None)
142
+
143
+
144
+ _MODULE_SOURCE = """
145
+ from velocity.aws import authz
146
+ authz.register(
147
+ authz.permit(
148
+ "test.reimport",
149
+ "t.read",
150
+ when=authz.any_of(authz.signed_in, authz.holds("t.read")),
151
+ )
152
+ )
153
+ """
154
+
155
+
156
+ def _import_as(module_name):
157
+ """Run a module that registers a rule, as a fresh import would: new
158
+ globals (so new condition closures) under ``module_name``."""
159
+ exec(_MODULE_SOURCE, {"__name__": module_name})
160
+
161
+
162
+ def test_a_module_imported_again_replaces_its_own_rules(_fresh_registry):
163
+ _import_as("tests.fake_rules")
164
+ first = authz._REGISTERED["test.reimport"]
165
+ _import_as("tests.fake_rules") # a second import of the same module
166
+ second = authz._REGISTERED["test.reimport"]
167
+ assert first != second # new closures: never equal
168
+ assert authz.registered().count(second) == 1
169
+ assert first not in authz.registered()
170
+
171
+
172
+ def test_another_module_cannot_take_a_registered_name(_fresh_registry):
173
+ _import_as("tests.fake_rules")
174
+ with pytest.raises(ValueError, match="exists"):
175
+ _import_as("tests.other_rules")
176
+
177
+
178
+ def test_velocity_handler_mixins_survive_a_second_import(_fresh_registry):
179
+ """A consumer test that patches sys.modules imports velocity's handler
180
+ mixins twice; the permissions rules must not refuse the second import."""
181
+ import importlib
182
+
183
+ name = "velocity.aws.handlers.mixins.permissions_actions"
184
+ original = sys.modules[name]
185
+ try:
186
+ sys.modules.pop(name)
187
+ importlib.import_module(name)
188
+ finally:
189
+ sys.modules[name] = original
140
190
 
141
191
 
142
192
  # ── on a handler ─────────────────────────────────────────────────────────────
@@ -484,10 +534,13 @@ def _fresh_registry():
484
534
  dict(authz._REGISTERED),
485
535
  authz._REGISTERED_TUPLE,
486
536
  dict(authz._PERMISSIONS),
537
+ dict(authz._OWNERS),
487
538
  )
488
539
  authz._INDEX.clear()
489
540
  authz._HANDLER_RULES.clear()
490
541
  yield
542
+ authz._OWNERS.clear()
543
+ authz._OWNERS.update(saved[3])
491
544
  authz._REGISTERED.clear()
492
545
  authz._REGISTERED.update(saved[0])
493
546
  authz._REGISTERED_TUPLE = saved[1]
@@ -179,9 +179,14 @@ class TestSlowQueryLogging:
179
179
  with caplog.at_level(logging.WARNING, logger="velocity.db.transaction"):
180
180
  tx._execute("SELECT * FROM big_table")
181
181
 
182
- assert any("Slow query" in r.message for r in caplog.records)
183
- assert any("big_table" in r.message for r in caplog.records)
184
- assert any("sql=SELECT * FROM big_table" in r.message for r in caplog.records)
182
+ lines = [
183
+ r.getMessage() for r in caplog.records if r.getMessage().startswith("Slow ")
184
+ ]
185
+ assert len(lines) == 1
186
+ # one readable line: what, on which table, how long, from where, the SQL
187
+ assert lines[0].startswith("Slow SELECT on big_table: ")
188
+ assert " at test_observability.py:" in lines[0]
189
+ assert lines[0].endswith("— SELECT * FROM big_table")
185
190
 
186
191
  def test_fast_query_no_warning(self, caplog):
187
192
  tx = _make_tx()
@@ -192,7 +197,7 @@ class TestSlowQueryLogging:
192
197
  with caplog.at_level(logging.WARNING, logger="velocity.db.transaction"):
193
198
  tx._execute("SELECT 1")
194
199
 
195
- assert not any("Slow query" in r.message for r in caplog.records)
200
+ assert not any(r.getMessage().startswith("Slow ") for r in caplog.records)
196
201
 
197
202
  def test_slow_query_disabled_when_zero(self, caplog):
198
203
  tx = _make_tx()
@@ -211,7 +216,7 @@ class TestSlowQueryLogging:
211
216
  with caplog.at_level(logging.WARNING, logger="velocity.db.transaction"):
212
217
  tx._execute("SELECT * FROM big_table")
213
218
 
214
- assert not any("Slow query" in r.message for r in caplog.records)
219
+ assert not any(r.getMessage().startswith("Slow ") for r in caplog.records)
215
220
 
216
221
  def test_slow_query_structured_extra(self, caplog):
217
222
  """Verify structured logging extra fields on slow-query record."""
@@ -231,13 +236,39 @@ class TestSlowQueryLogging:
231
236
  with caplog.at_level(logging.WARNING, logger="velocity.db.transaction"):
232
237
  tx._execute("SELECT * FROM orders WHERE id = 1")
233
238
 
234
- slow_records = [r for r in caplog.records if "Slow query" in r.message]
239
+ slow_records = [r for r in caplog.records if r.getMessage().startswith("Slow ")]
235
240
  assert len(slow_records) >= 1
236
241
  rec = slow_records[0]
237
242
  assert rec.query_duration_ms > 0
238
243
  assert rec.table_name == "orders"
239
244
  assert rec.operation == "SELECT"
240
245
  assert rec.sql_preview == "SELECT * FROM orders WHERE id = 1"
246
+ assert rec.caller.startswith("test_observability.py:")
247
+ # no traceback unless VELOCITY_SLOW_QUERY_STACK asks for one
248
+ assert not rec.stack_info
249
+
250
+ def test_slow_query_collapses_placeholders_and_can_add_the_stack(self, caplog):
251
+ tx = _make_tx()
252
+
253
+ class SlowCursor:
254
+ def execute(self, *a, **kw):
255
+ time.sleep(0.01)
256
+
257
+ @property
258
+ def description(self):
259
+ return None
260
+
261
+ tx.connection.cursor.return_value = SlowCursor()
262
+ sql = "SELECT * FROM links WHERE event_id IN (" + ", ".join(["%s"] * 812) + ")"
263
+ with (
264
+ patch("velocity.db.core.transaction._SLOW_QUERY_MS", 5),
265
+ patch("velocity.db.core.transaction._SLOW_QUERY_STACK", True),
266
+ ):
267
+ with caplog.at_level(logging.WARNING, logger="velocity.db.transaction"):
268
+ tx._execute(sql, tuple(range(812)))
269
+
270
+ rec = [r for r in caplog.records if r.getMessage().startswith("Slow ")][0]
271
+ assert rec.getMessage().endswith("IN (%s × 812)")
241
272
  assert rec.stack_info
242
273
 
243
274
 
File without changes