taskcluster-taskgraph 23.0.0__tar.gz → 23.2.0__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 (271) hide show
  1. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/.pre-commit-config.yaml +2 -2
  2. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/.taskcluster.yml +2 -0
  3. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/CHANGELOG.md +19 -0
  4. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/PKG-INFO +1 -1
  5. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/docs/reference/transforms/task_context.rst +34 -7
  6. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/pyproject.toml +1 -1
  7. taskcluster_taskgraph-23.2.0/renovate.json +6 -0
  8. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/actions/util.py +1 -1
  9. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/generator.py +14 -0
  10. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/main.py +5 -0
  11. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/taskgraph.py +3 -1
  12. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/transforms/task_context.py +20 -5
  13. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/util/schema.py +15 -7
  14. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/taskcluster/config.yml +1 -0
  15. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/taskcluster/docker/index-task/package.json +1 -1
  16. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/taskcluster/docker/index-task/yarn.lock +67 -74
  17. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/taskcluster/kinds/test/linux.yml +20 -0
  18. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/template/{{cookiecutter.project_name}}/taskcluster/config.yml +3 -3
  19. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/conftest.py +18 -2
  20. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/test_generator.py +46 -3
  21. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/test_main.py +40 -0
  22. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/test_taskgraph.py +36 -0
  23. taskcluster_taskgraph-23.2.0/test/test_transform_task_context.py +222 -0
  24. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/test_util_schema.py +40 -5
  25. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/uv.lock +1283 -608
  26. taskcluster_taskgraph-23.0.0/.github/dependabot.yml +0 -19
  27. taskcluster_taskgraph-23.0.0/.github/workflows/pre-commit-autoupdate.yml +0 -15
  28. taskcluster_taskgraph-23.0.0/.github/workflows/pre-commit.yml +0 -12
  29. taskcluster_taskgraph-23.0.0/test/test_transform_task_context.py +0 -94
  30. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/.codespell-ignore-words.txt +0 -0
  31. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/.github/CODEOWNERS +0 -0
  32. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/.github/workflows/codeql-analysis.yml +0 -0
  33. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/.github/workflows/pypi-publish.yml +0 -0
  34. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/.gitignore +0 -0
  35. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/.readthedocs.yaml +0 -0
  36. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/.yamllint +0 -0
  37. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/CODE_OF_CONDUCT.md +0 -0
  38. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/CONTRIBUTING.rst +0 -0
  39. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/LICENSE +0 -0
  40. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/Makefile +0 -0
  41. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/README.rst +0 -0
  42. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/docs/concepts/index.rst +0 -0
  43. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/docs/concepts/kind.rst +0 -0
  44. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/docs/concepts/loading.rst +0 -0
  45. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/docs/concepts/optimization.rst +0 -0
  46. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/docs/concepts/overview.rst +0 -0
  47. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/docs/concepts/scopes.rst +0 -0
  48. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/docs/concepts/task-graphs.rst +0 -0
  49. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/docs/concepts/transforms.rst +0 -0
  50. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/docs/conf.py +0 -0
  51. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/docs/contributing.rst +0 -0
  52. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/docs/glossary.rst +0 -0
  53. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/docs/howto/bootstrap-taskgraph.rst +0 -0
  54. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/docs/howto/create-actions.rst +0 -0
  55. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/docs/howto/create-tasks.rst +0 -0
  56. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/docs/howto/debugging.rst +0 -0
  57. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/docs/howto/define-schemas.rst +0 -0
  58. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/docs/howto/docker.rst +0 -0
  59. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/docs/howto/index.rst +0 -0
  60. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/docs/howto/load-task-locally.rst +0 -0
  61. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/docs/howto/resolve-keyed-by.rst +0 -0
  62. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/docs/howto/run-locally.rst +0 -0
  63. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/docs/howto/send-notifications.rst +0 -0
  64. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/docs/howto/use-fetches.rst +0 -0
  65. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/docs/index.rst +0 -0
  66. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/docs/reference/cli.rst +0 -0
  67. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/docs/reference/index.rst +0 -0
  68. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/docs/reference/migrations.rst +0 -0
  69. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/docs/reference/optimization-strategies.rst +0 -0
  70. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/docs/reference/parameters.rst +0 -0
  71. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/docs/reference/source/modules.rst +0 -0
  72. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/docs/reference/source/taskgraph.actions.rst +0 -0
  73. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/docs/reference/source/taskgraph.loader.rst +0 -0
  74. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/docs/reference/source/taskgraph.optimize.rst +0 -0
  75. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/docs/reference/source/taskgraph.rst +0 -0
  76. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/docs/reference/source/taskgraph.transforms.rst +0 -0
  77. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/docs/reference/source/taskgraph.transforms.run.rst +0 -0
  78. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/docs/reference/source/taskgraph.util.rst +0 -0
  79. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/docs/reference/transforms/chunking.rst +0 -0
  80. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/docs/reference/transforms/from_deps.rst +0 -0
  81. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/docs/reference/transforms/index.rst +0 -0
  82. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/docs/reference/transforms/matrix.rst +0 -0
  83. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/docs/tutorials/connecting-taskcluster.rst +0 -0
  84. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/docs/tutorials/creating-a-task-graph.rst +0 -0
  85. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/docs/tutorials/example-taskcluster.yml +0 -0
  86. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/docs/tutorials/getting-started.rst +0 -0
  87. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/docs/tutorials/index.rst +0 -0
  88. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/make.bat +0 -0
  89. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/packages/pytest-taskgraph/README.md +0 -0
  90. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/packages/pytest-taskgraph/pyproject.toml +0 -0
  91. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/packages/pytest-taskgraph/src/pytest_taskgraph/__init__.py +0 -0
  92. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/packages/pytest-taskgraph/src/pytest_taskgraph/fixtures/gen.py +0 -0
  93. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/packages/pytest-taskgraph/src/pytest_taskgraph/fixtures/vcs.py +0 -0
  94. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/packages/sphinx-taskgraph/README.md +0 -0
  95. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/packages/sphinx-taskgraph/pyproject.toml +0 -0
  96. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/packages/sphinx-taskgraph/src/sphinx_taskgraph/__init__.py +0 -0
  97. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/packages/sphinx-taskgraph/src/sphinx_taskgraph/autoschema.py +0 -0
  98. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/__init__.py +0 -0
  99. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/actions/__init__.py +0 -0
  100. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/actions/add_new_jobs.py +0 -0
  101. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/actions/cancel.py +0 -0
  102. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/actions/cancel_all.py +0 -0
  103. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/actions/rebuild_cached_tasks.py +0 -0
  104. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/actions/registry.py +0 -0
  105. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/actions/retrigger.py +0 -0
  106. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/config.py +0 -0
  107. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/create.py +0 -0
  108. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/decision.py +0 -0
  109. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/docker.py +0 -0
  110. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/filter_tasks.py +0 -0
  111. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/graph.py +0 -0
  112. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/loader/__init__.py +0 -0
  113. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/loader/default.py +0 -0
  114. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/loader/transform.py +0 -0
  115. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/morph.py +0 -0
  116. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/optimize/__init__.py +0 -0
  117. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/optimize/base.py +0 -0
  118. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/optimize/strategies.py +0 -0
  119. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/parameters.py +0 -0
  120. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/run-task/fetch-content +0 -0
  121. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/run-task/hgrc +0 -0
  122. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/run-task/robustcheckout.py +0 -0
  123. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/run-task/run-task +0 -0
  124. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/target_tasks.py +0 -0
  125. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/task.py +0 -0
  126. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/transforms/__init__.py +0 -0
  127. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/transforms/base.py +0 -0
  128. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/transforms/cached_tasks.py +0 -0
  129. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/transforms/chunking.py +0 -0
  130. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/transforms/code_review.py +0 -0
  131. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/transforms/docker_image.py +0 -0
  132. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/transforms/fetch.py +0 -0
  133. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/transforms/from_deps.py +0 -0
  134. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/transforms/matrix.py +0 -0
  135. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/transforms/notify.py +0 -0
  136. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/transforms/run/__init__.py +0 -0
  137. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/transforms/run/common.py +0 -0
  138. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/transforms/run/index_search.py +0 -0
  139. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/transforms/run/run_task.py +0 -0
  140. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/transforms/run/toolchain.py +0 -0
  141. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/transforms/task.py +0 -0
  142. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/util/__init__.py +0 -0
  143. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/util/archive.py +0 -0
  144. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/util/attributes.py +0 -0
  145. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/util/cached_tasks.py +0 -0
  146. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/util/caches.py +0 -0
  147. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/util/copy.py +0 -0
  148. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/util/dependencies.py +0 -0
  149. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/util/docker.py +0 -0
  150. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/util/hash.py +0 -0
  151. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/util/json.py +0 -0
  152. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/util/keyed_by.py +0 -0
  153. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/util/parameterization.py +0 -0
  154. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/util/path.py +0 -0
  155. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/util/python_path.py +0 -0
  156. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/util/readonlydict.py +0 -0
  157. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/util/set_name.py +0 -0
  158. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/util/shell.py +0 -0
  159. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/util/taskcluster.py +0 -0
  160. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/util/taskgraph.py +0 -0
  161. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/util/templates.py +0 -0
  162. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/util/time.py +0 -0
  163. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/util/treeherder.py +0 -0
  164. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/util/vcs.py +0 -0
  165. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/util/verify.py +0 -0
  166. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/util/workertypes.py +0 -0
  167. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/src/taskgraph/util/yaml.py +0 -0
  168. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/taskcluster/docker/REGISTRY +0 -0
  169. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/taskcluster/docker/decision/Dockerfile +0 -0
  170. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/taskcluster/docker/decision/HASH +0 -0
  171. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/taskcluster/docker/decision/README.md +0 -0
  172. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/taskcluster/docker/decision/VERSION +0 -0
  173. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/taskcluster/docker/decision/system-setup.sh +0 -0
  174. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/taskcluster/docker/fetch/Dockerfile +0 -0
  175. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/taskcluster/docker/image_builder/README.rst +0 -0
  176. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/taskcluster/docker/index-task/Dockerfile +0 -0
  177. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/taskcluster/docker/index-task/README +0 -0
  178. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/taskcluster/docker/index-task/insert-indexes.js +0 -0
  179. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/taskcluster/docker/python/Dockerfile +0 -0
  180. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/taskcluster/docker/run-task/Dockerfile +0 -0
  181. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/taskcluster/docker/run-task/system-setup.sh +0 -0
  182. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/taskcluster/docker/skopeo/Dockerfile +0 -0
  183. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/taskcluster/docker/skopeo/policy.json +0 -0
  184. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/taskcluster/docker/skopeo/push_image.sh +0 -0
  185. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/taskcluster/kinds/check/kind.yml +0 -0
  186. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/taskcluster/kinds/codecov/kind.yml +0 -0
  187. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/taskcluster/kinds/complete/kind.yml +0 -0
  188. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/taskcluster/kinds/doc/kind.yml +0 -0
  189. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/taskcluster/kinds/docker-image/kind.yml +0 -0
  190. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/taskcluster/kinds/fetch/kind.yml +0 -0
  191. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/taskcluster/kinds/push-image/kind.yml +0 -0
  192. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/taskcluster/kinds/test/kind.yml +0 -0
  193. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/taskcluster/kinds/test/windows.yml +0 -0
  194. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/taskcluster/scripts/codecov-upload.py +0 -0
  195. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/taskcluster/self_taskgraph/__init__.py +0 -0
  196. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/taskcluster/self_taskgraph/custom_parameters.py +0 -0
  197. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/taskcluster/self_taskgraph/custom_target_tasks.py +0 -0
  198. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/taskcluster/self_taskgraph/transforms/add_pr_route.py +0 -0
  199. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/taskcluster/self_taskgraph/transforms/push_image.py +0 -0
  200. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/taskcluster/test/params/main-repo-pull-request-untrusted.yml +0 -0
  201. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/taskcluster/test/params/main-repo-pull-request.yml +0 -0
  202. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/taskcluster/test/params/main-repo-push.yml +0 -0
  203. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/taskcluster/test/params/main-repo-release-pytest-taskgraph.yml +0 -0
  204. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/taskcluster/test/params/main-repo-release-taskcluster-taskgraph.yml +0 -0
  205. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/template/cookiecutter.json +0 -0
  206. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/template/hooks/post_gen_project.py +0 -0
  207. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/template/{{cookiecutter.project_name}}/taskcluster/docker/linux/Dockerfile +0 -0
  208. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/template/{{cookiecutter.project_name}}/taskcluster/kinds/docker-image/kind.yml +0 -0
  209. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/template/{{cookiecutter.project_name}}/taskcluster/kinds/hello/kind.yml +0 -0
  210. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/template/{{cookiecutter.project_name}}/taskcluster/{{cookiecutter.project_slug}}_taskgraph/transforms/hello.py +0 -0
  211. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/template/{{cookiecutter.project_name}}/taskcluster.github.yml +0 -0
  212. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/__init__.py +0 -0
  213. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/automationrelevance.json +0 -0
  214. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/data/task_context.yml +0 -0
  215. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/data/taskcluster/config.yml +0 -0
  216. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/data/taskcluster/docker/hello-world/Dockerfile +0 -0
  217. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/data/taskcluster/docker/hello-world-tag/Dockerfile +0 -0
  218. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/data/taskcluster/docker/hello-world-tag/REGISTRY +0 -0
  219. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/data/taskcluster/docker/hello-world-tag/VERSION +0 -0
  220. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/data/taskcluster/kinds/docker-image/kind.yml +0 -0
  221. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/data/taskcluster/scripts/toolchain/run.ps1 +0 -0
  222. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/data/taskcluster/scripts/toolchain/run.sh +0 -0
  223. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/data/taskcluster/test_taskgraph/transforms/foo.py +0 -0
  224. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/data/testmod/thing.py +0 -0
  225. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/mockedopen.py +0 -0
  226. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/test_actions_rebuild_cached_tasks.py +0 -0
  227. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/test_actions_registry.py +0 -0
  228. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/test_config.py +0 -0
  229. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/test_create.py +0 -0
  230. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/test_decision.py +0 -0
  231. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/test_docker.py +0 -0
  232. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/test_graph.py +0 -0
  233. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/test_morph.py +0 -0
  234. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/test_optimize.py +0 -0
  235. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/test_optimize_strategies.py +0 -0
  236. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/test_parameters.py +0 -0
  237. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/test_scripts_fetch_content.py +0 -0
  238. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/test_scripts_run_task.py +0 -0
  239. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/test_target_tasks.py +0 -0
  240. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/test_transform_chunking.py +0 -0
  241. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/test_transform_docker_image.py +0 -0
  242. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/test_transforms_base.py +0 -0
  243. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/test_transforms_cached_tasks.py +0 -0
  244. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/test_transforms_fetch.py +0 -0
  245. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/test_transforms_from_deps.py +0 -0
  246. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/test_transforms_matrix.py +0 -0
  247. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/test_transforms_notify.py +0 -0
  248. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/test_transforms_run.py +0 -0
  249. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/test_transforms_run_run_task.py +0 -0
  250. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/test_transforms_run_toolchain.py +0 -0
  251. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/test_transforms_task.py +0 -0
  252. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/test_util_archive.py +0 -0
  253. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/test_util_attributes.py +0 -0
  254. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/test_util_cached_tasks.py +0 -0
  255. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/test_util_copy.py +0 -0
  256. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/test_util_dependencies.py +0 -0
  257. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/test_util_docker.py +0 -0
  258. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/test_util_json.py +0 -0
  259. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/test_util_keyed_by.py +0 -0
  260. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/test_util_parameterization.py +0 -0
  261. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/test_util_path.py +0 -0
  262. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/test_util_python_path.py +0 -0
  263. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/test_util_readonlydict.py +0 -0
  264. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/test_util_taskcluster.py +0 -0
  265. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/test_util_templates.py +0 -0
  266. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/test_util_time.py +0 -0
  267. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/test_util_treeherder.py +0 -0
  268. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/test_util_vcs.py +0 -0
  269. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/test_util_verify.py +0 -0
  270. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/test_util_workertypes.py +0 -0
  271. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.2.0}/test/test_util_yaml.py +0 -0
