velocity-python 0.0.188__tar.gz → 0.0.190__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.188/src/velocity_python.egg-info → velocity_python-0.0.190}/PKG-INFO +1 -1
  2. {velocity_python-0.0.188 → velocity_python-0.0.190}/pyproject.toml +1 -1
  3. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/__init__.py +1 -1
  4. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/aws/handlers/context.py +15 -4
  5. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/aws/handlers/lambda_handler.py +0 -19
  6. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/aws/handlers/mixins/data_service.py +27 -7
  7. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/aws/handlers/mixins/web_handler.py +13 -7
  8. {velocity_python-0.0.188 → velocity_python-0.0.190/src/velocity_python.egg-info}/PKG-INFO +1 -1
  9. {velocity_python-0.0.188 → velocity_python-0.0.190}/LICENSE +0 -0
  10. {velocity_python-0.0.188 → velocity_python-0.0.190}/README.md +0 -0
  11. {velocity_python-0.0.188 → velocity_python-0.0.190}/setup.cfg +0 -0
  12. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/app/__init__.py +0 -0
  13. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/app/invoices.py +0 -0
  14. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/app/orders.py +0 -0
  15. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/app/payments.py +0 -0
  16. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/app/purchase_orders.py +0 -0
  17. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/app/tests/__init__.py +0 -0
  18. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/app/tests/test_email_processing.py +0 -0
  19. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/app/tests/test_payment_profile_sorting.py +0 -0
  20. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/app/tests/test_spreadsheet_functions.py +0 -0
  21. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/aws/__init__.py +0 -0
  22. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/aws/amplify.py +0 -0
  23. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/aws/handlers/__init__.py +0 -0
  24. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/aws/handlers/base_handler.py +0 -0
  25. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/aws/handlers/exceptions.py +0 -0
  26. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/aws/handlers/mixins/__init__.py +0 -0
  27. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/aws/handlers/response.py +0 -0
  28. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/aws/handlers/sqs_handler.py +0 -0
  29. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/aws/tests/__init__.py +0 -0
  30. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/aws/tests/test_lambda_handler_json_serialization.py +0 -0
  31. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/aws/tests/test_response.py +0 -0
  32. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/__init__.py +0 -0
  33. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/core/__init__.py +0 -0
  34. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/core/column.py +0 -0
  35. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/core/database.py +0 -0
  36. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/core/decorators.py +0 -0
  37. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/core/engine.py +0 -0
  38. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/core/result.py +0 -0
  39. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/core/row.py +0 -0
  40. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/core/sequence.py +0 -0
  41. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/core/table.py +0 -0
  42. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/core/transaction.py +0 -0
  43. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/exceptions.py +0 -0
  44. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/servers/__init__.py +0 -0
  45. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/servers/base/__init__.py +0 -0
  46. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/servers/base/initializer.py +0 -0
  47. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/servers/base/operators.py +0 -0
  48. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/servers/base/sql.py +0 -0
  49. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/servers/base/types.py +0 -0
  50. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/servers/mysql/__init__.py +0 -0
  51. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/servers/mysql/operators.py +0 -0
  52. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/servers/mysql/reserved.py +0 -0
  53. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/servers/mysql/sql.py +0 -0
  54. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/servers/mysql/types.py +0 -0
  55. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/servers/postgres/__init__.py +0 -0
  56. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/servers/postgres/operators.py +0 -0
  57. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/servers/postgres/reserved.py +0 -0
  58. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/servers/postgres/sql.py +0 -0
  59. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/servers/postgres/types.py +0 -0
  60. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/servers/sqlite/__init__.py +0 -0
  61. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/servers/sqlite/operators.py +0 -0
  62. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/servers/sqlite/reserved.py +0 -0
  63. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/servers/sqlite/sql.py +0 -0
  64. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/servers/sqlite/types.py +0 -0
  65. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/servers/sqlserver/__init__.py +0 -0
  66. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/servers/sqlserver/operators.py +0 -0
  67. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/servers/sqlserver/reserved.py +0 -0
  68. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/servers/sqlserver/sql.py +0 -0
  69. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/servers/sqlserver/types.py +0 -0
  70. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/servers/tablehelper.py +0 -0
  71. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/tests/__init__.py +0 -0
  72. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/tests/common_db_test.py +0 -0
  73. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/tests/postgres/__init__.py +0 -0
  74. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/tests/postgres/common.py +0 -0
  75. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/tests/postgres/test_column.py +0 -0
  76. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/tests/postgres/test_connections.py +0 -0
  77. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/tests/postgres/test_database.py +0 -0
  78. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/tests/postgres/test_engine.py +0 -0
  79. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/tests/postgres/test_general_usage.py +0 -0
  80. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/tests/postgres/test_imports.py +0 -0
  81. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/tests/postgres/test_result.py +0 -0
  82. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/tests/postgres/test_row.py +0 -0
  83. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/tests/postgres/test_row_comprehensive.py +0 -0
  84. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/tests/postgres/test_schema_locking.py +0 -0
  85. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/tests/postgres/test_schema_locking_unit.py +0 -0
  86. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/tests/postgres/test_sequence.py +0 -0
  87. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/tests/postgres/test_sql_comprehensive.py +0 -0
  88. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/tests/postgres/test_table.py +0 -0
  89. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/tests/postgres/test_table_comprehensive.py +0 -0
  90. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/tests/postgres/test_transaction.py +0 -0
  91. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/tests/sql/__init__.py +0 -0
  92. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/tests/sql/common.py +0 -0
  93. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/tests/sql/test_postgres_select_advanced.py +0 -0
  94. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/tests/sql/test_postgres_select_variances.py +0 -0
  95. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/tests/test_cursor_rowcount_fix.py +0 -0
  96. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/tests/test_db_utils.py +0 -0
  97. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/tests/test_postgres.py +0 -0
  98. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/tests/test_postgres_unchanged.py +0 -0
  99. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/tests/test_process_error_robustness.py +0 -0
  100. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/tests/test_result_caching.py +0 -0
  101. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/tests/test_result_sql_aware.py +0 -0
  102. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/tests/test_row_get_missing_column.py +0 -0
  103. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/tests/test_schema_locking_initializers.py +0 -0
  104. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/tests/test_schema_locking_simple.py +0 -0
  105. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/tests/test_sql_builder.py +0 -0
  106. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/tests/test_tablehelper.py +0 -0
  107. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/db/utils.py +0 -0
  108. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/logging.py +0 -0
  109. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/misc/__init__.py +0 -0
  110. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/misc/conv/__init__.py +0 -0
  111. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/misc/conv/iconv.py +0 -0
  112. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/misc/conv/oconv.py +0 -0
  113. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/misc/db.py +0 -0
  114. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/misc/export.py +0 -0
  115. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/misc/format.py +0 -0
  116. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/misc/mail.py +0 -0
  117. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/misc/merge.py +0 -0
  118. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/misc/tests/__init__.py +0 -0
  119. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/misc/tests/test_db.py +0 -0
  120. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/misc/tests/test_fix.py +0 -0
  121. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/misc/tests/test_format.py +0 -0
  122. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/misc/tests/test_iconv.py +0 -0
  123. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/misc/tests/test_merge.py +0 -0
  124. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/misc/tests/test_oconv.py +0 -0
  125. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/misc/tests/test_original_error.py +0 -0
  126. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/misc/tests/test_timer.py +0 -0
  127. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/misc/timer.py +0 -0
  128. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/misc/tools.py +0 -0
  129. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/payment/__init__.py +0 -0
  130. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/payment/base_adapter.py +0 -0
  131. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/payment/braintree_adapter.py +0 -0
  132. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/payment/router.py +0 -0
  133. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity/payment/stripe_adapter.py +0 -0
  134. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity_python.egg-info/SOURCES.txt +0 -0
  135. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity_python.egg-info/dependency_links.txt +0 -0
  136. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity_python.egg-info/requires.txt +0 -0
  137. {velocity_python-0.0.188 → velocity_python-0.0.190}/src/velocity_python.egg-info/top_level.txt +0 -0
  138. {velocity_python-0.0.188 → velocity_python-0.0.190}/tests/test_decorators.py +0 -0
  139. {velocity_python-0.0.188 → velocity_python-0.0.190}/tests/test_lambda_handler.py +0 -0
  140. {velocity_python-0.0.188 → velocity_python-0.0.190}/tests/test_mixins_import.py +0 -0
  141. {velocity_python-0.0.188 → velocity_python-0.0.190}/tests/test_sys_modified_count_postgres_demo.py +0 -0
  142. {velocity_python-0.0.188 → velocity_python-0.0.190}/tests/test_table_alter.py +0 -0
  143. {velocity_python-0.0.188 → velocity_python-0.0.190}/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.188
3
+ Version: 0.0.190
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.188"
7
+ version = "0.0.190"
8
8
  authors = [
9
9
  { name="Velocity Team", email="info@codeclubs.org" },
10
10
  ]
@@ -1,4 +1,4 @@
1
- __version__ = version = "0.0.188"
1
+ __version__ = version = "0.0.190"
2
2
 
3
3
  from . import aws
4
4
  from . import db
@@ -363,7 +363,7 @@ class Context:
363
363
  logger.error("Error getting layer information: %s", exc)
364
364
  return []
365
365
 
366
- def get_pass_through_vars(self, tx, current_user=None):
366
+ def get_pass_through_vars(self, tx):
367
367
  """Return environment and layer information for controls.vars."""
368
368
  vars = dict(
369
369
  [
@@ -380,14 +380,25 @@ class Context:
380
380
  ]
381
381
  )
382
382
 
383
+ temp = {"controls": {"vars": vars}}
384
+
385
+ # if current_user:
386
+ # temp["controls"]["current_user"] = current_user
387
+
388
+ return temp
389
+
390
+ def get_logged_in_email(self):
391
+ """Return the current user information from the session."""
392
+ return self.session().get("email_address")
393
+
394
+ def get_version_vars(self):
395
+ """Return environment and layer information for controls.vars."""
396
+
383
397
  vars["velocity"] = velocity.__version__
384
398
  vars["layers"] = self.get_current_lambda_layers()
385
399
 
386
400
  temp = {"controls": {"vars": vars}}
387
401
 
388
- if current_user:
389
- temp["controls"]["current_user"] = current_user
390
-
391
402
  return temp
392
403
 
393
404
  def _load_feature_flags(self, tx):
@@ -251,25 +251,6 @@ class LambdaHandler(BaseHandler):
251
251
  except:
252
252
  raise Exception("User Authentication Error [Cognito]")
253
253
 
254
- def get_pass_through_vars(self, tx, context):
255
- """Get pass-through variables: environment vars, layers, and user data"""
256
- temp = context.get_pass_through_vars(tx, self.current_user)
257
-
258
- logger.debug(
259
- "LAYER_DEBUG: vars object contains: %s",
260
- list(temp.get("controls", {}).get("vars", {}).keys()),
261
- )
262
- if "layers" in temp.get("controls", {}).get("vars", {}):
263
- logger.debug(
264
- "LAYER_DEBUG: layers value: %s",
265
- temp["controls"]["vars"]["layers"],
266
- )
267
-
268
- # Merge with user data from database
269
- temp = context.merge_user_data(tx, temp, self.session["email_address"])
270
-
271
- return temp
272
-
273
254
  def _summarize_postdata(self, postdata):
274
255
  """Extract key fields from postdata for logging without storing entire payload"""
275
256
  if not postdata:
@@ -8,10 +8,13 @@ that uses velocity.db for database access.
8
8
  import base64
9
9
  import datetime
10
10
  import importlib
11
+ import logging
11
12
  from io import BytesIO
12
13
 
13
14
  from velocity.misc import export
14
15
 
16
+ logger = logging.getLogger(__name__)
17
+
15
18
 
16
19
  class DataServiceMixin:
17
20
  """
@@ -71,6 +74,7 @@ class DataServiceMixin:
71
74
  *args: Arguments to pass to the hook
72
75
  **kwargs: Keyword arguments to pass to the hook
73
76
  """
77
+
74
78
  try:
75
79
  m = importlib.import_module(f".{table}", "rwx")
76
80
  if hasattr(m, hook_name):
@@ -275,10 +279,14 @@ class DataServiceMixin:
275
279
  if not any(value is not None for value in incoming.values()):
276
280
  raise ValueError("Parameter 'object' cannot contain only None values")
277
281
 
