velocity-python 0.4.0__tar.gz → 0.4.1__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 (461) hide show
  1. {velocity_python-0.4.0 → velocity_python-0.4.1}/PKG-INFO +1 -1
  2. {velocity_python-0.4.0 → velocity_python-0.4.1}/pyproject.toml +1 -1
  3. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/__init__.py +1 -1
  4. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/workflow/access.py +8 -1
  5. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/workflow/engine.py +56 -5
  6. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/workflow/schema.py +4 -0
  7. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity_python.egg-info/PKG-INFO +1 -1
  8. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_workflow_actions.py +20 -1
  9. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_workflow_features.py +107 -0
  10. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_workflow_postgres.py +25 -0
  11. {velocity_python-0.4.0 → velocity_python-0.4.1}/LICENSE +0 -0
  12. {velocity_python-0.4.0 → velocity_python-0.4.1}/README.md +0 -0
  13. {velocity_python-0.4.0 → velocity_python-0.4.1}/setup.cfg +0 -0
  14. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/__init__.py +0 -0
  15. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/amplify.py +0 -0
  16. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/assets/__init__.py +0 -0
  17. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/assets/backfill.py +0 -0
  18. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/assets/indexing.py +0 -0
  19. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/assets/references.py +0 -0
  20. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/assets/service.py +0 -0
  21. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/assets/usage_index.py +0 -0
  22. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/authz.py +0 -0
  23. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/blobs.py +0 -0
  24. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/capabilities/__init__.py +0 -0
  25. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/capabilities/base.py +0 -0
  26. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/capabilities/dispatch.py +0 -0
  27. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/capabilities/infra.py +0 -0
  28. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/capabilities/jobs.py +0 -0
  29. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/capabilities/provisioning.py +0 -0
  30. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/capabilities/retention.py +0 -0
  31. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/capabilities/security.py +0 -0
  32. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/capabilities/single_session.py +0 -0
  33. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/capabilities/workflow.py +0 -0
  34. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/deploy/__init__.py +0 -0
  35. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/deploy/ci_gate.py +0 -0
  36. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/deploy/config.py +0 -0
  37. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/deploy/frontend_checks.py +0 -0
  38. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/deploy/operations.py +0 -0
  39. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/deploy/policies.py +0 -0
  40. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/deploy/reconcile.py +0 -0
  41. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/deploy/targets.py +0 -0
  42. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/dirty_pipeline.py +0 -0
  43. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/email.py +0 -0
  44. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/facets.py +0 -0
  45. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/failures.py +0 -0
  46. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/feature_flags.py +0 -0
  47. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/handlers/__init__.py +0 -0
  48. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/handlers/base_handler.py +0 -0
  49. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/handlers/context.py +0 -0
  50. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/handlers/context_factory.py +0 -0
  51. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/handlers/exceptions.py +0 -0
  52. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/handlers/lambda_handler.py +0 -0
  53. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/handlers/masquerade.py +0 -0
  54. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/handlers/mixins/__init__.py +0 -0
  55. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/handlers/mixins/action_names.py +0 -0
  56. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/handlers/mixins/audit_trail.py +0 -0
  57. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/handlers/mixins/client_errors.py +0 -0
  58. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/handlers/mixins/client_input.py +0 -0
  59. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/handlers/mixins/data_service.py +0 -0
  60. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/handlers/mixins/job_handler.py +0 -0
  61. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/handlers/mixins/permissions_actions.py +0 -0
  62. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/handlers/mixins/row_scoped.py +0 -0
  63. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/handlers/mixins/session_control.py +0 -0
  64. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/handlers/mixins/tiles_actions.py +0 -0
  65. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/handlers/mixins/web_handler.py +0 -0
  66. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/handlers/mixins/workflow_actions.py +0 -0
  67. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/handlers/perf.py +0 -0
  68. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/handlers/response.py +0 -0
  69. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/handlers/sqs_handler.py +0 -0
  70. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/identity.py +0 -0
  71. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/job_lifecycle.py +0 -0
  72. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/job_results.py +0 -0
  73. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/mirror.py +0 -0
  74. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/ops.py +0 -0
  75. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/permissions.py +0 -0
  76. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/queue_defaults.py +0 -0
  77. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/s3.py +0 -0
  78. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/scheduler.py +0 -0
  79. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/schema.py +0 -0
  80. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/settings.py +0 -0
  81. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/sms.py +0 -0
  82. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/ssm_config.py +0 -0
  83. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/tests/__init__.py +0 -0
  84. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/tests/test_base_handler_error_response.py +0 -0
  85. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/tests/test_deploy_least_privilege.py +0 -0
  86. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/tests/test_deploy_policies.py +0 -0
  87. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/tests/test_deploy_policy_size.py +0 -0
  88. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/tests/test_deploy_reconcile.py +0 -0
  89. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/tests/test_email.py +0 -0
  90. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/tests/test_lambda_handler_json_serialization.py +0 -0
  91. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/tests/test_response.py +0 -0
  92. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/tests/test_sms.py +0 -0
  93. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/tiles.py +0 -0
  94. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/aws/user_data.py +0 -0
  95. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/cache.py +0 -0
  96. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/__init__.py +0 -0
  97. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/_pgddl.py +0 -0
  98. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/audit.py +0 -0
  99. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/core/__init__.py +0 -0
  100. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/core/async_support.py +0 -0
  101. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/core/column.py +0 -0
  102. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/core/database.py +0 -0
  103. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/core/decorators.py +0 -0
  104. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/core/engine.py +0 -0
  105. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/core/jsonproxy.py +0 -0
  106. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/core/lazy_engine.py +0 -0
  107. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/core/result.py +0 -0
  108. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/core/row.py +0 -0
  109. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/core/sequence.py +0 -0
  110. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/core/table.py +0 -0
  111. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/core/transaction.py +0 -0
  112. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/core/view.py +0 -0
  113. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/effective.py +0 -0
  114. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/exceptions.py +0 -0
  115. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/fragments.py +0 -0
  116. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/integrity.py +0 -0
  117. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/maintenance.py +0 -0
  118. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/migrations.py +0 -0
  119. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/servers/__init__.py +0 -0
  120. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/servers/base/__init__.py +0 -0
  121. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/servers/base/initializer.py +0 -0
  122. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/servers/base/operators.py +0 -0
  123. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/servers/base/sql.py +0 -0
  124. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/servers/base/types.py +0 -0
  125. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/servers/mysql/__init__.py +0 -0
  126. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/servers/mysql/operators.py +0 -0
  127. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/servers/mysql/reserved.py +0 -0
  128. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/servers/mysql/sql.py +0 -0
  129. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/servers/mysql/types.py +0 -0
  130. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/servers/postgres/__init__.py +0 -0
  131. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/servers/postgres/operators.py +0 -0
  132. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/servers/postgres/reserved.py +0 -0
  133. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/servers/postgres/sql.py +0 -0
  134. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/servers/postgres/types.py +0 -0
  135. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/servers/sqlite/__init__.py +0 -0
  136. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/servers/sqlite/operators.py +0 -0
  137. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/servers/sqlite/reserved.py +0 -0
  138. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/servers/sqlite/sql.py +0 -0
  139. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/servers/sqlite/types.py +0 -0
  140. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/servers/sqlserver/__init__.py +0 -0
  141. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/servers/sqlserver/operators.py +0 -0
  142. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/servers/sqlserver/reserved.py +0 -0
  143. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/servers/sqlserver/sql.py +0 -0
  144. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/servers/sqlserver/types.py +0 -0
  145. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/servers/tablehelper.py +0 -0
  146. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/tests/__init__.py +0 -0
  147. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/tests/common_db_test.py +0 -0
  148. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/tests/postgres/__init__.py +0 -0
  149. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/tests/postgres/common.py +0 -0
  150. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/tests/postgres/conftest.py +0 -0
  151. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/tests/postgres/test_column.py +0 -0
  152. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/tests/postgres/test_connections.py +0 -0
  153. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/tests/postgres/test_database.py +0 -0
  154. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/tests/postgres/test_engine.py +0 -0
  155. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/tests/postgres/test_general_usage.py +0 -0
  156. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/tests/postgres/test_imports.py +0 -0
  157. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/tests/postgres/test_integrity_triggers.py +0 -0
  158. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/tests/postgres/test_result.py +0 -0
  159. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/tests/postgres/test_row.py +0 -0
  160. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/tests/postgres/test_row_comprehensive.py +0 -0
  161. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/tests/postgres/test_schema_locking.py +0 -0
  162. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/tests/postgres/test_schema_locking_unit.py +0 -0
  163. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/tests/postgres/test_sequence.py +0 -0
  164. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/tests/postgres/test_sql_comprehensive.py +0 -0
  165. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/tests/postgres/test_table.py +0 -0
  166. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/tests/postgres/test_table_comprehensive.py +0 -0
  167. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/tests/postgres/test_transaction.py +0 -0
  168. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/tests/sql/__init__.py +0 -0
  169. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/tests/sql/common.py +0 -0
  170. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/tests/sql/test_postgres_select_advanced.py +0 -0
  171. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/tests/sql/test_postgres_select_variances.py +0 -0
  172. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/tests/test_cursor_rowcount_fix.py +0 -0
  173. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/tests/test_db_utils.py +0 -0
  174. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/tests/test_postgres.py +0 -0
  175. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/tests/test_postgres_unchanged.py +0 -0
  176. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/tests/test_process_error_robustness.py +0 -0
  177. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/tests/test_result_caching.py +0 -0
  178. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/tests/test_result_sql_aware.py +0 -0
  179. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/tests/test_row_get_missing_column.py +0 -0
  180. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/tests/test_schema_locking_initializers.py +0 -0
  181. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/tests/test_schema_locking_simple.py +0 -0
  182. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/tests/test_sql_builder.py +0 -0
  183. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/tests/test_tablehelper.py +0 -0
  184. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/tests/test_view_helper.py +0 -0
  185. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/tunnel.py +0 -0
  186. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/db/utils.py +0 -0
  187. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/hooks.py +0 -0
  188. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/logging.py +0 -0
  189. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/misc/__init__.py +0 -0
  190. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/misc/conv/__init__.py +0 -0
  191. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/misc/conv/iconv.py +0 -0
  192. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/misc/conv/oconv.py +0 -0
  193. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/misc/db.py +0 -0
  194. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/misc/export.py +0 -0
  195. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/misc/format.py +0 -0
  196. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/misc/mail.py +0 -0
  197. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/misc/merge.py +0 -0
  198. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/misc/pdf.py +0 -0
  199. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/misc/tests/__init__.py +0 -0
  200. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/misc/tests/test_db.py +0 -0
  201. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/misc/tests/test_fix.py +0 -0
  202. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/misc/tests/test_format.py +0 -0
  203. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/misc/tests/test_iconv.py +0 -0
  204. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/misc/tests/test_mail_send.py +0 -0
  205. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/misc/tests/test_merge.py +0 -0
  206. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/misc/tests/test_oconv.py +0 -0
  207. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/misc/tests/test_original_error.py +0 -0
  208. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/misc/tests/test_timer.py +0 -0
  209. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/misc/timer.py +0 -0
  210. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/misc/tools.py +0 -0
  211. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/nosql/__init__.py +0 -0
  212. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/nosql/core/__init__.py +0 -0
  213. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/nosql/core/capabilities.py +0 -0
  214. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/nosql/core/store.py +0 -0
  215. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/nosql/core/where.py +0 -0
  216. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/nosql/exceptions.py +0 -0
  217. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/nosql/servers/__init__.py +0 -0
  218. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/nosql/servers/base/__init__.py +0 -0
  219. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/nosql/servers/cassandra/__init__.py +0 -0
  220. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/nosql/servers/cassandra/translation.py +0 -0
  221. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/nosql/servers/couchbase/__init__.py +0 -0
  222. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/nosql/servers/couchbase/translation.py +0 -0
  223. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/nosql/servers/dynamodb/__init__.py +0 -0
  224. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/nosql/servers/dynamodb/translation.py +0 -0
  225. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/nosql/servers/elasticsearch/__init__.py +0 -0
  226. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/nosql/servers/elasticsearch/translation.py +0 -0
  227. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/nosql/servers/memory/__init__.py +0 -0
  228. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/nosql/servers/mongodb/__init__.py +0 -0
  229. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/nosql/servers/mongodb/translation.py +0 -0
  230. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/nosql/servers/redis/__init__.py +0 -0
  231. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/payment/__init__.py +0 -0
  232. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/payment/_mirror_core.py +0 -0
  233. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/payment/authorizenet_adapter.py +0 -0
  234. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/payment/authorizenet_mirror.py +0 -0
  235. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/payment/base_adapter.py +0 -0
  236. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/payment/braintree_adapter.py +0 -0
  237. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/payment/braintree_mirror.py +0 -0
  238. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/payment/charge_rules.py +0 -0
  239. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/payment/money.py +0 -0
  240. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/payment/plaid_api.py +0 -0
  241. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/payment/plaid_webhook.py +0 -0
  242. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/payment/redact.py +0 -0
  243. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/payment/schema.py +0 -0
  244. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/payment/stripe_adapter.py +0 -0
  245. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/payment/stripe_mirror.py +0 -0
  246. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/rules/__init__.py +0 -0
  247. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/rules/engine.py +0 -0
  248. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/rules/expressions.py +0 -0
  249. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/rules/facts.py +0 -0
  250. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/rules/storage.py +0 -0
  251. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/testing/__init__.py +0 -0
  252. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/testing/fake_db.py +0 -0
  253. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/workflow/__init__.py +0 -0
  254. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/workflow/contract.py +0 -0
  255. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/workflow/definitions.py +0 -0
  256. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/workflow/hooks.py +0 -0
  257. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/workflow/notices.py +0 -0
  258. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/workflow/outbox.py +0 -0
  259. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity/workflow/points.py +0 -0
  260. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity_python.egg-info/SOURCES.txt +0 -0
  261. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity_python.egg-info/dependency_links.txt +0 -0
  262. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity_python.egg-info/entry_points.txt +0 -0
  263. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity_python.egg-info/requires.txt +0 -0
  264. {velocity_python-0.4.0 → velocity_python-0.4.1}/src/velocity_python.egg-info/top_level.txt +0 -0
  265. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_access_error_403.py +0 -0
  266. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_action_names.py +0 -0
  267. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_activity_tracking_aborted_tx.py +0 -0
  268. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_amplify_redirects.py +0 -0
  269. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_asset_indexing.py +0 -0
  270. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_asset_references.py +0 -0
  271. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_assets_service.py +0 -0
  272. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_async_support.py +0 -0
  273. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_audit_log_confidential.py +0 -0
  274. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_audit_mixin.py +0 -0
  275. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_audit_registry_table_gate.py +0 -0
  276. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_authz.py +0 -0
  277. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_aws_package_hygiene.py +0 -0
  278. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_batch_operations.py +0 -0
  279. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_blob_store.py +0 -0
  280. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_business_objects.py +0 -0
  281. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_capabilities.py +0 -0
  282. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_capability_catalog.py +0 -0
  283. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_capability_dependencies.py +0 -0
  284. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_check_changelog.py +0 -0
  285. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_ci_gate.py +0 -0
  286. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_client_errors_mixin.py +0 -0
  287. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_client_input_contract_export.py +0 -0
  288. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_client_sql_boundary.py +0 -0
  289. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_client_table_gate_case_and_pointers.py +0 -0
  290. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_cognito_client_lazy.py +0 -0
  291. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_cognito_user_cache.py +0 -0
  292. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_column_tx_arg.py +0 -0
  293. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_concurrency_safety.py +0 -0
  294. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_connection_pool.py +0 -0
  295. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_connection_resilience.py +0 -0
  296. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_context_enqueue_idempotency.py +0 -0
  297. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_context_flags_loader.py +0 -0
  298. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_context_job_descriptions.py +0 -0
  299. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_context_queue_job.py +0 -0
  300. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_conv_combine.py +0 -0
  301. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_data_service_owner_scope.py +0 -0
  302. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_data_service_query_cap.py +0 -0
  303. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_data_service_renumber.py +0 -0
  304. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_data_service_row_number.py +0 -0
  305. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_data_service_save_as.py +0 -0
  306. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_data_service_security_gates.py +0 -0
  307. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_db_audit_required.py +0 -0
  308. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_db_credentials_ssm_cascade.py +0 -0
  309. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_db_effective.py +0 -0
  310. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_db_integrity.py +0 -0
  311. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_db_maintenance.py +0 -0
  312. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_db_tunnel.py +0 -0
  313. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_declared_column_types.py +0 -0
  314. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_decorators.py +0 -0
  315. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_delete_hook_fk_blocked.py +0 -0
  316. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_deploy_config_fields.py +0 -0
  317. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_deploy_engine.py +0 -0
  318. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_deploy_frontend_checks.py +0 -0
  319. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_deploy_operations_queue.py +0 -0
  320. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_deploy_policies.py +0 -0
  321. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_dirty_pipeline_consumer.py +0 -0
  322. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_dirty_pipeline_fast_path.py +0 -0
  323. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_dlq_constant.py +0 -0
  324. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_docs_snippets.py +0 -0
  325. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_email_processing.py +0 -0
  326. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_enqueue_metric_namespace.py +0 -0
  327. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_enqueue_send_failures.py +0 -0
  328. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_ensure_infrastructure.py +0 -0
  329. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_export_workbook.py +0 -0
  330. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_facets.py +0 -0
  331. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_facets_and_where.py +0 -0
  332. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_failures.py +0 -0
  333. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_feature_flags.py +0 -0
  334. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_get_cognito_user_provider.py +0 -0
  335. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_hooks.py +0 -0
  336. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_http_handler_rollback.py +0 -0
  337. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_iconv_money_to_cents.py +0 -0
  338. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_identifier_injection_guard.py +0 -0
  339. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_identity.py +0 -0
  340. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_job_handler.py +0 -0
  341. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_job_lifecycle.py +0 -0
  342. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_job_record_guard.py +0 -0
  343. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_job_record_guard_postgres.py +0 -0
  344. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_job_results.py +0 -0
  345. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_json_columns.py +0 -0
  346. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_jsonb_dict_adapter.py +0 -0
  347. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_lambda_handler.py +0 -0
  348. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_lambda_handler_auth.py +0 -0
  349. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_lambda_handler_masquerade.py +0 -0
  350. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_lambda_handler_user_cache.py +0 -0
  351. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_lazy_engine.py +0 -0
  352. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_masquerade_grant.py +0 -0
  353. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_merge_on_conflict.py +0 -0
  354. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_mirror.py +0 -0
  355. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_mirror_upsert_public.py +0 -0
  356. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_mixins_import.py +0 -0
  357. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_n_plus_one.py +0 -0
  358. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_nosql_dynamodb.py +0 -0
  359. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_nosql_memory.py +0 -0
  360. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_nosql_mongodb.py +0 -0
  361. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_nosql_redis.py +0 -0
  362. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_nosql_translation.py +0 -0
  363. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_nosql_where.py +0 -0
  364. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_observability.py +0 -0
  365. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_on_action_default.py +0 -0
  366. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_on_commit.py +0 -0
  367. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_ops.py +0 -0
  368. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_payment_audit_fixes.py +0 -0
  369. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_payment_authorizenet_adapter.py +0 -0
  370. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_payment_braintree_adapter.py +0 -0
  371. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_payment_braintree_mirror.py +0 -0
  372. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_payment_business_agnostic.py +0 -0
  373. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_payment_charge_reference.py +0 -0
  374. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_payment_extra_bounds.py +0 -0
  375. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_payment_lazy_imports.py +0 -0
  376. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_payment_mirror_empty_table.py +0 -0
  377. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_payment_profile_sorting.py +0 -0
  378. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_payment_stripe_adapter.py +0 -0
  379. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_pdf.py +0 -0
  380. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_permissions.py +0 -0
  381. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_permissions_actions.py +0 -0
  382. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_permissions_notices.py +0 -0
  383. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_permissions_review.py +0 -0
  384. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_pgserver_bulk_cache.py +0 -0
  385. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_pgserver_capability_types.py +0 -0
  386. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_pgserver_ensure_infrastructure.py +0 -0
  387. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_pgserver_get_tables.py +0 -0
  388. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_pgserver_permissions.py +0 -0
  389. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_pgserver_pointer_joins.py +0 -0
  390. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_pgserver_row_scope.py +0 -0
  391. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_pgserver_search_export.py +0 -0
  392. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_pgserver_settings.py +0 -0
  393. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_pgserver_tiles.py +0 -0
  394. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_pgserver_user_data.py +0 -0
  395. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_plaid_api.py +0 -0
  396. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_plaid_webhook.py +0 -0
  397. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_pointer_join_sql.py +0 -0
  398. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_postgres_initializer_config.py +0 -0
  399. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_postgres_py_type.py +0 -0
  400. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_prepared_statements.py +0 -0
  401. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_psycopg3_upgrade.py +0 -0
  402. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_query_cache.py +0 -0
  403. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_query_missing_table_unlocked.py +0 -0
  404. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_raw_sql_prefix_policy.py +0 -0
  405. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_read_cache.py +0 -0
  406. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_readme_imports.py +0 -0
  407. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_record_event_postgres.py +0 -0
  408. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_record_event_transaction.py +0 -0
  409. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_response.py +0 -0
  410. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_restricted_direct_tables.py +0 -0
  411. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_result_returning.py +0 -0
  412. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_retry_side_effect_guard.py +0 -0
  413. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_return_default_safety.py +0 -0
  414. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_row_batch_update.py +0 -0
  415. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_row_cache_staleness.py +0 -0
  416. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_row_scoped_data_service.py +0 -0
  417. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_rules.py +0 -0
  418. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_rules_storage.py +0 -0
  419. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_s3_bucket_config.py +0 -0
  420. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_s3_list_client_files.py +0 -0
  421. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_s3_upload.py +0 -0
  422. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_scheduler.py +0 -0
  423. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_schema_lock_config_other_backends.py +0 -0
  424. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_schema_migrations.py +0 -0
  425. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_search_paging_export.py +0 -0
  426. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_security_capability.py +0 -0
  427. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_security_events_table_gate.py +0 -0
  428. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_security_hardening.py +0 -0
  429. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_server_cursor.py +0 -0
  430. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_session_control.py +0 -0
  431. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_settings.py +0 -0
  432. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_single_autocommit_safety.py +0 -0
  433. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_single_session_capability.py +0 -0
  434. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_sms_twilio_signature.py +0 -0
  435. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_spreadsheet_functions.py +0 -0
  436. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_sqlite_backend.py +0 -0
  437. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_sqs_per_record_transactions.py +0 -0
  438. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_ssm_config.py +0 -0
  439. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_ssm_config_require.py +0 -0
  440. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_store_user_data.py +0 -0
  441. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_sys_modified_count_postgres_demo.py +0 -0
  442. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_table_alter.py +0 -0
  443. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_table_claim.py +0 -0
  444. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_table_find_cache.py +0 -0
  445. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_table_purge.py +0 -0
  446. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_testing_fake_db.py +0 -0
  447. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_tiles.py +0 -0
  448. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_transaction_class_wrapping.py +0 -0
  449. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_transaction_commit_and_ownership.py +0 -0
  450. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_transaction_edge_cases.py +0 -0
  451. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_tx_lifecycle_retry.py +0 -0
  452. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_tx_read_cache_and_bulk.py +0 -0
  453. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_user_data.py +0 -0
  454. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_user_not_provisioned.py +0 -0
  455. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_where_clause_validation.py +0 -0
  456. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_workflow_contract.py +0 -0
  457. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_workflow_definitions.py +0 -0
  458. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_workflow_engine.py +0 -0
  459. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_workflow_review.py +0 -0
  460. {velocity_python-0.4.0 → velocity_python-0.4.1}/tests/test_write_hook_create_flow.py +0 -0
  461. {velocity_python-0.4.0 → velocity_python-0.4.1}/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.4.0
