taskcluster-taskgraph 18.1.0__tar.gz → 19.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 (274) hide show
  1. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/.pre-commit-config.yaml +3 -3
  2. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/CHANGELOG.md +29 -0
  3. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/PKG-INFO +6 -9
  4. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/README.rst +0 -4
  5. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/concepts/transforms.rst +2 -2
  6. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/conf.py +5 -0
  7. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/howto/resolve-keyed-by.rst +2 -2
  8. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/reference/migrations.rst +31 -0
  9. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/reference/transforms/from_deps.rst +2 -2
  10. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/tutorials/creating-a-task-graph.rst +2 -2
  11. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/packages/pytest-taskgraph/pyproject.toml +3 -2
  12. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/packages/sphinx-taskgraph/pyproject.toml +2 -3
  13. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/pyproject.toml +21 -20
  14. taskcluster_taskgraph-19.1.0/src/taskgraph/config.py +170 -0
  15. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/decision.py +6 -6
  16. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/docker.py +3 -1
  17. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/transforms/chunking.py +18 -37
  18. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/transforms/docker_image.py +27 -85
  19. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/transforms/fetch.py +85 -116
  20. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/transforms/from_deps.py +40 -90
  21. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/transforms/matrix.py +30 -47
  22. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/transforms/notify.py +84 -61
  23. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/transforms/run/__init__.py +91 -140
  24. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/transforms/run/common.py +1 -1
  25. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/transforms/run/index_search.py +9 -11
  26. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/transforms/run/run_task.py +35 -90
  27. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/transforms/run/toolchain.py +25 -75
  28. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/transforms/task.py +281 -558
  29. taskcluster_taskgraph-19.1.0/src/taskgraph/transforms/task_context.py +94 -0
  30. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/util/dependencies.py +1 -2
  31. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/util/docker.py +4 -0
  32. taskcluster_taskgraph-19.1.0/src/taskgraph/util/schema.py +421 -0
  33. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/util/taskcluster.py +5 -14
  34. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/config.yml +1 -0
  35. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/kinds/codecov/kind.yml +1 -0
  36. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/kinds/complete/kind.yml +4 -0
  37. taskcluster_taskgraph-19.1.0/taskcluster/kinds/test/kind.yml +18 -0
  38. taskcluster_taskgraph-19.1.0/taskcluster/kinds/test/linux.yml +71 -0
  39. taskcluster_taskgraph-19.1.0/taskcluster/kinds/test/windows.yml +32 -0
  40. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/template/{{cookiecutter.project_name}}/taskcluster/{{cookiecutter.project_slug}}_taskgraph/transforms/hello.py +2 -2
  41. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/template/{{cookiecutter.project_name}}/taskcluster.github.yml +19 -19
  42. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_docker.py +13 -3
  43. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_transforms_run_run_task.py +5 -4
  44. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_util_schema.py +53 -46
  45. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_util_taskcluster.py +8 -1
  46. taskcluster_taskgraph-19.1.0/uv.lock +3370 -0
  47. taskcluster_taskgraph-18.1.0/src/taskgraph/config.py +0 -193
  48. taskcluster_taskgraph-18.1.0/src/taskgraph/transforms/task_context.py +0 -121
  49. taskcluster_taskgraph-18.1.0/src/taskgraph/util/schema.py +0 -248
  50. taskcluster_taskgraph-18.1.0/taskcluster/kinds/test/kind.yml +0 -76
  51. taskcluster_taskgraph-18.1.0/uv.lock +0 -2678
  52. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/.codespell-ignore-words.txt +0 -0
  53. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/.github/CODEOWNERS +0 -0
  54. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/.github/dependabot.yml +0 -0
  55. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/.github/workflows/codeql-analysis.yml +0 -0
  56. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/.github/workflows/pre-commit-autoupdate.yml +0 -0
  57. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/.github/workflows/pre-commit.yml +0 -0
  58. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/.github/workflows/pypi-publish.yml +0 -0
  59. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/.gitignore +0 -0
  60. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/.readthedocs.yaml +0 -0
  61. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/.taskcluster.yml +0 -0
  62. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/.yamllint +0 -0
  63. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/CODE_OF_CONDUCT.md +0 -0
  64. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/CONTRIBUTING.rst +0 -0
  65. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/LICENSE +0 -0
  66. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/Makefile +0 -0
  67. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/concepts/index.rst +0 -0
  68. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/concepts/kind.rst +0 -0
  69. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/concepts/loading.rst +0 -0
  70. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/concepts/optimization.rst +0 -0
  71. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/concepts/overview.rst +0 -0
  72. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/concepts/scopes.rst +0 -0
  73. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/concepts/task-graphs.rst +0 -0
  74. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/contributing.rst +0 -0
  75. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/glossary.rst +0 -0
  76. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/howto/bootstrap-taskgraph.rst +0 -0
  77. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/howto/create-actions.rst +0 -0
  78. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/howto/create-tasks.rst +0 -0
  79. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/howto/debugging.rst +0 -0
  80. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/howto/docker.rst +0 -0
  81. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/howto/index.rst +0 -0
  82. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/howto/load-task-locally.rst +0 -0
  83. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/howto/run-locally.rst +0 -0
  84. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/howto/send-notifications.rst +0 -0
  85. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/howto/use-fetches.rst +0 -0
  86. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/index.rst +0 -0
  87. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/reference/cli.rst +0 -0
  88. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/reference/index.rst +0 -0
  89. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/reference/optimization-strategies.rst +0 -0
  90. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/reference/parameters.rst +0 -0
  91. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/reference/source/modules.rst +0 -0
  92. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/reference/source/taskgraph.actions.rst +0 -0
  93. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/reference/source/taskgraph.loader.rst +0 -0
  94. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/reference/source/taskgraph.optimize.rst +0 -0
  95. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/reference/source/taskgraph.rst +0 -0
  96. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/reference/source/taskgraph.transforms.rst +0 -0
  97. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/reference/source/taskgraph.transforms.run.rst +0 -0
  98. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/reference/source/taskgraph.util.rst +0 -0
  99. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/reference/transforms/chunking.rst +0 -0
  100. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/reference/transforms/index.rst +0 -0
  101. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/reference/transforms/matrix.rst +0 -0
  102. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/reference/transforms/task_context.rst +0 -0
  103. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/tutorials/connecting-taskcluster.rst +0 -0
  104. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/tutorials/example-taskcluster.yml +0 -0
  105. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/tutorials/getting-started.rst +0 -0
  106. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/tutorials/index.rst +0 -0
  107. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/make.bat +0 -0
  108. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/packages/pytest-taskgraph/README.md +0 -0
  109. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/packages/pytest-taskgraph/src/pytest_taskgraph/__init__.py +0 -0
  110. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/packages/pytest-taskgraph/src/pytest_taskgraph/fixtures/gen.py +0 -0
  111. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/packages/pytest-taskgraph/src/pytest_taskgraph/fixtures/vcs.py +0 -0
  112. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/packages/sphinx-taskgraph/README.md +0 -0
  113. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/packages/sphinx-taskgraph/src/sphinx_taskgraph/__init__.py +0 -0
  114. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/packages/sphinx-taskgraph/src/sphinx_taskgraph/autoschema.py +0 -0
  115. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/__init__.py +0 -0
  116. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/actions/__init__.py +0 -0
  117. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/actions/add_new_jobs.py +0 -0
  118. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/actions/cancel.py +0 -0
  119. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/actions/cancel_all.py +0 -0
  120. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/actions/rebuild_cached_tasks.py +0 -0
  121. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/actions/registry.py +0 -0
  122. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/actions/retrigger.py +0 -0
  123. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/actions/util.py +0 -0
  124. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/create.py +0 -0
  125. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/filter_tasks.py +0 -0
  126. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/generator.py +0 -0
  127. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/graph.py +0 -0
  128. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/loader/__init__.py +0 -0
  129. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/loader/default.py +0 -0
  130. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/loader/transform.py +0 -0
  131. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/main.py +0 -0
  132. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/morph.py +0 -0
  133. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/optimize/__init__.py +0 -0
  134. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/optimize/base.py +0 -0
  135. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/optimize/strategies.py +0 -0
  136. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/parameters.py +0 -0
  137. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/run-task/fetch-content +0 -0
  138. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/run-task/hgrc +0 -0
  139. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/run-task/robustcheckout.py +0 -0
  140. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/run-task/run-task +0 -0
  141. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/target_tasks.py +0 -0
  142. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/task.py +0 -0
  143. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/taskgraph.py +0 -0
  144. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/transforms/__init__.py +0 -0
  145. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/transforms/base.py +0 -0
  146. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/transforms/cached_tasks.py +0 -0
  147. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/transforms/code_review.py +0 -0
  148. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/util/__init__.py +0 -0
  149. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/util/archive.py +0 -0
  150. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/util/attributes.py +0 -0
  151. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/util/cached_tasks.py +0 -0
  152. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/util/caches.py +0 -0
  153. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/util/copy.py +0 -0
  154. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/util/hash.py +0 -0
  155. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/util/json.py +0 -0
  156. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/util/keyed_by.py +0 -0
  157. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/util/parameterization.py +0 -0
  158. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/util/path.py +0 -0
  159. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/util/python_path.py +0 -0
  160. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/util/readonlydict.py +0 -0
  161. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/util/set_name.py +0 -0
  162. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/util/shell.py +0 -0
  163. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/util/taskgraph.py +0 -0
  164. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/util/templates.py +0 -0
  165. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/util/time.py +0 -0
  166. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/util/treeherder.py +0 -0
  167. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/util/vcs.py +0 -0
  168. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/util/verify.py +0 -0
  169. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/util/workertypes.py +0 -0
  170. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/util/yaml.py +0 -0
  171. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/docker/REGISTRY +0 -0
  172. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/docker/decision/Dockerfile +0 -0
  173. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/docker/decision/HASH +0 -0
  174. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/docker/decision/README.md +0 -0
  175. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/docker/decision/VERSION +0 -0
  176. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/docker/decision/system-setup.sh +0 -0
  177. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/docker/fetch/Dockerfile +0 -0
  178. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/docker/image_builder/README.rst +0 -0
  179. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/docker/index-task/Dockerfile +0 -0
  180. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/docker/index-task/README +0 -0
  181. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/docker/index-task/insert-indexes.js +0 -0
  182. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/docker/index-task/package.json +0 -0
  183. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/docker/index-task/yarn.lock +0 -0
  184. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/docker/python/Dockerfile +0 -0
  185. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/docker/run-task/Dockerfile +0 -0
  186. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/docker/run-task/system-setup.sh +0 -0
  187. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/docker/skopeo/Dockerfile +0 -0
  188. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/docker/skopeo/policy.json +0 -0
  189. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/docker/skopeo/push_image.sh +0 -0
  190. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/kinds/check/kind.yml +0 -0
  191. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/kinds/doc/kind.yml +0 -0
  192. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/kinds/docker-image/kind.yml +0 -0
  193. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/kinds/fetch/kind.yml +0 -0
  194. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/kinds/push-image/kind.yml +0 -0
  195. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/scripts/codecov-upload.py +0 -0
  196. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/scripts/external_tools/tooltool.py +0 -0
  197. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/self_taskgraph/__init__.py +0 -0
  198. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/self_taskgraph/custom_parameters.py +0 -0
  199. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/self_taskgraph/custom_target_tasks.py +0 -0
  200. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/self_taskgraph/transforms/add_pr_route.py +0 -0
  201. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/self_taskgraph/transforms/push_image.py +0 -0
  202. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/test/params/main-repo-pull-request-untrusted.yml +0 -0
  203. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/test/params/main-repo-pull-request.yml +0 -0
  204. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/test/params/main-repo-push.yml +0 -0
  205. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/test/params/main-repo-release-pytest-taskgraph.yml +0 -0
  206. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/test/params/main-repo-release-taskcluster-taskgraph.yml +0 -0
  207. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/template/cookiecutter.json +0 -0
  208. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/template/hooks/post_gen_project.py +0 -0
  209. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/template/{{cookiecutter.project_name}}/taskcluster/config.yml +0 -0
  210. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/template/{{cookiecutter.project_name}}/taskcluster/docker/linux/Dockerfile +0 -0
  211. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/template/{{cookiecutter.project_name}}/taskcluster/kinds/docker-image/kind.yml +0 -0
  212. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/template/{{cookiecutter.project_name}}/taskcluster/kinds/hello/kind.yml +0 -0
  213. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/__init__.py +0 -0
  214. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/automationrelevance.json +0 -0
  215. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/conftest.py +0 -0
  216. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/data/task_context.yml +0 -0
  217. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/data/taskcluster/config.yml +0 -0
  218. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/data/taskcluster/docker/hello-world/Dockerfile +0 -0
  219. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/data/taskcluster/docker/hello-world-tag/Dockerfile +0 -0
  220. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/data/taskcluster/docker/hello-world-tag/REGISTRY +0 -0
  221. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/data/taskcluster/docker/hello-world-tag/VERSION +0 -0
  222. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/data/taskcluster/kinds/docker-image/kind.yml +0 -0
  223. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/data/taskcluster/scripts/toolchain/run.ps1 +0 -0
  224. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/data/taskcluster/scripts/toolchain/run.sh +0 -0
  225. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/data/taskcluster/test_taskgraph/transforms/foo.py +0 -0
  226. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/data/testmod/thing.py +0 -0
  227. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/mockedopen.py +0 -0
  228. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_actions_rebuild_cached_tasks.py +0 -0
  229. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_actions_registry.py +0 -0
  230. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_config.py +0 -0
  231. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_create.py +0 -0
  232. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_decision.py +0 -0
  233. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_generator.py +0 -0
  234. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_graph.py +0 -0
  235. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_main.py +0 -0
  236. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_morph.py +0 -0
  237. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_optimize.py +0 -0
  238. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_optimize_strategies.py +0 -0
  239. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_parameters.py +0 -0
  240. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_scripts_fetch_content.py +0 -0
  241. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_scripts_run_task.py +0 -0
  242. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_target_tasks.py +0 -0
  243. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_taskgraph.py +0 -0
  244. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_transform_chunking.py +0 -0
  245. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_transform_docker_image.py +0 -0
  246. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_transform_task_context.py +0 -0
  247. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_transforms_base.py +0 -0
  248. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_transforms_cached_tasks.py +0 -0
  249. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_transforms_fetch.py +0 -0
  250. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_transforms_from_deps.py +0 -0
  251. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_transforms_matrix.py +0 -0
  252. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_transforms_notify.py +0 -0
  253. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_transforms_run.py +0 -0
  254. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_transforms_run_toolchain.py +0 -0
  255. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_transforms_task.py +0 -0
  256. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_util_archive.py +0 -0
  257. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_util_attributes.py +0 -0
  258. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_util_cached_tasks.py +0 -0
  259. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_util_copy.py +0 -0
  260. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_util_dependencies.py +0 -0
  261. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_util_docker.py +0 -0
  262. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_util_json.py +0 -0
  263. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_util_keyed_by.py +0 -0
  264. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_util_parameterization.py +0 -0
  265. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_util_path.py +0 -0
  266. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_util_python_path.py +0 -0
  267. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_util_readonlydict.py +0 -0
  268. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_util_templates.py +0 -0
  269. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_util_time.py +0 -0
  270. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_util_treeherder.py +0 -0
  271. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_util_vcs.py +0 -0
  272. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_util_verify.py +0 -0
  273. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_util_workertypes.py +0 -0
  274. {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_util_yaml.py +0 -0
@@ -13,17 +13,17 @@ repos:
13
13
  exclude: template
14
14
  - id: check-added-large-files
15
15
  - repo: https://github.com/astral-sh/ruff-pre-commit
16
- rev: v0.14.10
16
+ rev: v0.14.14
17
17
  hooks:
18
18
  - id: ruff
19
19
  args: [--fix, --exit-non-zero-on-fix]
20
20
  - id: ruff-format
21
21
  - repo: https://github.com/astral-sh/uv-pre-commit
22
- rev: 0.9.21
22
+ rev: 0.9.28
23
23
  hooks:
24
24
  - id: uv-lock
25
25
  - repo: https://github.com/adrienverge/yamllint.git
26
- rev: v1.37.1
26
+ rev: v1.38.0
27
27
  hooks:
28
28
  - id: yamllint
29
29
  exclude: template
@@ -1,5 +1,34 @@
1
1
  # Change Log
2
2
 
3
+ ## [19.1.0] - 2026-02-17
4
+
5
+ ### Added
6
+
7
+ - Converted all remaining voluptuous schemas to msgspec
8
+
9
+ ### Fixed
10
+
11
+ - Parent image name lookup in `build-image` now uses task ids
12
+ - Decision task environment now passes full ref names for chain-of-trust verification
13
+ - Exclude `__pycache__` directories when generating docker contexts
14
+
15
+ ## [19.0.0] - 2026-02-06
16
+
17
+ ### Added
18
+
19
+ - BREAKING CHANGE: Support for msgspec schemas; voluptuous schemas renamed to `LegacySchema`
20
+
21
+ ### Changed
22
+
23
+ - Updated taskcluster dependency to v92; artifact functions now handle redirects manually
24
+ - Updated workerType in template `.taskcluster.yml`
25
+ - Disabled unnecessary `taskcluster-proxy` for Windows tests
26
+
27
+ ### Fixed
28
+
29
+ - Race condition in `docker_image` transforms when creating docker-contexts directory
30
+ - Wrong location for `extra` in `.taskcluster.yml` template
31
+
3
32
  ## [18.1.0] - 2026-01-13
4
33
 
5
34
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: taskcluster-taskgraph
3
- Version: 18.1.0
3
+ Version: 19.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
@@ -20,18 +20,19 @@ 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
+ Requires-Dist: msgspec>=0.20.0
24
25
  Requires-Dist: pyyaml>=5.3.1
25
26
  Requires-Dist: redo>=2.0
26
27
  Requires-Dist: requests>=2.25
27
28
  Requires-Dist: slugid>=2.0
28
29
  Requires-Dist: taskcluster-urls>=11.0
29
- Requires-Dist: taskcluster<92.0,>=91.0
30
+ Requires-Dist: taskcluster>=92.0
30
31
  Requires-Dist: voluptuous>=0.12.1
31
32
  Provides-Extra: load-image
32
- Requires-Dist: zstandard; extra == 'load-image'
33
+ Requires-Dist: zstandard>=0.23.0; extra == 'load-image'
33
34
  Provides-Extra: orjson
34
- Requires-Dist: orjson; extra == 'orjson'
35
+ Requires-Dist: orjson>=3; extra == 'orjson'
35
36
  Description-Content-Type: text/x-rst
36
37
 
37
38
 
@@ -39,10 +40,6 @@ Description-Content-Type: text/x-rst
39
40
  :target: https://firefox-ci-tc.services.mozilla.com/api/github/v1/repository/taskcluster/taskgraph/main/latest
40
41
  :alt: Task Status
41
42
 
42
- .. image:: https://results.pre-commit.ci/badge/github/taskcluster/taskgraph/main.svg
43
- :target: https://results.pre-commit.ci/latest/github/taskcluster/taskgraph/main
44
- :alt: pre-commit.ci status
45
-
46
43
  .. image:: https://codecov.io/gh/taskcluster/taskgraph/branch/main/graph/badge.svg?token=GJIV52ZQNP
47
44
  :target: https://codecov.io/gh/taskcluster/taskgraph
48
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
@@ -108,9 +108,9 @@ about the state of the tasks at given points. Here is an example:
108
108
  from voluptuous import Optional, Required
109
109
 
110
110
  from taskgraph.transforms.base import TransformSequence
111
- from taskgraph.util.schema import Schema
111
+ from taskgraph.util.schema import LegacySchema
112
112
 
113
- my_schema = Schema({
113
+ my_schema = LegacySchema({
114
114
  Required("foo"): str,
115
115
  Optional("bar"): bool,
116
116
  })
@@ -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
 
@@ -210,10 +210,10 @@ It can be used to generate a valid schema that allows a field to either use
210
210
 
211
211
  .. code-block:: python
212
212
 
213
- from taskgraph.util.schema import Schema, optionally_keyed_by
213
+ from taskgraph.util.schema import LegacySchema, optionally_keyed_by
214
214
 
215
215
 
216
- schema = Schema({
216
+ schema = LegacySchema({
217
217
  # ...
218
218
  Optional("worker"): {
219
219
  Optional("max-run-time"): optionally_keyed_by("platform", int),
@@ -3,6 +3,37 @@ Migration Guide
3
3
 
4
4
  This page can help when migrating Taskgraph across major versions.
5
5
 
6
+ 18.x -> 19.x
7
+ ------------
8
+
9
+ * The ``Schema`` class in ``taskgraph.util.schema`` is now based on msgspec
10
+ instead of voluptuous. The old voluptuous-based class has been renamed to
11
+ ``LegacySchema``. Both will continue to be supported.
12
+
13
+ If you have custom schemas using ``Schema``, you have two options:
14
+
15
+ **Option 1**: Switch to ``LegacySchema`` to keep using voluptuous:
16
+
17
+ .. code-block:: python
18
+
19
+ from taskgraph.util.schema import LegacySchema
20
+
21
+ **Option 2**: Migrate to the new msgspec-based ``Schema``:
22
+
23
+ .. code-block:: python
24
+
25
+ from taskgraph.util.schema import Schema
26
+
27
+ class MySchema(Schema):
28
+ foo: str
29
+ bar: int = 10
30
+
31
+ The new ``Schema`` class uses kebab-case renaming and forbids
32
+ unknown fields by default. See the msgspec documentation for more details.
33
+
34
+ * ``validate_schema`` now supports both voluptuous and msgspec schemas, and
35
+ ``optionally_keyed_by`` accepts a ``use_msgspec=True`` flag for msgspec output.
36
+
6
37
  17.x -> 18.x
7
38
  ------------
8
39
 
@@ -176,9 +176,9 @@ allows tasks to pass down additional context (such as with the built-in
176
176
  from taskgraph.task import Task
177
177
  from taskgraph.transforms.base import TransformConfig
178
178
  from taskgraph.util.dependencies import group_by
179
- from taskgraph.util.schema import Schema
179
+ from taskgraph.util.schema import LegacySchema
180
180
 
181
- @group_by("custom-name", schema=Schema(str))
181
+ @group_by("custom-name", schema=LegacySchema(str))
182
182
  def group_by(config: TransformConfig, tasks: List[Task], ctx: str) -> List[List[Task]]:
183
183
  pass
184
184
 
@@ -139,10 +139,10 @@ comments for explanations):
139
139
  from voluptuous import Optional, Required
140
140
 
141
141
  from taskgraph.transforms.base import TransformSequence
142
- from taskgraph.util.schema import Schema
142
+ from taskgraph.util.schema import LegacySchema
143
143
 
144
144
  # Define the schema. We use the `voluptuous` package to handle validation.
145
- hello_description_schema = Schema({
145
+ hello_description_schema = LegacySchema({
146
146
  Required("text"): str,
147
147
  Optional("description"): str,
148
148
  })
@@ -6,8 +6,9 @@ readme = "README.md"
6
6
  authors = [
7
7
  { name = "Andrew Halberstadt", email = "ahal@mozilla.com" }
8
8
  ]
9
- requires-python = ">=3.8"
10
- dependencies = ["pytest", "taskcluster-taskgraph>=12.1.0"]
9
+ dependencies = [
10
+ "pytest>=8.4.2",
11
+ "taskcluster-taskgraph>=12.1.0"]
11
12
 
12
13
  [project.entry-points.pytest11]
13
14
  pytest-taskgraph = "pytest_taskgraph"
@@ -6,10 +6,9 @@ readme = "README.md"
6
6
  authors = [
7
7
  { name = "Andrew Halberstadt", email = "ahal@mozilla.com" }
8
8
  ]
9
- requires-python = ">=3.8"
10
9
  dependencies = [
11
- "sphinx",
12
- "voluptuous",
10
+ "sphinx>=7.0.0",
11
+ "voluptuous>=0.12.1",
13
12
  ]
14
13
 
15
14
  [build-system]
@@ -1,7 +1,7 @@
1
1
  ### Project
2
2
  [project]
3
3
  name = "taskcluster-taskgraph"
4
- version = "18.1.0"
4
+ version = "19.1.0"
5
5
  description = "Build taskcluster taskgraphs"
6
6
  readme = "README.rst"
7
7
  authors = [
@@ -24,38 +24,39 @@ 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
+ "msgspec>=0.20.0",
28
29
  "PyYAML>=5.3.1",
29
30
  "redo>=2.0",
30
31
  "requests>=2.25",
31
32
  "slugid>=2.0",
32
- "taskcluster>=91.0,<92.0",
33
+ "taskcluster>=92.0",
33
34
  "taskcluster-urls>=11.0",
34
35
  "voluptuous>=0.12.1",
35
36
  ]
36
37
 
37
38
  [dependency-groups]
38
39
  dev = [
39
- "coverage",
40
- "mock",
41
- "pre-commit",
42
- "pyright",
43
- "pytest",
44
- "pytest-mock",
45
- "pytest-taskgraph",
46
- "responses",
47
- "sphinx",
48
- "sphinx-autobuild",
49
- "sphinx-argparse",
50
- "sphinx-book-theme >=1",
51
- "sphinx-taskgraph",
52
- "sphinxcontrib-mermaid",
53
- "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",
54
55
  ]
55
56
 
56
57
  [project.optional-dependencies]
57
- load-image = ["zstandard"]
58
- orjson = ["orjson"]
58
+ load-image = ["zstandard>=0.23.0"]
59
+ orjson = ["orjson>=3"]
59
60
 
60
61
  [project.scripts]
61
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
@@ -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 = Schema(
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"))
@@ -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
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 = Schema(
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)