velocity-python 0.0.138__tar.gz → 0.0.140__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.

Potentially problematic release.


This version of velocity-python might be problematic. Click here for more details.

Files changed (134) hide show
  1. {velocity_python-0.0.138 → velocity_python-0.0.140}/PKG-INFO +1 -1
  2. {velocity_python-0.0.138 → velocity_python-0.0.140}/pyproject.toml +1 -1
  3. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/__init__.py +1 -1
  4. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/aws/handlers/mixins/activity_tracker.py +53 -14
  5. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity_python.egg-info/PKG-INFO +1 -1
  6. {velocity_python-0.0.138 → velocity_python-0.0.140}/LICENSE +0 -0
  7. {velocity_python-0.0.138 → velocity_python-0.0.140}/README.md +0 -0
  8. {velocity_python-0.0.138 → velocity_python-0.0.140}/setup.cfg +0 -0
  9. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/app/__init__.py +0 -0
  10. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/app/invoices.py +0 -0
  11. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/app/orders.py +0 -0
  12. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/app/payments.py +0 -0
  13. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/app/purchase_orders.py +0 -0
  14. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/app/tests/__init__.py +0 -0
  15. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/app/tests/test_email_processing.py +0 -0
  16. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/app/tests/test_payment_profile_sorting.py +0 -0
  17. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/app/tests/test_spreadsheet_functions.py +0 -0
  18. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/aws/__init__.py +0 -0
  19. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/aws/amplify.py +0 -0
  20. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/aws/handlers/__init__.py +0 -0
  21. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/aws/handlers/base_handler.py +0 -0
  22. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/aws/handlers/context.py +0 -0
  23. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/aws/handlers/exceptions.py +0 -0
  24. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/aws/handlers/lambda_handler.py +0 -0
  25. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/aws/handlers/mixins/__init__.py +0 -0
  26. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/aws/handlers/mixins/error_handler.py +0 -0
  27. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/aws/handlers/mixins/legacy_mixin.py +0 -0
  28. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/aws/handlers/mixins/standard_mixin.py +0 -0
  29. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/aws/handlers/response.py +0 -0
  30. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/aws/handlers/sqs_handler.py +0 -0
  31. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/aws/tests/__init__.py +0 -0
  32. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/aws/tests/test_lambda_handler_json_serialization.py +0 -0
  33. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/aws/tests/test_response.py +0 -0
  34. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/__init__.py +0 -0
  35. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/core/__init__.py +0 -0
  36. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/core/column.py +0 -0
  37. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/core/database.py +0 -0
  38. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/core/decorators.py +0 -0
  39. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/core/engine.py +0 -0
  40. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/core/result.py +0 -0
  41. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/core/row.py +0 -0
  42. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/core/sequence.py +0 -0
  43. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/core/table.py +0 -0
  44. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/core/transaction.py +0 -0
  45. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/exceptions.py +0 -0
  46. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/servers/__init__.py +0 -0
  47. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/servers/base/__init__.py +0 -0
  48. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/servers/base/initializer.py +0 -0
  49. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/servers/base/operators.py +0 -0
  50. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/servers/base/sql.py +0 -0
  51. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/servers/base/types.py +0 -0
  52. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/servers/mysql/__init__.py +0 -0
  53. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/servers/mysql/operators.py +0 -0
  54. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/servers/mysql/reserved.py +0 -0
  55. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/servers/mysql/sql.py +0 -0
  56. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/servers/mysql/types.py +0 -0
  57. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/servers/postgres/__init__.py +0 -0
  58. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/servers/postgres/operators.py +0 -0
  59. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/servers/postgres/reserved.py +0 -0
  60. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/servers/postgres/sql.py +0 -0
  61. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/servers/postgres/types.py +0 -0
  62. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/servers/sqlite/__init__.py +0 -0
  63. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/servers/sqlite/operators.py +0 -0
  64. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/servers/sqlite/reserved.py +0 -0
  65. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/servers/sqlite/sql.py +0 -0
  66. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/servers/sqlite/types.py +0 -0
  67. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/servers/sqlserver/__init__.py +0 -0
  68. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/servers/sqlserver/operators.py +0 -0
  69. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/servers/sqlserver/reserved.py +0 -0
  70. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/servers/sqlserver/sql.py +0 -0
  71. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/servers/sqlserver/types.py +0 -0
  72. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/servers/tablehelper.py +0 -0
  73. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/tests/__init__.py +0 -0
  74. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/tests/common_db_test.py +0 -0
  75. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/tests/postgres/__init__.py +0 -0
  76. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/tests/postgres/common.py +0 -0
  77. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/tests/postgres/test_column.py +0 -0
  78. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/tests/postgres/test_connections.py +0 -0
  79. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/tests/postgres/test_database.py +0 -0
  80. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/tests/postgres/test_engine.py +0 -0
  81. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/tests/postgres/test_general_usage.py +0 -0
  82. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/tests/postgres/test_imports.py +0 -0
  83. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/tests/postgres/test_result.py +0 -0
  84. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/tests/postgres/test_row.py +0 -0
  85. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/tests/postgres/test_row_comprehensive.py +0 -0
  86. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/tests/postgres/test_schema_locking.py +0 -0
  87. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/tests/postgres/test_schema_locking_unit.py +0 -0
  88. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/tests/postgres/test_sequence.py +0 -0
  89. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/tests/postgres/test_sql_comprehensive.py +0 -0
  90. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/tests/postgres/test_table.py +0 -0
  91. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/tests/postgres/test_table_comprehensive.py +0 -0
  92. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/tests/postgres/test_transaction.py +0 -0
  93. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/tests/sql/__init__.py +0 -0
  94. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/tests/sql/common.py +0 -0
  95. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/tests/sql/test_postgres_select_advanced.py +0 -0
  96. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/tests/sql/test_postgres_select_variances.py +0 -0
  97. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/tests/test_cursor_rowcount_fix.py +0 -0
  98. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/tests/test_db_utils.py +0 -0
  99. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/tests/test_postgres.py +0 -0
  100. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/tests/test_postgres_unchanged.py +0 -0
  101. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/tests/test_process_error_robustness.py +0 -0
  102. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/tests/test_result_caching.py +0 -0
  103. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/tests/test_result_sql_aware.py +0 -0
  104. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/tests/test_row_get_missing_column.py +0 -0
  105. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/tests/test_schema_locking_initializers.py +0 -0
  106. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/tests/test_schema_locking_simple.py +0 -0
  107. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/tests/test_sql_builder.py +0 -0
  108. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/tests/test_tablehelper.py +0 -0
  109. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/db/utils.py +0 -0
  110. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/misc/__init__.py +0 -0
  111. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/misc/conv/__init__.py +0 -0
  112. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/misc/conv/iconv.py +0 -0
  113. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/misc/conv/oconv.py +0 -0
  114. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/misc/db.py +0 -0
  115. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/misc/export.py +0 -0
  116. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/misc/format.py +0 -0
  117. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/misc/mail.py +0 -0
  118. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/misc/merge.py +0 -0
  119. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/misc/tests/__init__.py +0 -0
  120. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/misc/tests/test_db.py +0 -0
  121. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/misc/tests/test_fix.py +0 -0
  122. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/misc/tests/test_format.py +0 -0
  123. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/misc/tests/test_iconv.py +0 -0
  124. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/misc/tests/test_merge.py +0 -0
  125. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/misc/tests/test_oconv.py +0 -0
  126. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/misc/tests/test_original_error.py +0 -0
  127. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/misc/tests/test_timer.py +0 -0
  128. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/misc/timer.py +0 -0
  129. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity/misc/tools.py +0 -0
  130. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity_python.egg-info/SOURCES.txt +0 -0
  131. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity_python.egg-info/dependency_links.txt +0 -0
  132. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity_python.egg-info/requires.txt +0 -0
  133. {velocity_python-0.0.138 → velocity_python-0.0.140}/src/velocity_python.egg-info/top_level.txt +0 -0
  134. {velocity_python-0.0.138 → velocity_python-0.0.140}/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.138
3
+ Version: 0.0.140
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.138"
7
+ version = "0.0.140"
8
8
  authors = [
9
9
  { name="Velocity Team", email="info@codeclubs.org" },
10
10
  ]
@@ -1,4 +1,4 @@
1
- __version__ = version = "0.0.138"
1
+ __version__ = version = "0.0.140"
2
2
 
3
3
  from . import aws
4
4
  from . import db
@@ -9,33 +9,34 @@ import copy
9
9
  import json
10
10
  import os
11
11
  import time
12
- from abc import ABC, abstractmethod
13
- from typing import Dict, Any, Optional
12
+ from abc import ABC
13
+ from datetime import date, datetime
14
+ from typing import Dict, Any
14
15
 
15
16
 
16
17
  class ActivityTracker(ABC):
17
18
  """
18
19
  Mixin class providing standardized activity tracking for Lambda handlers.
19
-
20
+
20
21
  Tracks API calls to the aws_api_activity table with consistent data structure
21
22
  and automatic duration calculation.
22
23
  """
23
-
24
+
24
25
  def __init__(self, *args, **kwargs):
25
26
  super().__init__(*args, **kwargs)
26
27
  self.activity_log_key = None
27
28
  self.start_time = None
28
29
  self.end_time = None
29
30
  self.activity_data = {}
