taskcluster-taskgraph 19.0.0__tar.gz → 19.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 (273) hide show
  1. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/CHANGELOG.md +19 -0
  2. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/PKG-INFO +4 -8
  3. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/README.rst +0 -4
  4. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/docs/conf.py +5 -0
  5. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/pyproject.toml +19 -19
  6. taskcluster_taskgraph-19.2.0/src/taskgraph/config.py +170 -0
  7. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/decision.py +7 -7
  8. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/docker.py +3 -1
  9. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/transforms/base.py +2 -2
  10. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/transforms/chunking.py +19 -38
  11. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/transforms/docker_image.py +26 -83
  12. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/transforms/fetch.py +87 -118
  13. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/transforms/from_deps.py +41 -91
  14. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/transforms/matrix.py +31 -48
  15. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/transforms/notify.py +85 -62
  16. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/transforms/run/__init__.py +91 -140
  17. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/transforms/run/common.py +1 -1
  18. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/transforms/run/index_search.py +10 -12
  19. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/transforms/run/run_task.py +35 -90
  20. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/transforms/run/toolchain.py +26 -76
  21. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/transforms/task.py +290 -556
  22. taskcluster_taskgraph-19.2.0/src/taskgraph/transforms/task_context.py +94 -0
  23. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/util/dependencies.py +1 -2
  24. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/util/docker.py +4 -0
  25. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/util/schema.py +40 -3
  26. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/taskcluster/config.yml +1 -0
  27. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/taskcluster/kinds/codecov/kind.yml +1 -0
  28. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/taskcluster/kinds/complete/kind.yml +4 -0
  29. taskcluster_taskgraph-19.2.0/taskcluster/kinds/test/kind.yml +18 -0
  30. taskcluster_taskgraph-19.2.0/taskcluster/kinds/test/linux.yml +71 -0
  31. taskcluster_taskgraph-19.2.0/taskcluster/kinds/test/windows.yml +32 -0
  32. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/template/{{cookiecutter.project_name}}/taskcluster.github.yml +2 -2
  33. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/test_docker.py +13 -3
  34. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/test_transforms_run_run_task.py +5 -4
  35. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/test_transforms_task.py +34 -0
  36. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/test_util_schema.py +96 -47
  37. taskcluster_taskgraph-19.2.0/uv.lock +3370 -0
  38. taskcluster_taskgraph-19.0.0/src/taskgraph/config.py +0 -193
  39. taskcluster_taskgraph-19.0.0/src/taskgraph/transforms/task_context.py +0 -121
  40. taskcluster_taskgraph-19.0.0/taskcluster/kinds/test/kind.yml +0 -74
  41. taskcluster_taskgraph-19.0.0/uv.lock +0 -2744
  42. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/.codespell-ignore-words.txt +0 -0
  43. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/.github/CODEOWNERS +0 -0
  44. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/.github/dependabot.yml +0 -0
  45. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/.github/workflows/codeql-analysis.yml +0 -0
  46. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/.github/workflows/pre-commit-autoupdate.yml +0 -0
  47. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/.github/workflows/pre-commit.yml +0 -0
  48. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/.github/workflows/pypi-publish.yml +0 -0
  49. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/.gitignore +0 -0
  50. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/.pre-commit-config.yaml +0 -0
  51. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/.readthedocs.yaml +0 -0
  52. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/.taskcluster.yml +0 -0
  53. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/.yamllint +0 -0
  54. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/CODE_OF_CONDUCT.md +0 -0
  55. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/CONTRIBUTING.rst +0 -0
  56. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/LICENSE +0 -0
  57. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/Makefile +0 -0
  58. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/docs/concepts/index.rst +0 -0
  59. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/docs/concepts/kind.rst +0 -0
  60. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/docs/concepts/loading.rst +0 -0
  61. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/docs/concepts/optimization.rst +0 -0
  62. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/docs/concepts/overview.rst +0 -0
  63. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/docs/concepts/scopes.rst +0 -0
  64. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/docs/concepts/task-graphs.rst +0 -0
  65. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/docs/concepts/transforms.rst +0 -0
  66. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/docs/contributing.rst +0 -0
  67. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/docs/glossary.rst +0 -0
  68. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/docs/howto/bootstrap-taskgraph.rst +0 -0
  69. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/docs/howto/create-actions.rst +0 -0
  70. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/docs/howto/create-tasks.rst +0 -0
  71. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/docs/howto/debugging.rst +0 -0
  72. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/docs/howto/docker.rst +0 -0
  73. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/docs/howto/index.rst +0 -0
  74. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/docs/howto/load-task-locally.rst +0 -0
  75. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/docs/howto/resolve-keyed-by.rst +0 -0
  76. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/docs/howto/run-locally.rst +0 -0
  77. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/docs/howto/send-notifications.rst +0 -0
  78. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/docs/howto/use-fetches.rst +0 -0
  79. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/docs/index.rst +0 -0
  80. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/docs/reference/cli.rst +0 -0
  81. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/docs/reference/index.rst +0 -0
  82. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/docs/reference/migrations.rst +0 -0
  83. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/docs/reference/optimization-strategies.rst +0 -0
  84. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/docs/reference/parameters.rst +0 -0
  85. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/docs/reference/source/modules.rst +0 -0
  86. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/docs/reference/source/taskgraph.actions.rst +0 -0
  87. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/docs/reference/source/taskgraph.loader.rst +0 -0
  88. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/docs/reference/source/taskgraph.optimize.rst +0 -0
  89. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/docs/reference/source/taskgraph.rst +0 -0
  90. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/docs/reference/source/taskgraph.transforms.rst +0 -0
  91. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/docs/reference/source/taskgraph.transforms.run.rst +0 -0
  92. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/docs/reference/source/taskgraph.util.rst +0 -0
  93. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/docs/reference/transforms/chunking.rst +0 -0
  94. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/docs/reference/transforms/from_deps.rst +0 -0
  95. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/docs/reference/transforms/index.rst +0 -0
  96. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/docs/reference/transforms/matrix.rst +0 -0
  97. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/docs/reference/transforms/task_context.rst +0 -0
  98. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/docs/tutorials/connecting-taskcluster.rst +0 -0
  99. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/docs/tutorials/creating-a-task-graph.rst +0 -0
  100. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/docs/tutorials/example-taskcluster.yml +0 -0
  101. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/docs/tutorials/getting-started.rst +0 -0
  102. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/docs/tutorials/index.rst +0 -0
  103. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/make.bat +0 -0
  104. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/packages/pytest-taskgraph/README.md +0 -0
  105. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/packages/pytest-taskgraph/pyproject.toml +0 -0
  106. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/packages/pytest-taskgraph/src/pytest_taskgraph/__init__.py +0 -0
  107. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/packages/pytest-taskgraph/src/pytest_taskgraph/fixtures/gen.py +0 -0
  108. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/packages/pytest-taskgraph/src/pytest_taskgraph/fixtures/vcs.py +0 -0
  109. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/packages/sphinx-taskgraph/README.md +0 -0
  110. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/packages/sphinx-taskgraph/pyproject.toml +0 -0
  111. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/packages/sphinx-taskgraph/src/sphinx_taskgraph/__init__.py +0 -0
  112. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/packages/sphinx-taskgraph/src/sphinx_taskgraph/autoschema.py +0 -0
  113. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/__init__.py +0 -0
  114. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/actions/__init__.py +0 -0
  115. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/actions/add_new_jobs.py +0 -0
  116. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/actions/cancel.py +0 -0
  117. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/actions/cancel_all.py +0 -0
  118. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/actions/rebuild_cached_tasks.py +0 -0
  119. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/actions/registry.py +0 -0
  120. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/actions/retrigger.py +0 -0
  121. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/actions/util.py +0 -0
  122. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/create.py +0 -0
  123. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/filter_tasks.py +0 -0
  124. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/generator.py +0 -0
  125. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/graph.py +0 -0
  126. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/loader/__init__.py +0 -0
  127. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/loader/default.py +0 -0
  128. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/loader/transform.py +0 -0
  129. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/main.py +0 -0
  130. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/morph.py +0 -0
  131. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/optimize/__init__.py +0 -0
  132. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/optimize/base.py +0 -0
  133. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/optimize/strategies.py +0 -0
  134. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/parameters.py +0 -0
  135. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/run-task/fetch-content +0 -0
  136. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/run-task/hgrc +0 -0
  137. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/run-task/robustcheckout.py +0 -0
  138. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/run-task/run-task +0 -0
  139. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/target_tasks.py +0 -0
  140. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/task.py +0 -0
  141. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/taskgraph.py +0 -0
  142. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/transforms/__init__.py +0 -0
  143. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/transforms/cached_tasks.py +0 -0
  144. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/transforms/code_review.py +0 -0
  145. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/util/__init__.py +0 -0
  146. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/util/archive.py +0 -0
  147. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/util/attributes.py +0 -0
  148. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/util/cached_tasks.py +0 -0
  149. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/util/caches.py +0 -0
  150. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/util/copy.py +0 -0
  151. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/util/hash.py +0 -0
  152. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/util/json.py +0 -0
  153. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/util/keyed_by.py +0 -0
  154. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/util/parameterization.py +0 -0
  155. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/util/path.py +0 -0
  156. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/util/python_path.py +0 -0
  157. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/util/readonlydict.py +0 -0
  158. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/util/set_name.py +0 -0
  159. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/util/shell.py +0 -0
  160. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/util/taskcluster.py +0 -0
  161. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/util/taskgraph.py +0 -0
  162. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/util/templates.py +0 -0
  163. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/util/time.py +0 -0
  164. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/util/treeherder.py +0 -0
  165. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/util/vcs.py +0 -0
  166. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/util/verify.py +0 -0
  167. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/util/workertypes.py +0 -0
  168. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/src/taskgraph/util/yaml.py +0 -0
  169. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/taskcluster/docker/REGISTRY +0 -0
  170. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/taskcluster/docker/decision/Dockerfile +0 -0
  171. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/taskcluster/docker/decision/HASH +0 -0
  172. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/taskcluster/docker/decision/README.md +0 -0
  173. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/taskcluster/docker/decision/VERSION +0 -0
  174. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/taskcluster/docker/decision/system-setup.sh +0 -0
  175. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/taskcluster/docker/fetch/Dockerfile +0 -0
  176. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/taskcluster/docker/image_builder/README.rst +0 -0
  177. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/taskcluster/docker/index-task/Dockerfile +0 -0
  178. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/taskcluster/docker/index-task/README +0 -0
  179. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/taskcluster/docker/index-task/insert-indexes.js +0 -0
  180. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/taskcluster/docker/index-task/package.json +0 -0
  181. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/taskcluster/docker/index-task/yarn.lock +0 -0
  182. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/taskcluster/docker/python/Dockerfile +0 -0
  183. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/taskcluster/docker/run-task/Dockerfile +0 -0
  184. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/taskcluster/docker/run-task/system-setup.sh +0 -0
  185. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/taskcluster/docker/skopeo/Dockerfile +0 -0
  186. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/taskcluster/docker/skopeo/policy.json +0 -0
  187. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/taskcluster/docker/skopeo/push_image.sh +0 -0
  188. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/taskcluster/kinds/check/kind.yml +0 -0
  189. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/taskcluster/kinds/doc/kind.yml +0 -0
  190. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/taskcluster/kinds/docker-image/kind.yml +0 -0
  191. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/taskcluster/kinds/fetch/kind.yml +0 -0
  192. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/taskcluster/kinds/push-image/kind.yml +0 -0
  193. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/taskcluster/scripts/codecov-upload.py +0 -0
  194. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/taskcluster/scripts/external_tools/tooltool.py +0 -0
  195. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/taskcluster/self_taskgraph/__init__.py +0 -0
  196. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/taskcluster/self_taskgraph/custom_parameters.py +0 -0
  197. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/taskcluster/self_taskgraph/custom_target_tasks.py +0 -0
  198. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/taskcluster/self_taskgraph/transforms/add_pr_route.py +0 -0
  199. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/taskcluster/self_taskgraph/transforms/push_image.py +0 -0
  200. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/taskcluster/test/params/main-repo-pull-request-untrusted.yml +0 -0
  201. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/taskcluster/test/params/main-repo-pull-request.yml +0 -0
  202. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/taskcluster/test/params/main-repo-push.yml +0 -0
  203. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/taskcluster/test/params/main-repo-release-pytest-taskgraph.yml +0 -0
  204. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/taskcluster/test/params/main-repo-release-taskcluster-taskgraph.yml +0 -0
  205. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/template/cookiecutter.json +0 -0
  206. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/template/hooks/post_gen_project.py +0 -0
  207. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/template/{{cookiecutter.project_name}}/taskcluster/config.yml +0 -0
  208. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/template/{{cookiecutter.project_name}}/taskcluster/docker/linux/Dockerfile +0 -0
  209. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/template/{{cookiecutter.project_name}}/taskcluster/kinds/docker-image/kind.yml +0 -0
  210. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/template/{{cookiecutter.project_name}}/taskcluster/kinds/hello/kind.yml +0 -0
  211. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/template/{{cookiecutter.project_name}}/taskcluster/{{cookiecutter.project_slug}}_taskgraph/transforms/hello.py +0 -0
  212. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/__init__.py +0 -0
  213. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/automationrelevance.json +0 -0
  214. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/conftest.py +0 -0
  215. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/data/task_context.yml +0 -0
  216. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/data/taskcluster/config.yml +0 -0
  217. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/data/taskcluster/docker/hello-world/Dockerfile +0 -0
  218. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/data/taskcluster/docker/hello-world-tag/Dockerfile +0 -0
  219. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/data/taskcluster/docker/hello-world-tag/REGISTRY +0 -0
  220. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/data/taskcluster/docker/hello-world-tag/VERSION +0 -0
  221. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/data/taskcluster/kinds/docker-image/kind.yml +0 -0
  222. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/data/taskcluster/scripts/toolchain/run.ps1 +0 -0
  223. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/data/taskcluster/scripts/toolchain/run.sh +0 -0
  224. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/data/taskcluster/test_taskgraph/transforms/foo.py +0 -0
  225. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/data/testmod/thing.py +0 -0
  226. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/mockedopen.py +0 -0
  227. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/test_actions_rebuild_cached_tasks.py +0 -0
  228. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/test_actions_registry.py +0 -0
  229. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/test_config.py +0 -0
  230. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/test_create.py +0 -0
  231. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/test_decision.py +0 -0
  232. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/test_generator.py +0 -0
  233. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/test_graph.py +0 -0
  234. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/test_main.py +0 -0
  235. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/test_morph.py +0 -0
  236. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/test_optimize.py +0 -0
  237. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/test_optimize_strategies.py +0 -0
  238. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/test_parameters.py +0 -0
  239. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/test_scripts_fetch_content.py +0 -0
  240. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/test_scripts_run_task.py +0 -0
  241. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/test_target_tasks.py +0 -0
  242. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/test_taskgraph.py +0 -0
  243. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/test_transform_chunking.py +0 -0
  244. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/test_transform_docker_image.py +0 -0
  245. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/test_transform_task_context.py +0 -0
  246. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/test_transforms_base.py +0 -0
  247. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/test_transforms_cached_tasks.py +0 -0
  248. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/test_transforms_fetch.py +0 -0
  249. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/test_transforms_from_deps.py +0 -0
  250. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/test_transforms_matrix.py +0 -0
  251. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/test_transforms_notify.py +0 -0
  252. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/test_transforms_run.py +0 -0
  253. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/test_transforms_run_toolchain.py +0 -0
  254. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/test_util_archive.py +0 -0
  255. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/test_util_attributes.py +0 -0
  256. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/test_util_cached_tasks.py +0 -0
  257. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/test_util_copy.py +0 -0
  258. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/test_util_dependencies.py +0 -0
  259. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/test_util_docker.py +0 -0
  260. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/test_util_json.py +0 -0
  261. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/test_util_keyed_by.py +0 -0
  262. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/test_util_parameterization.py +0 -0
  263. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/test_util_path.py +0 -0
  264. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/test_util_python_path.py +0 -0
  265. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/test_util_readonlydict.py +0 -0
  266. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/test_util_taskcluster.py +0 -0
  267. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/test_util_templates.py +0 -0
  268. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/test_util_time.py +0 -0
  269. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/test_util_treeherder.py +0 -0
  270. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/test_util_vcs.py +0 -0
  271. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/test_util_verify.py +0 -0
  272. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/test_util_workertypes.py +0 -0
  273. {taskcluster_taskgraph-19.0.0 → taskcluster_taskgraph-19.2.0}/test/test_util_yaml.py +0 -0
