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.
- {velocity_python-0.0.186/src/velocity_python.egg-info → velocity_python-0.0.188}/PKG-INFO +1 -1
- {velocity_python-0.0.186 → velocity_python-0.0.188}/pyproject.toml +1 -1
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/__init__.py +1 -1
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/aws/handlers/mixins/__init__.py +2 -2
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/aws/handlers/mixins/data_service.py +13 -144
- {velocity_python-0.0.186 → velocity_python-0.0.188/src/velocity_python.egg-info}/PKG-INFO +1 -1
- {velocity_python-0.0.186 → velocity_python-0.0.188}/LICENSE +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/README.md +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/setup.cfg +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/app/__init__.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/app/invoices.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/app/orders.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/app/payments.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/app/purchase_orders.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/app/tests/__init__.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/app/tests/test_email_processing.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/app/tests/test_payment_profile_sorting.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/app/tests/test_spreadsheet_functions.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/aws/__init__.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/aws/amplify.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/aws/handlers/__init__.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/aws/handlers/base_handler.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/aws/handlers/context.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/aws/handlers/exceptions.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/aws/handlers/lambda_handler.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/aws/handlers/mixins/web_handler.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/aws/handlers/response.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/aws/handlers/sqs_handler.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/aws/tests/__init__.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/aws/tests/test_lambda_handler_json_serialization.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/aws/tests/test_response.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/__init__.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/core/__init__.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/core/column.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/core/database.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/core/decorators.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/core/engine.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/core/result.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/core/row.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/core/sequence.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/core/table.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/core/transaction.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/exceptions.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/__init__.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/base/__init__.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/base/initializer.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/base/operators.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/base/sql.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/base/types.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/mysql/__init__.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/mysql/operators.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/mysql/reserved.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/mysql/sql.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/mysql/types.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/postgres/__init__.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/postgres/operators.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/postgres/reserved.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/postgres/sql.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/postgres/types.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/sqlite/__init__.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/sqlite/operators.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/sqlite/reserved.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/sqlite/sql.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/sqlite/types.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/sqlserver/__init__.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/sqlserver/operators.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/sqlserver/reserved.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/sqlserver/sql.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/sqlserver/types.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/tablehelper.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/__init__.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/common_db_test.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/postgres/__init__.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/postgres/common.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/postgres/test_column.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/postgres/test_connections.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/postgres/test_database.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/postgres/test_engine.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/postgres/test_general_usage.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/postgres/test_imports.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/postgres/test_result.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/postgres/test_row.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/postgres/test_row_comprehensive.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/postgres/test_schema_locking.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/postgres/test_schema_locking_unit.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/postgres/test_sequence.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/postgres/test_sql_comprehensive.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/postgres/test_table.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/postgres/test_table_comprehensive.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/postgres/test_transaction.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/sql/__init__.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/sql/common.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/sql/test_postgres_select_advanced.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/sql/test_postgres_select_variances.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/test_cursor_rowcount_fix.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/test_db_utils.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/test_postgres.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/test_postgres_unchanged.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/test_process_error_robustness.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/test_result_caching.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/test_result_sql_aware.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/test_row_get_missing_column.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/test_schema_locking_initializers.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/test_schema_locking_simple.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/test_sql_builder.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/test_tablehelper.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/utils.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/logging.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/misc/__init__.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/misc/conv/__init__.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/misc/conv/iconv.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/misc/conv/oconv.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/misc/db.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/misc/export.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/misc/format.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/misc/mail.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/misc/merge.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/misc/tests/__init__.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/misc/tests/test_db.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/misc/tests/test_fix.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/misc/tests/test_format.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/misc/tests/test_iconv.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/misc/tests/test_merge.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/misc/tests/test_oconv.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/misc/tests/test_original_error.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/misc/tests/test_timer.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/misc/timer.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/misc/tools.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/payment/__init__.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/payment/base_adapter.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/payment/braintree_adapter.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/payment/router.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/payment/stripe_adapter.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity_python.egg-info/SOURCES.txt +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity_python.egg-info/dependency_links.txt +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity_python.egg-info/requires.txt +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity_python.egg-info/top_level.txt +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/tests/test_decorators.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/tests/test_lambda_handler.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/tests/test_mixins_import.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/tests/test_sys_modified_count_postgres_demo.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/tests/test_table_alter.py +0 -0
- {velocity_python-0.0.186 → velocity_python-0.0.188}/tests/test_where_clause_validation.py +0 -0
{velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/aws/handlers/mixins/__init__.py
RENAMED
|
@@ -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
|
|
11
|
+
from .data_service import DataServiceMixin
|
|
12
12
|
|
|
13
|
-
__all__ = ['WebHandler', 'ButtonHandler', 'DataServiceMixin',
|
|
13
|
+
__all__ = ['WebHandler', 'ButtonHandler', 'DataServiceMixin',]
|
{velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/aws/handlers/mixins/data_service.py
RENAMED
|
@@ -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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/app/tests/test_email_processing.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/aws/handlers/base_handler.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/aws/handlers/lambda_handler.py
RENAMED
|
File without changes
|
{velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/aws/handlers/mixins/web_handler.py
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/aws/handlers/sqs_handler.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/base/__init__.py
RENAMED
|
File without changes
|
{velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/base/initializer.py
RENAMED
|
File without changes
|
{velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/base/operators.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/mysql/__init__.py
RENAMED
|
File without changes
|
{velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/mysql/operators.py
RENAMED
|
File without changes
|
{velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/mysql/reserved.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/postgres/__init__.py
RENAMED
|
File without changes
|
{velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/postgres/operators.py
RENAMED
|
File without changes
|
{velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/postgres/reserved.py
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/postgres/types.py
RENAMED
|
File without changes
|
{velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/sqlite/__init__.py
RENAMED
|
File without changes
|
{velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/sqlite/operators.py
RENAMED
|
File without changes
|
{velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/sqlite/reserved.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/sqlserver/__init__.py
RENAMED
|
File without changes
|
{velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/sqlserver/operators.py
RENAMED
|
File without changes
|
{velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/sqlserver/reserved.py
RENAMED
|
File without changes
|
{velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/sqlserver/sql.py
RENAMED
|
File without changes
|
{velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/servers/sqlserver/types.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/postgres/__init__.py
RENAMED
|
File without changes
|
{velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/postgres/common.py
RENAMED
|
File without changes
|
{velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/postgres/test_column.py
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/postgres/test_database.py
RENAMED
|
File without changes
|
{velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/postgres/test_engine.py
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/postgres/test_imports.py
RENAMED
|
File without changes
|
{velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/postgres/test_result.py
RENAMED
|
File without changes
|
{velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/postgres/test_row.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/postgres/test_sequence.py
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/postgres/test_table.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/test_postgres_unchanged.py
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/test_result_caching.py
RENAMED
|
File without changes
|
{velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/test_result_sql_aware.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/test_sql_builder.py
RENAMED
|
File without changes
|
{velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/db/tests/test_tablehelper.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/misc/tests/test_original_error.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity/payment/braintree_adapter.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity_python.egg-info/SOURCES.txt
RENAMED
|
File without changes
|
|
File without changes
|
{velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity_python.egg-info/requires.txt
RENAMED
|
File without changes
|
{velocity_python-0.0.186 → velocity_python-0.0.188}/src/velocity_python.egg-info/top_level.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{velocity_python-0.0.186 → velocity_python-0.0.188}/tests/test_sys_modified_count_postgres_demo.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|