3
+ Version: 0.4.1
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.4.0"
7
+ version = "0.4.1"
8
8
  authors = [
9
9
  { name="Velocity Team", email="info@codeclubs.org" },
10
10
  ]
@@ -1,4 +1,4 @@
1
- __version__ = version = "0.4.0"
1
+ __version__ = version = "0.4.1"
2
2
 
3
3
  import importlib as _importlib
4
4
 
@@ -288,8 +288,15 @@ def act_relations(
288
288
  if kind == "hold":
289
289
  hold = tx.table(engine.HOLD).find({"sys_id": ident})
290
290
  if hold is not None and hold["docket_id"] == docket["sys_id"]:
291
+ # the relation only; the engine decides the hold's own
292
+ # release_permission with the actor's bound authz
291
293
  if engine.hold_owner_of(
292
- actor, route, dict(hold.to_dict()), docket.get("entity")
294
+ actor,
295
+ route,
296
+ dict(hold.to_dict()),
297
+ docket.get("entity"),
298
+ docket=docket,
299
+ check_permission=False,
293
300
  ):
294
301
  out.add(HOLD_OWNER)
295
302
  return frozenset(out)
@@ -891,10 +891,15 @@ def may_release(actor: Actor, route: Route, hold, docket, effect) -> bool:
891
891
  return False
892
892
  if actor.kind != "person" or not in_scope(actor, docket.get("entity")):
893
893
  return False
894
+ held = hold.get("release_permission")
895
+ if held and not actor.may(HOLD_RELEASE, held, docket):
896
+ return False # the hold's own permission binds every way out
894
897
  permission = effect.get("release_permission")
895
898
  if permission:
896
899
  return actor.may(HOLD_RELEASE, permission, docket)
897
- return hold_owner_of(actor, route, hold, docket.get("entity"))
900
+ return hold_owner_of(
901
+ actor, route, hold, docket.get("entity"), docket=docket, direct=False
902
+ )
898
903
 
899
904
 
900
905
  def _release_effects(item: Pass):
@@ -1659,16 +1664,43 @@ def problem_owner_of(actor: Actor, route: Route, position) -> bool:
1659
1664
  )
