diracx 0.0.6__tar.gz → 0.0.7__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.
- {diracx-0.0.6 → diracx-0.0.7}/CHANGELOG.md +8 -0
- {diracx-0.0.6 → diracx-0.0.7}/PKG-INFO +1 -1
- {diracx-0.0.6 → diracx-0.0.7}/diracx-core/src/diracx/core/utils.py +36 -13
- {diracx-0.0.6 → diracx-0.0.7}/diracx-core/tests/test_utils.py +117 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/pyproject.toml +1 -1
- {diracx-0.0.6 → diracx-0.0.7}/.coveragerc +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/.gitattributes +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/.github/dependabot.yml +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/.github/workflows/deployment.yml +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/.github/workflows/generate_pixi_tasks_doc.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/.github/workflows/integration.yml +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/.github/workflows/main.yml +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/.github/workflows/release-please.yml +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/.github/workflows/update_chart_version.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/.github/workflows/update_security_txt_expiry.yml +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/.github/workflows/vulnerabilities.yml +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/.gitignore +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/.pre-commit-config.yaml +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/.readthedocs.yaml +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/LICENSE +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/MANIFEST.in +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/README.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/codecov.yml +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/containers/client/Dockerfile +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/containers/services/Dockerfile +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-api/README.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-api/pyproject.toml +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-api/src/diracx/api/__init__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-api/src/diracx/api/jobs.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-api/src/diracx/api/py.typed +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-api/src/diracx/api/utils.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-api/tests/test_jobs.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-api/tests/test_utils.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-cli/README.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-cli/pyproject.toml +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-cli/src/diracx/cli/__init__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-cli/src/diracx/cli/__main__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-cli/src/diracx/cli/auth.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-cli/src/diracx/cli/config.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-cli/src/diracx/cli/internal/__init__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-cli/src/diracx/cli/internal/config.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-cli/src/diracx/cli/internal/legacy.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-cli/src/diracx/cli/jobs.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-cli/src/diracx/cli/py.typed +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-cli/src/diracx/cli/utils.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-cli/tests/legacy/cs_sync/integration_test.cfg +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-cli/tests/legacy/cs_sync/integration_test.yaml +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-cli/tests/legacy/cs_sync/integration_test_buggy.cfg +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-cli/tests/legacy/cs_sync/integration_test_secret.cfg +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-cli/tests/legacy/cs_sync/test_cssync.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-cli/tests/legacy/test_legacy.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-cli/tests/test_internal.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-cli/tests/test_jobs.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-cli/tests/test_login.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-client/README.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-client/pyproject.toml +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/_diracx_client_importer.pth +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/_client_importer.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/__init__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/_generated/__init__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/_generated/_client.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/_generated/_configuration.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/_generated/_patch.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/_generated/_serialization.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/_generated/_utils/__init__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/_generated/_utils/serialization.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/_generated/_utils/utils.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/_generated/_vendor.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/_generated/aio/__init__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/_generated/aio/_client.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/_generated/aio/_configuration.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/_generated/aio/_patch.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/_generated/aio/_vendor.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/_generated/aio/operations/__init__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/_generated/aio/operations/_operations.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/_generated/aio/operations/_patch.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/_generated/models/__init__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/_generated/models/_enums.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/_generated/models/_models.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/_generated/models/_patch.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/_generated/operations/__init__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/_generated/operations/_operations.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/_generated/operations/_patch.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/_generated/py.typed +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/aio.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/models.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/patches/auth/aio.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/patches/auth/common.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/patches/auth/sync.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/patches/client/aio.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/patches/client/common.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/patches/client/sync.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/patches/jobs/aio.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/patches/jobs/common.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/patches/jobs/sync.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/patches/utils.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/py.typed +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/sync.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-client/tests/test_auth.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-core/README.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-core/pyproject.toml +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-core/src/diracx/core/__init__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-core/src/diracx/core/config/__init__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-core/src/diracx/core/config/schema.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-core/src/diracx/core/config/sources.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-core/src/diracx/core/exceptions.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-core/src/diracx/core/extensions.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-core/src/diracx/core/models.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-core/src/diracx/core/preferences.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-core/src/diracx/core/properties.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-core/src/diracx/core/py.typed +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-core/src/diracx/core/resources.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-core/src/diracx/core/s3.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-core/src/diracx/core/settings.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-core/tests/test_config_source.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-core/tests/test_entry_points.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-core/tests/test_extensions.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-core/tests/test_resources.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-core/tests/test_s3.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-core/tests/test_schema_legacy_adaptor.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-core/tests/test_secrets.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-db/README.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-db/pyproject.toml +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/__init__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/__main__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/exceptions.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/os/__init__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/os/job_parameters.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/os/utils.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/py.typed +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/sql/__init__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/sql/auth/__init__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/sql/auth/db.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/sql/auth/schema.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/sql/dummy/__init__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/sql/dummy/db.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/sql/dummy/schema.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/sql/job/__init__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/sql/job/db.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/sql/job/schema.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/sql/job_logging/__init__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/sql/job_logging/db.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/sql/job_logging/schema.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/sql/pilot_agents/__init__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/sql/pilot_agents/db.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/sql/pilot_agents/schema.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/sql/sandbox_metadata/__init__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/sql/sandbox_metadata/db.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/sql/sandbox_metadata/schema.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/sql/task_queue/__init__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/sql/task_queue/db.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/sql/task_queue/schema.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/sql/utils/__init__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/sql/utils/base.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/sql/utils/functions.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/sql/utils/types.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-db/tests/auth/test_authorization_flow.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-db/tests/auth/test_device_flow.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-db/tests/auth/test_refresh_token.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-db/tests/jobs/test_job_db.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-db/tests/jobs/test_job_logging_db.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-db/tests/jobs/test_sandbox_metadata.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-db/tests/opensearch/test_connection.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-db/tests/opensearch/test_index_template.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-db/tests/opensearch/test_search.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-db/tests/pilot_agents/__init__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-db/tests/pilot_agents/test_pilot_agents_db.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-db/tests/test_dummy_db.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-db/tests/test_freeze_time.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-db/tests/utils/test_uuid.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-logic/README.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-logic/pyproject.toml +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-logic/src/diracx/logic/__init__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-logic/src/diracx/logic/__main__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-logic/src/diracx/logic/auth/__init__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-logic/src/diracx/logic/auth/authorize_code_flow.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-logic/src/diracx/logic/auth/device_flow.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-logic/src/diracx/logic/auth/management.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-logic/src/diracx/logic/auth/token.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-logic/src/diracx/logic/auth/utils.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-logic/src/diracx/logic/auth/well_known.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-logic/src/diracx/logic/jobs/__init__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-logic/src/diracx/logic/jobs/query.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-logic/src/diracx/logic/jobs/sandboxes.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-logic/src/diracx/logic/jobs/status.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-logic/src/diracx/logic/jobs/submission.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-logic/src/diracx/logic/jobs/utils.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-logic/src/diracx/logic/py.typed +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-logic/src/diracx/logic/task_queues/__init__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-logic/src/diracx/logic/task_queues/priority.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-logic/tests/jobs/test_sandboxes.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-logic/tests/jobs/test_status.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/README.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/src/diracx/routers/__init__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/src/diracx/routers/access_policies.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/src/diracx/routers/auth/__init__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/src/diracx/routers/auth/authorize_code_flow.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/src/diracx/routers/auth/device_flow.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/src/diracx/routers/auth/management.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/src/diracx/routers/auth/token.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/src/diracx/routers/auth/utils.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/src/diracx/routers/auth/well_known.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/src/diracx/routers/configuration.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/src/diracx/routers/dependencies.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/src/diracx/routers/factory.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/src/diracx/routers/fastapi_classes.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/src/diracx/routers/health/__init__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/src/diracx/routers/health/probes.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/src/diracx/routers/jobs/__init__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/src/diracx/routers/jobs/access_policies.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/src/diracx/routers/jobs/legacy.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/src/diracx/routers/jobs/query.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/src/diracx/routers/jobs/sandboxes.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/src/diracx/routers/jobs/status.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/src/diracx/routers/jobs/submission.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/src/diracx/routers/otel.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/src/diracx/routers/py.typed +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/src/diracx/routers/utils/__init__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/src/diracx/routers/utils/users.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/tests/auth/test_legacy_exchange.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/tests/auth/test_standard.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/tests/data/idp-server.invalid/.well-known/openid-configuration +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/tests/health/test_probes.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/tests/jobs/conftest.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/tests/jobs/test_query.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/tests/jobs/test_sandboxes.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/tests/jobs/test_status.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/tests/jobs/test_wms_access_policy.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/tests/test_config_manager.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/tests/test_generic.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/tests/test_policy.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-testing/README.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-testing/pyproject.toml +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-testing/src/diracx/testing/__init__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-testing/src/diracx/testing/__main__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-testing/src/diracx/testing/client_generation.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-testing/src/diracx/testing/client_generation_pytest.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-testing/src/diracx/testing/dummy_osdb.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-testing/src/diracx/testing/entrypoints.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-testing/src/diracx/testing/mock_osdb.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-testing/src/diracx/testing/osdb.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-testing/src/diracx/testing/routers.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-testing/src/diracx/testing/scripts/collect_demo_coverage.sh +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-testing/src/diracx/testing/time.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/diracx-testing/src/diracx/testing/utils.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/SECURITY.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/admin/explanations/auth-with-diracx.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/admin/explanations/auth-with-external.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/admin/explanations/configuration.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/admin/explanations/opentelemetry.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/admin/explanations/sandbox-store.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/admin/explanations/user-management.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/admin/how-to/install/connect.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/admin/how-to/install/convert-cs.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/admin/how-to/install/embracing.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/admin/how-to/install/index.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/admin/how-to/install/minimal-requirements.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/admin/how-to/install/register-a-vo.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/admin/how-to/install/register-the-admin-vo.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/admin/index.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/admin/reference/env-variables.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/admin/reference/security_model.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/admin/reference/settings-and-preferences.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/admin/tutorials/authentication.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/assets/css/extra.css +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/assets/css/fontawesome-all.min.css +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/assets/css/images/arrow.svg +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/assets/css/images/overlay.png +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/assets/css/main.css +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/assets/home.html +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/assets/images/diracx-logo-square.svg +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/assets/images/logo.svg +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/assets/styles/extra.css +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/assets/webfonts/fa-brands-400.woff2 +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/assets/webfonts/fa-solid-900.woff +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/dev/explanations/components/api.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/dev/explanations/components/cli.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/dev/explanations/components/client.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/dev/explanations/components/db.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/dev/explanations/components/index.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/dev/explanations/components/routes.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/dev/explanations/designing-functionality.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/dev/explanations/extensions.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/dev/explanations/index.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/dev/explanations/testing.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/dev/how-to/add-a-cli-command.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/dev/how-to/add-a-db.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/dev/how-to/add-a-route.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/dev/how-to/add-a-setting.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/dev/how-to/add-a-task.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/dev/how-to/add-a-test.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/dev/how-to/add-functionality/index.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/dev/how-to/client-customization.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/dev/how-to/client-extension.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/dev/how-to/client-generation.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/dev/how-to/contribute.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/dev/how-to/develop-legacy-dirac.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/dev/how-to/extend-diracx/index.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/dev/how-to/use-the-demo/index.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/dev/how-to/use-the-demo/swagger.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/dev/how-to/use-the-demo/web.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/dev/index.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/dev/reference/application-state.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/dev/reference/client-metapathfinder.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/dev/reference/coding-conventions.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/dev/reference/configuration.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/dev/reference/db-transaction-model.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/dev/reference/dependency-injection.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/dev/reference/entrypoints.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/dev/reference/env-variables.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/dev/reference/pixi-tasks.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/dev/reference/security-policies.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/dev/reference/security-properties.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/dev/reference/test-recipes.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/dev/reference/writing-tests.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/dev/tutorials/advanced-tutorial.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/dev/tutorials/develop-web.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/dev/tutorials/getting-started.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/dev/tutorials/larger-developments.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/dev/tutorials/making-changes.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/dev/tutorials/play-with-auth.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/dev/tutorials/run-locally.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/dev/tutorials/write-docs.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/index.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/overrides/main.html +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/roadmap.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/user/index.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/user/reference/client-configuration.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/user/reference/known-installations.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/user/reference/programmatic-usage/command-line-interface.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/user/reference/programmatic-usage/https-interface.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/user/reference/programmatic-usage/index.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/user/reference/programmatic-usage/python-interface.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/docs/user/tutorials/getting-started.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/containers/client/Dockerfile +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/containers/services/Dockerfile +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/.github/workflows/main.yml +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/README.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-api/README.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-api/pyproject.toml +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-api/src/gubbins/api/__init__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-api/src/gubbins/api/py.typed +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-api/tests/test_gubbins_api.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-cli/README.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-cli/pyproject.toml +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-cli/src/gubbins/cli/__init__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-cli/src/gubbins/cli/config.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-cli/src/gubbins/cli/lollygag.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-cli/src/gubbins/cli/py.typed +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-cli/tests/test_gubbins_cli.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/README.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/pyproject.toml +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/src/gubbins/client/__init__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/__init__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_client.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_configuration.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_patch.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_serialization.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_utils/__init__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_utils/serialization.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_utils/utils.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_vendor.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/__init__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/_client.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/_configuration.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/_patch.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/_vendor.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/operations/__init__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/operations/_operations.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/operations/_patch.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/models/__init__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/models/_enums.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/models/_models.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/operations/__init__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/operations/_operations.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/operations/_patch.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/py.typed +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/src/gubbins/client/aio.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/src/gubbins/client/models.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/src/gubbins/client/py.typed +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/src/gubbins/client/sync.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/tests/test_gubbins_client.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-core/README.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-core/pyproject.toml +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-core/src/gubbins/core/__init__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-core/src/gubbins/core/config/__init__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-core/src/gubbins/core/config/schema.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-core/src/gubbins/core/models.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-core/src/gubbins/core/properties.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-core/src/gubbins/core/py.typed +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-core/tests/test_config.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-core/tests/test_properties.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-db/README.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-db/pyproject.toml +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-db/src/gubbins/db/__init__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-db/src/gubbins/db/py.typed +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-db/src/gubbins/db/sql/__init__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-db/src/gubbins/db/sql/jobs/__init__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-db/src/gubbins/db/sql/jobs/db.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-db/src/gubbins/db/sql/jobs/schema.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-db/src/gubbins/db/sql/lollygag/__init__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-db/src/gubbins/db/sql/lollygag/db.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-db/src/gubbins/db/sql/lollygag/schema.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-db/tests/test_gubbins_job_db.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-db/tests/test_lollygag_db.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-logic/README.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-logic/pyproject.toml +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-logic/src/gubbins/logic/__init__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-logic/src/gubbins/logic/auth/__init__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-logic/src/gubbins/logic/auth/well_known.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-logic/src/gubbins/logic/lollygag/__init__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-logic/src/gubbins/logic/lollygag/lollygag.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-logic/src/gubbins/logic/py.typed +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-logic/tests/test_gubbins_logic.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-routers/README.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-routers/pyproject.toml +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-routers/src/gubbins/routers/__init__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-routers/src/gubbins/routers/dependencies.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-routers/src/gubbins/routers/lollygag/__init__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-routers/src/gubbins/routers/lollygag/access_policy.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-routers/src/gubbins/routers/lollygag/lollygag.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-routers/src/gubbins/routers/py.typed +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-routers/src/gubbins/routers/well_known.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-routers/tests/data/idp-server.invalid/.well-known/openid-configuration +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-routers/tests/test_gubbins_job_manager.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-routers/tests/test_lollybag.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-routers/tests/test_wellknown.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-testing/README.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-testing/pyproject.toml +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-testing/src/gubbins/testing/__init__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/pixi.toml +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/pyproject.toml +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/release.notes +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins-charts/.gitignore +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins-charts/Chart.yaml +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins-charts/README.md +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins-charts/values.yaml +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins_values.yaml +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/mkdocs.yml +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/pixi.toml +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/pyproject.toml +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/run_local.sh +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/tests/__init__.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/tests/make_token_local.py +0 -0
- {diracx-0.0.6 → diracx-0.0.7}/tests/test_generic.py +0 -0
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.0.7](https://github.com/DIRACGrid/diracx/compare/v0.0.6...v0.0.7) (2026-01-20)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Bug Fixes
|
|
7
|
+
|
|
8
|
+
* add logging and retry for cache population failures ([#736](https://github.com/DIRACGrid/diracx/issues/736)) ([b899a8d](https://github.com/DIRACGrid/diracx/commit/b899a8d207a42b232fbe4062f329a32d64c37ec3))
|
|
9
|
+
* require fastapi>=0.121.0 for Depends scope parameter ([#737](https://github.com/DIRACGrid/diracx/issues/737)) ([fb15f9c](https://github.com/DIRACGrid/diracx/commit/fb15f9c5bb9d36568e37f0fae7a2a78995f02d51))
|
|
10
|
+
|
|
3
11
|
## [0.0.6](https://github.com/DIRACGrid/diracx/compare/v0.0.5...v0.0.6) (2026-01-20)
|
|
4
12
|
|
|
5
13
|
|
|
@@ -12,13 +12,14 @@ __all__ = [
|
|
|
12
12
|
|
|
13
13
|
import fcntl
|
|
14
14
|
import json
|
|
15
|
+
import logging
|
|
15
16
|
import os
|
|
16
17
|
import re
|
|
17
18
|
import stat
|
|
18
19
|
import threading
|
|
19
20
|
from collections import defaultdict
|
|
20
21
|
from collections.abc import Callable
|
|
21
|
-
from concurrent.futures import Future, ThreadPoolExecutor
|
|
22
|
+
from concurrent.futures import Future, ThreadPoolExecutor
|
|
22
23
|
from datetime import datetime, timedelta, timezone
|
|
23
24
|
from pathlib import Path
|
|
24
25
|
from typing import Any, AsyncIterable, TypeVar, overload
|
|
@@ -28,6 +29,8 @@ from cachetools import Cache, TTLCache
|
|
|
28
29
|
from diracx.core.exceptions import NotReadyError
|
|
29
30
|
from diracx.core.models import TokenResponse
|
|
30
31
|
|
|
32
|
+
logger = logging.getLogger(__name__)
|
|
33
|
+
|
|
31
34
|
EXPIRES_GRACE_SECONDS = 15
|
|
32
35
|
|
|
33
36
|
T = TypeVar("T")
|
|
@@ -208,15 +211,16 @@ class TwoLevelCache:
|
|
|
208
211
|
This method is thread-safe and handles concurrent requests for the same key.
|
|
209
212
|
|
|
210
213
|
"""
|
|
211
|
-
if
|
|
212
|
-
return
|
|
214
|
+
if key in self.soft_cache:
|
|
215
|
+
return self.soft_cache[key]
|
|
213
216
|
if self.locks[key].acquire(blocking=blocking):
|
|
214
217
|
try:
|
|
215
218
|
if key not in self.futures:
|
|
216
219
|
self.futures[key] = self.pool.submit(self._work, key, populate_func)
|
|
217
|
-
if
|
|
220
|
+
if key in self.hard_cache:
|
|
218
221
|
# The soft cache will be updated by _work so we can fill the soft
|
|
219
|
-
# cache to avoid later requests
|
|
222
|
+
# cache to avoid later requests needing to acquire the lock.
|
|
223
|
+
result = self.hard_cache[key]
|
|
220
224
|
self.soft_cache[key] = result
|
|
221
225
|
return result
|
|
222
226
|
future = self.futures[key]
|
|
@@ -227,13 +231,17 @@ class TwoLevelCache:
|
|
|
227
231
|
# as _work acquires the lock before filling the caches. This also
|
|
228
232
|
# means we can guarantee that the future has not yet been removed
|
|
229
233
|
# from the futures dict.
|
|
230
|
-
wait(
|
|
234
|
+
# Use result() instead of wait() to propagate any exceptions
|
|
235
|
+
future.result()
|
|
231
236
|
return self.hard_cache[key]
|
|
232
237
|
|
|
233
238
|
# If the lock is not acquired we're in a non-blocking mode, try to get the
|
|
234
239
|
# value from the hard cache. If it's not there, raise NotReadyError.
|
|
235
|
-
if
|
|
236
|
-
return
|
|
240
|
+
if key in self.hard_cache:
|
|
241
|
+
return self.hard_cache[key]
|
|
242
|
+
logger.debug(
|
|
243
|
+
"Cache key %r not ready yet, background population in progress", key
|
|
244
|
+
)
|
|
237
245
|
raise NotReadyError(f"Cache key {key} is not ready yet.")
|
|
238
246
|
|
|
239
247
|
def _work(self, key: str, populate_func: Callable[[], Any]) -> None:
|
|
@@ -251,11 +259,26 @@ class TwoLevelCache:
|
|
|
251
259
|
This method is not intended to be called directly by users of the class.
|
|
252
260
|
|
|
253
261
|
"""
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
262
|
+
success = False
|
|
263
|
+
result = None
|
|
264
|
+
try:
|
|
265
|
+
result = populate_func()
|
|
266
|
+
success = True
|
|
267
|
+
except Exception:
|
|
268
|
+
logger.error(
|
|
269
|
+
"Failed to populate cache key %r, will retry on next request",
|
|
270
|
+
key,
|
|
271
|
+
exc_info=True,
|
|
272
|
+
)
|
|
273
|
+
raise
|
|
274
|
+
finally:
|
|
275
|
+
# Always remove the future so the next request can retry on failure
|
|
276
|
+
# or submit a new refresh task on success
|
|
277
|
+
with self.locks[key]:
|
|
278
|
+
self.futures.pop(key, None)
|
|
279
|
+
if success:
|
|
280
|
+
self.hard_cache[key] = result
|
|
281
|
+
self.soft_cache[key] = result
|
|
259
282
|
|
|
260
283
|
def clear(self):
|
|
261
284
|
"""Clear all caches and reset the thread pool."""
|
|
@@ -8,8 +8,10 @@ from pathlib import Path
|
|
|
8
8
|
|
|
9
9
|
import pytest
|
|
10
10
|
|
|
11
|
+
from diracx.core.exceptions import NotReadyError
|
|
11
12
|
from diracx.core.models import TokenResponse
|
|
12
13
|
from diracx.core.utils import (
|
|
14
|
+
TwoLevelCache,
|
|
13
15
|
dotenv_files_from_environment,
|
|
14
16
|
read_credentials,
|
|
15
17
|
serialize_credentials,
|
|
@@ -182,3 +184,118 @@ def test_read_credentials_valid_file(tmp_path):
|
|
|
182
184
|
assert credentials.expires_in < token_response.expires_in
|
|
183
185
|
assert credentials.token_type == token_response.token_type
|
|
184
186
|
assert credentials.refresh_token == token_response.refresh_token
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
class TestTwoLevelCache:
|
|
190
|
+
"""Tests for TwoLevelCache."""
|
|
191
|
+
|
|
192
|
+
def test_successful_population(self):
|
|
193
|
+
"""Test that cache is populated successfully."""
|
|
194
|
+
cache = TwoLevelCache(soft_ttl=10, hard_ttl=60)
|
|
195
|
+
call_count = 0
|
|
196
|
+
|
|
197
|
+
def populate():
|
|
198
|
+
nonlocal call_count
|
|
199
|
+
call_count += 1
|
|
200
|
+
return "test_value"
|
|
201
|
+
|
|
202
|
+
result = cache.get("key", populate)
|
|
203
|
+
assert result == "test_value"
|
|
204
|
+
assert call_count == 1
|
|
205
|
+
|
|
206
|
+
# Second call should use cached value
|
|
207
|
+
result = cache.get("key", populate)
|
|
208
|
+
assert result == "test_value"
|
|
209
|
+
assert call_count == 1
|
|
210
|
+
|
|
211
|
+
def test_failed_population_logs_and_allows_retry(self, caplog):
|
|
212
|
+
"""Test that failed population logs error and allows retry on next request."""
|
|
213
|
+
cache = TwoLevelCache(soft_ttl=10, hard_ttl=60)
|
|
214
|
+
call_count = 0
|
|
215
|
+
|
|
216
|
+
def failing_populate():
|
|
217
|
+
nonlocal call_count
|
|
218
|
+
call_count += 1
|
|
219
|
+
raise ValueError("Test error")
|
|
220
|
+
|
|
221
|
+
# First call should fail and log the error
|
|
222
|
+
with pytest.raises(ValueError, match="Test error"):
|
|
223
|
+
cache.get("key", failing_populate, blocking=True)
|
|
224
|
+
|
|
225
|
+
assert call_count == 1
|
|
226
|
+
assert "Failed to populate cache key 'key'" in caplog.text
|
|
227
|
+
assert "Test error" in caplog.text
|
|
228
|
+
|
|
229
|
+
# Future should be removed, so next call should retry
|
|
230
|
+
with pytest.raises(ValueError, match="Test error"):
|
|
231
|
+
cache.get("key", failing_populate, blocking=True)
|
|
232
|
+
|
|
233
|
+
assert call_count == 2 # Should have retried
|
|
234
|
+
|
|
235
|
+
def test_failed_population_then_success(self):
|
|
236
|
+
"""Test that after a failure, subsequent successful call works."""
|
|
237
|
+
cache = TwoLevelCache(soft_ttl=10, hard_ttl=60)
|
|
238
|
+
should_fail = True
|
|
239
|
+
|
|
240
|
+
def populate():
|
|
241
|
+
if should_fail:
|
|
242
|
+
raise ValueError("Test error")
|
|
243
|
+
return "success_value"
|
|
244
|
+
|
|
245
|
+
# First call fails
|
|
246
|
+
with pytest.raises(ValueError):
|
|
247
|
+
cache.get("key", populate, blocking=True)
|
|
248
|
+
|
|
249
|
+
# Second call succeeds
|
|
250
|
+
should_fail = False
|
|
251
|
+
result = cache.get("key", populate, blocking=True)
|
|
252
|
+
assert result == "success_value"
|
|
253
|
+
|
|
254
|
+
def test_none_return_value_is_cached(self):
|
|
255
|
+
"""Test that None return values are properly cached."""
|
|
256
|
+
cache = TwoLevelCache(soft_ttl=10, hard_ttl=60)
|
|
257
|
+
call_count = 0
|
|
258
|
+
|
|
259
|
+
def populate_none():
|
|
260
|
+
nonlocal call_count
|
|
261
|
+
call_count += 1
|
|
262
|
+
return None
|
|
263
|
+
|
|
264
|
+
result = cache.get("key", populate_none)
|
|
265
|
+
assert result is None
|
|
266
|
+
assert call_count == 1
|
|
267
|
+
|
|
268
|
+
# Second call should use cached None value
|
|
269
|
+
result = cache.get("key", populate_none)
|
|
270
|
+
assert result is None
|
|
271
|
+
assert call_count == 1 # Should not have called populate again
|
|
272
|
+
|
|
273
|
+
def test_non_blocking_raises_not_ready(self):
|
|
274
|
+
"""Test that non-blocking mode raises NotReadyError when cache is empty."""
|
|
275
|
+
import threading
|
|
276
|
+
import time
|
|
277
|
+
|
|
278
|
+
cache = TwoLevelCache(soft_ttl=10, hard_ttl=60)
|
|
279
|
+
started = threading.Event()
|
|
280
|
+
|
|
281
|
+
def slow_populate():
|
|
282
|
+
started.set()
|
|
283
|
+
time.sleep(0.5)
|
|
284
|
+
return "value"
|
|
285
|
+
|
|
286
|
+
def start_slow():
|
|
287
|
+
cache.get("key", slow_populate, blocking=True)
|
|
288
|
+
|
|
289
|
+
# Start population in background
|
|
290
|
+
thread = threading.Thread(target=start_slow)
|
|
291
|
+
thread.start()
|
|
292
|
+
|
|
293
|
+
# Wait until slow_populate has started to avoid race conditions
|
|
294
|
+
assert started.wait(timeout=1.0)
|
|
295
|
+
|
|
296
|
+
# Non-blocking call should raise NotReadyError since cache isn't populated yet
|
|
297
|
+
with pytest.raises(NotReadyError, match="not ready yet"):
|
|
298
|
+
cache.get("key", slow_populate, blocking=False)
|
|
299
|
+
|
|
300
|
+
# Ensure background thread completes
|
|
301
|
+
thread.join()
|
|
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
|
{diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/_generated/_utils/serialization.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/_generated/aio/_configuration.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/_generated/aio/operations/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/_generated/aio/operations/_patch.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/_generated/operations/__init__.py
RENAMED
|
File without changes
|
{diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/_generated/operations/_operations.py
RENAMED
|
File without changes
|
{diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/_generated/operations/_patch.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
|