@@ -13,13 +13,13 @@ repos:
13
13
  exclude: template
14
14
  - id: check-added-large-files
15
15
  - repo: https://github.com/astral-sh/ruff-pre-commit
16
- rev: v0.15.12
16
+ rev: v0.15.15
17
17
  hooks:
18
18
  - id: ruff
19
19
  args: [--fix, --exit-non-zero-on-fix]
20
20
  - id: ruff-format
21
21
  - repo: https://github.com/astral-sh/uv-pre-commit
22
- rev: 0.11.8
22
+ rev: 0.11.17
23
23
  hooks:
24
24
  - id: uv-lock
25
25
  - repo: https://github.com/adrienverge/yamllint.git
@@ -9,6 +9,8 @@ reporting: checks-v1
9
9
  autoCancelPreviousChecks: true
10
10
  policy:
11
11
  pullRequests: public_restricted
12
+ hooks:
13
+ - name: lint/pre-commit-v1
12
14
  tasks:
13
15
  # NOTE: support for actions in ci-admin requires that the `tasks` property be an array *before* JSON-e rendering
14
16
  # takes place.
@@ -1,5 +1,24 @@
1
1
  # Change Log
2
2
 
3
+ ## [23.2.0] - 2026-06-03
4
+
5
+ ### Added
6
+
7
+ - `task-context` now calls `resolve_keyed_by` on `substitution-fields` (#968)
8
+
9
+ ## [23.1.0] - 2026-05-26
10
+
11
+ ### Added
12
+
13
+ - Updated worker types in the `.taskcluster.yml` template for the d2g migration
14
+
15
+ ### Fixed
16
+
17
+ - `TaskGraph.from_json` now skips dependencies pointing at external taskIds (e.g. from replaced or cached tasks) when rebuilding edges, instead of producing edges to non-existent graph nodes
18
+ - Schema validation errors now display a clean message instead of a noisy traceback
19
+ - Pinned `taskcluster-client` to work around an upstream issue
20
+ - `fetch_graph_and_labels` now handles `HTTPError` instances where `response` is `None`
21
+
3
22
  ## [23.0.0] - 2026-05-04
4
23
 
5
24
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: taskcluster-taskgraph
3
- Version: 23.0.0
3
+ Version: 23.2.0
4
4
  Summary: Build taskcluster taskgraphs
5
5
  Project-URL: Repository, https://github.com/taskcluster/taskgraph
6
6
  Project-URL: Issues, https://github.com/taskcluster/taskgraph/issues
@@ -4,8 +4,8 @@ Task Context Transforms
4
4
  =======================
5
5
 
6
6
  The :mod:`taskgraph.transforms.task_context` transform can be used to
7
- substitute values into any field in a task with data that is not known
8
- until ``taskgraph`` runs.
7
+ resolve keys and/or substitute values into any field in a task with data
8
+ that is not known until ``taskgraph`` runs.
9
9
 
10
10
  This data can be provided in a few ways, as described below.
11
11
 
@@ -37,7 +37,10 @@ Then create a ``task-context`` section in your task definition, e.g:
37
37
 
38
38
  tasks:
39
39
  build:
40
- description: my description {foo}
40
+ description:
41
+ by-foo:
42
+ bar: super special description for bar tasks
43
+ default: my description of {foo}
41
44
  task-context:
42
45
  from-parameters:
43
46
  foo: foo
@@ -50,9 +53,30 @@ are used:
50
53
 
51
54
  .. code-block:: yaml
52
55
 
53
- foo: with some extra
56
+ foo: bar
57
+
58
+ ...the description will end up with a value of "super special description for bar tasks".
54
59
 
55
- ...the description will end up with a value of "my description with some extra".
60
+ When ``foo`` is set to any other value (eg: ``bar``) the description will end with the
61
+ ``default`` value with the value of ``foo`` substituted in (eg: ``my description of bar``).
62
+
63
+ This pattern is often used to configure things vary based on how tasks are created. For example, the following can be used to adjust the scopes a task is given depending on the GitHub event that created the decision task:
64
+
65
+ .. code-block:: yaml
66
+
67
+ tasks:
68
+ build:
69
+ task-context:
70
+ from-parameters:
71
+ tasks_for: tasks_for
72
+ substitution-fields:
73
+ - scopes
74
+
75
+ scopes:
76
+ by-tasks-for:
77
+ github-push:
78
+ - secrets:get:project/foo/api_token
79
+ default: []
56
80
 
57
81
  When using ``from-parameters`` you may also provide an ordered list of keys to
58
82
  look for in the parameters, with the first one found being used. For example,
@@ -154,8 +178,11 @@ Finally, the name of the task is added to the context implicitly. For example:
154
178
  This will evaluate the description correctly, even though there are no
155
179
  ``task-context`` keys defined on the individual tasks.
156
180
 
157
- Precedence
158
- ----------
181
+ Order of Operations & Precedence
182
+ --------------------------------
183
+
184
+ Keys will be resolved on ``substitution-fields`` first, then substitution
185
+ will be performed on the resolved value.
159
186
 
160
187
  If the same key is found in multiple places the order of precedence is as
161
188
  follows: ``from-parameters``, ``from-object`` keys, ``from-file`` and finally
@@ -1,7 +1,7 @@
1
1
  ### Project
2
2
  [project]
3
3
  name = "taskcluster-taskgraph"
4
- version = "23.0.0"
4
+ version = "23.2.0"
5
5
  description = "Build taskcluster taskgraphs"
6
6
  readme = "README.rst"
7
7
  authors = [
@@ -0,0 +1,6 @@
1
+ {
2
+ "$schema": "https://docs.renovatebot.com/renovate-schema.json",
3
+ "extends": [
4
+ "github>mozilla-releng/reps:renovate-preset.json5"
5
+ ]
6
+ }
@@ -85,7 +85,7 @@ def fetch_graph_and_labels(parameters, graph_config, task_group_id=None):
85
85
  run_label_to_id = get_artifact(task_id, "public/label-to-taskid.json")
86
86
  label_to_taskid.update(run_label_to_id) # type: ignore
87
87
  except HTTPError as e:
88
- if e.response.status_code != 404:
88
+ if e.response is None or e.response.status_code != 404:
89
89
  raise
90
90
  logger.debug(f"No label-to-taskid.json found for {task_id}: {e}")
91
91
 
@@ -27,6 +27,7 @@ from .task import Task
27
27
  from .taskgraph import TaskGraph
28
28
  from .transforms.base import TransformConfig, TransformSequence
29
29
  from .util.python_path import find_object
30
+ from .util.schema import SchemaValidationError
30
31
  from .util.verify import verifications
31
32
  from .util.yaml import load_yaml
32
33
 
@@ -303,6 +304,9 @@ class TaskGraphGenerator:
303
304
  },
304
305
  self._write_artifacts,
305
306
  )
