velocity-python 0.0.106__tar.gz → 0.0.109__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 (82) hide show
  1. {velocity_python-0.0.106/src/velocity_python.egg-info → velocity_python-0.0.109}/PKG-INFO +1 -1
  2. {velocity_python-0.0.106 → velocity_python-0.0.109}/pyproject.toml +1 -1
  3. {velocity_python-0.0.106 → velocity_python-0.0.109}/src/velocity/__init__.py +1 -1
  4. {velocity_python-0.0.106 → velocity_python-0.0.109}/src/velocity/db/core/engine.py +66 -19
  5. {velocity_python-0.0.106 → velocity_python-0.0.109/src/velocity_python.egg-info}/PKG-INFO +1 -1
  6. {velocity_python-0.0.106 → velocity_python-0.0.109}/LICENSE +0 -0
  7. {velocity_python-0.0.106 → velocity_python-0.0.109}/README.md +0 -0
  8. {velocity_python-0.0.106 → velocity_python-0.0.109}/setup.cfg +0 -0
  9. {velocity_python-0.0.106 → velocity_python-0.0.109}/src/velocity/app/__init__.py +0 -0
  10. {velocity_python-0.0.106 → velocity_python-0.0.109}/src/velocity/app/invoices.py +0 -0
  11. {velocity_python-0.0.106 → velocity_python-0.0.109}/src/velocity/app/orders.py +0 -0
  12. {velocity_python-0.0.106 → velocity_python-0.0.109}/src/velocity/app/payments.py +0 -0
  13. {velocity_python-0.0.106 → velocity_python-0.0.109}/src/velocity/app/purchase_orders.py +0 -0
  14. {velocity_python-0.0.106 → velocity_python-0.0.109}/src/velocity/aws/__init__.py +0 -0
  15. {velocity_python-0.0.106 → velocity_python-0.0.109}/src/velocity/aws/amplify.py +0 -0
  16. {velocity_python-0.0.106 → velocity_python-0.0.109}/src/velocity/aws/handlers/__init__.py +0 -0
  17. {velocity_python-0.0.106 → velocity_python-0.0.109}/src/velocity/aws/handlers/context.py +0 -0
  18. {velocity_python-0.0.106 → velocity_python-0.0.109}/src/velocity/aws/handlers/lambda_handler.py +0 -0
  19. {velocity_python-0.0.106 → velocity_python-0.0.109}/src/velocity/aws/handlers/response.py +0 -0
  20. {velocity_python-0.0.106 → velocity_python-0.0.109}/src/velocity/aws/handlers/sqs_handler.py +0 -0
  21. {velocity_python-0.0.106 → velocity_python-0.0.109}/src/velocity/db/__init__.py +0 -0
  22. {velocity_python-0.0.106 → velocity_python-0.0.109}/src/velocity/db/core/__init__.py +0 -0
  23. {velocity_python-0.0.106 → velocity_python-0.0.109}/src/velocity/db/core/column.py +0 -0
  24. {velocity_python-0.0.106 → velocity_python-0.0.109}/src/velocity/db/core/database.py +0 -0
  25. {velocity_python-0.0.106 → velocity_python-0.0.109}/src/velocity/db/core/decorators.py +0 -0
  26. {velocity_python-0.0.106 → velocity_python-0.0.109}/src/velocity/db/core/exceptions.py +0 -0
  27. {velocity_python-0.0.106 → velocity_python-0.0.109}/src/velocity/db/core/result.py +0 -0
  28. {velocity_python-0.0.106 → velocity_python-0.0.109}/src/velocity/db/core/row.py +0 -0
  29. {velocity_python-0.0.106 → velocity_python-0.0.109}/src/velocity/db/core/sequence.py +0 -0
  30. {velocity_python-0.0.106 → velocity_python-0.0.109}/src/velocity/db/core/table.py +0 -0
  31. {velocity_python-0.0.106 → velocity_python-0.0.109}/src/velocity/db/core/transaction.py +0 -0
  32. {velocity_python-0.0.106 → velocity_python-0.0.109}/src/velocity/db/exceptions.py +0 -0
  33. {velocity_python-0.0.106 → velocity_python-0.0.109}/src/velocity/db/servers/__init__.py +0 -0
  34. {velocity_python-0.0.106 → velocity_python-0.0.109}/src/velocity/db/servers/mysql.py +0 -0
  35. {velocity_python-0.0.106 → velocity_python-0.0.109}/src/velocity/db/servers/mysql_reserved.py +0 -0
  36. {velocity_python-0.0.106 → velocity_python-0.0.109}/src/velocity/db/servers/postgres/__init__.py +0 -0
  37. {velocity_python-0.0.106 → velocity_python-0.0.109}/src/velocity/db/servers/postgres/operators.py +0 -0
  38. {velocity_python-0.0.106 → velocity_python-0.0.109}/src/velocity/db/servers/postgres/reserved.py +0 -0
  39. {velocity_python-0.0.106 → velocity_python-0.0.109}/src/velocity/db/servers/postgres/sql.py +0 -0
  40. {velocity_python-0.0.106 → velocity_python-0.0.109}/src/velocity/db/servers/postgres/types.py +0 -0
  41. {velocity_python-0.0.106 → velocity_python-0.0.109}/src/velocity/db/servers/sqlite.py +0 -0
  42. {velocity_python-0.0.106 → velocity_python-0.0.109}/src/velocity/db/servers/sqlite_reserved.py +0 -0
  43. {velocity_python-0.0.106 → velocity_python-0.0.109}/src/velocity/db/servers/sqlserver.py +0 -0
  44. {velocity_python-0.0.106 → velocity_python-0.0.109}/src/velocity/db/servers/sqlserver_reserved.py +0 -0
  45. {velocity_python-0.0.106 → velocity_python-0.0.109}/src/velocity/db/servers/tablehelper.py +0 -0
  46. {velocity_python-0.0.106 → velocity_python-0.0.109}/src/velocity/db/utils.py +0 -0
  47. {velocity_python-0.0.106 → velocity_python-0.0.109}/src/velocity/misc/__init__.py +0 -0
  48. {velocity_python-0.0.106 → velocity_python-0.0.109}/src/velocity/misc/conv/__init__.py +0 -0
  49. {velocity_python-0.0.106 → velocity_python-0.0.109}/src/velocity/misc/conv/iconv.py +0 -0
  50. {velocity_python-0.0.106 → velocity_python-0.0.109}/src/velocity/misc/conv/oconv.py +0 -0
  51. {velocity_python-0.0.106 → velocity_python-0.0.109}/src/velocity/misc/db.py +0 -0
  52. {velocity_python-0.0.106 → velocity_python-0.0.109}/src/velocity/misc/export.py +0 -0
  53. {velocity_python-0.0.106 → velocity_python-0.0.109}/src/velocity/misc/format.py +0 -0
  54. {velocity_python-0.0.106 → velocity_python-0.0.109}/src/velocity/misc/mail.py +0 -0
  55. {velocity_python-0.0.106 → velocity_python-0.0.109}/src/velocity/misc/merge.py +0 -0
  56. {velocity_python-0.0.106 → velocity_python-0.0.109}/src/velocity/misc/timer.py +0 -0
  57. {velocity_python-0.0.106 → velocity_python-0.0.109}/src/velocity/misc/tools.py +0 -0
  58. {velocity_python-0.0.106 → velocity_python-0.0.109}/src/velocity_python.egg-info/SOURCES.txt +0 -0
  59. {velocity_python-0.0.106 → velocity_python-0.0.109}/src/velocity_python.egg-info/dependency_links.txt +0 -0
  60. {velocity_python-0.0.106 → velocity_python-0.0.109}/src/velocity_python.egg-info/requires.txt +0 -0
  61. {velocity_python-0.0.106 → velocity_python-0.0.109}/src/velocity_python.egg-info/top_level.txt +0 -0
  62. {velocity_python-0.0.106 → velocity_python-0.0.109}/tests/test_cursor_rowcount_fix.py +0 -0
  63. {velocity_python-0.0.106 → velocity_python-0.0.109}/tests/test_db.py +0 -0
  64. {velocity_python-0.0.106 → velocity_python-0.0.109}/tests/test_db_utils.py +0 -0
  65. {velocity_python-0.0.106 → velocity_python-0.0.109}/tests/test_email_processing.py +0 -0
  66. {velocity_python-0.0.106 → velocity_python-0.0.109}/tests/test_fix.py +0 -0
  67. {velocity_python-0.0.106 → velocity_python-0.0.109}/tests/test_format.py +0 -0
  68. {velocity_python-0.0.106 → velocity_python-0.0.109}/tests/test_iconv.py +0 -0
  69. {velocity_python-0.0.106 → velocity_python-0.0.109}/tests/test_merge.py +0 -0
  70. {velocity_python-0.0.106 → velocity_python-0.0.109}/tests/test_oconv.py +0 -0
  71. {velocity_python-0.0.106 → velocity_python-0.0.109}/tests/test_original_error.py +0 -0
  72. {velocity_python-0.0.106 → velocity_python-0.0.109}/tests/test_payment_profile_sorting.py +0 -0
  73. {velocity_python-0.0.106 → velocity_python-0.0.109}/tests/test_postgres.py +0 -0
  74. {velocity_python-0.0.106 → velocity_python-0.0.109}/tests/test_process_error_robustness.py +0 -0
  75. {velocity_python-0.0.106 → velocity_python-0.0.109}/tests/test_response.py +0 -0
  76. {velocity_python-0.0.106 → velocity_python-0.0.109}/tests/test_result_caching.py +0 -0
  77. {velocity_python-0.0.106 → velocity_python-0.0.109}/tests/test_result_sql_aware.py +0 -0
  78. {velocity_python-0.0.106 → velocity_python-0.0.109}/tests/test_row_get_missing_column.py +0 -0
  79. {velocity_python-0.0.106 → velocity_python-0.0.109}/tests/test_spreadsheet_functions.py +0 -0
  80. {velocity_python-0.0.106 → velocity_python-0.0.109}/tests/test_sql_builder.py +0 -0
  81. {velocity_python-0.0.106 → velocity_python-0.0.109}/tests/test_tablehelper.py +0 -0
  82. {velocity_python-0.0.106 → velocity_python-0.0.109}/tests/test_timer.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: velocity-python
