velocity-python 0.1.66__tar.gz → 0.1.68__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 (207) hide show
  1. {velocity_python-0.1.66 → velocity_python-0.1.68}/PKG-INFO +1 -1
  2. {velocity_python-0.1.66 → velocity_python-0.1.68}/pyproject.toml +1 -1
  3. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/__init__.py +1 -1
  4. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/aws/handlers/context.py +19 -0
  5. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/payment/stripe_adapter.py +39 -1
  6. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity_python.egg-info/PKG-INFO +1 -1
  7. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity_python.egg-info/SOURCES.txt +1 -0
  8. velocity_python-0.1.68/tests/test_get_cognito_user_provider.py +66 -0
  9. {velocity_python-0.1.66 → velocity_python-0.1.68}/tests/test_payment_stripe_adapter.py +73 -0
  10. {velocity_python-0.1.66 → velocity_python-0.1.68}/LICENSE +0 -0
  11. {velocity_python-0.1.66 → velocity_python-0.1.68}/README.md +0 -0
  12. {velocity_python-0.1.66 → velocity_python-0.1.68}/setup.cfg +0 -0
  13. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/aws/__init__.py +0 -0
  14. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/aws/amplify.py +0 -0
  15. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/aws/amplify_build.py +0 -0
  16. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/aws/assets/__init__.py +0 -0
  17. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/aws/assets/backfill.py +0 -0
  18. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/aws/assets/indexing.py +0 -0
  19. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/aws/assets/references.py +0 -0
  20. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/aws/assets/service.py +0 -0
  21. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/aws/assets/usage_index.py +0 -0
  22. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/aws/dirty_pipeline.py +0 -0
  23. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/aws/handlers/__init__.py +0 -0
  24. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/aws/handlers/base_handler.py +0 -0
  25. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/aws/handlers/context_factory.py +0 -0
  26. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/aws/handlers/exceptions.py +0 -0
  27. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/aws/handlers/lambda_handler.py +0 -0
  28. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/aws/handlers/masquerade.py +0 -0
  29. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/aws/handlers/mixins/__init__.py +0 -0
  30. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/aws/handlers/mixins/data_service.py +0 -0
  31. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/aws/handlers/mixins/web_handler.py +0 -0
  32. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/aws/handlers/perf.py +0 -0
  33. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/aws/handlers/response.py +0 -0
  34. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/aws/handlers/sqs_handler.py +0 -0
  35. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/aws/s3.py +0 -0
  36. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/aws/ssm_config.py +0 -0
  37. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/aws/tests/__init__.py +0 -0
  38. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/aws/tests/test_base_handler_error_response.py +0 -0
  39. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/aws/tests/test_lambda_handler_json_serialization.py +0 -0
  40. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/aws/tests/test_response.py +0 -0
  41. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/__init__.py +0 -0
  42. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/core/__init__.py +0 -0
  43. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/core/async_support.py +0 -0
  44. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/core/column.py +0 -0
  45. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/core/database.py +0 -0
  46. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/core/decorators.py +0 -0
  47. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/core/engine.py +0 -0
  48. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/core/jsonproxy.py +0 -0
  49. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/core/result.py +0 -0
  50. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/core/row.py +0 -0
  51. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/core/sequence.py +0 -0
  52. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/core/table.py +0 -0
  53. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/core/transaction.py +0 -0
  54. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/core/view.py +0 -0
  55. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/exceptions.py +0 -0
  56. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/migrations.py +0 -0
  57. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/servers/__init__.py +0 -0
  58. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/servers/base/__init__.py +0 -0
  59. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/servers/base/initializer.py +0 -0
  60. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/servers/base/operators.py +0 -0
  61. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/servers/base/sql.py +0 -0
  62. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/servers/base/types.py +0 -0
  63. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/servers/mysql/__init__.py +0 -0
  64. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/servers/mysql/operators.py +0 -0
  65. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/servers/mysql/reserved.py +0 -0
  66. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/servers/mysql/sql.py +0 -0
  67. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/servers/mysql/types.py +0 -0
  68. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/servers/postgres/__init__.py +0 -0
  69. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/servers/postgres/operators.py +0 -0
  70. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/servers/postgres/reserved.py +0 -0
  71. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/servers/postgres/sql.py +0 -0
  72. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/servers/postgres/types.py +0 -0
  73. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/servers/sqlite/__init__.py +0 -0
  74. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/servers/sqlite/operators.py +0 -0
  75. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/servers/sqlite/reserved.py +0 -0
  76. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/servers/sqlite/sql.py +0 -0
  77. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/servers/sqlite/types.py +0 -0
  78. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/servers/sqlserver/__init__.py +0 -0
  79. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/servers/sqlserver/operators.py +0 -0
  80. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/servers/sqlserver/reserved.py +0 -0
  81. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/servers/sqlserver/sql.py +0 -0
  82. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/servers/sqlserver/types.py +0 -0
  83. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/servers/tablehelper.py +0 -0
  84. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/tests/__init__.py +0 -0
  85. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/tests/common_db_test.py +0 -0
  86. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/tests/postgres/__init__.py +0 -0
  87. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/tests/postgres/common.py +0 -0
  88. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/tests/postgres/conftest.py +0 -0
  89. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/tests/postgres/test_column.py +0 -0
  90. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/tests/postgres/test_connections.py +0 -0
  91. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/tests/postgres/test_database.py +0 -0
  92. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/tests/postgres/test_engine.py +0 -0
  93. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/tests/postgres/test_general_usage.py +0 -0
  94. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/tests/postgres/test_imports.py +0 -0
  95. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/tests/postgres/test_result.py +0 -0
  96. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/tests/postgres/test_row.py +0 -0
  97. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/tests/postgres/test_row_comprehensive.py +0 -0
  98. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/tests/postgres/test_schema_locking.py +0 -0
  99. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/tests/postgres/test_schema_locking_unit.py +0 -0
  100. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/tests/postgres/test_sequence.py +0 -0
  101. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/tests/postgres/test_sql_comprehensive.py +0 -0
  102. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/tests/postgres/test_table.py +0 -0
  103. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/tests/postgres/test_table_comprehensive.py +0 -0
  104. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/tests/postgres/test_transaction.py +0 -0
  105. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/tests/sql/__init__.py +0 -0
  106. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/tests/sql/common.py +0 -0
  107. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/tests/sql/test_postgres_select_advanced.py +0 -0
  108. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/tests/sql/test_postgres_select_variances.py +0 -0
  109. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/tests/test_cursor_rowcount_fix.py +0 -0
  110. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/tests/test_db_utils.py +0 -0
  111. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/tests/test_postgres.py +0 -0
  112. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/tests/test_postgres_unchanged.py +0 -0
  113. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/tests/test_process_error_robustness.py +0 -0
  114. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/tests/test_result_caching.py +0 -0
  115. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/tests/test_result_sql_aware.py +0 -0
  116. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/tests/test_row_get_missing_column.py +0 -0
  117. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/tests/test_schema_locking_initializers.py +0 -0
  118. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/tests/test_schema_locking_simple.py +0 -0
  119. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/tests/test_sql_builder.py +0 -0
  120. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/tests/test_tablehelper.py +0 -0
  121. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/tests/test_view_helper.py +0 -0
  122. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/db/utils.py +0 -0
  123. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/logging.py +0 -0
  124. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/misc/__init__.py +0 -0
  125. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/misc/conv/__init__.py +0 -0
  126. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/misc/conv/iconv.py +0 -0
  127. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/misc/conv/oconv.py +0 -0
  128. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/misc/db.py +0 -0
  129. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/misc/export.py +0 -0
  130. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/misc/format.py +0 -0
  131. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/misc/mail.py +0 -0
  132. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/misc/merge.py +0 -0
  133. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/misc/pdf.py +0 -0
  134. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/misc/tests/__init__.py +0 -0
  135. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/misc/tests/test_db.py +0 -0
  136. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/misc/tests/test_fix.py +0 -0
  137. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/misc/tests/test_format.py +0 -0
  138. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/misc/tests/test_iconv.py +0 -0
  139. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/misc/tests/test_merge.py +0 -0
  140. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/misc/tests/test_oconv.py +0 -0
  141. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/misc/tests/test_original_error.py +0 -0
  142. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/misc/tests/test_timer.py +0 -0
  143. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/misc/timer.py +0 -0
  144. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/misc/tools.py +0 -0
  145. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/payment/__init__.py +0 -0
  146. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/payment/authorizenet_adapter.py +0 -0
  147. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/payment/authorizenet_mirror.py +0 -0
  148. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/payment/base_adapter.py +0 -0
  149. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/payment/braintree_adapter.py +0 -0
  150. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/payment/braintree_mirror.py +0 -0
  151. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/payment/charge_rules.py +0 -0
  152. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity/payment/stripe_mirror.py +0 -0
  153. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity_python.egg-info/dependency_links.txt +0 -0
  154. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity_python.egg-info/entry_points.txt +0 -0
  155. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity_python.egg-info/requires.txt +0 -0
  156. {velocity_python-0.1.66 → velocity_python-0.1.68}/src/velocity_python.egg-info/top_level.txt +0 -0
  157. {velocity_python-0.1.66 → velocity_python-0.1.68}/tests/test_amplify_build.py +0 -0
  158. {velocity_python-0.1.66 → velocity_python-0.1.68}/tests/test_asset_indexing.py +0 -0
  159. {velocity_python-0.1.66 → velocity_python-0.1.68}/tests/test_asset_references.py +0 -0
  160. {velocity_python-0.1.66 → velocity_python-0.1.68}/tests/test_assets_service.py +0 -0
  161. {velocity_python-0.1.66 → velocity_python-0.1.68}/tests/test_async_support.py +0 -0
  162. {velocity_python-0.1.66 → velocity_python-0.1.68}/tests/test_batch_operations.py +0 -0
  163. {velocity_python-0.1.66 → velocity_python-0.1.68}/tests/test_concurrency_safety.py +0 -0
  164. {velocity_python-0.1.66 → velocity_python-0.1.68}/tests/test_connection_pool.py +0 -0
  165. {velocity_python-0.1.66 → velocity_python-0.1.68}/tests/test_connection_resilience.py +0 -0
  166. {velocity_python-0.1.66 → velocity_python-0.1.68}/tests/test_context_job_descriptions.py +0 -0
  167. {velocity_python-0.1.66 → velocity_python-0.1.68}/tests/test_db_credentials_ssm_cascade.py +0 -0
  168. {velocity_python-0.1.66 → velocity_python-0.1.68}/tests/test_decorators.py +0 -0
  169. {velocity_python-0.1.66 → velocity_python-0.1.68}/tests/test_dirty_pipeline_fast_path.py +0 -0
  170. {velocity_python-0.1.66 → velocity_python-0.1.68}/tests/test_email_processing.py +0 -0
  171. {velocity_python-0.1.66 → velocity_python-0.1.68}/tests/test_http_handler_rollback.py +0 -0
  172. {velocity_python-0.1.66 → velocity_python-0.1.68}/tests/test_iconv_money_to_cents.py +0 -0
  173. {velocity_python-0.1.66 → velocity_python-0.1.68}/tests/test_identifier_injection_guard.py +0 -0
  174. {velocity_python-0.1.66 → velocity_python-0.1.68}/tests/test_json_columns.py +0 -0
  175. {velocity_python-0.1.66 → velocity_python-0.1.68}/tests/test_jsonb_dict_adapter.py +0 -0
  176. {velocity_python-0.1.66 → velocity_python-0.1.68}/tests/test_lambda_handler.py +0 -0
  177. {velocity_python-0.1.66 → velocity_python-0.1.68}/tests/test_lambda_handler_auth.py +0 -0
  178. {velocity_python-0.1.66 → velocity_python-0.1.68}/tests/test_lambda_handler_masquerade.py +0 -0
  179. {velocity_python-0.1.66 → velocity_python-0.1.68}/tests/test_masquerade_grant.py +0 -0
  180. {velocity_python-0.1.66 → velocity_python-0.1.68}/tests/test_mixins_import.py +0 -0
  181. {velocity_python-0.1.66 → velocity_python-0.1.68}/tests/test_n_plus_one.py +0 -0
  182. {velocity_python-0.1.66 → velocity_python-0.1.68}/tests/test_observability.py +0 -0
  183. {velocity_python-0.1.66 → velocity_python-0.1.68}/tests/test_payment_authorizenet_adapter.py +0 -0
  184. {velocity_python-0.1.66 → velocity_python-0.1.68}/tests/test_payment_braintree_adapter.py +0 -0
  185. {velocity_python-0.1.66 → velocity_python-0.1.68}/tests/test_payment_braintree_mirror.py +0 -0
  186. {velocity_python-0.1.66 → velocity_python-0.1.68}/tests/test_payment_profile_sorting.py +0 -0
  187. {velocity_python-0.1.66 → velocity_python-0.1.68}/tests/test_pdf.py +0 -0
  188. {velocity_python-0.1.66 → velocity_python-0.1.68}/tests/test_prepared_statements.py +0 -0
  189. {velocity_python-0.1.66 → velocity_python-0.1.68}/tests/test_psycopg3_upgrade.py +0 -0
  190. {velocity_python-0.1.66 → velocity_python-0.1.68}/tests/test_query_cache.py +0 -0
  191. {velocity_python-0.1.66 → velocity_python-0.1.68}/tests/test_restricted_direct_tables.py +0 -0
  192. {velocity_python-0.1.66 → velocity_python-0.1.68}/tests/test_retry_side_effect_guard.py +0 -0
  193. {velocity_python-0.1.66 → velocity_python-0.1.68}/tests/test_return_default_safety.py +0 -0
  194. {velocity_python-0.1.66 → velocity_python-0.1.68}/tests/test_row_batch_update.py +0 -0
  195. {velocity_python-0.1.66 → velocity_python-0.1.68}/tests/test_row_cache_staleness.py +0 -0
  196. {velocity_python-0.1.66 → velocity_python-0.1.68}/tests/test_row_dirty_tracking.py +0 -0
  197. {velocity_python-0.1.66 → velocity_python-0.1.68}/tests/test_schema_migrations.py +0 -0
  198. {velocity_python-0.1.66 → velocity_python-0.1.68}/tests/test_security_hardening.py +0 -0
  199. {velocity_python-0.1.66 → velocity_python-0.1.68}/tests/test_server_cursor.py +0 -0
  200. {velocity_python-0.1.66 → velocity_python-0.1.68}/tests/test_single_autocommit_safety.py +0 -0
  201. {velocity_python-0.1.66 → velocity_python-0.1.68}/tests/test_spreadsheet_functions.py +0 -0
  202. {velocity_python-0.1.66 → velocity_python-0.1.68}/tests/test_sqs_per_record_transactions.py +0 -0
  203. {velocity_python-0.1.66 → velocity_python-0.1.68}/tests/test_ssm_config.py +0 -0
  204. {velocity_python-0.1.66 → velocity_python-0.1.68}/tests/test_sys_modified_count_postgres_demo.py +0 -0
  205. {velocity_python-0.1.66 → velocity_python-0.1.68}/tests/test_table_alter.py +0 -0
  206. {velocity_python-0.1.66 → velocity_python-0.1.68}/tests/test_where_clause_validation.py +0 -0
  207. {velocity_python-0.1.66 → velocity_python-0.1.68}/tests/test_write_hook_create_flow.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: velocity-python