307
+ except SchemaValidationError as exc:
308
+ logger.error(f"Error loading tasks for kind {kind_name}:\n{exc}")
309
+ raise
306
310
  except Exception:
307
311
  logger.exception(f"Error loading tasks for kind {kind_name}:")
308
312
  raise
@@ -358,6 +362,16 @@ class TaskGraphGenerator:
358
362
  for future in done:
359
363
  if exc := future.exception():
360
364
  executor.shutdown(wait=False, cancel_futures=True)
365
+ kind_name = futures_to_kind.get(future, "?")
366
+ if isinstance(exc, SchemaValidationError):
367
+ logger.error(
368
+ f"Error loading tasks for kind {kind_name}:\n{exc}"
369
+ )
370
+ else:
371
+ logger.error(
372
+ f"Error loading tasks for kind {kind_name}:",
373
+ exc_info=(type(exc), exc, exc.__traceback__),
374
+ )
361
375
  raise exc
362
376
  kind = futures_to_kind.pop(future)
363
377
  futures.remove(future)
@@ -22,6 +22,8 @@ from urllib.parse import urlparse
22
22
  import appdirs
23
23
  import yaml
24
24
 
25
+ from taskgraph.util.schema import SchemaValidationError
26
+
25
27
  Command = namedtuple("Command", ["func", "args", "kwargs", "defaults"])
26
28
  commands = {}
27
29
 
@@ -1207,6 +1209,9 @@ def main(args=sys.argv[1:]):
1207
1209
  args = parser.parse_args(args)
1208
1210
  try:
1209
1211
  return args.command(vars(args))
1212
+ except SchemaValidationError:
1213
+ # Message was already logged; skip the traceback for user input errors.
1214
+ sys.exit(1)
1210
1215
  except Exception:
1211
1216
  traceback.print_exc()
1212
1217
  sys.exit(1)
@@ -63,6 +63,8 @@ class TaskGraph:
63
63
  if "task_id" in value:
64
64
  tasks[key].task_id = value["task_id"]
65
65
  for depname, dep in value["dependencies"].items():
66
- edges.add((key, dep, depname))
66
+ # Task filtering can cause dependencies to be removed from the graph.
67
+ if dep in tasks_dict:
68
+ edges.add((key, dep, depname))
67
69
  task_graph = cls(tasks, Graph(frozenset(tasks), edges))
68
70
  return tasks, task_graph
@@ -1,14 +1,20 @@
1
1
  from typing import Optional, Union
2
2
 
3
3
  from taskgraph.transforms.base import TransformSequence
4
- from taskgraph.util.schema import Schema
4
+ from taskgraph.util.schema import Schema, resolve_keyed_by
5
5
  from taskgraph.util.templates import deep_get, substitute_task_fields
