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