taskcluster-taskgraph 24.0.0__tar.gz → 24.1.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-24.0.0 → taskcluster_taskgraph-24.1.0}/.github/workflows/codeql-analysis.yml +4 -4
  2. taskcluster_taskgraph-24.1.0/.github/workflows/codspeed.yml +31 -0
  3. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/.github/workflows/pypi-publish.yml +15 -9
  4. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/.gitignore +1 -0
  5. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/CHANGELOG.md +6 -0
  6. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/PKG-INFO +5 -1
  7. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/README.rst +4 -0
  8. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/docs/reference/transforms/task_context.rst +81 -30
  9. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/pyproject.toml +2 -1
  10. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/transforms/task_context.py +16 -0
  11. taskcluster_taskgraph-24.1.0/src/taskgraph/util/task_context.py +20 -0
  12. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/taskcluster/docker/index-task/yarn.lock +3 -3
  13. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/data/task_context.yml +1 -0
  14. taskcluster_taskgraph-24.1.0/test/test_graph_perf.py +218 -0
  15. taskcluster_taskgraph-24.1.0/test/test_transform_task_context.py +348 -0
  16. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/uv.lock +223 -36
  17. taskcluster_taskgraph-24.0.0/test/test_transform_task_context.py +0 -222
  18. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/.codespell-ignore-words.txt +0 -0
  19. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/.github/CODEOWNERS +0 -0
  20. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/.pre-commit-config.yaml +0 -0
  21. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/.readthedocs.yaml +0 -0
  22. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/.taskcluster.yml +0 -0
  23. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/.yamllint +0 -0
  24. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/CODE_OF_CONDUCT.md +0 -0
  25. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/CONTRIBUTING.rst +0 -0
  26. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/LICENSE +0 -0
  27. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/Makefile +0 -0
  28. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/docs/concepts/index.rst +0 -0
  29. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/docs/concepts/kind.rst +0 -0
  30. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/docs/concepts/loading.rst +0 -0
  31. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/docs/concepts/optimization.rst +0 -0
  32. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/docs/concepts/overview.rst +0 -0
  33. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/docs/concepts/scopes.rst +0 -0
  34. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/docs/concepts/task-graphs.rst +0 -0
  35. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/docs/concepts/transforms.rst +0 -0
  36. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/docs/conf.py +0 -0
  37. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/docs/contributing.rst +0 -0
  38. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/docs/glossary.rst +0 -0
  39. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/docs/howto/bootstrap-taskgraph.rst +0 -0
  40. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/docs/howto/create-actions.rst +0 -0
  41. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/docs/howto/create-tasks.rst +0 -0
  42. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/docs/howto/debugging.rst +0 -0
  43. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/docs/howto/define-schemas.rst +0 -0
  44. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/docs/howto/docker.rst +0 -0
  45. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/docs/howto/index.rst +0 -0
  46. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/docs/howto/load-task-locally.rst +0 -0
  47. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/docs/howto/resolve-keyed-by.rst +0 -0
  48. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/docs/howto/run-locally.rst +0 -0
  49. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/docs/howto/send-notifications.rst +0 -0
  50. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/docs/howto/use-fetches.rst +0 -0
  51. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/docs/index.rst +0 -0
  52. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/docs/reference/cli.rst +0 -0
  53. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/docs/reference/index.rst +0 -0
  54. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/docs/reference/migrations.rst +0 -0
  55. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/docs/reference/optimization-strategies.rst +0 -0
  56. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/docs/reference/parameters.rst +0 -0
  57. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/docs/reference/source/modules.rst +0 -0
  58. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/docs/reference/source/taskgraph.actions.rst +0 -0
  59. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/docs/reference/source/taskgraph.loader.rst +0 -0
  60. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/docs/reference/source/taskgraph.optimize.rst +0 -0
  61. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/docs/reference/source/taskgraph.rst +0 -0
  62. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/docs/reference/source/taskgraph.transforms.rst +0 -0
  63. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/docs/reference/source/taskgraph.transforms.run.rst +0 -0
  64. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/docs/reference/source/taskgraph.util.rst +0 -0
  65. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/docs/reference/transforms/chunking.rst +0 -0
  66. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/docs/reference/transforms/from_deps.rst +0 -0
  67. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/docs/reference/transforms/index.rst +0 -0
  68. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/docs/reference/transforms/matrix.rst +0 -0
  69. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/docs/tutorials/connecting-taskcluster.rst +0 -0
  70. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/docs/tutorials/creating-a-task-graph.rst +0 -0
  71. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/docs/tutorials/example-taskcluster.yml +0 -0
  72. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/docs/tutorials/getting-started.rst +0 -0
  73. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/docs/tutorials/index.rst +0 -0
  74. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/make.bat +0 -0
  75. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/packages/pytest-taskgraph/README.md +0 -0
  76. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/packages/pytest-taskgraph/pyproject.toml +0 -0
  77. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/packages/pytest-taskgraph/src/pytest_taskgraph/__init__.py +0 -0
  78. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/packages/pytest-taskgraph/src/pytest_taskgraph/fixtures/gen.py +0 -0
  79. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/packages/pytest-taskgraph/src/pytest_taskgraph/fixtures/vcs.py +0 -0
  80. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/packages/sphinx-taskgraph/README.md +0 -0
  81. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/packages/sphinx-taskgraph/pyproject.toml +0 -0
  82. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/packages/sphinx-taskgraph/src/sphinx_taskgraph/__init__.py +0 -0
  83. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/packages/sphinx-taskgraph/src/sphinx_taskgraph/autoschema.py +0 -0
  84. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/renovate.json +0 -0
  85. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/__init__.py +0 -0
  86. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/actions/__init__.py +0 -0
  87. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/actions/add_new_jobs.py +0 -0
  88. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/actions/cancel.py +0 -0
  89. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/actions/cancel_all.py +0 -0
  90. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/actions/rebuild_cached_tasks.py +0 -0
  91. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/actions/registry.py +0 -0
  92. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/actions/retrigger.py +0 -0
  93. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/actions/util.py +0 -0
  94. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/config.py +0 -0
  95. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/create.py +0 -0
  96. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/decision.py +0 -0
  97. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/docker.py +0 -0
  98. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/filter_tasks.py +0 -0
  99. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/generator.py +0 -0
  100. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/graph.py +0 -0
  101. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/loader/__init__.py +0 -0
  102. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/loader/default.py +0 -0
  103. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/loader/transform.py +0 -0
  104. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/main.py +0 -0
  105. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/morph.py +0 -0
  106. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/optimize/__init__.py +0 -0
  107. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/optimize/base.py +0 -0
  108. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/optimize/strategies.py +0 -0
  109. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/parameters.py +0 -0
  110. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/run-task/fetch-content +0 -0
  111. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/run-task/hgrc +0 -0
  112. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/run-task/robustcheckout.py +0 -0
  113. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/run-task/run-task +0 -0
  114. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/target_tasks.py +0 -0
  115. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/task.py +0 -0
  116. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/taskgraph.py +0 -0
  117. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/transforms/__init__.py +0 -0
  118. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/transforms/base.py +0 -0
  119. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/transforms/cached_tasks.py +0 -0
  120. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/transforms/chunking.py +0 -0
  121. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/transforms/code_review.py +0 -0
  122. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/transforms/docker_image.py +0 -0
  123. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/transforms/fetch.py +0 -0
  124. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/transforms/from_deps.py +0 -0
  125. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/transforms/matrix.py +0 -0
  126. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/transforms/notify.py +0 -0
  127. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/transforms/run/__init__.py +0 -0
  128. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/transforms/run/common.py +0 -0
  129. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/transforms/run/index_search.py +0 -0
  130. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/transforms/run/run_task.py +0 -0
  131. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/transforms/run/toolchain.py +0 -0
  132. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/transforms/task.py +0 -0
  133. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/util/__init__.py +0 -0
  134. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/util/archive.py +0 -0
  135. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/util/attributes.py +0 -0
  136. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/util/cached_tasks.py +0 -0
  137. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/util/caches.py +0 -0
  138. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/util/copy.py +0 -0
  139. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/util/dependencies.py +0 -0
  140. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/util/docker.py +0 -0
  141. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/util/hash.py +0 -0
  142. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/util/json.py +0 -0
  143. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/util/keyed_by.py +0 -0
  144. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/util/parameterization.py +0 -0
  145. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/util/path.py +0 -0
  146. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/util/python_path.py +0 -0
  147. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/util/readonlydict.py +0 -0
  148. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/util/schema.py +0 -0
  149. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/util/set_name.py +0 -0
  150. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/util/shell.py +0 -0
  151. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/util/taskcluster.py +0 -0
  152. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/util/taskgraph.py +0 -0
  153. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/util/templates.py +0 -0
  154. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/util/time.py +0 -0
  155. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/util/treeherder.py +0 -0
  156. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/util/vcs.py +0 -0
  157. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/util/verify.py +0 -0
  158. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/util/workertypes.py +0 -0
  159. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/src/taskgraph/util/yaml.py +0 -0
  160. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/taskcluster/config.yml +0 -0
  161. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/taskcluster/docker/REGISTRY +0 -0
  162. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/taskcluster/docker/decision/Dockerfile +0 -0
  163. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/taskcluster/docker/decision/HASH +0 -0
  164. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/taskcluster/docker/decision/README.md +0 -0
  165. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/taskcluster/docker/decision/VERSION +0 -0
  166. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/taskcluster/docker/decision/system-setup.sh +0 -0
  167. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/taskcluster/docker/fetch/Dockerfile +0 -0
  168. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/taskcluster/docker/image_builder/README.rst +0 -0
  169. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/taskcluster/docker/index-task/Dockerfile +0 -0
  170. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/taskcluster/docker/index-task/README +0 -0
  171. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/taskcluster/docker/index-task/insert-indexes.js +0 -0
  172. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/taskcluster/docker/index-task/package.json +0 -0
  173. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/taskcluster/docker/python/Dockerfile +0 -0
  174. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/taskcluster/docker/run-task/Dockerfile +0 -0
  175. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/taskcluster/docker/run-task/system-setup.sh +0 -0
  176. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/taskcluster/docker/skopeo/Dockerfile +0 -0
  177. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/taskcluster/docker/skopeo/policy.json +0 -0
  178. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/taskcluster/docker/skopeo/push_image.sh +0 -0
  179. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/taskcluster/kinds/check/kind.yml +0 -0
  180. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/taskcluster/kinds/codecov/kind.yml +0 -0
  181. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/taskcluster/kinds/complete/kind.yml +0 -0
  182. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/taskcluster/kinds/doc/kind.yml +0 -0
  183. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/taskcluster/kinds/docker-image/kind.yml +0 -0
  184. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/taskcluster/kinds/fetch/kind.yml +0 -0
  185. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/taskcluster/kinds/push-image/kind.yml +0 -0
  186. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/taskcluster/kinds/test/kind.yml +0 -0
  187. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/taskcluster/kinds/test/linux.yml +0 -0
  188. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/taskcluster/kinds/test/windows.yml +0 -0
  189. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/taskcluster/scripts/codecov-upload.py +0 -0
  190. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/taskcluster/self_taskgraph/__init__.py +0 -0
  191. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/taskcluster/self_taskgraph/custom_parameters.py +0 -0
  192. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/taskcluster/self_taskgraph/custom_target_tasks.py +0 -0
  193. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/taskcluster/self_taskgraph/transforms/add_pr_route.py +0 -0
  194. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/taskcluster/self_taskgraph/transforms/push_image.py +0 -0
  195. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/taskcluster/test/params/main-repo-pull-request-untrusted.yml +0 -0
  196. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/taskcluster/test/params/main-repo-pull-request.yml +0 -0
  197. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/taskcluster/test/params/main-repo-push.yml +0 -0
  198. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/taskcluster/test/params/main-repo-release-pytest-taskgraph.yml +0 -0
  199. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/taskcluster/test/params/main-repo-release-taskcluster-taskgraph.yml +0 -0
  200. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/template/cookiecutter.json +0 -0
  201. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/template/hooks/post_gen_project.py +0 -0
  202. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/template/{{cookiecutter.project_name}}/taskcluster/config.yml +0 -0
  203. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/template/{{cookiecutter.project_name}}/taskcluster/docker/linux/Dockerfile +0 -0
  204. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/template/{{cookiecutter.project_name}}/taskcluster/kinds/docker-image/kind.yml +0 -0
  205. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/template/{{cookiecutter.project_name}}/taskcluster/kinds/hello/kind.yml +0 -0
  206. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/template/{{cookiecutter.project_name}}/taskcluster/{{cookiecutter.project_slug}}_taskgraph/transforms/hello.py +0 -0
  207. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/template/{{cookiecutter.project_name}}/taskcluster.github.yml +0 -0
  208. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/__init__.py +0 -0
  209. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/automationrelevance.json +0 -0
  210. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/conftest.py +0 -0
  211. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/data/taskcluster/config.yml +0 -0
  212. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/data/taskcluster/docker/hello-world/Dockerfile +0 -0
  213. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/data/taskcluster/docker/hello-world-tag/Dockerfile +0 -0
  214. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/data/taskcluster/docker/hello-world-tag/REGISTRY +0 -0
  215. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/data/taskcluster/docker/hello-world-tag/VERSION +0 -0
  216. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/data/taskcluster/kinds/docker-image/kind.yml +0 -0
  217. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/data/taskcluster/scripts/toolchain/run.ps1 +0 -0
  218. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/data/taskcluster/scripts/toolchain/run.sh +0 -0
  219. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/data/taskcluster/test_taskgraph/transforms/foo.py +0 -0
  220. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/data/testmod/thing.py +0 -0
  221. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/mockedopen.py +0 -0
  222. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/test_actions_rebuild_cached_tasks.py +0 -0
  223. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/test_actions_registry.py +0 -0
  224. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/test_config.py +0 -0
  225. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/test_create.py +0 -0
  226. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/test_decision.py +0 -0
  227. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/test_docker.py +0 -0
  228. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/test_generator.py +0 -0
  229. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/test_graph.py +0 -0
  230. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/test_main.py +0 -0
  231. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/test_morph.py +0 -0
  232. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/test_optimize.py +0 -0
  233. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/test_optimize_strategies.py +0 -0
  234. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/test_parameters.py +0 -0
  235. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/test_scripts_fetch_content.py +0 -0
  236. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/test_scripts_run_task.py +0 -0
  237. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/test_target_tasks.py +0 -0
  238. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/test_taskgraph.py +0 -0
  239. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/test_transform_chunking.py +0 -0
  240. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/test_transform_docker_image.py +0 -0
  241. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/test_transforms_base.py +0 -0
  242. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/test_transforms_cached_tasks.py +0 -0
  243. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/test_transforms_fetch.py +0 -0
  244. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/test_transforms_from_deps.py +0 -0
  245. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/test_transforms_matrix.py +0 -0
  246. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/test_transforms_notify.py +0 -0
  247. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/test_transforms_run.py +0 -0
  248. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/test_transforms_run_run_task.py +0 -0
  249. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/test_transforms_run_toolchain.py +0 -0
  250. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/test_transforms_task.py +0 -0
  251. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/test_util_archive.py +0 -0
  252. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/test_util_attributes.py +0 -0
  253. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/test_util_cached_tasks.py +0 -0
  254. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/test_util_copy.py +0 -0
  255. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/test_util_dependencies.py +0 -0
  256. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/test_util_docker.py +0 -0
  257. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/test_util_json.py +0 -0
  258. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/test_util_keyed_by.py +0 -0
  259. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/test_util_parameterization.py +0 -0
  260. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/test_util_path.py +0 -0
  261. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/test_util_python_path.py +0 -0
  262. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/test_util_readonlydict.py +0 -0
  263. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/test_util_schema.py +0 -0
  264. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/test_util_taskcluster.py +0 -0
  265. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/test_util_templates.py +0 -0
  266. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/test_util_time.py +0 -0
  267. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/test_util_treeherder.py +0 -0
  268. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/test_util_vcs.py +0 -0
  269. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/test_util_verify.py +0 -0
  270. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/test_util_workertypes.py +0 -0
  271. {taskcluster_taskgraph-24.0.0 → taskcluster_taskgraph-24.1.0}/test/test_util_yaml.py +0 -0
