diracx 0.0.2__tar.gz → 0.0.4__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.2 → diracx-0.0.4}/.github/workflows/deployment.yml +7 -8
- {diracx-0.0.2 → diracx-0.0.4}/.github/workflows/integration.yml +2 -2
- {diracx-0.0.2 → diracx-0.0.4}/.github/workflows/main.yml +26 -15
- {diracx-0.0.2 → diracx-0.0.4}/.github/workflows/update_security_txt_expiry.yml +2 -2
- {diracx-0.0.2 → diracx-0.0.4}/.github/workflows/vulnerabilities.yml +1 -1
- {diracx-0.0.2 → diracx-0.0.4}/.pre-commit-config.yaml +3 -2
- diracx-0.0.4/CHANGELOG.md +45 -0
- {diracx-0.0.2 → diracx-0.0.4}/PKG-INFO +1 -1
- {diracx-0.0.2 → diracx-0.0.4}/diracx-core/src/diracx/core/config/schema.py +19 -16
- {diracx-0.0.2 → diracx-0.0.4}/diracx-core/src/diracx/core/settings.py +1 -1
- diracx-0.0.4/diracx-core/tests/test_schema_legacy_adaptor.py +179 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-logic/src/diracx/logic/jobs/sandboxes.py +1 -3
- {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/src/diracx/routers/dependencies.py +12 -7
- {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/src/diracx/routers/jobs/sandboxes.py +1 -2
- {diracx-0.0.2 → diracx-0.0.4}/diracx-testing/src/diracx/testing/utils.py +11 -3
- {diracx-0.0.2 → diracx-0.0.4}/docs/dev/explanations/extensions.md +1 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/containers/services/Dockerfile +1 -1
- diracx-0.0.4/extensions/gubbins-charts/.gitignore +16 -0
- diracx-0.0.4/extensions/gubbins-charts/Chart.yaml +25 -0
- diracx-0.0.4/extensions/gubbins-charts/README.md +74 -0
- diracx-0.0.4/extensions/gubbins-charts/values.yaml +12 -0
- diracx-0.0.4/extensions/gubbins_values.yaml +8 -0
- diracx-0.0.2/CHANGELOG.md +0 -17
- diracx-0.0.2/extensions/gubbins_values.yaml +0 -17
- {diracx-0.0.2 → diracx-0.0.4}/.coveragerc +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/.gitattributes +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/.github/dependabot.yml +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/.github/workflows/generate_pixi_tasks_doc.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/.github/workflows/release-please.yml +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/.github/workflows/update_chart_version.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/.gitignore +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/.readthedocs.yaml +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/LICENSE +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/MANIFEST.in +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/README.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/codecov.yml +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/containers/client/Dockerfile +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/containers/services/Dockerfile +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-api/README.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-api/pyproject.toml +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-api/src/diracx/api/__init__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-api/src/diracx/api/jobs.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-api/src/diracx/api/py.typed +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-api/src/diracx/api/utils.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-api/tests/test_jobs.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-api/tests/test_utils.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-cli/README.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-cli/pyproject.toml +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-cli/src/diracx/cli/__init__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-cli/src/diracx/cli/__main__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-cli/src/diracx/cli/auth.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-cli/src/diracx/cli/config.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-cli/src/diracx/cli/internal/__init__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-cli/src/diracx/cli/internal/config.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-cli/src/diracx/cli/internal/legacy.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-cli/src/diracx/cli/jobs.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-cli/src/diracx/cli/py.typed +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-cli/src/diracx/cli/utils.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-cli/tests/legacy/cs_sync/integration_test.cfg +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-cli/tests/legacy/cs_sync/integration_test.yaml +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-cli/tests/legacy/cs_sync/integration_test_buggy.cfg +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-cli/tests/legacy/cs_sync/integration_test_secret.cfg +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-cli/tests/legacy/cs_sync/test_cssync.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-cli/tests/legacy/test_legacy.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-cli/tests/test_internal.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-cli/tests/test_jobs.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-cli/tests/test_login.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-client/README.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-client/pyproject.toml +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/_diracx_client_importer.pth +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/_client_importer.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/__init__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/_generated/__init__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/_generated/_client.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/_generated/_configuration.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/_generated/_patch.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/_generated/_serialization.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/_generated/_utils/__init__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/_generated/_utils/serialization.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/_generated/_utils/utils.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/_generated/_vendor.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/_generated/aio/__init__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/_generated/aio/_client.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/_generated/aio/_configuration.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/_generated/aio/_patch.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/_generated/aio/_vendor.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/_generated/aio/operations/__init__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/_generated/aio/operations/_operations.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/_generated/aio/operations/_patch.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/_generated/models/__init__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/_generated/models/_enums.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/_generated/models/_models.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/_generated/models/_patch.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/_generated/operations/__init__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/_generated/operations/_operations.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/_generated/operations/_patch.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/_generated/py.typed +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/aio.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/models.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/patches/auth/aio.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/patches/auth/common.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/patches/auth/sync.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/patches/client/aio.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/patches/client/common.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/patches/client/sync.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/patches/jobs/aio.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/patches/jobs/common.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/patches/jobs/sync.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/patches/utils.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/py.typed +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/sync.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-client/tests/test_auth.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-core/README.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-core/pyproject.toml +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-core/src/diracx/core/__init__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-core/src/diracx/core/config/__init__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-core/src/diracx/core/config/sources.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-core/src/diracx/core/exceptions.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-core/src/diracx/core/extensions.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-core/src/diracx/core/models.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-core/src/diracx/core/preferences.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-core/src/diracx/core/properties.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-core/src/diracx/core/py.typed +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-core/src/diracx/core/resources.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-core/src/diracx/core/s3.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-core/src/diracx/core/utils.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-core/tests/test_config_source.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-core/tests/test_entry_points.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-core/tests/test_extensions.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-core/tests/test_resources.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-core/tests/test_s3.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-core/tests/test_secrets.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-core/tests/test_utils.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-db/README.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-db/pyproject.toml +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/__init__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/__main__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/exceptions.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/os/__init__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/os/job_parameters.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/os/utils.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/py.typed +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/sql/__init__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/sql/auth/__init__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/sql/auth/db.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/sql/auth/schema.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/sql/dummy/__init__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/sql/dummy/db.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/sql/dummy/schema.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/sql/job/__init__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/sql/job/db.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/sql/job/schema.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/sql/job_logging/__init__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/sql/job_logging/db.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/sql/job_logging/schema.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/sql/pilot_agents/__init__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/sql/pilot_agents/db.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/sql/pilot_agents/schema.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/sql/sandbox_metadata/__init__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/sql/sandbox_metadata/db.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/sql/sandbox_metadata/schema.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/sql/task_queue/__init__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/sql/task_queue/db.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/sql/task_queue/schema.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/sql/utils/__init__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/sql/utils/base.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/sql/utils/functions.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/sql/utils/types.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-db/tests/auth/test_authorization_flow.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-db/tests/auth/test_device_flow.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-db/tests/auth/test_refresh_token.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-db/tests/jobs/test_job_db.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-db/tests/jobs/test_job_logging_db.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-db/tests/jobs/test_sandbox_metadata.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-db/tests/opensearch/test_connection.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-db/tests/opensearch/test_index_template.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-db/tests/opensearch/test_search.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-db/tests/pilot_agents/__init__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-db/tests/pilot_agents/test_pilot_agents_db.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-db/tests/test_dummy_db.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-db/tests/test_freeze_time.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-db/tests/utils/test_uuid.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-logic/README.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-logic/pyproject.toml +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-logic/src/diracx/logic/__init__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-logic/src/diracx/logic/__main__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-logic/src/diracx/logic/auth/__init__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-logic/src/diracx/logic/auth/authorize_code_flow.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-logic/src/diracx/logic/auth/device_flow.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-logic/src/diracx/logic/auth/management.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-logic/src/diracx/logic/auth/token.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-logic/src/diracx/logic/auth/utils.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-logic/src/diracx/logic/auth/well_known.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-logic/src/diracx/logic/jobs/__init__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-logic/src/diracx/logic/jobs/query.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-logic/src/diracx/logic/jobs/status.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-logic/src/diracx/logic/jobs/submission.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-logic/src/diracx/logic/jobs/utils.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-logic/src/diracx/logic/py.typed +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-logic/src/diracx/logic/task_queues/__init__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-logic/src/diracx/logic/task_queues/priority.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-logic/tests/jobs/test_sandboxes.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-logic/tests/jobs/test_status.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/README.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/pyproject.toml +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/src/diracx/routers/__init__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/src/diracx/routers/access_policies.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/src/diracx/routers/auth/__init__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/src/diracx/routers/auth/authorize_code_flow.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/src/diracx/routers/auth/device_flow.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/src/diracx/routers/auth/management.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/src/diracx/routers/auth/token.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/src/diracx/routers/auth/utils.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/src/diracx/routers/auth/well_known.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/src/diracx/routers/configuration.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/src/diracx/routers/factory.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/src/diracx/routers/fastapi_classes.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/src/diracx/routers/health/__init__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/src/diracx/routers/health/probes.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/src/diracx/routers/jobs/__init__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/src/diracx/routers/jobs/access_policies.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/src/diracx/routers/jobs/legacy.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/src/diracx/routers/jobs/query.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/src/diracx/routers/jobs/status.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/src/diracx/routers/jobs/submission.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/src/diracx/routers/otel.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/src/diracx/routers/py.typed +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/src/diracx/routers/utils/__init__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/src/diracx/routers/utils/users.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/tests/auth/test_legacy_exchange.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/tests/auth/test_standard.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/tests/data/idp-server.invalid/.well-known/openid-configuration +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/tests/health/test_probes.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/tests/jobs/conftest.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/tests/jobs/test_query.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/tests/jobs/test_sandboxes.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/tests/jobs/test_status.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/tests/jobs/test_wms_access_policy.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/tests/test_config_manager.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/tests/test_generic.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/tests/test_policy.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-testing/README.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-testing/pyproject.toml +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-testing/src/diracx/testing/__init__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-testing/src/diracx/testing/__main__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-testing/src/diracx/testing/client_generation.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-testing/src/diracx/testing/client_generation_pytest.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-testing/src/diracx/testing/dummy_osdb.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-testing/src/diracx/testing/entrypoints.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-testing/src/diracx/testing/mock_osdb.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-testing/src/diracx/testing/osdb.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-testing/src/diracx/testing/routers.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-testing/src/diracx/testing/scripts/collect_demo_coverage.sh +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/diracx-testing/src/diracx/testing/time.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/SECURITY.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/admin/explanations/auth-with-diracx.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/admin/explanations/auth-with-external.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/admin/explanations/configuration.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/admin/explanations/opentelemetry.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/admin/explanations/sandbox-store.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/admin/explanations/user-management.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/admin/how-to/install/connect.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/admin/how-to/install/convert-cs.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/admin/how-to/install/embracing.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/admin/how-to/install/index.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/admin/how-to/install/minimal-requirements.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/admin/how-to/install/register-a-vo.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/admin/how-to/install/register-the-admin-vo.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/admin/index.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/admin/reference/env-variables.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/admin/reference/security_model.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/admin/reference/settings-and-preferences.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/admin/tutorials/authentication.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/assets/css/extra.css +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/assets/css/fontawesome-all.min.css +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/assets/css/images/arrow.svg +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/assets/css/images/overlay.png +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/assets/css/main.css +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/assets/home.html +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/assets/images/diracx-logo-square.svg +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/assets/images/logo.svg +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/assets/styles/extra.css +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/assets/webfonts/fa-brands-400.woff2 +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/assets/webfonts/fa-solid-900.woff +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/dev/explanations/components/api.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/dev/explanations/components/cli.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/dev/explanations/components/client.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/dev/explanations/components/db.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/dev/explanations/components/index.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/dev/explanations/components/routes.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/dev/explanations/designing-functionality.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/dev/explanations/index.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/dev/explanations/testing.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/dev/how-to/add-a-cli-command.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/dev/how-to/add-a-db.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/dev/how-to/add-a-route.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/dev/how-to/add-a-setting.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/dev/how-to/add-a-task.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/dev/how-to/add-a-test.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/dev/how-to/add-functionality/index.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/dev/how-to/client-customization.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/dev/how-to/client-extension.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/dev/how-to/client-generation.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/dev/how-to/contribute.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/dev/how-to/develop-legacy-dirac.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/dev/how-to/extend-diracx/index.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/dev/how-to/use-the-demo/index.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/dev/how-to/use-the-demo/swagger.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/dev/how-to/use-the-demo/web.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/dev/index.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/dev/reference/application-state.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/dev/reference/client-metapathfinder.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/dev/reference/coding-conventions.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/dev/reference/configuration.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/dev/reference/db-transaction-model.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/dev/reference/dependency-injection.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/dev/reference/entrypoints.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/dev/reference/env-variables.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/dev/reference/pixi-tasks.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/dev/reference/security-policies.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/dev/reference/security-properties.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/dev/reference/test-recipes.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/dev/reference/writing-tests.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/dev/tutorials/advanced-tutorial.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/dev/tutorials/develop-web.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/dev/tutorials/getting-started.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/dev/tutorials/larger-developments.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/dev/tutorials/making-changes.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/dev/tutorials/play-with-auth.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/dev/tutorials/run-locally.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/dev/tutorials/write-docs.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/index.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/overrides/main.html +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/roadmap.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/user/index.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/user/reference/client-configuration.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/user/reference/known-installations.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/user/reference/programmatic-usage/command-line-interface.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/user/reference/programmatic-usage/https-interface.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/user/reference/programmatic-usage/index.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/user/reference/programmatic-usage/python-interface.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/docs/user/tutorials/getting-started.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/containers/client/Dockerfile +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/.github/workflows/main.yml +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/README.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-api/README.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-api/pyproject.toml +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-api/src/gubbins/api/__init__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-api/src/gubbins/api/py.typed +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-api/tests/test_gubbins_api.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-cli/README.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-cli/pyproject.toml +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-cli/src/gubbins/cli/__init__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-cli/src/gubbins/cli/config.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-cli/src/gubbins/cli/lollygag.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-cli/src/gubbins/cli/py.typed +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-cli/tests/test_gubbins_cli.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/README.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/pyproject.toml +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/src/gubbins/client/__init__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/__init__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_client.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_configuration.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_patch.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_serialization.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_utils/__init__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_utils/serialization.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_utils/utils.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_vendor.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/__init__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/_client.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/_configuration.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/_patch.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/_vendor.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/operations/__init__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/operations/_operations.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/operations/_patch.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/models/__init__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/models/_enums.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/models/_models.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/operations/__init__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/operations/_operations.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/operations/_patch.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/py.typed +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/src/gubbins/client/aio.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/src/gubbins/client/models.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/src/gubbins/client/py.typed +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/src/gubbins/client/sync.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/tests/test_gubbins_client.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-core/README.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-core/pyproject.toml +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-core/src/gubbins/core/__init__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-core/src/gubbins/core/config/__init__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-core/src/gubbins/core/config/schema.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-core/src/gubbins/core/models.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-core/src/gubbins/core/properties.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-core/src/gubbins/core/py.typed +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-core/tests/test_config.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-core/tests/test_properties.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-db/README.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-db/pyproject.toml +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-db/src/gubbins/db/__init__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-db/src/gubbins/db/py.typed +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-db/src/gubbins/db/sql/__init__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-db/src/gubbins/db/sql/jobs/__init__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-db/src/gubbins/db/sql/jobs/db.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-db/src/gubbins/db/sql/jobs/schema.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-db/src/gubbins/db/sql/lollygag/__init__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-db/src/gubbins/db/sql/lollygag/db.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-db/src/gubbins/db/sql/lollygag/schema.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-db/tests/test_gubbins_job_db.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-db/tests/test_lollygag_db.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-logic/README.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-logic/pyproject.toml +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-logic/src/gubbins/logic/__init__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-logic/src/gubbins/logic/auth/__init__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-logic/src/gubbins/logic/auth/well_known.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-logic/src/gubbins/logic/lollygag/__init__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-logic/src/gubbins/logic/lollygag/lollygag.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-logic/src/gubbins/logic/py.typed +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-logic/tests/test_gubbins_logic.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-routers/README.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-routers/pyproject.toml +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-routers/src/gubbins/routers/__init__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-routers/src/gubbins/routers/dependencies.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-routers/src/gubbins/routers/lollygag/__init__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-routers/src/gubbins/routers/lollygag/access_policy.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-routers/src/gubbins/routers/lollygag/lollygag.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-routers/src/gubbins/routers/py.typed +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-routers/src/gubbins/routers/well_known.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-routers/tests/data/idp-server.invalid/.well-known/openid-configuration +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-routers/tests/test_gubbins_job_manager.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-routers/tests/test_lollybag.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-routers/tests/test_wellknown.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-testing/README.md +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-testing/pyproject.toml +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-testing/src/gubbins/testing/__init__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/pixi.toml +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/pyproject.toml +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/release.notes +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/mkdocs.yml +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/pixi.toml +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/pyproject.toml +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/run_local.sh +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/tests/__init__.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/tests/make_token_local.py +0 -0
- {diracx-0.0.2 → diracx-0.0.4}/tests/test_generic.py +0 -0
|
@@ -35,7 +35,7 @@ jobs:
|
|
|
35
35
|
# We need extglob for REFERENCE_BRANCH substitution
|
|
36
36
|
shell: bash -l -O extglob {0}
|
|
37
37
|
steps:
|
|
38
|
-
- uses: actions/checkout@
|
|
38
|
+
- uses: actions/checkout@v6
|
|
39
39
|
with:
|
|
40
40
|
token: ${{ github.token }}
|
|
41
41
|
- run: |
|
|
@@ -82,7 +82,7 @@ jobs:
|
|
|
82
82
|
# Also build the diracx metapackage
|
|
83
83
|
python -m build --outdir $PWD/dist .
|
|
84
84
|
- name: 'Upload Artifact'
|
|
85
|
-
uses: actions/upload-artifact@
|
|
85
|
+
uses: actions/upload-artifact@v6
|
|
86
86
|
with:
|
|
87
87
|
name: diracx-whl
|
|
88
88
|
path: dist/diracx*.whl
|
|
@@ -99,7 +99,7 @@ jobs:
|
|
|
99
99
|
runs-on: ubuntu-latest
|
|
100
100
|
steps:
|
|
101
101
|
- name: Checkout
|
|
102
|
-
uses: actions/checkout@
|
|
102
|
+
uses: actions/checkout@v6
|
|
103
103
|
- name: Set up QEMU
|
|
104
104
|
uses: docker/setup-qemu-action@v3
|
|
105
105
|
- name: Set up Docker Buildx
|
|
@@ -111,7 +111,7 @@ jobs:
|
|
|
111
111
|
username: ${{ github.actor }}
|
|
112
112
|
password: ${{ secrets.GITHUB_TOKEN }}
|
|
113
113
|
- name: Download diracx wheels
|
|
114
|
-
uses: actions/download-artifact@
|
|
114
|
+
uses: actions/download-artifact@v7
|
|
115
115
|
with:
|
|
116
116
|
name: diracx-whl
|
|
117
117
|
- name: "Find wheels"
|
|
@@ -172,12 +172,12 @@ jobs:
|
|
|
172
172
|
if: ${{ needs.deploy-pypi.outputs.create-release == 'true' }}
|
|
173
173
|
steps:
|
|
174
174
|
- name: Checkout diracx
|
|
175
|
-
uses: actions/checkout@
|
|
175
|
+
uses: actions/checkout@v6
|
|
176
176
|
with:
|
|
177
177
|
path: diracx
|
|
178
178
|
|
|
179
179
|
- name: Checkout diracx-charts
|
|
180
|
-
uses: actions/checkout@
|
|
180
|
+
uses: actions/checkout@v6
|
|
181
181
|
with:
|
|
182
182
|
repository: DIRACGrid/diracx-charts
|
|
183
183
|
token: ${{ secrets.CHARTS_UPDATE_TOKEN }}
|
|
@@ -236,8 +236,7 @@ jobs:
|
|
|
236
236
|
- Update image tag to ${{ steps.update-versions.outputs.diracx_version }}
|
|
237
237
|
- Bump chart version from ${{ steps.update-versions.outputs.current_chart_version }} to ${{ steps.update-versions.outputs.new_chart_version }}"
|
|
238
238
|
|
|
239
|
-
|
|
240
|
-
git push origin main
|
|
239
|
+
git push origin master
|
|
241
240
|
|
|
242
241
|
echo "✅ Successfully pushed chart version ${{ steps.update-versions.outputs.new_chart_version }} and tag ${TAG_NAME}"
|
|
243
242
|
else
|
|
@@ -23,7 +23,7 @@ jobs:
|
|
|
23
23
|
dirac-branch:
|
|
24
24
|
- integration
|
|
25
25
|
steps:
|
|
26
|
-
- uses: actions/checkout@
|
|
26
|
+
- uses: actions/checkout@v6
|
|
27
27
|
- uses: actions/setup-python@v6
|
|
28
28
|
with:
|
|
29
29
|
python-version: '3.11'
|
|
@@ -75,7 +75,7 @@ jobs:
|
|
|
75
75
|
docker logs diracx 2>&1 | tee /tmp/service-logs/diracx.log
|
|
76
76
|
cd /tmp/DIRACRepo
|
|
77
77
|
./integration_tests.py logs --no-follow --lines 1000 2>&1 | tee /tmp/service-logs/dirac.log
|
|
78
|
-
- uses: actions/upload-artifact@
|
|
78
|
+
- uses: actions/upload-artifact@v6
|
|
79
79
|
if: ${{ failure() }}
|
|
80
80
|
with:
|
|
81
81
|
name: service-logs-${{ github.job }}
|
|
@@ -17,12 +17,12 @@ jobs:
|
|
|
17
17
|
runs-on: ubuntu-latest
|
|
18
18
|
steps:
|
|
19
19
|
- name: Checkout code
|
|
20
|
-
uses: actions/checkout@
|
|
21
|
-
- uses: prefix-dev/setup-pixi@v0.9.
|
|
20
|
+
uses: actions/checkout@v6
|
|
21
|
+
- uses: prefix-dev/setup-pixi@v0.9.3
|
|
22
22
|
with:
|
|
23
23
|
run-install: false
|
|
24
24
|
post-cleanup: false
|
|
25
|
-
- uses: prefix-dev/setup-pixi@v0.9.
|
|
25
|
+
- uses: prefix-dev/setup-pixi@v0.9.3
|
|
26
26
|
with:
|
|
27
27
|
cache: false
|
|
28
28
|
environments: shellcheck
|
|
@@ -52,8 +52,8 @@ jobs:
|
|
|
52
52
|
- gubbins-cli
|
|
53
53
|
steps:
|
|
54
54
|
- name: Checkout code
|
|
55
|
-
uses: actions/checkout@
|
|
56
|
-
- uses: prefix-dev/setup-pixi@v0.9.
|
|
55
|
+
uses: actions/checkout@v6
|
|
56
|
+
- uses: prefix-dev/setup-pixi@v0.9.3
|
|
57
57
|
with:
|
|
58
58
|
run-install: false
|
|
59
59
|
post-cleanup: false
|
|
@@ -64,14 +64,14 @@ jobs:
|
|
|
64
64
|
rm pixi.toml.bak
|
|
65
65
|
# Show any changes
|
|
66
66
|
git diff
|
|
67
|
-
- uses: prefix-dev/setup-pixi@v0.9.
|
|
67
|
+
- uses: prefix-dev/setup-pixi@v0.9.3
|
|
68
68
|
with:
|
|
69
69
|
cache: false
|
|
70
70
|
environments: ${{ matrix.package }}
|
|
71
71
|
- name: Run pytest
|
|
72
72
|
run: pixi run pytest-${{ matrix.package }} --cov-report=xml:coverage.xml --junitxml=report.xml
|
|
73
73
|
- name: Upload coverage report
|
|
74
|
-
uses: codecov/codecov-action@v5.5.
|
|
74
|
+
uses: codecov/codecov-action@v5.5.2
|
|
75
75
|
|
|
76
76
|
pytest-integration:
|
|
77
77
|
runs-on: ubuntu-latest
|
|
@@ -103,8 +103,8 @@ jobs:
|
|
|
103
103
|
echo "After cleanup:"
|
|
104
104
|
df -h
|
|
105
105
|
- name: Checkout code
|
|
106
|
-
uses: actions/checkout@
|
|
107
|
-
- uses: prefix-dev/setup-pixi@v0.9.
|
|
106
|
+
uses: actions/checkout@v6
|
|
107
|
+
- uses: prefix-dev/setup-pixi@v0.9.3
|
|
108
108
|
with:
|
|
109
109
|
run-install: false
|
|
110
110
|
post-cleanup: false
|
|
@@ -115,7 +115,7 @@ jobs:
|
|
|
115
115
|
rm pixi.toml.bak
|
|
116
116
|
# Show any changes
|
|
117
117
|
git diff
|
|
118
|
-
- uses: prefix-dev/setup-pixi@v0.9.
|
|
118
|
+
- uses: prefix-dev/setup-pixi@v0.9.3
|
|
119
119
|
with:
|
|
120
120
|
cache: false
|
|
121
121
|
environments: ${{ matrix.extension == 'diracx' && 'default' || 'default-gubbins' }}
|
|
@@ -167,12 +167,16 @@ jobs:
|
|
|
167
167
|
demo_args+=("--enable-open-telemetry")
|
|
168
168
|
demo_args+=("--enable-coverage")
|
|
169
169
|
demo_args+=("--exit-when-done")
|
|
170
|
-
demo_args+=("--set-value" "developer.autoReload=false")
|
|
171
170
|
demo_args+=("--ci-values" "../diracx-charts/demo/ci_values.yaml")
|
|
172
171
|
|
|
173
172
|
declare -a demo_source_dirs=("$PWD")
|
|
174
173
|
|
|
174
|
+
# Download helm/kubectl/kind first
|
|
175
|
+
../diracx-charts/run_demo.sh --only-download-deps
|
|
176
|
+
|
|
175
177
|
if [ ${{ matrix.extension }} == 'gubbins' ]; then
|
|
178
|
+
demo_args+=("--set-value" "diracx.developer.autoReload=false")
|
|
179
|
+
|
|
176
180
|
# We have to copy the code to another directory
|
|
177
181
|
# and make it a git repository by itself because otherwise the
|
|
178
182
|
# root in the pyproject do not make sense once mounted
|
|
@@ -182,12 +186,19 @@ jobs:
|
|
|
182
186
|
sed -i 's@../../@@g' /tmp/gubbins/gubbins-*/pyproject.toml
|
|
183
187
|
git init /tmp/gubbins/
|
|
184
188
|
|
|
189
|
+
# Copy gubbins-charts to a temporary location and build dependencies
|
|
190
|
+
cp -r ./extensions/gubbins-charts /tmp/
|
|
191
|
+
../diracx-charts/.demo/helm dependency build /tmp/gubbins-charts
|
|
192
|
+
|
|
193
|
+
demo_args+=("--extension-chart-path" "/tmp/gubbins-charts")
|
|
185
194
|
demo_args+=("--ci-values" "./extensions/gubbins_values.yaml")
|
|
186
195
|
demo_args+=("--load-docker-image" "gubbins/services:dev")
|
|
187
196
|
demo_source_dirs+=("/tmp/gubbins/")
|
|
188
197
|
elif [ ${{ matrix.extension }} != 'diracx' ]; then
|
|
189
198
|
echo "Unknown extension: ${{ matrix.extension }}"
|
|
190
199
|
exit 1
|
|
200
|
+
else
|
|
201
|
+
demo_args+=("--set-value" "developer.autoReload=false")
|
|
191
202
|
fi
|
|
192
203
|
|
|
193
204
|
# Run the demo with the provided arguments
|
|
@@ -218,7 +229,7 @@ jobs:
|
|
|
218
229
|
run: |
|
|
219
230
|
pixi run -e ${{ matrix.extension == 'diracx' && 'default' || 'default-gubbins' }} python -m diracx.testing coverage collect-demo --demo-dir=../diracx-charts/.demo
|
|
220
231
|
- name: Upload coverage report
|
|
221
|
-
uses: codecov/codecov-action@v5.5.
|
|
232
|
+
uses: codecov/codecov-action@v5.5.2
|
|
222
233
|
with:
|
|
223
234
|
files: ./coverage-pytest.xml,./coverage-demo.xml
|
|
224
235
|
|
|
@@ -230,12 +241,12 @@ jobs:
|
|
|
230
241
|
package: [diracx, gubbins]
|
|
231
242
|
steps:
|
|
232
243
|
- name: Checkout code
|
|
233
|
-
uses: actions/checkout@
|
|
234
|
-
- uses: prefix-dev/setup-pixi@v0.9.
|
|
244
|
+
uses: actions/checkout@v6
|
|
245
|
+
- uses: prefix-dev/setup-pixi@v0.9.3
|
|
235
246
|
with:
|
|
236
247
|
run-install: false
|
|
237
248
|
post-cleanup: false
|
|
238
|
-
- uses: prefix-dev/setup-pixi@v0.9.
|
|
249
|
+
- uses: prefix-dev/setup-pixi@v0.9.3
|
|
239
250
|
with:
|
|
240
251
|
cache: false
|
|
241
252
|
locked: false
|
|
@@ -16,7 +16,7 @@ jobs:
|
|
|
16
16
|
|
|
17
17
|
steps:
|
|
18
18
|
- name: Checkout repository
|
|
19
|
-
uses: actions/checkout@
|
|
19
|
+
uses: actions/checkout@v6
|
|
20
20
|
|
|
21
21
|
- name: Set up Python
|
|
22
22
|
uses: actions/setup-python@v6
|
|
@@ -74,7 +74,7 @@ jobs:
|
|
|
74
74
|
|
|
75
75
|
- name: Create Pull Request
|
|
76
76
|
if: steps.update_script.outputs.changes_made == 'true'
|
|
77
|
-
uses: peter-evans/create-pull-request@
|
|
77
|
+
uses: peter-evans/create-pull-request@v8
|
|
78
78
|
with:
|
|
79
79
|
token: ${{ secrets.GITHUB_TOKEN }}
|
|
80
80
|
commit-message: "chore(security): Update security.txt expiry date"
|
|
@@ -30,14 +30,14 @@ repos:
|
|
|
30
30
|
- id: check-added-large-files
|
|
31
31
|
|
|
32
32
|
- repo: https://github.com/astral-sh/ruff-pre-commit
|
|
33
|
-
rev: 'v0.14.
|
|
33
|
+
rev: 'v0.14.11'
|
|
34
34
|
hooks:
|
|
35
35
|
- id: ruff
|
|
36
36
|
args: ["--fix", "--show-fixes"]
|
|
37
37
|
- id: ruff-format
|
|
38
38
|
|
|
39
39
|
- repo: https://github.com/pre-commit/mirrors-mypy
|
|
40
|
-
rev: v1.
|
|
40
|
+
rev: v1.19.1
|
|
41
41
|
hooks:
|
|
42
42
|
- id: mypy
|
|
43
43
|
additional_dependencies:
|
|
@@ -56,6 +56,7 @@ repos:
|
|
|
56
56
|
hooks:
|
|
57
57
|
- id: mdformat
|
|
58
58
|
args: ["--number"]
|
|
59
|
+
exclude: ^CHANGELOG\.md$
|
|
59
60
|
additional_dependencies:
|
|
60
61
|
- mdformat-mkdocs
|
|
61
62
|
- mdformat-gfm
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## [0.0.4](https://github.com/DIRACGrid/diracx/compare/v0.0.3...v0.0.4) (2026-01-19)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Bug Fixes
|
|
7
|
+
|
|
8
|
+
* use extension-aware Config discovery in testing fixture ([#727](https://github.com/DIRACGrid/diracx/issues/727)) ([49d0fb8](https://github.com/DIRACGrid/diracx/commit/49d0fb8c2718a5668f330219025832365119d15d))
|
|
9
|
+
|
|
10
|
+
## [0.0.3](https://github.com/DIRACGrid/diracx/compare/v0.0.2...v0.0.3) (2026-01-19)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
### Features
|
|
14
|
+
|
|
15
|
+
* add gubbins-charts Helm chart for gubbins extension ([#691](https://github.com/DIRACGrid/diracx/issues/691)) ([649f318](https://github.com/DIRACGrid/diracx/commit/649f318daa8eeaec177cfde4bc2830a2a89a9058))
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
### Bug Fixes
|
|
19
|
+
|
|
20
|
+
* do not use Any from pyparsing ([#725](https://github.com/DIRACGrid/diracx/issues/725)) ([b3873a1](https://github.com/DIRACGrid/diracx/commit/b3873a1d8859b670ac61e4d124a91a38f2e9c807))
|
|
21
|
+
* ensure database commits complete before HTTP responses ([#722](https://github.com/DIRACGrid/diracx/issues/722)) ([4685790](https://github.com/DIRACGrid/diracx/commit/46857909b9259c13e8603b2cbaecb212d3229784))
|
|
22
|
+
* exclude CHANGELOG.md from mdformat ([639026a](https://github.com/DIRACGrid/diracx/commit/639026a19605afd8ae94c67f36bd90b5c381b45b))
|
|
23
|
+
* move cern-specific config option from diracx to lhcbdiracx ([#694](https://github.com/DIRACGrid/diracx/issues/694)) ([927d51b](https://github.com/DIRACGrid/diracx/commit/927d51bb8cf21b5e4f82c53b7e04bf0e72435806))
|
|
24
|
+
* support additional config hints ([#690](https://github.com/DIRACGrid/diracx/issues/690)) ([c265a47](https://github.com/DIRACGrid/diracx/commit/c265a47363850662502bb7f0fb8ebbbe94893e85))
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
### Miscellaneous Chores
|
|
28
|
+
|
|
29
|
+
* release 0.0.3 ([dbc726c](https://github.com/DIRACGrid/diracx/commit/dbc726c2e6ac1ed5555b8144b01fea71b5e897ba))
|
|
30
|
+
|
|
31
|
+
## [0.0.2](https://github.com/DIRACGrid/diracx/compare/v0.0.1...v0.0.2) (2025-10-22)
|
|
32
|
+
|
|
33
|
+
### Bug Fixes
|
|
34
|
+
|
|
35
|
+
- correct release-please integration in deployment workflow ([#683](https://github.com/DIRACGrid/diracx/issues/683)) ([0084328](https://github.com/DIRACGrid/diracx/commit/00843286b49a2a075226ad47af746d03b9413d60))
|
|
36
|
+
|
|
37
|
+
## [0.0.1](https://github.com/DIRACGrid/diracx/compare/v0.0.1...v0.0.1) (2025-10-22)
|
|
38
|
+
|
|
39
|
+
### Features
|
|
40
|
+
|
|
41
|
+
- DiracX is here! This is the companion release of DIRAC v9 and the first non-prerelease version of DiracX.
|
|
42
|
+
|
|
43
|
+
### Miscellaneous Chores
|
|
44
|
+
|
|
45
|
+
- release 0.0.1 ([615014d](https://github.com/DIRACGrid/diracx/commit/615014dcf87d985c7b286b1c8d94e4c4520d8463))
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import os
|
|
4
|
-
from datetime import
|
|
4
|
+
from datetime import datetime
|
|
5
5
|
from typing import Annotated, Any, MutableMapping, TypeVar
|
|
6
6
|
|
|
7
7
|
from pydantic import BaseModel as _BaseModel
|
|
@@ -35,24 +35,34 @@ class BaseModel(_BaseModel):
|
|
|
35
35
|
"""Apply transformations to interpret the legacy DIRAC CFG format."""
|
|
36
36
|
if not os.environ.get("DIRAC_COMPAT_ENABLE_CS_CONVERSION"):
|
|
37
37
|
return v
|
|
38
|
+
|
|
38
39
|
# If we're running with DIRAC_COMPAT_ENABLE_CS_CONVERSION set we apply
|
|
39
40
|
# some hacky transformations to the content to ease the transition from
|
|
40
41
|
# a CFG file. This is done by analysing the type hints as strings
|
|
41
42
|
# though ideally we should parse the type hints properly.
|
|
43
|
+
convertible_hints = {
|
|
44
|
+
"list[str]",
|
|
45
|
+
"SerializableSet[str]",
|
|
46
|
+
"SerializableSet[SecurityProperty]",
|
|
47
|
+
}
|
|
42
48
|
for field, hint in cls.__annotations__.items():
|
|
43
49
|
# Convert comma separated lists to actual lists
|
|
44
50
|
if hint.startswith("set"):
|
|
45
51
|
raise NotImplementedError("Use SerializableSet instead!")
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
52
|
+
|
|
53
|
+
if field not in v:
|
|
54
|
+
continue
|
|
55
|
+
|
|
56
|
+
# Get the base hint without the optional part
|
|
57
|
+
base_hint = hint.split(" | ")[0].strip()
|
|
58
|
+
|
|
59
|
+
# Convert comma-separated strings to lists
|
|
60
|
+
if base_hint in convertible_hints and isinstance(v[field], str):
|
|
51
61
|
v[field] = [x.strip() for x in v[field].split(",") if x.strip()]
|
|
62
|
+
|
|
52
63
|
# If the field is optional and the value is "None" convert it to None
|
|
53
|
-
if "| None" in hint and field
|
|
54
|
-
|
|
55
|
-
v[field] = None
|
|
64
|
+
if "| None" in hint and v[field] == "None":
|
|
65
|
+
v[field] = None
|
|
56
66
|
return v
|
|
57
67
|
|
|
58
68
|
|
|
@@ -62,13 +72,6 @@ class UserConfig(BaseModel):
|
|
|
62
72
|
Email: EmailStr | None = None
|
|
63
73
|
Suspended: list[str] = []
|
|
64
74
|
Quota: int | None = None
|
|
65
|
-
# TODO: These should be LHCbDIRAC specific
|
|
66
|
-
CERNAccountType: str | None = None
|
|
67
|
-
PrimaryCERNAccount: str | None = None
|
|
68
|
-
CERNPersonId: int | None = None
|
|
69
|
-
|
|
70
|
-
# Mapping from VO name to affiliation end date (YYYY-MM-DD)
|
|
71
|
-
AffiliationEnds: dict[str, date] = Field(default_factory=dict)
|
|
72
75
|
|
|
73
76
|
|
|
74
77
|
class GroupConfig(BaseModel):
|
|
@@ -175,7 +175,7 @@ class SandboxStoreSettings(ServiceSettingsBase):
|
|
|
175
175
|
model_config = SettingsConfigDict(env_prefix="DIRACX_SANDBOX_STORE_")
|
|
176
176
|
|
|
177
177
|
bucket_name: str
|
|
178
|
-
s3_client_kwargs: dict[str,
|
|
178
|
+
s3_client_kwargs: dict[str, Any]
|
|
179
179
|
auto_create_bucket: bool = False
|
|
180
180
|
url_validity_seconds: int = 5 * 60
|
|
181
181
|
se_name: str = "SandboxSE"
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
"""Test the legacy_adaptor functionality in BaseModel for CS conversion."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import os
|
|
6
|
+
|
|
7
|
+
import pytest
|
|
8
|
+
from pydantic import ValidationError
|
|
9
|
+
|
|
10
|
+
from diracx.core.config.schema import BaseModel, SerializableSet
|
|
11
|
+
from diracx.core.properties import NORMAL_USER, PRODUCTION_MANAGEMENT, SecurityProperty
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
# Note: In the following tests we use BaseModel coming from the config schema module!
|
|
15
|
+
class SimpleModel(BaseModel):
|
|
16
|
+
"""Test model with various field types that should be handled by legacy_adaptor."""
|
|
17
|
+
|
|
18
|
+
# Non-optional list
|
|
19
|
+
required_list: list[str]
|
|
20
|
+
|
|
21
|
+
# Optional list
|
|
22
|
+
optional_list: list[str] | None = None
|
|
23
|
+
|
|
24
|
+
# Non-optional SerializableSet
|
|
25
|
+
required_set: SerializableSet[str]
|
|
26
|
+
|
|
27
|
+
# Optional SerializableSet
|
|
28
|
+
optional_set: SerializableSet[str] | None = None
|
|
29
|
+
|
|
30
|
+
# Optional SerializableSet with SecurityProperty
|
|
31
|
+
optional_security_set: SerializableSet[SecurityProperty] | None = None
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def test_legacy_adaptor_without_env_var():
|
|
35
|
+
"""Test that legacy_adaptor does nothing when DIRAC_COMPAT_ENABLE_CS_CONVERSION is not set."""
|
|
36
|
+
# Ensure the env var is not set
|
|
37
|
+
os.environ.pop("DIRAC_COMPAT_ENABLE_CS_CONVERSION", None)
|
|
38
|
+
|
|
39
|
+
with pytest.raises(ValidationError) as exc_info:
|
|
40
|
+
SimpleModel.model_validate(
|
|
41
|
+
{
|
|
42
|
+
"required_list": "item1, item2",
|
|
43
|
+
"required_set": "item3, item4",
|
|
44
|
+
}
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
# Verify the error is about type validation
|
|
48
|
+
errors = exc_info.value.errors()
|
|
49
|
+
assert any(error["type"] == "list_type" for error in errors)
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def test_legacy_adaptor_required_list(monkeypatch):
|
|
53
|
+
"""Test that required list[str] fields are converted from comma-separated strings."""
|
|
54
|
+
monkeypatch.setenv("DIRAC_COMPAT_ENABLE_CS_CONVERSION", "yes")
|
|
55
|
+
|
|
56
|
+
model = SimpleModel.model_validate(
|
|
57
|
+
{
|
|
58
|
+
"required_list": "xroot, root",
|
|
59
|
+
"required_set": "item1, item2",
|
|
60
|
+
}
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
assert model.required_list == ["xroot", "root"]
|
|
64
|
+
assert model.required_set == {"item1", "item2"}
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def test_legacy_adaptor_optional_list_with_value(monkeypatch):
|
|
68
|
+
"""Test that optional list[str] | None fields are converted from comma-separated strings.
|
|
69
|
+
|
|
70
|
+
This is the failing test case that reproduces the issue from the certification environment.
|
|
71
|
+
"""
|
|
72
|
+
monkeypatch.setenv("DIRAC_COMPAT_ENABLE_CS_CONVERSION", "yes")
|
|
73
|
+
|
|
74
|
+
model = SimpleModel.model_validate(
|
|
75
|
+
{
|
|
76
|
+
"required_list": "item1",
|
|
77
|
+
"required_set": "item2",
|
|
78
|
+
"optional_list": "xroot, root",
|
|
79
|
+
}
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
assert model.optional_list == ["xroot", "root"]
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def test_legacy_adaptor_optional_list_with_none(monkeypatch):
|
|
86
|
+
"""Test that optional list fields can be None."""
|
|
87
|
+
monkeypatch.setenv("DIRAC_COMPAT_ENABLE_CS_CONVERSION", "yes")
|
|
88
|
+
|
|
89
|
+
model = SimpleModel.model_validate(
|
|
90
|
+
{
|
|
91
|
+
"required_list": "item1",
|
|
92
|
+
"required_set": "item2",
|
|
93
|
+
"optional_list": None,
|
|
94
|
+
}
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
assert model.optional_list is None
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def test_legacy_adaptor_optional_set_with_value(monkeypatch):
|
|
101
|
+
"""Test that optional SerializableSet[str] | None fields are converted."""
|
|
102
|
+
monkeypatch.setenv("DIRAC_COMPAT_ENABLE_CS_CONVERSION", "yes")
|
|
103
|
+
|
|
104
|
+
model = SimpleModel.model_validate(
|
|
105
|
+
{
|
|
106
|
+
"required_list": "item1",
|
|
107
|
+
"required_set": "item2",
|
|
108
|
+
"optional_set": "value1, value2, value3",
|
|
109
|
+
}
|
|
110
|
+
)
|
|
111
|
+
|
|
112
|
+
assert model.optional_set == {"value1", "value2", "value3"}
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def test_legacy_adaptor_optional_security_property_set(monkeypatch):
|
|
116
|
+
"""Test that optional SerializableSet[SecurityProperty] | None fields are converted."""
|
|
117
|
+
monkeypatch.setenv("DIRAC_COMPAT_ENABLE_CS_CONVERSION", "yes")
|
|
118
|
+
|
|
119
|
+
model = SimpleModel.model_validate(
|
|
120
|
+
{
|
|
121
|
+
"required_list": "item1",
|
|
122
|
+
"required_set": "item2",
|
|
123
|
+
"optional_security_set": "NormalUser, ProductionManagement",
|
|
124
|
+
}
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
assert model.optional_security_set == {
|
|
128
|
+
NORMAL_USER,
|
|
129
|
+
PRODUCTION_MANAGEMENT,
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
def test_legacy_adaptor_whitespace_handling(monkeypatch):
|
|
134
|
+
"""Test that whitespace is properly stripped from comma-separated values."""
|
|
135
|
+
monkeypatch.setenv("DIRAC_COMPAT_ENABLE_CS_CONVERSION", "yes")
|
|
136
|
+
|
|
137
|
+
model = SimpleModel.model_validate(
|
|
138
|
+
{
|
|
139
|
+
"required_list": " item1 , item2 , item3 ",
|
|
140
|
+
"required_set": "value1,value2, value3 ",
|
|
141
|
+
"optional_list": "xroot, root, gsiftp",
|
|
142
|
+
}
|
|
143
|
+
)
|
|
144
|
+
|
|
145
|
+
assert model.required_list == ["item1", "item2", "item3"]
|
|
146
|
+
assert model.required_set == {"value1", "value2", "value3"}
|
|
147
|
+
assert model.optional_list == ["xroot", "root", "gsiftp"]
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
def test_legacy_adaptor_empty_values(monkeypatch):
|
|
151
|
+
"""Test that empty values are properly filtered out."""
|
|
152
|
+
monkeypatch.setenv("DIRAC_COMPAT_ENABLE_CS_CONVERSION", "yes")
|
|
153
|
+
|
|
154
|
+
model = SimpleModel.model_validate(
|
|
155
|
+
{
|
|
156
|
+
"required_list": "item1,,item2,,,item3", # Empty values between commas
|
|
157
|
+
"required_set": "value1, , value2", # Empty value with spaces
|
|
158
|
+
}
|
|
159
|
+
)
|
|
160
|
+
|
|
161
|
+
assert model.required_list == ["item1", "item2", "item3"]
|
|
162
|
+
assert model.required_set == {"value1", "value2"}
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
def test_legacy_adaptor_already_list(monkeypatch):
|
|
166
|
+
"""Test that fields that are already lists are not modified."""
|
|
167
|
+
monkeypatch.setenv("DIRAC_COMPAT_ENABLE_CS_CONVERSION", "yes")
|
|
168
|
+
|
|
169
|
+
model = SimpleModel.model_validate(
|
|
170
|
+
{
|
|
171
|
+
"required_list": ["already", "a", "list"],
|
|
172
|
+
"required_set": ["already", "a", "list"],
|
|
173
|
+
"optional_list": ["also", "a", "list"],
|
|
174
|
+
}
|
|
175
|
+
)
|
|
176
|
+
|
|
177
|
+
assert model.required_list == ["already", "a", "list"]
|
|
178
|
+
assert model.required_set == {"already", "a", "list"}
|
|
179
|
+
assert model.optional_list == ["also", "a", "list"]
|
|
@@ -2,9 +2,7 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import asyncio
|
|
4
4
|
import logging
|
|
5
|
-
from typing import TYPE_CHECKING, Literal
|
|
6
|
-
|
|
7
|
-
from pyparsing import Any
|
|
5
|
+
from typing import TYPE_CHECKING, Any, Literal
|
|
8
6
|
|
|
9
7
|
from diracx.core.exceptions import SandboxAlreadyInsertedError, SandboxNotFoundError
|
|
10
8
|
from diracx.core.models import (
|
|
@@ -12,6 +12,7 @@ __all__ = (
|
|
|
12
12
|
"AvailableSecurityProperties",
|
|
13
13
|
)
|
|
14
14
|
|
|
15
|
+
from functools import partial
|
|
15
16
|
from typing import Annotated, TypeVar
|
|
16
17
|
|
|
17
18
|
from fastapi import Depends
|
|
@@ -32,6 +33,10 @@ from diracx.db.sql import TaskQueueDB as _TaskQueueDB
|
|
|
32
33
|
|
|
33
34
|
T = TypeVar("T")
|
|
34
35
|
|
|
36
|
+
# Use scope="function" to ensure DB commits happen before sending HTTP responses
|
|
37
|
+
# This prevents race conditions when DIRAC immediately queries data after DiracX writes it
|
|
38
|
+
DBDepends = partial(Depends, scope="function")
|
|
39
|
+
|
|
35
40
|
|
|
36
41
|
def add_settings_annotation(cls: T) -> T:
|
|
37
42
|
"""Add a `Depends` annotation to a class that has a `create` classmethod."""
|
|
@@ -39,17 +44,17 @@ def add_settings_annotation(cls: T) -> T:
|
|
|
39
44
|
|
|
40
45
|
|
|
41
46
|
# Databases
|
|
42
|
-
AuthDB = Annotated[_AuthDB,
|
|
43
|
-
JobDB = Annotated[_JobDB,
|
|
44
|
-
JobLoggingDB = Annotated[_JobLoggingDB,
|
|
45
|
-
PilotAgentsDB = Annotated[_PilotAgentsDB,
|
|
47
|
+
AuthDB = Annotated[_AuthDB, DBDepends(_AuthDB.transaction)]
|
|
48
|
+
JobDB = Annotated[_JobDB, DBDepends(_JobDB.transaction)]
|
|
49
|
+
JobLoggingDB = Annotated[_JobLoggingDB, DBDepends(_JobLoggingDB.transaction)]
|
|
50
|
+
PilotAgentsDB = Annotated[_PilotAgentsDB, DBDepends(_PilotAgentsDB.transaction)]
|
|
46
51
|
SandboxMetadataDB = Annotated[
|
|
47
|
-
_SandboxMetadataDB,
|
|
52
|
+
_SandboxMetadataDB, DBDepends(_SandboxMetadataDB.transaction)
|
|
48
53
|
]
|
|
49
|
-
TaskQueueDB = Annotated[_TaskQueueDB,
|
|
54
|
+
TaskQueueDB = Annotated[_TaskQueueDB, DBDepends(_TaskQueueDB.transaction)]
|
|
50
55
|
|
|
51
56
|
# Opensearch databases
|
|
52
|
-
JobParametersDB = Annotated[_JobParametersDB,
|
|
57
|
+
JobParametersDB = Annotated[_JobParametersDB, DBDepends(_JobParametersDB.session)]
|
|
53
58
|
|
|
54
59
|
|
|
55
60
|
# Miscellaneous
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from http import HTTPStatus
|
|
4
|
-
from typing import Annotated, Literal
|
|
4
|
+
from typing import Annotated, Any, Literal
|
|
5
5
|
|
|
6
6
|
from fastapi import Body, Depends, HTTPException, Query
|
|
7
|
-
from pyparsing import Any
|
|
8
7
|
|
|
9
8
|
from diracx.core.exceptions import SandboxAlreadyAssignedError, SandboxNotFoundError
|
|
10
9
|
from diracx.core.models import (
|
|
@@ -417,13 +417,16 @@ def client_factory(session_client_factory, request):
|
|
|
417
417
|
def with_config_repo(tmp_path_factory):
|
|
418
418
|
from git import Repo
|
|
419
419
|
|
|
420
|
-
from diracx.core.
|
|
420
|
+
from diracx.core.extensions import select_from_extension
|
|
421
|
+
|
|
422
|
+
# Use extension-aware Config discovery to support extensions that add fields
|
|
423
|
+
config_class = select_from_extension(group="diracx", name="config")[0].load()
|
|
421
424
|
|
|
422
425
|
tmp_path = tmp_path_factory.mktemp("cs-repo")
|
|
423
426
|
|
|
424
427
|
repo = Repo.init(tmp_path, initial_branch="master")
|
|
425
428
|
cs_file = tmp_path / "default.yml"
|
|
426
|
-
example_cs =
|
|
429
|
+
example_cs = config_class.model_validate(
|
|
427
430
|
{
|
|
428
431
|
"DIRAC": {},
|
|
429
432
|
"Registry": {
|
|
@@ -529,7 +532,12 @@ def demo_urls(demo_dir):
|
|
|
529
532
|
import yaml
|
|
530
533
|
|
|
531
534
|
helm_values = yaml.safe_load((demo_dir / "values.yaml").read_text())
|
|
532
|
-
|
|
535
|
+
try:
|
|
536
|
+
yield helm_values["developer"]["urls"]
|
|
537
|
+
except KeyError:
|
|
538
|
+
# If we're testing an extension they will have an umbrella chart so the
|
|
539
|
+
# URLs are under a "diracx" section corrosponding to the vanilla chart
|
|
540
|
+
yield helm_values["diracx"]["developer"]["urls"]
|
|
533
541
|
|
|
534
542
|
|
|
535
543
|
@pytest.fixture(scope="session")
|