@@ -1,5 +1,24 @@
1
1
  # Change Log
2
2
 
3
+ ## [19.2.0] - 2026-02-18
4
+
5
+ ### Fixed
6
+
7
+ - Restore `payload_builder` wrapping for dict schemas
8
+ - Make nested struct fields optional to match voluptuous defaults
9
+
10
+ ## [19.1.0] - 2026-02-17
11
+
12
+ ### Added
13
+
14
+ - Converted all remaining voluptuous schemas to msgspec
15
+
16
+ ### Fixed
17
+
18
+ - Parent image name lookup in `build-image` now uses task ids
19
+ - Decision task environment now passes full ref names for chain-of-trust verification
20
+ - Exclude `__pycache__` directories when generating docker contexts
21
+
3
22
  ## [19.0.0] - 2026-02-06
4
23
 
5
24
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: taskcluster-taskgraph
3
- Version: 19.0.0
3
+ Version: 19.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
@@ -20,7 +20,7 @@ Requires-Python: >=3.9
20
20
  Requires-Dist: appdirs>=1.4
21
21
  Requires-Dist: cookiecutter~=2.1
22
22
  Requires-Dist: json-e>=2.7
23
- Requires-Dist: mozilla-repo-urls
23
+ Requires-Dist: mozilla-repo-urls>=0.1.1
24
24
  Requires-Dist: msgspec>=0.20.0
25
25
  Requires-Dist: pyyaml>=5.3.1
26
26
  Requires-Dist: redo>=2.0
@@ -30,9 +30,9 @@ Requires-Dist: taskcluster-urls>=11.0
30
30
  Requires-Dist: taskcluster>=92.0
31
31
  Requires-Dist: voluptuous>=0.12.1
32
32
  Provides-Extra: load-image
33
- Requires-Dist: zstandard; extra == 'load-image'
33
+ Requires-Dist: zstandard>=0.23.0; extra == 'load-image'
34
34
  Provides-Extra: orjson
35
- Requires-Dist: orjson; extra == 'orjson'
35
+ Requires-Dist: orjson>=3; extra == 'orjson'
36
36
  Description-Content-Type: text/x-rst
37
37
 
38
38
 
@@ -40,10 +40,6 @@ Description-Content-Type: text/x-rst
40
40
  :target: https://firefox-ci-tc.services.mozilla.com/api/github/v1/repository/taskcluster/taskgraph/main/latest
41
41
  :alt: Task Status
42
42
 
43
- .. image:: https://results.pre-commit.ci/badge/github/taskcluster/taskgraph/main.svg
44
- :target: https://results.pre-commit.ci/latest/github/taskcluster/taskgraph/main
45
- :alt: pre-commit.ci status
46
-
47
43
  .. image:: https://codecov.io/gh/taskcluster/taskgraph/branch/main/graph/badge.svg?token=GJIV52ZQNP