6
6
  from taskgraph.util.yaml import load_yaml
7
7
 
8
8
 
9
+ class ResolveKeyedByConfigOptions(Schema):
10
+ # forwarded to `resolve_keyed_by`; see that function for details
11
+ defer: Optional[list[str]] = None
12
+ enforce_single_match: Optional[bool] = None
13
+
14
+
9
15
  class TaskContextConfig(Schema):
10
16
  # A list of fields in the task to substitute the provided values
11
- # into.
17
+ # into and/or resolve keys in.
12
18
  substitution_fields: list[str]
13
19
  # Retrieve task context values from parameters. A single
14
20
  # parameter may be provided or a list of parameters in
@@ -22,13 +28,15 @@ class TaskContextConfig(Schema):
22
28
  from_file: Optional[str] = None
23
29
  # Key/value pairs to be used as task context
24
30
  from_object: Optional[object] = None
31
+ resolve_keyed_by_options: Optional[ResolveKeyedByConfigOptions] = None
25
32
 
26
33
 
27
34
  #: Schema for the task_context transforms
28
35
  class TaskContextSchema(Schema, forbid_unknown_fields=False, kw_only=True):
29
36
  name: Optional[str] = None
30
- # `task-context` can be used to substitute values into any field in a
31
- # task with data that is not known until `taskgraph` runs.
37
+ # `task-context` can be used to substitute values into any field or resolve
38
+ # keys in a field in a task with data that is not known until `taskgraph`
39
+ # runs.
32
40
  #
33
41
  # This data can be provided via `from-parameters` or `from-file`,
34
42
  # which can pull in values from parameters and a defined yml file
@@ -46,6 +54,9 @@ class TaskContextSchema(Schema, forbid_unknown_fields=False, kw_only=True):
46
54
  # - File
47
55
  #
48
56
  # That is to say: parameters will always override anything else.
57
+ #
58
+ # Each entry in `substitution-fields` will first have `resolved_keyed_by`
59
+ # called on it, and then substitutions will be performed.
49
60
  task_context: Optional[TaskContextConfig] = None
50
61
 
51
62
 
@@ -89,6 +100,10 @@ def render_task(config, tasks):
89
100
  if "name" in task:
90
101
  subs.setdefault("name", task["name"])
91
102
 
92
- # Now that we have our combined context, we can substitute.
103
+ # Now that we have our combined context, we can resolve keys and substitute.
104
+ task_name = task.get("name", task.get("label", "?"))
105
+ resolve_keyed_by_options = sub_config.get("resolve-keyed-by-options") or {}
106
+ for field in fields:
107
+ resolve_keyed_by(task, field, task_name, **resolve_keyed_by_options, **subs)
93
108
  substitute_task_fields(task, fields, **subs)