@@ -39,10 +39,10 @@ jobs:
39
39
 
40
40
  steps:
41
41
  - name: Checkout repository
42
- uses: actions/checkout@v3
42
+ uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
43
43
  # Initializes the CodeQL tools for scanning.
44
44
  - name: Initialize CodeQL
45
- uses: github/codeql-action/init@v2
45
+ uses: github/codeql-action/init@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4.36.2
46
46
  with:
47
47
  languages: ${{ matrix.language }}
48
48
  # If you wish to specify custom queries, you can do so here or in a config file.
@@ -55,7 +55,7 @@ jobs:
55
55
  # Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
56
56
  # If this step fails, then you should remove it and run the build manually (see below)
57
57
  - name: Autobuild
58
- uses: github/codeql-action/autobuild@v2
58
+ uses: github/codeql-action/autobuild@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4.36.2
59
59
 
60
60
  # ℹ️ Command-line programs to run using the OS shell.
61
61
  # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
@@ -67,4 +67,4 @@ jobs:
67
67
  # echo "Run, Build Application using script"
68
68
  # ./location_of_script_within_repo/buildscript.sh
69
69
  - name: Perform CodeQL Analysis
70
- uses: github/codeql-action/analyze@v2
70
+ uses: github/codeql-action/analyze@8aad20d150bbac5944a9f9d289da16a4b0d87c1e # v4.36.2
@@ -0,0 +1,31 @@
1
+ ---
2
+ name: CodSpeed
3
+
4
+ on:
5
+ push:
6
+ branches:
7
+ - main
8
+ pull_request:
9
+ # `workflow_dispatch` allows CodSpeed to trigger backtest
10
+ # performance analysis in order to generate initial data.
11
+ workflow_dispatch:
12
+
13
+ jobs:
14
+ benchmarks:
15
+ name: Run benchmarks
16
+ runs-on: ubuntu-latest
17
+ permissions:
18
+ contents: read # required for actions/checkout
19
+ id-token: write # required for OIDC authentication with CodSpeed
20
+ steps:
21
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
22
+ - uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
23
+ with:
24
+ python-version: "3.12"
25
+ - name: Install dependencies
26
+ run: uv sync
27
+ - name: Run benchmarks
28
+ uses: CodSpeedHQ/action@9d332c4d90b43981c3e55ae8e38e68709996240f # v4.17.0
29
+ with:
30
+ mode: simulation
31
+ run: uv run pytest test/ --codspeed
@@ -12,8 +12,8 @@ jobs:
12
12
  id-token: write
13
13
  steps:
14
14
  - name: Checkout sources
15
- uses: actions/checkout@v4
16
- - uses: actions/setup-python@v5
15
+ uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
16
+ - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
17
17
  with:
18
18
  python-version: '3.11'
19
19
  cache: 'pip'
@@ -21,8 +21,14 @@ jobs:
21
21
  run: |
22
22
  pip install build
23
23
  python -m build
24
+ # NOTE: We deliberately pin this action to a commit SHA rather than the
25
+ # mutable `@release/v1` ref that PyPA recommends. The pin stops the
26
+ # action from being swapped out from under a workflow that holds PyPI
27
+ # publish (OIDC) rights; the cost is losing automatic upstream patches.
28
+ # Renovate offsets that by bumping the pinned SHA (tracked via the
29
+ # trailing `# vX.Y.Z` comment), so merge those bump PRs promptly.
24
30
  - name: Publish package distributions to PyPI
25
- uses: pypa/gh-action-pypi-publish@release/v1
31
+ uses: pypa/gh-action-pypi-publish@cef221092ed1bacb1cc03d23a2d87d1d172e277b # v1.14.0
26
32
  pypi-publish-pytest-taskgraph:
27
33
  name: upload release to PyPI
28
34
  if: startsWith(github.ref, 'refs/tags/pytest-taskgraph')
