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.
Files changed (447) hide show
  1. {diracx-0.0.2 → diracx-0.0.4}/.github/workflows/deployment.yml +7 -8
  2. {diracx-0.0.2 → diracx-0.0.4}/.github/workflows/integration.yml +2 -2
  3. {diracx-0.0.2 → diracx-0.0.4}/.github/workflows/main.yml +26 -15
  4. {diracx-0.0.2 → diracx-0.0.4}/.github/workflows/update_security_txt_expiry.yml +2 -2
  5. {diracx-0.0.2 → diracx-0.0.4}/.github/workflows/vulnerabilities.yml +1 -1
  6. {diracx-0.0.2 → diracx-0.0.4}/.pre-commit-config.yaml +3 -2
  7. diracx-0.0.4/CHANGELOG.md +45 -0
  8. {diracx-0.0.2 → diracx-0.0.4}/PKG-INFO +1 -1
  9. {diracx-0.0.2 → diracx-0.0.4}/diracx-core/src/diracx/core/config/schema.py +19 -16
  10. {diracx-0.0.2 → diracx-0.0.4}/diracx-core/src/diracx/core/settings.py +1 -1
  11. diracx-0.0.4/diracx-core/tests/test_schema_legacy_adaptor.py +179 -0
  12. {diracx-0.0.2 → diracx-0.0.4}/diracx-logic/src/diracx/logic/jobs/sandboxes.py +1 -3
  13. {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/src/diracx/routers/dependencies.py +12 -7
  14. {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/src/diracx/routers/jobs/sandboxes.py +1 -2
  15. {diracx-0.0.2 → diracx-0.0.4}/diracx-testing/src/diracx/testing/utils.py +11 -3
  16. {diracx-0.0.2 → diracx-0.0.4}/docs/dev/explanations/extensions.md +1 -0
  17. {diracx-0.0.2 → diracx-0.0.4}/extensions/containers/services/Dockerfile +1 -1
  18. diracx-0.0.4/extensions/gubbins-charts/.gitignore +16 -0
  19. diracx-0.0.4/extensions/gubbins-charts/Chart.yaml +25 -0
  20. diracx-0.0.4/extensions/gubbins-charts/README.md +74 -0
  21. diracx-0.0.4/extensions/gubbins-charts/values.yaml +12 -0
  22. diracx-0.0.4/extensions/gubbins_values.yaml +8 -0
  23. diracx-0.0.2/CHANGELOG.md +0 -17
  24. diracx-0.0.2/extensions/gubbins_values.yaml +0 -17
  25. {diracx-0.0.2 → diracx-0.0.4}/.coveragerc +0 -0
  26. {diracx-0.0.2 → diracx-0.0.4}/.gitattributes +0 -0
  27. {diracx-0.0.2 → diracx-0.0.4}/.github/dependabot.yml +0 -0
  28. {diracx-0.0.2 → diracx-0.0.4}/.github/workflows/generate_pixi_tasks_doc.py +0 -0
  29. {diracx-0.0.2 → diracx-0.0.4}/.github/workflows/release-please.yml +0 -0
  30. {diracx-0.0.2 → diracx-0.0.4}/.github/workflows/update_chart_version.py +0 -0
  31. {diracx-0.0.2 → diracx-0.0.4}/.gitignore +0 -0
  32. {diracx-0.0.2 → diracx-0.0.4}/.readthedocs.yaml +0 -0
  33. {diracx-0.0.2 → diracx-0.0.4}/LICENSE +0 -0
  34. {diracx-0.0.2 → diracx-0.0.4}/MANIFEST.in +0 -0
  35. {diracx-0.0.2 → diracx-0.0.4}/README.md +0 -0
  36. {diracx-0.0.2 → diracx-0.0.4}/codecov.yml +0 -0
  37. {diracx-0.0.2 → diracx-0.0.4}/containers/client/Dockerfile +0 -0
  38. {diracx-0.0.2 → diracx-0.0.4}/containers/services/Dockerfile +0 -0
  39. {diracx-0.0.2 → diracx-0.0.4}/diracx-api/README.md +0 -0
  40. {diracx-0.0.2 → diracx-0.0.4}/diracx-api/pyproject.toml +0 -0
  41. {diracx-0.0.2 → diracx-0.0.4}/diracx-api/src/diracx/api/__init__.py +0 -0
  42. {diracx-0.0.2 → diracx-0.0.4}/diracx-api/src/diracx/api/jobs.py +0 -0
  43. {diracx-0.0.2 → diracx-0.0.4}/diracx-api/src/diracx/api/py.typed +0 -0
  44. {diracx-0.0.2 → diracx-0.0.4}/diracx-api/src/diracx/api/utils.py +0 -0
  45. {diracx-0.0.2 → diracx-0.0.4}/diracx-api/tests/test_jobs.py +0 -0
  46. {diracx-0.0.2 → diracx-0.0.4}/diracx-api/tests/test_utils.py +0 -0
  47. {diracx-0.0.2 → diracx-0.0.4}/diracx-cli/README.md +0 -0
  48. {diracx-0.0.2 → diracx-0.0.4}/diracx-cli/pyproject.toml +0 -0
  49. {diracx-0.0.2 → diracx-0.0.4}/diracx-cli/src/diracx/cli/__init__.py +0 -0
  50. {diracx-0.0.2 → diracx-0.0.4}/diracx-cli/src/diracx/cli/__main__.py +0 -0
  51. {diracx-0.0.2 → diracx-0.0.4}/diracx-cli/src/diracx/cli/auth.py +0 -0
  52. {diracx-0.0.2 → diracx-0.0.4}/diracx-cli/src/diracx/cli/config.py +0 -0
  53. {diracx-0.0.2 → diracx-0.0.4}/diracx-cli/src/diracx/cli/internal/__init__.py +0 -0
  54. {diracx-0.0.2 → diracx-0.0.4}/diracx-cli/src/diracx/cli/internal/config.py +0 -0
  55. {diracx-0.0.2 → diracx-0.0.4}/diracx-cli/src/diracx/cli/internal/legacy.py +0 -0
  56. {diracx-0.0.2 → diracx-0.0.4}/diracx-cli/src/diracx/cli/jobs.py +0 -0
  57. {diracx-0.0.2 → diracx-0.0.4}/diracx-cli/src/diracx/cli/py.typed +0 -0
  58. {diracx-0.0.2 → diracx-0.0.4}/diracx-cli/src/diracx/cli/utils.py +0 -0
  59. {diracx-0.0.2 → diracx-0.0.4}/diracx-cli/tests/legacy/cs_sync/integration_test.cfg +0 -0
  60. {diracx-0.0.2 → diracx-0.0.4}/diracx-cli/tests/legacy/cs_sync/integration_test.yaml +0 -0
  61. {diracx-0.0.2 → diracx-0.0.4}/diracx-cli/tests/legacy/cs_sync/integration_test_buggy.cfg +0 -0
  62. {diracx-0.0.2 → diracx-0.0.4}/diracx-cli/tests/legacy/cs_sync/integration_test_secret.cfg +0 -0
  63. {diracx-0.0.2 → diracx-0.0.4}/diracx-cli/tests/legacy/cs_sync/test_cssync.py +0 -0
  64. {diracx-0.0.2 → diracx-0.0.4}/diracx-cli/tests/legacy/test_legacy.py +0 -0
  65. {diracx-0.0.2 → diracx-0.0.4}/diracx-cli/tests/test_internal.py +0 -0
  66. {diracx-0.0.2 → diracx-0.0.4}/diracx-cli/tests/test_jobs.py +0 -0
  67. {diracx-0.0.2 → diracx-0.0.4}/diracx-cli/tests/test_login.py +0 -0
  68. {diracx-0.0.2 → diracx-0.0.4}/diracx-client/README.md +0 -0
  69. {diracx-0.0.2 → diracx-0.0.4}/diracx-client/pyproject.toml +0 -0
  70. {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/_diracx_client_importer.pth +0 -0
  71. {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/_client_importer.py +0 -0
  72. {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/__init__.py +0 -0
  73. {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/_generated/__init__.py +0 -0
  74. {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/_generated/_client.py +0 -0
  75. {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/_generated/_configuration.py +0 -0
  76. {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/_generated/_patch.py +0 -0
  77. {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/_generated/_serialization.py +0 -0
  78. {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/_generated/_utils/__init__.py +0 -0
  79. {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/_generated/_utils/serialization.py +0 -0
  80. {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/_generated/_utils/utils.py +0 -0
  81. {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/_generated/_vendor.py +0 -0
  82. {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/_generated/aio/__init__.py +0 -0
  83. {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/_generated/aio/_client.py +0 -0
  84. {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/_generated/aio/_configuration.py +0 -0
  85. {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/_generated/aio/_patch.py +0 -0
  86. {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/_generated/aio/_vendor.py +0 -0
  87. {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/_generated/aio/operations/__init__.py +0 -0
  88. {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/_generated/aio/operations/_operations.py +0 -0
  89. {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/_generated/aio/operations/_patch.py +0 -0
  90. {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/_generated/models/__init__.py +0 -0
  91. {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/_generated/models/_enums.py +0 -0
  92. {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/_generated/models/_models.py +0 -0
  93. {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/_generated/models/_patch.py +0 -0
  94. {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/_generated/operations/__init__.py +0 -0
  95. {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/_generated/operations/_operations.py +0 -0
  96. {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/_generated/operations/_patch.py +0 -0
  97. {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/_generated/py.typed +0 -0
  98. {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/aio.py +0 -0
  99. {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/models.py +0 -0
  100. {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/patches/auth/aio.py +0 -0
  101. {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/patches/auth/common.py +0 -0
  102. {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/patches/auth/sync.py +0 -0
  103. {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/patches/client/aio.py +0 -0
  104. {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/patches/client/common.py +0 -0
  105. {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/patches/client/sync.py +0 -0
  106. {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/patches/jobs/aio.py +0 -0
  107. {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/patches/jobs/common.py +0 -0
  108. {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/patches/jobs/sync.py +0 -0
  109. {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/patches/utils.py +0 -0
  110. {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/py.typed +0 -0
  111. {diracx-0.0.2 → diracx-0.0.4}/diracx-client/src/diracx/client/sync.py +0 -0
  112. {diracx-0.0.2 → diracx-0.0.4}/diracx-client/tests/test_auth.py +0 -0
  113. {diracx-0.0.2 → diracx-0.0.4}/diracx-core/README.md +0 -0
  114. {diracx-0.0.2 → diracx-0.0.4}/diracx-core/pyproject.toml +0 -0
  115. {diracx-0.0.2 → diracx-0.0.4}/diracx-core/src/diracx/core/__init__.py +0 -0
  116. {diracx-0.0.2 → diracx-0.0.4}/diracx-core/src/diracx/core/config/__init__.py +0 -0
  117. {diracx-0.0.2 → diracx-0.0.4}/diracx-core/src/diracx/core/config/sources.py +0 -0
  118. {diracx-0.0.2 → diracx-0.0.4}/diracx-core/src/diracx/core/exceptions.py +0 -0
  119. {diracx-0.0.2 → diracx-0.0.4}/diracx-core/src/diracx/core/extensions.py +0 -0
  120. {diracx-0.0.2 → diracx-0.0.4}/diracx-core/src/diracx/core/models.py +0 -0
  121. {diracx-0.0.2 → diracx-0.0.4}/diracx-core/src/diracx/core/preferences.py +0 -0
  122. {diracx-0.0.2 → diracx-0.0.4}/diracx-core/src/diracx/core/properties.py +0 -0
  123. {diracx-0.0.2 → diracx-0.0.4}/diracx-core/src/diracx/core/py.typed +0 -0
  124. {diracx-0.0.2 → diracx-0.0.4}/diracx-core/src/diracx/core/resources.py +0 -0
  125. {diracx-0.0.2 → diracx-0.0.4}/diracx-core/src/diracx/core/s3.py +0 -0
  126. {diracx-0.0.2 → diracx-0.0.4}/diracx-core/src/diracx/core/utils.py +0 -0
  127. {diracx-0.0.2 → diracx-0.0.4}/diracx-core/tests/test_config_source.py +0 -0
  128. {diracx-0.0.2 → diracx-0.0.4}/diracx-core/tests/test_entry_points.py +0 -0
  129. {diracx-0.0.2 → diracx-0.0.4}/diracx-core/tests/test_extensions.py +0 -0
  130. {diracx-0.0.2 → diracx-0.0.4}/diracx-core/tests/test_resources.py +0 -0
  131. {diracx-0.0.2 → diracx-0.0.4}/diracx-core/tests/test_s3.py +0 -0
  132. {diracx-0.0.2 → diracx-0.0.4}/diracx-core/tests/test_secrets.py +0 -0
  133. {diracx-0.0.2 → diracx-0.0.4}/diracx-core/tests/test_utils.py +0 -0
  134. {diracx-0.0.2 → diracx-0.0.4}/diracx-db/README.md +0 -0
  135. {diracx-0.0.2 → diracx-0.0.4}/diracx-db/pyproject.toml +0 -0
  136. {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/__init__.py +0 -0
  137. {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/__main__.py +0 -0
  138. {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/exceptions.py +0 -0
  139. {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/os/__init__.py +0 -0
  140. {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/os/job_parameters.py +0 -0
  141. {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/os/utils.py +0 -0
  142. {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/py.typed +0 -0
  143. {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/sql/__init__.py +0 -0
  144. {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/sql/auth/__init__.py +0 -0
  145. {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/sql/auth/db.py +0 -0
  146. {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/sql/auth/schema.py +0 -0
  147. {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/sql/dummy/__init__.py +0 -0
  148. {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/sql/dummy/db.py +0 -0
  149. {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/sql/dummy/schema.py +0 -0
  150. {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/sql/job/__init__.py +0 -0
  151. {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/sql/job/db.py +0 -0
  152. {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/sql/job/schema.py +0 -0
  153. {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/sql/job_logging/__init__.py +0 -0
  154. {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/sql/job_logging/db.py +0 -0
  155. {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/sql/job_logging/schema.py +0 -0
  156. {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/sql/pilot_agents/__init__.py +0 -0
  157. {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/sql/pilot_agents/db.py +0 -0
  158. {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/sql/pilot_agents/schema.py +0 -0
  159. {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/sql/sandbox_metadata/__init__.py +0 -0
  160. {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/sql/sandbox_metadata/db.py +0 -0
  161. {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/sql/sandbox_metadata/schema.py +0 -0
  162. {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/sql/task_queue/__init__.py +0 -0
  163. {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/sql/task_queue/db.py +0 -0
  164. {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/sql/task_queue/schema.py +0 -0
  165. {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/sql/utils/__init__.py +0 -0
  166. {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/sql/utils/base.py +0 -0
  167. {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/sql/utils/functions.py +0 -0
  168. {diracx-0.0.2 → diracx-0.0.4}/diracx-db/src/diracx/db/sql/utils/types.py +0 -0
  169. {diracx-0.0.2 → diracx-0.0.4}/diracx-db/tests/auth/test_authorization_flow.py +0 -0
  170. {diracx-0.0.2 → diracx-0.0.4}/diracx-db/tests/auth/test_device_flow.py +0 -0
  171. {diracx-0.0.2 → diracx-0.0.4}/diracx-db/tests/auth/test_refresh_token.py +0 -0
  172. {diracx-0.0.2 → diracx-0.0.4}/diracx-db/tests/jobs/test_job_db.py +0 -0
  173. {diracx-0.0.2 → diracx-0.0.4}/diracx-db/tests/jobs/test_job_logging_db.py +0 -0
  174. {diracx-0.0.2 → diracx-0.0.4}/diracx-db/tests/jobs/test_sandbox_metadata.py +0 -0
  175. {diracx-0.0.2 → diracx-0.0.4}/diracx-db/tests/opensearch/test_connection.py +0 -0
  176. {diracx-0.0.2 → diracx-0.0.4}/diracx-db/tests/opensearch/test_index_template.py +0 -0
  177. {diracx-0.0.2 → diracx-0.0.4}/diracx-db/tests/opensearch/test_search.py +0 -0
  178. {diracx-0.0.2 → diracx-0.0.4}/diracx-db/tests/pilot_agents/__init__.py +0 -0
  179. {diracx-0.0.2 → diracx-0.0.4}/diracx-db/tests/pilot_agents/test_pilot_agents_db.py +0 -0
  180. {diracx-0.0.2 → diracx-0.0.4}/diracx-db/tests/test_dummy_db.py +0 -0
  181. {diracx-0.0.2 → diracx-0.0.4}/diracx-db/tests/test_freeze_time.py +0 -0
  182. {diracx-0.0.2 → diracx-0.0.4}/diracx-db/tests/utils/test_uuid.py +0 -0
  183. {diracx-0.0.2 → diracx-0.0.4}/diracx-logic/README.md +0 -0
  184. {diracx-0.0.2 → diracx-0.0.4}/diracx-logic/pyproject.toml +0 -0
  185. {diracx-0.0.2 → diracx-0.0.4}/diracx-logic/src/diracx/logic/__init__.py +0 -0
  186. {diracx-0.0.2 → diracx-0.0.4}/diracx-logic/src/diracx/logic/__main__.py +0 -0
  187. {diracx-0.0.2 → diracx-0.0.4}/diracx-logic/src/diracx/logic/auth/__init__.py +0 -0
  188. {diracx-0.0.2 → diracx-0.0.4}/diracx-logic/src/diracx/logic/auth/authorize_code_flow.py +0 -0
  189. {diracx-0.0.2 → diracx-0.0.4}/diracx-logic/src/diracx/logic/auth/device_flow.py +0 -0
  190. {diracx-0.0.2 → diracx-0.0.4}/diracx-logic/src/diracx/logic/auth/management.py +0 -0
  191. {diracx-0.0.2 → diracx-0.0.4}/diracx-logic/src/diracx/logic/auth/token.py +0 -0
  192. {diracx-0.0.2 → diracx-0.0.4}/diracx-logic/src/diracx/logic/auth/utils.py +0 -0
  193. {diracx-0.0.2 → diracx-0.0.4}/diracx-logic/src/diracx/logic/auth/well_known.py +0 -0
  194. {diracx-0.0.2 → diracx-0.0.4}/diracx-logic/src/diracx/logic/jobs/__init__.py +0 -0
  195. {diracx-0.0.2 → diracx-0.0.4}/diracx-logic/src/diracx/logic/jobs/query.py +0 -0
  196. {diracx-0.0.2 → diracx-0.0.4}/diracx-logic/src/diracx/logic/jobs/status.py +0 -0
  197. {diracx-0.0.2 → diracx-0.0.4}/diracx-logic/src/diracx/logic/jobs/submission.py +0 -0
  198. {diracx-0.0.2 → diracx-0.0.4}/diracx-logic/src/diracx/logic/jobs/utils.py +0 -0
  199. {diracx-0.0.2 → diracx-0.0.4}/diracx-logic/src/diracx/logic/py.typed +0 -0
  200. {diracx-0.0.2 → diracx-0.0.4}/diracx-logic/src/diracx/logic/task_queues/__init__.py +0 -0
  201. {diracx-0.0.2 → diracx-0.0.4}/diracx-logic/src/diracx/logic/task_queues/priority.py +0 -0
  202. {diracx-0.0.2 → diracx-0.0.4}/diracx-logic/tests/jobs/test_sandboxes.py +0 -0
  203. {diracx-0.0.2 → diracx-0.0.4}/diracx-logic/tests/jobs/test_status.py +0 -0
  204. {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/README.md +0 -0
  205. {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/pyproject.toml +0 -0
  206. {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/src/diracx/routers/__init__.py +0 -0
  207. {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/src/diracx/routers/access_policies.py +0 -0
  208. {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/src/diracx/routers/auth/__init__.py +0 -0
  209. {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/src/diracx/routers/auth/authorize_code_flow.py +0 -0
  210. {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/src/diracx/routers/auth/device_flow.py +0 -0
  211. {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/src/diracx/routers/auth/management.py +0 -0
  212. {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/src/diracx/routers/auth/token.py +0 -0
  213. {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/src/diracx/routers/auth/utils.py +0 -0
  214. {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/src/diracx/routers/auth/well_known.py +0 -0
  215. {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/src/diracx/routers/configuration.py +0 -0
  216. {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/src/diracx/routers/factory.py +0 -0
  217. {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/src/diracx/routers/fastapi_classes.py +0 -0
  218. {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/src/diracx/routers/health/__init__.py +0 -0
  219. {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/src/diracx/routers/health/probes.py +0 -0
  220. {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/src/diracx/routers/jobs/__init__.py +0 -0
  221. {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/src/diracx/routers/jobs/access_policies.py +0 -0
  222. {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/src/diracx/routers/jobs/legacy.py +0 -0
  223. {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/src/diracx/routers/jobs/query.py +0 -0
  224. {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/src/diracx/routers/jobs/status.py +0 -0
  225. {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/src/diracx/routers/jobs/submission.py +0 -0
  226. {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/src/diracx/routers/otel.py +0 -0
  227. {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/src/diracx/routers/py.typed +0 -0
  228. {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/src/diracx/routers/utils/__init__.py +0 -0
  229. {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/src/diracx/routers/utils/users.py +0 -0
  230. {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/tests/auth/test_legacy_exchange.py +0 -0
  231. {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/tests/auth/test_standard.py +0 -0
  232. {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/tests/data/idp-server.invalid/.well-known/openid-configuration +0 -0
  233. {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/tests/health/test_probes.py +0 -0
  234. {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/tests/jobs/conftest.py +0 -0
  235. {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/tests/jobs/test_query.py +0 -0
  236. {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/tests/jobs/test_sandboxes.py +0 -0
  237. {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/tests/jobs/test_status.py +0 -0
  238. {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/tests/jobs/test_wms_access_policy.py +0 -0
  239. {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/tests/test_config_manager.py +0 -0
  240. {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/tests/test_generic.py +0 -0
  241. {diracx-0.0.2 → diracx-0.0.4}/diracx-routers/tests/test_policy.py +0 -0
  242. {diracx-0.0.2 → diracx-0.0.4}/diracx-testing/README.md +0 -0
  243. {diracx-0.0.2 → diracx-0.0.4}/diracx-testing/pyproject.toml +0 -0
  244. {diracx-0.0.2 → diracx-0.0.4}/diracx-testing/src/diracx/testing/__init__.py +0 -0
  245. {diracx-0.0.2 → diracx-0.0.4}/diracx-testing/src/diracx/testing/__main__.py +0 -0
  246. {diracx-0.0.2 → diracx-0.0.4}/diracx-testing/src/diracx/testing/client_generation.py +0 -0
  247. {diracx-0.0.2 → diracx-0.0.4}/diracx-testing/src/diracx/testing/client_generation_pytest.py +0 -0
  248. {diracx-0.0.2 → diracx-0.0.4}/diracx-testing/src/diracx/testing/dummy_osdb.py +0 -0
  249. {diracx-0.0.2 → diracx-0.0.4}/diracx-testing/src/diracx/testing/entrypoints.py +0 -0
  250. {diracx-0.0.2 → diracx-0.0.4}/diracx-testing/src/diracx/testing/mock_osdb.py +0 -0
  251. {diracx-0.0.2 → diracx-0.0.4}/diracx-testing/src/diracx/testing/osdb.py +0 -0
  252. {diracx-0.0.2 → diracx-0.0.4}/diracx-testing/src/diracx/testing/routers.py +0 -0
  253. {diracx-0.0.2 → diracx-0.0.4}/diracx-testing/src/diracx/testing/scripts/collect_demo_coverage.sh +0 -0
  254. {diracx-0.0.2 → diracx-0.0.4}/diracx-testing/src/diracx/testing/time.py +0 -0
  255. {diracx-0.0.2 → diracx-0.0.4}/docs/SECURITY.md +0 -0
  256. {diracx-0.0.2 → diracx-0.0.4}/docs/admin/explanations/auth-with-diracx.md +0 -0
  257. {diracx-0.0.2 → diracx-0.0.4}/docs/admin/explanations/auth-with-external.md +0 -0
  258. {diracx-0.0.2 → diracx-0.0.4}/docs/admin/explanations/configuration.md +0 -0
  259. {diracx-0.0.2 → diracx-0.0.4}/docs/admin/explanations/opentelemetry.md +0 -0
  260. {diracx-0.0.2 → diracx-0.0.4}/docs/admin/explanations/sandbox-store.md +0 -0
  261. {diracx-0.0.2 → diracx-0.0.4}/docs/admin/explanations/user-management.md +0 -0
  262. {diracx-0.0.2 → diracx-0.0.4}/docs/admin/how-to/install/connect.md +0 -0
  263. {diracx-0.0.2 → diracx-0.0.4}/docs/admin/how-to/install/convert-cs.md +0 -0
  264. {diracx-0.0.2 → diracx-0.0.4}/docs/admin/how-to/install/embracing.md +0 -0
  265. {diracx-0.0.2 → diracx-0.0.4}/docs/admin/how-to/install/index.md +0 -0
  266. {diracx-0.0.2 → diracx-0.0.4}/docs/admin/how-to/install/minimal-requirements.md +0 -0
  267. {diracx-0.0.2 → diracx-0.0.4}/docs/admin/how-to/install/register-a-vo.md +0 -0
  268. {diracx-0.0.2 → diracx-0.0.4}/docs/admin/how-to/install/register-the-admin-vo.md +0 -0
  269. {diracx-0.0.2 → diracx-0.0.4}/docs/admin/index.md +0 -0
  270. {diracx-0.0.2 → diracx-0.0.4}/docs/admin/reference/env-variables.md +0 -0
  271. {diracx-0.0.2 → diracx-0.0.4}/docs/admin/reference/security_model.md +0 -0
  272. {diracx-0.0.2 → diracx-0.0.4}/docs/admin/reference/settings-and-preferences.md +0 -0
  273. {diracx-0.0.2 → diracx-0.0.4}/docs/admin/tutorials/authentication.md +0 -0
  274. {diracx-0.0.2 → diracx-0.0.4}/docs/assets/css/extra.css +0 -0
  275. {diracx-0.0.2 → diracx-0.0.4}/docs/assets/css/fontawesome-all.min.css +0 -0
  276. {diracx-0.0.2 → diracx-0.0.4}/docs/assets/css/images/arrow.svg +0 -0
  277. {diracx-0.0.2 → diracx-0.0.4}/docs/assets/css/images/overlay.png +0 -0
  278. {diracx-0.0.2 → diracx-0.0.4}/docs/assets/css/main.css +0 -0
  279. {diracx-0.0.2 → diracx-0.0.4}/docs/assets/home.html +0 -0
  280. {diracx-0.0.2 → diracx-0.0.4}/docs/assets/images/diracx-logo-square.svg +0 -0
  281. {diracx-0.0.2 → diracx-0.0.4}/docs/assets/images/logo.svg +0 -0
  282. {diracx-0.0.2 → diracx-0.0.4}/docs/assets/styles/extra.css +0 -0
  283. {diracx-0.0.2 → diracx-0.0.4}/docs/assets/webfonts/fa-brands-400.woff2 +0 -0
  284. {diracx-0.0.2 → diracx-0.0.4}/docs/assets/webfonts/fa-solid-900.woff +0 -0
  285. {diracx-0.0.2 → diracx-0.0.4}/docs/dev/explanations/components/api.md +0 -0
  286. {diracx-0.0.2 → diracx-0.0.4}/docs/dev/explanations/components/cli.md +0 -0
  287. {diracx-0.0.2 → diracx-0.0.4}/docs/dev/explanations/components/client.md +0 -0
  288. {diracx-0.0.2 → diracx-0.0.4}/docs/dev/explanations/components/db.md +0 -0
  289. {diracx-0.0.2 → diracx-0.0.4}/docs/dev/explanations/components/index.md +0 -0
  290. {diracx-0.0.2 → diracx-0.0.4}/docs/dev/explanations/components/routes.md +0 -0
  291. {diracx-0.0.2 → diracx-0.0.4}/docs/dev/explanations/designing-functionality.md +0 -0
  292. {diracx-0.0.2 → diracx-0.0.4}/docs/dev/explanations/index.md +0 -0
  293. {diracx-0.0.2 → diracx-0.0.4}/docs/dev/explanations/testing.md +0 -0
  294. {diracx-0.0.2 → diracx-0.0.4}/docs/dev/how-to/add-a-cli-command.md +0 -0
  295. {diracx-0.0.2 → diracx-0.0.4}/docs/dev/how-to/add-a-db.md +0 -0
  296. {diracx-0.0.2 → diracx-0.0.4}/docs/dev/how-to/add-a-route.md +0 -0
  297. {diracx-0.0.2 → diracx-0.0.4}/docs/dev/how-to/add-a-setting.md +0 -0
  298. {diracx-0.0.2 → diracx-0.0.4}/docs/dev/how-to/add-a-task.md +0 -0
  299. {diracx-0.0.2 → diracx-0.0.4}/docs/dev/how-to/add-a-test.md +0 -0
  300. {diracx-0.0.2 → diracx-0.0.4}/docs/dev/how-to/add-functionality/index.md +0 -0
  301. {diracx-0.0.2 → diracx-0.0.4}/docs/dev/how-to/client-customization.md +0 -0
  302. {diracx-0.0.2 → diracx-0.0.4}/docs/dev/how-to/client-extension.md +0 -0
  303. {diracx-0.0.2 → diracx-0.0.4}/docs/dev/how-to/client-generation.md +0 -0
  304. {diracx-0.0.2 → diracx-0.0.4}/docs/dev/how-to/contribute.md +0 -0
  305. {diracx-0.0.2 → diracx-0.0.4}/docs/dev/how-to/develop-legacy-dirac.md +0 -0
  306. {diracx-0.0.2 → diracx-0.0.4}/docs/dev/how-to/extend-diracx/index.md +0 -0
  307. {diracx-0.0.2 → diracx-0.0.4}/docs/dev/how-to/use-the-demo/index.md +0 -0
  308. {diracx-0.0.2 → diracx-0.0.4}/docs/dev/how-to/use-the-demo/swagger.md +0 -0
  309. {diracx-0.0.2 → diracx-0.0.4}/docs/dev/how-to/use-the-demo/web.md +0 -0
  310. {diracx-0.0.2 → diracx-0.0.4}/docs/dev/index.md +0 -0
  311. {diracx-0.0.2 → diracx-0.0.4}/docs/dev/reference/application-state.md +0 -0
  312. {diracx-0.0.2 → diracx-0.0.4}/docs/dev/reference/client-metapathfinder.md +0 -0
  313. {diracx-0.0.2 → diracx-0.0.4}/docs/dev/reference/coding-conventions.md +0 -0
  314. {diracx-0.0.2 → diracx-0.0.4}/docs/dev/reference/configuration.md +0 -0
  315. {diracx-0.0.2 → diracx-0.0.4}/docs/dev/reference/db-transaction-model.md +0 -0
  316. {diracx-0.0.2 → diracx-0.0.4}/docs/dev/reference/dependency-injection.md +0 -0
  317. {diracx-0.0.2 → diracx-0.0.4}/docs/dev/reference/entrypoints.md +0 -0
  318. {diracx-0.0.2 → diracx-0.0.4}/docs/dev/reference/env-variables.md +0 -0
  319. {diracx-0.0.2 → diracx-0.0.4}/docs/dev/reference/pixi-tasks.md +0 -0
  320. {diracx-0.0.2 → diracx-0.0.4}/docs/dev/reference/security-policies.md +0 -0
  321. {diracx-0.0.2 → diracx-0.0.4}/docs/dev/reference/security-properties.md +0 -0
  322. {diracx-0.0.2 → diracx-0.0.4}/docs/dev/reference/test-recipes.md +0 -0
  323. {diracx-0.0.2 → diracx-0.0.4}/docs/dev/reference/writing-tests.md +0 -0
  324. {diracx-0.0.2 → diracx-0.0.4}/docs/dev/tutorials/advanced-tutorial.md +0 -0
  325. {diracx-0.0.2 → diracx-0.0.4}/docs/dev/tutorials/develop-web.md +0 -0
  326. {diracx-0.0.2 → diracx-0.0.4}/docs/dev/tutorials/getting-started.md +0 -0
  327. {diracx-0.0.2 → diracx-0.0.4}/docs/dev/tutorials/larger-developments.md +0 -0
  328. {diracx-0.0.2 → diracx-0.0.4}/docs/dev/tutorials/making-changes.md +0 -0
  329. {diracx-0.0.2 → diracx-0.0.4}/docs/dev/tutorials/play-with-auth.md +0 -0
  330. {diracx-0.0.2 → diracx-0.0.4}/docs/dev/tutorials/run-locally.md +0 -0
  331. {diracx-0.0.2 → diracx-0.0.4}/docs/dev/tutorials/write-docs.md +0 -0
  332. {diracx-0.0.2 → diracx-0.0.4}/docs/index.md +0 -0
  333. {diracx-0.0.2 → diracx-0.0.4}/docs/overrides/main.html +0 -0
  334. {diracx-0.0.2 → diracx-0.0.4}/docs/roadmap.md +0 -0
  335. {diracx-0.0.2 → diracx-0.0.4}/docs/user/index.md +0 -0
  336. {diracx-0.0.2 → diracx-0.0.4}/docs/user/reference/client-configuration.md +0 -0
  337. {diracx-0.0.2 → diracx-0.0.4}/docs/user/reference/known-installations.md +0 -0
  338. {diracx-0.0.2 → diracx-0.0.4}/docs/user/reference/programmatic-usage/command-line-interface.md +0 -0
  339. {diracx-0.0.2 → diracx-0.0.4}/docs/user/reference/programmatic-usage/https-interface.md +0 -0
  340. {diracx-0.0.2 → diracx-0.0.4}/docs/user/reference/programmatic-usage/index.md +0 -0
  341. {diracx-0.0.2 → diracx-0.0.4}/docs/user/reference/programmatic-usage/python-interface.md +0 -0
  342. {diracx-0.0.2 → diracx-0.0.4}/docs/user/tutorials/getting-started.md +0 -0
  343. {diracx-0.0.2 → diracx-0.0.4}/extensions/containers/client/Dockerfile +0 -0
  344. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/.github/workflows/main.yml +0 -0
  345. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/README.md +0 -0
  346. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-api/README.md +0 -0
  347. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-api/pyproject.toml +0 -0
  348. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-api/src/gubbins/api/__init__.py +0 -0
  349. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-api/src/gubbins/api/py.typed +0 -0
  350. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-api/tests/test_gubbins_api.py +0 -0
  351. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-cli/README.md +0 -0
  352. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-cli/pyproject.toml +0 -0
  353. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-cli/src/gubbins/cli/__init__.py +0 -0
  354. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-cli/src/gubbins/cli/config.py +0 -0
  355. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-cli/src/gubbins/cli/lollygag.py +0 -0
  356. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-cli/src/gubbins/cli/py.typed +0 -0
  357. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-cli/tests/test_gubbins_cli.py +0 -0
  358. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/README.md +0 -0
  359. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/pyproject.toml +0 -0
  360. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/src/gubbins/client/__init__.py +0 -0
  361. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/__init__.py +0 -0
  362. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_client.py +0 -0
  363. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_configuration.py +0 -0
  364. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_patch.py +0 -0
  365. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_serialization.py +0 -0
  366. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_utils/__init__.py +0 -0
  367. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_utils/serialization.py +0 -0
  368. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_utils/utils.py +0 -0
  369. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_vendor.py +0 -0
  370. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/__init__.py +0 -0
  371. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/_client.py +0 -0
  372. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/_configuration.py +0 -0
  373. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/_patch.py +0 -0
  374. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/_vendor.py +0 -0
  375. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/operations/__init__.py +0 -0
  376. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/operations/_operations.py +0 -0
  377. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/operations/_patch.py +0 -0
  378. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/models/__init__.py +0 -0
  379. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/models/_enums.py +0 -0
  380. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/models/_models.py +0 -0
  381. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/operations/__init__.py +0 -0
  382. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/operations/_operations.py +0 -0
  383. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/operations/_patch.py +0 -0
  384. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/py.typed +0 -0
  385. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/src/gubbins/client/aio.py +0 -0
  386. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/src/gubbins/client/models.py +0 -0
  387. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/src/gubbins/client/py.typed +0 -0
  388. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/src/gubbins/client/sync.py +0 -0
  389. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-client/tests/test_gubbins_client.py +0 -0
  390. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-core/README.md +0 -0
  391. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-core/pyproject.toml +0 -0
  392. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-core/src/gubbins/core/__init__.py +0 -0
  393. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-core/src/gubbins/core/config/__init__.py +0 -0
  394. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-core/src/gubbins/core/config/schema.py +0 -0
  395. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-core/src/gubbins/core/models.py +0 -0
  396. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-core/src/gubbins/core/properties.py +0 -0
  397. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-core/src/gubbins/core/py.typed +0 -0
  398. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-core/tests/test_config.py +0 -0
  399. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-core/tests/test_properties.py +0 -0
  400. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-db/README.md +0 -0
  401. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-db/pyproject.toml +0 -0
  402. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-db/src/gubbins/db/__init__.py +0 -0
  403. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-db/src/gubbins/db/py.typed +0 -0
  404. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-db/src/gubbins/db/sql/__init__.py +0 -0
  405. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-db/src/gubbins/db/sql/jobs/__init__.py +0 -0
  406. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-db/src/gubbins/db/sql/jobs/db.py +0 -0
  407. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-db/src/gubbins/db/sql/jobs/schema.py +0 -0
  408. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-db/src/gubbins/db/sql/lollygag/__init__.py +0 -0
  409. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-db/src/gubbins/db/sql/lollygag/db.py +0 -0
  410. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-db/src/gubbins/db/sql/lollygag/schema.py +0 -0
  411. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-db/tests/test_gubbins_job_db.py +0 -0
  412. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-db/tests/test_lollygag_db.py +0 -0
  413. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-logic/README.md +0 -0
  414. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-logic/pyproject.toml +0 -0
  415. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-logic/src/gubbins/logic/__init__.py +0 -0
  416. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-logic/src/gubbins/logic/auth/__init__.py +0 -0
  417. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-logic/src/gubbins/logic/auth/well_known.py +0 -0
  418. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-logic/src/gubbins/logic/lollygag/__init__.py +0 -0
  419. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-logic/src/gubbins/logic/lollygag/lollygag.py +0 -0
  420. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-logic/src/gubbins/logic/py.typed +0 -0
  421. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-logic/tests/test_gubbins_logic.py +0 -0
  422. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-routers/README.md +0 -0
  423. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-routers/pyproject.toml +0 -0
  424. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-routers/src/gubbins/routers/__init__.py +0 -0
  425. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-routers/src/gubbins/routers/dependencies.py +0 -0
  426. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-routers/src/gubbins/routers/lollygag/__init__.py +0 -0
  427. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-routers/src/gubbins/routers/lollygag/access_policy.py +0 -0
  428. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-routers/src/gubbins/routers/lollygag/lollygag.py +0 -0
  429. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-routers/src/gubbins/routers/py.typed +0 -0
  430. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-routers/src/gubbins/routers/well_known.py +0 -0
  431. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-routers/tests/data/idp-server.invalid/.well-known/openid-configuration +0 -0
  432. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-routers/tests/test_gubbins_job_manager.py +0 -0
  433. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-routers/tests/test_lollybag.py +0 -0
  434. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-routers/tests/test_wellknown.py +0 -0
  435. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-testing/README.md +0 -0
  436. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-testing/pyproject.toml +0 -0
  437. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/gubbins-testing/src/gubbins/testing/__init__.py +0 -0
  438. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/pixi.toml +0 -0
  439. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/pyproject.toml +0 -0
  440. {diracx-0.0.2 → diracx-0.0.4}/extensions/gubbins/release.notes +0 -0
  441. {diracx-0.0.2 → diracx-0.0.4}/mkdocs.yml +0 -0
  442. {diracx-0.0.2 → diracx-0.0.4}/pixi.toml +0 -0
  443. {diracx-0.0.2 → diracx-0.0.4}/pyproject.toml +0 -0
  444. {diracx-0.0.2 → diracx-0.0.4}/run_local.sh +0 -0
  445. {diracx-0.0.2 → diracx-0.0.4}/tests/__init__.py +0 -0
  446. {diracx-0.0.2 → diracx-0.0.4}/tests/make_token_local.py +0 -0
  447. {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@v5
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@v4
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@v5
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@v5
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@v5
175
+ uses: actions/checkout@v6
176
176
  with:
177
177
  path: diracx
178
178
 
179
179
  - name: Checkout diracx-charts
180
- uses: actions/checkout@v5
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
- # Push the commit to main branch
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@v5
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@v4
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@v5
21
- - uses: prefix-dev/setup-pixi@v0.9.2
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.2
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@v5
56
- - uses: prefix-dev/setup-pixi@v0.9.2
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.2
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.1
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@v5
107
- - uses: prefix-dev/setup-pixi@v0.9.2
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.2
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.1
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@v5
234
- - uses: prefix-dev/setup-pixi@v0.9.2
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.2
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@v5
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@v7
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"
@@ -16,7 +16,7 @@ jobs:
16
16
  runs-on: ubuntu-latest
17
17
  steps:
18
18
  - name: Checkout
19
- uses: actions/checkout@v5
19
+ uses: actions/checkout@v6
20
20
  with:
21
21
  fetch-depth: 0
22
22
  tags: true
@@ -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.1'
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.18.2
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,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: diracx
3
- Version: 0.0.2
3
+ Version: 0.0.4
4
4
  Summary: Client installation for users of DiracX installations
5
5
  License: GPL-3.0-only
6
6
  License-File: LICENSE
@@ -1,7 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import os
4
- from datetime import date, datetime
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
- if hint in {
47
- "list[str]",
48
- "SerializableSet[str]",
49
- "SerializableSet[SecurityProperty]",
50
- } and isinstance(v.get(field), str):
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 in v:
54
- if v[field] == "None":
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, 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, Depends(_AuthDB.transaction)]
43
- JobDB = Annotated[_JobDB, Depends(_JobDB.transaction)]
44
- JobLoggingDB = Annotated[_JobLoggingDB, Depends(_JobLoggingDB.transaction)]
45
- PilotAgentsDB = Annotated[_PilotAgentsDB, Depends(_PilotAgentsDB.transaction)]
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, Depends(_SandboxMetadataDB.transaction)
52
+ _SandboxMetadataDB, DBDepends(_SandboxMetadataDB.transaction)
48
53
  ]
49
- TaskQueueDB = Annotated[_TaskQueueDB, Depends(_TaskQueueDB.transaction)]
54
+ TaskQueueDB = Annotated[_TaskQueueDB, DBDepends(_TaskQueueDB.transaction)]
50
55
 
51
56
  # Opensearch databases
52
- JobParametersDB = Annotated[_JobParametersDB, Depends(_JobParametersDB.session)]
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.config import Config
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 = Config.model_validate(
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
- yield helm_values["developer"]["urls"]
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")