30
-
31
+
31
32
  def track_activity_start(self, tx, context):
32
33
  """Start tracking activity for the current request"""
33
34
  self.start_time = time.time()
34
-
35
+
35
36
  # Gather common activity data
36
37
  postdata = context.postdata()
37
38
  payload = context.payload()
38
-
39
+
39
40
  self.activity_data = {
40
41
  "action": context.action(),
41
42
  "args": json.dumps(context.args()),
@@ -45,21 +46,34 @@ class ActivityTracker(ABC):
45
46
  "user_branch": os.environ.get("USER_BRANCH", "Unknown"),
46
47
  "start_timestamp": self.start_time,
47
48
  }
48
-
49
+
49
50
  # Add user information if available
50
51
  user_info = self._extract_user_info(payload)
51
52
  if user_info:
52
53
  self.activity_data.update(user_info)
53
-
54
+
54
55
  # Add session information
55
56
  session_data = context.session()
56
57
  if session_data:
57
- self.activity_data.update({k: v for k, v in session_data.items()
58
- if k not in ['cognito_user']})
59
-
58
+ self.activity_data.update(self._sanitize_session_data(session_data))
59
+
60
+ # Ensure all values are serializable before persisting
61
+ self.activity_data = {
62
+ key: self._normalize_activity_value(value)
63
+ for key, value in self.activity_data.items()
64
+ if value is not None
65
+ }
66
+
60
67
  # Create the activity record
61
- self.activity_log_key = tx.table("aws_api_activity").new(self.activity_data).pk
62
-
68
+ try:
69
+ self.activity_log_key = tx.table("aws_api_activity").new(self.activity_data).pk
70
+ except Exception as exc:
71
+ context.log(
72
+ f"ActivityTracker.track_activity_start failed: {exc}; keys={list(self.activity_data.keys())}",
73
+ "ActivityTracker.track_activity_start",
74
+ )
75
+ raise
76
+
63
77
  return self.activity_log_key
64
78
 
65
79
  def track_activity_success(self, tx, context):
@@ -140,3 +154,28 @@ class ActivityTracker(ABC):
140
154
  pass
141
155
 
142
156
  return user_info
157
+
158
+ def _sanitize_session_data(self, session: Dict[str, Any]) -> Dict[str, Any]:
159
+ """Remove sensitive session keys and normalize value types"""
160
+ sanitized = {}
161
+
162
+ for key, value in session.items():
163
+ if key == "cognito_user":
164
+ continue
165
+
166
+ sanitized[key] = self._normalize_activity_value(value)
167
+
168
+ return sanitized
169
+
170
+ def _normalize_activity_value(self, value: Any) -> Any:
171
+ """Convert activity data values into types acceptable by psycopg2"""
172
+ if isinstance(value, (dict, list, tuple, set)):
173
+ try:
174
+ return json.dumps(value)
175
+ except (TypeError, ValueError):
176
+ return str(value)
177
+ if isinstance(value, (datetime, date)):
178
+ return value.isoformat()
179
+ if isinstance(value, (bytes, bytearray)):
180
+ return value.decode("utf-8", errors="ignore")
181
+ return value
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: velocity-python
3
- Version: 0.0.138
3
+ Version: 0.0.140
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