velocity-python 0.0.186__tar.gz → 0.0.188__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 (143) hide show
  1. {velocity_python-0.0.186/src/velocity_python.egg-info → velocity_python-0.0.188}/PKG-INFO +1 -1
  2. {velocity_python-0.0.186 → velocity_python-0.0.188}/pyproject.toml +1 -1
  3. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/__init__.py +1 -1
  4. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/aws/handlers/mixins/__init__.py +2 -2
  5. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/aws/handlers/mixins/data_service.py +13 -144
  6. {velocity_python-0.0.186 → velocity_python-0.0.188/src/velocity_python.egg-info}/PKG-INFO +1 -1
  7. {velocity_python-0.0.186 → velocity_python-0.0.188}/LICENSE +0 -0
  8. {velocity_python-0.0.186 → velocity_python-0.0.188}/README.md +0 -0
  9. {velocity_python-0.0.186 → velocity_python-0.0.188}/setup.cfg +0 -0
  10. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/app/__init__.py +0 -0
  11. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/app/invoices.py +0 -0
  12. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/app/orders.py +0 -0
  13. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/app/payments.py +0 -0
  14. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/app/purchase_orders.py +0 -0
  15. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/app/tests/__init__.py +0 -0
  16. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/app/tests/test_email_processing.py +0 -0
  17. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/app/tests/test_payment_profile_sorting.py +0 -0
  18. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/app/tests/test_spreadsheet_functions.py +0 -0
  19. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/aws/__init__.py +0 -0
  20. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/aws/amplify.py +0 -0
  21. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/aws/handlers/__init__.py +0 -0
  22. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/aws/handlers/base_handler.py +0 -0
  23. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/aws/handlers/context.py +0 -0
  24. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/aws/handlers/exceptions.py +0 -0
  25. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/aws/handlers/lambda_handler.py +0 -0
  26. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/aws/handlers/mixins/web_handler.py +0 -0
  27. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/aws/handlers/response.py +0 -0
  28. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/aws/handlers/sqs_handler.py +0 -0
  29. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/aws/tests/__init__.py +0 -0
  30. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/aws/tests/test_lambda_handler_json_serialization.py +0 -0
  31. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/aws/tests/test_response.py +0 -0
  32. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/__init__.py +0 -0
  33. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/core/__init__.py +0 -0
  34. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/core/column.py +0 -0
  35. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/core/database.py +0 -0
  36. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/core/decorators.py +0 -0
  37. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/core/engine.py +0 -0
  38. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/core/result.py +0 -0
  39. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/core/row.py +0 -0
  40. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/core/sequence.py +0 -0
  41. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/core/table.py +0 -0
  42. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/core/transaction.py +0 -0
  43. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/exceptions.py +0 -0
  44. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/__init__.py +0 -0
  45. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/base/__init__.py +0 -0
  46. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/base/initializer.py +0 -0
  47. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/base/operators.py +0 -0
  48. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/base/sql.py +0 -0
  49. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/base/types.py +0 -0
  50. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/mysql/__init__.py +0 -0
  51. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/mysql/operators.py +0 -0
  52. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/mysql/reserved.py +0 -0
  53. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/mysql/sql.py +0 -0
  54. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/mysql/types.py +0 -0
  55. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/postgres/__init__.py +0 -0
  56. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/postgres/operators.py +0 -0
  57. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/postgres/reserved.py +0 -0
  58. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/postgres/sql.py +0 -0
  59. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/postgres/types.py +0 -0
  60. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/sqlite/__init__.py +0 -0
  61. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/sqlite/operators.py +0 -0
  62. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/sqlite/reserved.py +0 -0
  63. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/sqlite/sql.py +0 -0
  64. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/sqlite/types.py +0 -0
  65. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/sqlserver/__init__.py +0 -0
  66. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/sqlserver/operators.py +0 -0
  67. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/sqlserver/reserved.py +0 -0
  68. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/sqlserver/sql.py +0 -0
  69. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/sqlserver/types.py +0 -0
  70. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/tablehelper.py +0 -0
  71. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/__init__.py +0 -0
  72. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/common_db_test.py +0 -0
  73. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/postgres/__init__.py +0 -0
  74. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/postgres/common.py +0 -0
  75. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/postgres/test_column.py +0 -0
  76. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/postgres/test_connections.py +0 -0
  77. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/postgres/test_database.py +0 -0
  78. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/postgres/test_engine.py +0 -0
  79. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/postgres/test_general_usage.py +0 -0
  80. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/postgres/test_imports.py +0 -0
  81. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/postgres/test_result.py +0 -0
  82. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/postgres/test_row.py +0 -0
  83. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/postgres/test_row_comprehensive.py +0 -0
  84. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/postgres/test_schema_locking.py +0 -0
  85. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/postgres/test_schema_locking_unit.py +0 -0
  86. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/postgres/test_sequence.py +0 -0
  87. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/postgres/test_sql_comprehensive.py +0 -0
  88. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/postgres/test_table.py +0 -0
  89. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/postgres/test_table_comprehensive.py +0 -0
  90. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/postgres/test_transaction.py +0 -0
  91. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/sql/__init__.py +0 -0
  92. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/sql/common.py +0 -0
  93. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/sql/test_postgres_select_advanced.py +0 -0
  94. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/sql/test_postgres_select_variances.py +0 -0
  95. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/test_cursor_rowcount_fix.py +0 -0
  96. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/test_db_utils.py +0 -0
  97. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/test_postgres.py +0 -0
  98. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/test_postgres_unchanged.py +0 -0
  99. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/test_process_error_robustness.py +0 -0
  100. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/test_result_caching.py +0 -0
  101. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/test_result_sql_aware.py +0 -0
  102. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/test_row_get_missing_column.py +0 -0
  103. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/test_schema_locking_initializers.py +0 -0
  104. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/test_schema_locking_simple.py +0 -0
  105. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/test_sql_builder.py +0 -0
  106. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/test_tablehelper.py +0 -0
  107. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/utils.py +0 -0
  108. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/logging.py +0 -0
  109. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/misc/__init__.py +0 -0
  110. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/misc/conv/__init__.py +0 -0
  111. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/misc/conv/iconv.py +0 -0
  112. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/misc/conv/oconv.py +0 -0
  113. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/misc/db.py +0 -0
  114. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/misc/export.py +0 -0
  115. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/misc/format.py +0 -0
  116. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/misc/mail.py +0 -0
  117. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/misc/merge.py +0 -0
  118. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/misc/tests/__init__.py +0 -0
  119. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/misc/tests/test_db.py +0 -0
  120. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/misc/tests/test_fix.py +0 -0
  121. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/misc/tests/test_format.py +0 -0
  122. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/misc/tests/test_iconv.py +0 -0
  123. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/misc/tests/test_merge.py +0 -0
  124. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/misc/tests/test_oconv.py +0 -0
  125. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/misc/tests/test_original_error.py +0 -0
  126. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/misc/tests/test_timer.py +0 -0
  127. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/misc/timer.py +0 -0
  128. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/misc/tools.py +0 -0
  129. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/payment/__init__.py +0 -0
  130. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/payment/base_adapter.py +0 -0
  131. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/payment/braintree_adapter.py +0 -0
  132. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/payment/router.py +0 -0
  133. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/payment/stripe_adapter.py +0 -0
  134. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity_python.egg-info/SOURCES.txt +0 -0
  135. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity_python.egg-info/dependency_links.txt +0 -0
  136. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity_python.egg-info/requires.txt +0 -0
  137. {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity_python.egg-info/top_level.txt +0 -0
  138. {velocity_python-0.0.186 → velocity_python-0.0.188}/tests/test_decorators.py +0 -0
  139. {velocity_python-0.0.186 → velocity_python-0.0.188}/tests/test_lambda_handler.py +0 -0
  140. {velocity_python-0.0.186 → velocity_python-0.0.188}/tests/test_mixins_import.py +0 -0
  141. {velocity_python-0.0.186 → velocity_python-0.0.188}/tests/test_sys_modified_count_postgres_demo.py +0 -0
  142. {velocity_python-0.0.186 → velocity_python-0.0.188}/tests/test_table_alter.py +0 -0
  143. {velocity_python-0.0.186 → velocity_python-0.0.188}/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.0.186
3
+ Version: 0.0.188
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.0.186"
7
+ version = "0.0.188"
8
8
  authors = [
9
9
  { name="Velocity Team", email="info@codeclubs.org" },
10
10
  ]
@@ -1,4 +1,4 @@
1
- __version__ = version = "0.0.186"
1
+ __version__ = version = "0.0.188"
2
2
 
3
3
  from . import aws
4
4
  from . import db
@@ -8,6 +8,6 @@ This package provides mixins for common Lambda handler patterns:
8
8
  """
9
9
 
10
10
  from .web_handler import WebHandler, ButtonHandler
11
- from .data_service import DataServiceMixin, RWXHookSystem, apply_sys_modified_by
11
+ from .data_service import DataServiceMixin
12
12
 
13
- __all__ = ['WebHandler', 'ButtonHandler', 'DataServiceMixin', 'RWXHookSystem', 'apply_sys_modified_by']
13
+ __all__ = ['WebHandler', 'ButtonHandler', 'DataServiceMixin',]
@@ -87,15 +87,15 @@ class DataServiceMixin:
87
87
  raise Exception("An object id was not provided for read operation")
88
88
  if sys_id == "@new":
89
89
  row = {}
90
- self._call_rwx_hook("on_new", "common", tx, "common", row, context)
90
+ self._call_rwx_hook("on_new", "common", tx, table, row, context)
91
91
  self._call_rwx_hook("on_new", table, tx, table, row, context)
92
92
  return row
93
93
  sys_id = int(sys_id)
94
- self._call_rwx_hook("before_read", "common", tx, "common", sys_id, context)
94
+ self._call_rwx_hook("before_read", "common", tx, table, sys_id, context)
95
95
  self._call_rwx_hook("before_read", table, tx, table, sys_id, context)
96
96
  row = tx.table(table).find(sys_id)
97
97
  row = row.to_dict() if row else {}
98
- self._call_rwx_hook("after_read", "common", tx, "common", sys_id, row, context)
98
+ self._call_rwx_hook("after_read", "common", tx, table, sys_id, row, context)
99
99
  self._call_rwx_hook("after_read", table, tx, table, sys_id, row, context)
100
100
  return row
101
101
 
@@ -103,10 +103,10 @@ class DataServiceMixin:
103
103
  row = {}
104
104
  if not where:
105
105
  raise Exception("An query predicate was not provided for this read operation")
106
- self._call_rwx_hook("before_find", "common", tx, "common", where, context)
106
+ self._call_rwx_hook("before_find", "common", tx, table, where, context)
107
107
  self._call_rwx_hook("before_find", table, tx, table, where, context)
108
108
  row = tx.table(table).find(where)
109
- self._call_rwx_hook("after_find", "common", tx, "common", where, row, context)
109
+ self._call_rwx_hook("after_find", "common", tx, table, where, row, context)
110
110
  self._call_rwx_hook("after_find", table, tx, table, where, row, context)
111
111
  if row:
112
112
  row = row.to_dict()
@@ -116,28 +116,28 @@ class DataServiceMixin:
116
116
  row = {}
117
117
  incoming.pop("sys_id", None)
118
118
  if sys_id == "@new":
119
- self._call_rwx_hook("before_new", "common", tx, "common", sys_id, incoming, context)
119
+ self._call_rwx_hook("before_new", "common", tx, table, sys_id, incoming, context)
120
120
  self._call_rwx_hook("before_new", table, tx, table, sys_id, incoming, context)
121
121
  row = tx.table(table).new()
122
122
  sys_id = row["sys_id"]
123
- self._call_rwx_hook("after_new", "common", tx, "common", sys_id, row, context)
123
+ self._call_rwx_hook("after_new", "common", tx, table, sys_id, row, context)
124
124
  self._call_rwx_hook("after_new", table, tx, table, sys_id, row, context)
125
125
  elif sys_id:
126
126
  sys_id = int(sys_id)
127
127
  else:
128
128
  raise Exception("Object sys_id was not supplied on write operation.")
129
- self._call_rwx_hook("before_write", "common", tx, "common", sys_id, incoming, context)
129
+ self._call_rwx_hook("before_write", "common", tx, table, sys_id, incoming, context)
130
130
  self._call_rwx_hook("before_write", table, tx, table, sys_id, incoming, context)
131
131
  if not row:
132
132
  row = tx.table(table).get(sys_id)
133
133
  row.update(incoming)
134
- self._call_rwx_hook("after_write", "common", tx, "common", sys_id, row, context)
134
+ self._call_rwx_hook("after_write", "common", tx, table, sys_id, row, context)
135
135
  self._call_rwx_hook("after_write", table, tx, table, sys_id, row, context)
136
136
 
137
137
  return row.to_dict()
138
138
 
139
139
  def query_hook(self, tx, table, payload, context):
140
- self._call_rwx_hook("before_query", "common", tx, "common", payload, context)
140
+ self._call_rwx_hook("before_query", "common", tx, table, payload, context)
141
141
  self._call_rwx_hook("before_query", table, tx, table, payload, context)
142
142
  params = payload.get("params", {})
143
143
  result = tx.table(payload["obj"]).select(**params)
@@ -168,19 +168,19 @@ class DataServiceMixin:
168
168
  }
169
169
  for x in result.columns.values()
170
170
  ]
171
- self._call_rwx_hook("after_query", "common", tx, "common", data, payload, context)
171
+ self._call_rwx_hook("after_query", "common", tx, table, data, payload, context)
172
172
  self._call_rwx_hook("after_query", table, tx, table, data, payload, context)
173
173
  return data
174
174
 
175
175
  def delete_hook(self, tx, table, sys_id, context):
176
176
  if sys_id:
177
177
  sys_id = int(sys_id)
178
- self._call_rwx_hook("before_delete", "common", tx, "common", sys_id, context)
178
+ self._call_rwx_hook("before_delete", "common", tx, table, sys_id, context)
179
179
  self._call_rwx_hook("before_delete", table, tx, table, sys_id, context)
180
180
  row = tx.table(table).find(sys_id)
181
181
  if row:
182
182
  row.clear()
183
- self._call_rwx_hook("after_delete", "common", tx, "common", sys_id, context)
183
+ self._call_rwx_hook("after_delete", "common", tx, table, sys_id, context)
184
184
  self._call_rwx_hook("after_delete", table, tx, table, sys_id, context)
185
185
 
186
186
 
@@ -532,134 +532,3 @@ class DataServiceMixin:
532
532
  )
533
533
  raise Exception(f"Failed to retrieve table schema: {str(e)}")
534
534
 
535
-
536
- class RWXHookSystem:
537
- """
538
- RWX (Read/Write/eXecute) hook system for table-specific business logic.
539
-
540
- This system allows you to create table-specific hook modules in an 'rwx' package
541
- and have them automatically called during CRUD operations. This is useful for
542
- adding custom business logic (validation, permissions, data enrichment) for
543
- specific tables without modifying the generic DataServiceMixin.
544
-
545
- How it works:
546
- 1. Create a Python package called 'rwx' in your Lambda handler
547
- 2. For each table that needs custom logic, create a module (e.g., rwx/admin_users.py)
548
- 3. Define hook functions in the module (before_read, after_write, before_delete, etc.)
549
- 4. Subclass RWXHookSystem and set hook_module_name = 'rwx'
550
- 5. Use it from your handler class
551
-
552
- Example structure:
553
- src/
554
- index.py
555
- rwx/
556
- __init__.py
557
- admin_users.py # hooks for admin_users table
558
- donors.py # hooks for donors table
559
-
560
- Example hook in rwx/admin_users.py:
561
- def before_write(tx, table, sys_id, incoming, context):
562
- # Validate incoming data
563
- if not incoming.get('email_address'):
564
- raise ValueError("Email is required")
565
- # Modify data
566
- incoming['description'] = f"{incoming['full_name']} ({incoming['email_address']})"
567
-
568
- def after_read(tx, table, sys_id, row, context):
569
- # Enrich response data
570
- context.response().set_body({'extra_data': 'value'})
571
-
572
- Hook signatures:
573
- - on_new(tx, table, row, context) - When creating new empty object
574
- - before_read(tx, table, sys_id, context) - Before reading an object
575
- - after_read(tx, table, sys_id, row, context) - After reading an object
576
- - before_find(tx, table, query, context) - Before finding by query
577
- - after_find(tx, table, query, row, context) - After finding by query
578
- - before_new(tx, table, sys_id, incoming, context) - Before creating new object
579
- - after_new(tx, table, sys_id, row, context) - After creating new object
580
- - before_write(tx, table, sys_id, incoming, context) - Before write (insert/update)
581
- - after_write(tx, table, sys_id, row, context) - After write (insert/update)
582
- - before_delete(tx, table, sys_id, context) - Before deleting an object
583
- - after_delete(tx, table, sys_id, context) - After deleting an object
584
- - before_query(tx, table, payload, context) - Before querying objects
585
- - after_query(tx, table, data, payload, context) - After querying objects
586
-
587
- Usage in a Lambda handler:
588
- from velocity.aws.handlers.mixins import DataServiceMixin, RWXHookSystem
589
-
590
- class MyRWXSystem(RWXHookSystem):
591
- hook_module_name = 'rwx' # Name of your rwx package
592
-
593
- @engine.transaction
594
- class HttpEventHandler(DataServiceMixin, LambdaHandler):
595
- def __init__(self, aws_event, aws_context):
596
- super().__init__(aws_event, aws_context)
597
- """
598
-
599
- hook_module_name = None # Override in subclass (e.g., 'rwx')
600
-
601
- @classmethod
602
- def _get_table_module(cls, table):
603
- """Load table-specific hook module if it exists"""
604
- if not cls.hook_module_name:
605
- return None
606
- try:
607
- return importlib.import_module(f".{table}", cls.hook_module_name)
608
- except ImportError:
609
- return None
610
-
611
- @classmethod
612
- def _call_hook(cls, hook_name, table, *args, **kwargs):
613
- """Call a hook on table-specific module if it exists"""
614
- module = cls._get_table_module(table)
615
- if module and hasattr(module, hook_name):
616
- return getattr(module, hook_name)(*args, **kwargs)
617
- return None
618
-
619
-
620
- def apply_sys_modified_by(incoming, context):
621
- """
622
- Strip sys_* fields and set sys_modified_by from context.
623
-
624
- Common pattern for applications that track who modified records.
625
- Call this from your write_hook implementation.
626
-
627
- Args:
628
- incoming: Dictionary of data being written
629
- context: Request context with session/payload
630
- """
631
- payload = context.payload()
632
-
633
- # Strip system fields from incoming data
634
- for key in list(incoming.keys()):
635
- if "sys_" in key:
636
- incoming.pop(key)
637
-
638
- # Extract email from session
639
- session = context.session() if hasattr(context, "session") else None
640
- email_address = None
641
-
642
- if isinstance(session, dict):
643
- email_address = session.get("cognito_user_email")
644
- if not email_address:
645
- cognito_user = session.get("cognito_user")
646
- if isinstance(cognito_user, dict):
647
- email_address = cognito_user.get("email") or (
648
- cognito_user.get("attributes") or {}
649
- ).get("email")
650
- if not email_address:
651
- email_address = session.get("email_address")
652
-
653
- if not email_address and isinstance(payload, dict):
654
- payload_user = payload.get("cognito_user")
655
- if isinstance(payload_user, dict):
656
- email_address = payload_user.get("email") or (
657
- payload_user.get("attributes") or {}
658
- ).get("email")
659
-
660
- incoming["sys_modified_by"] = (
661
- email_address.lower()
662
- if isinstance(email_address, str)
663
- else incoming.get("sys_modified_by", "unknown")
664
- )
665
- incoming["sys_dirty"] = True
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: velocity-python
3
- Version: 0.0.186
3
+ Version: 0.0.188
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