3
- Version: 0.1.66
3
+ Version: 0.1.68
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.1.66"
7
+ version = "0.1.68"
8
8
  authors = [
9
9
  { name="Velocity Team", email="info@codeclubs.org" },
10
10
  ]
@@ -1,4 +1,4 @@
1
- __version__ = version = "0.1.66"
1
+ __version__ = version = "0.1.68"
2
2
 
3
3
  import importlib as _importlib
4
4
 
@@ -24,6 +24,10 @@ engine = velocity.db.postgres.initialize()
24
24
  cognito_client = boto3.client("cognito-idp")
25
25
  logger = get_logger("velocity.aws.handlers.context")
26
26
 
27
+ # Cognito User Pool id shape, e.g. "us-east-1_aBcD1234". Used to distinguish a
28
+ # real user-pool identity from other Identity Pool providers (developer-auth).
29
+ _COGNITO_USER_POOL_ID_RE = re.compile(r"^[\w-]+_[0-9a-zA-Z]+$")
30
+
27
31
 
28
32
  def _get_work_queue_name() -> str:
29
33
  queue_name = str(config_getenv("SqsWorkQueue", "") or "").strip()
@@ -656,6 +660,21 @@ class Context:
656
660
  if not user_pool_id or not user_sub:
657
661
  raise AlertError("Incomplete Cognito identity provider data") from None