3
- Version: 0.0.106
3
+ Version: 0.0.109
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.106"
7
+ version = "0.0.109"
8
8
  authors = [
9
9
  { name="Velocity Team", email="info@codeclubs.org" },
10
10
  ]
@@ -1,4 +1,4 @@
1
- __version__ = version = "0.0.98"
1
+ __version__ = version = "0.0.109"
2
2
 
3
3
  from . import aws
4
4
  from . import db
@@ -24,6 +24,38 @@ class Engine:
24
24
  self.__sql = sql
25
25
  self.__driver = driver
26
26
  self.__connect_timeout = connect_timeout
27
+
28
+ # Set up error code mappings from the SQL class
29
+ self._setup_error_mappings()
30
+
31
+ def _setup_error_mappings(self):
32
+ """
33
+ Set up error code to exception class mappings from the SQL driver.
34
+ """
35
+ self.error_codes = {}
36
+
37
+ # Map error codes to exception class names
38
+ sql_attrs = [
39
+ ('ApplicationErrorCodes', 'DbApplicationError'),
40
+ ('DatabaseMissingErrorCodes', 'DbDatabaseMissingError'),
41
+ ('TableMissingErrorCodes', 'DbTableMissingError'),
42
+ ('ColumnMissingErrorCodes', 'DbColumnMissingError'),
43
+ ('ForeignKeyMissingErrorCodes', 'DbForeignKeyMissingError'),
44
+ ('ConnectionErrorCodes', 'DbConnectionError'),
45
+ ('DuplicateKeyErrorCodes', 'DbDuplicateKeyError'),
46
+ ('RetryTransactionCodes', 'DbRetryTransaction'),
47
+ ('TruncationErrorCodes', 'DbTruncationError'),
48
+ ('LockTimeoutErrorCodes', 'DbLockTimeoutError'),
49
+ ('DatabaseObjectExistsErrorCodes', 'DbObjectExistsError'),
50
+ ('DataIntegrityErrorCodes', 'DbDataIntegrityError')
51
+ ]
52
+
53
+ for attr_name, exception_class in sql_attrs:
54
+ if hasattr(self.sql, attr_name):
55
+ codes = getattr(self.sql, attr_name)
56
+ if codes: # Only add non-empty lists
57
+ for code in codes:
58
+ self.error_codes[str(code)] = exception_class
27
59
 
28
60
  def __str__(self):
29
61
  return f"[{self.sql.server}] engine({self.config})"
@@ -352,7 +384,16 @@ class Engine:
352
384
 
353
385
  # Safely get error code and message with fallbacks
354
386
  try:
355
- error_code = getattr(exception, 'pgcode', None) or self.get_error(exception)
387
+ # Try PostgreSQL-specific error code first, then use SQL driver's get_error method
388
+ error_code = getattr(exception, 'pgcode', None)
389
+ if not error_code and hasattr(self.sql, 'get_error'):
390
+ try:
391
+ error_code, error_message_from_driver = self.sql.get_error(exception)
392
+ if error_message_from_driver:
393
+ error_message = error_message_from_driver
394
+ except Exception as get_error_exception:
395
+ logger.warning(f"⚠️ SQL driver get_error failed: {get_error_exception}")
396
+ error_code = None
356
397
  except Exception as e:
357
398
  logger.warning(f"⚠️ Unable to extract database error code: {e}")
358
399
  error_code = None
@@ -364,18 +405,16 @@ class Engine:
364
405
  error_message = f"<Error converting exception: {type(exception).__name__}>"
365
406
 
366
407
  # Primary error classification by error code
367
- if error_code and hasattr(self, 'error_codes'):
368
- for error_class, codes in self.error_codes.items():
369
- if error_code in codes:
370
- logger.info(f"✅ Successfully classified error: {error_code} → {error_class}")
371
- try:
372
- raise self._create_exception_with_chaining(
373
- error_class, error_message, exception, sql, parameters
374
- )
375
- except Exception as creation_error:
376
- logger.error(f"❌ Failed to create {error_class} exception: {creation_error}")
377
- # Fall through to regex classification
378
- break
408
+ if error_code and hasattr(self, 'error_codes') and str(error_code) in self.error_codes:
409
+ error_class = self.error_codes[str(error_code)]
410
+ logger.info(f"✅ Successfully classified error: {error_code} {error_class}")
411
+ try:
412
+ raise self._create_exception_with_chaining(
413
+ error_class, error_message, exception, sql, parameters
414
+ )
415
+ except Exception as creation_error:
416
+ logger.error(f"❌ Failed to create {error_class} exception: {creation_error}")
417
+ # Fall through to regex classification
379
418
 
380
419
  # Secondary error classification by message patterns (regex fallback)
381
420
  error_message_lower = error_message.lower()
@@ -415,6 +454,13 @@ class Engine:
415
454
  r'schema.*does.*not.*exist|unknown.*table'
416
455
  ]
417
456
 
457
+ # Enhanced column missing patterns
458
+ column_missing_patterns = [
459
+ r'column.*does.*not.*exist',
460
+ r'unknown.*column|column.*not.*found',
461
+ r'no.*such.*column|invalid.*column.*name'
462
+ ]
463
+
418
464
  # Enhanced syntax error patterns
419
465
  syntax_patterns = [
420
466
  r'syntax.*error|invalid.*syntax',
@@ -431,12 +477,13 @@ class Engine:
431
477
 
432
478
  # Comprehensive pattern matching with error class mapping
433
479
  pattern_mappings = [
434
- (connection_patterns, 'ConnectionError'),
435
- (duplicate_patterns, 'DuplicateError'),
436
- (permission_patterns, 'PermissionError'),
437
- (not_found_patterns, 'NotFoundError'),
438
- (syntax_patterns, 'SyntaxError'),
439
- (deadlock_patterns, 'DeadlockError')
480
+ (connection_patterns, 'DbConnectionError'),
481
+ (duplicate_patterns, 'DbDuplicateKeyError'),
482
+ (permission_patterns, 'DbPermissionError'),
483
+ (not_found_patterns, 'DbTableMissingError'),
484
+ (column_missing_patterns, 'DbColumnMissingError'),
485
+ (syntax_patterns, 'DbSyntaxError'),
486
+ (deadlock_patterns, 'DbDeadlockError')
440
487
  ]
441
488
 
442
489
  # Apply pattern matching
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: velocity-python
3
- Version: 0.0.106
3
+ Version: 0.0.109
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