velocity-python 0.0.176__tar.gz → 0.0.178__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 (138) hide show
  1. {velocity_python-0.0.176 → velocity_python-0.0.178}/PKG-INFO +1 -1
  2. {velocity_python-0.0.176 → velocity_python-0.0.178}/pyproject.toml +1 -1
  3. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/__init__.py +1 -1
  4. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/aws/handlers/lambda_handler.py +2 -1
  5. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/aws/handlers/mixins/__init__.py +2 -2
  6. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/aws/handlers/mixins/data_service.py +113 -0
  7. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity_python.egg-info/PKG-INFO +1 -1
  8. {velocity_python-0.0.176 → velocity_python-0.0.178}/LICENSE +0 -0
  9. {velocity_python-0.0.176 → velocity_python-0.0.178}/README.md +0 -0
  10. {velocity_python-0.0.176 → velocity_python-0.0.178}/setup.cfg +0 -0
  11. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/app/__init__.py +0 -0
  12. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/app/invoices.py +0 -0
  13. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/app/orders.py +0 -0
  14. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/app/payments.py +0 -0
  15. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/app/purchase_orders.py +0 -0
  16. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/app/tests/__init__.py +0 -0
  17. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/app/tests/test_email_processing.py +0 -0
  18. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/app/tests/test_payment_profile_sorting.py +0 -0
  19. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/app/tests/test_spreadsheet_functions.py +0 -0
  20. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/aws/__init__.py +0 -0
  21. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/aws/amplify.py +0 -0
  22. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/aws/handlers/__init__.py +0 -0
  23. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/aws/handlers/base_handler.py +0 -0
  24. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/aws/handlers/context.py +0 -0
  25. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/aws/handlers/exceptions.py +0 -0
  26. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/aws/handlers/mixins/web_handler.py +0 -0
  27. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/aws/handlers/response.py +0 -0
  28. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/aws/handlers/sqs_handler.py +0 -0
  29. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/aws/tests/__init__.py +0 -0
  30. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/aws/tests/test_lambda_handler_json_serialization.py +0 -0
  31. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/aws/tests/test_response.py +0 -0
  32. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/__init__.py +0 -0
  33. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/core/__init__.py +0 -0
  34. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/core/column.py +0 -0
  35. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/core/database.py +0 -0
  36. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/core/decorators.py +0 -0
  37. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/core/engine.py +0 -0
  38. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/core/result.py +0 -0
  39. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/core/row.py +0 -0
  40. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/core/sequence.py +0 -0
  41. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/core/table.py +0 -0
  42. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/core/transaction.py +0 -0
  43. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/exceptions.py +0 -0
  44. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/servers/__init__.py +0 -0
  45. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/servers/base/__init__.py +0 -0
  46. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/servers/base/initializer.py +0 -0
  47. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/servers/base/operators.py +0 -0
  48. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/servers/base/sql.py +0 -0
  49. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/servers/base/types.py +0 -0
  50. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/servers/mysql/__init__.py +0 -0
  51. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/servers/mysql/operators.py +0 -0
  52. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/servers/mysql/reserved.py +0 -0
  53. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/servers/mysql/sql.py +0 -0
  54. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/servers/mysql/types.py +0 -0
  55. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/servers/postgres/__init__.py +0 -0
  56. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/servers/postgres/operators.py +0 -0
  57. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/servers/postgres/reserved.py +0 -0
  58. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/servers/postgres/sql.py +0 -0
  59. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/servers/postgres/types.py +0 -0
  60. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/servers/sqlite/__init__.py +0 -0
  61. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/servers/sqlite/operators.py +0 -0
  62. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/servers/sqlite/reserved.py +0 -0
  63. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/servers/sqlite/sql.py +0 -0
  64. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/servers/sqlite/types.py +0 -0
  65. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/servers/sqlserver/__init__.py +0 -0
  66. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/servers/sqlserver/operators.py +0 -0
  67. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/servers/sqlserver/reserved.py +0 -0
  68. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/servers/sqlserver/sql.py +0 -0
  69. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/servers/sqlserver/types.py +0 -0
  70. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/servers/tablehelper.py +0 -0
  71. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/tests/__init__.py +0 -0
  72. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/tests/common_db_test.py +0 -0
  73. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/tests/postgres/__init__.py +0 -0
  74. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/tests/postgres/common.py +0 -0
  75. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/tests/postgres/test_column.py +0 -0
  76. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/tests/postgres/test_connections.py +0 -0
  77. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/tests/postgres/test_database.py +0 -0
  78. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/tests/postgres/test_engine.py +0 -0
  79. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/tests/postgres/test_general_usage.py +0 -0
  80. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/tests/postgres/test_imports.py +0 -0
  81. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/tests/postgres/test_result.py +0 -0
  82. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/tests/postgres/test_row.py +0 -0
  83. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/tests/postgres/test_row_comprehensive.py +0 -0
  84. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/tests/postgres/test_schema_locking.py +0 -0
  85. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/tests/postgres/test_schema_locking_unit.py +0 -0
  86. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/tests/postgres/test_sequence.py +0 -0
  87. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/tests/postgres/test_sql_comprehensive.py +0 -0
  88. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/tests/postgres/test_table.py +0 -0
  89. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/tests/postgres/test_table_comprehensive.py +0 -0
  90. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/tests/postgres/test_transaction.py +0 -0
  91. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/tests/sql/__init__.py +0 -0
  92. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/tests/sql/common.py +0 -0
  93. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/tests/sql/test_postgres_select_advanced.py +0 -0
  94. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/tests/sql/test_postgres_select_variances.py +0 -0
  95. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/tests/test_cursor_rowcount_fix.py +0 -0
  96. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/tests/test_db_utils.py +0 -0
  97. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/tests/test_postgres.py +0 -0
  98. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/tests/test_postgres_unchanged.py +0 -0
  99. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/tests/test_process_error_robustness.py +0 -0
  100. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/tests/test_result_caching.py +0 -0
  101. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/tests/test_result_sql_aware.py +0 -0
  102. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/tests/test_row_get_missing_column.py +0 -0
  103. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/tests/test_schema_locking_initializers.py +0 -0
  104. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/tests/test_schema_locking_simple.py +0 -0
  105. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/tests/test_sql_builder.py +0 -0
  106. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/tests/test_tablehelper.py +0 -0
  107. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/db/utils.py +0 -0
  108. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/logging.py +0 -0
  109. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/misc/__init__.py +0 -0
  110. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/misc/conv/__init__.py +0 -0
  111. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/misc/conv/iconv.py +0 -0
  112. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/misc/conv/oconv.py +0 -0
  113. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/misc/db.py +0 -0
  114. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/misc/export.py +0 -0
  115. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/misc/format.py +0 -0
  116. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/misc/mail.py +0 -0
  117. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/misc/merge.py +0 -0
  118. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/misc/tests/__init__.py +0 -0
  119. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/misc/tests/test_db.py +0 -0
  120. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/misc/tests/test_fix.py +0 -0
  121. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/misc/tests/test_format.py +0 -0
  122. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/misc/tests/test_iconv.py +0 -0
  123. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/misc/tests/test_merge.py +0 -0
  124. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/misc/tests/test_oconv.py +0 -0
  125. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/misc/tests/test_original_error.py +0 -0
  126. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/misc/tests/test_timer.py +0 -0
  127. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/misc/timer.py +0 -0
  128. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity/misc/tools.py +0 -0
  129. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity_python.egg-info/SOURCES.txt +0 -0
  130. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity_python.egg-info/dependency_links.txt +0 -0
  131. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity_python.egg-info/requires.txt +0 -0
  132. {velocity_python-0.0.176 → velocity_python-0.0.178}/src/velocity_python.egg-info/top_level.txt +0 -0
  133. {velocity_python-0.0.176 → velocity_python-0.0.178}/tests/test_decorators.py +0 -0
  134. {velocity_python-0.0.176 → velocity_python-0.0.178}/tests/test_lambda_handler.py +0 -0
  135. {velocity_python-0.0.176 → velocity_python-0.0.178}/tests/test_mixins_import.py +0 -0
  136. {velocity_python-0.0.176 → velocity_python-0.0.178}/tests/test_sys_modified_count_postgres_demo.py +0 -0
  137. {velocity_python-0.0.176 → velocity_python-0.0.178}/tests/test_table_alter.py +0 -0
  138. {velocity_python-0.0.176 → velocity_python-0.0.178}/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.176
3
+ Version: 0.0.178
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.176"
7
+ version = "0.0.178"
8
8
  authors = [
9
9
  { name="Velocity Team", email="info@codeclubs.org" },
10
10
  ]
@@ -1,4 +1,4 @@
1
- __version__ = version = "0.0.176"
1
+ __version__ = version = "0.0.178"
2
2
 
3
3
  from . import aws
4
4
  from . import db
@@ -22,6 +22,7 @@ class LambdaHandler(BaseHandler):
22
22
  aws_context,
23
23
  context_class: Type[context.Context] = context.Context
24
24
  ):
25
+ self.start = time.time()
25
26
  super().__init__(aws_event, aws_context, context_class)
26
27
 
27
28
  # LambdaHandler-specific initialization
@@ -63,7 +64,7 @@ class LambdaHandler(BaseHandler):
63
64
  return
64
65
  logger.debug("starting LamdaHandler.beforeAction")
65
66
 
66
- self.start = time.time()
67
+
67
68
  self.cognito_user = context.get_cognito_user(self.aws_event)
68
69
  self.current_user = {}
69
70
 
@@ -7,6 +7,6 @@ This package provides mixins for common Lambda handler patterns:
7
7
  """
8
8
 
9
9
  from .web_handler import WebHandler
10
- from .data_service import DataServiceMixin
10
+ from .data_service import DataServiceMixin, RWXHookSystem, apply_sys_modified_by
11
11
 
12
- __all__ = ['WebHandler', 'DataServiceMixin']
12
+ __all__ = ['WebHandler', 'DataServiceMixin', 'RWXHookSystem', 'apply_sys_modified_by']
@@ -7,6 +7,7 @@ that uses velocity.db for database access.
7
7
 
8
8
  import base64
9
9
  import datetime
10
+ import importlib
10
11
  from io import BytesIO
11
12
 
12
13
  from velocity.misc import export
@@ -528,3 +529,115 @@ class DataServiceMixin:
528
529
  "OnActionGetTableSchema",
529
530
  )
530
531
  raise Exception(f"Failed to retrieve table schema: {str(e)}")
532
+
533
+
534
+ class RWXHookSystem:
535
+ """
536
+ RWX (Read/Write/eXecute) hook system for table-specific business logic.
537
+
538
+ This class provides a way to dynamically load and execute table-specific
539
+ hooks (before_read, after_write, etc.) from an rwx package.
540
+
541
+ Usage:
542
+ from velocity.aws.handlers.mixins import RWXHookSystem
543
+
544
+ class MyRWXSystem(RWXHookSystem):
545
+ hook_module_name = 'rwx' # Your rwx package
546
+
547
+ class HttpEventHandler(DataServiceMixin, LambdaHandler):
548
+ def read_hook(self, tx, table_name, sys_id, row, context):
549
+ MyRWXSystem.call_hooks(
550
+ 'read', tx, table_name, sys_id, row, context
551
+ )
552
+ """
553
+
554
+ hook_module_name = None # Override in subclass (e.g., 'rwx')
555
+
556
+ @classmethod
557
+ def _get_table_module(cls, table):
558
+ """Load table-specific hook module if it exists"""
559
+ if not cls.hook_module_name:
560
+ return None
561
+ try:
562
+ return importlib.import_module(f".{table}", cls.hook_module_name)
563
+ except ImportError:
564
+ return None
565
+
566
+ @classmethod
567
+ def _call_hook(cls, hook_name, table, *args, **kwargs):
568
+ """Call a hook on table-specific module if it exists"""
569
+ module = cls._get_table_module(table)
570
+ if module and hasattr(module, hook_name):
571
+ return getattr(module, hook_name)(*args, **kwargs)
572
+ return None
573
+
574
+ @classmethod
575
+ def call_hooks(cls, operation, tx, table_name, *args, context=None):
576
+ """
577
+ Call before/after hooks for an operation.
578
+
579
+ Args:
580
+ operation: 'read', 'write', 'delete', 'query'
581
+ tx: Database transaction
582
+ table_name: Name of the table
583
+ *args: Operation-specific arguments
584
+ context: Request context (keyword only)
585
+ """
586
+ # Call before hook
587
+ cls._call_hook(f'before_{operation}', table_name, tx, table_name, *args, context)
588
+
589
+ # Note: after hooks should be called by the application after the operation
590
+ # This method is just for the before hook pattern
591
+
592
+ @classmethod
593
+ def call_after_hook(cls, operation, tx, table_name, *args, context=None):
594
+ """Call after hook for an operation"""
595
+ cls._call_hook(f'after_{operation}', table_name, tx, table_name, *args, context)
596
+
597
+
598
+ def apply_sys_modified_by(incoming, context):
599
+ """
600
+ Strip sys_* fields and set sys_modified_by from context.
601
+
602
+ Common pattern for applications that track who modified records.
603
+ Call this from your write_hook implementation.
604
+
605
+ Args:
606
+ incoming: Dictionary of data being written
607
+ context: Request context with session/payload
608
+ """
609
+ payload = context.payload()
610
+
611
+ # Strip system fields from incoming data
612
+ for key in list(incoming.keys()):
613
+ if "sys_" in key:
614
+ incoming.pop(key)
615
+
616
+ # Extract email from session
617
+ session = context.session() if hasattr(context, "session") else None
618
+ email_address = None
619
+
620
+ if isinstance(session, dict):
621
+ email_address = session.get("cognito_user_email")
622
+ if not email_address:
623
+ cognito_user = session.get("cognito_user")
624
+ if isinstance(cognito_user, dict):
625
+ email_address = cognito_user.get("email") or (
626
+ cognito_user.get("attributes") or {}
627
+ ).get("email")
628
+ if not email_address:
629
+ email_address = session.get("email_address")
630
+
631
+ if not email_address and isinstance(payload, dict):
632
+ payload_user = payload.get("cognito_user")
633
+ if isinstance(payload_user, dict):
634
+ email_address = payload_user.get("email") or (
635
+ payload_user.get("attributes") or {}
636
+ ).get("email")
637
+
638
+ incoming["sys_modified_by"] = (
639
+ email_address.lower()
640
+ if isinstance(email_address, str)
641
+ else incoming.get("sys_modified_by", "unknown")
642
+ )
643
+ incoming["sys_dirty"] = True
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: velocity-python
3
- Version: 0.0.176
3
+ Version: 0.0.178
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