658
662
 
663
+ # Federated identities that are not Cognito User Pool logins — e.g.
664
+ # developer-authenticated Identity Pool identities used for admin
665
+ # masquerade — carry a provider name (like "login.caringcent.masquerade")
666
+ # that is not a user-pool id. Detect that and fail with a clear message
667
+ # rather than passing an invalid value to admin_get_user (which raises a
668
+ # cryptic "userPoolId failed to satisfy constraint" error).
669
+ if "cognito-idp" not in provider or not _COGNITO_USER_POOL_ID_RE.match(
670
+ user_pool_id
671
+ ):
672
+ raise AlertError(
673
+ "Request identity is not a Cognito User Pool user "
674
+ f"(authentication provider '{provider[:120]}'); "
675
+ "cannot resolve a Cognito user"
676
+ ) from None
677
+
659
678
  try:
660
679
  self.perf.start("cognito admin_get_user")
661
680
  response = cognito_client.admin_get_user(
@@ -521,6 +521,10 @@ class StripeAdapter(PaymentProcessorAdapter):
521
521
  "platform_fee": platform_fee_cents,
522
522
  "application_fee": application_fee_cents,
523
523
  "client_amount": amount_cents - application_fee_cents,
524
+ # Real Stripe processing cost from the settled BalanceTransaction
525
+ # (None for an uncaptured manual auth); callers freeze it as the
526
+ # 'stripe_settled' processor fee, else keep their estimate (M6).
527
+ "actual_processor_fee": self._settled_processor_fee_cents(charge),
524
528
  },
