velocity-python 0.1.50__tar.gz → 0.1.51__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 (191) hide show
  1. {velocity_python-0.1.50 → velocity_python-0.1.51}/PKG-INFO +1 -1
  2. {velocity_python-0.1.50 → velocity_python-0.1.51}/pyproject.toml +1 -1
  3. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/__init__.py +1 -1
  4. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/aws/__init__.py +2 -1
  5. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/aws/amplify_build.py +17 -17
  6. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/aws/handlers/context.py +3 -2
  7. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/aws/handlers/mixins/web_handler.py +9 -4
  8. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/aws/ssm_config.py +5 -5
  9. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity_python.egg-info/PKG-INFO +1 -1
  10. {velocity_python-0.1.50 → velocity_python-0.1.51}/LICENSE +0 -0
  11. {velocity_python-0.1.50 → velocity_python-0.1.51}/README.md +0 -0
  12. {velocity_python-0.1.50 → velocity_python-0.1.51}/setup.cfg +0 -0
  13. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/aws/amplify.py +0 -0
  14. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/aws/assets/__init__.py +0 -0
  15. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/aws/assets/backfill.py +0 -0
  16. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/aws/assets/indexing.py +0 -0
  17. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/aws/assets/references.py +0 -0
  18. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/aws/assets/service.py +0 -0
  19. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/aws/assets/usage_index.py +0 -0
  20. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/aws/dirty_pipeline.py +0 -0
  21. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/aws/handlers/__init__.py +0 -0
  22. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/aws/handlers/base_handler.py +0 -0
  23. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/aws/handlers/context_factory.py +0 -0
  24. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/aws/handlers/exceptions.py +0 -0
  25. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/aws/handlers/lambda_handler.py +0 -0
  26. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/aws/handlers/mixins/__init__.py +0 -0
  27. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/aws/handlers/mixins/data_service.py +0 -0
  28. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/aws/handlers/perf.py +0 -0
  29. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/aws/handlers/response.py +0 -0
  30. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/aws/handlers/sqs_handler.py +0 -0
  31. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/aws/s3.py +0 -0
  32. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/aws/tests/__init__.py +0 -0
  33. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/aws/tests/test_base_handler_error_response.py +0 -0
  34. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/aws/tests/test_lambda_handler_json_serialization.py +0 -0
  35. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/aws/tests/test_response.py +0 -0
  36. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/__init__.py +0 -0
  37. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/core/__init__.py +0 -0
  38. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/core/async_support.py +0 -0
  39. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/core/column.py +0 -0
  40. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/core/database.py +0 -0
  41. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/core/decorators.py +0 -0
  42. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/core/engine.py +0 -0
  43. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/core/result.py +0 -0
  44. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/core/row.py +0 -0
  45. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/core/sequence.py +0 -0
  46. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/core/table.py +0 -0
  47. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/core/transaction.py +0 -0
  48. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/core/view.py +0 -0
  49. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/exceptions.py +0 -0
  50. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/migrations.py +0 -0
  51. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/servers/__init__.py +0 -0
  52. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/servers/base/__init__.py +0 -0
  53. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/servers/base/initializer.py +0 -0
  54. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/servers/base/operators.py +0 -0
  55. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/servers/base/sql.py +0 -0
  56. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/servers/base/types.py +0 -0
  57. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/servers/mysql/__init__.py +0 -0
  58. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/servers/mysql/operators.py +0 -0
  59. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/servers/mysql/reserved.py +0 -0
  60. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/servers/mysql/sql.py +0 -0
  61. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/servers/mysql/types.py +0 -0
  62. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/servers/postgres/__init__.py +0 -0
  63. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/servers/postgres/operators.py +0 -0
  64. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/servers/postgres/reserved.py +0 -0
  65. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/servers/postgres/sql.py +0 -0
  66. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/servers/postgres/types.py +0 -0
  67. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/servers/sqlite/__init__.py +0 -0
  68. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/servers/sqlite/operators.py +0 -0
  69. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/servers/sqlite/reserved.py +0 -0
  70. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/servers/sqlite/sql.py +0 -0
  71. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/servers/sqlite/types.py +0 -0
  72. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/servers/sqlserver/__init__.py +0 -0
  73. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/servers/sqlserver/operators.py +0 -0
  74. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/servers/sqlserver/reserved.py +0 -0
  75. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/servers/sqlserver/sql.py +0 -0
  76. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/servers/sqlserver/types.py +0 -0
  77. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/servers/tablehelper.py +0 -0
  78. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/tests/__init__.py +0 -0
  79. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/tests/common_db_test.py +0 -0
  80. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/tests/postgres/__init__.py +0 -0
  81. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/tests/postgres/common.py +0 -0
  82. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/tests/postgres/test_column.py +0 -0
  83. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/tests/postgres/test_connections.py +0 -0
  84. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/tests/postgres/test_database.py +0 -0
  85. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/tests/postgres/test_engine.py +0 -0
  86. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/tests/postgres/test_general_usage.py +0 -0
  87. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/tests/postgres/test_imports.py +0 -0
  88. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/tests/postgres/test_result.py +0 -0
  89. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/tests/postgres/test_row.py +0 -0
  90. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/tests/postgres/test_row_comprehensive.py +0 -0
  91. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/tests/postgres/test_schema_locking.py +0 -0
  92. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/tests/postgres/test_schema_locking_unit.py +0 -0
  93. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/tests/postgres/test_sequence.py +0 -0
  94. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/tests/postgres/test_sql_comprehensive.py +0 -0
  95. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/tests/postgres/test_table.py +0 -0
  96. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/tests/postgres/test_table_comprehensive.py +0 -0
  97. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/tests/postgres/test_transaction.py +0 -0
  98. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/tests/sql/__init__.py +0 -0
  99. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/tests/sql/common.py +0 -0
  100. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/tests/sql/test_postgres_select_advanced.py +0 -0
  101. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/tests/sql/test_postgres_select_variances.py +0 -0
  102. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/tests/test_cursor_rowcount_fix.py +0 -0
  103. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/tests/test_db_utils.py +0 -0
  104. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/tests/test_postgres.py +0 -0
  105. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/tests/test_postgres_unchanged.py +0 -0
  106. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/tests/test_process_error_robustness.py +0 -0
  107. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/tests/test_result_caching.py +0 -0
  108. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/tests/test_result_sql_aware.py +0 -0
  109. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/tests/test_row_get_missing_column.py +0 -0
  110. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/tests/test_schema_locking_initializers.py +0 -0
  111. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/tests/test_schema_locking_simple.py +0 -0
  112. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/tests/test_sql_builder.py +0 -0
  113. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/tests/test_tablehelper.py +0 -0
  114. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/tests/test_view_helper.py +0 -0
  115. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/db/utils.py +0 -0
  116. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/logging.py +0 -0
  117. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/misc/__init__.py +0 -0
  118. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/misc/conv/__init__.py +0 -0
  119. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/misc/conv/iconv.py +0 -0
  120. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/misc/conv/oconv.py +0 -0
  121. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/misc/db.py +0 -0
  122. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/misc/export.py +0 -0
  123. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/misc/format.py +0 -0
  124. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/misc/mail.py +0 -0
  125. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/misc/merge.py +0 -0
  126. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/misc/pdf.py +0 -0
  127. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/misc/tests/__init__.py +0 -0
  128. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/misc/tests/test_db.py +0 -0
  129. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/misc/tests/test_fix.py +0 -0
  130. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/misc/tests/test_format.py +0 -0
  131. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/misc/tests/test_iconv.py +0 -0
  132. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/misc/tests/test_merge.py +0 -0
  133. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/misc/tests/test_oconv.py +0 -0
  134. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/misc/tests/test_original_error.py +0 -0
  135. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/misc/tests/test_timer.py +0 -0
  136. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/misc/timer.py +0 -0
  137. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/misc/tools.py +0 -0
  138. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/payment/__init__.py +0 -0
  139. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/payment/authorizenet_adapter.py +0 -0
  140. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/payment/authorizenet_mirror.py +0 -0
  141. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/payment/base_adapter.py +0 -0
  142. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/payment/braintree_adapter.py +0 -0
  143. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/payment/braintree_mirror.py +0 -0
  144. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/payment/charge_rules.py +0 -0
  145. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/payment/stripe_adapter.py +0 -0
  146. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity/payment/stripe_mirror.py +0 -0
  147. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity_python.egg-info/SOURCES.txt +0 -0
  148. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity_python.egg-info/dependency_links.txt +0 -0
  149. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity_python.egg-info/entry_points.txt +0 -0
  150. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity_python.egg-info/requires.txt +0 -0
  151. {velocity_python-0.1.50 → velocity_python-0.1.51}/src/velocity_python.egg-info/top_level.txt +0 -0
  152. {velocity_python-0.1.50 → velocity_python-0.1.51}/tests/test_amplify_build.py +0 -0
  153. {velocity_python-0.1.50 → velocity_python-0.1.51}/tests/test_asset_indexing.py +0 -0
  154. {velocity_python-0.1.50 → velocity_python-0.1.51}/tests/test_asset_references.py +0 -0
  155. {velocity_python-0.1.50 → velocity_python-0.1.51}/tests/test_assets_service.py +0 -0
  156. {velocity_python-0.1.50 → velocity_python-0.1.51}/tests/test_async_support.py +0 -0
  157. {velocity_python-0.1.50 → velocity_python-0.1.51}/tests/test_batch_operations.py +0 -0
  158. {velocity_python-0.1.50 → velocity_python-0.1.51}/tests/test_concurrency_safety.py +0 -0
  159. {velocity_python-0.1.50 → velocity_python-0.1.51}/tests/test_connection_pool.py +0 -0
  160. {velocity_python-0.1.50 → velocity_python-0.1.51}/tests/test_connection_resilience.py +0 -0
  161. {velocity_python-0.1.50 → velocity_python-0.1.51}/tests/test_context_job_descriptions.py +0 -0
  162. {velocity_python-0.1.50 → velocity_python-0.1.51}/tests/test_decorators.py +0 -0
  163. {velocity_python-0.1.50 → velocity_python-0.1.51}/tests/test_dirty_pipeline_fast_path.py +0 -0
  164. {velocity_python-0.1.50 → velocity_python-0.1.51}/tests/test_email_processing.py +0 -0
  165. {velocity_python-0.1.50 → velocity_python-0.1.51}/tests/test_iconv_money_to_cents.py +0 -0
  166. {velocity_python-0.1.50 → velocity_python-0.1.51}/tests/test_lambda_handler.py +0 -0
  167. {velocity_python-0.1.50 → velocity_python-0.1.51}/tests/test_lambda_handler_auth.py +0 -0
  168. {velocity_python-0.1.50 → velocity_python-0.1.51}/tests/test_mixins_import.py +0 -0
  169. {velocity_python-0.1.50 → velocity_python-0.1.51}/tests/test_n_plus_one.py +0 -0
  170. {velocity_python-0.1.50 → velocity_python-0.1.51}/tests/test_observability.py +0 -0
  171. {velocity_python-0.1.50 → velocity_python-0.1.51}/tests/test_payment_authorizenet_adapter.py +0 -0
  172. {velocity_python-0.1.50 → velocity_python-0.1.51}/tests/test_payment_braintree_adapter.py +0 -0
  173. {velocity_python-0.1.50 → velocity_python-0.1.51}/tests/test_payment_braintree_mirror.py +0 -0
  174. {velocity_python-0.1.50 → velocity_python-0.1.51}/tests/test_payment_profile_sorting.py +0 -0
  175. {velocity_python-0.1.50 → velocity_python-0.1.51}/tests/test_payment_stripe_adapter.py +0 -0
  176. {velocity_python-0.1.50 → velocity_python-0.1.51}/tests/test_pdf.py +0 -0
  177. {velocity_python-0.1.50 → velocity_python-0.1.51}/tests/test_prepared_statements.py +0 -0
  178. {velocity_python-0.1.50 → velocity_python-0.1.51}/tests/test_psycopg3_upgrade.py +0 -0
  179. {velocity_python-0.1.50 → velocity_python-0.1.51}/tests/test_query_cache.py +0 -0
  180. {velocity_python-0.1.50 → velocity_python-0.1.51}/tests/test_row_batch_update.py +0 -0
  181. {velocity_python-0.1.50 → velocity_python-0.1.51}/tests/test_row_cache_staleness.py +0 -0
  182. {velocity_python-0.1.50 → velocity_python-0.1.51}/tests/test_row_dirty_tracking.py +0 -0
  183. {velocity_python-0.1.50 → velocity_python-0.1.51}/tests/test_schema_migrations.py +0 -0
  184. {velocity_python-0.1.50 → velocity_python-0.1.51}/tests/test_security_hardening.py +0 -0
  185. {velocity_python-0.1.50 → velocity_python-0.1.51}/tests/test_server_cursor.py +0 -0
  186. {velocity_python-0.1.50 → velocity_python-0.1.51}/tests/test_spreadsheet_functions.py +0 -0
  187. {velocity_python-0.1.50 → velocity_python-0.1.51}/tests/test_sqs_per_record_transactions.py +0 -0
  188. {velocity_python-0.1.50 → velocity_python-0.1.51}/tests/test_ssm_config.py +0 -0
  189. {velocity_python-0.1.50 → velocity_python-0.1.51}/tests/test_sys_modified_count_postgres_demo.py +0 -0
  190. {velocity_python-0.1.50 → velocity_python-0.1.51}/tests/test_table_alter.py +0 -0
  191. {velocity_python-0.1.50 → velocity_python-0.1.51}/tests/test_where_clause_validation.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: velocity-python
