velocity-python 0.1.26__tar.gz → 0.1.27__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 (183) hide show
  1. {velocity_python-0.1.26/src/velocity_python.egg-info → velocity_python-0.1.27}/PKG-INFO +1 -1
  2. {velocity_python-0.1.26 → velocity_python-0.1.27}/pyproject.toml +1 -1
  3. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/__init__.py +1 -1
  4. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/aws/assets/indexing.py +12 -2
  5. {velocity_python-0.1.26 → velocity_python-0.1.27/src/velocity_python.egg-info}/PKG-INFO +1 -1
  6. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity_python.egg-info/SOURCES.txt +1 -0
  7. velocity_python-0.1.27/tests/test_asset_indexing.py +103 -0
  8. {velocity_python-0.1.26 → velocity_python-0.1.27}/LICENSE +0 -0
  9. {velocity_python-0.1.26 → velocity_python-0.1.27}/README.md +0 -0
  10. {velocity_python-0.1.26 → velocity_python-0.1.27}/setup.cfg +0 -0
  11. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/aws/__init__.py +0 -0
  12. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/aws/amplify.py +0 -0
  13. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/aws/amplify_build.py +0 -0
  14. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/aws/assets/__init__.py +0 -0
  15. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/aws/assets/backfill.py +0 -0
  16. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/aws/assets/references.py +0 -0
  17. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/aws/assets/service.py +0 -0
  18. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/aws/assets/usage_index.py +0 -0
  19. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/aws/dirty_pipeline.py +0 -0
  20. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/aws/handlers/__init__.py +0 -0
  21. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/aws/handlers/base_handler.py +0 -0
  22. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/aws/handlers/context.py +0 -0
  23. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/aws/handlers/context_factory.py +0 -0
  24. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/aws/handlers/exceptions.py +0 -0
  25. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/aws/handlers/lambda_handler.py +0 -0
  26. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/aws/handlers/mixins/__init__.py +0 -0
  27. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/aws/handlers/mixins/data_service.py +0 -0
  28. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/aws/handlers/mixins/web_handler.py +0 -0
  29. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/aws/handlers/perf.py +0 -0
  30. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/aws/handlers/response.py +0 -0
  31. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/aws/handlers/sqs_handler.py +0 -0
  32. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/aws/s3.py +0 -0
  33. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/aws/ssm_config.py +0 -0
  34. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/aws/tests/__init__.py +0 -0
  35. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/aws/tests/test_base_handler_error_response.py +0 -0
  36. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/aws/tests/test_lambda_handler_json_serialization.py +0 -0
  37. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/aws/tests/test_response.py +0 -0
  38. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/__init__.py +0 -0
  39. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/core/__init__.py +0 -0
  40. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/core/async_support.py +0 -0
  41. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/core/column.py +0 -0
  42. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/core/database.py +0 -0
  43. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/core/decorators.py +0 -0
  44. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/core/engine.py +0 -0
  45. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/core/result.py +0 -0
  46. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/core/row.py +0 -0
  47. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/core/sequence.py +0 -0
  48. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/core/table.py +0 -0
  49. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/core/transaction.py +0 -0
  50. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/core/view.py +0 -0
  51. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/exceptions.py +0 -0
  52. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/migrations.py +0 -0
  53. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/servers/__init__.py +0 -0
  54. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/servers/base/__init__.py +0 -0
  55. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/servers/base/initializer.py +0 -0
  56. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/servers/base/operators.py +0 -0
  57. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/servers/base/sql.py +0 -0
  58. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/servers/base/types.py +0 -0
  59. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/servers/mysql/__init__.py +0 -0
  60. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/servers/mysql/operators.py +0 -0
  61. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/servers/mysql/reserved.py +0 -0
  62. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/servers/mysql/sql.py +0 -0
  63. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/servers/mysql/types.py +0 -0
  64. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/servers/postgres/__init__.py +0 -0
  65. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/servers/postgres/operators.py +0 -0
  66. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/servers/postgres/reserved.py +0 -0
  67. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/servers/postgres/sql.py +0 -0
  68. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/servers/postgres/types.py +0 -0
  69. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/servers/sqlite/__init__.py +0 -0
  70. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/servers/sqlite/operators.py +0 -0
  71. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/servers/sqlite/reserved.py +0 -0
  72. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/servers/sqlite/sql.py +0 -0
  73. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/servers/sqlite/types.py +0 -0
  74. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/servers/sqlserver/__init__.py +0 -0
  75. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/servers/sqlserver/operators.py +0 -0
  76. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/servers/sqlserver/reserved.py +0 -0
  77. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/servers/sqlserver/sql.py +0 -0
  78. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/servers/sqlserver/types.py +0 -0
  79. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/servers/tablehelper.py +0 -0
  80. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/tests/__init__.py +0 -0
  81. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/tests/common_db_test.py +0 -0
  82. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/tests/postgres/__init__.py +0 -0
  83. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/tests/postgres/common.py +0 -0
  84. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/tests/postgres/test_column.py +0 -0
  85. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/tests/postgres/test_connections.py +0 -0
  86. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/tests/postgres/test_database.py +0 -0
  87. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/tests/postgres/test_engine.py +0 -0
  88. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/tests/postgres/test_general_usage.py +0 -0
  89. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/tests/postgres/test_imports.py +0 -0
  90. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/tests/postgres/test_result.py +0 -0
  91. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/tests/postgres/test_row.py +0 -0
  92. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/tests/postgres/test_row_comprehensive.py +0 -0
  93. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/tests/postgres/test_schema_locking.py +0 -0
  94. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/tests/postgres/test_schema_locking_unit.py +0 -0
  95. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/tests/postgres/test_sequence.py +0 -0
  96. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/tests/postgres/test_sql_comprehensive.py +0 -0
  97. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/tests/postgres/test_table.py +0 -0
  98. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/tests/postgres/test_table_comprehensive.py +0 -0
  99. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/tests/postgres/test_transaction.py +0 -0
  100. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/tests/sql/__init__.py +0 -0
  101. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/tests/sql/common.py +0 -0
  102. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/tests/sql/test_postgres_select_advanced.py +0 -0
  103. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/tests/sql/test_postgres_select_variances.py +0 -0
  104. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/tests/test_cursor_rowcount_fix.py +0 -0
  105. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/tests/test_db_utils.py +0 -0
  106. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/tests/test_postgres.py +0 -0
  107. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/tests/test_postgres_unchanged.py +0 -0
  108. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/tests/test_process_error_robustness.py +0 -0
  109. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/tests/test_result_caching.py +0 -0
  110. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/tests/test_result_sql_aware.py +0 -0
  111. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/tests/test_row_get_missing_column.py +0 -0
  112. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/tests/test_schema_locking_initializers.py +0 -0
  113. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/tests/test_schema_locking_simple.py +0 -0
  114. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/tests/test_sql_builder.py +0 -0
  115. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/tests/test_tablehelper.py +0 -0
  116. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/tests/test_view_helper.py +0 -0
  117. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/db/utils.py +0 -0
  118. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/logging.py +0 -0
  119. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/misc/__init__.py +0 -0
  120. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/misc/conv/__init__.py +0 -0
  121. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/misc/conv/iconv.py +0 -0
  122. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/misc/conv/oconv.py +0 -0
  123. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/misc/db.py +0 -0
  124. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/misc/export.py +0 -0
  125. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/misc/format.py +0 -0
  126. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/misc/mail.py +0 -0
  127. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/misc/merge.py +0 -0
  128. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/misc/pdf.py +0 -0
  129. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/misc/tests/__init__.py +0 -0
  130. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/misc/tests/test_db.py +0 -0
  131. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/misc/tests/test_fix.py +0 -0
  132. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/misc/tests/test_format.py +0 -0
  133. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/misc/tests/test_iconv.py +0 -0
  134. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/misc/tests/test_merge.py +0 -0
  135. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/misc/tests/test_oconv.py +0 -0
  136. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/misc/tests/test_original_error.py +0 -0
  137. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/misc/tests/test_timer.py +0 -0
  138. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/misc/timer.py +0 -0
  139. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/misc/tools.py +0 -0
  140. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/payment/__init__.py +0 -0
  141. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/payment/authorizenet_adapter.py +0 -0
  142. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/payment/base_adapter.py +0 -0
  143. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/payment/braintree_adapter.py +0 -0
  144. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/payment/charge_rules.py +0 -0
  145. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity/payment/stripe_adapter.py +0 -0
  146. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity_python.egg-info/dependency_links.txt +0 -0
  147. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity_python.egg-info/entry_points.txt +0 -0
  148. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity_python.egg-info/requires.txt +0 -0
  149. {velocity_python-0.1.26 → velocity_python-0.1.27}/src/velocity_python.egg-info/top_level.txt +0 -0
  150. {velocity_python-0.1.26 → velocity_python-0.1.27}/tests/test_amplify_build.py +0 -0
  151. {velocity_python-0.1.26 → velocity_python-0.1.27}/tests/test_asset_references.py +0 -0
  152. {velocity_python-0.1.26 → velocity_python-0.1.27}/tests/test_assets_service.py +0 -0
  153. {velocity_python-0.1.26 → velocity_python-0.1.27}/tests/test_async_support.py +0 -0
  154. {velocity_python-0.1.26 → velocity_python-0.1.27}/tests/test_batch_operations.py +0 -0
  155. {velocity_python-0.1.26 → velocity_python-0.1.27}/tests/test_concurrency_safety.py +0 -0
  156. {velocity_python-0.1.26 → velocity_python-0.1.27}/tests/test_connection_pool.py +0 -0
  157. {velocity_python-0.1.26 → velocity_python-0.1.27}/tests/test_connection_resilience.py +0 -0
  158. {velocity_python-0.1.26 → velocity_python-0.1.27}/tests/test_decorators.py +0 -0
  159. {velocity_python-0.1.26 → velocity_python-0.1.27}/tests/test_dirty_pipeline_fast_path.py +0 -0
  160. {velocity_python-0.1.26 → velocity_python-0.1.27}/tests/test_email_processing.py +0 -0
  161. {velocity_python-0.1.26 → velocity_python-0.1.27}/tests/test_iconv_money_to_cents.py +0 -0
  162. {velocity_python-0.1.26 → velocity_python-0.1.27}/tests/test_lambda_handler.py +0 -0
  163. {velocity_python-0.1.26 → velocity_python-0.1.27}/tests/test_lambda_handler_auth.py +0 -0
  164. {velocity_python-0.1.26 → velocity_python-0.1.27}/tests/test_mixins_import.py +0 -0
  165. {velocity_python-0.1.26 → velocity_python-0.1.27}/tests/test_n_plus_one.py +0 -0
  166. {velocity_python-0.1.26 → velocity_python-0.1.27}/tests/test_observability.py +0 -0
  167. {velocity_python-0.1.26 → velocity_python-0.1.27}/tests/test_payment_braintree_adapter.py +0 -0
  168. {velocity_python-0.1.26 → velocity_python-0.1.27}/tests/test_payment_profile_sorting.py +0 -0
  169. {velocity_python-0.1.26 → velocity_python-0.1.27}/tests/test_payment_stripe_adapter.py +0 -0
  170. {velocity_python-0.1.26 → velocity_python-0.1.27}/tests/test_pdf.py +0 -0
  171. {velocity_python-0.1.26 → velocity_python-0.1.27}/tests/test_prepared_statements.py +0 -0
  172. {velocity_python-0.1.26 → velocity_python-0.1.27}/tests/test_psycopg3_upgrade.py +0 -0
  173. {velocity_python-0.1.26 → velocity_python-0.1.27}/tests/test_query_cache.py +0 -0
  174. {velocity_python-0.1.26 → velocity_python-0.1.27}/tests/test_row_batch_update.py +0 -0
  175. {velocity_python-0.1.26 → velocity_python-0.1.27}/tests/test_row_cache_staleness.py +0 -0
  176. {velocity_python-0.1.26 → velocity_python-0.1.27}/tests/test_row_dirty_tracking.py +0 -0
  177. {velocity_python-0.1.26 → velocity_python-0.1.27}/tests/test_schema_migrations.py +0 -0
  178. {velocity_python-0.1.26 → velocity_python-0.1.27}/tests/test_security_hardening.py +0 -0
  179. {velocity_python-0.1.26 → velocity_python-0.1.27}/tests/test_spreadsheet_functions.py +0 -0
  180. {velocity_python-0.1.26 → velocity_python-0.1.27}/tests/test_sqs_per_record_transactions.py +0 -0
  181. {velocity_python-0.1.26 → velocity_python-0.1.27}/tests/test_sys_modified_count_postgres_demo.py +0 -0
  182. {velocity_python-0.1.26 → velocity_python-0.1.27}/tests/test_table_alter.py +0 -0
  183. {velocity_python-0.1.26 → velocity_python-0.1.27}/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.26
3
+ Version: 0.1.27
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.26"
7
+ version = "0.1.27"
8
8
  authors = [
9
9
  { name="Velocity Team", email="info@codeclubs.org" },
10
10
  ]
@@ -1,4 +1,4 @@
1
- __version__ = version = "0.1.26"
1
+ __version__ = version = "0.1.27"
2
2
 
3
3
  import importlib as _importlib
4
4
 
@@ -76,7 +76,11 @@ def reconcile_form_builder_template_asset_usages(
76
76
 
77
77
 
78
78
  def load_asset_usages(tx, *, source_table: str, source_sys_id: str) -> list[AssetUsage]:
79
- rows = tx.table("asset_usage_index").select(
79
+ usage_index = tx.table("asset_usage_index")
80
+ if not usage_index.exists():
81
+ return []
82
+
83
+ rows = usage_index.select(
80
84
  where={
81
85
  "source_table": source_table,
82
86
  "source_sys_id": source_sys_id,
@@ -87,6 +91,9 @@ def load_asset_usages(tx, *, source_table: str, source_sys_id: str) -> list[Asse
87
91
 
88
92
  def apply_asset_usage_reconciliation(tx, reconciliation: AssetUsageReconciliation) -> None:
89
93
  table = tx.table("asset_usage_index")
94
+ if not table.exists():
95
+ return
96
+
90
97
  for usage in reconciliation.to_create + reconciliation.to_refresh:
91
98
  row = _asset_usage_to_row(usage)
92
99
  table.upsert(
@@ -115,13 +122,16 @@ def resolve_asset_id_for_reference(tx, reference: AssetReference) -> str | None:
115
122
  return reference.asset_id
116
123
 
117
124
  images = tx.table("images")
125
+ if not images.exists():
126
+ return None
127
+
118
128
  for candidate_key in _candidate_storage_keys(reference.storage_key):
119
129
  row = images.find({"key": candidate_key})
120
130
  asset_id = _extract_sys_id(row)
121
131
  if asset_id:
122
132
  return asset_id
123
133
 
124
- if reference.url:
134
+ if reference.url and images.column("url").exists():
125
135
  row = images.find({"url": reference.url})
126
136
  asset_id = _extract_sys_id(row)
127
137
  if asset_id:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: velocity-python
3
- Version: 0.1.26
3
+ Version: 0.1.27
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
@@ -145,6 +145,7 @@ src/velocity_python.egg-info/entry_points.txt
145
145
  src/velocity_python.egg-info/requires.txt
146
146
  src/velocity_python.egg-info/top_level.txt
147
147
  tests/test_amplify_build.py
148
+ tests/test_asset_indexing.py
148
149
  tests/test_asset_references.py
149
150
  tests/test_assets_service.py
150
151
  tests/test_async_support.py
@@ -0,0 +1,103 @@
1
+ from velocity.aws.assets.indexing import load_asset_usages, resolve_asset_id_for_reference
2
+ from velocity.aws.assets.references import AssetReference
3
+
4
+
5
+ class FakeRow:
6
+ def __init__(self, data):
7
+ self._data = dict(data)
8
+
9
+ def to_dict(self):
10
+ return dict(self._data)
11
+
12
+
13
+ class FakeResult:
14
+ def __init__(self, rows):
15
+ self._rows = [dict(row) for row in rows]
16
+
17
+ def as_dict(self):
18
+ return self
19
+
20
+ def all(self):
21
+ return [dict(row) for row in self._rows]
22
+
23
+
24
+ class FakeImagesTable:
25
+ def __init__(self):
26
+ self.calls = []
27
+ self._columns = {"key"}
28
+
29
+ def exists(self):
30
+ return True
31
+
32
+ def column(self, name):
33
+ table = self
34
+
35
+ class FakeColumn:
36
+ def exists(self_nonlocal):
37
+ return name in table._columns
38
+
39
+ return FakeColumn()
40
+
41
+ def find(self, where):
42
+ self.calls.append(dict(where))
43
+ if where == {"key": "folder/banner.png"}:
44
+ return FakeRow({"sys_id": "img-123"})
45
+ if where == {"url": "https://example.com/banner.png"}:
46
+ raise AssertionError("url lookup should be skipped when the column is absent")
47
+ return None
48
+
49
+
50
+ class FakeUsageIndexTable:
51
+ def exists(self):
52
+ return False
53
+
54
+ def select(self, where=None):
55
+ raise AssertionError("select should be skipped when asset_usage_index is missing")
56
+
57
+
58
+ class FakeTx:
59
+ def __init__(self, *, image_table_exists=True, image_columns=None, usage_index_exists=False):
60
+ self.images = FakeImagesTable()
61
+ self.images._exists = image_table_exists
62
+ self.images._columns = set(image_columns or {"key"})
63
+ self.usage_index = FakeUsageIndexTable()
64
+ self.usage_index._exists = usage_index_exists
65
+
66
+ def table(self, name):
67
+ if name == "images":
68
+ class ImagesTableProxy(FakeImagesTable):
69
+ pass
70
+
71
+ proxy = self.images
72
+ proxy.exists = lambda: proxy._exists
73
+ return proxy
74
+ if name == "asset_usage_index":
75
+ proxy = self.usage_index
76
+ proxy.exists = lambda: proxy._exists
77
+ return proxy
78
+ raise AssertionError(f"Unexpected table request: {name}")
79
+
80
+
81
+ def test_load_asset_usages_returns_empty_when_usage_table_missing():
82
+ tx = FakeTx()
83
+
84
+ usages = load_asset_usages(tx, source_table="form_builder_template", source_sys_id="2680")
85
+
86
+ assert usages == []
87
+
88
+
89
+ def test_resolve_asset_id_skips_url_lookup_when_images_url_column_missing():
90
+ tx = FakeTx(image_columns={"key"})
91
+ reference = AssetReference(
92
+ asset_id=None,
93
+ url="https://example.com/banner.png",
94
+ storage_key="folder/banner.png",
95
+ source_field="main_image_url",
96
+ source_field_type="image-widget",
97
+ raw_value="https://example.com/banner.png",
98
+ )
99
+
100
+ asset_id = resolve_asset_id_for_reference(tx, reference)
101
+
102
+ assert asset_id == "img-123"
103
+ assert tx.images.calls == [{"key": "folder/banner.png"}]