48
44
  :target: https://codecov.io/gh/taskcluster/taskgraph
49
45
  :alt: Code Coverage
@@ -3,10 +3,6 @@
3
3
  :target: https://firefox-ci-tc.services.mozilla.com/api/github/v1/repository/taskcluster/taskgraph/main/latest
4
4
  :alt: Task Status
5
5
 
6
- .. image:: https://results.pre-commit.ci/badge/github/taskcluster/taskgraph/main.svg
7
- :target: https://results.pre-commit.ci/latest/github/taskcluster/taskgraph/main
8
- :alt: pre-commit.ci status
9
-
10
6
  .. image:: https://codecov.io/gh/taskcluster/taskgraph/branch/main/graph/badge.svg?token=GJIV52ZQNP
11
7
  :target: https://codecov.io/gh/taskcluster/taskgraph
12
8
  :alt: Code Coverage
@@ -43,6 +43,11 @@ templates_path = ["_templates"]
43
43
  # This pattern also affects html_static_path and html_extra_path.
44
44
  exclude_patterns = ["docs/_build", "Thumbs.db", ".DS_Store"]
45
45
 
46
+ # Suppress ambiguous cross-reference warnings from autodoc.
47
+ # Multiple Schema classes define fields with the same name (e.g. "path"),
48
+ # which Sphinx can't disambiguate.
49
+ suppress_warnings = ["ref.python"]
50
+
46
51
 