1660
1665
 
1661
1666
 
1662
- def hold_owner_of(actor: Actor, route: Route, hold, entity) -> bool:
1667
+ RELEASE_ANY, RELEASE_VIA_EFFECT = "any", "effect"
1668
+
1669
+
1670
+ def hold_owner_of(
1671
+ actor: Actor,
1672
+ route: Route,
1673
+ hold,
1674
+ entity,
1675
+ *,
1676
+ docket=None,
1677
+ direct=True,
1678
+ check_permission=True,
1679
+ ) -> bool:
1663
1680
  """Who may release a manual hold on a docket of ``entity``: its owner
1664
- role, its placer, a route owner — inside their entities."""
1681
+ role, its placer, a route owner, an authorized override — inside their
1682
+ entities, and subject to the hold's own release controls:
1683
+
1684
+ * ``release_via="effect"``: never released directly (the
1685
+ ``hold:<id>:release`` action, ``direct=True``), only by a pass effect;
1686
+ * ``release_permission``: whoever releases it must also be allowed that
1687
+ permission through authz (:data:`HOLD_RELEASE`, with the docket's
1688
+ entity scope) — a route owner or an override included. Needs
1689
+ ``docket``; ``check_permission=False`` is only for computing an authz
1690
+ relation, the engine then decides with the actor's own ``allows``."""
1665
1691
  if actor.kind != "person" or str(hold.get("release_rule") or "") not in (
1666
1692
  "",
1667
1693
  "manual",
1668
1694
  ):