3
- Version: 0.1.50
3
+ Version: 0.1.51
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.50"
7
+ version = "0.1.51"
8
8
  authors = [
9
9
  { name="Velocity Team", email="info@codeclubs.org" },
10
10
  ]
@@ -1,4 +1,4 @@
1
- __version__ = version = "0.1.50"
1
+ __version__ = version = "0.1.51"
2
2
 
3
3
  import importlib as _importlib
4
4
 
@@ -1,7 +1,8 @@
1
1
  import importlib as _importlib
2
2
  import os
3
3
 
4
- DEBUG = (os.environ.get("ENV") != "production") or (os.environ.get("DEBUG") == "Y")
4
+ _APP_STAGE = os.environ.get("AppStage") or os.environ.get("AWS_BRANCH") or "demo"
5
+ DEBUG = (_APP_STAGE != "production") or (os.environ.get("DEBUG") == "Y")
5
6
 
6
7
 
7
8
  # This is helpful for running HTTPS clients on lambda.
@@ -176,6 +176,7 @@ def initialize_build_environment(
176
176
  app_id, branch = get_amplify_app_id_and_branch(project_root)
177
177
  print(f"[INFO] Setting environment to: {branch}")
178
178
  env.set(branch)
179
+ os.environ["AppStage"] = branch
179
180
  os.environ["AWS_BRANCH"] = branch
180
181
  os.environ["AWS_APP_ID"] = app_id
181
182
  if include_run_on_build_env:
@@ -203,8 +204,8 @@ def build_environment_variables(
203
204
 
204
205
  build_datetime = _format_build_datetime(timezone_name)
205
206
  env_vars["BUILD_DATETIME"] = build_datetime
206
- env_vars["USER_BRANCH"] = branch
207
- env_vars["REACT_APP_USER_BRANCH"] = branch
207
+ env_vars["AppStage"] = branch
208
+ env_vars["AWS_BRANCH"] = branch
208
209
  env_vars["USER_REGION"] = app.get_region()
209
210
  env_vars["LOGLEVEL"] = "WARNING" if branch == "production" else "INFO"
210
211
 
@@ -338,32 +339,31 @@ def ensure_lambda_policies_and_attach(
338
339
  iam_client = boto3.client("iam")
339
340
 
340
341
  account_id = app.get_account_id()
341
- lambda_layer_policy = {
342
- "Version": "2012-10-17",
343
- "Statement": [
344
- {
345
- "Effect": "Allow",
346
- "Action": ["lambda:GetFunctionConfiguration"],
347
- "Resource": f"arn:aws:lambda:*:{account_id}:function:*",
348
- }
349
- ],
350
- }
351
342
 
352
343
  lambda_vpc_policy = app.get_lambda_vpc_policy_template()
353
344
  if config is not None:
354
345
  lambda_vpc_policy = config.build_lambda_policy_document(lambda_vpc_policy)
355
346
 
347
+ lambda_layer_statement = {
348
+ "Effect": "Allow",
349
+ "Action": ["lambda:GetFunctionConfiguration"],
350
+ "Resource": f"arn:aws:lambda:*:{account_id}:function:*",
351
+ }
352
+ statements = list(lambda_vpc_policy.get("Statement", []))
353
+ if not any(
354
+ statement.get("Action") == ["lambda:GetFunctionConfiguration"]
355
+ and statement.get("Resource") == f"arn:aws:lambda:*:{account_id}:function:*"
356
+ for statement in statements
357
+ ):
358
+ statements.append(lambda_layer_statement)
359
+ lambda_vpc_policy["Statement"] = statements
360
+
356
361
  required_policies = [
357
362
  (
358
363
  "lambda-vpc-execution",
359
364
  f"arn:aws:iam::{account_id}:policy/lambda-vpc-execution",
360
365
  lambda_vpc_policy,
361
366
  ),
362
- (
363
- "lambda-layer-access",
364
- f"arn:aws:iam::{account_id}:policy/lambda-layer-access",
365
- lambda_layer_policy,
366
- ),
367
367
  ("AmazonSQSFullAccess", "arn:aws:iam::aws:policy/AmazonSQSFullAccess", None),
368
368
  ]
369
369
 
@@ -33,8 +33,9 @@ def _get_work_queue_name() -> str:
33
33
 
34
34
 
35
35
  def _get_controls_vars() -> dict:
36
+ app_stage = config_get_stage()
36
37
  return {
37
- "USER_BRANCH": config_get_stage(),
38
+ "AppStage": app_stage,
38
39
  "AWS_JOB_ID": os.environ.get("AWS_JOB_ID"),
39
40
  "LOGLEVEL": config_getenv("LOGLEVEL"),
40
41
  "USER_REGION": config_get_region(),
@@ -449,7 +450,7 @@ class Context:
449
450
  return str(config_get_stage("") or "").lower() == "production"
450
451
 
451
452
  def get_environment(self):
452
- """Return the current USER_BRANCH value (defaults to demo)."""
453
+ """Return the current AppStage value (defaults to demo)."""
453
454
  return config_get_stage("demo")
454
455
 
455
456
  def get_current_lambda_layers(self):
@@ -18,6 +18,7 @@ from datetime import date, datetime
18
18
  from typing import Any, Dict, List
19
19
 
20
20
  from velocity.aws.handlers.exceptions import AlertError
21
+ from velocity.aws.ssm_config import get_stage as config_get_stage
21
22
 
22
23
  logger = logging.getLogger(__name__)
23
24
 
@@ -60,13 +61,14 @@ class WebHandler(ABC):
60
61
  session_data = context.session() or {}
61
62
 
62
63
  perf.start("track_activity_start build activity_data")
64
+ app_stage = config_get_stage("Unknown")
63
65
  self.activity_data = {
64
66
  "action": context.action(),
65
67
  "args": json.dumps(context.args()),
66
68
  "postdata": self._sanitize_postdata(postdata),
67
69
  "handler_name": self.__class__.__name__,
68
70
  "function_name": os.environ.get("AWS_LAMBDA_FUNCTION_NAME", "Unknown"),
69
- "user_branch": os.environ.get("USER_BRANCH", "Unknown"),
71
+ "app_stage": app_stage,
70
72
  "start_timestamp": self.start_time,
71
73
  }
72
74
  perf.log(
@@ -239,6 +241,7 @@ class WebHandler(ABC):
239
241
 
240
242
  def log_error_to_system(self, tx, context, exception: Exception, tb_string: str):
241
243
  """Log error to the sys_log table"""
244
+ app_stage = config_get_stage("Unknown")
242
245
  error_data = {
243
246
  "level": "ERROR",
244
247
  "message": str(exception),
@@ -247,7 +250,7 @@ class WebHandler(ABC):
247
250
  "exception_type": exception.__class__.__name__,
248
251
  "handler_name": self.__class__.__name__,
249
252
  "action": context.action(),
250
- "user_branch": os.environ.get("USER_BRANCH", "Unknown"),
253
+ "app_stage": app_stage,
251
254
  "function_name": os.environ.get("AWS_LAMBDA_FUNCTION_NAME", "Unknown"),
252
255
  "app_name": os.environ.get("ProjectName", "Unknown"),
253
256
  "user_agent": "AWS Lambda",
@@ -271,7 +274,7 @@ class WebHandler(ABC):
271
274
  logger.debug("No sendmail callable configured; skipping notification.")
272
275
  return
273
276
 
274
- environment = os.environ.get("USER_BRANCH", "Unknown").title()
277
+ environment = config_get_stage("Unknown").title()
275
278
  function_name = os.environ.get("AWS_LAMBDA_FUNCTION_NAME", "Unknown")
276
279
 
277
280
  subject = f"{environment} Lambda Error - {function_name}"
@@ -414,12 +417,14 @@ Request Details:
414
417
  def log_error_metrics(self, tx, context, exception: Exception):
415
418
  """Log error metrics for monitoring"""
416
419
  try:
420
+ app_stage = config_get_stage("Unknown")
417
421
  metrics_data = {
418
422
  "metric_type": "error_count",
419
423
  "handler_name": self.__class__.__name__,
420
424
  "action": context.action(),
421
425
  "exception_type": exception.__class__.__name__,
422
- "environment": os.environ.get("USER_BRANCH", "Unknown"),
426
+ "environment": app_stage,
427
+ "app_stage": app_stage,
423
428
  "function_name": os.environ.get("AWS_LAMBDA_FUNCTION_NAME", "Unknown"),
424
429
  "timestamp": time.time(),
425
430
  "sys_modified_by": "Lambda",
@@ -3,7 +3,7 @@ SSM-backed configuration with environment-variable fallback.
3
3
 
4
4
  ``getenv(key)`` reads from SSM at::
5
5
 
6
- /{ProjectName}/{stage}/{key}
6
+ /{ProjectName}/{AppStage}/{key}
7
7
 
8
8
  and, on a project-scoped miss, then tries::
9
9
 
@@ -11,13 +11,13 @@ and, on a project-scoped miss, then tries::
11
11
 
12
12
  when SSM loading is enabled. An explicit ``VELOCITY_SSM_ENABLED`` environment
13
13
  variable still overrides the behavior, but Lambda runtimes now auto-enable SSM
14
- when they can resolve both project and stage from the runtime environment.
14
+ when they can resolve both project and AppStage from the runtime environment.
15
15
 
16
16
  On an SSM miss or any other SSM error, ``getenv`` falls back to ``os.environ``.
17
17
  Results are cached for the process lifetime so SSM is called at most once per
18
18
  key per Lambda cold start.
19
19
 
20
- Outside Lambda, or when project/stage cannot be resolved, ``getenv`` remains a
20
+ Outside Lambda, or when project/AppStage cannot be resolved, ``getenv`` remains a
21
21
  thin wrapper around ``os.environ.get`` with no SSM call.
22
22
  """
23
23
 
@@ -85,7 +85,7 @@ def _infer_project_name_from_lambda_name() -> str | None:
85
85
  if function_name is None:
86
86
  return None
87
87
 
88
- stage = _first_nonempty_env('AppStage', 'ENV', 'USER_BRANCH', 'AWS_BRANCH')
88
+ stage = _first_nonempty_env('AppStage', 'AWS_BRANCH')
89
89
  base_name = function_name
90
90
  if stage:
91
91
  suffix = f'-{stage}'
@@ -106,7 +106,7 @@ def get_project_name(default: Optional[str] = None) -> Optional[str]:
106
106
 
107
107
 
108
108
  def get_stage(default: Optional[str] = None) -> Optional[str]:
109
- return _first_nonempty_env('AppStage', 'ENV', 'USER_BRANCH', 'AWS_BRANCH') or default
109
+ return _first_nonempty_env('AppStage', 'AWS_BRANCH') or default
110
110
 
111
111
 
112
112
  def get_region(default: Optional[str] = 'us-east-1') -> Optional[str]:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: velocity-python
3
- Version: 0.1.50
3
+ Version: 0.1.51
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