94
109
  yield task
@@ -23,6 +23,14 @@ TaskPriority = Literal[
23
23
  ]
24
24
 
25
25
 
26
+ class SchemaValidationError(Exception):
27
+ """Raised when user-supplied data fails schema validation.
28
+
29
+ Callers should display the message without a Python traceback, since
30
+ these reflect input errors rather than programmer bugs.
31
+ """
32
+
33
+
26
34
  def validate_schema(schema, obj, msg_prefix):
27
35
  """
28
36
  Validate that object satisfies schema. If not, generate a useful exception
@@ -65,9 +73,13 @@ def validate_schema(schema, obj, msg_prefix):
65
73
  msg = [msg_prefix]
66
74
  for error in exc.errors:
67
75
  msg.append(str(error))
68
- raise Exception("\n".join(msg) + "\n" + pprint.pformat(obj))
76
+ raise SchemaValidationError(
77
+ "\n".join(msg) + "\n" + pprint.pformat(obj)
78
+ ) from None
69
79
  else:
70
- raise Exception(f"{msg_prefix}\n{str(exc)}\n{pprint.pformat(obj)}")
80
+ raise SchemaValidationError(
81
+ f"{msg_prefix}\n{str(exc)}\n{pprint.pformat(obj)}"
82
+ ) from None
71
83
 
72
84
 
73
85
  class OptionallyKeyedBy:
@@ -456,11 +468,7 @@ class Schema(
456
468
  """Validate data against this schema."""
457
469
  if taskgraph.fast:
458
470
  return data
459
-
460
- try:
461
- msgspec.convert(data, cls)
462
- except (msgspec.ValidationError, msgspec.DecodeError) as e:
463
- raise msgspec.ValidationError(str(e))
471
+ msgspec.convert(data, cls)
464
472
 
465
473
 
466
474
  class IndexSchema(Schema):
@@ -8,6 +8,7 @@ treeherder:
8
8
  'doc': 'Documentation tasks'
9
9
  'unit': 'Unit test tasks'
10
10
  'unit-multithread': 'Unit test tasks with multithreading enabled'
11
+ 'unit-serial': 'Unit test tasks with serial enabled'
11
12
  'integration': 'Integration test tasks'
12
13
 
13
14
  index:
@@ -4,7 +4,7 @@
4
4
  "start": "node index.js"
5
5
  },
6
6
  "dependencies": {
7
- "taskcluster-client": "^55.3"
7
+ "taskcluster-client": "55.3.2"
8
8
  },
9
9
  "engines": {
10
10
  "node": "18"
@@ -41,26 +41,21 @@
41
41
  defer-to-connect "^2.0.0"
42
42
 
43
43
  "@types/cacheable-request@^6.0.1":
44
- version "6.0.2"
45
- resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.2.tgz#c324da0197de0a98a2312156536ae262429ff6b9"
46
- integrity sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==
44
+ version "6.0.3"
45
+ resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.3.tgz#a430b3260466ca7b5ca5bfd735693b36e7a9d183"
46
+ integrity sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==
47
47
  dependencies:
48
48
  "@types/http-cache-semantics" "*"
49
- "@types/keyv" "*"
49
+ "@types/keyv" "^3.1.4"
50
50
  "@types/node" "*"
51
- "@types/responselike" "*"
51
+ "@types/responselike" "^1.0.0"
52
52
 
53
53
  "@types/http-cache-semantics@*":
54
- version "4.0.1"
55
- resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#0ea7b61496902b95890dc4c3a116b60cb8dae812"
56
- integrity sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==
57
-
58
- "@types/json-buffer@~3.0.0":
59
- version "3.0.0"
60
- resolved "https://registry.yarnpkg.com/@types/json-buffer/-/json-buffer-3.0.0.tgz#85c1ff0f0948fc159810d4b5be35bf8c20875f64"
61
- integrity sha512-3YP80IxxFJB4b5tYC2SUPwkg0XQLiu0nWvhRgEatgjf+29IcWO9X1k8xRv5DGssJ/lCrjYTjQPcobJr2yWIVuQ==
54
+ version "4.2.0"
55
+ resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz#f6a7788f438cbfde15f29acad46512b4c01913b3"
56
+ integrity sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==
62
57
 
63
- "@types/keyv@*":
58
+ "@types/keyv@^3.1.4":
64
59
  version "3.1.4"
65
60
  resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.4.tgz#3ccdb1c6751b0c7e52300bcdacd5bcbf8faa75b6"
66
61
  integrity sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==
@@ -68,14 +63,16 @@
68
63
  "@types/node" "*"
69
64
 
70
65
  "@types/node@*":
71
- version "18.0.0"
72
- resolved "https://registry.yarnpkg.com/@types/node/-/node-18.0.0.tgz#67c7b724e1bcdd7a8821ce0d5ee184d3b4dd525a"
73
- integrity sha512-cHlGmko4gWLVI27cGJntjs/Sj8th9aYwplmZFwmmgYQQvL5NUsgVJG7OddLvNfLqYS31KFN0s3qlaD9qCaxACA==
74
-
75
- "@types/responselike@*", "@types/responselike@^1.0.0":
76
- version "1.0.0"
77
- resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29"
78
- integrity sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==
66
+ version "25.9.1"
67
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-25.9.1.tgz#3bda556db500ae4319c08e7fc9ab94f19013ba0b"
68
+ integrity sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg==
69
+ dependencies:
70
+ undici-types ">=7.24.0 <7.24.7"
71
+
72
+ "@types/responselike@^1.0.0":
73
+ version "1.0.3"
74
+ resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.3.tgz#cc29706f0a397cfe6df89debfe4bf5cea159db50"
75
+ integrity sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==
79
76
  dependencies:
80
77
  "@types/node" "*"
81
78
 
@@ -85,9 +82,9 @@ cacheable-lookup@^5.0.3:
85
82
  integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==
86
83
 
87
84
  cacheable-request@^7.0.2:
88
- version "7.0.2"
89
- resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.2.tgz#ea0d0b889364a25854757301ca12b2da77f91d27"
90
- integrity sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==
85
+ version "7.0.4"
86
+ resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.4.tgz#7a33ebf08613178b403635be7b899d3e69bbe817"
87
+ integrity sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==
91
88
  dependencies:
92
89
  clone-response "^1.0.2"
93
90
  get-stream "^5.1.0"
@@ -98,26 +95,18 @@ cacheable-request@^7.0.2:
98
95
  responselike "^2.0.0"
99
96
 
100
97
  clone-response@^1.0.2:
101
- version "1.0.2"
102
- resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b"
103
- integrity sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q==
98
+ version "1.0.3"
99
+ resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.3.tgz#af2032aa47816399cf5f0a1d0db902f517abb8c3"
100
+ integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==
104
101
  dependencies:
105
102
  mimic-response "^1.0.0"
106
103
 
107
- compress-brotli@^1.3.8:
108
- version "1.3.8"
109
- resolved "https://registry.yarnpkg.com/compress-brotli/-/compress-brotli-1.3.8.tgz#0c0a60c97a989145314ec381e84e26682e7b38db"
110
- integrity sha512-lVcQsjhxhIXsuupfy9fmZUFtAIdBmXA7EGY6GBdgZ++qkM9zG4YFT8iU7FoBxzryNDMOpD1HIFHUSX4D87oqhQ==
111
- dependencies:
112
- "@types/json-buffer" "~3.0.0"
113
- json-buffer "~3.0.1"
114
-
115
104
  debug@^4.1.1:
116
- version "4.3.4"
117
- resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
118
- integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
105
+ version "4.4.3"
106
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a"
107
+ integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==
119
108
  dependencies:
120
- ms "2.1.2"
109
+ ms "^2.1.3"
121
110
 
122
111
  decompress-response@^6.0.0:
123
112
  version "6.0.0"
@@ -132,9 +121,9 @@ defer-to-connect@^2.0.0:
132
121
  integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==
133
122
 
134
123
  end-of-stream@^1.1.0:
135
- version "1.4.4"
136
- resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
137
- integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
124
+ version "1.4.5"
125
+ resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.5.tgz#7344d711dea40e0b74abc2ed49778743ccedb08c"
126
+ integrity sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==
138
127
  dependencies:
139
128
  once "^1.4.0"
140
129
 
@@ -146,9 +135,9 @@ get-stream@^5.1.0:
146
135
  pump "^3.0.0"
147
136
 
148
137
  got@^11.8.1:
149
- version "11.8.5"
150
- resolved "https://registry.yarnpkg.com/got/-/got-11.8.5.tgz#ce77d045136de56e8f024bebb82ea349bc730046"
151
- integrity sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==
138
+ version "11.8.6"
139
+ resolved "https://registry.yarnpkg.com/got/-/got-11.8.6.tgz#276e827ead8772eddbcfc97170590b841823233a"
140
+ integrity sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==
152
141
  dependencies:
153
142
  "@sindresorhus/is" "^4.0.0"
154
143
  "@szmarczak/http-timer" "^4.0.5"
@@ -163,9 +152,9 @@ got@^11.8.1:
163
152
  responselike "^2.0.0"
164
153
 
165
154
  hawk@^9.0.1:
166
- version "9.0.1"
167
- resolved "https://registry.yarnpkg.com/hawk/-/hawk-9.0.1.tgz#0be51769103e76fe97a97ae7fa356c313bb93160"
168
- integrity sha512-H2E+5ATFEXmorgVzYl3NzG3PCo2e+euYrHDnRpLLdOtJrQHGRXrJT9/joWnrkHCtzDZkaNoLXg/+TsSkD06eNg==
155
+ version "9.0.2"
156
+ resolved "https://registry.yarnpkg.com/hawk/-/hawk-9.0.2.tgz#64b18c109d86b3a4b3174a76169f2c868297d0c0"
157
+ integrity sha512-EJMLBZAWg+EoI/aAJWDhrYGvucWYvY37CdGXolkol0ITGswkDHtDnjbFcPBaIv3jbtpfWqYjXMm4KhfXPOLCRg==
169
158
  dependencies:
170
159
  "@hapi/b64" "5.x.x"
171
160
  "@hapi/boom" "9.x.x"
@@ -173,9 +162,9 @@ hawk@^9.0.1:
173
162
  "@hapi/hoek" "9.x.x"
174
163
 
175
164
  http-cache-semantics@^4.0.0:
176
- version "4.1.0"
177
- resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390"
178
- integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==
165
+ version "4.2.0"
166
+ resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz#205f4db64f8562b76a4ff9235aa5279839a09dd5"
167
+ integrity sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==
179
168
 
180
169
  http2-wrapper@^1.0.0-beta.5.2:
181
170
  version "1.0.3"
@@ -185,23 +174,22 @@ http2-wrapper@^1.0.0-beta.5.2:
185
174
  quick-lru "^5.1.1"
186
175
  resolve-alpn "^1.0.0"
187
176
 
188
- json-buffer@3.0.1, json-buffer@~3.0.1:
177
+ json-buffer@3.0.1:
189
178
  version "3.0.1"
190
179
  resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13"
191
180
  integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==
192
181
 
193
182
  keyv@^4.0.0:
194
- version "4.3.2"
195
- resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.3.2.tgz#e839df676a0c7ee594c8835e7c1c83742558e5c2"
196
- integrity sha512-kn8WmodVBe12lmHpA6W8OY7SNh6wVR+Z+wZESF4iF5FCazaVXGWOtnbnvX0tMQ1bO+/TmOD9LziuYMvrIIs0xw==
183
+ version "4.5.4"
184
+ resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93"
185
+ integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==
197
186
  dependencies:
198
- compress-brotli "^1.3.8"
199
187
  json-buffer "3.0.1"
200
188
 
201
189
  lodash@^4.17.4:
202
- version "4.17.21"
203
- resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
204
- integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
190
+ version "4.18.1"
191
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.18.1.tgz#ff2b66c1f6326d59513de2407bf881439812771c"
192
+ integrity sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==
205
193
 
206
194
  lowercase-keys@^2.0.0:
207
195
  version "2.0.0"
@@ -218,10 +206,10 @@ mimic-response@^3.1.0:
218
206
  resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9"
219
207
  integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==
220
208
 
221
- ms@2.1.2:
222
- version "2.1.2"
223
- resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
224
- integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
209
+ ms@^2.1.3:
210
+ version "2.1.3"
211
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
212
+ integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
225
213
 
226
214
  normalize-url@^6.0.1:
227
215
  version "6.1.0"
@@ -241,9 +229,9 @@ p-cancelable@^2.0.0:
241
229
  integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==
242
230
 
243
231
  pump@^3.0.0:
244
- version "3.0.0"
245
- resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
246
- integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
232
+ version "3.0.4"
233
+ resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.4.tgz#1f313430527fa8b905622ebd22fe1444e757ab3c"
234
+ integrity sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==
247
235
  dependencies:
248
236
  end-of-stream "^1.1.0"
249
237
  once "^1.3.1"
@@ -259,9 +247,9 @@ resolve-alpn@^1.0.0:
259
247
  integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==
260
248
 
261
249
  responselike@^2.0.0:
262
- version "2.0.0"
263
- resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.0.tgz#26391bcc3174f750f9a79eacc40a12a5c42d7723"
264
- integrity sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==
250
+ version "2.0.1"
251
+ resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.1.tgz#9a0bc8fdc252f3fb1cca68b016591059ba1422bc"
252
+ integrity sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==
265
253
  dependencies:
266
254
  lowercase-keys "^2.0.0"
267
255
 
@@ -272,7 +260,7 @@ slugid@^4.0.0:
272
260
  dependencies:
273
261
  uuid "^9.0.0"
274
262
 
275
- taskcluster-client@^55.3:
263
+ taskcluster-client@55.3.2:
276
264
  version "55.3.2"
277
265
  resolved "https://registry.yarnpkg.com/taskcluster-client/-/taskcluster-client-55.3.2.tgz#1b518dee818a58ac3a325dfda3772449e5a331c8"
278
266
  integrity sha512-EmPpIaNQsciBbitOC78QvV9MOjUnrDIShBjdJZOxn7NyHXeZIR3m4nZt9M/FeoyEOpm7EHYaij/lABF7GLMjWA==
@@ -285,9 +273,14 @@ taskcluster-client@^55.3:
285
273
  taskcluster-lib-urls "^13.0.0"
286
274
 
287
275
  taskcluster-lib-urls@^13.0.0:
288
- version "13.0.1"
289
- resolved "https://registry.yarnpkg.com/taskcluster-lib-urls/-/taskcluster-lib-urls-13.0.1.tgz#773da8bb9937a52f77ad128961b8d501dfdd042a"
290
- integrity sha512-WrhKMbiWmpPrB0vbzLZq4W35mhdPVLklZY+qrBoI7KQzFAjO/qsgS8ssHL6eYmvBf4fE7C+C9ZFxQpQOUynQvg==
276
+ version "13.0.2"
277
+ resolved "https://registry.yarnpkg.com/taskcluster-lib-urls/-/taskcluster-lib-urls-13.0.2.tgz#27b1ad7bdc1b7bc96b700d876c4e0d5021ee0fa1"
278
+ integrity sha512-onspRpWupIjB15vkvvSAXdtpvgWsKNOCRhcjg1p9GrxodJeW45Os7BK7azMlX7aNqi8uOj4zqB6cokxsLp2uFw==
279
+
280
+ "undici-types@>=7.24.0 <7.24.7":
281
+ version "7.24.6"
282
+ resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.24.6.tgz#61275b485d7fd4e9d269c7cf04ec2873c9cc0f91"
283
+ integrity sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==
291
284
 
292
285
  uuid@^9.0.0:
293
286
  version "9.0.1"
@@ -70,6 +70,26 @@ unit-multithread:
70
70
  command: >-
71
71
  uv run coverage run --data-file /builds/worker/artifacts/coverage --context=py{matrix[python]} -m pytest -vv
72
72
 
73
+ unit-serial:
74
+ description: "Run unit tests with py{matrix[python]} on Linux in serial mode"
75
+ matrix:
76
+ set-name: "unit-serial-py{matrix[python]}"
77
+ substitution-fields: [description, run.command, treeherder, worker, attributes]
78
+ python: ["314"]
79
+ worker:
80
+ docker-image: {in-tree: python}
81
+ env:
82
+ TASKGRAPH_SERIAL: "1"
83
+ artifacts:
84
+ - type: file
85
+ path: "/builds/worker/artifacts/coverage"
86
+ name: "public/coverage.py{matrix[python]}"
87
+ treeherder:
88
+ symbol: unit-serial(py{matrix[python]})
89
+ run:
90
+ command: >-
91
+ uv run coverage run --data-file /builds/worker/artifacts/coverage --context=py{matrix[python]} -m pytest -vv
92
+
73
93
  integration:
74
94
  description: "Run unit tests with py{matrix[python]} on Linux with resolution {matrix[resolution]}"
75
95
  attributes: