runem 0.4.0__py3-none-any.whl → 0.6.0__py3-none-any.whl

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.
@@ -0,0 +1,292 @@
1
+ import pathlib
2
+ import shutil
3
+ import typing
4
+
5
+ from typing_extensions import Unpack
6
+
7
+ from runem.log import log
8
+ from runem.run_command import RunCommandUnhandledError, run_command
9
+ from runem.types import FilePathList, JobKwargs, JobName, JobReturnData, Options
10
+
11
+
12
+ def _job_py_code_reformat(
13
+ **kwargs: Unpack[JobKwargs],
14
+ ) -> None:
15
+ """Runs python formatting code in serial order as one influences the other."""
16
+ label: JobName = kwargs["label"]
17
+ options: Options = kwargs["options"]
18
+ python_files: FilePathList = kwargs["file_list"]
19
+
20
+ # put into 'check' mode if requested on the command line
21
+ extra_args = []
22
+ docformatter_extra_args = [
23
+ "--in-place",
24
+ ]
25
+ if options["check-only"]:
26
+ extra_args.append("--check")
27
+ docformatter_extra_args = [] # --inplace is not compatible with --check
28
+
29
+ if options["isort"]:
30
+ isort_cmd = [
31
+ "python3",
32
+ "-m",
33
+ "isort",
34
+ "--profile",
35
+ "black",
36
+ "--treat-all-comment-as-code",
37
+ *extra_args,
38
+ *python_files,
39
+ ]
40
+ kwargs["label"] = f"{label} isort"
41
+ run_command(cmd=isort_cmd, **kwargs)
42
+
43
+ if options["black"]:
44
+ black_cmd = [
45
+ "python3",
46
+ "-m",
47
+ "black",
48
+ *extra_args,
49
+ *python_files,
50
+ ]
51
+ kwargs["label"] = f"{label} black"
52
+ run_command(cmd=black_cmd, **kwargs)
53
+
54
+ if options["docformatter"]:
55
+ docformatter_cmd = [
56
+ "python3",
57
+ "-m",
58
+ "docformatter",
59
+ "--wrap-summaries",
60
+ "88",
61
+ "--wrap-descriptions",
62
+ "88",
63
+ *docformatter_extra_args,
64
+ *extra_args,
65
+ *python_files,
66
+ ]
67
+ allowed_exits: typing.Tuple[int, ...] = (
68
+ 0, # no work/change required
69
+ 3, # no errors, but code was reformatted
70
+ )
71
+ if options["check-only"]:
72
+ # in check it is ONLY ok if no work/change was required
73
+ allowed_exits = (0,)
74
+ kwargs["label"] = f"{label} docformatter"
75
+ run_command(
76
+ cmd=docformatter_cmd,
77
+ ignore_fails=False,
78
+ valid_exit_ids=allowed_exits,
79
+ **kwargs,
80
+ )
81
+
82
+
83
+ def _job_py_pylint(
84
+ **kwargs: Unpack[JobKwargs],
85
+ ) -> None:
86
+ python_files: FilePathList = kwargs["file_list"]
87
+ root_path: pathlib.Path = kwargs["root_path"]
88
+
89
+ pylint_cfg = root_path / ".pylint.rc"
90
+ if not pylint_cfg.exists():
91
+ raise RuntimeError(f"PYLINT Config not found at '{pylint_cfg}'")
92
+
93
+ pylint_cmd = [
94
+ "python3",
95
+ "-m",
96
+ "pylint",
97
+ "-j1",
98
+ "--score=n",
99
+ f"--rcfile={pylint_cfg}",
100
+ *python_files,
101
+ ]
102
+ run_command(cmd=pylint_cmd, **kwargs)
103
+
104
+
105
+ def _job_py_flake8(
106
+ **kwargs: Unpack[JobKwargs],
107
+ ) -> None:
108
+ python_files: FilePathList = kwargs["file_list"]
109
+ root_path: pathlib.Path = kwargs["root_path"]
110
+ flake8_rc = root_path / ".flake8"
111
+ if not flake8_rc.exists():
112
+ raise RuntimeError(f"flake8 config not found at '{flake8_rc}'")
113
+
114
+ flake8_cmd = [
115
+ "python3",
116
+ "-m",
117
+ "flake8",
118
+ *python_files,
119
+ ]
120
+ run_command(cmd=flake8_cmd, **kwargs)
121
+
122
+
123
+ def _job_py_mypy(
124
+ **kwargs: Unpack[JobKwargs],
125
+ ) -> None:
126
+ python_files: FilePathList = kwargs["file_list"]
127
+ mypy_cmd = ["python3", "-m", "mypy", *python_files]
128
+ output = run_command(cmd=mypy_cmd, **kwargs)
129
+ if "mypy.ini" in output or "Not a boolean:" in output:
130
+ raise RunCommandUnhandledError(f"runem: mypy mis-config detected: {output}")
131
+
132
+
133
+ def _delete_old_coverage_reports(root_path: pathlib.Path) -> None:
134
+ """To avoid false-positives on coverage we delete the coverage report files."""
135
+ old_coverage_report_files: typing.List[pathlib.Path] = list(
136
+ root_path.glob(".coverage_report*")
137
+ )
138
+ for old_coverage_report in old_coverage_report_files:
139
+ old_coverage_report.unlink()
140
+
141
+
142
+ def _job_py_pytest( # noqa: C901 # pylint: disable=too-many-branches,too-many-statements
143
+ **kwargs: Unpack[JobKwargs],
144
+ ) -> JobReturnData:
145
+ label: JobName = kwargs["label"]
146
+ options: Options = kwargs["options"]
147
+ procs: int = kwargs["procs"]
148
+ root_path: pathlib.Path = kwargs["root_path"]
149
+
150
+ reports: JobReturnData = {"reportUrls": []}
151
+ # TODO: use pytest.ini config pytest
152
+ # pytest_cfg = root_path / ".pytest.ini"
153
+ # assert pytest_cfg.exists()
154
+
155
+ if not options["unit-test"]:
156
+ # we've disabled unit-testing on the cli
157
+ return reports
158
+
159
+ if options["profile"]:
160
+ raise RuntimeError("not implemented - see run_test.sh for how to implement")
161
+
162
+ pytest_path = root_path / "tests"
163
+ assert pytest_path.exists()
164
+
165
+ coverage_switches: typing.List[str] = []
166
+ coverage_cfg = root_path / ".coveragerc"
167
+ if options["coverage"]:
168
+ _delete_old_coverage_reports(root_path)
169
+ assert coverage_cfg.exists()
170
+ coverage_switches = [
171
+ "--cov=.",
172
+ f"--cov-config={str(coverage_cfg)}",
173
+ "--cov-append",
174
+ "--no-cov-on-fail", # do not show coverage terminal report when we fail
175
+ "--cov-fail-under=0", # we do coverage filing later
176
+ ]
177
+
178
+ # TODO: do we want to disable logs on pytest runs?
179
+ # "PYTEST_LOG":"--no-print-logs --log-level=CRITICAL" ;
180
+
181
+ threading_switches: typing.List[str] = []
182
+ if procs == -1:
183
+ threading_switches = ["-n", "auto"]
184
+
185
+ verbose_switches: typing.List[str] = []
186
+ if "verbose" in kwargs and kwargs["verbose"]:
187
+ verbose_switches = ["-vvv"]
188
+
189
+ profile_switches: typing.List[str] = []
190
+ cmd_pytest = [
191
+ "python3",
192
+ "-m",
193
+ "pytest",
194
+ "--color=yes",
195
+ *threading_switches,
196
+ # "-c",
197
+ # str(pytest_cfg),
198
+ *coverage_switches,
199
+ "--failed-first",
200
+ "--exitfirst",
201
+ *profile_switches,
202
+ *verbose_switches,
203
+ str(pytest_path),
204
+ ]
205
+
206
+ env_overrides: typing.Dict[str, str] = {}
207
+
208
+ kwargs["label"] = f"{label} pytest"
209
+ run_command(
210
+ cmd=cmd_pytest,
211
+ env_overrides=env_overrides,
212
+ **kwargs,
213
+ )
214
+
215
+ if options["coverage"]:
216
+ reports_dir: pathlib.Path = root_path / "reports"
217
+ reports_dir.mkdir(parents=False, exist_ok=True)
218
+ coverage_output_dir: pathlib.Path = reports_dir / "coverage_python"
219
+ if coverage_output_dir.exists():
220
+ shutil.rmtree(coverage_output_dir)
221
+ coverage_output_dir.mkdir(exist_ok=True)
222
+ if kwargs["verbose"]:
223
+ log("COVERAGE: Collating coverage")
224
+ # first generate the coverage report for our gitlab cicd
225
+ gen_cobertura_coverage_report_cmd = [
226
+ "python3",
227
+ "-m",
228
+ "coverage",
229
+ "xml",
230
+ "-o",
231
+ str(coverage_output_dir / "cobertura.xml"),
232
+ f"--rcfile={str(coverage_cfg)}",
233
+ ]
234
+ kwargs["label"] = f"{label} coverage cobertura"
235
+ run_command(cmd=gen_cobertura_coverage_report_cmd, **kwargs)
236
+
237
+ # then a html report
238
+ gen_html_coverage_report_cmd = [
239
+ "python3",
240
+ "-m",
241
+ "coverage",
242
+ "html",
243
+ f"--rcfile={str(coverage_cfg)}",
244
+ ]
245
+ kwargs["label"] = f"{label} coverage html"
246
+ run_command(cmd=gen_html_coverage_report_cmd, **kwargs)
247
+
248
+ # then a standard command-line report that causes the tests to fail.
249
+ gen_cli_coverage_report_cmd = [
250
+ "python3",
251
+ "-m",
252
+ "coverage",
253
+ "report",
254
+ "--fail-under=100",
255
+ f"--rcfile={str(coverage_cfg)}",
256
+ ]
257
+ kwargs["label"] = f"{label} coverage cli"
258
+ report_html = coverage_output_dir / "index.html"
259
+ report_cobertura = coverage_output_dir / "cobertura.xml"
260
+ try:
261
+ run_command(cmd=gen_cli_coverage_report_cmd, **kwargs)
262
+ except BaseException:
263
+ print()
264
+ print(report_html)
265
+ print(report_cobertura)
266
+ raise
267
+ assert coverage_output_dir.exists(), coverage_output_dir
268
+ assert report_html.exists(), report_html
269
+ assert report_cobertura.exists(), report_cobertura
270
+ reports["reportUrls"].append(("coverage html", report_html))
271
+ reports["reportUrls"].append(("coverage cobertura", report_cobertura))
272
+ if kwargs["verbose"]:
273
+ log("COVERAGE: cli output done")
274
+ return reports
275
+
276
+
277
+ def _install_python_requirements(
278
+ **kwargs: Unpack[JobKwargs],
279
+ ) -> None:
280
+ options: Options = kwargs["options"]
281
+ if not (options["install-deps"]):
282
+ # not enabled
283
+ return
284
+ cmd = [
285
+ "python3",
286
+ "-m",
287
+ "pip",
288
+ "install",
289
+ "-e",
290
+ ".[tests]",
291
+ ]
292
+ run_command(cmd=cmd, **kwargs)
File without changes
@@ -0,0 +1,19 @@
1
+ import pathlib
2
+ from datetime import timedelta
3
+
4
+ from typing_extensions import Unpack
5
+
6
+ from runem.types import HookKwargs
7
+
8
+
9
+ def _on_exit_hook(
10
+ **kwargs: Unpack[HookKwargs],
11
+ ) -> None:
12
+ """A noddy hook."""
13
+ assert "wall_clock_time_saved" in kwargs
14
+ wall_clock_time_saved: timedelta = kwargs["wall_clock_time_saved"]
15
+ root_path: pathlib.Path = pathlib.Path(__file__).parent.parent.parent
16
+ assert (root_path / ".runem.yml").exists()
17
+ times_log: pathlib.Path = root_path / ".times.log"
18
+ with times_log.open("a", encoding="utf-8") as file:
19
+ file.write(f"{str(wall_clock_time_saved.total_seconds())}\n")
@@ -0,0 +1,48 @@
1
+ import pathlib
2
+
3
+ from typing_extensions import Unpack
4
+
5
+ from runem.run_command import run_command
6
+ from runem.types import JobKwargs, Options
7
+
8
+
9
+ def _job_yarn_deps(
10
+ **kwargs: Unpack[JobKwargs],
11
+ ) -> None:
12
+ """Installs the yarn deps."""
13
+ options: Options = kwargs["options"]
14
+
15
+ install_requested = options["install-deps"]
16
+ if not (install_requested):
17
+ root_path: pathlib.Path = kwargs["root_path"]
18
+ if (root_path / "node_modules").exists():
19
+ # An install was not requested, nor required.
20
+ return
21
+
22
+ install_cmd = [
23
+ "yarn",
24
+ "install",
25
+ ]
26
+
27
+ run_command(cmd=install_cmd, **kwargs)
28
+
29
+
30
+ def _job_prettier(
31
+ **kwargs: Unpack[JobKwargs],
32
+ ) -> None:
33
+ """Runs prettifier on files, including json and maybe yml file.
34
+
35
+ TODO: connect me up!
36
+ """
37
+ options: Options = kwargs["options"]
38
+ command_variant = "pretty"
39
+ if options["check-only"]:
40
+ command_variant = "prettyCheck"
41
+
42
+ pretty_cmd = [
43
+ "yarn",
44
+ "run",
45
+ command_variant,
46
+ ]
47
+
48
+ run_command(cmd=pretty_cmd, **kwargs)
@@ -0,0 +1,105 @@
1
+ import pathlib
2
+ from argparse import Namespace
3
+ from collections import defaultdict
4
+ from typing import Dict
5
+ from unittest.mock import MagicMock
6
+
7
+ import pytest
8
+
9
+ from runem.command_line import initialise_options
10
+ from runem.config_metadata import ConfigMetadata
11
+ from runem.types.runem_config import JobConfig, PhaseGroupedJobs
12
+
13
+ Options = Dict[str, bool]
14
+
15
+
16
+ @pytest.fixture(name="config_metadata")
17
+ def config_metadata_fixture() -> ConfigMetadata:
18
+ config_file_path = pathlib.Path(__file__).parent / ".runem.yml"
19
+ expected_job: JobConfig = {
20
+ "addr": {
21
+ "file": "test_config_parse.py",
22
+ "function": "test_parse_config",
23
+ },
24
+ "label": "dummy job label",
25
+ "when": {
26
+ "phase": "dummy phase 1",
27
+ "tags": {"dummy tag 1", "dummy tag 2"},
28
+ },
29
+ }
30
+ expected_jobs: PhaseGroupedJobs = defaultdict(list)
31
+ expected_jobs["dummy phase 1"] = [
32
+ expected_job,
33
+ ]
34
+ return ConfigMetadata(
35
+ cfg_filepath=config_file_path,
36
+ phases=("dummy phase 1",),
37
+ options_config=(
38
+ {"name": "option1", "default": True},
39
+ {"name": "option2", "default": False},
40
+ {"name": "option3", "default": True},
41
+ {"name": "option4", "default": False},
42
+ ),
43
+ file_filters={
44
+ # "dummy tag": {
45
+ # "tag": "dummy tag",
46
+ # "regex": ".*1.txt", # should match just one file
47
+ # }
48
+ },
49
+ hook_manager=MagicMock(),
50
+ jobs=expected_jobs,
51
+ all_job_names=set(("dummy job label",)),
52
+ all_job_phases=set(("dummy phase 1",)),
53
+ all_job_tags=set(
54
+ (
55
+ "dummy tag 2",
56
+ "dummy tag 1",
57
+ )
58
+ ),
59
+ )
60
+
61
+
62
+ def test_initialise_options_no_overrides(config_metadata: ConfigMetadata) -> None:
63
+ args = Namespace(overrides_on=[], overrides_off=[])
64
+ options = initialise_options(config_metadata, args)
65
+ assert options == {
66
+ "option1": True,
67
+ "option2": False,
68
+ "option3": True,
69
+ "option4": False,
70
+ }
71
+
72
+
73
+ def test_initialise_options_overrides_on(config_metadata: ConfigMetadata) -> None:
74
+ args = Namespace(overrides_on=["option2", "option4"], overrides_off=[])
75
+ options = initialise_options(config_metadata, args)
76
+ assert options == {
77
+ "option1": True,
78
+ "option2": True,
79
+ "option3": True,
80
+ "option4": True,
81
+ }
82
+
83
+
84
+ def test_initialise_options_overrides_off(config_metadata: ConfigMetadata) -> None:
85
+ args = Namespace(overrides_on=[], overrides_off=["option1", "option3"])
86
+ options = initialise_options(config_metadata, args)
87
+ assert options == {
88
+ "option1": False,
89
+ "option2": False,
90
+ "option3": False,
91
+ "option4": False,
92
+ }
93
+
94
+
95
+ def test_initialise_options_overrides_on_and_off(
96
+ config_metadata: ConfigMetadata,
97
+ ) -> None:
98
+ args = Namespace(overrides_on=["option2"], overrides_off=["option1"])
99
+ options = initialise_options(config_metadata, args)
100
+ assert options == {
101
+ "option1": False,
102
+ "option2": True,
103
+ "option3": True,
104
+ "option4": False,
105
+ }
@@ -0,0 +1,55 @@
1
+ runem: WARNING: no phase found for 'echo "hello world!"', using 'dummy phase 1'
2
+ usage: -c [-H] [--jobs JOBS [JOBS ...]] [--not-jobs JOBS_EXCLUDED [JOBS_EXCLUDED ...]] [--phases PHASES [PHASES ...]] [--not-phases PHASES_EXCLUDED [PHASES_EXCLUDED ...]] [--tags TAGS [TAGS ...]] [--not-tags TAGS_EXCLUDED [TAGS_EXCLUDED ...]] [--dummy-option-1---complete-option] [--no-dummy-option-1---complete-option] [--dummy-option-2---minimal] [--no-dummy-option-2---minimal] [--call-graphs | --no-call-graphs] [-f | --modified-files | --no-modified-files] [-h | --git-head-files | --no-git-head-files] [--always-files ALWAYS_FILES [ALWAYS_FILES ...]] [--git-files-since-branch GIT_SINCE_BRANCH] [--procs PROCS] [--root ROOT_DIR] [--root-show | --no-root-show] [--silent | --no-silent | -s] [--spinner | --no-spinner] [--verbose | --no-verbose] [--version | --no-version | -v]
3
+
4
+ Runs the Lursight Lang test-suite
5
+
6
+ [TEST_REPLACED_OPTION_HEADER]
7
+ -H, --help show this help message and exit
8
+ --call-graphs, --no-call-graphs
9
+ -f, --modified-files, --no-modified-files
10
+ only use files that have changed (default: False)
11
+ -h, --git-head-files, --no-git-head-files
12
+ fast run of files (default: False)
13
+ --always-files ALWAYS_FILES [ALWAYS_FILES ...]
14
+ list of paths/files to always check (overriding -f/-h), if the path matches the filter regex and if file-paths exist
15
+ --git-files-since-branch GIT_SINCE_BRANCH
16
+ Get the list of paths/files changed between a branch, e.g., since 'origin/main'. Useful for checking files changed before pushing.
17
+ --procs PROCS, -j PROCS
18
+ the number of concurrent test jobs to run, -1 runs all test jobs at the same time ([TEST_REPLACED_CORES] cores available)
19
+ --root ROOT_DIR which dir to use as the base-dir for testing, defaults to directory containing the config '[TEST_REPLACED_DIR]'
20
+ --root-show, --no-root-show
21
+ show the root-path of runem and exit (default: False)
22
+ --silent, --no-silent, -s
23
+ Whether to show warning messages or not. (default: False)
24
+ --spinner, --no-spinner
25
+ Whether to show the progress spinner or not. Helps reduce log-spam in ci/cd. (default: True)
26
+ --verbose, --no-verbose
27
+ runs runem in in verbose mode, and streams jobs stdout/stderr to console (default: False)
28
+ --version, --no-version, -v
29
+ show the version of runem and exit (default: False)
30
+
31
+ jobs:
32
+ --jobs JOBS [JOBS ...]
33
+ List of job-names to run the given jobs. Other filters will modify this list. Defaults to 'dummy job label 1', 'dummy job label 2', 'echo "hello world!"', 'hello world'
34
+ --not-jobs JOBS_EXCLUDED [JOBS_EXCLUDED ...]
35
+ List of job-names to NOT run. Defaults to empty. Available options are: 'dummy job label 1', 'dummy job label 2', 'echo "hello world!"', 'hello world'
36
+
37
+ phases:
38
+ --phases PHASES [PHASES ...]
39
+ Run only the phases passed in, and can be used to change the phase order. Phases are run in the order given. Defaults to 'dummy phase 1', 'dummy phase 2'.
40
+ --not-phases PHASES_EXCLUDED [PHASES_EXCLUDED ...]
41
+ List of phases to NOT run. This option does not change the phase run order. Options are '['dummy phase 1', 'dummy phase 2']'.
42
+
43
+ tags:
44
+ --tags TAGS [TAGS ...]
45
+ Only run jobs with the given tags. Defaults to '['dummy tag 1', 'dummy tag 2', 'tag only on job 1', 'tag only on job 2']'.
46
+ --not-tags TAGS_EXCLUDED [TAGS_EXCLUDED ...]
47
+ Removes one or more tags from the list of job tags to be run. Options are '['dummy tag 1', 'dummy tag 2', 'tag only on job 1', 'tag only on job 2']'.
48
+
49
+ job-param overrides:
50
+ --dummy-option-1---complete-option, --dummy option 1 multi alias 1, --dummy option 1 multi alias 2, -x, --dummy option alias 1
51
+ a dummy option description
52
+ --no-dummy-option-1---complete-option, --no-dummy option 1 multi alias 1, --no-dummy option 1 multi alias 2, --no-x, --no-dummy option alias 1
53
+ turn off a dummy option description
54
+ --dummy-option-2---minimal
55
+ --no-dummy-option-2---minimal
@@ -0,0 +1,55 @@
1
+ runem: WARNING: no phase found for 'echo "hello world!"', using 'dummy phase 1'
2
+ usage: -c [-H] [--jobs JOBS [JOBS ...]] [--not-jobs JOBS_EXCLUDED [JOBS_EXCLUDED ...]] [--phases PHASES [PHASES ...]] [--not-phases PHASES_EXCLUDED [PHASES_EXCLUDED ...]] [--tags TAGS [TAGS ...]] [--not-tags TAGS_EXCLUDED [TAGS_EXCLUDED ...]] [--dummy-option-1---complete-option] [--no-dummy-option-1---complete-option] [--dummy-option-2---minimal] [--no-dummy-option-2---minimal] [--call-graphs | --no-call-graphs] [-f | --modified-files | --no-modified-files] [-h | --git-head-files | --no-git-head-files] [--always-files ALWAYS_FILES [ALWAYS_FILES ...]] [--git-files-since-branch GIT_SINCE_BRANCH] [--procs PROCS] [--root ROOT_DIR] [--root-show | --no-root-show] [--silent | --no-silent | -s] [--spinner | --no-spinner] [--verbose | --no-verbose] [--version | --no-version | -v]
3
+
4
+ Runs the Lursight Lang test-suite
5
+
6
+ [TEST_REPLACED_OPTION_HEADER]
7
+ -H, --help show this help message and exit
8
+ --call-graphs, --no-call-graphs
9
+ -f, --modified-files, --no-modified-files
10
+ only use files that have changed
11
+ -h, --git-head-files, --no-git-head-files
12
+ fast run of files
13
+ --always-files ALWAYS_FILES [ALWAYS_FILES ...]
14
+ list of paths/files to always check (overriding -f/-h), if the path matches the filter regex and if file-paths exist
15
+ --git-files-since-branch GIT_SINCE_BRANCH
16
+ Get the list of paths/files changed between a branch, e.g., since 'origin/main'. Useful for checking files changed before pushing.
17
+ --procs PROCS, -j PROCS
18
+ the number of concurrent test jobs to run, -1 runs all test jobs at the same time ([TEST_REPLACED_CORES] cores available)
19
+ --root ROOT_DIR which dir to use as the base-dir for testing, defaults to directory containing the config '[TEST_REPLACED_DIR]'
20
+ --root-show, --no-root-show
21
+ show the root-path of runem and exit
22
+ --silent, --no-silent, -s
23
+ Whether to show warning messages or not.
24
+ --spinner, --no-spinner
25
+ Whether to show the progress spinner or not. Helps reduce log-spam in ci/cd.
26
+ --verbose, --no-verbose
27
+ runs runem in in verbose mode, and streams jobs stdout/stderr to console
28
+ --version, --no-version, -v
29
+ show the version of runem and exit
30
+
31
+ jobs:
32
+ --jobs JOBS [JOBS ...]
33
+ List of job-names to run the given jobs. Other filters will modify this list. Defaults to 'dummy job label 1', 'dummy job label 2', 'echo "hello world!"', 'hello world'
34
+ --not-jobs JOBS_EXCLUDED [JOBS_EXCLUDED ...]
35
+ List of job-names to NOT run. Defaults to empty. Available options are: 'dummy job label 1', 'dummy job label 2', 'echo "hello world!"', 'hello world'
36
+
37
+ phases:
38
+ --phases PHASES [PHASES ...]
39
+ Run only the phases passed in, and can be used to change the phase order. Phases are run in the order given. Defaults to 'dummy phase 1', 'dummy phase 2'.
40
+ --not-phases PHASES_EXCLUDED [PHASES_EXCLUDED ...]
41
+ List of phases to NOT run. This option does not change the phase run order. Options are '['dummy phase 1', 'dummy phase 2']'.
42
+
43
+ tags:
44
+ --tags TAGS [TAGS ...]
45
+ Only run jobs with the given tags. Defaults to '['dummy tag 1', 'dummy tag 2', 'tag only on job 1', 'tag only on job 2']'.
46
+ --not-tags TAGS_EXCLUDED [TAGS_EXCLUDED ...]
47
+ Removes one or more tags from the list of job tags to be run. Options are '['dummy tag 1', 'dummy tag 2', 'tag only on job 1', 'tag only on job 2']'.
48
+
49
+ job-param overrides:
50
+ --dummy-option-1---complete-option, --dummy option 1 multi alias 1, --dummy option 1 multi alias 2, -x, --dummy option alias 1
51
+ a dummy option description
52
+ --no-dummy-option-1---complete-option, --no-dummy option 1 multi alias 1, --no-dummy option 1 multi alias 2, --no-x, --no-dummy option alias 1
53
+ turn off a dummy option description
54
+ --dummy-option-2---minimal
55
+ --no-dummy-option-2---minimal