47
52
  # -- Options for HTML output -------------------------------------------------
48
53
 
@@ -1,7 +1,7 @@
1
1
  ### Project
2
2
  [project]
3
3
  name = "taskcluster-taskgraph"
4
- version = "19.0.0"
4
+ version = "19.2.0"
5
5
  description = "Build taskcluster taskgraphs"
6
6
  readme = "README.rst"
7
7
  authors = [
@@ -24,7 +24,7 @@ dependencies = [
24
24
  "appdirs>=1.4",
25
25
  "cookiecutter~=2.1",
26
26
  "json-e>=2.7",
27
- "mozilla-repo-urls",
27
+ "mozilla-repo-urls>=0.1.1",
28
28
  "msgspec>=0.20.0",
29
29
  "PyYAML>=5.3.1",
30
30
  "redo>=2.0",
@@ -37,26 +37,26 @@ dependencies = [
37
37
 
38
38
  [dependency-groups]
39
39
  dev = [
40
- "coverage",
41
- "mock",
42
- "pre-commit",
43
- "pyright",
44
- "pytest",
45
- "pytest-mock",
46
- "pytest-taskgraph",
47
- "responses",
48
- "sphinx",
49
- "sphinx-autobuild",
50
- "sphinx-argparse",
51
- "sphinx-book-theme >=1",
52
- "sphinx-taskgraph",
53
- "sphinxcontrib-mermaid",
54
- "zstandard",
40
+ "coverage>=7.10.7",
41
+ "mock>=5.2.0",
42
+ "pre-commit>=4.3.0",
43
+ "pyright>=1.1.406",
44
+ "pytest>=8.4.2",
45
+ "pytest-mock>=3.15.1",
46
+ "pytest-taskgraph>=0.2.0",
47
+ "responses>=0.25.8",
48
+ "sphinx>=7.4.7",
49
+ "sphinx-autobuild>=2024.04.16",
50
+ "sphinx-argparse>=0.4.0",
51
+ "sphinx-book-theme >=1.1.4",
52
+ "sphinx-taskgraph>=0.1.0",
53
+ "sphinxcontrib-mermaid>=1.0.0",
54
+ "zstandard>=0.25.0",
55
55
  ]
56
56
 
57
57
  [project.optional-dependencies]
58
- load-image = ["zstandard"]
59
- orjson = ["orjson"]
58
+ load-image = ["zstandard>=0.23.0"]
59
+ orjson = ["orjson>=3"]
60
60
 
61
61
  [project.scripts]
62
62
  taskgraph = "taskgraph.main:main"
@@ -0,0 +1,170 @@
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
+
6
+ import logging
7
+ import os
8
+ import sys
9
+ from dataclasses import dataclass
10
+ from pathlib import Path
11
+ from typing import Literal, Optional, Union
12
+
13
+ from .util.python_path import find_object
14
+ from .util.schema import Schema, TaskPriority, optionally_keyed_by, validate_schema
15
+ from .util.vcs import get_repository
16
+ from .util.yaml import load_yaml
17
+
18
+ logger = logging.getLogger(__name__)
19
+
20
+ CacheType = Literal["cargo", "checkout", "npm", "pip", "uv"]
21
+
22
+
23
+ class WorkerAlias(Schema):
24
+ provisioner: optionally_keyed_by("level", str, use_msgspec=True) # type: ignore
25
+ implementation: str
26
+ os: str
27
+ worker_type: optionally_keyed_by("level", str, use_msgspec=True) # type: ignore
28
+
29
+
30
+ class WorkersConfig(Schema):
31
+ aliases: dict[str, WorkerAlias]
32
+
33
+
34
+ class RunConfig(Schema):
35
+ # List of caches to enable, or a boolean to enable/disable all of them.
36
+ use_caches: Optional[Union[bool, list[CacheType]]] = None
37
+
38
+
39
+ class RepositoryConfig(Schema, forbid_unknown_fields=False, kw_only=True):
40
+ name: str
41
+ project_regex: Optional[str] = None
42
+ ssh_secret_name: Optional[str] = None
43
+ # FIXME: Extra keys allowed via forbid_unknown_fields=False
44
+
45
+
46
+ class TaskgraphConfig(Schema):
47
+ repositories: dict[str, RepositoryConfig]
48
+ # Python function to call to register extensions.
49
+ register: Optional[str] = None
50
+ decision_parameters: Optional[str] = None
51
+ # The taskcluster index prefix to use for caching tasks.
52
+ # Defaults to `trust-domain`.
53
+ cached_task_prefix: Optional[str] = None
54
+ # Should tasks from pull requests populate the cache
55
+ cache_pull_requests: Optional[bool] = None
56
+ # Regular expressions matching index paths to be summarized.
57
+ index_path_regexes: Optional[list[str]] = None
58
+ # Configuration related to the 'run' transforms.
59
+ run: Optional[RunConfig] = None
60
+
61
+ def __post_init__(self):
62
+ # Validate repositories has at least 1 entry (was All(..., Length(min=1)))
63
+ if not self.repositories:
64
+ raise ValueError("'repositories' must have at least one entry")
65
+
66
+
67
+ #: Schema for the graph config
68
+ class GraphConfigSchema(Schema, forbid_unknown_fields=False, kw_only=True):
69
+ # The trust-domain for this graph.
70
+ trust_domain: str
71
+ task_priority: optionally_keyed_by( # type: ignore
72
+ "project", "level", TaskPriority, use_msgspec=True
73
+ )
74
+ workers: WorkersConfig
75
+ taskgraph: TaskgraphConfig
76
+ # Name of the docker image kind (default: docker-image)
77
+ docker_image_kind: Optional[str] = None
78
+ # Default 'deadline' for tasks, in relative date format. Eg: '1 week'
79
+ task_deadline_after: Optional[
80
+ optionally_keyed_by("project", str, use_msgspec=True) # type: ignore
81
+ ] = None
82
+ # Default 'expires-after' for level 1 tasks, in relative date format.
83
+ # Eg: '90 days'
84
+ task_expires_after: Optional[str] = None
85
+
86
+
87
+ graph_config_schema = GraphConfigSchema
88
+
89
+
90
+ @dataclass(frozen=True, eq=False)
91
+ class GraphConfig:
92
+ _config: dict
93
+ root_dir: str
94
+
95
+ _PATH_MODIFIED = False
96
+
97
+ def __post_init__(self):
98
+ # ensure we have an absolute path; this is required for assumptions
99
+ # made later, such as the `vcs_root` being a directory above `root_dir`
100
+ object.__setattr__(self, "root_dir", os.path.abspath(self.root_dir))
101
+
102
+ def __getitem__(self, name):
103
+ return self._config[name]
104
+
105
+ def __contains__(self, name):
106
+ return name in self._config
107
+
108
+ def get(self, name, default=None):
109
+ return self._config.get(name, default)
110
+
111
+ def register(self):
112
+ """
113
+ Add the project's taskgraph directory to the python path, and register
114
+ any extensions present.
115
+ """
116
+ if GraphConfig._PATH_MODIFIED:
117
+ if GraphConfig._PATH_MODIFIED == self.root_dir:
118
+ # Already modified path with the same root_dir.
119
+ # We currently need to do this to enable actions to call
120
+ # taskgraph_decision, e.g. relpro.
121
+ return
122
+ raise Exception("Can't register multiple directories on python path.")
123
+ GraphConfig._PATH_MODIFIED = self.root_dir
124
+ sys.path.insert(0, self.root_dir)
125
+ register_path = self["taskgraph"].get("register")
126
+ if register_path:
127
+ register = find_object(register_path)
128
+ assert callable(register)
129
+ register(self)
130
+
131
+ @property
132
+ def vcs_root(self):
133
+ try:
134
+ repo = get_repository(self.root_dir)
135
+ return Path(repo.path)
136
+ except RuntimeError:
137
+ root = Path(self.root_dir)
138
+ if root.parts[-1:] != ("taskcluster",):
139
+ raise Exception(
140
+ "Not guessing path to vcs root. Graph config in non-standard location."
141
+ )
142
+ return root.parent
143
+
144
+ @property
145
+ def taskcluster_yml(self):
146
+ return os.path.join(self.vcs_root, ".taskcluster.yml")
147
+
148
+ @property
149
+ def docker_dir(self):
150
+ return os.path.join(self.root_dir, "docker")
151
+
152
+ @property
153
+ def kinds_dir(self):
154
+ return os.path.join(self.root_dir, "kinds")
155
+
156
+
157
+ def validate_graph_config(config):
158
+ validate_schema(graph_config_schema, config, "Invalid graph configuration:")
159
+
160
+
161
+ def load_graph_config(root_dir):
162
+ config_yml = os.path.join(root_dir, "config.yml")
163
+ if not os.path.exists(config_yml):
164
+ raise Exception(f"Couldn't find taskgraph configuration: {config_yml}")
165
+
166
+ logger.debug(f"loading config from `{config_yml}`")
167
+ config = load_yaml(config_yml)
168
+
169
+ validate_graph_config(config)
170
+ return GraphConfig(config, root_dir=root_dir)
@@ -9,9 +9,9 @@ import pathlib
9
9
  import shutil
10
10
  import time
11
11
  from pathlib import Path
12
+ from typing import Optional
12
13
 
13
14
  import yaml
14
- from voluptuous import Optional
15
15
 
16
16
  from taskgraph.actions import render_actions_json
17
17
  from taskgraph.create import create_tasks
@@ -20,7 +20,7 @@ from taskgraph.parameters import Parameters, get_version
20
20
  from taskgraph.taskgraph import TaskGraph
21
21
  from taskgraph.util import json
22
22
  from taskgraph.util.python_path import find_object
23
- from taskgraph.util.schema import LegacySchema, validate_schema
23
+ from taskgraph.util.schema import Schema, validate_schema
24
24
  from taskgraph.util.vcs import get_repository
25
25
  from taskgraph.util.yaml import load_yaml
26
26
 
@@ -40,11 +40,11 @@ PER_PROJECT_PARAMETERS = {
40
40
 
41
41
 
42
42
  #: Schema for try_task_config.json version 2
43
- try_task_config_schema_v2 = LegacySchema(
44
- {
45
- Optional("parameters"): {str: object},
46
- }
47
- )
43
+ class TryTaskConfigSchemaV2(Schema, forbid_unknown_fields=True):
44
+ parameters: Optional[dict[str, object]] = None
45
+
46
+
47
+ try_task_config_schema_v2 = TryTaskConfigSchemaV2
48
48
 
49
49
 
50
50
  def full_task_graph_to_runnable_tasks(full_task_json):
@@ -211,7 +211,9 @@ def build_image(
211
211
  raise
212
212
 
213
213
  # Parent id doesn't exist, needs to be re-built as well.
214
- parent = task.dependencies["parent"][len("docker-image-") :]
214
+ parent = next(
215
+ t for t in image_tasks if image_tasks[t].task_id == parent_id
216
+ ).removeprefix("docker-image-")
215
217
  parent_tar = temp_dir / "parent.tar"
216
218
  build_image(graph_config, parent, save_image=str(parent_tar))
217
219
  volumes.append((str(parent_tar), "/workspace/parent.tar"))
@@ -12,7 +12,7 @@ from taskgraph.task import Task
12
12
 
13
13
  from ..config import GraphConfig
14
14
  from ..parameters import Parameters
15
- from ..util.schema import LegacySchema, validate_schema
15
+ from ..util.schema import Schema, validate_schema
16
16
 
17
17
 
18
18
  @dataclass(frozen=True)
@@ -138,7 +138,7 @@ class TransformSequence:
138
138
 
139
139
  @dataclass
140
140
  class ValidateSchema:
141
- schema: LegacySchema
141
+ schema: Schema
142
142
 
143
143
  def __call__(self, config, tasks):
144
144
  for task in tasks:
@@ -2,49 +2,30 @@
2
2
  # License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  # file, You can obtain one at http://mozilla.org/MPL/2.0/.
4
4
  import copy
5
- from textwrap import dedent
6
-
7
- from voluptuous import ALLOW_EXTRA, Optional, Required
5
+ from typing import Optional
8
6
 
9
7
  from taskgraph.transforms.base import TransformSequence
10
- from taskgraph.util.schema import LegacySchema
8
+ from taskgraph.util.schema import Schema
11
9
  from taskgraph.util.templates import substitute
12
10
 
11
+
12
+ class ChunkConfig(Schema):
13
+ # The total number of chunks to split the task into.
14
+ total_chunks: int
15
+ # A list of fields that need to have `{this_chunk}` and/or
16
+ # `{total_chunks}` replaced in them.
17
+ substitution_fields: list[str] = []
18
+
19
+
13
20
  #: Schema for chunking transforms
14
- CHUNK_SCHEMA = LegacySchema(
15
- {
16
- # Optional, so it can be used for a subset of tasks in a kind
17
- Optional(
18
- "chunk",
19
- description=dedent(
20
- """
21
- `chunk` can be used to split one task into `total-chunks`
22
- tasks, substituting `this_chunk` and `total_chunks` into any
23
- fields in `substitution-fields`.
24
- """.lstrip()
25
- ),
26
- ): {
27
- Required(
28
- "total-chunks",
29
- description=dedent(
30
- """
31
- The total number of chunks to split the task into.
32
- """.lstrip()
33
- ),
34
- ): int,
35
- Optional(
36
- "substitution-fields",
37
- description=dedent(
38
- """
39
- A list of fields that need to have `{this_chunk}` and/or
40
- `{total_chunks}` replaced in them.
41
- """.lstrip()
42
- ),
43
- ): [str],
44
- }
45
- },
46
- extra=ALLOW_EXTRA,
47
- )
21
+ class ChunkSchema(Schema, forbid_unknown_fields=False, kw_only=True):
22
+ # `chunk` can be used to split one task into `total-chunks`
23
+ # tasks, substituting `this_chunk` and `total_chunks` into any
24
+ # fields in `substitution-fields`.
25
+ chunk: Optional[ChunkConfig] = None
26
+
27
+
28
+ CHUNK_SCHEMA = ChunkSchema
48
29
 
49
30
  transforms = TransformSequence()
50
31
  transforms.add_validate(CHUNK_SCHEMA)
@@ -5,17 +5,13 @@
5
5
  import logging
6
6
  import os
7
7
  import re
8
- from textwrap import dedent
9
-
10
- from voluptuous import Optional, Required
8
+ from typing import Optional
11
9
 
12
10
  import taskgraph
13
11
  from taskgraph.transforms.base import TransformSequence
14
12
  from taskgraph.util import json
15
13
  from taskgraph.util.docker import create_context_tar, generate_context_hash
16
- from taskgraph.util.schema import LegacySchema
17
-
18
- from .task import task_description_schema
14
+ from taskgraph.util.schema import IndexSchema, Schema
19
15
 
20
16
  logger = logging.getLogger(__name__)
21
17
 
@@ -31,84 +27,31 @@ IMAGE_BUILDER_IMAGE = (
31
27
 
32
28
  transforms = TransformSequence()
33
29
 
30
+
34
31
  #: Schema for docker_image transforms
35
- docker_image_schema = LegacySchema(
36
- {
37
- Required(
38
- "name",
39
- description=dedent(
40
- """
41
- Name of the docker image.
42
- """
43
- ).lstrip(),
44
- ): str,
45
- Optional(
46
- "parent",
47
- description=dedent(
48
- """
49
- Name of the parent docker image.
50
- """
51
- ).lstrip(),
52
- ): str,
53
- Optional(
54
- "symbol",
55
- description=dedent(
56
- """
57
- Treeherder symbol.
58
- """
59
- ).lstrip(),
60
- ): str,
61
- Optional(
62
- "task-from",
63
- description=dedent(
64
- """
65
- Relative path (from config.path) to the file the docker image was defined in.
66
- """
67
- ).lstrip(),
68
- ): str,
69
- Optional(
70
- "args",
71
- description=dedent(
72
- """
73
- Arguments to use for the Dockerfile.
74
- """
75
- ).lstrip(),
76
- ): {str: str},
77
- Optional(
78
- "definition",
79
- description=dedent(
80
- """
81
- Name of the docker image definition under taskcluster/docker, when
82
- different from the docker image name.
83
- """
84
- ).lstrip(),
85
- ): str,
86
- Optional(
87
- "packages",
88
- description=dedent(
89
- """
90
- List of package tasks this docker image depends on.
91
- """
92
- ).lstrip(),
93
- ): [str],
94
- Optional(
95
- "index",
96
- description=dedent(
97
- """
98
- Information for indexing this build so its artifacts can be discovered.
99
- """
100
- ).lstrip(),
101
- ): task_description_schema["index"],
102
- Optional(
103
- "cache",
104
- description=dedent(
105
- """
106
- Whether this image should be cached based on inputs.
107
- """
108
- ).lstrip(),
109
- ): bool,
110
- }
111
- )
32
+ class DockerImageSchema(Schema):
33
+ # Name of the docker image.
34
+ name: str
35
+ # Name of the parent docker image.
36
+ parent: Optional[str] = None
37
+ # Treeherder symbol.
38
+ symbol: Optional[str] = None
39
+ # Relative path (from config.path) to the file the docker image was defined in.
40
+ task_from: Optional[str] = None
41
+ # Arguments to use for the Dockerfile.
42
+ args: Optional[dict[str, str]] = None
43
+ # Name of the docker image definition under taskcluster/docker, when
44
+ # different from the docker image name.
45
+ definition: Optional[str] = None
46
+ # List of package tasks this docker image depends on.
47
+ packages: Optional[list[str]] = None
48
+ # Information for indexing this build so its artifacts can be discovered.
49
+ index: Optional[IndexSchema] = None
50
+ # Whether this image should be cached based on inputs.
51
+ cache: Optional[bool] = None
52
+
53
+
54
+ docker_image_schema = DockerImageSchema
112
55
 
113
56
 
114
57
  transforms.add_validate(docker_image_schema)