525
529
  }
526
530
 
@@ -621,6 +625,10 @@ class StripeAdapter(PaymentProcessorAdapter):
621
625
  "platform_fee": platform_fee_cents,
622
626
  "application_fee": payment_intent.application_fee_amount or application_fee_cents,
623
627
  "client_amount": payment_intent.amount - (payment_intent.application_fee_amount or application_fee_cents),
628
+ # Real Stripe processing cost from the settled BalanceTransaction (None
629
+ # when not yet available); callers freeze it as the 'stripe_settled'
630
+ # processor fee, otherwise keep their formula estimate (FeeModel.md M6).
631
+ "actual_processor_fee": self._settled_processor_fee_cents(charge),
624
632
  "error_message": None,
625
633
  "metadata": {
626
634
  "payment_intent": payment_intent,
@@ -849,13 +857,43 @@ class StripeAdapter(PaymentProcessorAdapter):
849
857
  latest_charge_id = getattr(payment_intent, "latest_charge", None)
850
858
  if latest_charge_id:
851
859
  try:
852
- charge = stripe.Charge.retrieve(latest_charge_id, api_key=self._api_key)
860
+ charge = stripe.Charge.retrieve(
861
+ latest_charge_id,
862
+ expand=["balance_transaction"],
863
+ api_key=self._api_key,
864
+ )
853
865
  except stripe.error.StripeError:
854
866
  charge = None
855
867
  if charge:
856
868
  upsert_stripe_charge_record(tx, charge, source=source)
857
869
  return charge
858
870
 
871
+ def _settled_processor_fee_cents(self, charge):
872
+ """Return the processor's actual fee (cents) from the charge's BalanceTransaction.
873
+
874
+ Stripe exposes the real processing cost on the charge's BalanceTransaction
875
+ (``balance_transaction.fee``). Returns ``None`` when it is not yet available
876
+ (e.g. an uncaptured manual authorization) or cannot be fetched — callers then
877
+ keep their formula estimate rather than over-reporting. Never raises. This is the
878
+ ``stripe_settled`` actual-cost source in CaringCent's FeeModel.md (M6).
879
+ """
880
+ if not charge:
881
+ return None
882
+ bt = getattr(charge, "balance_transaction", None)
883
+ if bt is None and isinstance(charge, dict):
884
+ bt = charge.get("balance_transaction")
885
+ try:
886
+ if bt is None:
887
+ return None
888
+ if isinstance(bt, str):
889
+ bt = stripe.BalanceTransaction.retrieve(bt, api_key=self._api_key)
890
+ fee = getattr(bt, "fee", None)
891
+ if fee is None and isinstance(bt, dict):
892
+ fee = bt.get("fee")
893
+ return int(fee) if fee is not None else None
894
+ except stripe.error.StripeError:
895
+ return None
896
+
859
897
  def _determine_account_status(self, account) -> str:
860
898
  """
861
899
  Determine human-readable account status from Stripe Account object.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: velocity-python
3
- Version: 0.1.66
3
+ Version: 0.1.68
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
@@ -164,6 +164,7 @@ tests/test_db_credentials_ssm_cascade.py
164
164
  tests/test_decorators.py
165
165
  tests/test_dirty_pipeline_fast_path.py
166
166
  tests/test_email_processing.py
167
+ tests/test_get_cognito_user_provider.py
167
168
  tests/test_http_handler_rollback.py
168
169
  tests/test_iconv_money_to_cents.py
169
170
  tests/test_identifier_injection_guard.py
@@ -0,0 +1,66 @@
1
+ import unittest
2
+ from unittest.mock import patch
3
+
4
+ from velocity.aws.handlers import context as handler_context
5
+ from velocity.aws.handlers.context import Context
6
+ from velocity.aws.handlers.exceptions import AlertError
7
+
8
+
9
+ def _ctx(provider):
10
+ event = {
11
+ "requestContext": {"identity": {"cognitoAuthenticationProvider": provider}}
12
+ }
13
+ ctx = Context(
14
+ aws_event=event,
15
+ aws_context=None,
16
+ args={},
17
+ postdata={},
18
+ response=None,
19
+ session={},
20
+ )
21
+ return ctx, event
22
+
23
+
24
+ # A real Cognito User Pool federation looks like
25
+ # "cognito-idp.<region>.amazonaws.com/<poolId>,...:CognitoSignIn:<sub>".
26
+ VALID_PROVIDER = (
27
+ "cognito-idp.us-east-1.amazonaws.com/us-east-1_Abc12345,"
28
+ "cognito-idp.us-east-1.amazonaws.com/us-east-1_Abc12345:CognitoSignIn:sub-123"
29
+ )
30
+ # A developer-authenticated Identity Pool identity (admin masquerade) carries
31
+ # only the developer provider name.
32
+ DEV_PROVIDER = "login.caringcent.masquerade"
33
+
34
+
35
+ class TestGetCognitoUserProvider(unittest.TestCase):
36
+ def test_developer_provider_is_rejected_cleanly(self):
37
+ ctx, event = _ctx(DEV_PROVIDER)
38
+ with patch.object(handler_context, "cognito_client") as mock_cognito:
39
+ with self.assertRaises(AlertError) as cm:
40
+ ctx.get_cognito_user(event)
41
+ mock_cognito.admin_get_user.assert_not_called()
42
+ self.assertIn("not a Cognito User Pool user", str(cm.exception))
43
+
44
+ def test_developer_provider_optional_returns_none(self):
45
+ ctx, event = _ctx(DEV_PROVIDER)
46
+ with patch.object(handler_context, "cognito_client"):
47
+ self.assertIsNone(ctx.get_cognito_user_optional(event))
48
+
49
+ def test_valid_provider_passes_the_gate(self):
50
+ ctx, event = _ctx(VALID_PROVIDER)
51
+ with patch.object(handler_context, "cognito_client") as mock_cognito:
52
+ mock_cognito.admin_get_user.return_value = {
53
+ "Username": "user-1",
54
+ "UserAttributes": [{"Name": "email", "Value": "user@example.com"}],
55
+ "Enabled": True,
56
+ "UserStatus": "CONFIRMED",
57
+ }
58
+ user = ctx.get_cognito_user(event)
59
+ mock_cognito.admin_get_user.assert_called_once()
60
+ _, kwargs = mock_cognito.admin_get_user.call_args
61
+ self.assertEqual(kwargs["UserPoolId"], "us-east-1_Abc12345")
62
+ self.assertEqual(user["email"], "user@example.com")
63
+
64
+
65
+ if __name__ == "__main__":
66
+ unittest.main()
@@ -238,6 +238,79 @@ def test_authorize_payment_upserts_payment_intent_mirror(adapter, monkeypatch):
238
238
  ]
239
239
 
240
240
 
241
+ def test_settled_processor_fee_from_expanded_balance_transaction(adapter):
242
+ # Stripe exposes the real processing cost on the charge's BalanceTransaction.
243
+ charge = SimpleNamespace(
244
+ id="ch_123",
245
+ balance_transaction=SimpleNamespace(id="txn_1", fee=332),
246
+ )
247
+ assert adapter._settled_processor_fee_cents(charge) == 332
248
+
249
+
250
+ def test_settled_processor_fee_retrieves_unexpanded_balance_transaction(adapter, monkeypatch):
251
+ monkeypatch.setattr(
252
+ "velocity.payment.stripe_adapter.stripe.BalanceTransaction.retrieve",
253
+ lambda txn_id, api_key=None: SimpleNamespace(id=txn_id, fee=288),
254
+ )
255
+ charge = SimpleNamespace(id="ch_123", balance_transaction="txn_1")
256
+ assert adapter._settled_processor_fee_cents(charge) == 288
257
+
258
+
259
+ def test_settled_processor_fee_none_when_unavailable(adapter):
260
+ # No charge, or no balance transaction yet (uncaptured auth) -> None, never raises.
261
+ assert adapter._settled_processor_fee_cents(None) is None
262
+ assert (
263
+ adapter._settled_processor_fee_cents(
264
+ SimpleNamespace(id="ch_1", balance_transaction=None)
265
+ )
266
+ is None
267
+ )
268
+
269
+
270
+ def test_charge_stored_payment_method_reports_actual_processor_fee(adapter, monkeypatch):
271
+ monkeypatch.setattr(
272
+ "velocity.payment.stripe_adapter.stripe.PaymentIntent.create",
273
+ lambda **kwargs: SimpleNamespace(
274
+ id="pi_123",
275
+ latest_charge="ch_123",
276
+ status="succeeded",
277
+ amount=10420,
278
+ currency="usd",
279
+ application_fee_amount=820,
280
+ ),
281
+ )
282
+ monkeypatch.setattr(
283
+ "velocity.payment.stripe_adapter.stripe.Charge.retrieve",
284
+ lambda charge_id, expand=None, api_key=None: SimpleNamespace(
285
+ id=charge_id,
286
+ balance_transaction=SimpleNamespace(id="txn_1", fee=332),
287
+ ),
288
+ )
289
+ monkeypatch.setattr(
290
+ "velocity.payment.stripe_adapter.upsert_stripe_payment_intent_record",
291
+ lambda *a, **k: None,
292
+ )
293
+ monkeypatch.setattr(
294
+ "velocity.payment.stripe_adapter.upsert_stripe_charge_record",
295
+ lambda *a, **k: None,
296
+ )
297
+
298
+ result = adapter.charge_stored_payment_method(
299
+ None,
300
+ {
301
+ "amount": 10420,
302
+ "payment_method": "pm_123",
303
+ "customer_profile_id": "cus_123",
304
+ "processor_account_id": "acct_123",
305
+ "revenue_split_percentage": 8,
306
+ "client_id": "client_1",
307
+ },
308
+ )
309
+
310
+ assert result["success"] is True
311
+ assert result["actual_processor_fee"] == 332
312
+
313
+
241
314
  def test_authorize_payment_uses_explicit_application_fee(adapter, monkeypatch):
242
315
  captured = {}
243
316