velocity-python 0.1.11__tar.gz → 0.1.12__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 (186) hide show
  1. {velocity_python-0.1.11/src/velocity_python.egg-info → velocity_python-0.1.12}/PKG-INFO +1 -1
  2. {velocity_python-0.1.11 → velocity_python-0.1.12}/pyproject.toml +1 -1
  3. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/__init__.py +1 -1
  4. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/migrations.py +24 -43
  5. {velocity_python-0.1.11 → velocity_python-0.1.12/src/velocity_python.egg-info}/PKG-INFO +1 -1
  6. {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_schema_migrations.py +37 -38
  7. {velocity_python-0.1.11 → velocity_python-0.1.12}/LICENSE +0 -0
  8. {velocity_python-0.1.11 → velocity_python-0.1.12}/README.md +0 -0
  9. {velocity_python-0.1.11 → velocity_python-0.1.12}/setup.cfg +0 -0
  10. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/app/__init__.py +0 -0
  11. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/app/formbuilder/__init__.py +0 -0
  12. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/app/formbuilder/reshaper.py +0 -0
  13. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/app/invoices.py +0 -0
  14. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/app/orders.py +0 -0
  15. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/app/payments.py +0 -0
  16. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/app/purchase_orders.py +0 -0
  17. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/app/tests/__init__.py +0 -0
  18. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/app/tests/test_email_processing.py +0 -0
  19. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/app/tests/test_payment_profile_sorting.py +0 -0
  20. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/app/tests/test_spreadsheet_functions.py +0 -0
  21. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/app/validators/__init__.py +0 -0
  22. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/app/validators/formbuilder_template.py +0 -0
  23. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/aws/__init__.py +0 -0
  24. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/aws/amplify.py +0 -0
  25. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/aws/amplify_build.py +0 -0
  26. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/aws/handlers/__init__.py +0 -0
  27. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/aws/handlers/base_handler.py +0 -0
  28. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/aws/handlers/context.py +0 -0
  29. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/aws/handlers/context_factory.py +0 -0
  30. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/aws/handlers/exceptions.py +0 -0
  31. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/aws/handlers/lambda_handler.py +0 -0
  32. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/aws/handlers/mixins/__init__.py +0 -0
  33. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/aws/handlers/mixins/data_service.py +0 -0
  34. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/aws/handlers/mixins/web_handler.py +0 -0
  35. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/aws/handlers/perf.py +0 -0
  36. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/aws/handlers/response.py +0 -0
  37. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/aws/handlers/sqs_handler.py +0 -0
  38. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/aws/tests/__init__.py +0 -0
  39. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/aws/tests/test_base_handler_error_response.py +0 -0
  40. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/aws/tests/test_lambda_handler_json_serialization.py +0 -0
  41. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/aws/tests/test_response.py +0 -0
  42. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/__init__.py +0 -0
  43. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/core/__init__.py +0 -0
  44. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/core/async_support.py +0 -0
  45. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/core/column.py +0 -0
  46. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/core/database.py +0 -0
  47. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/core/decorators.py +0 -0
  48. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/core/engine.py +0 -0
  49. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/core/result.py +0 -0
  50. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/core/row.py +0 -0
  51. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/core/sequence.py +0 -0
  52. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/core/table.py +0 -0
  53. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/core/transaction.py +0 -0
  54. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/core/view.py +0 -0
  55. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/exceptions.py +0 -0
  56. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/__init__.py +0 -0
  57. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/base/__init__.py +0 -0
  58. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/base/initializer.py +0 -0
  59. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/base/operators.py +0 -0
  60. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/base/sql.py +0 -0
  61. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/base/types.py +0 -0
  62. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/mysql/__init__.py +0 -0
  63. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/mysql/operators.py +0 -0
  64. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/mysql/reserved.py +0 -0
  65. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/mysql/sql.py +0 -0
  66. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/mysql/types.py +0 -0
  67. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/postgres/__init__.py +0 -0
  68. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/postgres/operators.py +0 -0
  69. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/postgres/reserved.py +0 -0
  70. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/postgres/sql.py +0 -0
  71. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/postgres/types.py +0 -0
  72. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/sqlite/__init__.py +0 -0
  73. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/sqlite/operators.py +0 -0
  74. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/sqlite/reserved.py +0 -0
  75. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/sqlite/sql.py +0 -0
  76. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/sqlite/types.py +0 -0
  77. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/sqlserver/__init__.py +0 -0
  78. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/sqlserver/operators.py +0 -0
  79. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/sqlserver/reserved.py +0 -0
  80. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/sqlserver/sql.py +0 -0
  81. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/sqlserver/types.py +0 -0
  82. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/servers/tablehelper.py +0 -0
  83. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/__init__.py +0 -0
  84. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/common_db_test.py +0 -0
  85. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/postgres/__init__.py +0 -0
  86. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/postgres/common.py +0 -0
  87. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/postgres/test_column.py +0 -0
  88. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/postgres/test_connections.py +0 -0
  89. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/postgres/test_database.py +0 -0
  90. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/postgres/test_engine.py +0 -0
  91. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/postgres/test_general_usage.py +0 -0
  92. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/postgres/test_imports.py +0 -0
  93. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/postgres/test_result.py +0 -0
  94. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/postgres/test_row.py +0 -0
  95. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/postgres/test_row_comprehensive.py +0 -0
  96. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/postgres/test_schema_locking.py +0 -0
  97. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/postgres/test_schema_locking_unit.py +0 -0
  98. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/postgres/test_sequence.py +0 -0
  99. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/postgres/test_sql_comprehensive.py +0 -0
  100. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/postgres/test_table.py +0 -0
  101. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/postgres/test_table_comprehensive.py +0 -0
  102. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/postgres/test_transaction.py +0 -0
  103. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/sql/__init__.py +0 -0
  104. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/sql/common.py +0 -0
  105. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/sql/test_postgres_select_advanced.py +0 -0
  106. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/sql/test_postgres_select_variances.py +0 -0
  107. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/test_cursor_rowcount_fix.py +0 -0
  108. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/test_db_utils.py +0 -0
  109. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/test_postgres.py +0 -0
  110. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/test_postgres_unchanged.py +0 -0
  111. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/test_process_error_robustness.py +0 -0
  112. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/test_result_caching.py +0 -0
  113. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/test_result_sql_aware.py +0 -0
  114. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/test_row_get_missing_column.py +0 -0
  115. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/test_schema_locking_initializers.py +0 -0
  116. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/test_schema_locking_simple.py +0 -0
  117. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/test_sql_builder.py +0 -0
  118. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/test_tablehelper.py +0 -0
  119. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/tests/test_view_helper.py +0 -0
  120. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/db/utils.py +0 -0
  121. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/logging.py +0 -0
  122. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/misc/__init__.py +0 -0
  123. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/misc/conv/__init__.py +0 -0
  124. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/misc/conv/iconv.py +0 -0
  125. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/misc/conv/oconv.py +0 -0
  126. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/misc/db.py +0 -0
  127. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/misc/export.py +0 -0
  128. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/misc/format.py +0 -0
  129. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/misc/mail.py +0 -0
  130. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/misc/merge.py +0 -0
  131. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/misc/tests/__init__.py +0 -0
  132. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/misc/tests/test_db.py +0 -0
  133. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/misc/tests/test_fix.py +0 -0
  134. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/misc/tests/test_format.py +0 -0
  135. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/misc/tests/test_iconv.py +0 -0
  136. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/misc/tests/test_merge.py +0 -0
  137. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/misc/tests/test_oconv.py +0 -0
  138. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/misc/tests/test_original_error.py +0 -0
  139. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/misc/tests/test_timer.py +0 -0
  140. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/misc/timer.py +0 -0
  141. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/misc/tools.py +0 -0
  142. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/payment/__init__.py +0 -0
  143. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/payment/authorizenet_adapter.py +0 -0
  144. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/payment/base_adapter.py +0 -0
  145. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/payment/braintree_adapter.py +0 -0
  146. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/payment/charge_rules.py +0 -0
  147. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/payment/demo_profiles.py +0 -0
  148. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/payment/profiles.py +0 -0
  149. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/payment/router.py +0 -0
  150. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity/payment/stripe_adapter.py +0 -0
  151. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity_python.egg-info/SOURCES.txt +0 -0
  152. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity_python.egg-info/dependency_links.txt +0 -0
  153. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity_python.egg-info/entry_points.txt +0 -0
  154. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity_python.egg-info/requires.txt +0 -0
  155. {velocity_python-0.1.11 → velocity_python-0.1.12}/src/velocity_python.egg-info/top_level.txt +0 -0
  156. {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_amplify_build.py +0 -0
  157. {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_async_support.py +0 -0
  158. {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_batch_operations.py +0 -0
  159. {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_concurrency_safety.py +0 -0
  160. {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_connection_pool.py +0 -0
  161. {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_connection_resilience.py +0 -0
  162. {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_decorators.py +0 -0
  163. {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_formbuilder_reshaper.py +0 -0
  164. {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_formbuilder_template_validator.py +0 -0
  165. {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_iconv_money_to_cents.py +0 -0
  166. {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_lambda_handler.py +0 -0
  167. {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_lambda_handler_auth.py +0 -0
  168. {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_mixins_import.py +0 -0
  169. {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_n_plus_one.py +0 -0
  170. {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_observability.py +0 -0
  171. {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_payment_braintree_adapter.py +0 -0
  172. {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_payment_demo_profiles.py +0 -0
  173. {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_payment_profiles.py +0 -0
  174. {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_payment_router.py +0 -0
  175. {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_payment_stripe_adapter.py +0 -0
  176. {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_prepared_statements.py +0 -0
  177. {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_psycopg3_upgrade.py +0 -0
  178. {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_query_cache.py +0 -0
  179. {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_row_batch_update.py +0 -0
  180. {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_row_cache_staleness.py +0 -0
  181. {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_row_dirty_tracking.py +0 -0
  182. {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_security_hardening.py +0 -0
  183. {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_sqs_per_record_transactions.py +0 -0
  184. {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_sys_modified_count_postgres_demo.py +0 -0
  185. {velocity_python-0.1.11 → velocity_python-0.1.12}/tests/test_table_alter.py +0 -0
  186. {velocity_python-0.1.11 → velocity_python-0.1.12}/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.1.11
3
+ Version: 0.1.12
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.1.11"
7
+ version = "0.1.12"
8
8
  authors = [
9
9
  { name="Velocity Team", email="info@codeclubs.org" },
10
10
  ]
@@ -1,4 +1,4 @@
1
- __version__ = version = "0.1.11"
1
+ __version__ = version = "0.1.12"
2
2
 
3
3
  import importlib as _importlib
4
4
 
@@ -100,14 +100,17 @@ class MigrationRunner:
100
100
  """
101
101
  Discovers, applies, and rolls back schema migrations.
102
102
 
103
- Migrations are tracked in a ``velocity_migrations`` table with columns:
103
+ Migrations are tracked in a ``velocity_migrations`` table managed by
104
+ velocity (with standard system columns like ``sys_id``, ``sys_created``,
105
+ etc.). User columns:
104
106
 
105
- - ``version`` (INT, PRIMARY KEY) — migration version number
107
+ - ``version`` (INT) — migration version number
106
108
  - ``description`` (TEXT) — human-readable description
107
- - ``applied_at`` (TIMESTAMPTZ) — when the migration was applied
108
109
  - ``checksum`` (TEXT) — SHA-256 of the migration function source
109
110
  - ``execution_ms`` (INT) — how long the migration took in milliseconds
110
111
 
112
+ The ``sys_created`` system column serves as the applied-at timestamp.
113
+
111
114
  Args:
112
115
  engine: A velocity Engine instance.
113
116
  migrations_dir: Optional path to a directory containing migration .py files.
@@ -145,43 +148,23 @@ class MigrationRunner:
145
148
  """Create the velocity_migrations tracking table if it doesn't exist."""
146
149
  table = tx.table(TRACKING_TABLE)
147
150
  if not table.exists():
148
- # Use raw SQL to avoid velocity system columns — we manage our own schema
149
- server = getattr(getattr(self.engine, 'sql', None), 'server', 'PostgreSQL')
150
- if server == 'MySQL':
151
- ts_col = "applied_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP"
152
- elif server == 'SQLite':
153
- ts_col = "applied_at TEXT NOT NULL DEFAULT (datetime('now'))"
154
- elif server == 'SQL Server':
155
- ts_col = "applied_at DATETIMEOFFSET NOT NULL DEFAULT SYSDATETIMEOFFSET()"
156
- else:
157
- ts_col = "applied_at TIMESTAMPTZ NOT NULL DEFAULT NOW()"
158
- tx.execute(
159
- f"""
160
- CREATE TABLE IF NOT EXISTS {TRACKING_TABLE} (
161
- version INTEGER PRIMARY KEY,
162
- description TEXT NOT NULL DEFAULT '',
163
- {ts_col},
164
- checksum TEXT NOT NULL DEFAULT '',
165
- execution_ms INTEGER NOT NULL DEFAULT 0
166
- )
167
- """,
168
- cursor=tx.cursor(),
169
- )
151
+ table.create(columns={
152
+ "version": int,
153
+ "description": str,
154
+ "checksum": str,
155
+ "execution_ms": int,
156
+ })
170
157
  logger.info("Created tracking table: %s", TRACKING_TABLE)
171
158
 
172
159
  def _get_applied_versions(self, tx) -> Dict[int, Dict[str, Any]]:
173
160
  """Return dict of {version: {description, applied_at, checksum, execution_ms}}."""
174
161
  self._ensure_tracking_table(tx)
175
- result = tx.execute(
176
- f"SELECT version, description, applied_at, checksum, execution_ms "
177
- f"FROM {TRACKING_TABLE} ORDER BY version",
178
- cursor=tx.cursor(),
179
- )
162
+ table = tx.table(TRACKING_TABLE)
180
163
  applied = {}
181
- for row in result.all():
164
+ for row in table.select(orderby="version").all():
182
165
  applied[row["version"]] = {
183
166
  "description": row["description"],
184
- "applied_at": row["applied_at"],
167
+ "applied_at": row["sys_created"],
185
168
  "checksum": row["checksum"],
186
169
  "execution_ms": row["execution_ms"],
187
170
  }
@@ -189,20 +172,18 @@ class MigrationRunner:
189
172
 
190
173
  def _record_migration(self, tx, version: int, description: str, checksum: str, execution_ms: int) -> None:
191
174
  """Insert a record into the tracking table."""
192
- tx.execute(
193
- f"INSERT INTO {TRACKING_TABLE} (version, description, checksum, execution_ms) "
194
- f"VALUES (%s, %s, %s, %s)",
195
- (version, description, checksum, execution_ms),
196
- cursor=tx.cursor(),
197
- )
175
+ table = tx.table(TRACKING_TABLE)
176
+ table.insert({
177
+ "version": version,
178
+ "description": description,
179
+ "checksum": checksum,
180
+ "execution_ms": execution_ms,
181
+ })
198
182
 
199
183
  def _remove_migration_record(self, tx, version: int) -> None:
200
184
  """Delete a record from the tracking table."""
201
- tx.execute(
202
- f"DELETE FROM {TRACKING_TABLE} WHERE version = %s",
203
- (version,),
204
- cursor=tx.cursor(),
205
- )
185
+ table = tx.table(TRACKING_TABLE)
186
+ table.delete(where={"version": version})
206
187
 
207
188
  # ── Checksum ────────────────────────────────────────────────
208
189
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: velocity-python
3
- Version: 0.1.11
3
+ Version: 0.1.12
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
@@ -57,10 +57,14 @@ def _mock_result(rows, columns=None):
57
57
  return result
58
58
 
59
59
 
60
- def _make_mock_table(exists=False):
61
- """Return a mock Table that has exists(), create(), drop() methods."""
60
+ def _make_mock_table(exists=False, select_rows=None):
61
+ """Return a mock Table with exists(), create(), select(), insert(), delete()."""
62
62
  table = MagicMock()
63
63
  table.exists.return_value = exists
64
+ if select_rows is not None:
65
+ table.select.return_value = _mock_result(select_rows)
66
+ else:
67
+ table.select.return_value = _mock_result([])
64
68
  return table
65
69
 
66
70
 
@@ -90,23 +94,18 @@ def _make_mock_engine(schema_locked=False):
90
94
  def _make_mock_tx(applied_rows=None, table_exists=True):
91
95
  """
92
96
  Build a mock Transaction that supports:
93
- - tx.table(name) -> mock table
94
- - tx.execute(sql, ...) -> mock result (context-dependent)
97
+ - tx.table(name) -> mock table with select/insert/delete
95
98
  - tx.cursor() -> mock cursor
96
99
  - tx.commit(), tx.rollback(), tx.close()
97
100
  """
98
101
  tx = MagicMock()
99
102
  tx.cursor.return_value = MagicMock()
100
103
 
101
- mock_table = _make_mock_table(exists=table_exists)
102
- tx.table.return_value = mock_table
103
-
104
- # Default: return empty result for SELECT queries, no-op for others
105
104
  if applied_rows is None:
106
105
  applied_rows = []
107
106
 
108
- select_result = _mock_result(applied_rows)
109
- tx.execute.return_value = select_result
107
+ mock_table = _make_mock_table(exists=table_exists, select_rows=applied_rows)
108
+ tx.table.return_value = mock_table
110
109
 
111
110
  return tx
112
111
 
@@ -223,7 +222,7 @@ class TestMigrationRunnerPending:
223
222
  tx = _make_mock_tx(
224
223
  applied_rows=[{
225
224
  "version": 1, "description": "v1",
226
- "applied_at": "2024-01-01", "checksum": "abc", "execution_ms": 10,
225
+ "sys_created": "2024-01-01", "checksum": "abc", "execution_ms": 10,
227
226
  }],
228
227
  table_exists=True,
229
228
  )
@@ -249,7 +248,7 @@ class TestMigrationRunnerPending:
249
248
  tx = _make_mock_tx(
250
249
  applied_rows=[{
251
250
  "version": 1, "description": "v1",
252
- "applied_at": "2024-01-01", "checksum": "abc", "execution_ms": 10,
251
+ "sys_created": "2024-01-01", "checksum": "abc", "execution_ms": 10,
253
252
  }],
254
253
  table_exists=True,
255
254
  )
@@ -281,7 +280,7 @@ class TestMigrationRunnerStatus:
281
280
  tx = _make_mock_tx(
282
281
  applied_rows=[{
283
282
  "version": 1, "description": "v1",
284
- "applied_at": "2024-01-01", "checksum": MigrationRunner._checksum(up1),
283
+ "sys_created": "2024-01-01", "checksum": MigrationRunner._checksum(up1),
285
284
  "execution_ms": 15,
286
285
  }],
287
286
  table_exists=True,
@@ -370,7 +369,7 @@ class TestMigrationRunnerMigrate:
370
369
  tx = _make_mock_tx(
371
370
  applied_rows=[{
372
371
  "version": 1, "description": "v1",
373
- "applied_at": "2024-01-01", "checksum": "abc", "execution_ms": 10,
372
+ "sys_created": "2024-01-01", "checksum": "abc", "execution_ms": 10,
374
373
  }],
375
374
  table_exists=True,
376
375
  )
@@ -476,8 +475,8 @@ class TestMigrationRunnerRollback:
476
475
  engine = _make_mock_engine()
477
476
  tx_check = _make_mock_tx(
478
477
  applied_rows=[
479
- {"version": 1, "description": "v1", "applied_at": "2024-01-01", "checksum": "a", "execution_ms": 10},
480
- {"version": 2, "description": "v2", "applied_at": "2024-01-02", "checksum": "b", "execution_ms": 20},
478
+ {"version": 1, "description": "v1", "sys_created": "2024-01-01", "checksum": "a", "execution_ms": 10},
479
+ {"version": 2, "description": "v2", "sys_created": "2024-01-02", "checksum": "b", "execution_ms": 20},
481
480
  ],
482
481
  table_exists=True,
483
482
  )
@@ -521,9 +520,9 @@ class TestMigrationRunnerRollback:
521
520
  engine = _make_mock_engine()
522
521
  tx_check = _make_mock_tx(
523
522
  applied_rows=[
524
- {"version": 1, "description": "v1", "applied_at": "2024-01-01", "checksum": "a", "execution_ms": 10},
525
- {"version": 2, "description": "v2", "applied_at": "2024-01-02", "checksum": "b", "execution_ms": 20},
526
- {"version": 3, "description": "v3", "applied_at": "2024-01-03", "checksum": "c", "execution_ms": 30},
523
+ {"version": 1, "description": "v1", "sys_created": "2024-01-01", "checksum": "a", "execution_ms": 10},
524
+ {"version": 2, "description": "v2", "sys_created": "2024-01-02", "checksum": "b", "execution_ms": 20},
525
+ {"version": 3, "description": "v3", "sys_created": "2024-01-03", "checksum": "c", "execution_ms": 30},
527
526
  ],
528
527
  table_exists=True,
529
528
  )
@@ -546,7 +545,7 @@ class TestMigrationRunnerRollback:
546
545
  engine = _make_mock_engine()
547
546
  tx_check = _make_mock_tx(
548
547
  applied_rows=[
549
- {"version": 1, "description": "v1", "applied_at": "2024-01-01", "checksum": "a", "execution_ms": 10},
548
+ {"version": 1, "description": "v1", "sys_created": "2024-01-01", "checksum": "a", "execution_ms": 10},
550
549
  ],
551
550
  table_exists=True,
552
551
  )
@@ -568,7 +567,7 @@ class TestMigrationRunnerRollback:
568
567
  engine = _make_mock_engine()
569
568
  tx_check = _make_mock_tx(
570
569
  applied_rows=[
571
- {"version": 1, "description": "v1", "applied_at": "2024-01-01", "checksum": "a", "execution_ms": 10},
570
+ {"version": 1, "description": "v1", "sys_created": "2024-01-01", "checksum": "a", "execution_ms": 10},
572
571
  ],
573
572
  table_exists=True,
574
573
  )
@@ -593,7 +592,7 @@ class TestMigrationRunnerRollback:
593
592
  engine = _make_mock_engine(schema_locked=True)
594
593
  tx_check = _make_mock_tx(
595
594
  applied_rows=[
596
- {"version": 1, "description": "v1", "applied_at": "2024-01-01", "checksum": "a", "execution_ms": 10},
595
+ {"version": 1, "description": "v1", "sys_created": "2024-01-01", "checksum": "a", "execution_ms": 10},
597
596
  ],
598
597
  table_exists=True,
599
598
  )
@@ -643,7 +642,7 @@ class TestMigrationRunnerDiff:
643
642
  tx = _make_mock_tx(
644
643
  applied_rows=[{
645
644
  "version": 1, "description": "v1",
646
- "applied_at": "2024-01-01",
645
+ "sys_created": "2024-01-01",
647
646
  "checksum": MigrationRunner._checksum(up1),
648
647
  "execution_ms": 10,
649
648
  }],
@@ -667,7 +666,7 @@ class TestMigrationRunnerDiff:
667
666
  tx = _make_mock_tx(
668
667
  applied_rows=[{
669
668
  "version": 1, "description": "v1",
670
- "applied_at": "2024-01-01",
669
+ "sys_created": "2024-01-01",
671
670
  "checksum": "old_checksum_not_matching",
672
671
  "execution_ms": 10,
673
672
  }],
@@ -685,7 +684,7 @@ class TestMigrationRunnerDiff:
685
684
  tx = _make_mock_tx(
686
685
  applied_rows=[{
687
686
  "version": 99, "description": "ghost",
688
- "applied_at": "2024-01-01",
687
+ "sys_created": "2024-01-01",
689
688
  "checksum": "abc",
690
689
  "execution_ms": 10,
691
690
  }],
@@ -800,15 +799,18 @@ class TestTrackingTable:
800
799
  runner = MigrationRunner(engine)
801
800
  runner.pending()
802
801
 
803
- # Should have called execute with CREATE TABLE
804
- create_calls = [
805
- c for c in tx.execute.call_args_list
806
- if "CREATE TABLE" in str(c)
807
- ]
808
- assert len(create_calls) >= 1
802
+ # Should have called table.create() with column definitions
803
+ mock_table = tx.table.return_value
804
+ mock_table.create.assert_called_once()
805
+ create_kwargs = mock_table.create.call_args
806
+ columns = create_kwargs[1].get("columns") or create_kwargs[0][0]
807
+ assert "version" in columns
808
+ assert "description" in columns
809
+ assert "checksum" in columns
810
+ assert "execution_ms" in columns
809
811
 
810
812
  def test_tracking_table_not_recreated_when_exists(self):
811
- """If tracking table exists, no CREATE TABLE is issued."""
813
+ """If tracking table exists, no create() is issued."""
812
814
  @migration(version=1, description="v1")
813
815
  def up1(tx):
814
816
  pass
@@ -820,12 +822,9 @@ class TestTrackingTable:
820
822
  runner = MigrationRunner(engine)
821
823
  runner.pending()
822
824
 
823
- # Should NOT have a CREATE TABLE call
824
- create_calls = [
825
- c for c in tx.execute.call_args_list
826
- if "CREATE TABLE" in str(c)
827
- ]
828
- assert len(create_calls) == 0
825
+ # Should NOT have called table.create()
826
+ mock_table = tx.table.return_value
827
+ mock_table.create.assert_not_called()
829
828
 
830
829
 
831
830
  # ── CLI tests ──────────────────────────────────────────────────────