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.
- {jvspatial-0.2.4/jvspatial.egg-info → jvspatial-0.2.5}/PKG-INFO +3 -3
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/__init__.py +2 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/db/_cache.py +5 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/db/_observable.py +5 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/db/database.py +11 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/db/postgres.py +57 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/db/transaction.py +21 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/version.py +1 -1
- {jvspatial-0.2.4 → jvspatial-0.2.5/jvspatial.egg-info}/PKG-INFO +3 -3
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial.egg-info/requires.txt +2 -2
- {jvspatial-0.2.4 → jvspatial-0.2.5}/pyproject.toml +2 -2
- {jvspatial-0.2.4 → jvspatial-0.2.5}/AUTHORS +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/LICENSE +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/README.md +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/__init__.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/_route_utils.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/auth/_session_store.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/auth/api_key_service.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/auth/cleanup.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/auth/config.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/auth/enhanced.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/auth/models.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/auth/oauth/__init__.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/auth/oauth/bridge.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/auth/oauth/client_adapter.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/auth/oauth/dcr.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/auth/oauth/denylist.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/auth/oauth/keys.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/auth/oauth/metadata.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/auth/oauth/models.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/auth/oauth/refresh_store.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/auth/oauth/requests.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/auth/oauth/resource.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/auth/oauth/revocation.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/auth/oauth/routes.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/auth/oauth/server.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/auth/openapi_config.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/auth/rbac.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/auth/service.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/components/__init__.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/components/app_builder.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/components/auth_configurator.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/components/auth_middleware.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/components/database_configurator.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/components/endpoint_auth_resolver.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/components/endpoint_manager.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/components/error_handler.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/components/logging_config.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/components/path_matcher.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/config.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/config_groups.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/constants.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/context.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/decorators/__init__.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/decorators/deferred_registry.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/decorators/field.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/decorators/function_wrappers.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/decorators/route.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/decorators/route_config.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/deferred_invoke_route.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/endpoints/__init__.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/endpoints/factory.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/endpoints/graph_visualization.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/endpoints/metadata.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/endpoints/registry.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/endpoints/response.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/endpoints/router.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/endpoints/walker_executor.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/exceptions.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/integrations/__init__.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/integrations/scheduler/__init__.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/integrations/scheduler/decorators.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/integrations/scheduler/middleware.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/integrations/scheduler/models.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/integrations/scheduler/scheduler.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/integrations/storage/__init__.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/integrations/storage/service.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/integrations/webhooks/__init__.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/integrations/webhooks/helpers.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/integrations/webhooks/middleware.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/integrations/webhooks/models.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/integrations/webhooks/utils.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/integrations/webhooks/webhook_auth.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/middleware/__init__.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/middleware/manager.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/middleware/rate_limit.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/middleware/rate_limit_backend.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/server.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/server_app_factory.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/server_configurator.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/server_lifecycle.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/server_registration.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/server_run.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/services/__init__.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/services/discovery.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/services/file_storage.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/services/lifecycle.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/utils/__init__.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/utils/path_utils.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/api/utils/reload.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/async_utils/__init__.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/cache/__init__.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/cache/base.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/cache/factory.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/cache/layered.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/cache/memory.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/cache/redis.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/cli.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/__init__.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/annotations.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/context.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/decorators.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/entities/__init__.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/entities/_visit_hooks.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/entities/edge.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/entities/node.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/entities/node_query.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/entities/object.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/entities/root.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/entities/walker.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/entities/walker_components/__init__.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/entities/walker_components/event_system.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/entities/walker_components/protection.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/entities/walker_components/trail_store.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/entities/walker_components/walker_queue.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/entities/walker_components/walker_trail.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/events.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/graph.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/graph_context_config.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/graph_expansion.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/graph_payload.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/graph_projection.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/migrations.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/mixins/__init__.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/mixins/deferred_save.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/pager.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/utils.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/validate.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/db/__init__.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/db/_atomic.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/db/_graph_binding_postgres.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/db/_path_locks.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/db/_postgres_translate.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/db/_sqlite_translate.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/db/dynamodb.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/db/factory.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/db/graph_bindings.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/db/jsondb.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/db/manager.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/db/mongodb.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/db/query.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/db/sqlite.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/db/work_claim.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/dev_tools/__init__.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/env.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/env_adapter.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/exceptions.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/logging/__init__.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/logging/config.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/logging/custom_levels.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/logging/endpoints.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/logging/filter_utils.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/logging/handler.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/logging/models.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/logging/service.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/memory/__init__.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/observability/__init__.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/observability/metrics.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/observability/otel.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/observability/tracing.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/profiling/__init__.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/py.typed +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/runtime/__init__.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/runtime/eventbridge_readiness.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/runtime/lwa.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/runtime/serverless.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/serverless/__init__.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/serverless/deferred_invoke.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/serverless/factory.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/serverless/tasks/__init__.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/serverless/tasks/aws_lambda.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/serverless/tasks/aws_sqs.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/serverless/tasks/base.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/serverless/tasks/stub.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/serverless/tasks/sync.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/storage/__init__.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/storage/exceptions.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/storage/interfaces/__init__.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/storage/interfaces/_stream.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/storage/interfaces/base.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/storage/interfaces/local.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/storage/interfaces/s3.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/storage/internal_markers.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/storage/managers/__init__.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/storage/managers/proxy.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/storage/models.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/storage/security/__init__.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/storage/security/path_sanitizer.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/storage/security/validator.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/testing/__init__.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/utils/__init__.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/utils/context.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/utils/decorators.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/utils/deprecation.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/utils/factory.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/utils/normalization.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/utils/retry.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/utils/serialization.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/utils/stability.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/utils/types.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/utils/validation.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial.egg-info/SOURCES.txt +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial.egg-info/dependency_links.txt +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial.egg-info/entry_points.txt +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial.egg-info/top_level.txt +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/setup.cfg +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/tests/test_config.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/tests/test_create_task.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/tests/test_env.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/tests/test_env_adapter_eventbridge_validation.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/tests/test_env_adapter_postgres.py +0 -0
- {jvspatial-0.2.4 → jvspatial-0.2.5}/tests/test_node_operations.py +0 -0
- {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.
|
|
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.
|
|
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.
|
|
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.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: jvspatial
|
|
3
|
-
Version: 0.2.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/entities/walker_components/event_system.py
RENAMED
|
File without changes
|
|
File without changes
|
{jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/entities/walker_components/trail_store.py
RENAMED
|
File without changes
|
{jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/entities/walker_components/walker_queue.py
RENAMED
|
File without changes
|
{jvspatial-0.2.4 → jvspatial-0.2.5}/jvspatial/core/entities/walker_components/walker_trail.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|