@@ -32,8 +38,8 @@ jobs:
32
38
  id-token: write
33
39
  steps:
34
40
  - name: Checkout sources
35
- uses: actions/checkout@v4
36
- - uses: actions/setup-python@v5
41
+ uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
42
+ - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
37
43
  with:
38
44
  python-version: '3.11'
39
45
  cache: 'pip'
@@ -43,7 +49,7 @@ jobs:
43
49
  pip install build
44
50
  python -m build
45
51
  - name: Publish package distributions to PyPI
46
- uses: pypa/gh-action-pypi-publish@release/v1
52
+ uses: pypa/gh-action-pypi-publish@cef221092ed1bacb1cc03d23a2d87d1d172e277b # v1.14.0
47
53
  with:
48
54
  packages-dir: packages/pytest-taskgraph/dist
49
55
  pypi-publish-sphinx-taskgraph:
@@ -55,8 +61,8 @@ jobs:
55
61
  id-token: write
56
62
  steps:
57
63
  - name: Checkout sources
58
- uses: actions/checkout@v4
59
- - uses: actions/setup-python@v5
64
+ uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
65
+ - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
60
66
  with:
61
67
  python-version: '3.11'
62
68
  cache: 'pip'
@@ -66,6 +72,6 @@ jobs:
66
72
  pip install build