278
- print(
279
- f"WRITE_LOG: Writing to table {table_name} with sys_id {incoming.get('sys_id')}"
282
+ logger.debug(
283
+ "Writing to table",
284
+ extra={
285
+ "table_name": table_name,
286
+ "sys_id": incoming.get("sys_id"),
287
+ "object_keys": list(incoming.keys()),
288
+ },
280
289
  )
281
- print(f"WRITE_LOG: Object keys: {list(incoming.keys())}")
282
290
 
283
291
  try:
284
292
  row = self.write_hook(
@@ -290,7 +298,10 @@ class DataServiceMixin:
290
298
  )
291
299
 
292
300
  if not row:
293
- print(f"WARNING: self.write_hook returned empty row for table {table_name}")
301
+ logger.warning(
302
+ "write_hook returned empty row",
303
+ extra={"table_name": table_name},
304
+ )
294
305
  row = {}
295
306
 
296
307
  context.response().set_body(
@@ -299,11 +310,20 @@ class DataServiceMixin:
299
310
  "lastFetch": datetime.datetime.now(),
300
311
  }
301
312
  )
302
- print(f"WRITE_LOG: Successfully wrote to {table_name}")
313
+ logger.debug(
314
+ "Successfully wrote to table",
315
+ extra={"table_name": table_name},
316
+ )
303
317
 
304
318
  except Exception as e:
305
- print(f"ERROR in OnActionWriteObject: {e}")
306
- print(f"table_name={table_name}, incoming_keys={list(incoming.keys())}")
319
+ logger.error(
320
+ "Error in OnActionWriteObject",
321
+ extra={
322
+ "exception": str(e),
323
+ "table_name": table_name,
324
+ "incoming_keys": list(incoming.keys()),
325
+ },
326
+ )
307
327
  raise
308
328
  context.response().load_object(row)
309
329
 
@@ -9,6 +9,7 @@ onError implementations in handlers.
9
9
  import copy
10
10
  import importlib
11
11
  import json
12
+ import logging
12
13
  import os
13
14
  import pprint
14
15
  import time
@@ -18,6 +19,8 @@ from typing import Any, Dict, List
18
19
 
19
20
  from velocity.aws.handlers.exceptions import AlertError
20
21
 
22
+ logger = logging.getLogger(__name__)
23
+
21
24
  class WebHandler(ABC):
22
25
  """
23
26
  Mixin providing unified activity tracking plus standardized error handling.
@@ -72,9 +75,12 @@ class WebHandler(ABC):
72
75
  try:
73
76
  self.activity_log_key = tx.table("aws_api_activity").new(self.activity_data).pk
74
77
  except Exception as exc:
75
- context.log(
76
- f"WebHandler.track_activity_start failed: {exc}; keys={list(self.activity_data.keys())}",
77
- "WebHandler.track_activity_start",
78
+ logger.error(
79
+ "WebHandler.track_activity_start failed",
80
+ extra={
81
+ "exception": str(exc),
82
+ "activity_data_keys": list(self.activity_data.keys()),
83
+ },
78
84
  )
79
85
  raise
80
86
 
@@ -254,7 +260,7 @@ Request Details:
254
260
  html = html.replace("\n", "<br>").replace(" ", "&nbsp;")
255
261
  recipients = self._resolve_error_notification_recipients(tx, context)
256
262
  if not recipients:
257
- print("No error notification recipients configured; skipping notification.")
263
+ logger.debug("No error notification recipients configured; skipping notification.")
258
264
  return
259
265
 
260
266
  sender = self._resolve_error_notification_sender(tx, context)
@@ -271,7 +277,7 @@ Request Details:
271
277
  email_settings_id=1001,
272
278
  )
273
279
  except Exception as email_error: # pragma: no cover
274
- print(f"Failed to send error notification email: {email_error}")
280
+ logger.error("Failed to send error notification email", extra={"error": str(email_error)})
275
281
 
276
282
  def _resolve_error_notification_recipients(self, tx, context) -> List[str]:
277
283
  recipients: List[str] = []
@@ -280,7 +286,7 @@ Request Details:
280
286
  try:
281
287
  recipients = context_method(tx) or []
282
288
  except Exception as exc:
283
- print(f"Failed to load recipients from context: {exc}")
289
+ logger.warning("Failed to load recipients from context", extra={"error": str(exc)})
284
290
  if recipients:
285
291
  return recipients
286
292
  return self._get_error_notification_recipients()
@@ -292,7 +298,7 @@ Request Details:
292
298
  try:
293
299
  sender = context_method(tx)
294
300
  except Exception as exc:
295
- print(f"Failed to load sender from context: {exc}")
301
+ logger.warning("Failed to load sender from context", extra={"error": str(exc)})
296
302
  if sender:
297
303
  return sender
298
304
  return self._get_error_notification_sender()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: velocity-python
3
- Version: 0.0.188
3
+ Version: 0.0.190
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