1669
1695
  return False
1696
+ if direct and (hold.get("release_via") or RELEASE_ANY) == RELEASE_VIA_EFFECT:
1697
+ return False
1670
1698
  if not in_scope(actor, entity):
1671
1699
  return False
1700
+ permission = hold.get("release_permission")
1701
+ if permission and check_permission:
1702
+ if docket is None or not actor.may(HOLD_RELEASE, permission, docket):
1703
+ return False
1672
1704
  if actor.override:
1673
1705
  return True
1674
1706
  return (
@@ -1777,7 +1809,7 @@ def actions_for(tx, docket, route: Route, actor: Actor, *, positions=None, now=N
1777
1809
  }
1778
1810
  )
1779
1811
  for hold in holds_of(tx, docket["sys_id"]):
1780
- if hold_owner_of(actor, route, hold, docket.get("entity")):
1812
+ if hold_owner_of(actor, route, hold, docket.get("entity"), docket=docket):
1781
1813
  out.append(
1782
1814
  _action(
1783
1815
  f"hold:{hold['sys_id']}:release",
@@ -2217,11 +2249,28 @@ def place_hold(
2217
2249
  blocks=None,
2218
2250
  releases_when=None,
2219
2251
  label=None,
2252
+ release_permission=None,
2253
+ release_via=RELEASE_ANY,
2220
2254
  now=None,
2221
2255
  ) -> int:
2222
2256
  """Place a manual hold; returns its id. ``blocks``: the pass codes it
2223
- blocks (default every forward, branch and rejoin pass)."""
2257
+ blocks (default every forward, branch and rejoin pass).
2258
+
2259
+ Release controls: ``release_permission`` — whoever releases it (owner,
2260
+ route owner, override, or a pass effect) must be allowed that permission
2261
+ through authz (``workflow.hold.release``); ``release_via="effect"`` —
2262
+ only a pass's ``release_hold`` effect releases it, so its pass's guards
2263
+ always apply: the direct ``hold:<id>:release`` action is never offered
2264
+ and is refused if sent."""
2224
2265
  hooks.check_code(kind, "hold kind")
2266
+ if release_via not in (RELEASE_ANY, RELEASE_VIA_EFFECT):
2267
+ raise WorkflowError(
2268
+ f"release_via must be {RELEASE_ANY!r} or {RELEASE_VIA_EFFECT!r}"
2269
+ )
2270
+ if release_permission is not None and (
2271
+ not isinstance(release_permission, str) or not release_permission.strip()
2272
+ ):
2273
+ raise WorkflowError("release_permission must be a permission name")
2225
2274
  ctx = _Ctx(tx, now)
2226
2275
  docket = _docket(tx, docket_id, lock=True)
2227
2276
  row = tx.table(HOLD).new(
@@ -2236,6 +2285,8 @@ def place_hold(
2236
2285
  "release_rule": "manual",
2237
2286
  "releases_when": releases_when,
2238
2287
  "blocks": list(blocks) if blocks else None,
2288
+ "release_permission": release_permission,
2289
+ "release_via": release_via,
2239
2290
  }
2240
2291
  )
2241
2292
  _mark(ctx, docket, actor, "hold", outcome=kind, note=str(reason or kind))
@@ -317,6 +317,10 @@ SCHEMA = {
317
317
  "released_by": "TEXT",
318
318
  "released_at": TS,
319
319
  "blocks": "JSONB",
320
+ # release controls: a permission any release needs, and
321
+ # "effect" = only a pass effect may release it (no direct action)
322
+ "release_permission": "TEXT",
323
+ "release_via": "TEXT",
320
324
  "link_id": "BIGINT",
321
325
  "rule_pack": "TEXT",
322
326
  "rule_version": "INTEGER",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: velocity-python
3
- Version: 0.4.0
3
+ Version: 0.4.1
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
@@ -722,7 +722,9 @@ def test_the_site_scope_hook_sets_the_resource_scopes():
722
722
  def test_a_denial_at_the_sites_scope_refuses_the_sheet_write_and_the_release():
723
723
  tx, docket = scoped_site()
724
724
  handler = Handler(7, permissions=(USE, ws.READ, ws.EDIT, OVERRIDE))
725
- unheld = wf.open_docket(tx, "widget_flow", ws.subject("n2"), entity="north", now=NOW)
725
+ unheld = wf.open_docket(
726
+ tx, "widget_flow", ws.subject("n2"), entity="north", now=NOW
727
+ )
726
728
  with denied_at("school:north", ws.EDIT):
727
729
  context = call(tx, handler, "workflow-act", act_payload(tx, unheld))
728
730
  assert context.status == 403 # the sheet write
@@ -787,3 +789,20 @@ def test_hold_release_is_refused_through_authz():
787
789
  )
788
790
  assert context.status in (403, 409)
789
791
  assert [h["kind"] for h in engine.holds_of(tx, docket)] == ["paperwork"]
792
+
793
+
794
+ def test_a_route_owner_cannot_release_an_effect_only_hold_through_the_handler(_clean):
795
+ tx, docket = site()
796
+ hold = wf.place_hold(
797
+ tx, docket, "credit", "Over limit", owner="owner", release_via="effect", now=NOW
798
+ )
799
+ context = call(
800
+ tx,
801
+ Handler(1),
802
+ "workflow-act",
803
+ {"docket": docket, "action": f"hold:{hold}:release", "request_key": "h1"},
804
+ )
805
+ assert context.status == 403
806
+ assert [h["kind"] for h in engine.holds_of(tx, docket)] == ["credit"]
807
+ body = call(tx, Handler(1), "workflow-docket", {"docket": docket}).body
808
+ assert "release_action" not in body["holds"][0]
@@ -797,3 +797,110 @@ def test_the_calendar_hook_may_take_the_transaction():
797
797
  wf.register_calendar(everything)
798
798
  wf.open_docket(tx, "widget_flow", ws.subject("2"), now=NOW)
799
799
  assert seen[-1] == ["entity", "station", "tx"]
800
+
801
+
802
+ # ── 0.4.1: hold-level release controls ────────────────────────────────────
803
+
804
+ CREDIT = "widgets.credit_release"
805
+
806
+
807
+ def credit_route():
808
+ spec = ws.route_spec(tests=[])
809
+ spec["passes"].append(
810
+ {
811
+ "code": "release_credit",
812
+ "from_station": "review",
813
+ "to_station": "allocate",
814
+ "guard_rule": "approve_limit",
815
+ "effects": [{"type": "release_hold", "kind": "credit"}],
816
+ }
817
+ )
818
+ return spec
819
+
820
+
821
+ def direct_ids(tx, route, docket, actor):
822
+ return [
823
+ a["id"]
824
+ for a in wf.actions_for(tx, engine.docket_row(tx, docket), route, actor)
825
+ if a["id"].startswith("hold:")
826
+ ]
827
+
828
+
829
+ def test_a_release_via_effect_hold_is_never_released_directly():
830
+ tx, route = ws.site(**credit_route())
831
+ docket = wf.open_docket(tx, "widget_flow", ws.subject("1"), now=NOW)
832
+ hold = wf.place_hold(
833
+ tx, docket, "credit", "Over limit", owner="owner", release_via="effect", now=NOW
834
+ )
835
+ owner = ws.actor(ws.person(1, oversees=["widget_flow"]))
836
+ overriding = ws.actor(ws.person(1, oversees=["widget_flow"]), override=True)
837
+ for actor in (owner, overriding):
838
+ assert direct_ids(tx, route, docket, actor) == []
839
+ refused = wf.act(
840
+ tx, docket, f"hold:{hold}:release", None, actor, f"d{id(actor)}", now=NOW
841
+ )
842
+ assert refused.reasons == [engine.NOT_AVAILABLE]
843
+ assert [h["kind"] for h in engine.holds_of(tx, docket)] == ["credit"]
844
+ # the effect still works, for someone it lets release (the owner role)
845
+ lead = ws.actor(ws.person(11, roles=["reviewer", "owner"]))
846
+ position = the_open(tx, docket)
847
+ assert wf.act(
848
+ tx,
849
+ docket,
850
+ f"pass:{position['sys_id']}:release_credit",
851
+ None,
852
+ lead,
853
+ "e1",
854
+ now=NOW,
855
+ ).ok
856
+ assert engine.holds_of(tx, docket) == []
857
+
858
+
859
+ def test_a_hold_release_permission_binds_route_owners_overrides_and_effects():
860
+ tx, route = ws.site(**credit_route())
861
+ docket = wf.open_docket(tx, "widget_flow", ws.subject("1"), now=NOW)
862
+ hold = wf.place_hold(
863
+ tx,
864
+ docket,
865
+ "credit",
866
+ "Over limit",
867
+ owner="owner",
868
+ release_permission=CREDIT,
869
+ now=NOW,
870
+ )
871
+ plain_owner = ws.actor(ws.person(1, oversees=["widget_flow"]))
872
+ overriding = ws.actor(ws.person(1, oversees=["widget_flow"]), override=True)
873
+ for actor in (plain_owner, overriding):
874
+ assert direct_ids(tx, route, docket, actor) == []
875
+ assert not wf.act(
876
+ tx, docket, f"hold:{hold}:release", None, actor, f"p{id(actor)}", now=NOW
877
+ ).ok
878
+ # the release pass is no way around it either: its effect needs CREDIT too
879
+ lead = ws.person(11, roles=["reviewer", "owner"])
880
+ position = the_open(tx, docket)
881
+ assert not wf.act(
882
+ tx,
883
+ docket,
884
+ f"pass:{position['sys_id']}:release_credit",
885
+ None,
886
+ ws.actor(lead),
887
+ "e1",
888
+ now=NOW,
889
+ ).ok
890
+ assert [h["kind"] for h in engine.holds_of(tx, docket)] == ["credit"]
891
+ # with the permission, the route owner may release it directly
892
+ allowed = ws.actor(
893
+ ws.person(1, oversees=["widget_flow"]), perms=(ws.READ, ws.EDIT, CREDIT)
894
+ )
895
+ assert direct_ids(tx, route, docket, allowed) == [f"hold:{hold}:release"]
896
+ assert wf.act(tx, docket, f"hold:{hold}:release", None, allowed, "ok", now=NOW).ok
897
+ assert engine.holds_of(tx, docket) == []
898
+
899
+
900
+ def test_release_controls_are_validated():
901
+ tx, route = ws.site()
902
+ docket = wf.open_docket(tx, "widget_flow", ws.subject("1"), now=NOW)
903
+ with pytest.raises(wf.WorkflowError, match="release_via"):
904
+ wf.place_hold(tx, docket, "credit", "x", release_via="anyone", now=NOW)
905
+ with pytest.raises(wf.WorkflowError, match="release_permission"):
906
+ wf.place_hold(tx, docket, "credit", "x", release_permission=" ", now=NOW)
@@ -430,3 +430,28 @@ def test_a_failed_sweep_item_does_not_strip_the_audit_actor(eng):
430
430
  (good,),
431
431
  ).scalar()
432
432
  assert changed_by == "system:workflow"
433
+
434
+
435
+ def test_hold_release_controls_on_postgres(eng):
436
+ docket, _sid = new_docket(eng)
437
+ owner = ws.actor(ws.person(1, oversees=["widget_flow"]), override=True)
438
+ with eng.transaction() as tx:
439
+ hold = wf.place_hold(
440
+ tx,
441
+ docket,
442
+ "credit",
443
+ "Over limit",
444
+ owner="owner",
445
+ release_via="effect",
446
+ release_permission="widgets.credit",
447
+ now=NOW,
448
+ )
449
+ row = engine.holds_of(tx, docket)[0]
450
+ assert (row["release_via"], row["release_permission"]) == (
451
+ "effect",
452
+ "widgets.credit",
453
+ )
454
+ refused = wf.act(
455
+ tx, docket, f"hold:{hold}:release", None, owner, "pg-h", now=NOW
456
+ )
457
+ assert refused.reasons == [engine.NOT_AVAILABLE]
File without changes