67
73
  python -m build
68
74
  - name: Publish package distributions to PyPI
69
- uses: pypa/gh-action-pypi-publish@release/v1
75
+ uses: pypa/gh-action-pypi-publish@cef221092ed1bacb1cc03d23a2d87d1d172e277b # v1.14.0
70
76
  with:
71
77
  packages-dir: packages/sphinx-taskgraph/dist
@@ -12,6 +12,7 @@ __pycache__/
12
12
  *.py[cod]
13
13
  *.egg-info/
14
14
 
15
+ .codspeed/
15
16
  .pytest_cache/
16
17
  .python-version
17
18
  .ruff_cache/
@@ -1,5 +1,11 @@
1
1
  # Change Log
2
2
 
3
+ ## [24.1.0] - 2026-06-04
4
+
5
+ ### Added
6
+
7
+ - support for custom context in task-context (#971)
8
+
3
9
  ## [24.0.0] - 2026-06-03
4
10
 
5
11
  ### Changed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: taskcluster-taskgraph
3
- Version: 24.0.0
3
+ Version: 24.1.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
@@ -44,6 +44,10 @@ Description-Content-Type: text/x-rst
44
44
  :target: https://codecov.io/gh/taskcluster/taskgraph
45
45
  :alt: Code Coverage
46
46
 
47
+ .. image:: https://img.shields.io/endpoint?url=https://codspeed.io/badge.json
48
+ :target: https://codspeed.io/taskcluster/taskgraph?utm_source=badge
49
+ :alt: CodSpeed Performance
50
+
47
51
  .. image:: https://badge.fury.io/py/taskcluster-taskgraph.svg
48
52
  :target: https://badge.fury.io/py/taskcluster-taskgraph
49
53
  :alt: Pypi Version
@@ -7,6 +7,10 @@
7
7
  :target: https://codecov.io/gh/taskcluster/taskgraph
8
8
  :alt: Code Coverage
9
9
 
10
+ .. image:: https://img.shields.io/endpoint?url=https://codspeed.io/badge.json
11
+ :target: https://codspeed.io/taskcluster/taskgraph?utm_source=badge
12
+ :alt: CodSpeed Performance
13
+
10
14
  .. image:: https://badge.fury.io/py/taskcluster-taskgraph.svg
11
15
  :target: https://badge.fury.io/py/taskcluster-taskgraph
12
16
  :alt: Pypi Version
@@ -98,35 +98,6 @@ with the this ``kind``:
98
98
  ...the description will bring in the value ``foo`` from the parameters if
99
99
  present, or ``default`` otherwise.
100
100
 
101
- from-file
102
- ~~~~~~~~~
103
-
104
- Context may also be provided from a defined yaml file. The provided file
105
- should usually only contain top level keys and values (eg: nested objects
106
- will not be interpolated - they will be substituted as text representations
107
- of the object).
108
-
109
- For example, with this kind definition:
110
-
111
- .. code-block:: yaml
112
-
113
- tasks:
114
- build:
115
- description: my description {foo}
116
- task-context:
117
- from-file: some_file.yaml
118
- substitution-fields:
119
- - description
120
-
121
- And this in ``some_file.yaml``:
122
-
123
- .. code-block:: yaml
124
-
125
- foo: from a file
126
-
127
- ...description will end up with "my description from a file".
128
-
129
-
130
101
  from-object
131
102
  ~~~~~~~~~~~
132
103
 
@@ -158,6 +129,86 @@ For example:
158
129
  This will give build1 and build2 descriptions with their ``extra_desc``
159
130
  included while allowing them to share the rest of their task definition.
160
131
 
132
+ from-custom
133
+ ~~~~~~~~~~~
134
+
135
+ Context may be provided by custom providers, which must be registered prior
136
+ to this transform being run. This allows the creation of context that is
137
+ derived from parameters, code constants, or anything else accessible to
138
+ taskgraph.
139
+
140
+ For example, you may have a custom context handler set-up in
141
+ ``taskcluster/my_taskgraph/custom_context.py``:
142
+
143
+ .. code-block:: python
144
+
145
+ NON_PRODUCTION_BRANCHES = ["maple", "pine"]
146
+
147
+ @custom_context("release-level")
148
+ def release_level_context(config, task):
149
+ # Despite being level 3, some branches are not truly considered "production"
150
+ # in the sense of creating releases that ship to users.
151
+ if config.params["level"] == "1" or config.params["project"] in NON_PRODUCTION_BRANCHES:
152
+ return "staging"
153
+ return "production"
154
+
155
+
156
+ In your ``register`` function you will need to ensure you import this module.
157
+ Eg: ``taskcluster/my_taskgraph/__init__.py``:
158
+
159
+ .. code-block:: python
160
+
161
+ def register(graph_config):
162
+ from my_taskgraph import custom_contexts # trigger custom task-context registration
163
+
164
+
165
+ Now you can use ``release-level`` as context in a kind:
166
+
167
+ .. code-block:: yaml
168
+
169
+ task-defaults:
170
+ task-context:
171
+ from-custom:
172
+ - release-level
173
+ substitution-fields:
174
+ - scopes
175
+
176
+ scopes:
177
+ by-release-level:
178
+ staging:
179
+ - secrets:get:staging_creds
180
+ production:
181
+ - secrets:get:production_creds
182
+
183
+
184
+ from-file
185
+ ~~~~~~~~~
186
+
187
+ Context may also be provided from a defined yaml file. The provided file
188
+ should usually only contain top level keys and values (eg: nested objects
189
+ will not be interpolated - they will be substituted as text representations
190
+ of the object).
191
+
192
+ For example, with this kind definition:
193
+
194
+ .. code-block:: yaml
195
+
196
+ tasks:
197
+ build:
198
+ description: my description {foo}
199
+ task-context:
200
+ from-file: some_file.yaml
201
+ substitution-fields:
202
+ - description
203
+
204
+ And this in ``some_file.yaml``:
205
+
206
+ .. code-block:: yaml
207
+
208
+ foo: from a file
209
+
210
+ ...description will end up with "my description from a file".
211
+
161
212
  Implicit Context
162
213
  ~~~~~~~~~~~~~~~~
163
214
 
@@ -185,7 +236,7 @@ Keys will be resolved on ``substitution-fields`` first, then substitution
185
236
  will be performed on the resolved value.
186
237
 
187
238
  If the same key is found in multiple places the order of precedence is as
188
- follows: ``from-parameters``, ``from-object`` keys, ``from-file`` and finally
239
+ follows: ``from-parameters``, ``from-object`` keys, ``from-custom`` providers, ``from-file`` and finally
189
240
  implicit context.
190
241
 
191
242
  That is to say: parameters will always override anything else.
@@ -1,7 +1,7 @@
1
1
  ### Project
2
2
  [project]
3
3
  name = "taskcluster-taskgraph"
4
- version = "24.0.0"
4
+ version = "24.1.0"
5
5
  description = "Build taskcluster taskgraphs"
6
6
  readme = "README.rst"
7
7
  authors = [
@@ -42,6 +42,7 @@ dev = [
42
42
  "pre-commit>=4.3.0",
43
43
  "pyright>=1.1.406",
44
44
  "pytest>=8.4.2",
45
+ "pytest-codspeed>=3.2.0",
45
46
  "pytest-mock>=3.15.1",
46
47
  "pytest-taskgraph>=0.2.0",
47
48
  "responses>=0.25.8",
@@ -2,6 +2,7 @@ from typing import Optional, Union
2
2
 
3
3
  from taskgraph.transforms.base import TransformSequence
4
4
  from taskgraph.util.schema import Schema, resolve_keyed_by
5
+ from taskgraph.util.task_context import CUSTOM_CONTEXT_MAP
5
6
  from taskgraph.util.templates import deep_get, substitute_task_fields
6
7
  from taskgraph.util.yaml import load_yaml
7
8
 
@@ -28,6 +29,12 @@ class TaskContextConfig(Schema):
28
29
  from_file: Optional[str] = None
29
30
  # Key/value pairs to be used as task context
30
31
  from_object: Optional[object] = None
32
+ # Retrieve task context values from registered custom providers. Each
33
+ # entry is the name of a provider registered via
34
+ # ``taskgraph.util.task_context.custom_context``. Providers are called
35
+ # with the ``TransformConfig`` and the task being rendered, and must
36
+ # return a dict of key/value pairs to add to the context.
37
+ from_custom: Optional[list[str]] = None
31
38
  resolve_keyed_by_options: Optional[ResolveKeyedByConfigOptions] = None
32
39
 
33
40
 
@@ -51,6 +58,7 @@ class TaskContextSchema(Schema, forbid_unknown_fields=False, kw_only=True):
51
58
  # is as follows:
52
59
  # - Parameters
53
60
  # - `from-object` keys
61
+ # - Custom providers (`from-custom`)
54
62
  # - File
55
63
  #
56
64
  # That is to say: parameters will always override anything else.
@@ -89,10 +97,18 @@ def render_task(config, tasks):
89
97
  if from_file:
90
98
  file_context = load_yaml(from_file)
91
99
 
100
+ custom_context = {}
101
+ for name in sub_config.pop("from-custom", None) or []:
102
+ if name not in CUSTOM_CONTEXT_MAP:
103
+ raise ValueError(f"no provider found for custom context '{name}'")
104
+
105
+ custom_context.update(CUSTOM_CONTEXT_MAP[name](config, task))
106
+
92
107
  fields = sub_config.pop("substitution-fields")
93
108
 
94
109
  subs = {}
95
110
  subs.update(file_context)
111
+ subs.update(custom_context)
96
112
  # We've popped away the configuration; everything left in `sub_config` is
97
113
  # substitution key/value pairs.
98
114
  subs.update(sub_config.pop("from-object", {}))
@@ -0,0 +1,20 @@
1
+ # This Source Code Form is subject to the terms of the Mozilla Public
2
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
4
+
5
+ # Define a collection of custom task-context providers.
6
+ # Note: this is stored here instead of where it is used in the
7
+ # `task_context` transform to give consumers a chance to register their own
8
+ # providers before the `task_context` schema is created.
9
+ CUSTOM_CONTEXT_MAP = {}
10
+
11
+
12
+ def custom_context(name):
13
+ def wrapper(func):
14
+ assert name not in CUSTOM_CONTEXT_MAP, (
15
+ f"duplicate custom_context function name {name} ({func} and {CUSTOM_CONTEXT_MAP[name]})"
16
+ )
17
+ CUSTOM_CONTEXT_MAP[name] = func
18
+ return func
19
+
20
+ return wrapper
@@ -63,9 +63,9 @@
63
63
  "@types/node" "*"
64
64
 
65
65
  "@types/node@*":
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==
66
+ version "25.9.2"
67
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-25.9.2.tgz#fc8958e757994b71fee516f9634bdb03d1b19e9f"
68
+ integrity sha512-G05zqtJhcDLb8uslf5EjCxXg9G1KQxiV8OS0R26IC//Eoyitzqe8z37I7cqvnZlrlSfgocQRfSn/AHBZJJFyGw==
69
69
  dependencies:
70
70
  undici-types ">=7.24.0 <7.24.7"
71
71
 
@@ -1,4 +1,5 @@
1
1
  file: file
2
+ file_and_custom: file_and_custom
2
3
  direct_and_file: shouldn't be used
3
4
  file_and_param: shouldn't be used
4
5
  direct_file_and_param: shouldn't be used
@@ -0,0 +1,218 @@
1
+ # This Source Code Form is subject to the terms of the Mozilla Public
2
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
4
+
5
+ """Benchmarks for taskgraph core operations on graphs with ~1000 tasks."""
6
+
7
+ import copy
8
+
9
+ import pytest
10
+
11
+ from taskgraph.graph import Graph
12
+ from taskgraph.task import Task
13
+ from taskgraph.taskgraph import TaskGraph
14
+ from taskgraph.transforms.base import TransformSequence
15
+
16
+ # ---------------------------------------------------------------------------
17
+ # Graph builders – each returns (tasks_dict, Graph, TaskGraph) for 1000 nodes
18
+ # ---------------------------------------------------------------------------
19
+
20
+ N = 1000
21
+
22
+
23
+ def _make_task(i):
24
+ return Task(
25
+ kind="test",
26
+ label=f"task-{i}",
27
+ attributes={"idx": i},
28
+ task={"metadata": {"name": f"task-{i}"}},
29
+ )
30
+
31
+
32
+ def _build_linear():
33
+ """Chain: task-0 <- task-1 <- ... <- task-999."""
34
+ tasks = {f"task-{i}": _make_task(i) for i in range(N)}
35
+ edges = {(f"task-{i}", f"task-{i - 1}", "dep") for i in range(1, N)}
36
+ g = Graph(set(tasks), edges)
37
+ return tasks, g, TaskGraph(tasks, g)
38
+
39
+
40
+ def _build_fan_out_fan_in():
41
+ """One root fans out to 998 middle tasks, which all feed into one sink.
42
+
43
+ task-0 (root)
44
+ |---> task-1 --+
45
+ |---> task-2 --+--> task-999 (sink)
46
+ ... |
47
+ `---> task-998 +
48
+ """
49
+ tasks = {f"task-{i}": _make_task(i) for i in range(N)}
50
+ edges = set()
51
+ for i in range(1, N - 1):
52
+ edges.add((f"task-{i}", "task-0", "root"))
53
+ for i in range(1, N - 1):
54
+ edges.add((f"task-{N - 1}", f"task-{i}", "mid"))
55
+ g = Graph(set(tasks), edges)
56
+ return tasks, g, TaskGraph(tasks, g)
57
+
58
+
59
+ def _build_binary_tree():
60
+ """Complete-ish binary tree with ~1000 nodes (children depend on parent)."""
61
+ tasks = {f"task-{i}": _make_task(i) for i in range(N)}
62
+ edges = set()
63
+ for i in range(1, N):
64
+ parent = (i - 1) // 2
65
+ edges.add((f"task-{i}", f"task-{parent}", "parent"))
66
+ g = Graph(set(tasks), edges)
67
+ return tasks, g, TaskGraph(tasks, g)
68
+
69
+
70
+ def _build_diamond_layers():
71
+ """Layered diamond: 10 layers of 100 tasks each; every task in layer L
72
+ depends on every task in layer L-1 (100x100 edges between adjacent layers).
73
+
74
+ This is 1000 tasks with 9 * 100 * 100 = 90 000 edges - a dense graph.
75
+ """
76
+ layer_size = 100
77
+ num_layers = N // layer_size
78
+ tasks = {f"task-{i}": _make_task(i) for i in range(N)}
79
+ edges = set()
80
+ for layer in range(1, num_layers):
81
+ for i in range(layer_size):
82
+ node = layer * layer_size + i
83
+ for j in range(layer_size):
84
+ dep = (layer - 1) * layer_size + j
85
+ edges.add((f"task-{node}", f"task-{dep}", f"l{layer}-{j}"))
86
+ g = Graph(set(tasks), edges)
87
+ return tasks, g, TaskGraph(tasks, g)
88
+
89
+
90
+ # Pre-build the fixtures so construction cost isn't part of every benchmark
91
+ LINEAR = _build_linear()
92
+ FAN = _build_fan_out_fan_in()
93
+ BTREE = _build_binary_tree()
94
+ DIAMOND = _build_diamond_layers()
95
+
96
+ GEOMETRIES = {
97
+ "linear": LINEAR,
98
+ "fan": FAN,
99
+ "btree": BTREE,
100
+ "diamond": DIAMOND,
101
+ }
102
+
103
+
104
+ # ---------------------------------------------------------------------------
105
+ # Benchmarks – Graph.transitive_closure
106
+ # ---------------------------------------------------------------------------
107
+
108
+
109
+ @pytest.mark.benchmark
110
+ @pytest.mark.parametrize("geometry", ["linear", "fan", "btree", "diamond"])
111
+ def test_transitive_closure(geometry):
112
+ _, graph, _ = GEOMETRIES[geometry]
113
+ # Pick a node roughly in the middle so the closure is non-trivial
114
+ result = graph.transitive_closure({f"task-{N // 2}"})
115
+ assert len(result.nodes) > 0
116
+
117
+
118
+ # ---------------------------------------------------------------------------
119
+ # Benchmarks – Graph.visit_postorder / visit_preorder
120
+ # ---------------------------------------------------------------------------
121
+
122
+
123
+ @pytest.mark.benchmark
124
+ @pytest.mark.parametrize("geometry", ["linear", "fan", "btree", "diamond"])
125
+ def test_visit_postorder(geometry):
126
+ _, graph, _ = GEOMETRIES[geometry]
127
+ order = list(graph.visit_postorder())
128
+ assert len(order) == N
129
+
130
+
131
+ @pytest.mark.benchmark
132
+ @pytest.mark.parametrize("geometry", ["linear", "fan", "btree", "diamond"])
133
+ def test_visit_preorder(geometry):
134
+ _, graph, _ = GEOMETRIES[geometry]
135
+ order = list(graph.visit_preorder())
136
+ assert len(order) == N
137
+
138
+
139
+ # ---------------------------------------------------------------------------
140
+ # Benchmarks – Graph link dictionaries
141
+ # ---------------------------------------------------------------------------
142
+
143
+
144
+ @pytest.mark.benchmark
145
+ @pytest.mark.parametrize("geometry", ["linear", "fan", "btree", "diamond"])
146
+ def test_links_dict(geometry):
147
+ _, graph, _ = GEOMETRIES[geometry]
148
+ # Clear the functools.cache to measure actual computation each time
149
+ graph.links_and_reverse_links_dict.cache_clear()
150
+ fwd, rev = graph.links_and_reverse_links_dict()
151
+ assert len(fwd) == N
152
+ assert len(rev) == N
153
+
154
+
155
+ # ---------------------------------------------------------------------------
156
+ # Benchmarks – TaskGraph.for_each_task
157
+ # ---------------------------------------------------------------------------
158
+
159
+
160
+ @pytest.mark.benchmark
161
+ @pytest.mark.parametrize("geometry", ["linear", "fan", "btree", "diamond"])
162
+ def test_for_each_task(geometry):
163
+ _, _, tg = GEOMETRIES[geometry]
164
+ visited = []
165
+ tg.for_each_task(lambda task, _tg: visited.append(task.label))
166
+ assert len(visited) == N
167
+
168
+
169
+ # ---------------------------------------------------------------------------
170
+ # Benchmarks – TaskGraph JSON round-trip
171
+ # ---------------------------------------------------------------------------
172
+
173
+
174
+ @pytest.mark.benchmark
175
+ @pytest.mark.parametrize("geometry", ["linear", "fan", "btree"])
176
+ def test_taskgraph_to_json(geometry):
177
+ _, _, tg = GEOMETRIES[geometry]
178
+ data = tg.to_json()
179
+ assert len(data) == N
180
+
181
+
182
+ # ---------------------------------------------------------------------------
183
+ # Benchmarks – TransformSequence with a simple transform
184
+ # ---------------------------------------------------------------------------
185
+
186
+
187
+ transforms = TransformSequence()
188
+
189
+
190
+ @transforms.add
191
+ def add_worker_type(config, tasks):
192
+ """A small transform that adds a field to every task dict."""
193
+ for task in tasks:
194
+ task = copy.copy(task)
195
+ task["worker-type"] = f"b-linux-{task.get('idx', 0) % 4}"
196
+ yield task
197
+
198
+
199
+ @transforms.add
200
+ def add_env_vars(config, tasks):
201
+ """Another small transform that adds environment variables."""
202
+ for task in tasks:
203
+ task.setdefault("env", {})
204
+ task["env"]["TASK_ID"] = task.get("name", "unknown")
205
+ task["env"]["PRIORITY"] = "high" if task.get("idx", 0) % 10 == 0 else "low"
206
+ yield task
207
+
208
+
209
+ @pytest.mark.benchmark
210
+ def test_transform_sequence():
211
+ task_dicts = [
212
+ {"name": f"task-{i}", "idx": i, "payload": {"command": f"echo {i}"}}
213
+ for i in range(N)
214
+ ]
215
+ result = list(transforms(None, task_dicts))
216
+ assert len(result) == N
217
+ assert "worker-type" in result[0]
218
+ assert "env" in result[0]