jvspatial 0.2.4__tar.gz → 0.2.5__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 (223) hide show
  1. {jvspatial-0.2.4/jvspatial.egg-info → jvspatial-0.2.5}/PKG-INFO +3 -3
  2. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/__init__.py +2 -0
  3. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/db/_cache.py +5 -0
  4. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/db/_observable.py +5 -0
  5. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/db/database.py +11 -0
  6. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/db/postgres.py +57 -0
  7. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/db/transaction.py +21 -0
  8. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/version.py +1 -1
  9. {jvspatial-0.2.4 → jvspatial-0.2.5/jvspatial.egg-info}/PKG-INFO +3 -3
  10. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial.egg-info/requires.txt +2 -2
  11. {jvspatial-0.2.4 → jvspatial-0.2.5}/pyproject.toml +2 -2
  12. {jvspatial-0.2.4 → jvspatial-0.2.5}/AUTHORS +0 -0
  13. {jvspatial-0.2.4 → jvspatial-0.2.5}/LICENSE +0 -0
  14. {jvspatial-0.2.4 → jvspatial-0.2.5}/README.md +0 -0
  15. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/__init__.py +0 -0
  16. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/_route_utils.py +0 -0
  17. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/auth/_session_store.py +0 -0
  18. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/auth/api_key_service.py +0 -0
  19. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/auth/cleanup.py +0 -0
  20. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/auth/config.py +0 -0
  21. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/auth/enhanced.py +0 -0
  22. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/auth/models.py +0 -0
  23. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/auth/oauth/__init__.py +0 -0
  24. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/auth/oauth/bridge.py +0 -0
  25. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/auth/oauth/client_adapter.py +0 -0
  26. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/auth/oauth/dcr.py +0 -0
  27. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/auth/oauth/denylist.py +0 -0
  28. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/auth/oauth/keys.py +0 -0
  29. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/auth/oauth/metadata.py +0 -0
  30. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/auth/oauth/models.py +0 -0
  31. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/auth/oauth/refresh_store.py +0 -0
  32. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/auth/oauth/requests.py +0 -0
  33. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/auth/oauth/resource.py +0 -0
  34. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/auth/oauth/revocation.py +0 -0
  35. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/auth/oauth/routes.py +0 -0
  36. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/auth/oauth/server.py +0 -0
  37. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/auth/openapi_config.py +0 -0
  38. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/auth/rbac.py +0 -0
  39. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/auth/service.py +0 -0
  40. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/components/__init__.py +0 -0
  41. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/components/app_builder.py +0 -0
  42. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/components/auth_configurator.py +0 -0
  43. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/components/auth_middleware.py +0 -0
  44. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/components/database_configurator.py +0 -0
  45. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/components/endpoint_auth_resolver.py +0 -0
  46. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/components/endpoint_manager.py +0 -0
  47. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/components/error_handler.py +0 -0
  48. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/components/logging_config.py +0 -0
  49. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/components/path_matcher.py +0 -0
  50. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/config.py +0 -0
  51. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/config_groups.py +0 -0
  52. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/constants.py +0 -0
  53. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/context.py +0 -0
  54. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/decorators/__init__.py +0 -0
  55. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/decorators/deferred_registry.py +0 -0
  56. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/decorators/field.py +0 -0
  57. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/decorators/function_wrappers.py +0 -0
  58. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/decorators/route.py +0 -0
  59. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/decorators/route_config.py +0 -0
  60. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/deferred_invoke_route.py +0 -0
  61. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/endpoints/__init__.py +0 -0
  62. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/endpoints/factory.py +0 -0
  63. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/endpoints/graph_visualization.py +0 -0
  64. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/endpoints/metadata.py +0 -0
  65. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/endpoints/registry.py +0 -0
  66. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/endpoints/response.py +0 -0
  67. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/endpoints/router.py +0 -0
  68. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/endpoints/walker_executor.py +0 -0
  69. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/exceptions.py +0 -0
  70. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/integrations/__init__.py +0 -0
  71. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/integrations/scheduler/__init__.py +0 -0
  72. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/integrations/scheduler/decorators.py +0 -0
  73. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/integrations/scheduler/middleware.py +0 -0
  74. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/integrations/scheduler/models.py +0 -0
  75. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/integrations/scheduler/scheduler.py +0 -0
  76. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/integrations/storage/__init__.py +0 -0
  77. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/integrations/storage/service.py +0 -0
  78. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/integrations/webhooks/__init__.py +0 -0
  79. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/integrations/webhooks/helpers.py +0 -0
  80. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/integrations/webhooks/middleware.py +0 -0
  81. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/integrations/webhooks/models.py +0 -0
  82. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/integrations/webhooks/utils.py +0 -0
  83. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/integrations/webhooks/webhook_auth.py +0 -0
  84. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/middleware/__init__.py +0 -0
  85. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/middleware/manager.py +0 -0
  86. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/middleware/rate_limit.py +0 -0
  87. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/middleware/rate_limit_backend.py +0 -0
  88. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/server.py +0 -0
  89. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/server_app_factory.py +0 -0
  90. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/server_configurator.py +0 -0
  91. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/server_lifecycle.py +0 -0
  92. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/server_registration.py +0 -0
  93. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/server_run.py +0 -0
  94. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/services/__init__.py +0 -0
  95. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/services/discovery.py +0 -0
  96. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/services/file_storage.py +0 -0
  97. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/services/lifecycle.py +0 -0
  98. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/utils/__init__.py +0 -0
  99. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/utils/path_utils.py +0 -0
  100. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/utils/reload.py +0 -0
  101. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/async_utils/__init__.py +0 -0
  102. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/cache/__init__.py +0 -0
  103. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/cache/base.py +0 -0
  104. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/cache/factory.py +0 -0
  105. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/cache/layered.py +0 -0
  106. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/cache/memory.py +0 -0
  107. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/cache/redis.py +0 -0
  108. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/cli.py +0 -0
  109. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/__init__.py +0 -0
  110. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/annotations.py +0 -0
  111. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/context.py +0 -0
  112. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/decorators.py +0 -0
  113. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/entities/__init__.py +0 -0
  114. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/entities/_visit_hooks.py +0 -0
  115. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/entities/edge.py +0 -0
  116. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/entities/node.py +0 -0
  117. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/entities/node_query.py +0 -0
  118. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/entities/object.py +0 -0
  119. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/entities/root.py +0 -0
  120. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/entities/walker.py +0 -0
  121. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/entities/walker_components/__init__.py +0 -0
  122. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/entities/walker_components/event_system.py +0 -0
  123. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/entities/walker_components/protection.py +0 -0
  124. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/entities/walker_components/trail_store.py +0 -0
  125. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/entities/walker_components/walker_queue.py +0 -0
  126. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/entities/walker_components/walker_trail.py +0 -0
  127. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/events.py +0 -0
  128. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/graph.py +0 -0
  129. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/graph_context_config.py +0 -0
  130. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/graph_expansion.py +0 -0
  131. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/graph_payload.py +0 -0
  132. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/graph_projection.py +0 -0
  133. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/migrations.py +0 -0
  134. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/mixins/__init__.py +0 -0
  135. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/mixins/deferred_save.py +0 -0
  136. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/pager.py +0 -0
  137. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/utils.py +0 -0
  138. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/validate.py +0 -0
  139. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/db/__init__.py +0 -0
  140. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/db/_atomic.py +0 -0
  141. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/db/_graph_binding_postgres.py +0 -0
  142. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/db/_path_locks.py +0 -0
  143. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/db/_postgres_translate.py +0 -0
  144. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/db/_sqlite_translate.py +0 -0
  145. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/db/dynamodb.py +0 -0
  146. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/db/factory.py +0 -0
  147. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/db/graph_bindings.py +0 -0
  148. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/db/jsondb.py +0 -0
  149. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/db/manager.py +0 -0
  150. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/db/mongodb.py +0 -0
  151. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/db/query.py +0 -0
  152. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/db/sqlite.py +0 -0
  153. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/db/work_claim.py +0 -0
  154. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/dev_tools/__init__.py +0 -0
  155. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/env.py +0 -0
  156. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/env_adapter.py +0 -0
  157. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/exceptions.py +0 -0
  158. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/logging/__init__.py +0 -0
  159. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/logging/config.py +0 -0
  160. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/logging/custom_levels.py +0 -0
  161. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/logging/endpoints.py +0 -0
  162. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/logging/filter_utils.py +0 -0
  163. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/logging/handler.py +0 -0
  164. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/logging/models.py +0 -0
  165. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/logging/service.py +0 -0
  166. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/memory/__init__.py +0 -0
  167. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/observability/__init__.py +0 -0
  168. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/observability/metrics.py +0 -0
  169. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/observability/otel.py +0 -0
  170. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/observability/tracing.py +0 -0
  171. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/profiling/__init__.py +0 -0
  172. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/py.typed +0 -0
  173. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/runtime/__init__.py +0 -0
  174. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/runtime/eventbridge_readiness.py +0 -0
  175. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/runtime/lwa.py +0 -0
  176. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/runtime/serverless.py +0 -0
  177. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/serverless/__init__.py +0 -0
  178. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/serverless/deferred_invoke.py +0 -0
  179. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/serverless/factory.py +0 -0
  180. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/serverless/tasks/__init__.py +0 -0
  181. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/serverless/tasks/aws_lambda.py +0 -0
  182. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/serverless/tasks/aws_sqs.py +0 -0
  183. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/serverless/tasks/base.py +0 -0
  184. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/serverless/tasks/stub.py +0 -0
  185. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/serverless/tasks/sync.py +0 -0
  186. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/storage/__init__.py +0 -0
  187. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/storage/exceptions.py +0 -0
  188. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/storage/interfaces/__init__.py +0 -0
  189. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/storage/interfaces/_stream.py +0 -0
  190. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/storage/interfaces/base.py +0 -0
  191. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/storage/interfaces/local.py +0 -0
  192. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/storage/interfaces/s3.py +0 -0
  193. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/storage/internal_markers.py +0 -0
  194. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/storage/managers/__init__.py +0 -0
  195. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/storage/managers/proxy.py +0 -0
  196. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/storage/models.py +0 -0
  197. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/storage/security/__init__.py +0 -0
  198. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/storage/security/path_sanitizer.py +0 -0
  199. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/storage/security/validator.py +0 -0
  200. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/testing/__init__.py +0 -0
  201. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/utils/__init__.py +0 -0
  202. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/utils/context.py +0 -0
  203. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/utils/decorators.py +0 -0
  204. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/utils/deprecation.py +0 -0
  205. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/utils/factory.py +0 -0
  206. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/utils/normalization.py +0 -0
  207. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/utils/retry.py +0 -0
  208. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/utils/serialization.py +0 -0
  209. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/utils/stability.py +0 -0
  210. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/utils/types.py +0 -0
  211. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/utils/validation.py +0 -0
  212. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial.egg-info/SOURCES.txt +0 -0
  213. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial.egg-info/dependency_links.txt +0 -0
  214. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial.egg-info/entry_points.txt +0 -0
  215. {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial.egg-info/top_level.txt +0 -0
  216. {jvspatial-0.2.4 → jvspatial-0.2.5}/setup.cfg +0 -0
  217. {jvspatial-0.2.4 → jvspatial-0.2.5}/tests/test_config.py +0 -0
  218. {jvspatial-0.2.4 → jvspatial-0.2.5}/tests/test_create_task.py +0 -0
  219. {jvspatial-0.2.4 → jvspatial-0.2.5}/tests/test_env.py +0 -0
  220. {jvspatial-0.2.4 → jvspatial-0.2.5}/tests/test_env_adapter_eventbridge_validation.py +0 -0
  221. {jvspatial-0.2.4 → jvspatial-0.2.5}/tests/test_env_adapter_postgres.py +0 -0
  222. {jvspatial-0.2.4 → jvspatial-0.2.5}/tests/test_node_operations.py +0 -0
  223. {jvspatial-0.2.4 → jvspatial-0.2.5}/tests/test_normalize_optional_secret.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: jvspatial
3
- Version: 0.2.4
3
+ Version: 0.2.5
4
4
  Summary: An asynchronous object-spatial Python library for persistence and business logic application layers.
5
5
  Author-email: "TrueSelph Inc." <adminh@trueselph.com>
6
6
  License: MIT
@@ -48,14 +48,14 @@ Provides-Extra: pgvector
48
48
  Requires-Dist: asyncpg>=0.29.0; extra == "pgvector"
49
49
  Requires-Dist: pgvector>=0.2.5; extra == "pgvector"
50
50
  Provides-Extra: dev
51
- Requires-Dist: pytest<9.2,>=7.0; extra == "dev"
51
+ Requires-Dist: pytest<9.3,>=7.0; extra == "dev"
52
52
  Requires-Dist: pytest-asyncio>=0.21.0; extra == "dev"
53
53
  Requires-Dist: pytest-benchmark>=4.0.0; extra == "dev"
54
54
  Requires-Dist: httpx>=0.24.0; extra == "dev"
55
55
  Requires-Dist: pre-commit>=3.0.0; extra == "dev"
56
56
  Requires-Dist: python-dotenv>=1.0.0; extra == "dev"
57
57
  Provides-Extra: test
58
- Requires-Dist: pytest<9.2,>=7.0; extra == "test"
58
+ Requires-Dist: pytest<9.3,>=7.0; extra == "test"
59
59
  Requires-Dist: pytest-asyncio>=0.21.0; extra == "test"
60
60
  Requires-Dist: pytest-cov>=4.0.0; extra == "test"
61
61
  Requires-Dist: pytest-benchmark>=4.0.0; extra == "test"
@@ -94,6 +94,7 @@ from .db import (
94
94
  LiteralBindingFact,
95
95
  create_database,
96
96
  )
97
+ from .db.transaction import Transaction
97
98
  from .db.work_claim import claim_record, delete_claimed_record, release_claim
98
99
 
99
100
  # Observability primitives
@@ -170,6 +171,7 @@ __all__ = [
170
171
  "Server",
171
172
  # Database & Cache
172
173
  "Database",
174
+ "Transaction",
173
175
  "InsertIfAbsentResult",
174
176
  "GraphBindingSummary",
175
177
  "LiteralBindingFact",
@@ -248,6 +248,11 @@ class CachingDatabase(Database):
248
248
  """Expose native projection support without promising a complete entity."""
249
249
  return bool(getattr(self.inner, "supports_native_projected_reads", False))
250
250
 
251
+ def can_pushdown_numeric_sort(self, query, sort) -> bool:
252
+ """Forward compiler coverage, never a cached data/authorization result."""
253
+ checker = getattr(self.inner, "can_pushdown_numeric_sort", None)
254
+ return bool(checker(query, sort)) if callable(checker) else False
255
+
251
256
  async def graph_edge_page(
252
257
  self, node_id: str, *, after: Optional[str] = None, limit: int = 50
253
258
  ) -> List[Dict[str, Any]]:
@@ -357,6 +357,11 @@ class ObservableDatabase(Database):
357
357
  """Expose native projection support without promising a complete entity."""
358
358
  return bool(getattr(self.inner, "supports_native_projected_reads", False))
359
359
 
360
+ def can_pushdown_numeric_sort(self, query, sort) -> bool:
361
+ """Forward compiler coverage without recording a database operation."""
362
+ checker = getattr(self.inner, "can_pushdown_numeric_sort", None)
363
+ return bool(checker(query, sort)) if callable(checker) else False
364
+
360
365
  async def graph_edge_page(
361
366
  self, node_id: str, *, after: Optional[str] = None, limit: int = 50
362
367
  ) -> List[Dict[str, Any]]:
@@ -416,6 +416,17 @@ class Database(ABC):
416
416
  """Whether the current adapter provides native graph fact summaries."""
417
417
  return False
418
418
 
419
+ def can_pushdown_numeric_sort(
420
+ self, query: Dict[str, Any], sort: List[Tuple[str, int]]
421
+ ) -> bool:
422
+ """Whether this query/order can remain native for number/null keys.
423
+
424
+ This is compiler coverage, not a data-type or permission proof. The
425
+ caller must establish homogeneous numeric/null values for non-ID
426
+ keys. Unsupported adapters refuse; no query is executed here.
427
+ """
428
+ return False
429
+
419
430
  async def graph_node_batch(self, ids: List[str]) -> Dict[str, Dict[str, Any]]:
420
431
  """Fetch raw projection nodes; wrappers bypass stale record caches."""
421
432
  return await self.find_many("node", ids)
@@ -363,6 +363,16 @@ class PostgresDB(Database):
363
363
  supports_native_projected_reads: bool = True
364
364
  supports_native_graph_binding_summary: bool = True
365
365
 
366
+ def can_pushdown_numeric_sort(
367
+ self, query: Dict[str, Any], sort: List[Tuple[str, int]]
368
+ ) -> bool:
369
+ """Report complete compiler coverage without fetching or granting data."""
370
+ return (
371
+ bool(sort)
372
+ and translate_query(query) is not None
373
+ and translate_sort(sort) is not None
374
+ )
375
+
366
376
  def __init__(
367
377
  self,
368
378
  dsn: Optional[str] = None,
@@ -2586,11 +2596,58 @@ class PostgresTransaction(Transaction):
2586
2596
  self._operation_lock = _TaskReentrantLock()
2587
2597
  self._bootstrapped_collections: Set[str] = set()
2588
2598
  self._closing = False
2599
+ # Freeze the tenant used when the held transaction was opened. Later
2600
+ # ambient tenant changes cannot select a different logical lock scope.
2601
+ self._lock_scope = (db.schema_name, current_tenant())
2589
2602
 
2590
2603
  def _ensure_active(self) -> None:
2591
2604
  if self._closing or not self.is_active or self._connection is None:
2592
2605
  raise DatabaseError("PostgreSQL transaction is no longer active")
2593
2606
 
2607
+ @_serialized_transaction_operation
2608
+ async def lock_record(
2609
+ self, collection: str, record_id: str, *, shared: bool = False
2610
+ ) -> Optional[Dict[str, Any]]:
2611
+ """Read and lock one exact ID on the held, tenant-scoped connection."""
2612
+ if not isinstance(record_id, str) or not record_id or type(shared) is not bool:
2613
+ raise ValueError("A record ID and boolean shared mode are required")
2614
+ col = _safe_collection(collection)
2615
+ schema = _safe_collection(self._db.schema_name)
2616
+ await self._db._bootstrap_collection(
2617
+ collection,
2618
+ connection=self._connection,
2619
+ pending=self._bootstrapped_collections,
2620
+ )
2621
+ mode = "SHARE" if shared else "UPDATE"
2622
+ row = await self._connection.fetchrow(
2623
+ f"SELECT data FROM {schema}.{col} WHERE id=$1 FOR {mode}", record_id
2624
+ )
2625
+ return self._db._record_from_row(row) if row is not None else None
2626
+
2627
+ @_serialized_transaction_operation
2628
+ async def advisory_lock(
2629
+ self, namespace: str, key: str, *, shared: bool = False
2630
+ ) -> None:
2631
+ """Order cooperating logical-key users across connections and workers.
2632
+
2633
+ PostgreSQL scopes advisory locks to the database; schema and the opening
2634
+ tenant are included in the bound namespace. Hash collisions can only
2635
+ cause additional contention. Locks disappear on commit or rollback.
2636
+ """
2637
+ if (
2638
+ not isinstance(namespace, str)
2639
+ or not namespace
2640
+ or not isinstance(key, str)
2641
+ or not key
2642
+ or type(shared) is not bool
2643
+ ):
2644
+ raise ValueError("A namespace, key and boolean shared mode are required")
2645
+ function = "pg_advisory_xact_lock_shared" if shared else "pg_advisory_xact_lock"
2646
+ scope = json.dumps([*self._lock_scope, namespace], separators=(",", ":"))
2647
+ await self._connection.execute(
2648
+ f"SELECT {function}(hashtext($1), hashtext($2))", scope, key
2649
+ )
2650
+
2594
2651
  @_serialized_transaction_operation
2595
2652
  async def save(self, collection: str, data: Dict[str, Any]) -> Dict[str, Any]:
2596
2653
  """Upsert ``data`` into ``collection`` within this transaction."""
@@ -38,6 +38,27 @@ class Transaction(ABC):
38
38
  self.is_committed = False
39
39
  self.is_rolled_back = False
40
40
 
41
+ async def lock_record(
42
+ self, collection: str, record_id: str, *, shared: bool = False
43
+ ) -> Optional[Dict[str, Any]]:
44
+ """Lock an existing raw record until completion, without modifying it.
45
+
46
+ Shared peers may coexist; exclusive locks and record writes wait.
47
+ Missing records return None and are not protected against insertion.
48
+ Unsupported adapters refuse rather than claiming portable ordering.
49
+ """
50
+ raise NotImplementedError("This transaction does not support record locks")
51
+
52
+ async def advisory_lock(
53
+ self, namespace: str, key: str, *, shared: bool = False
54
+ ) -> None:
55
+ """Hold a cooperating logical-key lock until commit or rollback.
56
+
57
+ This does not lock records or grant application access. All logical
58
+ writers must participate; unsupported adapters explicitly refuse.
59
+ """
60
+ raise NotImplementedError("This transaction does not support advisory locks")
61
+
41
62
  @abstractmethod
42
63
  async def save(self, collection: str, data: Dict[str, Any]) -> Dict[str, Any]:
43
64
  """Save a record within this transaction.
@@ -9,4 +9,4 @@ The GitHub Actions workflow will automatically create a git tag and publish to P
9
9
  # - MAJOR: Breaking changes
10
10
  # - MINOR: New features or breaking changes while pre-1.0
11
11
  # - PATCH: Bug fixes, backward compatible
12
- __version__ = "0.2.4"
12
+ __version__ = "0.2.5"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: jvspatial
3
- Version: 0.2.4
3
+ Version: 0.2.5
4
4
  Summary: An asynchronous object-spatial Python library for persistence and business logic application layers.
5
5
  Author-email: "TrueSelph Inc." <adminh@trueselph.com>
6
6
  License: MIT
@@ -48,14 +48,14 @@ Provides-Extra: pgvector
48
48
  Requires-Dist: asyncpg>=0.29.0; extra == "pgvector"
49
49
  Requires-Dist: pgvector>=0.2.5; extra == "pgvector"
50
50
  Provides-Extra: dev
51
- Requires-Dist: pytest<9.2,>=7.0; extra == "dev"
51
+ Requires-Dist: pytest<9.3,>=7.0; extra == "dev"
52
52
  Requires-Dist: pytest-asyncio>=0.21.0; extra == "dev"
53
53
  Requires-Dist: pytest-benchmark>=4.0.0; extra == "dev"
54
54
  Requires-Dist: httpx>=0.24.0; extra == "dev"
55
55
  Requires-Dist: pre-commit>=3.0.0; extra == "dev"
56
56
  Requires-Dist: python-dotenv>=1.0.0; extra == "dev"
57
57
  Provides-Extra: test
58
- Requires-Dist: pytest<9.2,>=7.0; extra == "test"
58
+ Requires-Dist: pytest<9.3,>=7.0; extra == "test"
59
59
  Requires-Dist: pytest-asyncio>=0.21.0; extra == "test"
60
60
  Requires-Dist: pytest-cov>=4.0.0; extra == "test"
61
61
  Requires-Dist: pytest-benchmark>=4.0.0; extra == "test"
@@ -28,7 +28,7 @@ psutil>=5.9.0
28
28
  redis[hiredis]>=5.0.0
29
29
 
30
30
  [dev]
31
- pytest<9.2,>=7.0
31
+ pytest<9.3,>=7.0
32
32
  pytest-asyncio>=0.21.0
33
33
  pytest-benchmark>=4.0.0
34
34
  httpx>=0.24.0
@@ -54,7 +54,7 @@ psutil>=5.9.0
54
54
  python-dotenv>=1.0.0
55
55
 
56
56
  [test]
57
- pytest<9.2,>=7.0
57
+ pytest<9.3,>=7.0
58
58
  pytest-asyncio>=0.21.0
59
59
  pytest-cov>=4.0.0
60
60
  pytest-benchmark>=4.0.0
@@ -68,7 +68,7 @@ pgvector = [
68
68
  "pgvector>=0.2.5", # pgvector codec for asyncpg (HNSW/IVFFlat index support)
69
69
  ]
70
70
  dev = [
71
- "pytest>=7.0,<9.2", # pytest-benchmark 5.3 still uses the removed _nodeid API.
71
+ "pytest>=7.0,<9.3", # pytest-benchmark 5.3 still uses the removed _nodeid API.
72
72
  "pytest-asyncio>=0.21.0",
73
73
  "pytest-benchmark>=4.0.0",
74
74
  "httpx>=0.24.0",
@@ -76,7 +76,7 @@ dev = [
76
76
  "python-dotenv>=1.0.0",
77
77
  ]
78
78
  test = [
79
- "pytest>=7.0,<9.2", # Keep the full suite and benchmark lane compatible.
79
+ "pytest>=7.0,<9.3", # Keep the full suite and benchmark lane compatible.
80
80
  "pytest-asyncio>=0.21.0",
81
81
  "pytest-cov>=4.0.0",
82
82
  "pytest-benchmark>=4.0.0",
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes