diracx 0.0.6__tar.gz → 0.0.7__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (445) hide show
  1. {diracx-0.0.6 → diracx-0.0.7}/CHANGELOG.md +8 -0
  2. {diracx-0.0.6 → diracx-0.0.7}/PKG-INFO +1 -1
  3. {diracx-0.0.6 → diracx-0.0.7}/diracx-core/src/diracx/core/utils.py +36 -13
  4. {diracx-0.0.6 → diracx-0.0.7}/diracx-core/tests/test_utils.py +117 -0
  5. {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/pyproject.toml +1 -1
  6. {diracx-0.0.6 → diracx-0.0.7}/.coveragerc +0 -0
  7. {diracx-0.0.6 → diracx-0.0.7}/.gitattributes +0 -0
  8. {diracx-0.0.6 → diracx-0.0.7}/.github/dependabot.yml +0 -0
  9. {diracx-0.0.6 → diracx-0.0.7}/.github/workflows/deployment.yml +0 -0
  10. {diracx-0.0.6 → diracx-0.0.7}/.github/workflows/generate_pixi_tasks_doc.py +0 -0
  11. {diracx-0.0.6 → diracx-0.0.7}/.github/workflows/integration.yml +0 -0
  12. {diracx-0.0.6 → diracx-0.0.7}/.github/workflows/main.yml +0 -0
  13. {diracx-0.0.6 → diracx-0.0.7}/.github/workflows/release-please.yml +0 -0
  14. {diracx-0.0.6 → diracx-0.0.7}/.github/workflows/update_chart_version.py +0 -0
  15. {diracx-0.0.6 → diracx-0.0.7}/.github/workflows/update_security_txt_expiry.yml +0 -0
  16. {diracx-0.0.6 → diracx-0.0.7}/.github/workflows/vulnerabilities.yml +0 -0
  17. {diracx-0.0.6 → diracx-0.0.7}/.gitignore +0 -0
  18. {diracx-0.0.6 → diracx-0.0.7}/.pre-commit-config.yaml +0 -0
  19. {diracx-0.0.6 → diracx-0.0.7}/.readthedocs.yaml +0 -0
  20. {diracx-0.0.6 → diracx-0.0.7}/LICENSE +0 -0
  21. {diracx-0.0.6 → diracx-0.0.7}/MANIFEST.in +0 -0
  22. {diracx-0.0.6 → diracx-0.0.7}/README.md +0 -0
  23. {diracx-0.0.6 → diracx-0.0.7}/codecov.yml +0 -0
  24. {diracx-0.0.6 → diracx-0.0.7}/containers/client/Dockerfile +0 -0
  25. {diracx-0.0.6 → diracx-0.0.7}/containers/services/Dockerfile +0 -0
  26. {diracx-0.0.6 → diracx-0.0.7}/diracx-api/README.md +0 -0
  27. {diracx-0.0.6 → diracx-0.0.7}/diracx-api/pyproject.toml +0 -0
  28. {diracx-0.0.6 → diracx-0.0.7}/diracx-api/src/diracx/api/__init__.py +0 -0
  29. {diracx-0.0.6 → diracx-0.0.7}/diracx-api/src/diracx/api/jobs.py +0 -0
  30. {diracx-0.0.6 → diracx-0.0.7}/diracx-api/src/diracx/api/py.typed +0 -0
  31. {diracx-0.0.6 → diracx-0.0.7}/diracx-api/src/diracx/api/utils.py +0 -0
  32. {diracx-0.0.6 → diracx-0.0.7}/diracx-api/tests/test_jobs.py +0 -0
  33. {diracx-0.0.6 → diracx-0.0.7}/diracx-api/tests/test_utils.py +0 -0
  34. {diracx-0.0.6 → diracx-0.0.7}/diracx-cli/README.md +0 -0
  35. {diracx-0.0.6 → diracx-0.0.7}/diracx-cli/pyproject.toml +0 -0
  36. {diracx-0.0.6 → diracx-0.0.7}/diracx-cli/src/diracx/cli/__init__.py +0 -0
  37. {diracx-0.0.6 → diracx-0.0.7}/diracx-cli/src/diracx/cli/__main__.py +0 -0
  38. {diracx-0.0.6 → diracx-0.0.7}/diracx-cli/src/diracx/cli/auth.py +0 -0
  39. {diracx-0.0.6 → diracx-0.0.7}/diracx-cli/src/diracx/cli/config.py +0 -0
  40. {diracx-0.0.6 → diracx-0.0.7}/diracx-cli/src/diracx/cli/internal/__init__.py +0 -0
  41. {diracx-0.0.6 → diracx-0.0.7}/diracx-cli/src/diracx/cli/internal/config.py +0 -0
  42. {diracx-0.0.6 → diracx-0.0.7}/diracx-cli/src/diracx/cli/internal/legacy.py +0 -0
  43. {diracx-0.0.6 → diracx-0.0.7}/diracx-cli/src/diracx/cli/jobs.py +0 -0
  44. {diracx-0.0.6 → diracx-0.0.7}/diracx-cli/src/diracx/cli/py.typed +0 -0
  45. {diracx-0.0.6 → diracx-0.0.7}/diracx-cli/src/diracx/cli/utils.py +0 -0
  46. {diracx-0.0.6 → diracx-0.0.7}/diracx-cli/tests/legacy/cs_sync/integration_test.cfg +0 -0
  47. {diracx-0.0.6 → diracx-0.0.7}/diracx-cli/tests/legacy/cs_sync/integration_test.yaml +0 -0
  48. {diracx-0.0.6 → diracx-0.0.7}/diracx-cli/tests/legacy/cs_sync/integration_test_buggy.cfg +0 -0
  49. {diracx-0.0.6 → diracx-0.0.7}/diracx-cli/tests/legacy/cs_sync/integration_test_secret.cfg +0 -0
  50. {diracx-0.0.6 → diracx-0.0.7}/diracx-cli/tests/legacy/cs_sync/test_cssync.py +0 -0
  51. {diracx-0.0.6 → diracx-0.0.7}/diracx-cli/tests/legacy/test_legacy.py +0 -0
  52. {diracx-0.0.6 → diracx-0.0.7}/diracx-cli/tests/test_internal.py +0 -0
  53. {diracx-0.0.6 → diracx-0.0.7}/diracx-cli/tests/test_jobs.py +0 -0
  54. {diracx-0.0.6 → diracx-0.0.7}/diracx-cli/tests/test_login.py +0 -0
  55. {diracx-0.0.6 → diracx-0.0.7}/diracx-client/README.md +0 -0
  56. {diracx-0.0.6 → diracx-0.0.7}/diracx-client/pyproject.toml +0 -0
  57. {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/_diracx_client_importer.pth +0 -0
  58. {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/_client_importer.py +0 -0
  59. {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/__init__.py +0 -0
  60. {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/_generated/__init__.py +0 -0
  61. {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/_generated/_client.py +0 -0
  62. {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/_generated/_configuration.py +0 -0
  63. {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/_generated/_patch.py +0 -0
  64. {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/_generated/_serialization.py +0 -0
  65. {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/_generated/_utils/__init__.py +0 -0
  66. {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/_generated/_utils/serialization.py +0 -0
  67. {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/_generated/_utils/utils.py +0 -0
  68. {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/_generated/_vendor.py +0 -0
  69. {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/_generated/aio/__init__.py +0 -0
  70. {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/_generated/aio/_client.py +0 -0
  71. {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/_generated/aio/_configuration.py +0 -0
  72. {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/_generated/aio/_patch.py +0 -0
  73. {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/_generated/aio/_vendor.py +0 -0
  74. {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/_generated/aio/operations/__init__.py +0 -0
  75. {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/_generated/aio/operations/_operations.py +0 -0
  76. {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/_generated/aio/operations/_patch.py +0 -0
  77. {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/_generated/models/__init__.py +0 -0
  78. {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/_generated/models/_enums.py +0 -0
  79. {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/_generated/models/_models.py +0 -0
  80. {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/_generated/models/_patch.py +0 -0
  81. {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/_generated/operations/__init__.py +0 -0
  82. {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/_generated/operations/_operations.py +0 -0
  83. {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/_generated/operations/_patch.py +0 -0
  84. {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/_generated/py.typed +0 -0
  85. {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/aio.py +0 -0
  86. {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/models.py +0 -0
  87. {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/patches/auth/aio.py +0 -0
  88. {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/patches/auth/common.py +0 -0
  89. {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/patches/auth/sync.py +0 -0
  90. {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/patches/client/aio.py +0 -0
  91. {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/patches/client/common.py +0 -0
  92. {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/patches/client/sync.py +0 -0
  93. {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/patches/jobs/aio.py +0 -0
  94. {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/patches/jobs/common.py +0 -0
  95. {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/patches/jobs/sync.py +0 -0
  96. {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/patches/utils.py +0 -0
  97. {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/py.typed +0 -0
  98. {diracx-0.0.6 → diracx-0.0.7}/diracx-client/src/diracx/client/sync.py +0 -0
  99. {diracx-0.0.6 → diracx-0.0.7}/diracx-client/tests/test_auth.py +0 -0
  100. {diracx-0.0.6 → diracx-0.0.7}/diracx-core/README.md +0 -0
  101. {diracx-0.0.6 → diracx-0.0.7}/diracx-core/pyproject.toml +0 -0
  102. {diracx-0.0.6 → diracx-0.0.7}/diracx-core/src/diracx/core/__init__.py +0 -0
  103. {diracx-0.0.6 → diracx-0.0.7}/diracx-core/src/diracx/core/config/__init__.py +0 -0
  104. {diracx-0.0.6 → diracx-0.0.7}/diracx-core/src/diracx/core/config/schema.py +0 -0
  105. {diracx-0.0.6 → diracx-0.0.7}/diracx-core/src/diracx/core/config/sources.py +0 -0
  106. {diracx-0.0.6 → diracx-0.0.7}/diracx-core/src/diracx/core/exceptions.py +0 -0
  107. {diracx-0.0.6 → diracx-0.0.7}/diracx-core/src/diracx/core/extensions.py +0 -0
  108. {diracx-0.0.6 → diracx-0.0.7}/diracx-core/src/diracx/core/models.py +0 -0
  109. {diracx-0.0.6 → diracx-0.0.7}/diracx-core/src/diracx/core/preferences.py +0 -0
  110. {diracx-0.0.6 → diracx-0.0.7}/diracx-core/src/diracx/core/properties.py +0 -0
  111. {diracx-0.0.6 → diracx-0.0.7}/diracx-core/src/diracx/core/py.typed +0 -0
  112. {diracx-0.0.6 → diracx-0.0.7}/diracx-core/src/diracx/core/resources.py +0 -0
  113. {diracx-0.0.6 → diracx-0.0.7}/diracx-core/src/diracx/core/s3.py +0 -0
  114. {diracx-0.0.6 → diracx-0.0.7}/diracx-core/src/diracx/core/settings.py +0 -0
  115. {diracx-0.0.6 → diracx-0.0.7}/diracx-core/tests/test_config_source.py +0 -0
  116. {diracx-0.0.6 → diracx-0.0.7}/diracx-core/tests/test_entry_points.py +0 -0
  117. {diracx-0.0.6 → diracx-0.0.7}/diracx-core/tests/test_extensions.py +0 -0
  118. {diracx-0.0.6 → diracx-0.0.7}/diracx-core/tests/test_resources.py +0 -0
  119. {diracx-0.0.6 → diracx-0.0.7}/diracx-core/tests/test_s3.py +0 -0
  120. {diracx-0.0.6 → diracx-0.0.7}/diracx-core/tests/test_schema_legacy_adaptor.py +0 -0
  121. {diracx-0.0.6 → diracx-0.0.7}/diracx-core/tests/test_secrets.py +0 -0
  122. {diracx-0.0.6 → diracx-0.0.7}/diracx-db/README.md +0 -0
  123. {diracx-0.0.6 → diracx-0.0.7}/diracx-db/pyproject.toml +0 -0
  124. {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/__init__.py +0 -0
  125. {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/__main__.py +0 -0
  126. {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/exceptions.py +0 -0
  127. {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/os/__init__.py +0 -0
  128. {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/os/job_parameters.py +0 -0
  129. {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/os/utils.py +0 -0
  130. {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/py.typed +0 -0
  131. {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/sql/__init__.py +0 -0
  132. {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/sql/auth/__init__.py +0 -0
  133. {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/sql/auth/db.py +0 -0
  134. {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/sql/auth/schema.py +0 -0
  135. {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/sql/dummy/__init__.py +0 -0
  136. {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/sql/dummy/db.py +0 -0
  137. {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/sql/dummy/schema.py +0 -0
  138. {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/sql/job/__init__.py +0 -0
  139. {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/sql/job/db.py +0 -0
  140. {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/sql/job/schema.py +0 -0
  141. {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/sql/job_logging/__init__.py +0 -0
  142. {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/sql/job_logging/db.py +0 -0
  143. {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/sql/job_logging/schema.py +0 -0
  144. {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/sql/pilot_agents/__init__.py +0 -0
  145. {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/sql/pilot_agents/db.py +0 -0
  146. {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/sql/pilot_agents/schema.py +0 -0
  147. {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/sql/sandbox_metadata/__init__.py +0 -0
  148. {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/sql/sandbox_metadata/db.py +0 -0
  149. {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/sql/sandbox_metadata/schema.py +0 -0
  150. {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/sql/task_queue/__init__.py +0 -0
  151. {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/sql/task_queue/db.py +0 -0
  152. {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/sql/task_queue/schema.py +0 -0
  153. {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/sql/utils/__init__.py +0 -0
  154. {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/sql/utils/base.py +0 -0
  155. {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/sql/utils/functions.py +0 -0
  156. {diracx-0.0.6 → diracx-0.0.7}/diracx-db/src/diracx/db/sql/utils/types.py +0 -0
  157. {diracx-0.0.6 → diracx-0.0.7}/diracx-db/tests/auth/test_authorization_flow.py +0 -0
  158. {diracx-0.0.6 → diracx-0.0.7}/diracx-db/tests/auth/test_device_flow.py +0 -0
  159. {diracx-0.0.6 → diracx-0.0.7}/diracx-db/tests/auth/test_refresh_token.py +0 -0
  160. {diracx-0.0.6 → diracx-0.0.7}/diracx-db/tests/jobs/test_job_db.py +0 -0
  161. {diracx-0.0.6 → diracx-0.0.7}/diracx-db/tests/jobs/test_job_logging_db.py +0 -0
  162. {diracx-0.0.6 → diracx-0.0.7}/diracx-db/tests/jobs/test_sandbox_metadata.py +0 -0
  163. {diracx-0.0.6 → diracx-0.0.7}/diracx-db/tests/opensearch/test_connection.py +0 -0
  164. {diracx-0.0.6 → diracx-0.0.7}/diracx-db/tests/opensearch/test_index_template.py +0 -0
  165. {diracx-0.0.6 → diracx-0.0.7}/diracx-db/tests/opensearch/test_search.py +0 -0
  166. {diracx-0.0.6 → diracx-0.0.7}/diracx-db/tests/pilot_agents/__init__.py +0 -0
  167. {diracx-0.0.6 → diracx-0.0.7}/diracx-db/tests/pilot_agents/test_pilot_agents_db.py +0 -0
  168. {diracx-0.0.6 → diracx-0.0.7}/diracx-db/tests/test_dummy_db.py +0 -0
  169. {diracx-0.0.6 → diracx-0.0.7}/diracx-db/tests/test_freeze_time.py +0 -0
  170. {diracx-0.0.6 → diracx-0.0.7}/diracx-db/tests/utils/test_uuid.py +0 -0
  171. {diracx-0.0.6 → diracx-0.0.7}/diracx-logic/README.md +0 -0
  172. {diracx-0.0.6 → diracx-0.0.7}/diracx-logic/pyproject.toml +0 -0
  173. {diracx-0.0.6 → diracx-0.0.7}/diracx-logic/src/diracx/logic/__init__.py +0 -0
  174. {diracx-0.0.6 → diracx-0.0.7}/diracx-logic/src/diracx/logic/__main__.py +0 -0
  175. {diracx-0.0.6 → diracx-0.0.7}/diracx-logic/src/diracx/logic/auth/__init__.py +0 -0
  176. {diracx-0.0.6 → diracx-0.0.7}/diracx-logic/src/diracx/logic/auth/authorize_code_flow.py +0 -0
  177. {diracx-0.0.6 → diracx-0.0.7}/diracx-logic/src/diracx/logic/auth/device_flow.py +0 -0
  178. {diracx-0.0.6 → diracx-0.0.7}/diracx-logic/src/diracx/logic/auth/management.py +0 -0
  179. {diracx-0.0.6 → diracx-0.0.7}/diracx-logic/src/diracx/logic/auth/token.py +0 -0
  180. {diracx-0.0.6 → diracx-0.0.7}/diracx-logic/src/diracx/logic/auth/utils.py +0 -0
  181. {diracx-0.0.6 → diracx-0.0.7}/diracx-logic/src/diracx/logic/auth/well_known.py +0 -0
  182. {diracx-0.0.6 → diracx-0.0.7}/diracx-logic/src/diracx/logic/jobs/__init__.py +0 -0
  183. {diracx-0.0.6 → diracx-0.0.7}/diracx-logic/src/diracx/logic/jobs/query.py +0 -0
  184. {diracx-0.0.6 → diracx-0.0.7}/diracx-logic/src/diracx/logic/jobs/sandboxes.py +0 -0
  185. {diracx-0.0.6 → diracx-0.0.7}/diracx-logic/src/diracx/logic/jobs/status.py +0 -0
  186. {diracx-0.0.6 → diracx-0.0.7}/diracx-logic/src/diracx/logic/jobs/submission.py +0 -0
  187. {diracx-0.0.6 → diracx-0.0.7}/diracx-logic/src/diracx/logic/jobs/utils.py +0 -0
  188. {diracx-0.0.6 → diracx-0.0.7}/diracx-logic/src/diracx/logic/py.typed +0 -0
  189. {diracx-0.0.6 → diracx-0.0.7}/diracx-logic/src/diracx/logic/task_queues/__init__.py +0 -0
  190. {diracx-0.0.6 → diracx-0.0.7}/diracx-logic/src/diracx/logic/task_queues/priority.py +0 -0
  191. {diracx-0.0.6 → diracx-0.0.7}/diracx-logic/tests/jobs/test_sandboxes.py +0 -0
  192. {diracx-0.0.6 → diracx-0.0.7}/diracx-logic/tests/jobs/test_status.py +0 -0
  193. {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/README.md +0 -0
  194. {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/src/diracx/routers/__init__.py +0 -0
  195. {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/src/diracx/routers/access_policies.py +0 -0
  196. {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/src/diracx/routers/auth/__init__.py +0 -0
  197. {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/src/diracx/routers/auth/authorize_code_flow.py +0 -0
  198. {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/src/diracx/routers/auth/device_flow.py +0 -0
  199. {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/src/diracx/routers/auth/management.py +0 -0
  200. {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/src/diracx/routers/auth/token.py +0 -0
  201. {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/src/diracx/routers/auth/utils.py +0 -0
  202. {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/src/diracx/routers/auth/well_known.py +0 -0
  203. {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/src/diracx/routers/configuration.py +0 -0
  204. {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/src/diracx/routers/dependencies.py +0 -0
  205. {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/src/diracx/routers/factory.py +0 -0
  206. {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/src/diracx/routers/fastapi_classes.py +0 -0
  207. {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/src/diracx/routers/health/__init__.py +0 -0
  208. {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/src/diracx/routers/health/probes.py +0 -0
  209. {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/src/diracx/routers/jobs/__init__.py +0 -0
  210. {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/src/diracx/routers/jobs/access_policies.py +0 -0
  211. {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/src/diracx/routers/jobs/legacy.py +0 -0
  212. {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/src/diracx/routers/jobs/query.py +0 -0
  213. {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/src/diracx/routers/jobs/sandboxes.py +0 -0
  214. {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/src/diracx/routers/jobs/status.py +0 -0
  215. {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/src/diracx/routers/jobs/submission.py +0 -0
  216. {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/src/diracx/routers/otel.py +0 -0
  217. {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/src/diracx/routers/py.typed +0 -0
  218. {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/src/diracx/routers/utils/__init__.py +0 -0
  219. {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/src/diracx/routers/utils/users.py +0 -0
  220. {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/tests/auth/test_legacy_exchange.py +0 -0
  221. {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/tests/auth/test_standard.py +0 -0
  222. {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/tests/data/idp-server.invalid/.well-known/openid-configuration +0 -0
  223. {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/tests/health/test_probes.py +0 -0
  224. {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/tests/jobs/conftest.py +0 -0
  225. {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/tests/jobs/test_query.py +0 -0
  226. {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/tests/jobs/test_sandboxes.py +0 -0
  227. {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/tests/jobs/test_status.py +0 -0
  228. {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/tests/jobs/test_wms_access_policy.py +0 -0
  229. {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/tests/test_config_manager.py +0 -0
  230. {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/tests/test_generic.py +0 -0
  231. {diracx-0.0.6 → diracx-0.0.7}/diracx-routers/tests/test_policy.py +0 -0
  232. {diracx-0.0.6 → diracx-0.0.7}/diracx-testing/README.md +0 -0
  233. {diracx-0.0.6 → diracx-0.0.7}/diracx-testing/pyproject.toml +0 -0
  234. {diracx-0.0.6 → diracx-0.0.7}/diracx-testing/src/diracx/testing/__init__.py +0 -0
  235. {diracx-0.0.6 → diracx-0.0.7}/diracx-testing/src/diracx/testing/__main__.py +0 -0
  236. {diracx-0.0.6 → diracx-0.0.7}/diracx-testing/src/diracx/testing/client_generation.py +0 -0
  237. {diracx-0.0.6 → diracx-0.0.7}/diracx-testing/src/diracx/testing/client_generation_pytest.py +0 -0
  238. {diracx-0.0.6 → diracx-0.0.7}/diracx-testing/src/diracx/testing/dummy_osdb.py +0 -0
  239. {diracx-0.0.6 → diracx-0.0.7}/diracx-testing/src/diracx/testing/entrypoints.py +0 -0
  240. {diracx-0.0.6 → diracx-0.0.7}/diracx-testing/src/diracx/testing/mock_osdb.py +0 -0
  241. {diracx-0.0.6 → diracx-0.0.7}/diracx-testing/src/diracx/testing/osdb.py +0 -0
  242. {diracx-0.0.6 → diracx-0.0.7}/diracx-testing/src/diracx/testing/routers.py +0 -0
  243. {diracx-0.0.6 → diracx-0.0.7}/diracx-testing/src/diracx/testing/scripts/collect_demo_coverage.sh +0 -0
  244. {diracx-0.0.6 → diracx-0.0.7}/diracx-testing/src/diracx/testing/time.py +0 -0
  245. {diracx-0.0.6 → diracx-0.0.7}/diracx-testing/src/diracx/testing/utils.py +0 -0
  246. {diracx-0.0.6 → diracx-0.0.7}/docs/SECURITY.md +0 -0
  247. {diracx-0.0.6 → diracx-0.0.7}/docs/admin/explanations/auth-with-diracx.md +0 -0
  248. {diracx-0.0.6 → diracx-0.0.7}/docs/admin/explanations/auth-with-external.md +0 -0
  249. {diracx-0.0.6 → diracx-0.0.7}/docs/admin/explanations/configuration.md +0 -0
  250. {diracx-0.0.6 → diracx-0.0.7}/docs/admin/explanations/opentelemetry.md +0 -0
  251. {diracx-0.0.6 → diracx-0.0.7}/docs/admin/explanations/sandbox-store.md +0 -0
  252. {diracx-0.0.6 → diracx-0.0.7}/docs/admin/explanations/user-management.md +0 -0
  253. {diracx-0.0.6 → diracx-0.0.7}/docs/admin/how-to/install/connect.md +0 -0
  254. {diracx-0.0.6 → diracx-0.0.7}/docs/admin/how-to/install/convert-cs.md +0 -0
  255. {diracx-0.0.6 → diracx-0.0.7}/docs/admin/how-to/install/embracing.md +0 -0
  256. {diracx-0.0.6 → diracx-0.0.7}/docs/admin/how-to/install/index.md +0 -0
  257. {diracx-0.0.6 → diracx-0.0.7}/docs/admin/how-to/install/minimal-requirements.md +0 -0
  258. {diracx-0.0.6 → diracx-0.0.7}/docs/admin/how-to/install/register-a-vo.md +0 -0
  259. {diracx-0.0.6 → diracx-0.0.7}/docs/admin/how-to/install/register-the-admin-vo.md +0 -0
  260. {diracx-0.0.6 → diracx-0.0.7}/docs/admin/index.md +0 -0
  261. {diracx-0.0.6 → diracx-0.0.7}/docs/admin/reference/env-variables.md +0 -0
  262. {diracx-0.0.6 → diracx-0.0.7}/docs/admin/reference/security_model.md +0 -0
  263. {diracx-0.0.6 → diracx-0.0.7}/docs/admin/reference/settings-and-preferences.md +0 -0
  264. {diracx-0.0.6 → diracx-0.0.7}/docs/admin/tutorials/authentication.md +0 -0
  265. {diracx-0.0.6 → diracx-0.0.7}/docs/assets/css/extra.css +0 -0
  266. {diracx-0.0.6 → diracx-0.0.7}/docs/assets/css/fontawesome-all.min.css +0 -0
  267. {diracx-0.0.6 → diracx-0.0.7}/docs/assets/css/images/arrow.svg +0 -0
  268. {diracx-0.0.6 → diracx-0.0.7}/docs/assets/css/images/overlay.png +0 -0
  269. {diracx-0.0.6 → diracx-0.0.7}/docs/assets/css/main.css +0 -0
  270. {diracx-0.0.6 → diracx-0.0.7}/docs/assets/home.html +0 -0
  271. {diracx-0.0.6 → diracx-0.0.7}/docs/assets/images/diracx-logo-square.svg +0 -0
  272. {diracx-0.0.6 → diracx-0.0.7}/docs/assets/images/logo.svg +0 -0
  273. {diracx-0.0.6 → diracx-0.0.7}/docs/assets/styles/extra.css +0 -0
  274. {diracx-0.0.6 → diracx-0.0.7}/docs/assets/webfonts/fa-brands-400.woff2 +0 -0
  275. {diracx-0.0.6 → diracx-0.0.7}/docs/assets/webfonts/fa-solid-900.woff +0 -0
  276. {diracx-0.0.6 → diracx-0.0.7}/docs/dev/explanations/components/api.md +0 -0
  277. {diracx-0.0.6 → diracx-0.0.7}/docs/dev/explanations/components/cli.md +0 -0
  278. {diracx-0.0.6 → diracx-0.0.7}/docs/dev/explanations/components/client.md +0 -0
  279. {diracx-0.0.6 → diracx-0.0.7}/docs/dev/explanations/components/db.md +0 -0
  280. {diracx-0.0.6 → diracx-0.0.7}/docs/dev/explanations/components/index.md +0 -0
  281. {diracx-0.0.6 → diracx-0.0.7}/docs/dev/explanations/components/routes.md +0 -0
  282. {diracx-0.0.6 → diracx-0.0.7}/docs/dev/explanations/designing-functionality.md +0 -0
  283. {diracx-0.0.6 → diracx-0.0.7}/docs/dev/explanations/extensions.md +0 -0
  284. {diracx-0.0.6 → diracx-0.0.7}/docs/dev/explanations/index.md +0 -0
  285. {diracx-0.0.6 → diracx-0.0.7}/docs/dev/explanations/testing.md +0 -0
  286. {diracx-0.0.6 → diracx-0.0.7}/docs/dev/how-to/add-a-cli-command.md +0 -0
  287. {diracx-0.0.6 → diracx-0.0.7}/docs/dev/how-to/add-a-db.md +0 -0
  288. {diracx-0.0.6 → diracx-0.0.7}/docs/dev/how-to/add-a-route.md +0 -0
  289. {diracx-0.0.6 → diracx-0.0.7}/docs/dev/how-to/add-a-setting.md +0 -0
  290. {diracx-0.0.6 → diracx-0.0.7}/docs/dev/how-to/add-a-task.md +0 -0
  291. {diracx-0.0.6 → diracx-0.0.7}/docs/dev/how-to/add-a-test.md +0 -0
  292. {diracx-0.0.6 → diracx-0.0.7}/docs/dev/how-to/add-functionality/index.md +0 -0
  293. {diracx-0.0.6 → diracx-0.0.7}/docs/dev/how-to/client-customization.md +0 -0
  294. {diracx-0.0.6 → diracx-0.0.7}/docs/dev/how-to/client-extension.md +0 -0
  295. {diracx-0.0.6 → diracx-0.0.7}/docs/dev/how-to/client-generation.md +0 -0
  296. {diracx-0.0.6 → diracx-0.0.7}/docs/dev/how-to/contribute.md +0 -0
  297. {diracx-0.0.6 → diracx-0.0.7}/docs/dev/how-to/develop-legacy-dirac.md +0 -0
  298. {diracx-0.0.6 → diracx-0.0.7}/docs/dev/how-to/extend-diracx/index.md +0 -0
  299. {diracx-0.0.6 → diracx-0.0.7}/docs/dev/how-to/use-the-demo/index.md +0 -0
  300. {diracx-0.0.6 → diracx-0.0.7}/docs/dev/how-to/use-the-demo/swagger.md +0 -0
  301. {diracx-0.0.6 → diracx-0.0.7}/docs/dev/how-to/use-the-demo/web.md +0 -0
  302. {diracx-0.0.6 → diracx-0.0.7}/docs/dev/index.md +0 -0
  303. {diracx-0.0.6 → diracx-0.0.7}/docs/dev/reference/application-state.md +0 -0
  304. {diracx-0.0.6 → diracx-0.0.7}/docs/dev/reference/client-metapathfinder.md +0 -0
  305. {diracx-0.0.6 → diracx-0.0.7}/docs/dev/reference/coding-conventions.md +0 -0
  306. {diracx-0.0.6 → diracx-0.0.7}/docs/dev/reference/configuration.md +0 -0
  307. {diracx-0.0.6 → diracx-0.0.7}/docs/dev/reference/db-transaction-model.md +0 -0
  308. {diracx-0.0.6 → diracx-0.0.7}/docs/dev/reference/dependency-injection.md +0 -0
  309. {diracx-0.0.6 → diracx-0.0.7}/docs/dev/reference/entrypoints.md +0 -0
  310. {diracx-0.0.6 → diracx-0.0.7}/docs/dev/reference/env-variables.md +0 -0
  311. {diracx-0.0.6 → diracx-0.0.7}/docs/dev/reference/pixi-tasks.md +0 -0
  312. {diracx-0.0.6 → diracx-0.0.7}/docs/dev/reference/security-policies.md +0 -0
  313. {diracx-0.0.6 → diracx-0.0.7}/docs/dev/reference/security-properties.md +0 -0
  314. {diracx-0.0.6 → diracx-0.0.7}/docs/dev/reference/test-recipes.md +0 -0
  315. {diracx-0.0.6 → diracx-0.0.7}/docs/dev/reference/writing-tests.md +0 -0
  316. {diracx-0.0.6 → diracx-0.0.7}/docs/dev/tutorials/advanced-tutorial.md +0 -0
  317. {diracx-0.0.6 → diracx-0.0.7}/docs/dev/tutorials/develop-web.md +0 -0
  318. {diracx-0.0.6 → diracx-0.0.7}/docs/dev/tutorials/getting-started.md +0 -0
  319. {diracx-0.0.6 → diracx-0.0.7}/docs/dev/tutorials/larger-developments.md +0 -0
  320. {diracx-0.0.6 → diracx-0.0.7}/docs/dev/tutorials/making-changes.md +0 -0
  321. {diracx-0.0.6 → diracx-0.0.7}/docs/dev/tutorials/play-with-auth.md +0 -0
  322. {diracx-0.0.6 → diracx-0.0.7}/docs/dev/tutorials/run-locally.md +0 -0
  323. {diracx-0.0.6 → diracx-0.0.7}/docs/dev/tutorials/write-docs.md +0 -0
  324. {diracx-0.0.6 → diracx-0.0.7}/docs/index.md +0 -0
  325. {diracx-0.0.6 → diracx-0.0.7}/docs/overrides/main.html +0 -0
  326. {diracx-0.0.6 → diracx-0.0.7}/docs/roadmap.md +0 -0
  327. {diracx-0.0.6 → diracx-0.0.7}/docs/user/index.md +0 -0
  328. {diracx-0.0.6 → diracx-0.0.7}/docs/user/reference/client-configuration.md +0 -0
  329. {diracx-0.0.6 → diracx-0.0.7}/docs/user/reference/known-installations.md +0 -0
  330. {diracx-0.0.6 → diracx-0.0.7}/docs/user/reference/programmatic-usage/command-line-interface.md +0 -0
  331. {diracx-0.0.6 → diracx-0.0.7}/docs/user/reference/programmatic-usage/https-interface.md +0 -0
  332. {diracx-0.0.6 → diracx-0.0.7}/docs/user/reference/programmatic-usage/index.md +0 -0
  333. {diracx-0.0.6 → diracx-0.0.7}/docs/user/reference/programmatic-usage/python-interface.md +0 -0
  334. {diracx-0.0.6 → diracx-0.0.7}/docs/user/tutorials/getting-started.md +0 -0
  335. {diracx-0.0.6 → diracx-0.0.7}/extensions/containers/client/Dockerfile +0 -0
  336. {diracx-0.0.6 → diracx-0.0.7}/extensions/containers/services/Dockerfile +0 -0
  337. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/.github/workflows/main.yml +0 -0
  338. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/README.md +0 -0
  339. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-api/README.md +0 -0
  340. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-api/pyproject.toml +0 -0
  341. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-api/src/gubbins/api/__init__.py +0 -0
  342. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-api/src/gubbins/api/py.typed +0 -0
  343. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-api/tests/test_gubbins_api.py +0 -0
  344. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-cli/README.md +0 -0
  345. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-cli/pyproject.toml +0 -0
  346. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-cli/src/gubbins/cli/__init__.py +0 -0
  347. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-cli/src/gubbins/cli/config.py +0 -0
  348. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-cli/src/gubbins/cli/lollygag.py +0 -0
  349. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-cli/src/gubbins/cli/py.typed +0 -0
  350. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-cli/tests/test_gubbins_cli.py +0 -0
  351. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/README.md +0 -0
  352. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/pyproject.toml +0 -0
  353. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/src/gubbins/client/__init__.py +0 -0
  354. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/__init__.py +0 -0
  355. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_client.py +0 -0
  356. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_configuration.py +0 -0
  357. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_patch.py +0 -0
  358. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_serialization.py +0 -0
  359. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_utils/__init__.py +0 -0
  360. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_utils/serialization.py +0 -0
  361. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_utils/utils.py +0 -0
  362. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/_vendor.py +0 -0
  363. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/__init__.py +0 -0
  364. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/_client.py +0 -0
  365. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/_configuration.py +0 -0
  366. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/_patch.py +0 -0
  367. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/_vendor.py +0 -0
  368. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/operations/__init__.py +0 -0
  369. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/operations/_operations.py +0 -0
  370. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/aio/operations/_patch.py +0 -0
  371. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/models/__init__.py +0 -0
  372. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/models/_enums.py +0 -0
  373. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/models/_models.py +0 -0
  374. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/operations/__init__.py +0 -0
  375. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/operations/_operations.py +0 -0
  376. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/operations/_patch.py +0 -0
  377. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/src/gubbins/client/_generated/py.typed +0 -0
  378. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/src/gubbins/client/aio.py +0 -0
  379. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/src/gubbins/client/models.py +0 -0
  380. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/src/gubbins/client/py.typed +0 -0
  381. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/src/gubbins/client/sync.py +0 -0
  382. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-client/tests/test_gubbins_client.py +0 -0
  383. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-core/README.md +0 -0
  384. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-core/pyproject.toml +0 -0
  385. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-core/src/gubbins/core/__init__.py +0 -0
  386. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-core/src/gubbins/core/config/__init__.py +0 -0
  387. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-core/src/gubbins/core/config/schema.py +0 -0
  388. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-core/src/gubbins/core/models.py +0 -0
  389. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-core/src/gubbins/core/properties.py +0 -0
  390. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-core/src/gubbins/core/py.typed +0 -0
  391. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-core/tests/test_config.py +0 -0
  392. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-core/tests/test_properties.py +0 -0
  393. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-db/README.md +0 -0
  394. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-db/pyproject.toml +0 -0
  395. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-db/src/gubbins/db/__init__.py +0 -0
  396. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-db/src/gubbins/db/py.typed +0 -0
  397. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-db/src/gubbins/db/sql/__init__.py +0 -0
  398. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-db/src/gubbins/db/sql/jobs/__init__.py +0 -0
  399. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-db/src/gubbins/db/sql/jobs/db.py +0 -0
  400. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-db/src/gubbins/db/sql/jobs/schema.py +0 -0
  401. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-db/src/gubbins/db/sql/lollygag/__init__.py +0 -0
  402. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-db/src/gubbins/db/sql/lollygag/db.py +0 -0
  403. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-db/src/gubbins/db/sql/lollygag/schema.py +0 -0
  404. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-db/tests/test_gubbins_job_db.py +0 -0
  405. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-db/tests/test_lollygag_db.py +0 -0
  406. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-logic/README.md +0 -0
  407. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-logic/pyproject.toml +0 -0
  408. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-logic/src/gubbins/logic/__init__.py +0 -0
  409. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-logic/src/gubbins/logic/auth/__init__.py +0 -0
  410. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-logic/src/gubbins/logic/auth/well_known.py +0 -0
  411. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-logic/src/gubbins/logic/lollygag/__init__.py +0 -0
  412. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-logic/src/gubbins/logic/lollygag/lollygag.py +0 -0
  413. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-logic/src/gubbins/logic/py.typed +0 -0
  414. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-logic/tests/test_gubbins_logic.py +0 -0
  415. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-routers/README.md +0 -0
  416. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-routers/pyproject.toml +0 -0
  417. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-routers/src/gubbins/routers/__init__.py +0 -0
  418. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-routers/src/gubbins/routers/dependencies.py +0 -0
  419. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-routers/src/gubbins/routers/lollygag/__init__.py +0 -0
  420. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-routers/src/gubbins/routers/lollygag/access_policy.py +0 -0
  421. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-routers/src/gubbins/routers/lollygag/lollygag.py +0 -0
  422. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-routers/src/gubbins/routers/py.typed +0 -0
  423. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-routers/src/gubbins/routers/well_known.py +0 -0
  424. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-routers/tests/data/idp-server.invalid/.well-known/openid-configuration +0 -0
  425. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-routers/tests/test_gubbins_job_manager.py +0 -0
  426. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-routers/tests/test_lollybag.py +0 -0
  427. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-routers/tests/test_wellknown.py +0 -0
  428. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-testing/README.md +0 -0
  429. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-testing/pyproject.toml +0 -0
  430. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/gubbins-testing/src/gubbins/testing/__init__.py +0 -0
  431. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/pixi.toml +0 -0
  432. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/pyproject.toml +0 -0
  433. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins/release.notes +0 -0
  434. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins-charts/.gitignore +0 -0
  435. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins-charts/Chart.yaml +0 -0
  436. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins-charts/README.md +0 -0
  437. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins-charts/values.yaml +0 -0
  438. {diracx-0.0.6 → diracx-0.0.7}/extensions/gubbins_values.yaml +0 -0
  439. {diracx-0.0.6 → diracx-0.0.7}/mkdocs.yml +0 -0
  440. {diracx-0.0.6 → diracx-0.0.7}/pixi.toml +0 -0
  441. {diracx-0.0.6 → diracx-0.0.7}/pyproject.toml +0 -0
  442. {diracx-0.0.6 → diracx-0.0.7}/run_local.sh +0 -0
  443. {diracx-0.0.6 → diracx-0.0.7}/tests/__init__.py +0 -0
  444. {diracx-0.0.6 → diracx-0.0.7}/tests/make_token_local.py +0 -0
  445. {diracx-0.0.6 → diracx-0.0.7}/tests/test_generic.py +0 -0
@@ -1,5 +1,13 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.0.7](https://github.com/DIRACGrid/diracx/compare/v0.0.6...v0.0.7) (2026-01-20)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * add logging and retry for cache population failures ([#736](https://github.com/DIRACGrid/diracx/issues/736)) ([b899a8d](https://github.com/DIRACGrid/diracx/commit/b899a8d207a42b232fbe4062f329a32d64c37ec3))
9
+ * require fastapi>=0.121.0 for Depends scope parameter ([#737](https://github.com/DIRACGrid/diracx/issues/737)) ([fb15f9c](https://github.com/DIRACGrid/diracx/commit/fb15f9c5bb9d36568e37f0fae7a2a78995f02d51))
10
+
3
11
  ## [0.0.6](https://github.com/DIRACGrid/diracx/compare/v0.0.5...v0.0.6) (2026-01-20)
4
12
 
5
13
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: diracx
3
- Version: 0.0.6
3
+ Version: 0.0.7
4
4
  Summary: Client installation for users of DiracX installations
5
5
  License: GPL-3.0-only
6
6
  License-File: LICENSE
@@ -12,13 +12,14 @@ __all__ = [
12
12
 
13
13
  import fcntl
14
14
  import json
15
+ import logging
15
16
  import os
16
17
  import re
17
18
  import stat
18
19
  import threading
19
20
  from collections import defaultdict
20
21
  from collections.abc import Callable
21
- from concurrent.futures import Future, ThreadPoolExecutor, wait
22
+ from concurrent.futures import Future, ThreadPoolExecutor
22
23
  from datetime import datetime, timedelta, timezone
23
24
  from pathlib import Path
24
25
  from typing import Any, AsyncIterable, TypeVar, overload
@@ -28,6 +29,8 @@ from cachetools import Cache, TTLCache
28
29
  from diracx.core.exceptions import NotReadyError
29
30
  from diracx.core.models import TokenResponse
30
31
 
32
+ logger = logging.getLogger(__name__)
33
+
31
34
  EXPIRES_GRACE_SECONDS = 15
32
35
 
33
36
  T = TypeVar("T")
@@ -208,15 +211,16 @@ class TwoLevelCache:
208
211
  This method is thread-safe and handles concurrent requests for the same key.
209
212
 
210
213
  """
211
- if result := self.soft_cache.get(key):
212
- return result
214
+ if key in self.soft_cache:
215
+ return self.soft_cache[key]
213
216
  if self.locks[key].acquire(blocking=blocking):
214
217
  try:
215
218
  if key not in self.futures:
216
219
  self.futures[key] = self.pool.submit(self._work, key, populate_func)
217
- if result := self.hard_cache.get(key):
220
+ if key in self.hard_cache:
218
221
  # The soft cache will be updated by _work so we can fill the soft
219
- # cache to avoid later requests needign to acquire the lock.
222
+ # cache to avoid later requests needing to acquire the lock.
223
+ result = self.hard_cache[key]
220
224
  self.soft_cache[key] = result
221
225
  return result
222
226
  future = self.futures[key]
@@ -227,13 +231,17 @@ class TwoLevelCache:
227
231
  # as _work acquires the lock before filling the caches. This also
228
232
  # means we can guarantee that the future has not yet been removed
229
233
  # from the futures dict.
230
- wait([future])
234
+ # Use result() instead of wait() to propagate any exceptions
235
+ future.result()
231
236
  return self.hard_cache[key]
232
237
 
233
238
  # If the lock is not acquired we're in a non-blocking mode, try to get the
234
239
  # value from the hard cache. If it's not there, raise NotReadyError.
235
- if result := self.hard_cache.get(key):
236
- return result
240
+ if key in self.hard_cache:
241
+ return self.hard_cache[key]
242
+ logger.debug(
243
+ "Cache key %r not ready yet, background population in progress", key
244
+ )
237
245
  raise NotReadyError(f"Cache key {key} is not ready yet.")
238
246
 
239
247
  def _work(self, key: str, populate_func: Callable[[], Any]) -> None:
@@ -251,11 +259,26 @@ class TwoLevelCache:
251
259
  This method is not intended to be called directly by users of the class.
252
260
 
253
261
  """
254
- result = populate_func()
255
- with self.locks[key]:
256
- self.futures.pop(key)
257
- self.hard_cache[key] = result
258
- self.soft_cache[key] = result
262
+ success = False
263
+ result = None
264
+ try:
265
+ result = populate_func()
266
+ success = True
267
+ except Exception:
268
+ logger.error(
269
+ "Failed to populate cache key %r, will retry on next request",
270
+ key,
271
+ exc_info=True,
272
+ )
273
+ raise
274
+ finally:
275
+ # Always remove the future so the next request can retry on failure
276
+ # or submit a new refresh task on success
277
+ with self.locks[key]:
278
+ self.futures.pop(key, None)
279
+ if success:
280
+ self.hard_cache[key] = result
281
+ self.soft_cache[key] = result
259
282
 
260
283
  def clear(self):
261
284
  """Clear all caches and reset the thread pool."""
@@ -8,8 +8,10 @@ from pathlib import Path
8
8
 
9
9
  import pytest
10
10
 
11
+ from diracx.core.exceptions import NotReadyError
11
12
  from diracx.core.models import TokenResponse
12
13
  from diracx.core.utils import (
14
+ TwoLevelCache,
13
15
  dotenv_files_from_environment,
14
16
  read_credentials,
15
17
  serialize_credentials,
@@ -182,3 +184,118 @@ def test_read_credentials_valid_file(tmp_path):
182
184
  assert credentials.expires_in < token_response.expires_in
183
185
  assert credentials.token_type == token_response.token_type
184
186
  assert credentials.refresh_token == token_response.refresh_token
187
+
188
+
189
+ class TestTwoLevelCache:
190
+ """Tests for TwoLevelCache."""
191
+
192
+ def test_successful_population(self):
193
+ """Test that cache is populated successfully."""
194
+ cache = TwoLevelCache(soft_ttl=10, hard_ttl=60)
195
+ call_count = 0
196
+
197
+ def populate():
198
+ nonlocal call_count
199
+ call_count += 1
200
+ return "test_value"
201
+
202
+ result = cache.get("key", populate)
203
+ assert result == "test_value"
204
+ assert call_count == 1
205
+
206
+ # Second call should use cached value
207
+ result = cache.get("key", populate)
208
+ assert result == "test_value"
209
+ assert call_count == 1
210
+
211
+ def test_failed_population_logs_and_allows_retry(self, caplog):
212
+ """Test that failed population logs error and allows retry on next request."""
213
+ cache = TwoLevelCache(soft_ttl=10, hard_ttl=60)
214
+ call_count = 0
215
+
216
+ def failing_populate():
217
+ nonlocal call_count
218
+ call_count += 1
219
+ raise ValueError("Test error")
220
+
221
+ # First call should fail and log the error
222
+ with pytest.raises(ValueError, match="Test error"):
223
+ cache.get("key", failing_populate, blocking=True)
224
+
225
+ assert call_count == 1
226
+ assert "Failed to populate cache key 'key'" in caplog.text
227
+ assert "Test error" in caplog.text
228
+
229
+ # Future should be removed, so next call should retry
230
+ with pytest.raises(ValueError, match="Test error"):
231
+ cache.get("key", failing_populate, blocking=True)
232
+
233
+ assert call_count == 2 # Should have retried
234
+
235
+ def test_failed_population_then_success(self):
236
+ """Test that after a failure, subsequent successful call works."""
237
+ cache = TwoLevelCache(soft_ttl=10, hard_ttl=60)
238
+ should_fail = True
239
+
240
+ def populate():
241
+ if should_fail:
242
+ raise ValueError("Test error")
243
+ return "success_value"
244
+
245
+ # First call fails
246
+ with pytest.raises(ValueError):
247
+ cache.get("key", populate, blocking=True)
248
+
249
+ # Second call succeeds
250
+ should_fail = False
251
+ result = cache.get("key", populate, blocking=True)
252
+ assert result == "success_value"
253
+
254
+ def test_none_return_value_is_cached(self):
255
+ """Test that None return values are properly cached."""
256
+ cache = TwoLevelCache(soft_ttl=10, hard_ttl=60)
257
+ call_count = 0
258
+
259
+ def populate_none():
260
+ nonlocal call_count
261
+ call_count += 1
262
+ return None
263
+
264
+ result = cache.get("key", populate_none)
265
+ assert result is None
266
+ assert call_count == 1
267
+
268
+ # Second call should use cached None value
269
+ result = cache.get("key", populate_none)
270
+ assert result is None
271
+ assert call_count == 1 # Should not have called populate again
272
+
273
+ def test_non_blocking_raises_not_ready(self):
274
+ """Test that non-blocking mode raises NotReadyError when cache is empty."""
275
+ import threading
276
+ import time
277
+
278
+ cache = TwoLevelCache(soft_ttl=10, hard_ttl=60)
279
+ started = threading.Event()
280
+
281
+ def slow_populate():
282
+ started.set()
283
+ time.sleep(0.5)
284
+ return "value"
285
+
286
+ def start_slow():
287
+ cache.get("key", slow_populate, blocking=True)
288
+
289
+ # Start population in background
290
+ thread = threading.Thread(target=start_slow)
291
+ thread.start()
292
+
293
+ # Wait until slow_populate has started to avoid race conditions
294
+ assert started.wait(timeout=1.0)
295
+
296
+ # Non-blocking call should raise NotReadyError since cache isn't populated yet
297
+ with pytest.raises(NotReadyError, match="not ready yet"):
298
+ cache.get("key", slow_populate, blocking=False)
299
+
300
+ # Ensure background thread completes
301
+ thread.join()
@@ -19,7 +19,7 @@ dependencies = [
19
19
  "diracx-db",
20
20
  "python-dotenv", # TODO: We might not need this
21
21
  "python-multipart",
22
- "fastapi",
22
+ "fastapi>=0.121.0",
23
23
  "httpx",
24
24
  "joserfc",
25
25
  "pydantic >=2.10",
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes