From 7c4158daeac9f61a8f8590ab33175202e202ff47 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 28 Aug 2023 22:47:27 +0000 Subject: [PATCH 01/21] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/python-jsonschema/check-jsonschema: 0.26.0 → 0.26.3](https://github.com/python-jsonschema/check-jsonschema/compare/0.26.0...0.26.3) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 74eb83e4d..e68f6badc 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,7 +1,7 @@ repos: # dogfood - repo: https://github.com/python-jsonschema/check-jsonschema - rev: 0.26.0 + rev: 0.26.3 hooks: - id: check-dependabot - id: check-github-workflows From b1c688cebaa77aa8293559cd7c2fc54bfef4a95d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 Sep 2023 05:40:45 +0000 Subject: [PATCH 02/21] Bump furo from 2023.7.26 to 2023.8.19 Bumps [furo](https://github.com/pradyunsg/furo) from 2023.7.26 to 2023.8.19. - [Release notes](https://github.com/pradyunsg/furo/releases) - [Changelog](https://github.com/pradyunsg/furo/blob/main/docs/changelog.md) - [Commits](https://github.com/pradyunsg/furo/compare/2023.07.26...2023.08.19) --- updated-dependencies: - dependency-name: furo dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- setup.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.cfg b/setup.cfg index bfa9a00af..0afa17e1c 100644 --- a/setup.cfg +++ b/setup.cfg @@ -45,7 +45,7 @@ dev = docs = sphinx<8 sphinx-issues<4 - furo==2023.7.26 + furo==2023.8.19 [isort] profile = black From b07a4153c11e2b1a5acbe29a043791396fc79838 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 Sep 2023 05:40:55 +0000 Subject: [PATCH 03/21] Bump responses from 0.23.2 to 0.23.3 Bumps [responses](https://github.com/getsentry/responses) from 0.23.2 to 0.23.3. - [Release notes](https://github.com/getsentry/responses/releases) - [Changelog](https://github.com/getsentry/responses/blob/master/CHANGES) - [Commits](https://github.com/getsentry/responses/compare/0.23.2...0.23.3) --- updated-dependencies: - dependency-name: responses dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- setup.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.cfg b/setup.cfg index bfa9a00af..4051c7b4f 100644 --- a/setup.cfg +++ b/setup.cfg @@ -41,7 +41,7 @@ dev = pytest<8 coverage<8 pytest-xdist<4 - responses==0.23.2 + responses==0.23.3 docs = sphinx<8 sphinx-issues<4 From 9f923261a4c9b1d650501fe9d46cc30d09358540 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Sep 2023 10:32:22 -0500 Subject: [PATCH 04/21] Bump actions/checkout from 3 to 4 (#321) Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build.yaml | 12 ++++++------ .github/workflows/daily.yaml | 2 +- .github/workflows/publish_to_pypi.yaml | 2 +- .github/workflows/publish_to_test_pypi.yaml | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 8762a3dfa..b274c2926 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -16,7 +16,7 @@ jobs: runs-on: ubuntu-latest name: "Run '${{ matrix.toxenv }}' on python ${{ matrix.py }}" steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: get date for caching run: /bin/date -u "+%U" > cachedate.txt @@ -40,7 +40,7 @@ jobs: test-sdist: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: actions/setup-python@v4 with: python-version: "3.x" @@ -66,7 +66,7 @@ jobs: name: "Run tests on ${{ matrix.os }}, py${{ matrix.py }}" runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: get date for caching run: /bin/date -u "+%U" > cachedate.txt @@ -110,7 +110,7 @@ jobs: runs-on: ubuntu-latest name: "Collate results to check for skipped tests" steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: actions/setup-python@v4 with: python-version: "3.x" @@ -128,7 +128,7 @@ jobs: ensure-catalog-matches-hook-config: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: get date for caching run: /bin/date -u "+%U" > cachedate.txt @@ -157,7 +157,7 @@ jobs: name: "Self-Check" runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: get date for caching run: /bin/date -u "+%U" > cachedate.txt diff --git a/.github/workflows/daily.yaml b/.github/workflows/daily.yaml index e3be6f9c7..b3abdfbb5 100644 --- a/.github/workflows/daily.yaml +++ b/.github/workflows/daily.yaml @@ -10,7 +10,7 @@ jobs: vendor-schemas: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: actions/setup-python@v4 with: python-version: '3.x' diff --git a/.github/workflows/publish_to_pypi.yaml b/.github/workflows/publish_to_pypi.yaml index 887206631..6f26fb215 100644 --- a/.github/workflows/publish_to_pypi.yaml +++ b/.github/workflows/publish_to_pypi.yaml @@ -9,7 +9,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: actions/setup-python@v4 with: python-version: "3.11" diff --git a/.github/workflows/publish_to_test_pypi.yaml b/.github/workflows/publish_to_test_pypi.yaml index 26f10c5da..c1d4afbf1 100644 --- a/.github/workflows/publish_to_test_pypi.yaml +++ b/.github/workflows/publish_to_test_pypi.yaml @@ -16,7 +16,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: actions/setup-python@v4 with: python-version: "3.11" From 29c0e441f3a411040408f4032267d24299fd73bc Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 11 Sep 2023 19:16:38 -0500 Subject: [PATCH 05/21] [pre-commit.ci] pre-commit autoupdate (#323) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/psf/black: 23.7.0 → 23.9.1](https://github.com/psf/black/compare/23.7.0...23.9.1) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index e68f6badc..990681d36 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -19,7 +19,7 @@ repos: - id: check-merge-conflict - id: trailing-whitespace - repo: https://github.com/psf/black - rev: 23.7.0 + rev: 23.9.1 hooks: - id: black - repo: https://github.com/PyCQA/flake8 From db1bf62a5220e86b5ecca5bd298d80198b82ccc4 Mon Sep 17 00:00:00 2001 From: Stephen Rosen Date: Fri, 15 Sep 2023 01:06:05 -0500 Subject: [PATCH 06/21] Add interface for passing custom validators This adds the necessary pieces for passing a custom validator class to check-jsonschema. `--fill-defaults` help text contains a hint that it may conflict (depending on the validator), to help warn of the potential for surprising interplay between a custom validator class and optional check-jsonschema behaviors. This commit only adds the interface pieces for passing the validator class to the CLI in a well-specified format, and handles the import/load of that value. No implementation in terms of threading the resulting value down to the validator(s) is included yet. --- src/check_jsonschema/cli/main_command.py | 24 ++++- src/check_jsonschema/cli/param_types.py | 72 ++++++++++++++ src/check_jsonschema/cli/parse_result.py | 15 ++- tests/unit/test_cli_parse.py | 119 +++++++++++++++++++++++ 4 files changed, 226 insertions(+), 4 deletions(-) diff --git a/src/check_jsonschema/cli/main_command.py b/src/check_jsonschema/cli/main_command.py index eb36b174e..c495c6054 100644 --- a/src/check_jsonschema/cli/main_command.py +++ b/src/check_jsonschema/cli/main_command.py @@ -4,6 +4,7 @@ import textwrap import click +import jsonschema from ..catalog import CUSTOM_SCHEMA_NAMES, SCHEMA_CATALOG from ..checker import SchemaChecker @@ -18,7 +19,7 @@ SchemaLoaderBase, ) from ..transforms import TRANSFORM_LIBRARY -from .param_types import CommaDelimitedList +from .param_types import CommaDelimitedList, ValidatorClassName from .parse_result import ParseResult, SchemaLoadingMode BUILTIN_SCHEMA_NAMES = [f"vendor.{k}" for k in SCHEMA_CATALOG.keys()] + [ @@ -169,13 +170,27 @@ def pretty_helptext_list(values: list[str] | tuple[str, ...]) -> str: ) @click.option( "--fill-defaults", - help="Autofill 'default' values prior to validation.", + help=( + "Autofill 'default' values prior to validation. " + "This may conflict with certain third-party validators used with " + "'--validator-class'" + ), is_flag=True, ) +@click.option( + "--validator-class", + help=( + "The fully qualified name of a python validator to use in place of " + "the 'jsonschema' library validators, in the form of ':'. " + "The validator must be importable in the same environment where " + "'check-jsonschema' is run." + ), + type=ValidatorClassName(), +) @click.option( "-o", "--output-format", - help="Which output format to use", + help="Which output format to use.", type=click.Choice(tuple(REPORTER_BY_NAME.keys()), case_sensitive=False), default="text", ) @@ -217,6 +232,7 @@ def main( traceback_mode: str, data_transform: str | None, fill_defaults: bool, + validator_class: type[jsonschema.protocols.Validator] | None, output_format: str, verbose: int, quiet: int, @@ -225,6 +241,8 @@ def main( args = ParseResult() args.set_schema(schemafile, builtin_schema, check_metaschema) + args.set_validator(validator_class) + args.base_uri = base_uri args.instancefiles = instancefiles diff --git a/src/check_jsonschema/cli/param_types.py b/src/check_jsonschema/cli/param_types.py index 505bb75c5..d28a4af07 100644 --- a/src/check_jsonschema/cli/param_types.py +++ b/src/check_jsonschema/cli/param_types.py @@ -1,11 +1,17 @@ from __future__ import annotations +import importlib +import re import typing as t +import warnings import click +import jsonschema class CommaDelimitedList(click.ParamType): + name = "comma_delimited" + def __init__( self, *, @@ -43,3 +49,69 @@ def convert( ) return resolved + + +class ValidatorClassName(click.ParamType): + name = "validator" + + def convert( + self, value: str, param: click.Parameter | None, ctx: click.Context | None + ) -> type[jsonschema.protocols.Validator]: + """ + Use a colon-based parse to split this up and do the import with importlib. + This method is inspired by pkgutil.resolve_name and uses the newer syntax + documented there. + + pkgutil supports both + W(.W)* + and + W(.W)*:(W(.W)*)? + as patterns, but notes that the first one is for backwards compatibility only. + The second form is preferred because it clarifies the division between the + importable name and any namespaced path to an object or class. + + As a result, only one import is needed, rather than iterative imports over the + list of names. + """ + value = super().convert(value, param, ctx) + pattern = re.compile( + r"^(?P(?!\d)(\w+)(\.(?!\d)(\w+))*):" + r"(?P(?!\d)(\w+)(\.(?!\d)(\w+))*)$" + ) + m = pattern.match(value) + if m is None: + self.fail( + f"'{value}' is not a valid specifier in ':' form", + param, + ctx, + ) + pkg = m.group("pkg") + classname = m.group("cls") + try: + result: t.Any = importlib.import_module(pkg) + except ImportError as e: + self.fail(f"'{pkg}' was not an importable module. {str(e)}", param, ctx) + try: + for part in classname.split("."): + result = getattr(result, part) + except AttributeError as e: + self.fail( + f"'{classname}' was not resolvable to a class in '{pkg}'. {str(e)}", + param, + ctx, + ) + + if not callable(result): + self.fail( + f"'{classname}' in '{pkg}' is not a class or callable", param, ctx + ) + + if not isinstance(result, type): + warnings.warn( + f"'{classname}' in '{pkg}' is not a class. If it is a function " + f"returning a Validator, it still might work, but this usage " + "is not recommended.", + stacklevel=1, + ) + + return t.cast(t.Type[jsonschema.protocols.Validator], result) diff --git a/src/check_jsonschema/cli/parse_result.py b/src/check_jsonschema/cli/parse_result.py index f74ce3be6..668d3b289 100644 --- a/src/check_jsonschema/cli/parse_result.py +++ b/src/check_jsonschema/cli/parse_result.py @@ -3,6 +3,7 @@ import enum import click +import jsonschema from ..formats import FormatOptions, RegexVariantName from ..transforms import Transform @@ -28,7 +29,8 @@ def __init__(self) -> None: self.default_filetype: str = "json" # data-transform (for Azure Pipelines and potentially future transforms) self.data_transform: Transform | None = None - # fill default values on instances during validation + # validation behavioral controls + self.validator_class: type[jsonschema.protocols.Validator] | None = None self.fill_defaults: bool = False # regex format options self.disable_all_formats: bool = False @@ -65,6 +67,17 @@ def set_schema( else: self.schema_mode = SchemaLoadingMode.metaschema + def set_validator( + self, validator_class: type[jsonschema.protocols.Validator] | None + ) -> None: + if validator_class is None: + return + if self.schema_mode != SchemaLoadingMode.filepath: + raise click.UsageError( + "--validator-class can only be used with --schemafile for schema loading" + ) + self.validator_class = validator_class + @property def format_opts(self) -> FormatOptions: return FormatOptions( diff --git a/tests/unit/test_cli_parse.py b/tests/unit/test_cli_parse.py index 2d780aad6..9b607c58d 100644 --- a/tests/unit/test_cli_parse.py +++ b/tests/unit/test_cli_parse.py @@ -1,5 +1,7 @@ from __future__ import annotations +import pathlib +import sys from unittest import mock import click @@ -27,6 +29,33 @@ def mock_parse_result(): yield args +@pytest.fixture +def mock_module(tmp_path, monkeypatch): + monkeypatch.syspath_prepend(tmp_path) + all_names_to_clear = [] + + def func(path, text): + path = pathlib.Path(path) + mod_dir = tmp_path / (path.parent) + mod_dir.mkdir(parents=True, exist_ok=True) + for part in path.parts[:-1]: + (tmp_path / part / "__init__.py").touch() + + (tmp_path / path).write_text(text) + + for i in range(len(path.parts)): + modname = ".".join(path.parts[: i + 1]) + if modname.endswith(".py"): + modname = modname[:-3] + all_names_to_clear.append(modname) + + yield func + + for name in all_names_to_clear: + if name in sys.modules: + del sys.modules[name] + + @pytest.fixture(autouse=True) def mock_cli_exec(boxed_context): def get_ctx(*args): @@ -258,3 +287,93 @@ def test_disable_all_formats(runner, mock_parse_result, addargs): + addargs, ) assert mock_parse_result.disable_all_formats is True + + +def test_can_specify_custom_validator_class(runner, mock_parse_result, mock_module): + mock_module("foo.py", "class MyValidator: pass") + import foo + + result = runner.invoke( + cli_main, + [ + "--schemafile", + "schema.json", + "foo.json", + "--validator-class", + "foo:MyValidator", + ], + ) + assert result.exit_code == 0 + assert mock_parse_result.validator_class == foo.MyValidator + + +def test_warns_on_validator_function(runner, mock_parse_result, mock_module): + mock_module( + "foo/bar.py", + """\ +class MyValidator: pass + +def validator(*args, **kwargs): + return MyValidator(*args, **kwargs) +""", + ) + import foo.bar + + with pytest.warns(UserWarning, match="'validator' in 'foo.bar' is not a class"): + result = runner.invoke( + cli_main, + [ + "--schemafile", + "schema.json", + "foo.json", + "--validator-class", + "foo.bar:validator", + ], + ) + assert result.exit_code == 0 + assert mock_parse_result.validator_class == foo.bar.validator + + +@pytest.mark.parametrize("failmode", ("syntax", "import", "attr", "callability")) +def test_can_custom_validator_class_fails( + runner, mock_parse_result, mock_module, failmode +): + mock_module( + "foo.py", + """\ +class MyValidator: pass + +def validator(*args, **kwargs): + return MyValidator(*args, **kwargs) + +other_thing = 100 +""", + ) + + if failmode == "syntax": + arg = "foo.MyValidator" + elif failmode == "import": + arg = "foo.bar:MyValidator" + elif failmode == "attr": + arg = "foo:no_such_attr" + elif failmode == "callability": + arg = "foo:other_thing" + else: + raise NotImplementedError + + result = runner.invoke( + cli_main, + ["--schemafile", "schema.json", "foo.json", "--validator-class", arg], + ) + assert result.exit_code == 2 + + if failmode == "syntax": + assert "is not a valid specifier" in result.stderr + elif failmode == "import": + assert "was not an importable module" in result.stderr + elif failmode == "attr": + assert "was not resolvable to a class" in result.stderr + elif failmode == "callability": + assert "is not a class or callable" in result.stderr + else: + raise NotImplementedError From d97e7c312a88b3d3c996b28a47b0ae700a4faf36 Mon Sep 17 00:00:00 2001 From: Stefan Weber Date: Mon, 18 Sep 2023 17:08:01 +0200 Subject: [PATCH 07/21] fix: several file ending dots in catalog file regex(. -> \.) --- src/check_jsonschema/catalog.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/check_jsonschema/catalog.py b/src/check_jsonschema/catalog.py index e2620a931..cc51d2052 100644 --- a/src/check_jsonschema/catalog.py +++ b/src/check_jsonschema/catalog.py @@ -30,7 +30,7 @@ def _githubusercontent_url(owner: str, repo: str, ref: str, path: str) -> str: "description": "Validate Azure Pipelines config against the schema provided " "by Microsoft", "add_args": ["--data-transform", "azure-pipelines"], - "files": r"^(\.)?azure-pipelines.(yml|yaml)$", + "files": r"^(\.)?azure-pipelines\.(yml|yaml)$", "types": "yaml", }, }, @@ -72,7 +72,7 @@ def _githubusercontent_url(owner: str, repo: str, ref: str, path: str) -> str: "url": "https://json.schemastore.org/dependabot-2.0.json", "hook_config": { "name": "Validate Dependabot Config (v2)", - "files": r"^\.github/dependabot.(yml|yaml)$", + "files": r"^\.github/dependabot\.(yml|yaml)$", "types": "yaml", }, }, @@ -88,7 +88,10 @@ def _githubusercontent_url(owner: str, repo: str, ref: str, path: str) -> str: "url": "https://json.schemastore.org/github-action", "hook_config": { "name": "Validate GitHub Actions", - "files": ["action.(yml|yaml)", r"\.github/actions/(.+/)?action.(yml|yaml)"], + "files": [ + "action.(yml|yaml)", + r"\.github/actions/(.+/)?action\.(yml|yaml)", + ], "types": "yaml", }, }, @@ -106,7 +109,7 @@ def _githubusercontent_url(owner: str, repo: str, ref: str, path: str) -> str: "hook_config": { "name": "Validate GitLab CI config", "add_args": ["--data-transform", "gitlab-ci"], - "files": r"^.*\.gitlab-ci.yml$", + "files": r"^.*\.gitlab-ci\.yml$", "types": "yaml", }, }, @@ -121,7 +124,7 @@ def _githubusercontent_url(owner: str, repo: str, ref: str, path: str) -> str: "name": "Validate ReadTheDocs Config", "description": "Validate ReadTheDocs config against the schema " "provided by ReadTheDocs", - "files": r"^\.readthedocs.(yml|yaml)$", + "files": r"^\.readthedocs\.(yml|yaml)$", "types": "yaml", }, }, @@ -142,7 +145,7 @@ def _githubusercontent_url(owner: str, repo: str, ref: str, path: str) -> str: "url": "https://json.schemastore.org/travis", "hook_config": { "name": "Validate Travis Config", - "files": r"^\.travis.(yml|yaml)$", + "files": r"^\.travis\.(yml|yaml)$", "types": "yaml", }, }, From 16c480c901fbe1064f44880e80db6a41e2e5acdb Mon Sep 17 00:00:00 2001 From: Stefan Weber Date: Mon, 18 Sep 2023 17:22:07 +0200 Subject: [PATCH 08/21] fix: add missed \. for action.yml + raw string for regex --- src/check_jsonschema/catalog.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/check_jsonschema/catalog.py b/src/check_jsonschema/catalog.py index cc51d2052..501e57201 100644 --- a/src/check_jsonschema/catalog.py +++ b/src/check_jsonschema/catalog.py @@ -89,7 +89,7 @@ def _githubusercontent_url(owner: str, repo: str, ref: str, path: str) -> str: "hook_config": { "name": "Validate GitHub Actions", "files": [ - "action.(yml|yaml)", + r"action\.(yml|yaml)", r"\.github/actions/(.+/)?action\.(yml|yaml)", ], "types": "yaml", From 2308b5b83d6f0a76136f3ec5c82cbf95960c3378 Mon Sep 17 00:00:00 2001 From: Stefan Weber Date: Mon, 18 Sep 2023 17:26:40 +0200 Subject: [PATCH 09/21] chore: run tox to regenerate pre-commit-hooks.yaml --- .pre-commit-hooks.yaml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.pre-commit-hooks.yaml b/.pre-commit-hooks.yaml index 7c01e5aec..d0ee50a54 100644 --- a/.pre-commit-hooks.yaml +++ b/.pre-commit-hooks.yaml @@ -26,7 +26,7 @@ description: 'Validate Azure Pipelines config against the schema provided by Microsoft' entry: check-jsonschema --builtin-schema vendor.azure-pipelines --data-transform azure-pipelines language: python - files: ^(\.)?azure-pipelines.(yml|yaml)$ + files: ^(\.)?azure-pipelines\.(yml|yaml)$ types: [yaml] # this hook is autogenerated from a script @@ -76,7 +76,7 @@ description: 'Validate Dependabot Config (v2) against the schema provided by SchemaStore' entry: check-jsonschema --builtin-schema vendor.dependabot language: python - files: ^\.github/dependabot.(yml|yaml)$ + files: ^\.github/dependabot\.(yml|yaml)$ types: [yaml] # this hook is autogenerated from a script @@ -100,8 +100,8 @@ language: python files: > (?x)^( - action.(yml|yaml)| - \.github/actions/(.+/)?action.(yml|yaml) + action\.(yml|yaml)| + \.github/actions/(.+/)?action\.(yml|yaml) )$ types: [yaml] @@ -124,7 +124,7 @@ description: 'Validate GitLab CI config against the schema provided by SchemaStore' entry: check-jsonschema --builtin-schema vendor.gitlab-ci --data-transform gitlab-ci language: python - files: ^.*\.gitlab-ci.yml$ + files: ^.*\.gitlab-ci\.yml$ types: [yaml] # this hook is autogenerated from a script @@ -135,7 +135,7 @@ description: 'Validate ReadTheDocs config against the schema provided by ReadTheDocs' entry: check-jsonschema --builtin-schema vendor.readthedocs language: python - files: ^\.readthedocs.(yml|yaml)$ + files: ^\.readthedocs\.(yml|yaml)$ types: [yaml] # this hook is autogenerated from a script @@ -161,5 +161,5 @@ description: 'Validate Travis Config against the schema provided by SchemaStore' entry: check-jsonschema --builtin-schema vendor.travis language: python - files: ^\.travis.(yml|yaml)$ + files: ^\.travis\.(yml|yaml)$ types: [yaml] From 1cac4fc4597ba27add068c168f21bb70e6149568 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 18 Sep 2023 23:28:16 +0000 Subject: [PATCH 10/21] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/asottile/pyupgrade: v3.10.1 → v3.11.0](https://github.com/asottile/pyupgrade/compare/v3.10.1...v3.11.0) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 990681d36..f039a9bae 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -32,7 +32,7 @@ repos: hooks: - id: isort - repo: https://github.com/asottile/pyupgrade - rev: v3.10.1 + rev: v3.11.0 hooks: - id: pyupgrade args: ["--py37-plus"] From 11f7dfa6f871ba77c29bfc890d22f34b01f6dea7 Mon Sep 17 00:00:00 2001 From: Stephen Rosen Date: Tue, 19 Sep 2023 18:11:31 -0500 Subject: [PATCH 11/21] Instrument use of custom --validator-class values Implement the underlying arg-passing to set the `--validator-class` from CLI arguments when creating a SchemaLoader (the class used when `--schemafile` is used). --- src/check_jsonschema/cli/main_command.py | 1 + src/check_jsonschema/schema_loader/main.py | 20 +++++++++++++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/check_jsonschema/cli/main_command.py b/src/check_jsonschema/cli/main_command.py index c495c6054..85cb62651 100644 --- a/src/check_jsonschema/cli/main_command.py +++ b/src/check_jsonschema/cli/main_command.py @@ -290,6 +290,7 @@ def build_schema_loader(args: ParseResult) -> SchemaLoaderBase: args.cache_filename, args.disable_cache, base_uri=args.base_uri, + validator_class=args.validator_class, ) else: raise NotImplementedError("no valid schema option provided") diff --git a/src/check_jsonschema/schema_loader/main.py b/src/check_jsonschema/schema_loader/main.py index aa3c10411..52e55185f 100644 --- a/src/check_jsonschema/schema_loader/main.py +++ b/src/check_jsonschema/schema_loader/main.py @@ -56,18 +56,22 @@ def get_validator( class SchemaLoader(SchemaLoaderBase): + validator_class: type[jsonschema.protocols.Validator] | None = None + def __init__( self, schemafile: str, cache_filename: str | None = None, disable_cache: bool = False, base_uri: str | None = None, + validator_class: type[jsonschema.protocols.Validator] | None = None, ) -> None: # record input parameters (these are not to be modified) self.schemafile = schemafile self.cache_filename = cache_filename self.disable_cache = disable_cache self.base_uri = base_uri + self.validator_class = validator_class # if the schema location is a URL, which may include a file:// URL, parse it self.url_info = None @@ -132,9 +136,19 @@ def get_validator( self._parsers, retrieval_uri, schema ) - # get the correct validator class and check the schema under its metaschema - validator_cls = jsonschema.validators.validator_for(schema) - validator_cls.check_schema(schema) + if self.validator_class is None: + # get the correct validator class and check the schema under its metaschema + validator_cls = jsonschema.validators.validator_for(schema) + validator_cls.check_schema(schema) + else: + # for a user-provided validator class, don't check_schema + # on the grounds that it might *not* be valid but the user wants to use + # their custom validator anyway + # + # in fact, there's no real guarantee that a user-provided + # validator_class properly conforms to the jsonschema.Validator protocol + # we *hope* that it does, but we can't be fully sure + validator_cls = self.validator_class # extend the validator class with default-filling behavior if appropriate if fill_defaults: From 58f2848a102237f9a5da767c2e6666cfdbbd44fe Mon Sep 17 00:00:00 2001 From: Stephen Rosen Date: Tue, 19 Sep 2023 18:18:45 -0500 Subject: [PATCH 12/21] Restrict --validator-class to types (no functions) In order to better guarantee that `--validator-class` provides the name of a `jsonschema.protocols.Validator` class, require that the value passed is a type and not an alternative function. This requirement does not lose significant expressive power and allows us to more safely assume that the validator really is an implementation of the protocol which can be extended with `--fill-defaults` and other validator-related hooks. There is no real way to guarantee the safety of using the user's Validator. After all -- it could always raise an error at any time -- but this matches check-jsonschema's expectations about the argument better. This change can always be reverted in the future if there is significant demand for a function-as-a-validator-class option. --- src/check_jsonschema/cli/param_types.py | 13 +------- tests/unit/test_cli_parse.py | 41 ++++++------------------- 2 files changed, 10 insertions(+), 44 deletions(-) diff --git a/src/check_jsonschema/cli/param_types.py b/src/check_jsonschema/cli/param_types.py index d28a4af07..7c80f8669 100644 --- a/src/check_jsonschema/cli/param_types.py +++ b/src/check_jsonschema/cli/param_types.py @@ -3,7 +3,6 @@ import importlib import re import typing as t -import warnings import click import jsonschema @@ -101,17 +100,7 @@ def convert( ctx, ) - if not callable(result): - self.fail( - f"'{classname}' in '{pkg}' is not a class or callable", param, ctx - ) - if not isinstance(result, type): - warnings.warn( - f"'{classname}' in '{pkg}' is not a class. If it is a function " - f"returning a Validator, it still might work, but this usage " - "is not recommended.", - stacklevel=1, - ) + self.fail(f"'{classname}' in '{pkg}' is not a class", param, ctx) return t.cast(t.Type[jsonschema.protocols.Validator], result) diff --git a/tests/unit/test_cli_parse.py b/tests/unit/test_cli_parse.py index 9b607c58d..90d5011ee 100644 --- a/tests/unit/test_cli_parse.py +++ b/tests/unit/test_cli_parse.py @@ -307,34 +307,9 @@ def test_can_specify_custom_validator_class(runner, mock_parse_result, mock_modu assert mock_parse_result.validator_class == foo.MyValidator -def test_warns_on_validator_function(runner, mock_parse_result, mock_module): - mock_module( - "foo/bar.py", - """\ -class MyValidator: pass - -def validator(*args, **kwargs): - return MyValidator(*args, **kwargs) -""", - ) - import foo.bar - - with pytest.warns(UserWarning, match="'validator' in 'foo.bar' is not a class"): - result = runner.invoke( - cli_main, - [ - "--schemafile", - "schema.json", - "foo.json", - "--validator-class", - "foo.bar:validator", - ], - ) - assert result.exit_code == 0 - assert mock_parse_result.validator_class == foo.bar.validator - - -@pytest.mark.parametrize("failmode", ("syntax", "import", "attr", "callability")) +@pytest.mark.parametrize( + "failmode", ("syntax", "import", "attr", "function", "non_callable") +) def test_can_custom_validator_class_fails( runner, mock_parse_result, mock_module, failmode ): @@ -343,7 +318,7 @@ def test_can_custom_validator_class_fails( """\ class MyValidator: pass -def validator(*args, **kwargs): +def validator_func(*args, **kwargs): return MyValidator(*args, **kwargs) other_thing = 100 @@ -356,7 +331,9 @@ def validator(*args, **kwargs): arg = "foo.bar:MyValidator" elif failmode == "attr": arg = "foo:no_such_attr" - elif failmode == "callability": + elif failmode == "function": + arg = "foo:validator_func" + elif failmode == "non_callable": arg = "foo:other_thing" else: raise NotImplementedError @@ -373,7 +350,7 @@ def validator(*args, **kwargs): assert "was not an importable module" in result.stderr elif failmode == "attr": assert "was not resolvable to a class" in result.stderr - elif failmode == "callability": - assert "is not a class or callable" in result.stderr + elif failmode in ("function", "non_callable"): + assert "is not a class" in result.stderr else: raise NotImplementedError From 4a0fdcaeb56466fd24a81ea16cd2c8a68bc27823 Mon Sep 17 00:00:00 2001 From: Stephen Rosen Date: Tue, 19 Sep 2023 19:45:57 -0500 Subject: [PATCH 13/21] Add tests for custom validator usage Using the mock_module fixture (lifted to top-level conftest), setup a custom validator which does some "real" validation work. --- .../acceptance/test_custom_validator_class.py | 149 ++++++++++++++++++ tests/conftest.py | 30 ++++ tests/unit/test_cli_parse.py | 33 +--- 3 files changed, 180 insertions(+), 32 deletions(-) create mode 100644 tests/acceptance/test_custom_validator_class.py diff --git a/tests/acceptance/test_custom_validator_class.py b/tests/acceptance/test_custom_validator_class.py new file mode 100644 index 000000000..018718cec --- /dev/null +++ b/tests/acceptance/test_custom_validator_class.py @@ -0,0 +1,149 @@ +import json + +import pytest + +# define a calendar event schema and then use a custom validator to validate that there +# are no events with "Occult" in their names +SCHEMA = { + "$schema": "http://json-schema.org/draft-07/schema", + "definitions": { + "calendar-event": { + "type": "object", + "properties": { + "title": {"type": "string"}, + "start": {"type": "string", "format": "date-time"}, + "end": {"type": "string", "format": "date-time"}, + }, + } + }, + "properties": { + "events": { + "type": "array", + "items": {"$ref": "#/definitions/calendar-event"}, + }, + }, + "required": ["events"], +} +VALID_DOC = { + "events": [ + { + "title": "Weekly Production Meeting", + "start": "2019-06-24T09:00:00-05:00", + "end": "2019-06-24T10:00:00-05:00", + }, + { + "title": "Catch Up", + "start": "2019-06-24T10:00:00-05:00", + "end": "2019-06-24T10:30:00-05:00", + }, + ] +} +INVALID_DOC = { + "events": [ + { + "title": "Weekly Production Meeting", + "start": "2019-06-24T09:00:00-05:00", + "end": "2019-06-24T10:00:00-05:00", + }, + { + "title": "Catch Up", + "start": "2019-06-24T10:00:00-05:00", + "end": "2019-06-24T10:30:00-05:00", + }, + { + "title": "Occult Study Session", + "start": "2019-06-24T10:00:00-05:00", + "end": "2019-06-24T12:00:00-05:00", + }, + ] +} + + +@pytest.fixture(autouse=True) +def _foo_module(mock_module): + mock_module( + "foo.py", + """\ +import jsonschema + +class MyValidator: + def __init__(self, schema, *args, **kwargs): + self.schema = schema + self.real_validator = jsonschema.validators.Draft7Validator( + schema, *args, **kwargs + ) + + def iter_errors(self, data, *args, **kwargs): + yield from self.real_validator.iter_errors(data, *args, **kwargs) + for event in data["events"]: + if "Occult" in event["title"]: + yield jsonschema.exceptions.ValidationError( + "Error! Occult event detected! Run!", + validator=None, + validator_value=None, + instance=event, + schema=self.schema, + ) +""", + ) + + +def test_custom_validator_class_can_detect_custom_conditions(run_line, tmp_path): + doc = tmp_path / "invalid.json" + doc.write_text(json.dumps(INVALID_DOC)) + + schema = tmp_path / "schema.json" + schema.write_text(json.dumps(SCHEMA)) + + result = run_line( + [ + "check-jsonschema", + "--schemafile", + str(schema), + str(doc), + ] + ) + assert result.exit_code == 0, result.stdout # pass + + result = run_line( + [ + "check-jsonschema", + "--schemafile", + str(schema), + "--validator-class", + "foo:MyValidator", + str(doc), + ], + ) + assert result.exit_code == 1 # fail + assert "Occult event detected" in result.stdout, result.stdout + + +def test_custom_validator_class_can_pass_when_valid(run_line, tmp_path): + doc = tmp_path / "valid.json" + doc.write_text(json.dumps(VALID_DOC)) + + schema = tmp_path / "schema.json" + schema.write_text(json.dumps(SCHEMA)) + + result = run_line( + [ + "check-jsonschema", + "--schemafile", + str(schema), + str(doc), + ] + ) + assert result.exit_code == 0, result.stdout # pass + + result = run_line( + [ + "check-jsonschema", + "--schemafile", + str(schema), + "--validator-class", + "foo:MyValidator", + str(doc), + ], + ) + assert result.exit_code == 0 # pass diff --git a/tests/conftest.py b/tests/conftest.py index 792aca9d1..7e9f2938d 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,3 +1,6 @@ +import pathlib +import sys + import pytest import responses @@ -8,3 +11,30 @@ def mocked_responses(): yield responses.stop() responses.reset() + + +@pytest.fixture +def mock_module(tmp_path, monkeypatch): + monkeypatch.syspath_prepend(tmp_path) + all_names_to_clear = [] + + def func(path, text): + path = pathlib.Path(path) + mod_dir = tmp_path / (path.parent) + mod_dir.mkdir(parents=True, exist_ok=True) + for part in path.parts[:-1]: + (tmp_path / part / "__init__.py").touch() + + (tmp_path / path).write_text(text) + + for i in range(len(path.parts)): + modname = ".".join(path.parts[: i + 1]) + if modname.endswith(".py"): + modname = modname[:-3] + all_names_to_clear.append(modname) + + yield func + + for name in all_names_to_clear: + if name in sys.modules: + del sys.modules[name] diff --git a/tests/unit/test_cli_parse.py b/tests/unit/test_cli_parse.py index 90d5011ee..3f05e4aca 100644 --- a/tests/unit/test_cli_parse.py +++ b/tests/unit/test_cli_parse.py @@ -1,7 +1,5 @@ from __future__ import annotations -import pathlib -import sys from unittest import mock import click @@ -29,33 +27,6 @@ def mock_parse_result(): yield args -@pytest.fixture -def mock_module(tmp_path, monkeypatch): - monkeypatch.syspath_prepend(tmp_path) - all_names_to_clear = [] - - def func(path, text): - path = pathlib.Path(path) - mod_dir = tmp_path / (path.parent) - mod_dir.mkdir(parents=True, exist_ok=True) - for part in path.parts[:-1]: - (tmp_path / part / "__init__.py").touch() - - (tmp_path / path).write_text(text) - - for i in range(len(path.parts)): - modname = ".".join(path.parts[: i + 1]) - if modname.endswith(".py"): - modname = modname[:-3] - all_names_to_clear.append(modname) - - yield func - - for name in all_names_to_clear: - if name in sys.modules: - del sys.modules[name] - - @pytest.fixture(autouse=True) def mock_cli_exec(boxed_context): def get_ctx(*args): @@ -310,9 +281,7 @@ def test_can_specify_custom_validator_class(runner, mock_parse_result, mock_modu @pytest.mark.parametrize( "failmode", ("syntax", "import", "attr", "function", "non_callable") ) -def test_can_custom_validator_class_fails( - runner, mock_parse_result, mock_module, failmode -): +def test_custom_validator_class_fails(runner, mock_parse_result, mock_module, failmode): mock_module( "foo.py", """\ From f3055af7390df63c748383963b523697082a2dab Mon Sep 17 00:00:00 2001 From: Stephen Rosen Date: Tue, 19 Sep 2023 21:56:08 -0500 Subject: [PATCH 14/21] Add doc section covering `--validator-class` --- docs/usage.rst | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/docs/usage.rst b/docs/usage.rst index 99f868567..3579fb24a 100644 --- a/docs/usage.rst +++ b/docs/usage.rst @@ -251,3 +251,26 @@ not set. ``--base-uri`` overrides this behavior, setting a custom base URI for ``$ref`` resolution. + +``--validator-class`` +~~~~~~~~~~~~~~~~~~~~~ + +``check-jsonschema`` allows users to pass a custom validator class which +implements the ``jsonschema.protocols.Validator`` protocol. + +The format used for this argument is ``:``. For example, to +explicitly use the ``jsonschema`` validator for Draft7, use +``--validator-class 'jsonschema.validators:Draft7Validator'``. + +The module containing the validator class must be importable from within the +``check-jsonschema`` runtime context. + +.. note:: + + ``check-jsonschema`` will treat the validator class similarly to the + ``jsonschema`` library builtin validators. This includes using documented + extension points like passing a format checker or the behavior enabled with + ``--fill-defaults``. Users of this feature are recommended to build their + validators using ``jsonschema``'s documented interfaces (e.g. + ``jsonschema.validators.extend``) to ensure that their validators are + compatible. From c76ca211c93d9d4e5cdcdd3340b76040281b62dc Mon Sep 17 00:00:00 2001 From: sirosen Date: Wed, 20 Sep 2023 04:19:17 +0000 Subject: [PATCH 15/21] [vendor-schemas] automated update --- CHANGELOG.rst | 2 + .../vendor/bitbucket-pipelines.json | 18 +++++-- .../vendor/bitbucket-pipelines.sha256 | 2 +- .../builtin_schemas/vendor/gitlab-ci.json | 7 +++ .../builtin_schemas/vendor/gitlab-ci.sha256 | 2 +- .../builtin_schemas/vendor/renovate.json | 48 +++++++++++++++++-- .../builtin_schemas/vendor/renovate.sha256 | 2 +- 7 files changed, 71 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index e6643e870..8c82752f3 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -10,6 +10,8 @@ Unreleased .. vendor-insert-here +- Update vendored schemas (2023-09-20) + 0.26.3 ------ diff --git a/src/check_jsonschema/builtin_schemas/vendor/bitbucket-pipelines.json b/src/check_jsonschema/builtin_schemas/vendor/bitbucket-pipelines.json index d8c88905a..1d43851fd 100644 --- a/src/check_jsonschema/builtin_schemas/vendor/bitbucket-pipelines.json +++ b/src/check_jsonschema/builtin_schemas/vendor/bitbucket-pipelines.json @@ -23,12 +23,22 @@ "export": { "type": "boolean", "title": "Enable pipelines config sharing", - "description": "Allows other Bitbucket repositories to import pipeline configurations from this file. A bitbucket-pipelines.yml can't contain both an `import` and an `export` property" + "description": "Allows other Bitbucket repositories to import pipeline configurations from this file. A shared pipeline definition can't contain another `import` property." } }, "additionalProperties": false, - "required": [ - "pipelines" + "anyOf": [ + { + "required": [ + "pipelines" + ] + }, + { + "required": [ + "definitions", + "export" + ] + } ], "definitions": { "pipelines": { @@ -709,4 +719,4 @@ ] } } -} \ No newline at end of file +} diff --git a/src/check_jsonschema/builtin_schemas/vendor/bitbucket-pipelines.sha256 b/src/check_jsonschema/builtin_schemas/vendor/bitbucket-pipelines.sha256 index 3dcee8fbf..495cbfa8f 100644 --- a/src/check_jsonschema/builtin_schemas/vendor/bitbucket-pipelines.sha256 +++ b/src/check_jsonschema/builtin_schemas/vendor/bitbucket-pipelines.sha256 @@ -1 +1 @@ -959c8b28a5268492b6de046e4cca256c98f8ccb08ee76094f6734c3284570cb6 \ No newline at end of file +de0f949f4ce975d2263aff83758d8ea07443dfbe50a9d29aed6eb9d92066f06e \ No newline at end of file diff --git a/src/check_jsonschema/builtin_schemas/vendor/gitlab-ci.json b/src/check_jsonschema/builtin_schemas/vendor/gitlab-ci.json index 65091487c..2dba919cf 100644 --- a/src/check_jsonschema/builtin_schemas/vendor/gitlab-ci.json +++ b/src/check_jsonschema/builtin_schemas/vendor/gitlab-ci.json @@ -845,6 +845,9 @@ "if": { "$ref": "#/definitions/if" }, + "changes": { + "$ref": "#/definitions/changes" + }, "exists": { "$ref": "#/definitions/exists" }, @@ -2084,6 +2087,10 @@ "publish": { "description": "A path to a directory that contains the files to be published with Pages", "type": "string" + }, + "pages_path_prefix": { + "description": "The path prefix identifier for this version of pages. Allows creation of multiple versions of the same site with different path prefixes", + "type": "string" } }, "oneOf": [ diff --git a/src/check_jsonschema/builtin_schemas/vendor/gitlab-ci.sha256 b/src/check_jsonschema/builtin_schemas/vendor/gitlab-ci.sha256 index 5e6046a8e..c21762b0d 100644 --- a/src/check_jsonschema/builtin_schemas/vendor/gitlab-ci.sha256 +++ b/src/check_jsonschema/builtin_schemas/vendor/gitlab-ci.sha256 @@ -1 +1 @@ -c207b7443ef9c76fa5dfc9a17706a5115df3d387b958219b5c69580eb5773f7f \ No newline at end of file +16f6b005335375d2f954e17bf6057adb77ef03b8f7b050e0275b21097b712da2 \ No newline at end of file diff --git a/src/check_jsonschema/builtin_schemas/vendor/renovate.json b/src/check_jsonschema/builtin_schemas/vendor/renovate.json index 39b8c9b1b..cf00b79a0 100644 --- a/src/check_jsonschema/builtin_schemas/vendor/renovate.json +++ b/src/check_jsonschema/builtin_schemas/vendor/renovate.json @@ -141,6 +141,14 @@ ], "default": null }, + "autodiscoverNamespaces": { + "description": "Filter the list of autodiscovered repositories by namespaces.", + "type": "array", + "items": { + "type": "string" + }, + "default": null + }, "autodiscoverTopics": { "description": "Filter the list of autodiscovered repositories by topics.", "type": "array", @@ -373,6 +381,25 @@ "prerelease" ] }, + "bun": { + "description": "Configuration object for the bun manager", + "type": "object", + "default": { + "fileMatch": [ + "(^|/)bun\\.lockb$" + ], + "versioning": "npm", + "digest": { + "prBodyDefinitions": { + "Change": "{{#if displayFrom}}`{{{displayFrom}}}` -> {{else}}{{#if currentValue}}`{{{currentValue}}}` -> {{/if}}{{/if}}{{#if displayTo}}`{{{displayTo}}}`{{else}}`{{{newValue}}}`{{/if}}" + } + }, + "prBodyDefinitions": { + "Change": "[{{#if displayFrom}}`{{{displayFrom}}}` -> {{else}}{{#if currentValue}}`{{{currentValue}}}` -> {{/if}}{{/if}}{{#if displayTo}}`{{{displayTo}}}`{{else}}`{{{newValue}}}`{{/if}}]({{#if depName}}https://renovatebot.com/diffs/npm/{{replace '/' '%2f' depName}}/{{{currentVersion}}}/{{{newVersion}}}{{/if}})" + } + }, + "$ref": "#" + }, "bundler": { "description": "Configuration object for the bundler manager", "type": "object", @@ -391,7 +418,7 @@ "cacheHardTtlMinutes": { "description": "Maximum duration in minutes to keep datasource cache entries.", "type": "integer", - "default": 1440 + "default": 10080 }, "cacheTtlOverride": { "description": "An object that contains cache namespace TTL override values", @@ -774,7 +801,7 @@ "dockerSidecarImage": { "description": "Change this value to override the default Renovate sidecar image.", "type": "string", - "default": "ghcr.io/containerbase/sidecar:9.19.0" + "default": "ghcr.io/containerbase/sidecar:9.20.3" }, "dockerUser": { "description": "Set the `UID` and `GID` for Docker-based binaries if you use `binarySource=docker`.", @@ -1052,7 +1079,7 @@ "type": "object", "default": { "fileMatch": [ - "^(workflow-templates|\\.github/workflows)/[^/]+\\.ya?ml$", + "^(workflow-templates|\\.(?:github|gitea|forgejo)/workflows)/[^/]+\\.ya?ml$", "(^|/)action\\.ya?ml$" ] }, @@ -1310,6 +1337,21 @@ "description": "hostType for a package rule. Can be a platform name or a datasource name.", "type": "string" }, + "httpsCertificate": { + "description": "The certificate chains in PEM format.", + "type": "string", + "default": null + }, + "httpsCertificateAuthority": { + "description": "The overriding trusted CA certificate.", + "type": "string", + "default": null + }, + "httpsPrivateKey": { + "description": "The private key in PEM format.", + "type": "string", + "default": null + }, "insecureRegistry": { "description": "Explicitly turn on insecure Docker registry access (HTTP).", "type": "boolean" diff --git a/src/check_jsonschema/builtin_schemas/vendor/renovate.sha256 b/src/check_jsonschema/builtin_schemas/vendor/renovate.sha256 index cba59777e..48f091327 100644 --- a/src/check_jsonschema/builtin_schemas/vendor/renovate.sha256 +++ b/src/check_jsonschema/builtin_schemas/vendor/renovate.sha256 @@ -1 +1 @@ -f0799b37b14031aa00e8648fafdecbcb4c88c3b90c3925ea230f7badea85b01a \ No newline at end of file +f0779dfecae62b7cc631efdd770881082d267830066ae568efdecef67d104266 \ No newline at end of file From be970d84f366ae4e3d4a32f080967b44395788a8 Mon Sep 17 00:00:00 2001 From: Stephen Rosen Date: Wed, 20 Sep 2023 11:24:34 -0500 Subject: [PATCH 16/21] Update changelog and readme - add missing changelog items - add `--verbose` to the example pre-commit config (it's a frequent question) - add some example usage (and subtly endorse the brew formula maintained in homebrew-core) --- CHANGELOG.rst | 5 ++++- README.md | 15 +++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 8c82752f3..b0f963db0 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -9,8 +9,11 @@ Unreleased ---------- .. vendor-insert-here - - Update vendored schemas (2023-09-20) +- Add a ``--validator-class`` option for specifying a custom + ``jsonschema.protocols.Validator`` class to use (:pr:`327`, :issue:`262`) +- Minor fix to hook regexes to explicitly match `.` chars. Thanks + :user:`skwde`! (:pr:`325`) 0.26.3 ------ diff --git a/README.md b/README.md index 4b943f06b..2ba6bbbe2 100644 --- a/README.md +++ b/README.md @@ -26,8 +26,23 @@ files. rev: 0.26.3 hooks: - id: check-github-workflows + args: ["--verbose"] ``` +### Installing and Running as a CLI Tool + +Install with `pipx` or `brew`: + + pipx install check-jsonschema + +or + + brew install check-jsonschema + +Then run, as in + + check-jsonschema --schemafile schema.json instance.json + ## Documentation Full documentation can be found at https://check-jsonschema.readthedocs.io/ From 062556e0d1ee3ffdb8f8bd6cb2b2961f123caa7e Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 25 Sep 2023 23:44:19 +0000 Subject: [PATCH 17/21] [pre-commit.ci] pre-commit autoupdate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/asottile/pyupgrade: v3.11.0 → v3.13.0](https://github.com/asottile/pyupgrade/compare/v3.11.0...v3.13.0) --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index f039a9bae..4bd58214f 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -32,7 +32,7 @@ repos: hooks: - id: isort - repo: https://github.com/asottile/pyupgrade - rev: v3.11.0 + rev: v3.13.0 hooks: - id: pyupgrade args: ["--py37-plus"] From ffd764b6fe768f3bd43a1802f15a6e0140c26174 Mon Sep 17 00:00:00 2001 From: Stephen Rosen Date: Sat, 23 Sep 2023 09:45:49 -0500 Subject: [PATCH 18/21] Support stdin for instancefiles using '-' - instancefiles are read using `click.File("rb")` - the resulting IO objects are passed around, rather than the filenames or path objects - tests need to account for this change in the InstanceLoader --- src/check_jsonschema/checker.py | 2 +- src/check_jsonschema/cli/main_command.py | 5 +- src/check_jsonschema/cli/parse_result.py | 3 +- src/check_jsonschema/instance_loader.py | 18 ++--- src/check_jsonschema/result.py | 8 ++- src/check_jsonschema/schema_loader/main.py | 6 +- tests/conftest.py | 8 +++ tests/unit/test_cli_parse.py | 71 +++++++++++++------ tests/unit/test_instance_loader.py | 81 +++++++++++++--------- 9 files changed, 131 insertions(+), 71 deletions(-) diff --git a/src/check_jsonschema/checker.py b/src/check_jsonschema/checker.py index cf024dd6f..e3e1b9f1e 100644 --- a/src/check_jsonschema/checker.py +++ b/src/check_jsonschema/checker.py @@ -47,7 +47,7 @@ def _fail(self, msg: str, err: Exception | None = None) -> t.NoReturn: raise _Exit(1) def get_validator( - self, path: pathlib.Path, doc: dict[str, t.Any] + self, path: pathlib.Path | str, doc: dict[str, t.Any] ) -> jsonschema.protocols.Validator: try: return self._schema_loader.get_validator( diff --git a/src/check_jsonschema/cli/main_command.py b/src/check_jsonschema/cli/main_command.py index 85cb62651..2f6aaf886 100644 --- a/src/check_jsonschema/cli/main_command.py +++ b/src/check_jsonschema/cli/main_command.py @@ -2,6 +2,7 @@ import os import textwrap +import typing as t import click import jsonschema @@ -217,7 +218,7 @@ def pretty_helptext_list(values: list[str] | tuple[str, ...]) -> str: help="Reduce output verbosity", count=True, ) -@click.argument("instancefiles", required=True, nargs=-1) +@click.argument("instancefiles", required=True, nargs=-1, type=click.File("rb")) def main( *, schemafile: str | None, @@ -236,7 +237,7 @@ def main( output_format: str, verbose: int, quiet: int, - instancefiles: tuple[str, ...], + instancefiles: tuple[t.BinaryIO, ...], ) -> None: args = ParseResult() diff --git a/src/check_jsonschema/cli/parse_result.py b/src/check_jsonschema/cli/parse_result.py index 668d3b289..62ee12d88 100644 --- a/src/check_jsonschema/cli/parse_result.py +++ b/src/check_jsonschema/cli/parse_result.py @@ -1,6 +1,7 @@ from __future__ import annotations import enum +import typing as t import click import jsonschema @@ -21,7 +22,7 @@ def __init__(self) -> None: self.schema_mode: SchemaLoadingMode = SchemaLoadingMode.filepath self.schema_path: str | None = None self.base_uri: str | None = None - self.instancefiles: tuple[str, ...] = () + self.instancefiles: tuple[t.BinaryIO, ...] = () # cache controls self.disable_cache: bool = False self.cache_filename: str | None = None diff --git a/src/check_jsonschema/instance_loader.py b/src/check_jsonschema/instance_loader.py index 54d92acab..f46037adb 100644 --- a/src/check_jsonschema/instance_loader.py +++ b/src/check_jsonschema/instance_loader.py @@ -1,6 +1,5 @@ from __future__ import annotations -import pathlib import typing as t from .parsers import ParseError, ParserSet @@ -10,11 +9,11 @@ class InstanceLoader: def __init__( self, - filenames: t.Sequence[str], + files: t.Sequence[t.BinaryIO], default_filetype: str = "json", data_transform: Transform | None = None, ) -> None: - self._filenames = filenames + self._files = files self._default_filetype = default_filetype self._data_transform = ( data_transform if data_transform is not None else Transform() @@ -24,13 +23,16 @@ def __init__( modify_yaml_implementation=self._data_transform.modify_yaml_implementation ) - def iter_files(self) -> t.Iterator[tuple[pathlib.Path, ParseError | t.Any]]: - for fn in self._filenames: - path = pathlib.Path(fn) + def iter_files(self) -> t.Iterator[tuple[str, ParseError | t.Any]]: + for file in self._files: + if not hasattr(file, "name"): + raise ValueError(f"File {file} has no name attribute") try: - data: t.Any = self._parsers.parse_file(path, self._default_filetype) + data: t.Any = self._parsers.parse_data_with_path( + file, file.name, self._default_filetype + ) except ParseError as err: data = err else: data = self._data_transform(data) - yield (path, data) + yield (file.name, data) diff --git a/src/check_jsonschema/result.py b/src/check_jsonschema/result.py index 0ac651ae5..00e4301e3 100644 --- a/src/check_jsonschema/result.py +++ b/src/check_jsonschema/result.py @@ -1,3 +1,5 @@ +from __future__ import annotations + import pathlib import jsonschema @@ -15,18 +17,18 @@ def __init__(self) -> None: def success(self) -> bool: return not (bool(self.parse_errors) or bool(self.validation_errors)) - def record_validation_success(self, path: pathlib.Path) -> None: + def record_validation_success(self, path: pathlib.Path | str) -> None: self.successes.append(str(path)) def record_validation_error( - self, path: pathlib.Path, err: jsonschema.ValidationError + self, path: pathlib.Path | str, err: jsonschema.ValidationError ) -> None: filename = str(path) if filename not in self.validation_errors: self.validation_errors[filename] = [] self.validation_errors[filename].append(err) - def record_parse_error(self, path: pathlib.Path, err: ParseError) -> None: + def record_parse_error(self, path: pathlib.Path | str, err: ParseError) -> None: filename = str(path) if filename not in self.parse_errors: self.parse_errors[filename] = [] diff --git a/src/check_jsonschema/schema_loader/main.py b/src/check_jsonschema/schema_loader/main.py index 52e55185f..53d0c9abf 100644 --- a/src/check_jsonschema/schema_loader/main.py +++ b/src/check_jsonschema/schema_loader/main.py @@ -47,7 +47,7 @@ def set_defaults_then_validate( class SchemaLoaderBase: def get_validator( self, - path: pathlib.Path, + path: pathlib.Path | str, instance_doc: dict[str, t.Any], format_opts: FormatOptions, fill_defaults: bool, @@ -117,7 +117,7 @@ def get_schema(self) -> dict[str, t.Any]: def get_validator( self, - path: pathlib.Path, + path: pathlib.Path | str, instance_doc: dict[str, t.Any], format_opts: FormatOptions, fill_defaults: bool, @@ -189,7 +189,7 @@ def __init__(self, base_uri: str | None = None) -> None: def get_validator( self, - path: pathlib.Path, + path: pathlib.Path | str, instance_doc: dict[str, t.Any], format_opts: FormatOptions, fill_defaults: bool, diff --git a/tests/conftest.py b/tests/conftest.py index 7e9f2938d..cf1608689 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,3 +1,4 @@ +import os import pathlib import sys @@ -38,3 +39,10 @@ def func(path, text): for name in all_names_to_clear: if name in sys.modules: del sys.modules[name] + + +@pytest.fixture +def in_tmp_dir(request, tmp_path): + os.chdir(str(tmp_path)) + yield + os.chdir(request.config.invocation_dir) diff --git a/tests/unit/test_cli_parse.py b/tests/unit/test_cli_parse.py index 3f05e4aca..f5c1e56b9 100644 --- a/tests/unit/test_cli_parse.py +++ b/tests/unit/test_cli_parse.py @@ -1,5 +1,6 @@ from __future__ import annotations +import io from unittest import mock import click @@ -14,6 +15,11 @@ class BoxedContext: ref = None +def touch_files(dirpath, *filenames): + for fname in filenames: + (dirpath / fname).touch() + + @pytest.fixture def boxed_context(): return BoxedContext() @@ -73,11 +79,15 @@ def test_requires_some_args(runner): assert result.exit_code == 2 -def test_schemafile_and_instancefile(runner, mock_parse_result): +def test_schemafile_and_instancefile(runner, mock_parse_result, in_tmp_dir, tmp_path): + touch_files(tmp_path, "foo.json") runner.invoke(cli_main, ["--schemafile", "schema.json", "foo.json"]) assert mock_parse_result.schema_mode == SchemaLoadingMode.filepath assert mock_parse_result.schema_path == "schema.json" - assert mock_parse_result.instancefiles == ("foo.json",) + assert isinstance(mock_parse_result.instancefiles, tuple) + for f in mock_parse_result.instancefiles: + assert isinstance(f, (io.BytesIO, io.BufferedReader)) + assert tuple(f.name for f in mock_parse_result.instancefiles) == ("foo.json",) def test_requires_at_least_one_instancefile(runner): @@ -85,7 +95,8 @@ def test_requires_at_least_one_instancefile(runner): assert result.exit_code == 2 -def test_requires_schemafile(runner): +def test_requires_schemafile(runner, in_tmp_dir, tmp_path): + touch_files(tmp_path, "foo.json") result = runner.invoke(cli_main, ["foo.json"]) assert result.exit_code == 2 @@ -95,7 +106,8 @@ def test_no_cache_defaults_false(runner, mock_parse_result): assert mock_parse_result.disable_cache is False -def test_no_cache_flag_is_true(runner, mock_parse_result): +def test_no_cache_flag_is_true(runner, mock_parse_result, in_tmp_dir, tmp_path): + touch_files(tmp_path, "foo.json") runner.invoke(cli_main, ["--schemafile", "schema.json", "foo.json", "--no-cache"]) assert mock_parse_result.disable_cache is True @@ -108,7 +120,6 @@ def test_no_cache_flag_is_true(runner, mock_parse_result): "x.json", "--builtin-schema", "vendor.travis", - "foo.json", ], [ "--schemafile", @@ -116,24 +127,22 @@ def test_no_cache_flag_is_true(runner, mock_parse_result): "--builtin-schema", "vendor.travis", "--check-metaschema", - "foo.json", ], [ "--schemafile", "x.json", "--check-metaschema", - "foo.json", ], [ "--builtin-schema", "vendor.travis", "--check-metaschema", - "foo.json", ], ], ) -def test_mutex_schema_opts(runner, cmd_args): - result = runner.invoke(cli_main, cmd_args) +def test_mutex_schema_opts(runner, cmd_args, in_tmp_dir, tmp_path): + touch_files(tmp_path, "foo.json") + result = runner.invoke(cli_main, cmd_args + ["foo.json"]) assert result.exit_code == 2 assert "are mutually exclusive" in result.stderr @@ -154,12 +163,15 @@ def test_supports_common_option(runner, cmd_args): @pytest.mark.parametrize( "setting,expect_value", [(None, None), ("1", False), ("0", False)] ) -def test_no_color_env_var(runner, monkeypatch, setting, expect_value, boxed_context): +def test_no_color_env_var( + runner, monkeypatch, setting, expect_value, boxed_context, in_tmp_dir, tmp_path +): if setting is None: monkeypatch.delenv("NO_COLOR", raising=False) else: monkeypatch.setenv("NO_COLOR", setting) + touch_files(tmp_path, "foo.json") runner.invoke(cli_main, ["--schemafile", "schema.json", "foo.json"]) assert boxed_context.ref.color == expect_value @@ -168,18 +180,22 @@ def test_no_color_env_var(runner, monkeypatch, setting, expect_value, boxed_cont "setting,expected_value", [(None, None), ("auto", None), ("always", True), ("never", False)], ) -def test_color_cli_option(runner, setting, expected_value, boxed_context): +def test_color_cli_option( + runner, setting, expected_value, boxed_context, in_tmp_dir, tmp_path +): args = ["--schemafile", "schema.json", "foo.json"] if setting: args.extend(("--color", setting)) + touch_files(tmp_path, "foo.json") runner.invoke(cli_main, args) assert boxed_context.ref.color == expected_value def test_no_color_env_var_overrides_cli_option( - runner, monkeypatch, mock_cli_exec, boxed_context + runner, monkeypatch, mock_cli_exec, boxed_context, in_tmp_dir, tmp_path ): monkeypatch.setenv("NO_COLOR", "1") + touch_files(tmp_path, "foo.json") runner.invoke( cli_main, ["--color=always", "--schemafile", "schema.json", "foo.json"] ) @@ -190,16 +206,21 @@ def test_no_color_env_var_overrides_cli_option( "setting,expected_value", [("auto", 0), ("always", 0), ("never", 0), ("anything_else", 2)], ) -def test_color_cli_option_is_choice(runner, setting, expected_value): +def test_color_cli_option_is_choice( + runner, setting, expected_value, in_tmp_dir, tmp_path +): + touch_files(tmp_path, "foo.json") assert ( runner.invoke( - cli_main, ["--color", setting, "--schemafile", "schema.json", "foo.json"] + cli_main, + ["--color", setting, "--schemafile", "schema.json", "foo.json"], ).exit_code == expected_value ) -def test_formats_default_to_enabled(runner, mock_parse_result): +def test_formats_default_to_enabled(runner, mock_parse_result, in_tmp_dir, tmp_path): + touch_files(tmp_path, "foo.json") runner.invoke(cli_main, ["--schemafile", "schema.json", "foo.json"]) assert mock_parse_result.disable_all_formats is False assert mock_parse_result.disable_formats == () @@ -217,7 +238,10 @@ def test_formats_default_to_enabled(runner, mock_parse_result): ["--disable-formats", "uri-reference,date-time"], ), ) -def test_disable_selected_formats(runner, mock_parse_result, addargs): +def test_disable_selected_formats( + runner, mock_parse_result, addargs, in_tmp_dir, tmp_path +): + touch_files(tmp_path, "foo.json") runner.invoke( cli_main, [ @@ -246,7 +270,8 @@ def test_disable_selected_formats(runner, mock_parse_result, addargs): ["--disable-formats", "*,email"], ), ) -def test_disable_all_formats(runner, mock_parse_result, addargs): +def test_disable_all_formats(runner, mock_parse_result, addargs, in_tmp_dir, tmp_path): + touch_files(tmp_path, "foo.json") # this should be an override, with or without other args runner.invoke( cli_main, @@ -260,10 +285,13 @@ def test_disable_all_formats(runner, mock_parse_result, addargs): assert mock_parse_result.disable_all_formats is True -def test_can_specify_custom_validator_class(runner, mock_parse_result, mock_module): +def test_can_specify_custom_validator_class( + runner, mock_parse_result, mock_module, in_tmp_dir, tmp_path +): mock_module("foo.py", "class MyValidator: pass") import foo + touch_files(tmp_path, "foo.json") result = runner.invoke( cli_main, [ @@ -281,7 +309,9 @@ def test_can_specify_custom_validator_class(runner, mock_parse_result, mock_modu @pytest.mark.parametrize( "failmode", ("syntax", "import", "attr", "function", "non_callable") ) -def test_custom_validator_class_fails(runner, mock_parse_result, mock_module, failmode): +def test_custom_validator_class_fails( + runner, mock_parse_result, mock_module, failmode, in_tmp_dir, tmp_path +): mock_module( "foo.py", """\ @@ -307,6 +337,7 @@ def validator_func(*args, **kwargs): else: raise NotImplementedError + touch_files(tmp_path, "foo.json") result = runner.invoke( cli_main, ["--schemafile", "schema.json", "foo.json", "--validator-class", arg], diff --git a/tests/unit/test_instance_loader.py b/tests/unit/test_instance_loader.py index cd1930c43..c355f0626 100644 --- a/tests/unit/test_instance_loader.py +++ b/tests/unit/test_instance_loader.py @@ -1,5 +1,3 @@ -import os - import pytest from check_jsonschema.instance_loader import InstanceLoader @@ -8,11 +6,20 @@ from check_jsonschema.parsers.toml import ENABLED as TOML_ENABLED +# handy helper for opening multiple files for InstanceLoader @pytest.fixture -def in_tmp_dir(request, tmp_path): - os.chdir(str(tmp_path)) - yield - os.chdir(request.config.invocation_dir) +def open_wide(): + track_paths = [] + + def func(*paths): + open_paths = [open(p, "rb") for p in paths] + track_paths.extend(open_paths) + return open_paths + + yield func + + for p in track_paths: + p.close() @pytest.mark.parametrize( @@ -27,12 +34,12 @@ def in_tmp_dir(request, tmp_path): ("foo", "yaml"), ], ) -def test_instanceloader_json_data(tmp_path, filename, default_filetype): +def test_instanceloader_json_data(tmp_path, filename, default_filetype, open_wide): f = tmp_path / filename f.write_text("{}") - loader = InstanceLoader([str(f)], default_filetype=default_filetype) + loader = InstanceLoader(open_wide(f), default_filetype=default_filetype) data = list(loader.iter_files()) - assert data == [(f, {})] + assert data == [(str(f), {})] @pytest.mark.parametrize( @@ -47,7 +54,7 @@ def test_instanceloader_json_data(tmp_path, filename, default_filetype): ("foo", "yaml"), ], ) -def test_instanceloader_yaml_data(tmp_path, filename, default_filetype): +def test_instanceloader_yaml_data(tmp_path, filename, default_filetype, open_wide): f = tmp_path / filename f.write_text( """\ @@ -58,21 +65,21 @@ def test_instanceloader_yaml_data(tmp_path, filename, default_filetype): c: d """ ) - loader = InstanceLoader([f], default_filetype=default_filetype) + loader = InstanceLoader(open_wide(f), default_filetype=default_filetype) data = list(loader.iter_files()) - assert data == [(f, {"a": {"b": [1, 2], "c": "d"}})] + assert data == [(str(f), {"a": {"b": [1, 2], "c": "d"}})] -def test_instanceloader_unknown_type_nonjson_content(tmp_path): +def test_instanceloader_unknown_type_nonjson_content(tmp_path, open_wide): f = tmp_path / "foo" # no extension here f.write_text("a:b") # non-json data (cannot be detected as JSON) - loader = InstanceLoader([f], default_filetype="unknown") + loader = InstanceLoader(open_wide(f), default_filetype="unknown") # at iteration time, the file should error and be reported as such data = list(loader.iter_files()) assert len(data) == 1 assert isinstance(data[0], tuple) assert len(data[0]) == 2 - assert data[0][0] == f + assert data[0][0] == str(f) assert isinstance(data[0][1], BadFileTypeError) @@ -96,29 +103,35 @@ def test_instanceloader_unknown_type_nonjson_content(tmp_path): ], ) def test_instanceloader_optional_format_handling( - tmp_path, enabled_flag, extension, file_content, expect_data, expect_error_message + tmp_path, + enabled_flag, + extension, + file_content, + expect_data, + expect_error_message, + open_wide, ): f = tmp_path / f"foo.{extension}" f.write_text(file_content) - loader = InstanceLoader([f]) + loader = InstanceLoader(open_wide(f)) if enabled_flag: # at iteration time, the file should load fine data = list(loader.iter_files()) - assert data == [(f, expect_data)] + assert data == [(str(f), expect_data)] else: # at iteration time, an error should be raised data = list(loader.iter_files()) assert len(data) == 1 assert isinstance(data[0], tuple) assert len(data[0]) == 2 - assert data[0][0] == f + assert data[0][0] == str(f) assert isinstance(data[0][1], BadFileTypeError) # error message should be instructive assert expect_error_message in str(data[0]) -def test_instanceloader_yaml_dup_anchor(tmp_path): +def test_instanceloader_yaml_dup_anchor(tmp_path, open_wide): f = tmp_path / "foo.yaml" f.write_text( """\ @@ -129,9 +142,9 @@ def test_instanceloader_yaml_dup_anchor(tmp_path): c: &anchor d """ ) - loader = InstanceLoader([str(f)]) + loader = InstanceLoader(open_wide(f)) data = list(loader.iter_files()) - assert data == [(f, {"a": {"b": [1, 2], "c": "d"}})] + assert data == [(str(f), {"a": {"b": [1, 2], "c": "d"}})] @pytest.mark.parametrize( @@ -144,7 +157,9 @@ def test_instanceloader_yaml_dup_anchor(tmp_path): ("toml", "foo.toml", "abc\n"), ], ) -def test_instanceloader_invalid_data(tmp_path, file_format, filename, content): +def test_instanceloader_invalid_data( + tmp_path, file_format, filename, content, open_wide +): if file_format == "json5" and not JSON5_ENABLED: pytest.skip("test requires 'json5' support") if file_format == "toml" and not TOML_ENABLED: @@ -152,16 +167,16 @@ def test_instanceloader_invalid_data(tmp_path, file_format, filename, content): f = tmp_path / filename f.write_text(content) - loader = InstanceLoader([f]) + loader = InstanceLoader(open_wide(f)) data = list(loader.iter_files()) assert len(data) == 1 assert isinstance(data[0], tuple) assert len(data[0]) == 2 - assert data[0][0] == f + assert data[0][0] == str(f) assert isinstance(data[0][1], FailedFileLoadError) -def test_instanceloader_invalid_data_mixed_with_valid_data(tmp_path): +def test_instanceloader_invalid_data_mixed_with_valid_data(tmp_path, open_wide): a = tmp_path / "a.json" b = tmp_path / "b.json" c = tmp_path / "c.json" @@ -169,19 +184,19 @@ def test_instanceloader_invalid_data_mixed_with_valid_data(tmp_path): b.write_text("{") c.write_text('{"c":true}') - loader = InstanceLoader([a, b, c]) + loader = InstanceLoader(open_wide(a, b, c)) data = list(loader.iter_files()) assert len(data) == 3 - assert data[0] == (a, {}) + assert data[0] == (str(a), {}) assert isinstance(data[1], tuple) assert len(data[1]) == 2 - assert data[1][0] == b + assert data[1][0] == str(b) assert isinstance(data[1][1], FailedFileLoadError) - assert data[2] == (c, {"c": True}) + assert data[2] == (str(c), {"c": True}) @pytest.mark.parametrize( @@ -193,7 +208,7 @@ def test_instanceloader_invalid_data_mixed_with_valid_data(tmp_path): ("json", "yaml", "toml", "json5"), ), ) -def test_instanceloader_mixed_filetypes(tmp_path, filetypes): +def test_instanceloader_mixed_filetypes(tmp_path, filetypes, open_wide): if not JSON5_ENABLED and "json5" in filetypes: pytest.skip("test requires json5") if not TOML_ENABLED and "toml" in filetypes: @@ -217,7 +232,7 @@ def test_instanceloader_mixed_filetypes(tmp_path, filetypes): files["toml"].write_text('[foo] # bar\nname = "value"\n') file_order.append("toml") - loader = InstanceLoader(files.values()) + loader = InstanceLoader(open_wide(*files.values())) data = list(loader.iter_files()) assert len(data) == len(files) @@ -226,7 +241,7 @@ def test_instanceloader_mixed_filetypes(tmp_path, filetypes): assert isinstance(data[i], tuple) assert len(data[i]) == 2 path, value = data[i] - assert path == files[filetype] + assert path == str(files[filetype]) if filetype == "json": assert value == {} elif filetype == "yaml": From ac5ad1def7527361c91c9d9831fba9e9e779656c Mon Sep 17 00:00:00 2001 From: Stephen Rosen Date: Wed, 27 Sep 2023 21:58:37 -0500 Subject: [PATCH 19/21] Add support for passing --schemafile '-' for stdin --- src/check_jsonschema/cli/main_command.py | 4 ++- src/check_jsonschema/instance_loader.py | 14 ++++++-- src/check_jsonschema/schema_loader/main.py | 15 +++++--- src/check_jsonschema/schema_loader/readers.py | 22 ++++++++++-- tests/acceptance/test_special_filetypes.py | 34 +++++++++++++++++++ 5 files changed, 78 insertions(+), 11 deletions(-) diff --git a/src/check_jsonschema/cli/main_command.py b/src/check_jsonschema/cli/main_command.py index 2f6aaf886..8f7763994 100644 --- a/src/check_jsonschema/cli/main_command.py +++ b/src/check_jsonschema/cli/main_command.py @@ -91,8 +91,10 @@ def pretty_helptext_list(values: list[str] | tuple[str, ...]) -> str: help=( "The path to a file containing the JSON Schema to use or an " "HTTP(S) URI for the schema. If a remote file is used, " - "it will be downloaded and cached locally based on mtime." + "it will be downloaded and cached locally based on mtime. " + "Use '-' for stdin." ), + metavar="[PATH|URI]", ) @click.option( "--base-uri", diff --git a/src/check_jsonschema/instance_loader.py b/src/check_jsonschema/instance_loader.py index f46037adb..d025ab8ce 100644 --- a/src/check_jsonschema/instance_loader.py +++ b/src/check_jsonschema/instance_loader.py @@ -1,5 +1,6 @@ from __future__ import annotations +import io import typing as t from .parsers import ParseError, ParserSet @@ -25,14 +26,21 @@ def __init__( def iter_files(self) -> t.Iterator[tuple[str, ParseError | t.Any]]: for file in self._files: - if not hasattr(file, "name"): + if hasattr(file, "name"): + name = file.name + # allowing for BytesIO to be special-cased here is useful for + # simpler test setup, since this is what tests will pass and we naturally + # support it here + elif isinstance(file, io.BytesIO) or file.fileno() == 0: + name = "" + else: raise ValueError(f"File {file} has no name attribute") try: data: t.Any = self._parsers.parse_data_with_path( - file, file.name, self._default_filetype + file, name, self._default_filetype ) except ParseError as err: data = err else: data = self._data_transform(data) - yield (file.name, data) + yield (name, data) diff --git a/src/check_jsonschema/schema_loader/main.py b/src/check_jsonschema/schema_loader/main.py index 53d0c9abf..7cd5197c2 100644 --- a/src/check_jsonschema/schema_loader/main.py +++ b/src/check_jsonschema/schema_loader/main.py @@ -12,7 +12,7 @@ from ..parsers import ParserSet from ..utils import is_url_ish from .errors import UnsupportedUrlScheme -from .readers import HttpSchemaReader, LocalSchemaReader +from .readers import HttpSchemaReader, LocalSchemaReader, StdinSchemaReader from .resolver import make_reference_registry @@ -82,15 +82,22 @@ def __init__( self._parsers = ParserSet() # setup a schema reader lazily, when needed - self._reader: LocalSchemaReader | HttpSchemaReader | None = None + self._reader: LocalSchemaReader | HttpSchemaReader | StdinSchemaReader | None = ( + None + ) @property - def reader(self) -> LocalSchemaReader | HttpSchemaReader: + def reader(self) -> LocalSchemaReader | HttpSchemaReader | StdinSchemaReader: if self._reader is None: self._reader = self._get_schema_reader() return self._reader - def _get_schema_reader(self) -> LocalSchemaReader | HttpSchemaReader: + def _get_schema_reader( + self, + ) -> LocalSchemaReader | HttpSchemaReader | StdinSchemaReader: + if self.schemafile == "-": + return StdinSchemaReader() + if self.url_info is None or self.url_info.scheme in ("file", ""): return LocalSchemaReader(self.schemafile) diff --git a/src/check_jsonschema/schema_loader/readers.py b/src/check_jsonschema/schema_loader/readers.py index 4c362dc8d..244fa4119 100644 --- a/src/check_jsonschema/schema_loader/readers.py +++ b/src/check_jsonschema/schema_loader/readers.py @@ -1,12 +1,14 @@ from __future__ import annotations import io +import json +import sys import typing as t import ruamel.yaml from ..cachedownloader import CacheDownloader -from ..parsers import ParserSet +from ..parsers import ParseError, ParserSet from ..utils import filename2path from .errors import SchemaParseError @@ -30,7 +32,7 @@ def __init__(self, filename: str) -> None: self.filename = str(self.path) self.parsers = ParserSet() - def get_retrieval_uri(self) -> str: + def get_retrieval_uri(self) -> str | None: return self.path.as_uri() def _read_impl(self) -> t.Any: @@ -40,6 +42,20 @@ def read_schema(self) -> dict: return _run_load_callback(self.filename, self._read_impl) +class StdinSchemaReader: + def __init__(self) -> None: + self.parsers = ParserSet() + + def get_retrieval_uri(self) -> str | None: + return None + + def read_schema(self) -> dict: + try: + return json.load(sys.stdin) + except ValueError as e: + raise ParseError("Failed to parse JSON from stdin") from e + + class HttpSchemaReader: def __init__( self, @@ -64,7 +80,7 @@ def _parse(self, schema_bytes: bytes) -> t.Any: ) return self._parsed_schema - def get_retrieval_uri(self) -> str: + def get_retrieval_uri(self) -> str | None: return self.url def _read_impl(self) -> t.Any: diff --git a/tests/acceptance/test_special_filetypes.py b/tests/acceptance/test_special_filetypes.py index b4997d010..c148913b7 100644 --- a/tests/acceptance/test_special_filetypes.py +++ b/tests/acceptance/test_special_filetypes.py @@ -114,3 +114,37 @@ def _fake_compute_default_cache_dir(self): assert result.exit_code == 0 else: assert result.exit_code == 1 + + +@pytest.mark.parametrize("check_passes", (True, False)) +@pytest.mark.parametrize("using_stdin", ("schema", "instance")) +def test_schema_or_instance_from_stdin( + run_line, check_passes, tmp_path, monkeypatch, using_stdin +): + """ + a "remote schema" (meaning HTTPS) with bad data, therefore requiring that a retry + fires in order to parse + """ + if using_stdin == "schema": + instance_path = tmp_path / "instance.json" + instance_path.write_text("42" if check_passes else '"foo"') + + result = run_line( + ["check-jsonschema", "--schemafile", "-", str(instance_path)], + input='{"type": "integer"}', + ) + elif using_stdin == "instance": + schema_path = tmp_path / "schema.json" + schema_path.write_text('{"type": "integer"}') + instance = "42" if check_passes else '"foo"' + + result = run_line( + ["check-jsonschema", "--schemafile", schema_path, "-"], + input=instance, + ) + else: + raise NotImplementedError + if check_passes: + assert result.exit_code == 0 + else: + assert result.exit_code == 1 From 4a9e5326109d7c0113d374b588819c088087a2c0 Mon Sep 17 00:00:00 2001 From: Stephen Rosen Date: Wed, 27 Sep 2023 22:24:30 -0500 Subject: [PATCH 20/21] Fix minor bug in vendoring script changelog edits Also apply vendoring. closes #329 --- CHANGELOG.rst | 3 +- scripts/vendor-schemas.py | 3 +- .../vendor/azure-pipelines.json | 4339 ++++++++++------- .../vendor/azure-pipelines.sha256 | 2 +- .../builtin_schemas/vendor/gitlab-ci.json | 147 +- .../builtin_schemas/vendor/gitlab-ci.sha256 | 2 +- .../builtin_schemas/vendor/renovate.json | 164 +- .../builtin_schemas/vendor/renovate.sha256 | 2 +- 8 files changed, 2610 insertions(+), 2052 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index b0f963db0..017f22776 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -9,7 +9,8 @@ Unreleased ---------- .. vendor-insert-here -- Update vendored schemas (2023-09-20) + +- Update vendored schemas (2023-09-27) - Add a ``--validator-class`` option for specifying a custom ``jsonschema.protocols.Validator`` class to use (:pr:`327`, :issue:`262`) - Minor fix to hook regexes to explicitly match `.` chars. Thanks diff --git a/scripts/vendor-schemas.py b/scripts/vendor-schemas.py index c12db599c..45f4c432d 100644 --- a/scripts/vendor-schemas.py +++ b/scripts/vendor-schemas.py @@ -16,7 +16,8 @@ VENDOR_SLUG = "\n.. vendor-insert-here\n" EXISTING_CHANGELINE_PATTERN = re.compile( - re.escape(f"{VENDOR_SLUG}\n- Update vendored schemas") + re.escape(VENDOR_SLUG) + + "\n?- Update vendored schemas" + r" \(\d{4}-\d{2}-\d{2}\)" + "\n", flags=re.MULTILINE, diff --git a/src/check_jsonschema/builtin_schemas/vendor/azure-pipelines.json b/src/check_jsonschema/builtin_schemas/vendor/azure-pipelines.json index c785b0e98..78bf6e9b9 100644 --- a/src/check_jsonschema/builtin_schemas/vendor/azure-pipelines.json +++ b/src/check_jsonschema/builtin_schemas/vendor/azure-pipelines.json @@ -1,7 +1,7 @@ { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://github.com/Microsoft/azure-pipelines-vscode/blob/main/service-schema.json", - "$comment": "v1.219.1", + "$comment": "v1.226.1", "title": "Pipeline schema", "description": "A pipeline definition", "oneOf": [ @@ -4043,19 +4043,19 @@ "task": { "anyOf": [ { - "description": "Run a PowerShell script", + "description": "Run a PowerShell script on Linux, macOS, or Windows", "doNotSuggest": false, "ignoreCase": "value", "enum": [ - "PowerShell@1" + "PowerShell@2" ] }, { - "description": "Run a PowerShell script on Linux, macOS, or Windows", + "description": "Run a PowerShell script", "doNotSuggest": false, "ignoreCase": "value", "enum": [ - "PowerShell@2" + "PowerShell@1" ] }, { @@ -4063,7 +4063,7 @@ "doNotSuggest": false, "ignoreCase": "value", "enum": [ - "AzurePowerShell@4" + "AzurePowerShell@2" ] }, { @@ -4071,7 +4071,7 @@ "doNotSuggest": false, "ignoreCase": "value", "enum": [ - "AzurePowerShell@2" + "AzurePowerShell@3" ] }, { @@ -4079,7 +4079,7 @@ "doNotSuggest": false, "ignoreCase": "value", "enum": [ - "AzurePowerShell@5" + "AzurePowerShell@4" ] }, { @@ -4087,7 +4087,7 @@ "doNotSuggest": false, "ignoreCase": "value", "enum": [ - "AzurePowerShell@3" + "AzurePowerShell@5" ] }, { @@ -4111,7 +4111,7 @@ "doNotSuggest": false, "ignoreCase": "value", "enum": [ - "PipAuthenticate@1" + "PipAuthenticate@0" ] }, { @@ -4119,7 +4119,7 @@ "doNotSuggest": false, "ignoreCase": "value", "enum": [ - "PipAuthenticate@0" + "PipAuthenticate@1" ] }, { @@ -4127,7 +4127,7 @@ "doNotSuggest": false, "ignoreCase": "value", "enum": [ - "Maven@4" + "Maven@3" ] }, { @@ -4135,7 +4135,15 @@ "doNotSuggest": false, "ignoreCase": "value", "enum": [ - "Maven@3" + "Maven@4" + ] + }, + { + "description": "Build with Apache Maven", + "doNotSuggest": false, + "ignoreCase": "value", + "enum": [ + "Maven@1" ] }, { @@ -4147,11 +4155,11 @@ ] }, { - "description": "Build with Apache Maven", + "description": "Build, test, package, or publish a dotnet application, or run a custom dotnet command", "doNotSuggest": false, "ignoreCase": "value", "enum": [ - "Maven@1" + "DotNetCoreCLI@2" ] }, { @@ -4163,14 +4171,6 @@ "DotNetCoreCLI@0" ] }, - { - "description": "Build, test, package, or publish a dotnet application, or run a custom dotnet command", - "doNotSuggest": false, - "ignoreCase": "value", - "enum": [ - "DotNetCoreCLI@2" - ] - }, { "description": "Build, test and publish using dotnet core command-line.", "doNotSuggest": false, @@ -4189,19 +4189,19 @@ ] }, { - "description": "Deploy to Azure App Service a web, mobile, or API app using Docker, Java, .NET, .NET Core, Node.js, PHP, Python, or Ruby", + "description": "Update Azure App Service using Web Deploy / Kudu REST APIs", "doNotSuggest": false, "ignoreCase": "value", "enum": [ - "AzureRmWebAppDeployment@4" + "AzureRmWebAppDeployment@2" ] }, { - "description": "Update Azure App Service using Web Deploy / Kudu REST APIs", + "description": "Deploy to Azure App Service a web, mobile, or API app using Docker, Java, .NET, .NET Core, Node.js, PHP, Python, or Ruby", "doNotSuggest": false, "ignoreCase": "value", "enum": [ - "AzureRmWebAppDeployment@2" + "AzureRmWebAppDeployment@4" ] }, { @@ -4237,19 +4237,19 @@ ] }, { - "description": "Publish any of the code coverage results from a build", + "description": "Publish Cobertura or JaCoCo code coverage results from a build", "doNotSuggest": false, "ignoreCase": "value", "enum": [ - "PublishCodeCoverageResults@2" + "PublishCodeCoverageResults@1" ] }, { - "description": "Publish Cobertura or JaCoCo code coverage results from a build", + "description": "Publish any of the code coverage results from a build", "doNotSuggest": false, "ignoreCase": "value", "enum": [ - "PublishCodeCoverageResults@1" + "PublishCodeCoverageResults@2" ] }, { @@ -4270,19 +4270,19 @@ ] }, { - "description": "Install an Apple provisioning profile required to build on a macOS agent", + "description": "Install an Apple provisioning profile required to build on a macOS agent machine", "doNotSuggest": false, "ignoreCase": "value", "enum": [ - "InstallAppleProvisioningProfile@0" + "InstallAppleProvisioningProfile@1" ] }, { - "description": "Install an Apple provisioning profile required to build on a macOS agent machine", + "description": "Install an Apple provisioning profile required to build on a macOS agent", "doNotSuggest": false, "ignoreCase": "value", "enum": [ - "InstallAppleProvisioningProfile@1" + "InstallAppleProvisioningProfile@0" ] }, { @@ -4405,7 +4405,7 @@ "doNotSuggest": false, "ignoreCase": "value", "enum": [ - "WindowsMachineFileCopy@1" + "WindowsMachineFileCopy@2" ] }, { @@ -4413,7 +4413,7 @@ "doNotSuggest": false, "ignoreCase": "value", "enum": [ - "WindowsMachineFileCopy@2" + "WindowsMachineFileCopy@1" ] }, { @@ -4430,7 +4430,7 @@ "doNotSuggest": false, "ignoreCase": "value", "enum": [ - "TwineAuthenticate@0" + "TwineAuthenticate@1" ] }, { @@ -4438,7 +4438,7 @@ "doNotSuggest": false, "ignoreCase": "value", "enum": [ - "TwineAuthenticate@1" + "TwineAuthenticate@0" ] }, { @@ -4458,19 +4458,19 @@ ] }, { - "description": "Install Helm and Kubernetes on an agent machine", + "description": "Install Helm on an agent machine", "doNotSuggest": false, "ignoreCase": "value", "enum": [ - "HelmInstaller@0" + "HelmInstaller@1" ] }, { - "description": "Install Helm on an agent machine", + "description": "Install Helm and Kubernetes on an agent machine", "doNotSuggest": false, "ignoreCase": "value", "enum": [ - "HelmInstaller@1" + "HelmInstaller@0" ] }, { @@ -4585,7 +4585,7 @@ "doNotSuggest": false, "ignoreCase": "value", "enum": [ - "PackerBuild@0" + "PackerBuild@1" ] }, { @@ -4593,7 +4593,7 @@ "doNotSuggest": false, "ignoreCase": "value", "enum": [ - "PackerBuild@1" + "PackerBuild@0" ] }, { @@ -4794,19 +4794,19 @@ ] }, { - "description": "Test mobile app packages with Visual Studio Mobile Center.", + "description": "Test app packages with Visual Studio App Center", "doNotSuggest": false, "ignoreCase": "value", "enum": [ - "VSMobileCenterTest@0" + "AppCenterTest@1" ] }, { - "description": "Test app packages with Visual Studio App Center", + "description": "Test mobile app packages with Visual Studio Mobile Center.", "doNotSuggest": false, "ignoreCase": "value", "enum": [ - "AppCenterTest@1" + "VSMobileCenterTest@0" ] }, { @@ -4825,6 +4825,14 @@ "AzureContainerApps@0" ] }, + { + "description": "An Azure DevOps Task to build and deploy Azure Container Apps.", + "doNotSuggest": false, + "ignoreCase": "value", + "enum": [ + "AzureContainerApps@1" + ] + }, { "description": "Use the specified version of Ruby from the tool cache, optionally adding it to the PATH", "doNotSuggest": false, @@ -4917,27 +4925,29 @@ ] }, { - "description": "Restore, pack, or push NuGet packages, or run a NuGet command. Supports NuGet.org and authenticated feeds like Azure Artifacts and MyGet. Uses NuGet.exe and works with .NET Framework apps. For .NET Core and .NET Standard apps, use the .NET Core task.", - "doNotSuggest": false, + "description": "Restores NuGet packages in preparation for a Visual Studio Build step.", + "deprecationMessage": "NuGetRestore is deprecated - Restores NuGet packages in preparation for a Visual Studio Build step.", + "doNotSuggest": true, "ignoreCase": "value", "enum": [ - "NuGetCommand@2" + "NuGetRestore@1" ] }, { - "description": "Installs or restores missing NuGet packages. Use NuGetAuthenticate@0 task for latest capabilities.", + "description": "Restore, pack, or push NuGet packages, or run a NuGet command. Supports NuGet.org and authenticated feeds like Azure Artifacts and MyGet. Uses NuGet.exe and works with .NET Framework apps. For .NET Core and .NET Standard apps, use the .NET Core task.", "doNotSuggest": false, "ignoreCase": "value", "enum": [ - "NuGetInstaller@0" + "NuGetCommand@2" ] }, { - "description": "Restores NuGet packages in preparation for a Visual Studio Build step.", - "doNotSuggest": false, + "description": "Installs or restores missing NuGet packages. Use NuGetAuthenticate@0 task for latest capabilities.", + "deprecationMessage": "NuGetInstaller is deprecated - Installs or restores missing NuGet packages. Use NuGetAuthenticate@0 task for latest capabilities.", + "doNotSuggest": true, "ignoreCase": "value", "enum": [ - "NuGetRestore@1" + "NuGetInstaller@0" ] }, { @@ -4985,7 +4995,7 @@ "doNotSuggest": false, "ignoreCase": "value", "enum": [ - "AzureFileCopy@1" + "AzureFileCopy@2" ] }, { @@ -5009,7 +5019,7 @@ "doNotSuggest": false, "ignoreCase": "value", "enum": [ - "AzureFileCopy@2" + "AzureFileCopy@1" ] }, { @@ -5049,7 +5059,7 @@ "doNotSuggest": false, "ignoreCase": "value", "enum": [ - "Gradle@2" + "Gradle@3" ] }, { @@ -5057,7 +5067,7 @@ "doNotSuggest": false, "ignoreCase": "value", "enum": [ - "Gradle@3" + "Gradle@1" ] }, { @@ -5065,16 +5075,15 @@ "doNotSuggest": false, "ignoreCase": "value", "enum": [ - "Gradle@1" + "Gradle@2" ] }, { "description": "Distribute app builds to testers and users via Visual Studio App Center", - "deprecationMessage": "AppCenterDistribute is deprecated - Distribute app builds to testers and users via Visual Studio App Center", - "doNotSuggest": true, + "doNotSuggest": false, "ignoreCase": "value", "enum": [ - "AppCenterDistribute@2" + "AppCenterDistribute@3" ] }, { @@ -5083,23 +5092,24 @@ "doNotSuggest": true, "ignoreCase": "value", "enum": [ - "AppCenterDistribute@1" + "AppCenterDistribute@2" ] }, { - "description": "Distribute app builds to testers and users via Visual Studio App Center", + "description": "Distribute app builds to testers and users via App Center", "doNotSuggest": false, "ignoreCase": "value", "enum": [ - "AppCenterDistribute@3" + "AppCenterDistribute@0" ] }, { - "description": "Distribute app builds to testers and users via App Center", - "doNotSuggest": false, + "description": "Distribute app builds to testers and users via Visual Studio App Center", + "deprecationMessage": "AppCenterDistribute is deprecated - Distribute app builds to testers and users via Visual Studio App Center", + "doNotSuggest": true, "ignoreCase": "value", "enum": [ - "AppCenterDistribute@0" + "AppCenterDistribute@1" ] }, { @@ -5134,14 +5144,6 @@ "AzureFunctionAppContainer@1" ] }, - { - "description": "Acquire a specific version of Java from a user-supplied Azure blob or the tool cache and sets JAVA_HOME", - "doNotSuggest": false, - "ignoreCase": "value", - "enum": [ - "JavaToolInstallerTestVuln2@0" - ] - }, { "description": "Decrypt a file using OpenSSL", "doNotSuggest": false, @@ -5198,6 +5200,14 @@ "AzureFunction@0" ] }, + { + "description": "Install Open Policy Agent on agent machine", + "doNotSuggest": false, + "ignoreCase": "value", + "enum": [ + "OpenPolicyAgentInstaller@0" + ] + }, { "description": "Downloads a GitHub Release from a repository", "doNotSuggest": false, @@ -5346,6 +5356,14 @@ "ServiceFabricPowerShell@1" ] }, + { + "description": "Run unit and functional tests (Selenium, Appium, Coded UI test, etc.) using the Visual Studio Test (VsTest) runner. Test frameworks that have a Visual Studio test adapter such as MsTest, xUnit, NUnit, Chutzpah (for JavaScript tests using QUnit, Mocha and Jasmine), etc. can be run. Tests can be distributed on multiple agents using this task (version 2).", + "doNotSuggest": false, + "ignoreCase": "value", + "enum": [ + "VSTest@3" + ] + }, { "description": "Run tests with Visual Studio test runner", "doNotSuggest": false, @@ -5396,20 +5414,20 @@ ] }, { - "description": "Create and activate a Conda environment", - "doNotSuggest": false, + "description": "This task is deprecated. Use `conda` directly in script to work with Anaconda environments.", + "deprecationMessage": "CondaEnvironment is deprecated - This task is deprecated. Use `conda` directly in script to work with Anaconda environments.", + "doNotSuggest": true, "ignoreCase": "value", "enum": [ - "CondaEnvironment@0" + "CondaEnvironment@1" ] }, { - "description": "This task is deprecated. Use `conda` directly in script to work with Anaconda environments.", - "deprecationMessage": "CondaEnvironment is deprecated - This task is deprecated. Use `conda` directly in script to work with Anaconda environments.", - "doNotSuggest": true, + "description": "Create and activate a Conda environment", + "doNotSuggest": false, "ignoreCase": "value", "enum": [ - "CondaEnvironment@1" + "CondaEnvironment@0" ] }, { @@ -5452,14 +5470,6 @@ "AzureKeyVault@1" ] }, - { - "description": "Acquires a specific version of the .NET Core SDK from the internet or the local cache and adds it to the PATH. Use this task to change the version of .NET Core used in subsequent tasks. Additionally provides proxy support.", - "doNotSuggest": false, - "ignoreCase": "value", - "enum": [ - "UseDotNet@2" - ] - }, { "description": "Acquire a specific version of the .NET Core SDK from the internet or local cache and add it to the PATH", "doNotSuggest": false, @@ -5477,6 +5487,14 @@ "DotNetCoreInstaller@1" ] }, + { + "description": "Acquires a specific version of the .NET Core SDK from the internet or the local cache and adds it to the PATH. Use this task to change the version of .NET Core used in subsequent tasks. Additionally provides proxy support.", + "doNotSuggest": false, + "ignoreCase": "value", + "enum": [ + "UseDotNet@2" + ] + }, { "description": "Start, stop, restart, slot swap, slot delete, install site extensions or enable continuous monitoring for an Azure App Service", "doNotSuggest": false, @@ -5485,6 +5503,14 @@ "AzureAppServiceManage@0" ] }, + { + "description": "Helps to install kubelogin", + "doNotSuggest": false, + "ignoreCase": "value", + "enum": [ + "KubeloginInstaller@0" + ] + }, { "description": "Install Azure Func Core Tools", "doNotSuggest": false, @@ -5498,7 +5524,7 @@ "doNotSuggest": false, "ignoreCase": "value", "enum": [ - "FileTransform@2" + "FileTransform@1" ] }, { @@ -5506,7 +5532,7 @@ "doNotSuggest": false, "ignoreCase": "value", "enum": [ - "FileTransform@1" + "FileTransform@2" ] }, { @@ -5536,7 +5562,8 @@ }, { "description": "Download a package from a package management feed in Azure Artifacts", - "doNotSuggest": false, + "deprecationMessage": "DownloadPackage is deprecated - Download a package from a package management feed in Azure Artifacts", + "doNotSuggest": true, "ignoreCase": "value", "enum": [ "DownloadPackage@0" @@ -5550,6 +5577,14 @@ "DownloadPackage@1" ] }, + { + "description": "Deploy an Azure Resource Manager (ARM) template to a resource group and manage virtual machines", + "doNotSuggest": false, + "ignoreCase": "value", + "enum": [ + "AzureResourceGroupDeployment@2" + ] + }, { "description": "Deploy an Azure Resource Manager (ARM) template to all the deployment scopes", "doNotSuggest": false, @@ -5567,14 +5602,6 @@ "AzureResourceGroupDeployment@1" ] }, - { - "description": "Deploy an Azure Resource Manager (ARM) template to a resource group and manage virtual machines", - "doNotSuggest": false, - "ignoreCase": "value", - "enum": [ - "AzureResourceGroupDeployment@2" - ] - }, { "description": "Invoke REST API as a part of your process.", "doNotSuggest": false, @@ -5664,19 +5691,19 @@ ] }, { - "description": "Finds or downloads and caches the specified version spec of Node.js and adds it to the PATH", + "description": "Set up a Node.js environment and add it to the PATH, additionally providing proxy support", "doNotSuggest": false, "ignoreCase": "value", "enum": [ - "NodeTool@0" + "UseNode@1" ] }, { - "description": "Set up a Node.js environment and add it to the PATH, additionally providing proxy support", + "description": "Finds or downloads and caches the specified version spec of Node.js and adds it to the PATH", "doNotSuggest": false, "ignoreCase": "value", "enum": [ - "UseNode@1" + "NodeTool@0" ] }, { @@ -5717,7 +5744,7 @@ "doNotSuggest": false, "ignoreCase": "value", "enum": [ - "KubernetesManifest@0" + "KubernetesManifest@1" ] }, { @@ -5725,7 +5752,7 @@ "doNotSuggest": false, "ignoreCase": "value", "enum": [ - "KubernetesManifest@1" + "KubernetesManifest@0" ] }, { @@ -5733,7 +5760,7 @@ "doNotSuggest": false, "ignoreCase": "value", "enum": [ - "DownloadBuildArtifacts@0" + "DownloadBuildArtifacts@1" ] }, { @@ -5741,7 +5768,7 @@ "doNotSuggest": false, "ignoreCase": "value", "enum": [ - "DownloadBuildArtifacts@1" + "DownloadBuildArtifacts@0" ] }, { @@ -5753,7 +5780,7 @@ ] }, { - "description": "Deploy applications to Azure Spring Cloud and manage deployments.", + "description": "Deploy applications to Azure Spring Apps and manage deployments.", "doNotSuggest": false, "ignoreCase": "value", "enum": [ @@ -5797,7 +5824,7 @@ "doNotSuggest": false, "ignoreCase": "value", "enum": [ - "GitHubRelease@1" + "GitHubRelease@0" ] }, { @@ -5805,7 +5832,7 @@ "doNotSuggest": false, "ignoreCase": "value", "enum": [ - "GitHubRelease@0" + "GitHubRelease@1" ] }, { @@ -5853,7 +5880,7 @@ "doNotSuggest": false, "ignoreCase": "value", "enum": [ - "AzureFunctionOnKubernetes@0" + "AzureFunctionOnKubernetes@1" ] }, { @@ -5861,7 +5888,7 @@ "doNotSuggest": false, "ignoreCase": "value", "enum": [ - "AzureFunctionOnKubernetes@1" + "AzureFunctionOnKubernetes@0" ] }, { @@ -5914,23 +5941,39 @@ ] }, { - "description": "Deploy an Azure Cloud Service", + "description": "Authentication task for the conda client", "doNotSuggest": false, "ignoreCase": "value", "enum": [ - "AzureCloudPowerShellDeployment@1" + "CondaAuthenticate@0" ] }, { - "description": "Authentication task for the cargo client used for installing Cargo crates distribution", + "description": "Deploy an Azure Cloud Service", "doNotSuggest": false, "ignoreCase": "value", "enum": [ - "CargoAuthenticate@0" + "AzureCloudPowerShellDeployment@2" ] }, { - "description": "Delete folders, or files matching a pattern", + "description": "Deploy an Azure Cloud Service", + "doNotSuggest": false, + "ignoreCase": "value", + "enum": [ + "AzureCloudPowerShellDeployment@1" + ] + }, + { + "description": "Authentication task for the cargo client used for installing Cargo crates distribution", + "doNotSuggest": false, + "ignoreCase": "value", + "enum": [ + "CargoAuthenticate@0" + ] + }, + { + "description": "Delete folders, or files matching a pattern", "doNotSuggest": false, "ignoreCase": "value", "enum": [ @@ -6023,62 +6066,6 @@ "task" ], "anyOf": [ - { - "properties": { - "task": { - "description": "PowerShell\n\nRun a PowerShell script", - "ignoreCase": "value", - "pattern": "^PowerShell@1$" - }, - "inputs": { - "description": "PowerShell inputs", - "properties": { - "scriptType": { - "description": "Type", - "ignoreCase": "all", - "enum": [ - "inlineScript", - "filePath" - ] - }, - "scriptName": { - "type": "string", - "description": "Script Path", - "ignoreCase": "key" - }, - "arguments": { - "type": "string", - "description": "Arguments", - "ignoreCase": "key" - }, - "workingFolder": { - "type": "string", - "description": "Working folder", - "ignoreCase": "key" - }, - "inlineScript": { - "type": "string", - "description": "Inline Script", - "ignoreCase": "key" - }, - "failOnStandardError": { - "type": "boolean", - "description": "Fail on Standard Error", - "ignoreCase": "key" - } - }, - "additionalProperties": false, - "required": [] - } - }, - "doNotSuggest": false, - "firstProperty": [ - "task" - ], - "required": [ - "task" - ] - }, { "properties": { "task": { @@ -6215,16 +6202,91 @@ "task" ] }, + { + "properties": { + "task": { + "description": "PowerShell\n\nRun a PowerShell script", + "ignoreCase": "value", + "pattern": "^PowerShell@1$" + }, + "inputs": { + "description": "PowerShell inputs", + "properties": { + "scriptType": { + "description": "Type", + "ignoreCase": "all", + "enum": [ + "inlineScript", + "filePath" + ] + }, + "scriptName": { + "type": "string", + "description": "Script Path", + "ignoreCase": "key" + }, + "arguments": { + "type": "string", + "description": "Arguments", + "ignoreCase": "key" + }, + "workingFolder": { + "type": "string", + "description": "Working folder", + "ignoreCase": "key" + }, + "inlineScript": { + "type": "string", + "description": "Inline Script", + "ignoreCase": "key" + }, + "failOnStandardError": { + "type": "boolean", + "description": "Fail on Standard Error", + "ignoreCase": "key" + } + }, + "additionalProperties": false, + "required": [] + } + }, + "doNotSuggest": false, + "firstProperty": [ + "task" + ], + "required": [ + "task" + ] + }, { "properties": { "task": { "description": "Azure PowerShell\n\nRun a PowerShell script within an Azure environment", "ignoreCase": "value", - "pattern": "^AzurePowerShell@4$" + "pattern": "^AzurePowerShell@2$" }, "inputs": { "description": "Azure PowerShell inputs", "properties": { + "azureConnectionType": { + "description": "Azure Connection Type", + "ignoreCase": "all", + "enum": [ + "ConnectedServiceName", + "ConnectedServiceNameARM" + ], + "aliases": [ + "ConnectedServiceNameSelector" + ] + }, + "azureClassicSubscription": { + "type": "string", + "description": "Azure Classic Subscription", + "ignoreCase": "key", + "aliases": [ + "ConnectedServiceName" + ] + }, "azureSubscription": { "type": "string", "description": "Azure Subscription", @@ -6256,25 +6318,6 @@ "description": "Script Arguments", "ignoreCase": "key" }, - "errorActionPreference": { - "description": "ErrorActionPreference", - "ignoreCase": "all", - "enum": [ - "stop", - "continue", - "silentlyContinue" - ] - }, - "FailOnStandardError": { - "type": "boolean", - "description": "Fail on Standard Error", - "ignoreCase": "key" - }, - "RestrictContextToCurrentTask": { - "type": "boolean", - "description": "Restrict scope of context to current task", - "ignoreCase": "key" - }, "azurePowerShellVersion": { "description": "Azure PowerShell Version", "ignoreCase": "all", @@ -6293,27 +6336,10 @@ "aliases": [ "CustomTargetAzurePs" ] - }, - "pwsh": { - "type": "boolean", - "description": "Use PowerShell Core", - "ignoreCase": "key" - }, - "validateScriptSignature": { - "type": "boolean", - "description": "Validate script signature", - "ignoreCase": "key" - }, - "workingDirectory": { - "type": "string", - "description": "Working Directory", - "ignoreCase": "key" } }, "additionalProperties": false, - "required": [ - "azureSubscription" - ] + "required": [] } }, "doNotSuggest": false, @@ -6321,8 +6347,7 @@ "task" ], "required": [ - "task", - "inputs" + "task" ] }, { @@ -6330,7 +6355,7 @@ "task": { "description": "Azure PowerShell\n\nRun a PowerShell script within an Azure environment", "ignoreCase": "value", - "pattern": "^AzurePowerShell@2$" + "pattern": "^AzurePowerShell@3$" }, "inputs": { "description": "Azure PowerShell inputs", @@ -6385,6 +6410,20 @@ "description": "Script Arguments", "ignoreCase": "key" }, + "errorActionPreference": { + "description": "ErrorActionPreference", + "ignoreCase": "all", + "enum": [ + "stop", + "continue", + "silentlyContinue" + ] + }, + "FailOnStandardError": { + "type": "boolean", + "description": "Fail on Standard Error", + "ignoreCase": "key" + }, "azurePowerShellVersion": { "description": "Azure PowerShell Version", "ignoreCase": "all", @@ -6403,6 +6442,11 @@ "aliases": [ "CustomTargetAzurePs" ] + }, + "validateScriptSignature": { + "type": "boolean", + "description": "Validate script signature", + "ignoreCase": "key" } }, "additionalProperties": false, @@ -6422,7 +6466,7 @@ "task": { "description": "Azure PowerShell\n\nRun a PowerShell script within an Azure environment", "ignoreCase": "value", - "pattern": "^AzurePowerShell@5$" + "pattern": "^AzurePowerShell@4$" }, "inputs": { "description": "Azure PowerShell inputs", @@ -6472,6 +6516,11 @@ "description": "Fail on Standard Error", "ignoreCase": "key" }, + "RestrictContextToCurrentTask": { + "type": "boolean", + "description": "Restrict scope of context to current task", + "ignoreCase": "key" + }, "azurePowerShellVersion": { "description": "Azure PowerShell Version", "ignoreCase": "all", @@ -6527,30 +6576,11 @@ "task": { "description": "Azure PowerShell\n\nRun a PowerShell script within an Azure environment", "ignoreCase": "value", - "pattern": "^AzurePowerShell@3$" + "pattern": "^AzurePowerShell@5$" }, "inputs": { "description": "Azure PowerShell inputs", "properties": { - "azureConnectionType": { - "description": "Azure Connection Type", - "ignoreCase": "all", - "enum": [ - "ConnectedServiceName", - "ConnectedServiceNameARM" - ], - "aliases": [ - "ConnectedServiceNameSelector" - ] - }, - "azureClassicSubscription": { - "type": "string", - "description": "Azure Classic Subscription", - "ignoreCase": "key", - "aliases": [ - "ConnectedServiceName" - ] - }, "azureSubscription": { "type": "string", "description": "Azure Subscription", @@ -6615,14 +6645,26 @@ "CustomTargetAzurePs" ] }, + "pwsh": { + "type": "boolean", + "description": "Use PowerShell Core", + "ignoreCase": "key" + }, "validateScriptSignature": { "type": "boolean", "description": "Validate script signature", "ignoreCase": "key" + }, + "workingDirectory": { + "type": "string", + "description": "Working Directory", + "ignoreCase": "key" } }, "additionalProperties": false, - "required": [] + "required": [ + "azureSubscription" + ] } }, "doNotSuggest": false, @@ -6630,7 +6672,8 @@ "task" ], "required": [ - "task" + "task", + "inputs" ] }, { @@ -6737,7 +6780,7 @@ }, "SqlUsername": { "type": "string", - "description": "Mysql User Name", + "description": "MySQL User Name", "ignoreCase": "key" }, "SqlPassword": { @@ -6772,7 +6815,7 @@ "task": { "description": "Python pip authenticate\n\nAuthentication task for the pip client used for installing Python distributions", "ignoreCase": "value", - "pattern": "^PipAuthenticate@1$" + "pattern": "^PipAuthenticate@0$" }, "inputs": { "description": "Python pip authenticate inputs", @@ -6782,21 +6825,16 @@ "description": "My feeds (select below)", "ignoreCase": "key", "aliases": [ - "artifactFeeds" + "feedList" ] }, - "pythonDownloadServiceConnections": { + "externalFeeds": { "type": "string", "description": "Feeds from external organizations", "ignoreCase": "key", "aliases": [ - "pythonDownloadServiceConnections" + "externalSources" ] - }, - "onlyAddExtraIndex": { - "type": "boolean", - "description": "Don't set primary index URL", - "ignoreCase": "key" } }, "additionalProperties": false, @@ -6816,7 +6854,7 @@ "task": { "description": "Python pip authenticate\n\nAuthentication task for the pip client used for installing Python distributions", "ignoreCase": "value", - "pattern": "^PipAuthenticate@0$" + "pattern": "^PipAuthenticate@1$" }, "inputs": { "description": "Python pip authenticate inputs", @@ -6826,16 +6864,21 @@ "description": "My feeds (select below)", "ignoreCase": "key", "aliases": [ - "feedList" + "artifactFeeds" ] }, - "externalFeeds": { + "pythonDownloadServiceConnections": { "type": "string", "description": "Feeds from external organizations", "ignoreCase": "key", "aliases": [ - "externalSources" + "pythonDownloadServiceConnections" ] + }, + "onlyAddExtraIndex": { + "type": "boolean", + "description": "Don't set primary index URL", + "ignoreCase": "key" } }, "additionalProperties": false, @@ -6855,7 +6898,7 @@ "task": { "description": "Maven\n\nBuild, test, and deploy with Apache Maven", "ignoreCase": "value", - "pattern": "^Maven@4$" + "pattern": "^Maven@3$" }, "inputs": { "description": "Maven inputs", @@ -7034,7 +7077,7 @@ }, "mavenAuthenticateFeed": { "type": "boolean", - "description": "Authenticate built-in Maven feeds", + "description": "Authenticate with Artifacts feeds", "ignoreCase": "key", "aliases": [ "mavenFeedAuthenticate" @@ -7042,7 +7085,7 @@ }, "effectivePomSkip": { "type": "boolean", - "description": "Skip generating effective POM while authenticating built-in feeds", + "description": "Skip generating effective POM while authenticating with Artifacts feeds", "ignoreCase": "key", "aliases": [ "skipEffectivePom" @@ -7144,7 +7187,7 @@ "task": { "description": "Maven\n\nBuild, test, and deploy with Apache Maven", "ignoreCase": "value", - "pattern": "^Maven@3$" + "pattern": "^Maven@4$" }, "inputs": { "description": "Maven inputs", @@ -7323,7 +7366,7 @@ }, "mavenAuthenticateFeed": { "type": "boolean", - "description": "Authenticate built-in Maven feeds", + "description": "Authenticate with Artifacts feeds", "ignoreCase": "key", "aliases": [ "mavenFeedAuthenticate" @@ -7331,7 +7374,7 @@ }, "effectivePomSkip": { "type": "boolean", - "description": "Skip generating effective POM while authenticating built-in feeds", + "description": "Skip generating effective POM while authenticating with Artifacts feeds", "ignoreCase": "key", "aliases": [ "skipEffectivePom" @@ -7431,9 +7474,9 @@ { "properties": { "task": { - "description": "Maven\n\nBuild, test, and deploy with Apache Maven", + "description": "Maven\n\nBuild with Apache Maven", "ignoreCase": "value", - "pattern": "^Maven@2$" + "pattern": "^Maven@1$" }, "inputs": { "description": "Maven inputs", @@ -7458,29 +7501,21 @@ }, "publishJUnitResults": { "type": "boolean", - "description": "Publish to Azure Pipelines", + "description": "Publish to TFS/Team Services", "ignoreCase": "key" }, "testResultsFiles": { "type": "string", - "description": "Test results files", + "description": "Test Results Files", "ignoreCase": "key" }, "testRunTitle": { "type": "string", - "description": "Test run title", + "description": "Test Run Title", "ignoreCase": "key" }, - "allowBrokenSymlinks": { - "type": "boolean", - "description": "Allow broken symbolic links", - "ignoreCase": "key", - "aliases": [ - "allowBrokenSymbolicLinks" - ] - }, "codeCoverageToolOption": { - "description": "Code coverage tool", + "description": "Code Coverage Tool", "ignoreCase": "all", "enum": [ "None", @@ -7493,7 +7528,7 @@ }, "codeCoverageClassFilter": { "type": "string", - "description": "Class inclusion/exclusion filters", + "description": "Class Inclusion/Exclusion Filters", "ignoreCase": "key", "aliases": [ "classFilter" @@ -7501,7 +7536,7 @@ }, "codeCoverageClassFilesDirectories": { "type": "string", - "description": "Class files directories", + "description": "Class Files Directories", "ignoreCase": "key", "aliases": [ "classFilesDirectories" @@ -7509,7 +7544,7 @@ }, "codeCoverageSourceDirectories": { "type": "string", - "description": "Source files directories", + "description": "Source Files Directories", "ignoreCase": "key", "aliases": [ "srcDirectories" @@ -7517,20 +7552,12 @@ }, "codeCoverageFailIfEmpty": { "type": "boolean", - "description": "Fail when code coverage results are missing", + "description": "Fail When Code Coverage Results Are Missing", "ignoreCase": "key", "aliases": [ "failIfCoverageEmpty" ] }, - "codeCoverageRestoreOriginalPomXml": { - "type": "boolean", - "description": "Restore original pom.xml after task execution", - "ignoreCase": "key", - "aliases": [ - "restoreOriginalPomXml" - ] - }, "javaHomeOption": { "description": "Set JAVA_HOME by", "ignoreCase": "all", @@ -7543,13 +7570,10 @@ ] }, "jdkVersionOption": { - "description": "JDK version", + "description": "JDK Version", "ignoreCase": "all", "enum": [ "default", - "1.17", - "1.11", - "1.10", "1.9", "1.8", "1.7", @@ -7561,14 +7585,14 @@ }, "jdkDirectory": { "type": "string", - "description": "JDK path", + "description": "JDK Path", "ignoreCase": "key", "aliases": [ "jdkUserInputPath" ] }, "jdkArchitectureOption": { - "description": "JDK architecture", + "description": "JDK Architecture", "ignoreCase": "all", "enum": [ "x86", @@ -7579,7 +7603,7 @@ ] }, "mavenVersionOption": { - "description": "Maven version", + "description": "Maven Version", "ignoreCase": "all", "enum": [ "Default", @@ -7591,7 +7615,7 @@ }, "mavenDirectory": { "type": "string", - "description": "Maven path", + "description": "Maven Path", "ignoreCase": "key", "aliases": [ "mavenPath" @@ -7620,23 +7644,90 @@ }, "sonarQubeRunAnalysis": { "type": "boolean", - "description": "Run SonarQube or SonarCloud analysis", + "description": "Run SonarQube Analysis", "ignoreCase": "key", "aliases": [ "sqAnalysisEnabled" ] }, - "isJacocoCoverageReportXML": { + "sonarQubeServiceEndpoint": { + "type": "string", + "description": "SonarQube Endpoint", + "ignoreCase": "key", + "aliases": [ + "sqConnectedServiceName" + ] + }, + "sonarQubeProjectName": { + "type": "string", + "description": "SonarQube Project Name", + "ignoreCase": "key", + "aliases": [ + "sqProjectName" + ] + }, + "sonarQubeProjectKey": { + "type": "string", + "description": "SonarQube Project Key", + "ignoreCase": "key", + "aliases": [ + "sqProjectKey" + ] + }, + "sonarQubeProjectVersion": { + "type": "string", + "description": "SonarQube Project Version", + "ignoreCase": "key", + "aliases": [ + "sqProjectVersion" + ] + }, + "sonarQubeSpecifyDB": { "type": "boolean", - "description": "Use XML Jacoco reports for SonarQube analysis", - "ignoreCase": "key" + "description": "The SonarQube server version is lower than 5.2", + "ignoreCase": "key", + "aliases": [ + "sqDbDetailsRequired" + ] }, - "sqMavenPluginVersionChoice": { - "description": "SonarQube scanner for Maven version", - "ignoreCase": "all", - "enum": [ - "latest", - "pom" + "sonarQubeDBUrl": { + "type": "string", + "description": "Db Connection String", + "ignoreCase": "key", + "aliases": [ + "sqDbUrl" + ] + }, + "sonarQubeDBUsername": { + "type": "string", + "description": "Db Username", + "ignoreCase": "key", + "aliases": [ + "sqDbUsername" + ] + }, + "sonarQubeDBPassword": { + "type": "string", + "description": "Db User Password", + "ignoreCase": "key", + "aliases": [ + "sqDbPassword" + ] + }, + "sonarQubeIncludeFullReport": { + "type": "boolean", + "description": "Include full analysis report in the build summary (SQ 5.3+)", + "ignoreCase": "key", + "aliases": [ + "sqAnalysisIncludeFullReport" + ] + }, + "sonarQubeFailWhenQualityGateFails": { + "type": "boolean", + "description": "Fail the build on quality gate failure (SQ 5.3+)", + "ignoreCase": "key", + "aliases": [ + "sqAnalysisBreakBuildIfQualityGateFailed" ] }, "checkStyleRunAnalysis": { @@ -7679,9 +7770,9 @@ { "properties": { "task": { - "description": "Maven\n\nBuild with Apache Maven", + "description": "Maven\n\nBuild, test, and deploy with Apache Maven", "ignoreCase": "value", - "pattern": "^Maven@1$" + "pattern": "^Maven@2$" }, "inputs": { "description": "Maven inputs", @@ -7706,21 +7797,29 @@ }, "publishJUnitResults": { "type": "boolean", - "description": "Publish to TFS/Team Services", + "description": "Publish to Azure Pipelines", "ignoreCase": "key" }, "testResultsFiles": { "type": "string", - "description": "Test Results Files", + "description": "Test results files", "ignoreCase": "key" }, "testRunTitle": { "type": "string", - "description": "Test Run Title", + "description": "Test run title", "ignoreCase": "key" }, + "allowBrokenSymlinks": { + "type": "boolean", + "description": "Allow broken symbolic links", + "ignoreCase": "key", + "aliases": [ + "allowBrokenSymbolicLinks" + ] + }, "codeCoverageToolOption": { - "description": "Code Coverage Tool", + "description": "Code coverage tool", "ignoreCase": "all", "enum": [ "None", @@ -7733,7 +7832,7 @@ }, "codeCoverageClassFilter": { "type": "string", - "description": "Class Inclusion/Exclusion Filters", + "description": "Class inclusion/exclusion filters", "ignoreCase": "key", "aliases": [ "classFilter" @@ -7741,7 +7840,7 @@ }, "codeCoverageClassFilesDirectories": { "type": "string", - "description": "Class Files Directories", + "description": "Class files directories", "ignoreCase": "key", "aliases": [ "classFilesDirectories" @@ -7749,7 +7848,7 @@ }, "codeCoverageSourceDirectories": { "type": "string", - "description": "Source Files Directories", + "description": "Source files directories", "ignoreCase": "key", "aliases": [ "srcDirectories" @@ -7757,12 +7856,20 @@ }, "codeCoverageFailIfEmpty": { "type": "boolean", - "description": "Fail When Code Coverage Results Are Missing", + "description": "Fail when code coverage results are missing", "ignoreCase": "key", "aliases": [ "failIfCoverageEmpty" ] }, + "codeCoverageRestoreOriginalPomXml": { + "type": "boolean", + "description": "Restore original pom.xml after task execution", + "ignoreCase": "key", + "aliases": [ + "restoreOriginalPomXml" + ] + }, "javaHomeOption": { "description": "Set JAVA_HOME by", "ignoreCase": "all", @@ -7775,10 +7882,13 @@ ] }, "jdkVersionOption": { - "description": "JDK Version", + "description": "JDK version", "ignoreCase": "all", "enum": [ "default", + "1.17", + "1.11", + "1.10", "1.9", "1.8", "1.7", @@ -7790,14 +7900,14 @@ }, "jdkDirectory": { "type": "string", - "description": "JDK Path", + "description": "JDK path", "ignoreCase": "key", "aliases": [ "jdkUserInputPath" ] }, "jdkArchitectureOption": { - "description": "JDK Architecture", + "description": "JDK architecture", "ignoreCase": "all", "enum": [ "x86", @@ -7808,7 +7918,7 @@ ] }, "mavenVersionOption": { - "description": "Maven Version", + "description": "Maven version", "ignoreCase": "all", "enum": [ "Default", @@ -7820,7 +7930,7 @@ }, "mavenDirectory": { "type": "string", - "description": "Maven Path", + "description": "Maven path", "ignoreCase": "key", "aliases": [ "mavenPath" @@ -7841,7 +7951,7 @@ }, "mavenAuthenticateFeed": { "type": "boolean", - "description": "Authenticate built-in Maven feeds", + "description": "Authenticate with Artifacts feeds", "ignoreCase": "key", "aliases": [ "mavenFeedAuthenticate" @@ -7849,106 +7959,39 @@ }, "sonarQubeRunAnalysis": { "type": "boolean", - "description": "Run SonarQube Analysis", + "description": "Run SonarQube or SonarCloud analysis", "ignoreCase": "key", "aliases": [ "sqAnalysisEnabled" ] }, - "sonarQubeServiceEndpoint": { - "type": "string", - "description": "SonarQube Endpoint", - "ignoreCase": "key", - "aliases": [ - "sqConnectedServiceName" + "isJacocoCoverageReportXML": { + "type": "boolean", + "description": "Use XML Jacoco reports for SonarQube analysis", + "ignoreCase": "key" + }, + "sqMavenPluginVersionChoice": { + "description": "SonarQube scanner for Maven version", + "ignoreCase": "all", + "enum": [ + "latest", + "pom" ] }, - "sonarQubeProjectName": { - "type": "string", - "description": "SonarQube Project Name", + "checkStyleRunAnalysis": { + "type": "boolean", + "description": "Run Checkstyle", "ignoreCase": "key", "aliases": [ - "sqProjectName" + "checkstyleAnalysisEnabled" ] }, - "sonarQubeProjectKey": { - "type": "string", - "description": "SonarQube Project Key", + "pmdRunAnalysis": { + "type": "boolean", + "description": "Run PMD", "ignoreCase": "key", "aliases": [ - "sqProjectKey" - ] - }, - "sonarQubeProjectVersion": { - "type": "string", - "description": "SonarQube Project Version", - "ignoreCase": "key", - "aliases": [ - "sqProjectVersion" - ] - }, - "sonarQubeSpecifyDB": { - "type": "boolean", - "description": "The SonarQube server version is lower than 5.2", - "ignoreCase": "key", - "aliases": [ - "sqDbDetailsRequired" - ] - }, - "sonarQubeDBUrl": { - "type": "string", - "description": "Db Connection String", - "ignoreCase": "key", - "aliases": [ - "sqDbUrl" - ] - }, - "sonarQubeDBUsername": { - "type": "string", - "description": "Db Username", - "ignoreCase": "key", - "aliases": [ - "sqDbUsername" - ] - }, - "sonarQubeDBPassword": { - "type": "string", - "description": "Db User Password", - "ignoreCase": "key", - "aliases": [ - "sqDbPassword" - ] - }, - "sonarQubeIncludeFullReport": { - "type": "boolean", - "description": "Include full analysis report in the build summary (SQ 5.3+)", - "ignoreCase": "key", - "aliases": [ - "sqAnalysisIncludeFullReport" - ] - }, - "sonarQubeFailWhenQualityGateFails": { - "type": "boolean", - "description": "Fail the build on quality gate failure (SQ 5.3+)", - "ignoreCase": "key", - "aliases": [ - "sqAnalysisBreakBuildIfQualityGateFailed" - ] - }, - "checkStyleRunAnalysis": { - "type": "boolean", - "description": "Run Checkstyle", - "ignoreCase": "key", - "aliases": [ - "checkstyleAnalysisEnabled" - ] - }, - "pmdRunAnalysis": { - "type": "boolean", - "description": "Run PMD", - "ignoreCase": "key", - "aliases": [ - "pmdAnalysisEnabled" + "pmdAnalysisEnabled" ] }, "findBugsRunAnalysis": { @@ -7972,61 +8015,6 @@ "task" ] }, - { - "properties": { - "task": { - "description": ".NET Core (PREVIEW)\n\nBuild, test and publish using dotnet core command-line.", - "ignoreCase": "value", - "pattern": "^DotNetCoreCLI@0$" - }, - "inputs": { - "description": ".NET Core (PREVIEW) inputs", - "properties": { - "command": { - "description": "Command", - "ignoreCase": "all", - "enum": [ - "build", - "publish", - "restore", - "test", - "run" - ] - }, - "publishWebProjects": { - "type": "boolean", - "description": "Publish Web Projects", - "ignoreCase": "key" - }, - "projects": { - "type": "string", - "description": "Project(s)", - "ignoreCase": "key" - }, - "arguments": { - "type": "string", - "description": "Arguments", - "ignoreCase": "key" - }, - "zipAfterPublish": { - "type": "boolean", - "description": "Zip Published Projects", - "ignoreCase": "key" - } - }, - "additionalProperties": false, - "required": [] - } - }, - "deprecationMessage": "DotNetCoreCLI is deprecated - Build, test and publish using dotnet core command-line.", - "doNotSuggest": true, - "firstProperty": [ - "task" - ], - "required": [ - "task" - ] - }, { "properties": { "task": { @@ -8308,6 +8296,61 @@ "task" ] }, + { + "properties": { + "task": { + "description": ".NET Core (PREVIEW)\n\nBuild, test and publish using dotnet core command-line.", + "ignoreCase": "value", + "pattern": "^DotNetCoreCLI@0$" + }, + "inputs": { + "description": ".NET Core (PREVIEW) inputs", + "properties": { + "command": { + "description": "Command", + "ignoreCase": "all", + "enum": [ + "build", + "publish", + "restore", + "test", + "run" + ] + }, + "publishWebProjects": { + "type": "boolean", + "description": "Publish Web Projects", + "ignoreCase": "key" + }, + "projects": { + "type": "string", + "description": "Project(s)", + "ignoreCase": "key" + }, + "arguments": { + "type": "string", + "description": "Arguments", + "ignoreCase": "key" + }, + "zipAfterPublish": { + "type": "boolean", + "description": "Zip Published Projects", + "ignoreCase": "key" + } + }, + "additionalProperties": false, + "required": [] + } + }, + "deprecationMessage": "DotNetCoreCLI is deprecated - Build, test and publish using dotnet core command-line.", + "doNotSuggest": true, + "firstProperty": [ + "task" + ], + "required": [ + "task" + ] + }, { "properties": { "task": { @@ -8411,69 +8454,27 @@ { "properties": { "task": { - "description": "Azure App Service deploy\n\nDeploy to Azure App Service a web, mobile, or API app using Docker, Java, .NET, .NET Core, Node.js, PHP, Python, or Ruby", + "description": "Azure App Service Deploy\n\nUpdate Azure App Service using Web Deploy / Kudu REST APIs", "ignoreCase": "value", - "pattern": "^AzureRmWebAppDeployment@4$" + "pattern": "^AzureRmWebAppDeployment@2$" }, "inputs": { - "description": "Azure App Service deploy inputs", + "description": "Azure App Service Deploy inputs", "properties": { - "ConnectionType": { - "description": "Connection type", - "ignoreCase": "all", - "enum": [ - "AzureRM", - "PublishProfile" - ] - }, - "azureSubscription": { - "type": "string", - "description": "Azure subscription", - "ignoreCase": "key", - "aliases": [ - "ConnectedServiceName" - ] - }, - "PublishProfilePath": { - "type": "string", - "description": "Publish profile path", - "ignoreCase": "key" - }, - "PublishProfilePassword": { + "ConnectedServiceName": { "type": "string", - "description": "Publish profile password", + "description": "Azure Subscription", "ignoreCase": "key" }, - "appType": { - "description": "App Service type", - "ignoreCase": "all", - "enum": [ - "webApp", - "webAppLinux", - "webAppContainer", - "webAppHyperVContainer", - "functionApp", - "functionAppLinux", - "functionAppContainer", - "apiApp", - "mobileApp" - ], - "aliases": [ - "WebAppKind" - ] - }, "WebAppName": { "type": "string", "description": "App Service name", "ignoreCase": "key" }, - "deployToSlotOrASE": { + "DeployToSlotFlag": { "type": "boolean", - "description": "Deploy to Slot or App Service Environment", - "ignoreCase": "key", - "aliases": [ - "DeployToSlotOrASEFlag" - ] + "description": "Deploy to slot", + "ignoreCase": "key" }, "ResourceGroupName": { "type": "string", @@ -8485,27 +8486,166 @@ "description": "Slot", "ignoreCase": "key" }, - "DockerNamespace": { + "VirtualApplication": { "type": "string", - "description": "Registry or Namespace", + "description": "Virtual Application", "ignoreCase": "key" }, - "DockerRepository": { + "Package": { "type": "string", - "description": "Image", + "description": "Package or Folder", "ignoreCase": "key" }, - "DockerImageTag": { + "WebAppUri": { "type": "string", - "description": "Tag", + "description": "App Service URL", "ignoreCase": "key" }, - "VirtualApplication": { - "type": "string", - "description": "Virtual application", + "UseWebDeploy": { + "type": "boolean", + "description": "Publish using Web Deploy", "ignoreCase": "key" }, - "packageForLinux": { + "SetParametersFile": { + "type": "string", + "description": "SetParameters File", + "ignoreCase": "key" + }, + "RemoveAdditionalFilesFlag": { + "type": "boolean", + "description": "Remove Additional Files at Destination", + "ignoreCase": "key" + }, + "ExcludeFilesFromAppDataFlag": { + "type": "boolean", + "description": "Exclude Files from the App_Data Folder", + "ignoreCase": "key" + }, + "AdditionalArguments": { + "type": "string", + "description": "Additional Arguments", + "ignoreCase": "key" + }, + "TakeAppOfflineFlag": { + "type": "boolean", + "description": "Take App Offline", + "ignoreCase": "key" + } + }, + "additionalProperties": false, + "required": [ + "ConnectedServiceName", + "WebAppName" + ] + } + }, + "doNotSuggest": false, + "firstProperty": [ + "task" + ], + "required": [ + "task", + "inputs" + ] + }, + { + "properties": { + "task": { + "description": "Azure App Service deploy\n\nDeploy to Azure App Service a web, mobile, or API app using Docker, Java, .NET, .NET Core, Node.js, PHP, Python, or Ruby", + "ignoreCase": "value", + "pattern": "^AzureRmWebAppDeployment@4$" + }, + "inputs": { + "description": "Azure App Service deploy inputs", + "properties": { + "ConnectionType": { + "description": "Connection type", + "ignoreCase": "all", + "enum": [ + "AzureRM", + "PublishProfile" + ] + }, + "azureSubscription": { + "type": "string", + "description": "Azure subscription", + "ignoreCase": "key", + "aliases": [ + "ConnectedServiceName" + ] + }, + "PublishProfilePath": { + "type": "string", + "description": "Publish profile path", + "ignoreCase": "key" + }, + "PublishProfilePassword": { + "type": "string", + "description": "Publish profile password", + "ignoreCase": "key" + }, + "appType": { + "description": "App Service type", + "ignoreCase": "all", + "enum": [ + "webApp", + "webAppLinux", + "webAppContainer", + "webAppHyperVContainer", + "functionApp", + "functionAppLinux", + "functionAppContainer", + "apiApp", + "mobileApp" + ], + "aliases": [ + "WebAppKind" + ] + }, + "WebAppName": { + "type": "string", + "description": "App Service name", + "ignoreCase": "key" + }, + "deployToSlotOrASE": { + "type": "boolean", + "description": "Deploy to Slot or App Service Environment", + "ignoreCase": "key", + "aliases": [ + "DeployToSlotOrASEFlag" + ] + }, + "ResourceGroupName": { + "type": "string", + "description": "Resource group", + "ignoreCase": "key" + }, + "SlotName": { + "type": "string", + "description": "Slot", + "ignoreCase": "key" + }, + "DockerNamespace": { + "type": "string", + "description": "Registry or Namespace", + "ignoreCase": "key" + }, + "DockerRepository": { + "type": "string", + "description": "Image", + "ignoreCase": "key" + }, + "DockerImageTag": { + "type": "string", + "description": "Tag", + "ignoreCase": "key" + }, + "VirtualApplication": { + "type": "string", + "description": "Virtual application", + "ignoreCase": "key" + }, + "packageForLinux": { "type": "string", "description": "Package or folder", "ignoreCase": "key", @@ -8655,103 +8795,6 @@ "task" ] }, - { - "properties": { - "task": { - "description": "Azure App Service Deploy\n\nUpdate Azure App Service using Web Deploy / Kudu REST APIs", - "ignoreCase": "value", - "pattern": "^AzureRmWebAppDeployment@2$" - }, - "inputs": { - "description": "Azure App Service Deploy inputs", - "properties": { - "ConnectedServiceName": { - "type": "string", - "description": "Azure Subscription", - "ignoreCase": "key" - }, - "WebAppName": { - "type": "string", - "description": "App Service name", - "ignoreCase": "key" - }, - "DeployToSlotFlag": { - "type": "boolean", - "description": "Deploy to slot", - "ignoreCase": "key" - }, - "ResourceGroupName": { - "type": "string", - "description": "Resource group", - "ignoreCase": "key" - }, - "SlotName": { - "type": "string", - "description": "Slot", - "ignoreCase": "key" - }, - "VirtualApplication": { - "type": "string", - "description": "Virtual Application", - "ignoreCase": "key" - }, - "Package": { - "type": "string", - "description": "Package or Folder", - "ignoreCase": "key" - }, - "WebAppUri": { - "type": "string", - "description": "App Service URL", - "ignoreCase": "key" - }, - "UseWebDeploy": { - "type": "boolean", - "description": "Publish using Web Deploy", - "ignoreCase": "key" - }, - "SetParametersFile": { - "type": "string", - "description": "SetParameters File", - "ignoreCase": "key" - }, - "RemoveAdditionalFilesFlag": { - "type": "boolean", - "description": "Remove Additional Files at Destination", - "ignoreCase": "key" - }, - "ExcludeFilesFromAppDataFlag": { - "type": "boolean", - "description": "Exclude Files from the App_Data Folder", - "ignoreCase": "key" - }, - "AdditionalArguments": { - "type": "string", - "description": "Additional Arguments", - "ignoreCase": "key" - }, - "TakeAppOfflineFlag": { - "type": "boolean", - "description": "Take App Offline", - "ignoreCase": "key" - } - }, - "additionalProperties": false, - "required": [ - "ConnectedServiceName", - "WebAppName" - ] - } - }, - "doNotSuggest": false, - "firstProperty": [ - "task" - ], - "required": [ - "task", - "inputs" - ] - }, { "properties": { "task": { @@ -9331,16 +9374,24 @@ { "properties": { "task": { - "description": "Publish code coverage results v2\n\nPublish any of the code coverage results from a build", + "description": "Publish code coverage results\n\nPublish Cobertura or JaCoCo code coverage results from a build", "ignoreCase": "value", - "pattern": "^PublishCodeCoverageResults@2$" + "pattern": "^PublishCodeCoverageResults@1$" }, "inputs": { - "description": "Publish code coverage results v2 inputs", + "description": "Publish code coverage results inputs", "properties": { + "codeCoverageTool": { + "description": "Code coverage tool", + "ignoreCase": "all", + "enum": [ + "Cobertura", + "JaCoCo" + ] + }, "summaryFileLocation": { "type": "string", - "description": "Path to summary files", + "description": "Summary file", "ignoreCase": "key" }, "pathToSources": { @@ -9348,9 +9399,19 @@ "description": "Path to Source files", "ignoreCase": "key" }, - "failIfCoverageEmpty": { - "type": "boolean", - "description": "Fail if code coverage results are missing", + "reportDirectory": { + "type": "string", + "description": "Report directory", + "ignoreCase": "key" + }, + "additionalCodeCoverageFiles": { + "type": "string", + "description": "Additional files", + "ignoreCase": "key" + }, + "failIfCoverageEmpty": { + "type": "boolean", + "description": "Fail when code coverage results are missing", "ignoreCase": "key" } }, @@ -9372,24 +9433,16 @@ { "properties": { "task": { - "description": "Publish code coverage results\n\nPublish Cobertura or JaCoCo code coverage results from a build", + "description": "Publish code coverage results v2\n\nPublish any of the code coverage results from a build", "ignoreCase": "value", - "pattern": "^PublishCodeCoverageResults@1$" + "pattern": "^PublishCodeCoverageResults@2$" }, "inputs": { - "description": "Publish code coverage results inputs", + "description": "Publish code coverage results v2 inputs", "properties": { - "codeCoverageTool": { - "description": "Code coverage tool", - "ignoreCase": "all", - "enum": [ - "Cobertura", - "JaCoCo" - ] - }, "summaryFileLocation": { "type": "string", - "description": "Summary file", + "description": "Path to summary files", "ignoreCase": "key" }, "pathToSources": { @@ -9397,19 +9450,9 @@ "description": "Path to Source files", "ignoreCase": "key" }, - "reportDirectory": { - "type": "string", - "description": "Report directory", - "ignoreCase": "key" - }, - "additionalCodeCoverageFiles": { - "type": "string", - "description": "Additional files", - "ignoreCase": "key" - }, "failIfCoverageEmpty": { "type": "boolean", - "description": "Fail when code coverage results are missing", + "description": "Fail if code coverage results are missing", "ignoreCase": "key" } }, @@ -9588,28 +9631,39 @@ { "properties": { "task": { - "description": "Install Apple Provisioning Profile\n\nInstall an Apple provisioning profile required to build on a macOS agent", + "description": "Install Apple provisioning profile\n\nInstall an Apple provisioning profile required to build on a macOS agent machine", "ignoreCase": "value", - "pattern": "^InstallAppleProvisioningProfile@0$" + "pattern": "^InstallAppleProvisioningProfile@1$" }, "inputs": { - "description": "Install Apple Provisioning Profile inputs", + "description": "Install Apple provisioning profile inputs", "properties": { + "provisioningProfileLocation": { + "description": "Provisioning profile location", + "ignoreCase": "all", + "enum": [ + "secureFiles", + "sourceRepository" + ] + }, "provProfileSecureFile": { "type": "string", - "description": "Provisioning Profile", + "description": "Provisioning profile", + "ignoreCase": "key" + }, + "provProfileSourceRepository": { + "type": "string", + "description": "Provisioning profile", "ignoreCase": "key" }, "removeProfile": { "type": "boolean", - "description": "Remove Profile After Build", + "description": "Remove profile after build", "ignoreCase": "key" } }, "additionalProperties": false, - "required": [ - "provProfileSecureFile" - ] + "required": [] } }, "doNotSuggest": false, @@ -9617,46 +9671,34 @@ "task" ], "required": [ - "task", - "inputs" + "task" ] }, { "properties": { "task": { - "description": "Install Apple provisioning profile\n\nInstall an Apple provisioning profile required to build on a macOS agent machine", + "description": "Install Apple Provisioning Profile\n\nInstall an Apple provisioning profile required to build on a macOS agent", "ignoreCase": "value", - "pattern": "^InstallAppleProvisioningProfile@1$" + "pattern": "^InstallAppleProvisioningProfile@0$" }, "inputs": { - "description": "Install Apple provisioning profile inputs", + "description": "Install Apple Provisioning Profile inputs", "properties": { - "provisioningProfileLocation": { - "description": "Provisioning profile location", - "ignoreCase": "all", - "enum": [ - "secureFiles", - "sourceRepository" - ] - }, "provProfileSecureFile": { "type": "string", - "description": "Provisioning profile", - "ignoreCase": "key" - }, - "provProfileSourceRepository": { - "type": "string", - "description": "Provisioning profile", + "description": "Provisioning Profile", "ignoreCase": "key" }, "removeProfile": { "type": "boolean", - "description": "Remove profile after build", + "description": "Remove Profile After Build", "ignoreCase": "key" } }, "additionalProperties": false, - "required": [] + "required": [ + "provProfileSecureFile" + ] } }, "doNotSuggest": false, @@ -9664,7 +9706,8 @@ "task" ], "required": [ - "task" + "task", + "inputs" ] }, { @@ -10808,7 +10851,7 @@ "task": { "description": "Windows machine file copy\n\nCopy files to remote Windows machines", "ignoreCase": "value", - "pattern": "^WindowsMachineFileCopy@1$" + "pattern": "^WindowsMachineFileCopy@2$" }, "inputs": { "description": "Windows machine file copy inputs", @@ -10818,7 +10861,7 @@ "description": "Source", "ignoreCase": "key" }, - "EnvironmentName": { + "MachineNames": { "type": "string", "description": "Machines", "ignoreCase": "key" @@ -10852,24 +10895,14 @@ "type": "string", "description": "Additional Arguments", "ignoreCase": "key" - }, - "ResourceFilteringMethod": { - "description": "Select Machines By", - "ignoreCase": "all", - "enum": [ - "machineNames", - "tags" - ] - }, - "MachineNames": { - "type": "string", - "description": "Filter Criteria", - "ignoreCase": "key" } }, "additionalProperties": false, "required": [ "SourcePath", + "MachineNames", + "AdminUserName", + "AdminPassword", "TargetPath" ] } @@ -10888,7 +10921,7 @@ "task": { "description": "Windows machine file copy\n\nCopy files to remote Windows machines", "ignoreCase": "value", - "pattern": "^WindowsMachineFileCopy@2$" + "pattern": "^WindowsMachineFileCopy@1$" }, "inputs": { "description": "Windows machine file copy inputs", @@ -10898,7 +10931,7 @@ "description": "Source", "ignoreCase": "key" }, - "MachineNames": { + "EnvironmentName": { "type": "string", "description": "Machines", "ignoreCase": "key" @@ -10932,14 +10965,24 @@ "type": "string", "description": "Additional Arguments", "ignoreCase": "key" + }, + "ResourceFilteringMethod": { + "description": "Select Machines By", + "ignoreCase": "all", + "enum": [ + "machineNames", + "tags" + ] + }, + "MachineNames": { + "type": "string", + "description": "Filter Criteria", + "ignoreCase": "key" } }, "additionalProperties": false, "required": [ "SourcePath", - "MachineNames", - "AdminUserName", - "AdminPassword", "TargetPath" ] } @@ -11057,31 +11100,26 @@ "task": { "description": "Python twine upload authenticate\n\nAuthenticate for uploading Python distributions using twine. Add '-r FeedName/EndpointName --config-file $(PYPIRC_PATH)' to your twine upload command. For feeds present in this organization, use the feed name as the repository (-r). Otherwise, use the endpoint name defined in the service connection.", "ignoreCase": "value", - "pattern": "^TwineAuthenticate@0$" + "pattern": "^TwineAuthenticate@1$" }, "inputs": { "description": "Python twine upload authenticate inputs", "properties": { - "artifactFeeds": { + "artifactFeed": { "type": "string", - "description": "My feeds (select below)", + "description": "My feed name (select below)", "ignoreCase": "key", "aliases": [ - "feedList" + "artifactFeed" ] }, - "externalFeeds": { + "pythonUploadServiceConnection": { "type": "string", - "description": "Feeds from external organizations", + "description": "Feed from external organizations", "ignoreCase": "key", "aliases": [ - "externalSources" + "pythonUploadServiceConnection" ] - }, - "publishPackageMetadata": { - "type": "boolean", - "description": "Publish pipeline metadata", - "ignoreCase": "key" } }, "additionalProperties": false, @@ -11101,26 +11139,31 @@ "task": { "description": "Python twine upload authenticate\n\nAuthenticate for uploading Python distributions using twine. Add '-r FeedName/EndpointName --config-file $(PYPIRC_PATH)' to your twine upload command. For feeds present in this organization, use the feed name as the repository (-r). Otherwise, use the endpoint name defined in the service connection.", "ignoreCase": "value", - "pattern": "^TwineAuthenticate@1$" + "pattern": "^TwineAuthenticate@0$" }, "inputs": { "description": "Python twine upload authenticate inputs", "properties": { - "artifactFeed": { + "artifactFeeds": { "type": "string", - "description": "My feed name (select below)", + "description": "My feeds (select below)", "ignoreCase": "key", "aliases": [ - "artifactFeed" + "feedList" ] }, - "pythonUploadServiceConnection": { + "externalFeeds": { "type": "string", - "description": "Feed from external organizations", + "description": "Feeds from external organizations", "ignoreCase": "key", "aliases": [ - "pythonUploadServiceConnection" + "externalSources" ] + }, + "publishPackageMetadata": { + "type": "boolean", + "description": "Publish pipeline metadata", + "ignoreCase": "key" } }, "additionalProperties": false, @@ -11277,6 +11320,34 @@ "task" ] }, + { + "properties": { + "task": { + "description": "Helm tool installer\n\nInstall Helm on an agent machine", + "ignoreCase": "value", + "pattern": "^HelmInstaller@1$" + }, + "inputs": { + "description": "Helm tool installer inputs", + "properties": { + "helmVersionToInstall": { + "type": "string", + "description": "Helm Version Spec", + "ignoreCase": "key" + } + }, + "additionalProperties": false, + "required": [] + } + }, + "doNotSuggest": false, + "firstProperty": [ + "task" + ], + "required": [ + "task" + ] + }, { "properties": { "task": { @@ -11331,34 +11402,6 @@ "task" ] }, - { - "properties": { - "task": { - "description": "Helm tool installer\n\nInstall Helm on an agent machine", - "ignoreCase": "value", - "pattern": "^HelmInstaller@1$" - }, - "inputs": { - "description": "Helm tool installer inputs", - "properties": { - "helmVersionToInstall": { - "type": "string", - "description": "Helm Version Spec", - "ignoreCase": "key" - } - }, - "additionalProperties": false, - "required": [] - } - }, - "doNotSuggest": false, - "firstProperty": [ - "task" - ], - "required": [ - "task" - ] - }, { "properties": { "task": { @@ -11710,6 +11753,11 @@ "description": "Destination directory", "ignoreCase": "key" }, + "azureResourceGroupName": { + "type": "string", + "description": "Resource Group name", + "ignoreCase": "key" + }, "cleanDestinationDirectory": { "type": "boolean", "description": "Clean destination directory", @@ -11796,10 +11844,13 @@ "inputs": { "description": "Azure Functions Deploy inputs", "properties": { - "azureSubscription": { + "connectedServiceNameARM": { "type": "string", - "description": "Azure subscription", - "ignoreCase": "key" + "description": "Azure Resource Manager connection", + "ignoreCase": "key", + "aliases": [ + "azureSubscription" + ] }, "appType": { "description": "App type", @@ -11853,7 +11904,8 @@ "PYTHON|3.6", "PYTHON|3.7", "PYTHON|3.8", - "PYTHON|3.9" + "PYTHON|3.9", + "PYTHON|3.10" ] }, "appSettings": { @@ -11873,7 +11925,7 @@ }, "additionalProperties": false, "required": [ - "azureSubscription", + "connectedServiceNameARM", "appType", "appName" ] @@ -12157,7 +12209,7 @@ "task": { "description": "Build machine image\n\nBuild a machine image using Packer, which may be used for Azure Virtual machine scale set deployment", "ignoreCase": "value", - "pattern": "^PackerBuild@0$" + "pattern": "^PackerBuild@1$" }, "inputs": { "description": "Build machine image inputs", @@ -12185,10 +12237,20 @@ "description": "Azure subscription", "ignoreCase": "key" }, - "location": { - "type": "string", - "description": "Storage location", - "ignoreCase": "key" + "isManagedImage": { + "type": "boolean", + "description": "Managed VM disk image", + "ignoreCase": "key" + }, + "managedImageName": { + "type": "string", + "description": "Managed VM Disk Image Name ", + "ignoreCase": "key" + }, + "location": { + "type": "string", + "description": "Storage location", + "ignoreCase": "key" }, "storageAccountName": { "type": "string", @@ -12218,6 +12280,7 @@ "MicrosoftWindowsServer:WindowsServer:2008-R2-SP1:windows", "Canonical:UbuntuServer:14.04.4-LTS:linux", "Canonical:UbuntuServer:16.04-LTS:linux", + "Canonical:UbuntuServer:18.04-LTS:linux", "RedHat:RHEL:7.2:linux", "RedHat:RHEL:6.8:linux", "OpenLogic:CentOS:7.2:linux", @@ -12267,9 +12330,19 @@ "description": "Skip temporary file cleanup during deprovision", "ignoreCase": "key" }, + "packerVersion": { + "type": "string", + "description": "Packer Version", + "ignoreCase": "key" + }, "imageUri": { "type": "string", - "description": "Image URL", + "description": "Image URL or Name", + "ignoreCase": "key" + }, + "imageId": { + "type": "string", + "description": "Azure Resource Id", "ignoreCase": "key" } }, @@ -12298,7 +12371,7 @@ "task": { "description": "Build machine image\n\nBuild a machine image using Packer, which may be used for Azure Virtual machine scale set deployment", "ignoreCase": "value", - "pattern": "^PackerBuild@1$" + "pattern": "^PackerBuild@0$" }, "inputs": { "description": "Build machine image inputs", @@ -12326,16 +12399,6 @@ "description": "Azure subscription", "ignoreCase": "key" }, - "isManagedImage": { - "type": "boolean", - "description": "Managed VM disk image", - "ignoreCase": "key" - }, - "managedImageName": { - "type": "string", - "description": "Managed VM Disk Image Name ", - "ignoreCase": "key" - }, "location": { "type": "string", "description": "Storage location", @@ -12369,7 +12432,6 @@ "MicrosoftWindowsServer:WindowsServer:2008-R2-SP1:windows", "Canonical:UbuntuServer:14.04.4-LTS:linux", "Canonical:UbuntuServer:16.04-LTS:linux", - "Canonical:UbuntuServer:18.04-LTS:linux", "RedHat:RHEL:7.2:linux", "RedHat:RHEL:6.8:linux", "OpenLogic:CentOS:7.2:linux", @@ -12419,19 +12481,9 @@ "description": "Skip temporary file cleanup during deprovision", "ignoreCase": "key" }, - "packerVersion": { - "type": "string", - "description": "Packer Version", - "ignoreCase": "key" - }, "imageUri": { "type": "string", - "description": "Image URL or Name", - "ignoreCase": "key" - }, - "imageId": { - "type": "string", - "description": "Azure Resource Id", + "description": "Image URL", "ignoreCase": "key" } }, @@ -14968,30 +15020,39 @@ { "properties": { "task": { - "description": "Mobile Center Test\n\nTest mobile app packages with Visual Studio Mobile Center.", + "description": "App Center test\n\nTest app packages with Visual Studio App Center", "ignoreCase": "value", - "pattern": "^VSMobileCenterTest@0$" + "pattern": "^AppCenterTest@1$" }, "inputs": { - "description": "Mobile Center Test inputs", + "description": "App Center test inputs", "properties": { - "app": { + "appFile": { "type": "string", - "description": "Binary Application File Path", - "ignoreCase": "key" + "description": "Binary application file path", + "ignoreCase": "key", + "aliases": [ + "app" + ] }, - "artifactsDir": { + "artifactsDirectory": { "type": "string", - "description": "Artifacts Directory", - "ignoreCase": "key" + "description": "Artifacts directory", + "ignoreCase": "key", + "aliases": [ + "artifactsDir" + ] }, - "enablePrepare": { + "prepareTests": { "type": "boolean", - "description": "Prepare Tests", - "ignoreCase": "key" + "description": "Prepare tests", + "ignoreCase": "key", + "aliases": [ + "enablePrepare" + ] }, - "framework": { - "description": "Test Framework", + "frameworkOption": { + "description": "Test framework", "ignoreCase": "all", "enum": [ "appium", @@ -14999,31 +15060,46 @@ "calabash", "uitest", "xcuitest" + ], + "aliases": [ + "framework" ] }, - "appiumBuildDir": { + "appiumBuildDirectory": { "type": "string", - "description": "Build Directory", - "ignoreCase": "key" + "description": "Build directory", + "ignoreCase": "key", + "aliases": [ + "appiumBuildDir" + ] }, - "espressoBuildDir": { + "espressoBuildDirectory": { "type": "string", - "description": "Build Directory", - "ignoreCase": "key" + "description": "Build directory", + "ignoreCase": "key", + "aliases": [ + "espressoBuildDir" + ] }, - "espressoTestApkPath": { + "espressoTestApkFile": { "type": "string", - "description": "Test APK Path", - "ignoreCase": "key" + "description": "Test APK path", + "ignoreCase": "key", + "aliases": [ + "espressoTestApkPath" + ] }, - "calabashProjectDir": { + "calabashProjectDirectory": { "type": "string", - "description": "Project Directory", - "ignoreCase": "key" + "description": "Project directory", + "ignoreCase": "key", + "aliases": [ + "calabashProjectDir" + ] }, "calabashConfigFile": { "type": "string", - "description": "Cucumber Config File", + "description": "Cucumber config file", "ignoreCase": "key" }, "calabashProfile": { @@ -15036,87 +15112,114 @@ "description": "Skip Configuration Check", "ignoreCase": "key" }, - "uitestBuildDir": { + "uiTestBuildDirectory": { "type": "string", - "description": "Build Directory", - "ignoreCase": "key" + "description": "Build directory", + "ignoreCase": "key", + "aliases": [ + "uitestBuildDir" + ] }, - "uitestStoreFile": { + "uitestStorePath": { "type": "string", - "description": "Store File", + "description": "Store file", "ignoreCase": "key" }, - "uitestStorePass": { + "uiTestStorePassword": { "type": "string", - "description": "Store Password", - "ignoreCase": "key" + "description": "Store password", + "ignoreCase": "key", + "aliases": [ + "uitestStorePass" + ] }, "uitestKeyAlias": { "type": "string", - "description": "Key Alias", + "description": "Key alias", "ignoreCase": "key" }, - "uitestKeyPass": { + "uiTestKeyPassword": { "type": "string", - "description": "Key Password", - "ignoreCase": "key" + "description": "Key password", + "ignoreCase": "key", + "aliases": [ + "uitestKeyPass" + ] }, - "uitestToolsDir": { + "uiTestToolsDirectory": { "type": "string", - "description": "Test Tools Directory", - "ignoreCase": "key" + "description": "Test tools directory", + "ignoreCase": "key", + "aliases": [ + "uitestToolsDir" + ] }, "signInfo": { "type": "string", - "description": "Signing Information", + "description": "Signing information", "ignoreCase": "key" }, - "xcuitestBuildDir": { + "xcUITestBuildDirectory": { "type": "string", - "description": "Build Directory", - "ignoreCase": "key" + "description": "Build directory", + "ignoreCase": "key", + "aliases": [ + "xcuitestBuildDir" + ] }, - "xcuitestTestIpaPath": { + "xcUITestIpaFile": { "type": "string", - "description": "Test IPA Path", - "ignoreCase": "key" + "description": "Test IPA path", + "ignoreCase": "key", + "aliases": [ + "xcuitestTestIpaPath" + ] }, - "prepareOpts": { + "prepareOptions": { "type": "string", - "description": "Additional Options", - "ignoreCase": "key" + "description": "Additional options", + "ignoreCase": "key", + "aliases": [ + "prepareOpts" + ] }, - "enableRun": { + "runTests": { "type": "boolean", - "description": "Run Tests", - "ignoreCase": "key" + "description": "Run tests", + "ignoreCase": "key", + "aliases": [ + "enableRun" + ] }, - "credsType": { - "description": "Authentication Method", + "credentialsOption": { + "description": "Authentication method", "ignoreCase": "all", "enum": [ "serviceEndpoint", "inputs" + ], + "aliases": [ + "credsType" ] }, "serverEndpoint": { "type": "string", - "description": "Mobile Center Connection", + "description": "App Center service connection", "ignoreCase": "key" }, "username": { "type": "string", - "description": "Mobile Center Username", + "description": "App Center username", "ignoreCase": "key" }, "password": { "type": "string", - "description": "Mobile Center Password", + "description": "App Center password", "ignoreCase": "key" }, "appSlug": { "type": "string", - "description": "App Slug", + "description": "App slug", "ignoreCase": "key" }, "devices": { @@ -15126,16 +15229,19 @@ }, "series": { "type": "string", - "description": "Test Series", + "description": "Test series", "ignoreCase": "key" }, - "dsymDir": { + "dsymDirectory": { "type": "string", - "description": "dSYM Directory", - "ignoreCase": "key" + "description": "dSYM directory", + "ignoreCase": "key", + "aliases": [ + "dsymDir" + ] }, - "locale": { - "description": "System Language", + "localeOption": { + "description": "System language", "ignoreCase": "all", "enum": [ "da_DK", @@ -15149,42 +15255,60 @@ "es_MX", "es_ES", "user" + ], + "aliases": [ + "locale" ] }, "userDefinedLocale": { "type": "string", - "description": "Other Locale", + "description": "Other locale", "ignoreCase": "key" }, - "loginOpts": { + "loginOptions": { "type": "string", - "description": "Addtional Options for Login", - "ignoreCase": "key" + "description": "Additional options for login", + "ignoreCase": "key", + "aliases": [ + "loginOpts" + ] }, - "runOpts": { + "runOptions": { "type": "string", - "description": "Additional Options for Run", - "ignoreCase": "key" + "description": "Additional options for run", + "ignoreCase": "key", + "aliases": [ + "runOpts" + ] }, - "async": { + "skipWaitingForResults": { "type": "boolean", "description": "Do not wait for test result", - "ignoreCase": "key" + "ignoreCase": "key", + "aliases": [ + "async" + ] }, - "cliLocationOverride": { + "cliFile": { "type": "string", - "description": "mobile-center CLI Location", - "ignoreCase": "key" + "description": "App Center CLI location", + "ignoreCase": "key", + "aliases": [ + "cliLocationOverride" + ] }, - "debug": { + "showDebugOutput": { "type": "boolean", - "description": "Enable Debug Output", - "ignoreCase": "key" + "description": "Enable debug output", + "ignoreCase": "key", + "aliases": [ + "debug" + ] } }, "additionalProperties": false, "required": [ - "app" + "appFile" ] } }, @@ -15200,39 +15324,30 @@ { "properties": { "task": { - "description": "App Center test\n\nTest app packages with Visual Studio App Center", + "description": "Mobile Center Test\n\nTest mobile app packages with Visual Studio Mobile Center.", "ignoreCase": "value", - "pattern": "^AppCenterTest@1$" + "pattern": "^VSMobileCenterTest@0$" }, "inputs": { - "description": "App Center test inputs", + "description": "Mobile Center Test inputs", "properties": { - "appFile": { + "app": { "type": "string", - "description": "Binary application file path", - "ignoreCase": "key", - "aliases": [ - "app" - ] + "description": "Binary Application File Path", + "ignoreCase": "key" }, - "artifactsDirectory": { + "artifactsDir": { "type": "string", - "description": "Artifacts directory", - "ignoreCase": "key", - "aliases": [ - "artifactsDir" - ] + "description": "Artifacts Directory", + "ignoreCase": "key" }, - "prepareTests": { + "enablePrepare": { "type": "boolean", - "description": "Prepare tests", - "ignoreCase": "key", - "aliases": [ - "enablePrepare" - ] + "description": "Prepare Tests", + "ignoreCase": "key" }, - "frameworkOption": { - "description": "Test framework", + "framework": { + "description": "Test Framework", "ignoreCase": "all", "enum": [ "appium", @@ -15240,46 +15355,31 @@ "calabash", "uitest", "xcuitest" - ], - "aliases": [ - "framework" ] }, - "appiumBuildDirectory": { + "appiumBuildDir": { "type": "string", - "description": "Build directory", - "ignoreCase": "key", - "aliases": [ - "appiumBuildDir" - ] + "description": "Build Directory", + "ignoreCase": "key" }, - "espressoBuildDirectory": { + "espressoBuildDir": { "type": "string", - "description": "Build directory", - "ignoreCase": "key", - "aliases": [ - "espressoBuildDir" - ] + "description": "Build Directory", + "ignoreCase": "key" }, - "espressoTestApkFile": { + "espressoTestApkPath": { "type": "string", - "description": "Test APK path", - "ignoreCase": "key", - "aliases": [ - "espressoTestApkPath" - ] + "description": "Test APK Path", + "ignoreCase": "key" }, - "calabashProjectDirectory": { + "calabashProjectDir": { "type": "string", - "description": "Project directory", - "ignoreCase": "key", - "aliases": [ - "calabashProjectDir" - ] + "description": "Project Directory", + "ignoreCase": "key" }, "calabashConfigFile": { "type": "string", - "description": "Cucumber config file", + "description": "Cucumber Config File", "ignoreCase": "key" }, "calabashProfile": { @@ -15292,114 +15392,87 @@ "description": "Skip Configuration Check", "ignoreCase": "key" }, - "uiTestBuildDirectory": { + "uitestBuildDir": { "type": "string", - "description": "Build directory", - "ignoreCase": "key", - "aliases": [ - "uitestBuildDir" - ] + "description": "Build Directory", + "ignoreCase": "key" }, - "uitestStorePath": { + "uitestStoreFile": { "type": "string", - "description": "Store file", + "description": "Store File", "ignoreCase": "key" }, - "uiTestStorePassword": { + "uitestStorePass": { "type": "string", - "description": "Store password", - "ignoreCase": "key", - "aliases": [ - "uitestStorePass" - ] + "description": "Store Password", + "ignoreCase": "key" }, "uitestKeyAlias": { "type": "string", - "description": "Key alias", + "description": "Key Alias", "ignoreCase": "key" }, - "uiTestKeyPassword": { + "uitestKeyPass": { "type": "string", - "description": "Key password", - "ignoreCase": "key", - "aliases": [ - "uitestKeyPass" - ] + "description": "Key Password", + "ignoreCase": "key" }, - "uiTestToolsDirectory": { + "uitestToolsDir": { "type": "string", - "description": "Test tools directory", - "ignoreCase": "key", - "aliases": [ - "uitestToolsDir" - ] + "description": "Test Tools Directory", + "ignoreCase": "key" }, "signInfo": { "type": "string", - "description": "Signing information", + "description": "Signing Information", "ignoreCase": "key" }, - "xcUITestBuildDirectory": { + "xcuitestBuildDir": { "type": "string", - "description": "Build directory", - "ignoreCase": "key", - "aliases": [ - "xcuitestBuildDir" - ] + "description": "Build Directory", + "ignoreCase": "key" }, - "xcUITestIpaFile": { + "xcuitestTestIpaPath": { "type": "string", - "description": "Test IPA path", - "ignoreCase": "key", - "aliases": [ - "xcuitestTestIpaPath" - ] + "description": "Test IPA Path", + "ignoreCase": "key" }, - "prepareOptions": { + "prepareOpts": { "type": "string", - "description": "Additional options", - "ignoreCase": "key", - "aliases": [ - "prepareOpts" - ] + "description": "Additional Options", + "ignoreCase": "key" }, - "runTests": { + "enableRun": { "type": "boolean", - "description": "Run tests", - "ignoreCase": "key", - "aliases": [ - "enableRun" - ] + "description": "Run Tests", + "ignoreCase": "key" }, - "credentialsOption": { - "description": "Authentication method", + "credsType": { + "description": "Authentication Method", "ignoreCase": "all", "enum": [ "serviceEndpoint", "inputs" - ], - "aliases": [ - "credsType" ] }, "serverEndpoint": { "type": "string", - "description": "App Center service connection", + "description": "Mobile Center Connection", "ignoreCase": "key" }, "username": { "type": "string", - "description": "App Center username", + "description": "Mobile Center Username", "ignoreCase": "key" }, "password": { "type": "string", - "description": "App Center password", + "description": "Mobile Center Password", "ignoreCase": "key" }, "appSlug": { "type": "string", - "description": "App slug", + "description": "App Slug", "ignoreCase": "key" }, "devices": { @@ -15409,19 +15482,16 @@ }, "series": { "type": "string", - "description": "Test series", + "description": "Test Series", "ignoreCase": "key" }, - "dsymDirectory": { + "dsymDir": { "type": "string", - "description": "dSYM directory", - "ignoreCase": "key", - "aliases": [ - "dsymDir" - ] + "description": "dSYM Directory", + "ignoreCase": "key" }, - "localeOption": { - "description": "System language", + "locale": { + "description": "System Language", "ignoreCase": "all", "enum": [ "da_DK", @@ -15435,60 +15505,42 @@ "es_MX", "es_ES", "user" - ], - "aliases": [ - "locale" ] }, "userDefinedLocale": { "type": "string", - "description": "Other locale", + "description": "Other Locale", "ignoreCase": "key" }, - "loginOptions": { + "loginOpts": { "type": "string", - "description": "Additional options for login", - "ignoreCase": "key", - "aliases": [ - "loginOpts" - ] + "description": "Addtional Options for Login", + "ignoreCase": "key" }, - "runOptions": { + "runOpts": { "type": "string", - "description": "Additional options for run", - "ignoreCase": "key", - "aliases": [ - "runOpts" - ] + "description": "Additional Options for Run", + "ignoreCase": "key" }, - "skipWaitingForResults": { + "async": { "type": "boolean", "description": "Do not wait for test result", - "ignoreCase": "key", - "aliases": [ - "async" - ] + "ignoreCase": "key" }, - "cliFile": { + "cliLocationOverride": { "type": "string", - "description": "App Center CLI location", - "ignoreCase": "key", - "aliases": [ - "cliLocationOverride" - ] + "description": "mobile-center CLI Location", + "ignoreCase": "key" }, - "showDebugOutput": { + "debug": { "type": "boolean", - "description": "Enable debug output", - "ignoreCase": "key", - "aliases": [ - "debug" - ] + "description": "Enable Debug Output", + "ignoreCase": "key" } }, "additionalProperties": false, "required": [ - "appFile" + "app" ] } }, @@ -15638,6 +15690,143 @@ "description": "Environment variables", "ignoreCase": "key" }, + "ingress": { + "type": "string", + "description": "Ingress setting", + "ignoreCase": "key" + }, + "yamlConfigPath": { + "type": "string", + "description": "YAML configuration file path", + "ignoreCase": "key" + }, + "disableTelemetry": { + "type": "boolean", + "description": "Disable telemetry", + "ignoreCase": "key" + } + }, + "additionalProperties": false, + "required": [ + "azureSubscription" + ] + } + }, + "doNotSuggest": false, + "firstProperty": [ + "task" + ], + "required": [ + "task", + "inputs" + ] + }, + { + "properties": { + "task": { + "description": "Azure Container Apps Deploy\n\nAn Azure DevOps Task to build and deploy Azure Container Apps.", + "ignoreCase": "value", + "pattern": "^AzureContainerApps@1$" + }, + "inputs": { + "description": "Azure Container Apps Deploy inputs", + "properties": { + "workingDirectory": { + "type": "string", + "description": "Working Directory", + "ignoreCase": "key", + "aliases": [ + "cwd" + ] + }, + "appSourcePath": { + "type": "string", + "description": "Application source path", + "ignoreCase": "key" + }, + "azureSubscription": { + "type": "string", + "description": "Azure Resource Manager connection", + "ignoreCase": "key", + "aliases": [ + "connectedServiceNameARM" + ] + }, + "acrName": { + "type": "string", + "description": "Azure Container Registry name", + "ignoreCase": "key" + }, + "acrUsername": { + "type": "string", + "description": "Azure Container Registry username", + "ignoreCase": "key" + }, + "acrPassword": { + "type": "string", + "description": "Azure Container Registry password", + "ignoreCase": "key" + }, + "dockerfilePath": { + "type": "string", + "description": "Dockerfile path", + "ignoreCase": "key" + }, + "imageToBuild": { + "type": "string", + "description": "Docker image to build", + "ignoreCase": "key" + }, + "imageToDeploy": { + "type": "string", + "description": "Docker image to deploy", + "ignoreCase": "key" + }, + "containerAppName": { + "type": "string", + "description": "Azure Container App name", + "ignoreCase": "key" + }, + "resourceGroup": { + "type": "string", + "description": "Azure resource group name", + "ignoreCase": "key" + }, + "containerAppEnvironment": { + "type": "string", + "description": "Azure Container App environment", + "ignoreCase": "key" + }, + "runtimeStack": { + "type": "string", + "description": "Application runtime stack", + "ignoreCase": "key" + }, + "targetPort": { + "type": "string", + "description": "Application target port", + "ignoreCase": "key" + }, + "location": { + "type": "string", + "description": "Location of the Container App", + "ignoreCase": "key" + }, + "environmentVariables": { + "type": "string", + "description": "Environment variables", + "ignoreCase": "key" + }, + "ingress": { + "type": "string", + "description": "Ingress setting", + "ignoreCase": "key" + }, + "yamlConfigPath": { + "type": "string", + "description": "YAML configuration file path", + "ignoreCase": "key" + }, "disableTelemetry": { "type": "boolean", "description": "Disable telemetry", @@ -16536,6 +16725,78 @@ "task" ] }, + { + "properties": { + "task": { + "description": "NuGet Restore\n\nRestores NuGet packages in preparation for a Visual Studio Build step.", + "ignoreCase": "value", + "pattern": "^NuGetRestore@1$" + }, + "inputs": { + "description": "NuGet Restore inputs", + "properties": { + "solution": { + "type": "string", + "description": "Path to solution, packages.config, or project.json", + "ignoreCase": "key" + }, + "selectOrConfig": { + "description": "Feeds to use", + "ignoreCase": "all", + "enum": [ + "select", + "config" + ] + }, + "feed": { + "type": "string", + "description": "Use packages from this Azure Artifacts feed", + "ignoreCase": "key" + }, + "includeNuGetOrg": { + "type": "boolean", + "description": "Use packages from NuGet.org", + "ignoreCase": "key" + }, + "nugetConfigPath": { + "type": "string", + "description": "Path to NuGet.config", + "ignoreCase": "key" + }, + "noCache": { + "type": "boolean", + "description": "Disable local cache", + "ignoreCase": "key" + }, + "packagesDirectory": { + "type": "string", + "description": "Destination directory", + "ignoreCase": "key" + }, + "verbosity": { + "description": "Verbosity", + "ignoreCase": "all", + "enum": [ + "-", + "Quiet", + "Normal", + "Detailed" + ] + } + }, + "additionalProperties": false, + "required": [] + } + }, + "deprecationMessage": "NuGetRestore is deprecated - Restores NuGet packages in preparation for a Visual Studio Build step.", + "doNotSuggest": true, + "firstProperty": [ + "task" + ], + "required": [ + "task" + ] + }, { "properties": { "task": { @@ -16870,7 +17131,8 @@ "required": [] } }, - "doNotSuggest": false, + "deprecationMessage": "NuGetInstaller is deprecated - Installs or restores missing NuGet packages. Use NuGetAuthenticate@0 task for latest capabilities.", + "doNotSuggest": true, "firstProperty": [ "task" ], @@ -16881,87 +17143,16 @@ { "properties": { "task": { - "description": "NuGet Restore\n\nRestores NuGet packages in preparation for a Visual Studio Build step.", + "description": "Delay\n\nDelay further execution of a workflow by a fixed time", "ignoreCase": "value", - "pattern": "^NuGetRestore@1$" + "pattern": "^Delay@1$" }, "inputs": { - "description": "NuGet Restore inputs", + "description": "Delay inputs", "properties": { - "solution": { - "type": "string", - "description": "Path to solution, packages.config, or project.json", - "ignoreCase": "key" - }, - "selectOrConfig": { - "description": "Feeds to use", - "ignoreCase": "all", - "enum": [ - "select", - "config" - ] - }, - "feed": { - "type": "string", - "description": "Use packages from this VSTS feed", - "ignoreCase": "key" - }, - "includeNuGetOrg": { - "type": "boolean", - "description": "Use packages from NuGet.org", - "ignoreCase": "key" - }, - "nugetConfigPath": { + "delayForMinutes": { "type": "string", - "description": "Path to NuGet.config", - "ignoreCase": "key" - }, - "noCache": { - "type": "boolean", - "description": "Disable local cache", - "ignoreCase": "key" - }, - "packagesDirectory": { - "type": "string", - "description": "Destination directory", - "ignoreCase": "key" - }, - "verbosity": { - "description": "Verbosity", - "ignoreCase": "all", - "enum": [ - "-", - "Quiet", - "Normal", - "Detailed" - ] - } - }, - "additionalProperties": false, - "required": [] - } - }, - "doNotSuggest": false, - "firstProperty": [ - "task" - ], - "required": [ - "task" - ] - }, - { - "properties": { - "task": { - "description": "Delay\n\nDelay further execution of a workflow by a fixed time", - "ignoreCase": "value", - "pattern": "^Delay@1$" - }, - "inputs": { - "description": "Delay inputs", - "properties": { - "delayForMinutes": { - "type": "string", - "description": "Delay Time (minutes)", + "description": "Delay Time (minutes)", "ignoreCase": "key" } }, @@ -17391,7 +17582,7 @@ "task": { "description": "Azure file copy\n\nCopy files to Azure Blob Storage or virtual machines", "ignoreCase": "value", - "pattern": "^AzureFileCopy@1$" + "pattern": "^AzureFileCopy@2$" }, "inputs": { "description": "Azure file copy inputs", @@ -17506,9 +17697,14 @@ "description": "Destination Folder", "ignoreCase": "key" }, - "AdditionalArguments": { + "AdditionalArgumentsForBlobCopy": { "type": "string", - "description": "Additional Arguments", + "description": "Optional Arguments (for uploading files to blob)", + "ignoreCase": "key" + }, + "AdditionalArgumentsForVMCopy": { + "type": "string", + "description": "Optional Arguments (for downloading files to VM)", "ignoreCase": "key" }, "enableCopyPrerequisites": { @@ -17841,7 +18037,7 @@ "task": { "description": "Azure file copy\n\nCopy files to Azure Blob Storage or virtual machines", "ignoreCase": "value", - "pattern": "^AzureFileCopy@2$" + "pattern": "^AzureFileCopy@1$" }, "inputs": { "description": "Azure file copy inputs", @@ -17956,14 +18152,9 @@ "description": "Destination Folder", "ignoreCase": "key" }, - "AdditionalArgumentsForBlobCopy": { - "type": "string", - "description": "Optional Arguments (for uploading files to blob)", - "ignoreCase": "key" - }, - "AdditionalArgumentsForVMCopy": { + "AdditionalArguments": { "type": "string", - "description": "Optional Arguments (for downloading files to VM)", + "description": "Additional Arguments", "ignoreCase": "key" }, "enableCopyPrerequisites": { @@ -18428,7 +18619,7 @@ "task": { "description": "Gradle\n\nBuild using a Gradle wrapper script", "ignoreCase": "value", - "pattern": "^Gradle@2$" + "pattern": "^Gradle@3$" }, "inputs": { "description": "Gradle inputs", @@ -18663,27 +18854,19 @@ "task": { "description": "Gradle\n\nBuild using a Gradle wrapper script", "ignoreCase": "value", - "pattern": "^Gradle@3$" + "pattern": "^Gradle@1$" }, "inputs": { "description": "Gradle inputs", "properties": { "gradleWrapperFile": { "type": "string", - "description": "Gradle wrapper", + "description": "Gradle Wrapper", "ignoreCase": "key", "aliases": [ "wrapperScript" ] }, - "workingDirectory": { - "type": "string", - "description": "Working directory", - "ignoreCase": "key", - "aliases": [ - "cwd" - ] - }, "options": { "type": "string", "description": "Options", @@ -18694,23 +18877,31 @@ "description": "Tasks", "ignoreCase": "key" }, + "workingDirectory": { + "type": "string", + "description": "Working Directory", + "ignoreCase": "key", + "aliases": [ + "cwd" + ] + }, "publishJUnitResults": { "type": "boolean", - "description": "Publish to Azure Pipelines", + "description": "Publish to TFS/Team Services", "ignoreCase": "key" }, "testResultsFiles": { "type": "string", - "description": "Test results files", + "description": "Test Results Files", "ignoreCase": "key" }, "testRunTitle": { "type": "string", - "description": "Test run title", + "description": "Test Run Title", "ignoreCase": "key" }, "codeCoverageToolOption": { - "description": "Code coverage tool", + "description": "Code Coverage Tool", "ignoreCase": "all", "enum": [ "None", @@ -18723,7 +18914,7 @@ }, "codeCoverageClassFilesDirectories": { "type": "string", - "description": "Class files directories", + "description": "Class Files Directories", "ignoreCase": "key", "aliases": [ "classFilesDirectories" @@ -18731,7 +18922,7 @@ }, "codeCoverageClassFilter": { "type": "string", - "description": "Class inclusion/exclusion filters", + "description": "Class Inclusion/Exclusion Filters", "ignoreCase": "key", "aliases": [ "classFilter" @@ -18739,20 +18930,12 @@ }, "codeCoverageFailIfEmpty": { "type": "boolean", - "description": "Fail when code coverage results are missing", + "description": "Fail When Code Coverage Results Are Missing", "ignoreCase": "key", "aliases": [ "failIfCoverageEmpty" ] }, - "codeCoverageGradle5xOrHigher": { - "type": "boolean", - "description": "Gradle version >= 5.x", - "ignoreCase": "key", - "aliases": [ - "gradle5xOrHigher" - ] - }, "javaHomeOption": { "description": "Set JAVA_HOME by", "ignoreCase": "all", @@ -18765,13 +18948,10 @@ ] }, "jdkVersionOption": { - "description": "JDK version", + "description": "JDK Version", "ignoreCase": "all", "enum": [ "default", - "1.17", - "1.11", - "1.10", "1.9", "1.8", "1.7", @@ -18783,14 +18963,14 @@ }, "jdkDirectory": { "type": "string", - "description": "JDK path", + "description": "JDK Path", "ignoreCase": "key", "aliases": [ "jdkUserInputPath" ] }, "jdkArchitectureOption": { - "description": "JDK architecture", + "description": "JDK Architecture", "ignoreCase": "all", "enum": [ "x86", @@ -18810,74 +18990,122 @@ }, "sonarQubeRunAnalysis": { "type": "boolean", - "description": "Run SonarQube or SonarCloud Analysis", + "description": "Run SonarQube Analysis", "ignoreCase": "key", "aliases": [ "sqAnalysisEnabled" ] }, - "sqGradlePluginVersionChoice": { - "description": "SonarQube scanner for Gradle version", - "ignoreCase": "all", - "enum": [ - "specify", - "build" + "sonarQubeServiceEndpoint": { + "type": "string", + "description": "SonarQube Endpoint", + "ignoreCase": "key", + "aliases": [ + "sqConnectedServiceName" + ] + }, + "sonarQubeProjectName": { + "type": "string", + "description": "SonarQube Project Name", + "ignoreCase": "key", + "aliases": [ + "sqProjectName" + ] + }, + "sonarQubeProjectKey": { + "type": "string", + "description": "SonarQube Project Key", + "ignoreCase": "key", + "aliases": [ + "sqProjectKey" + ] + }, + "sonarQubeProjectVersion": { + "type": "string", + "description": "SonarQube Project Version", + "ignoreCase": "key", + "aliases": [ + "sqProjectVersion" ] }, "sonarQubeGradlePluginVersion": { "type": "string", - "description": "SonarQube scanner for Gradle plugin version", + "description": "SonarQube Gradle Plugin Version", "ignoreCase": "key", "aliases": [ "sqGradlePluginVersion" ] }, - "checkStyleRunAnalysis": { + "sonarQubeSpecifyDB": { "type": "boolean", - "description": "Run Checkstyle", + "description": "The SonarQube server version is lower than 5.2", "ignoreCase": "key", "aliases": [ - "checkstyleAnalysisEnabled" + "sqDbDetailsRequired" ] }, - "findBugsRunAnalysis": { + "sonarQubeDBUrl": { + "type": "string", + "description": "Db Connection String", + "ignoreCase": "key", + "aliases": [ + "sqDbUrl" + ] + }, + "sonarQubeDBUsername": { + "type": "string", + "description": "Db Username", + "ignoreCase": "key", + "aliases": [ + "sqDbUsername" + ] + }, + "sonarQubeDBPassword": { + "type": "string", + "description": "Db User Password", + "ignoreCase": "key", + "aliases": [ + "sqDbPassword" + ] + }, + "sonarQubeIncludeFullReport": { "type": "boolean", - "description": "Run FindBugs", + "description": "Include full analysis report in the build summary (SQ 5.3+)", "ignoreCase": "key", "aliases": [ - "findbugsAnalysisEnabled" + "sqAnalysisIncludeFullReport" ] }, - "pmdRunAnalysis": { + "sonarQubeFailWhenQualityGateFails": { "type": "boolean", - "description": "Run PMD", + "description": "Fail the build on quality gate failure (SQ 5.3+)", "ignoreCase": "key", "aliases": [ - "pmdAnalysisEnabled" + "sqAnalysisBreakBuildIfQualityGateFailed" ] }, - "spotBugsAnalysis": { + "checkStyleRunAnalysis": { "type": "boolean", - "description": "Run SpotBugs", + "description": "Run Checkstyle", "ignoreCase": "key", "aliases": [ - "spotBugsAnalysisEnabled" + "checkstyleAnalysisEnabled" ] }, - "spotBugsGradlePluginVersionChoice": { - "description": "Spotbugs plugin version", - "ignoreCase": "all", - "enum": [ - "specify", - "build" + "findBugsRunAnalysis": { + "type": "boolean", + "description": "Run FindBugs", + "ignoreCase": "key", + "aliases": [ + "findbugsAnalysisEnabled" ] }, - "spotbugsGradlePluginVersion": { - "type": "string", - "description": "Version number", + "pmdRunAnalysis": { + "type": "boolean", + "description": "Run PMD", "ignoreCase": "key", "aliases": [ - "spotbugsGradlePluginVersion" + "pmdAnalysisEnabled" ] } }, @@ -18898,19 +19126,27 @@ "task": { "description": "Gradle\n\nBuild using a Gradle wrapper script", "ignoreCase": "value", - "pattern": "^Gradle@1$" + "pattern": "^Gradle@2$" }, "inputs": { "description": "Gradle inputs", "properties": { "gradleWrapperFile": { "type": "string", - "description": "Gradle Wrapper", + "description": "Gradle wrapper", "ignoreCase": "key", "aliases": [ "wrapperScript" ] }, + "workingDirectory": { + "type": "string", + "description": "Working directory", + "ignoreCase": "key", + "aliases": [ + "cwd" + ] + }, "options": { "type": "string", "description": "Options", @@ -18921,31 +19157,23 @@ "description": "Tasks", "ignoreCase": "key" }, - "workingDirectory": { - "type": "string", - "description": "Working Directory", - "ignoreCase": "key", - "aliases": [ - "cwd" - ] - }, "publishJUnitResults": { "type": "boolean", - "description": "Publish to TFS/Team Services", + "description": "Publish to Azure Pipelines", "ignoreCase": "key" }, "testResultsFiles": { "type": "string", - "description": "Test Results Files", + "description": "Test results files", "ignoreCase": "key" }, "testRunTitle": { "type": "string", - "description": "Test Run Title", + "description": "Test run title", "ignoreCase": "key" }, "codeCoverageToolOption": { - "description": "Code Coverage Tool", + "description": "Code coverage tool", "ignoreCase": "all", "enum": [ "None", @@ -18958,7 +19186,7 @@ }, "codeCoverageClassFilesDirectories": { "type": "string", - "description": "Class Files Directories", + "description": "Class files directories", "ignoreCase": "key", "aliases": [ "classFilesDirectories" @@ -18966,7 +19194,7 @@ }, "codeCoverageClassFilter": { "type": "string", - "description": "Class Inclusion/Exclusion Filters", + "description": "Class inclusion/exclusion filters", "ignoreCase": "key", "aliases": [ "classFilter" @@ -18974,12 +19202,20 @@ }, "codeCoverageFailIfEmpty": { "type": "boolean", - "description": "Fail When Code Coverage Results Are Missing", + "description": "Fail when code coverage results are missing", "ignoreCase": "key", "aliases": [ "failIfCoverageEmpty" ] }, + "codeCoverageGradle5xOrHigher": { + "type": "boolean", + "description": "Gradle version >= 5.x", + "ignoreCase": "key", + "aliases": [ + "gradle5xOrHigher" + ] + }, "javaHomeOption": { "description": "Set JAVA_HOME by", "ignoreCase": "all", @@ -18992,10 +19228,13 @@ ] }, "jdkVersionOption": { - "description": "JDK Version", + "description": "JDK version", "ignoreCase": "all", "enum": [ "default", + "1.17", + "1.11", + "1.10", "1.9", "1.8", "1.7", @@ -19007,14 +19246,14 @@ }, "jdkDirectory": { "type": "string", - "description": "JDK Path", + "description": "JDK path", "ignoreCase": "key", "aliases": [ "jdkUserInputPath" ] }, "jdkArchitectureOption": { - "description": "JDK Architecture", + "description": "JDK architecture", "ignoreCase": "all", "enum": [ "x86", @@ -19034,122 +19273,74 @@ }, "sonarQubeRunAnalysis": { "type": "boolean", - "description": "Run SonarQube Analysis", + "description": "Run SonarQube or SonarCloud Analysis", "ignoreCase": "key", "aliases": [ "sqAnalysisEnabled" ] }, - "sonarQubeServiceEndpoint": { - "type": "string", - "description": "SonarQube Endpoint", - "ignoreCase": "key", - "aliases": [ - "sqConnectedServiceName" - ] - }, - "sonarQubeProjectName": { - "type": "string", - "description": "SonarQube Project Name", - "ignoreCase": "key", - "aliases": [ - "sqProjectName" - ] - }, - "sonarQubeProjectKey": { - "type": "string", - "description": "SonarQube Project Key", - "ignoreCase": "key", - "aliases": [ - "sqProjectKey" - ] - }, - "sonarQubeProjectVersion": { - "type": "string", - "description": "SonarQube Project Version", - "ignoreCase": "key", - "aliases": [ - "sqProjectVersion" + "sqGradlePluginVersionChoice": { + "description": "SonarQube scanner for Gradle version", + "ignoreCase": "all", + "enum": [ + "specify", + "build" ] }, "sonarQubeGradlePluginVersion": { "type": "string", - "description": "SonarQube Gradle Plugin Version", + "description": "SonarQube scanner for Gradle plugin version", "ignoreCase": "key", "aliases": [ "sqGradlePluginVersion" ] }, - "sonarQubeSpecifyDB": { + "checkStyleRunAnalysis": { "type": "boolean", - "description": "The SonarQube server version is lower than 5.2", - "ignoreCase": "key", - "aliases": [ - "sqDbDetailsRequired" - ] - }, - "sonarQubeDBUrl": { - "type": "string", - "description": "Db Connection String", - "ignoreCase": "key", - "aliases": [ - "sqDbUrl" - ] - }, - "sonarQubeDBUsername": { - "type": "string", - "description": "Db Username", - "ignoreCase": "key", - "aliases": [ - "sqDbUsername" - ] - }, - "sonarQubeDBPassword": { - "type": "string", - "description": "Db User Password", + "description": "Run Checkstyle", "ignoreCase": "key", "aliases": [ - "sqDbPassword" + "checkstyleAnalysisEnabled" ] }, - "sonarQubeIncludeFullReport": { + "findBugsRunAnalysis": { "type": "boolean", - "description": "Include full analysis report in the build summary (SQ 5.3+)", + "description": "Run FindBugs", "ignoreCase": "key", "aliases": [ - "sqAnalysisIncludeFullReport" + "findbugsAnalysisEnabled" ] }, - "sonarQubeFailWhenQualityGateFails": { + "pmdRunAnalysis": { "type": "boolean", - "description": "Fail the build on quality gate failure (SQ 5.3+)", + "description": "Run PMD", "ignoreCase": "key", "aliases": [ - "sqAnalysisBreakBuildIfQualityGateFailed" + "pmdAnalysisEnabled" ] }, - "checkStyleRunAnalysis": { + "spotBugsAnalysis": { "type": "boolean", - "description": "Run Checkstyle", + "description": "Run SpotBugs", "ignoreCase": "key", "aliases": [ - "checkstyleAnalysisEnabled" + "spotBugsAnalysisEnabled" ] }, - "findBugsRunAnalysis": { - "type": "boolean", - "description": "Run FindBugs", - "ignoreCase": "key", - "aliases": [ - "findbugsAnalysisEnabled" + "spotBugsGradlePluginVersionChoice": { + "description": "Spotbugs plugin version", + "ignoreCase": "all", + "enum": [ + "specify", + "build" ] }, - "pmdRunAnalysis": { - "type": "boolean", - "description": "Run PMD", + "spotbugsGradlePluginVersion": { + "type": "string", + "description": "Version number", "ignoreCase": "key", "aliases": [ - "pmdAnalysisEnabled" + "spotbugsGradlePluginVersion" ] } }, @@ -19170,7 +19361,7 @@ "task": { "description": "App Center distribute\n\nDistribute app builds to testers and users via Visual Studio App Center", "ignoreCase": "value", - "pattern": "^AppCenterDistribute@2$" + "pattern": "^AppCenterDistribute@3$" }, "inputs": { "description": "App Center distribute inputs", @@ -19193,11 +19384,18 @@ "app" ] }, + "buildVersion": { + "type": "string", + "description": "Build version", + "ignoreCase": "key" + }, "symbolsOption": { "description": "Symbols type", "ignoreCase": "all", "enum": [ - "Apple" + "Apple", + "Android", + "UWP" ], "aliases": [ "symbolsType" @@ -19208,13 +19406,10 @@ "description": "Symbols path", "ignoreCase": "key" }, - "symbolsPdbFiles": { + "appxsymPath": { "type": "string", - "description": "Symbols path (*.pdb)", - "ignoreCase": "key", - "aliases": [ - "pdbPath" - ] + "description": "Symbols path (*.appxsym)", + "ignoreCase": "key" }, "symbolsDsymFiles": { "type": "string", @@ -19232,6 +19427,11 @@ "mappingTxtPath" ] }, + "nativeLibrariesPath": { + "type": "string", + "description": "Native Library File Path", + "ignoreCase": "key" + }, "symbolsIncludeParentDirectory": { "type": "boolean", "description": "Include all items in parent folder", @@ -19266,14 +19466,31 @@ "description": "Require users to update to this release", "ignoreCase": "key" }, + "destinationType": { + "description": "Release destination", + "ignoreCase": "all", + "enum": [ + "groups", + "store" + ] + }, "distributionGroupId": { "type": "string", "description": "Destination IDs", "ignoreCase": "key", "aliases": [ - "destinationIds", - "destinationId" + "destinationGroupIds" ] + }, + "destinationStoreId": { + "type": "string", + "description": "Destination ID", + "ignoreCase": "key" + }, + "isSilent": { + "type": "boolean", + "description": "Do not notify testers. Release will still be available to install.", + "ignoreCase": "key" } }, "additionalProperties": false, @@ -19284,8 +19501,7 @@ ] } }, - "deprecationMessage": "AppCenterDistribute is deprecated - Distribute app builds to testers and users via Visual Studio App Center", - "doNotSuggest": true, + "doNotSuggest": false, "firstProperty": [ "task" ], @@ -19299,7 +19515,7 @@ "task": { "description": "App Center distribute\n\nDistribute app builds to testers and users via Visual Studio App Center", "ignoreCase": "value", - "pattern": "^AppCenterDistribute@1$" + "pattern": "^AppCenterDistribute@2$" }, "inputs": { "description": "App Center distribute inputs", @@ -19397,9 +19613,10 @@ }, "distributionGroupId": { "type": "string", - "description": "Destination ID", + "description": "Destination IDs", "ignoreCase": "key", "aliases": [ + "destinationIds", "destinationId" ] } @@ -19425,16 +19642,16 @@ { "properties": { "task": { - "description": "App Center distribute\n\nDistribute app builds to testers and users via Visual Studio App Center", + "description": "App Center Distribute\n\nDistribute app builds to testers and users via App Center", "ignoreCase": "value", - "pattern": "^AppCenterDistribute@3$" + "pattern": "^AppCenterDistribute@0$" }, "inputs": { - "description": "App Center distribute inputs", + "description": "App Center Distribute inputs", "properties": { "serverEndpoint": { "type": "string", - "description": "App Center service connection", + "description": "App Center connection", "ignoreCase": "key" }, "appSlug": { @@ -19450,18 +19667,11 @@ "app" ] }, - "buildVersion": { - "type": "string", - "description": "Build version", - "ignoreCase": "key" - }, "symbolsOption": { "description": "Symbols type", "ignoreCase": "all", "enum": [ - "Apple", - "Android", - "UWP" + "Apple" ], "aliases": [ "symbolsType" @@ -19472,10 +19682,13 @@ "description": "Symbols path", "ignoreCase": "key" }, - "appxsymPath": { + "symbolsPdbFiles": { "type": "string", - "description": "Symbols path (*.appxsym)", - "ignoreCase": "key" + "description": "Symbols path (*.pdb)", + "ignoreCase": "key", + "aliases": [ + "pdbPath" + ] }, "symbolsDsymFiles": { "type": "string", @@ -19493,11 +19706,6 @@ "mappingTxtPath" ] }, - "nativeLibrariesPath": { - "type": "string", - "description": "Native Library File Path", - "ignoreCase": "key" - }, "symbolsIncludeParentDirectory": { "type": "boolean", "description": "Include all items in parent folder", @@ -19527,35 +19735,9 @@ "description": "Release notes file", "ignoreCase": "key" }, - "isMandatory": { - "type": "boolean", - "description": "Require users to update to this release", - "ignoreCase": "key" - }, - "destinationType": { - "description": "Release destination", - "ignoreCase": "all", - "enum": [ - "groups", - "store" - ] - }, "distributionGroupId": { "type": "string", - "description": "Destination IDs", - "ignoreCase": "key", - "aliases": [ - "destinationGroupIds" - ] - }, - "destinationStoreId": { - "type": "string", - "description": "Destination ID", - "ignoreCase": "key" - }, - "isSilent": { - "type": "boolean", - "description": "Do not notify testers. Release will still be available to install.", + "description": "Distribution group ID", "ignoreCase": "key" } }, @@ -19579,16 +19761,16 @@ { "properties": { "task": { - "description": "App Center Distribute\n\nDistribute app builds to testers and users via App Center", + "description": "App Center distribute\n\nDistribute app builds to testers and users via Visual Studio App Center", "ignoreCase": "value", - "pattern": "^AppCenterDistribute@0$" + "pattern": "^AppCenterDistribute@1$" }, "inputs": { - "description": "App Center Distribute inputs", + "description": "App Center distribute inputs", "properties": { "serverEndpoint": { "type": "string", - "description": "App Center connection", + "description": "App Center service connection", "ignoreCase": "key" }, "appSlug": { @@ -19672,11 +19854,19 @@ "description": "Release notes file", "ignoreCase": "key" }, + "isMandatory": { + "type": "boolean", + "description": "Require users to update to this release", + "ignoreCase": "key" + }, "distributionGroupId": { "type": "string", - "description": "Distribution group ID", - "ignoreCase": "key" - } + "description": "Destination ID", + "ignoreCase": "key", + "aliases": [ + "destinationId" + ] + } }, "additionalProperties": false, "required": [ @@ -19686,7 +19876,8 @@ ] } }, - "doNotSuggest": false, + "deprecationMessage": "AppCenterDistribute is deprecated - Distribute app builds to testers and users via Visual Studio App Center", + "doNotSuggest": true, "firstProperty": [ "task" ], @@ -19949,95 +20140,6 @@ "inputs" ] }, - { - "properties": { - "task": { - "description": "Java tool installer test vuln 2\n\nAcquire a specific version of Java from a user-supplied Azure blob or the tool cache and sets JAVA_HOME", - "ignoreCase": "value", - "pattern": "^JavaToolInstallerTestVuln2@0$" - }, - "inputs": { - "description": "Java tool installer test vuln 2 inputs", - "properties": { - "versionSpec": { - "type": "string", - "description": "JDK version", - "ignoreCase": "key" - }, - "jdkArchitectureOption": { - "description": "JDK architecture", - "ignoreCase": "all", - "enum": [ - "x64", - "x86" - ] - }, - "jdkSourceOption": { - "description": "JDK source", - "ignoreCase": "all", - "enum": [ - "AzureStorage", - "LocalDirectory", - "PreInstalled" - ] - }, - "jdkFile": { - "type": "string", - "description": "JDK file", - "ignoreCase": "key" - }, - "azureResourceManagerEndpoint": { - "type": "string", - "description": "Azure subscription", - "ignoreCase": "key" - }, - "azureStorageAccountName": { - "type": "string", - "description": "Storage account name", - "ignoreCase": "key" - }, - "azureContainerName": { - "type": "string", - "description": "Container name", - "ignoreCase": "key" - }, - "azureCommonVirtualFile": { - "type": "string", - "description": "Common virtual path", - "ignoreCase": "key" - }, - "jdkDestinationDirectory": { - "type": "string", - "description": "Destination directory", - "ignoreCase": "key" - }, - "cleanDestinationDirectory": { - "type": "boolean", - "description": "Clean destination directory", - "ignoreCase": "key" - }, - "createExtractDirectory": { - "type": "boolean", - "description": "Create directory for extracting", - "ignoreCase": "key" - } - }, - "additionalProperties": false, - "required": [ - "jdkArchitectureOption", - "jdkSourceOption" - ] - } - }, - "doNotSuggest": false, - "firstProperty": [ - "task" - ], - "required": [ - "task", - "inputs" - ] - }, { "properties": { "task": { @@ -20415,6 +20517,11 @@ "type": "boolean", "description": "Set up partition_id ACL for the imported private key", "ignoreCase": "key" + }, + "opensslPkcsArgs": { + "type": "string", + "description": "OpenSSL arguments for PKCS12", + "ignoreCase": "key" } }, "additionalProperties": false, @@ -20730,6 +20837,34 @@ "inputs" ] }, + { + "properties": { + "task": { + "description": "Open Policy Agent Installer\n\nInstall Open Policy Agent on agent machine", + "ignoreCase": "value", + "pattern": "^OpenPolicyAgentInstaller@0$" + }, + "inputs": { + "description": "Open Policy Agent Installer inputs", + "properties": { + "opaVersion": { + "type": "string", + "description": "OPA Version Spec", + "ignoreCase": "key" + } + }, + "additionalProperties": false, + "required": [] + } + }, + "doNotSuggest": false, + "firstProperty": [ + "task" + ], + "required": [ + "task" + ] + }, { "properties": { "task": { @@ -22329,83 +22464,343 @@ "description": "Allow downloading unstable releases", "ignoreCase": "key" }, - "githubToken": { + "githubToken": { + "type": "string", + "description": "GitHub token for GitHub Actions python registry", + "ignoreCase": "key" + }, + "addToPath": { + "type": "boolean", + "description": "Add to PATH", + "ignoreCase": "key" + }, + "architecture": { + "description": "Architecture", + "ignoreCase": "all", + "enum": [ + "x86", + "x64" + ] + } + }, + "additionalProperties": false, + "required": [] + } + }, + "doNotSuggest": false, + "firstProperty": [ + "task" + ], + "required": [ + "task" + ] + }, + { + "properties": { + "task": { + "description": "Service Fabric PowerShell\n\nRun a PowerShell script in the context of an Azure Service Fabric cluster connection", + "ignoreCase": "value", + "pattern": "^ServiceFabricPowerShell@1$" + }, + "inputs": { + "description": "Service Fabric PowerShell inputs", + "properties": { + "clusterConnection": { + "type": "string", + "description": "Cluster Service Connection", + "ignoreCase": "key", + "aliases": [ + "serviceConnectionName" + ] + }, + "ScriptType": { + "description": "Script Type", + "ignoreCase": "all", + "enum": [ + "FilePath", + "InlineScript" + ] + }, + "ScriptPath": { + "type": "string", + "description": "Script Path", + "ignoreCase": "key" + }, + "Inline": { + "type": "string", + "description": "Inline Script", + "ignoreCase": "key" + }, + "ScriptArguments": { + "type": "string", + "description": "Script Arguments", + "ignoreCase": "key" + } + }, + "additionalProperties": false, + "required": [ + "clusterConnection" + ] + } + }, + "doNotSuggest": false, + "firstProperty": [ + "task" + ], + "required": [ + "task", + "inputs" + ] + }, + { + "properties": { + "task": { + "description": "Visual Studio Test\n\nRun unit and functional tests (Selenium, Appium, Coded UI test, etc.) using the Visual Studio Test (VsTest) runner. Test frameworks that have a Visual Studio test adapter such as MsTest, xUnit, NUnit, Chutzpah (for JavaScript tests using QUnit, Mocha and Jasmine), etc. can be run. Tests can be distributed on multiple agents using this task (version 2).", + "ignoreCase": "value", + "pattern": "^VSTest@3$" + }, + "inputs": { + "description": "Visual Studio Test inputs", + "properties": { + "testSelector": { + "description": "Select tests using", + "ignoreCase": "all", + "enum": [ + "testAssemblies", + "testPlan", + "testRun" + ] + }, + "testAssemblyVer2": { + "type": "string", + "description": "Test files", + "ignoreCase": "key" + }, + "testPlan": { + "type": "string", + "description": "Test plan", + "ignoreCase": "key" + }, + "testSuite": { + "type": "string", + "description": "Test suite", + "ignoreCase": "key" + }, + "testConfiguration": { + "type": "string", + "description": "Test configuration", + "ignoreCase": "key" + }, + "tcmTestRun": { + "type": "string", + "description": "Test Run", + "ignoreCase": "key" + }, + "searchFolder": { + "type": "string", + "description": "Search folder", + "ignoreCase": "key" + }, + "resultsFolder": { + "type": "string", + "description": "Test results folder", + "ignoreCase": "key" + }, + "testFiltercriteria": { + "type": "string", + "description": "Test filter criteria", + "ignoreCase": "key" + }, + "runOnlyImpactedTests": { + "type": "boolean", + "description": "Run only impacted tests", + "ignoreCase": "key" + }, + "runAllTestsAfterXBuilds": { + "type": "string", + "description": "Number of builds after which all tests should be run", + "ignoreCase": "key" + }, + "uiTests": { + "type": "boolean", + "description": "Test mix contains UI tests", + "ignoreCase": "key" + }, + "vstestLocationMethod": { + "description": "Select test platform using", + "ignoreCase": "all", + "enum": [ + "version", + "location" + ] + }, + "vsTestVersion": { + "description": "Test platform version", + "ignoreCase": "all", + "enum": [ + "latest", + "17.0", + "16.0", + "15.0", + "14.0", + "toolsInstaller" + ] + }, + "vstestLocation": { + "type": "string", + "description": "Path to vstest.console.exe", + "ignoreCase": "key" + }, + "runSettingsFile": { + "type": "string", + "description": "Settings file", + "ignoreCase": "key" + }, + "overrideTestrunParameters": { + "type": "string", + "description": "Override test run parameters", + "ignoreCase": "key" + }, + "pathtoCustomTestAdapters": { + "type": "string", + "description": "Path to custom test adapters", + "ignoreCase": "key" + }, + "runInParallel": { + "type": "boolean", + "description": "Run tests in parallel on multi-core machines", + "ignoreCase": "key" + }, + "runTestsInIsolation": { + "type": "boolean", + "description": "Run tests in isolation", + "ignoreCase": "key" + }, + "codeCoverageEnabled": { + "type": "boolean", + "description": "Code coverage enabled", + "ignoreCase": "key" + }, + "otherConsoleOptions": { + "type": "string", + "description": "Other console options", + "ignoreCase": "key" + }, + "distributionBatchType": { + "description": "Batch tests", + "ignoreCase": "all", + "enum": [ + "basedOnTestCases", + "basedOnExecutionTime", + "basedOnAssembly" + ] + }, + "batchingBasedOnAgentsOption": { + "description": "Batch options", + "ignoreCase": "all", + "enum": [ + "autoBatchSize", + "customBatchSize" + ] + }, + "customBatchSizeValue": { + "type": "string", + "description": "Number of tests per batch", + "ignoreCase": "key" + }, + "batchingBasedOnExecutionTimeOption": { + "description": "Batch options", + "ignoreCase": "all", + "enum": [ + "autoBatchSize", + "customTimeBatchSize" + ] + }, + "customRunTimePerBatchValue": { + "type": "string", + "description": "Running time (sec) per batch", + "ignoreCase": "key" + }, + "dontDistribute": { + "type": "boolean", + "description": "Replicate tests instead of distributing when multiple agents are used in the job", + "ignoreCase": "key" + }, + "testRunTitle": { + "type": "string", + "description": "Test run title", + "ignoreCase": "key" + }, + "platform": { + "type": "string", + "description": "Build platform", + "ignoreCase": "key" + }, + "configuration": { + "type": "string", + "description": "Build configuration", + "ignoreCase": "key" + }, + "publishRunAttachments": { + "type": "boolean", + "description": "Upload test attachments", + "ignoreCase": "key" + }, + "failOnMinTestsNotRun": { + "type": "boolean", + "description": "Fail the task if a minimum number of tests are not run.", + "ignoreCase": "key" + }, + "minimumExpectedTests": { "type": "string", - "description": "GitHub token for GitHub Actions python registry", + "description": "Minimum # of tests", "ignoreCase": "key" }, - "addToPath": { + "diagnosticsEnabled": { "type": "boolean", - "description": "Add to PATH", + "description": "Collect advanced diagnostics in case of catastrophic failures", "ignoreCase": "key" }, - "architecture": { - "description": "Architecture", + "collectDumpOn": { + "description": "Collect process dump and attach to test run report", "ignoreCase": "all", "enum": [ - "x86", - "x64" - ] - } - }, - "additionalProperties": false, - "required": [] - } - }, - "doNotSuggest": false, - "firstProperty": [ - "task" - ], - "required": [ - "task" - ] - }, - { - "properties": { - "task": { - "description": "Service Fabric PowerShell\n\nRun a PowerShell script in the context of an Azure Service Fabric cluster connection", - "ignoreCase": "value", - "pattern": "^ServiceFabricPowerShell@1$" - }, - "inputs": { - "description": "Service Fabric PowerShell inputs", - "properties": { - "clusterConnection": { - "type": "string", - "description": "Cluster Service Connection", - "ignoreCase": "key", - "aliases": [ - "serviceConnectionName" + "onAbortOnly", + "always", + "never" ] }, - "ScriptType": { - "description": "Script Type", + "rerunFailedTests": { + "type": "boolean", + "description": "Rerun failed tests", + "ignoreCase": "key" + }, + "rerunType": { + "description": "Do not rerun if test failures exceed specified threshold", "ignoreCase": "all", "enum": [ - "FilePath", - "InlineScript" + "basedOnTestFailurePercentage", + "basedOnTestFailureCount" ] }, - "ScriptPath": { + "rerunFailedThreshold": { "type": "string", - "description": "Script Path", + "description": "% failure", "ignoreCase": "key" }, - "Inline": { + "rerunFailedTestCasesMaxLimit": { "type": "string", - "description": "Inline Script", + "description": "# of failed tests", "ignoreCase": "key" }, - "ScriptArguments": { + "rerunMaxAttempts": { "type": "string", - "description": "Script Arguments", + "description": "Maximum # of attempts", "ignoreCase": "key" } }, "additionalProperties": false, - "required": [ - "clusterConnection" - ] + "required": [] } }, "doNotSuggest": false, @@ -22413,8 +22808,7 @@ "task" ], "required": [ - "task", - "inputs" + "task" ] }, { @@ -23178,13 +23572,18 @@ { "properties": { "task": { - "description": "Conda environment\n\nCreate and activate a Conda environment", + "description": "Conda environment\n\nThis task is deprecated. Use `conda` directly in script to work with Anaconda environments.", "ignoreCase": "value", - "pattern": "^CondaEnvironment@0$" + "pattern": "^CondaEnvironment@1$" }, "inputs": { "description": "Conda environment inputs", "properties": { + "createCustomEnvironment": { + "type": "boolean", + "description": "Create a custom environment", + "ignoreCase": "key" + }, "environmentName": { "type": "string", "description": "Environment name", @@ -23200,9 +23599,14 @@ "description": "Update to the latest Conda", "ignoreCase": "key" }, + "installOptions": { + "type": "string", + "description": "Other options for `conda install`", + "ignoreCase": "key" + }, "createOptions": { "type": "string", - "description": "Environment creation options", + "description": "Other options for `conda create`", "ignoreCase": "key" }, "cleanEnvironment": { @@ -23212,35 +23616,28 @@ } }, "additionalProperties": false, - "required": [ - "environmentName" - ] + "required": [] } }, - "doNotSuggest": false, + "deprecationMessage": "CondaEnvironment is deprecated - This task is deprecated. Use `conda` directly in script to work with Anaconda environments.", + "doNotSuggest": true, "firstProperty": [ "task" ], "required": [ - "task", - "inputs" + "task" ] }, { "properties": { "task": { - "description": "Conda environment\n\nThis task is deprecated. Use `conda` directly in script to work with Anaconda environments.", + "description": "Conda environment\n\nCreate and activate a Conda environment", "ignoreCase": "value", - "pattern": "^CondaEnvironment@1$" + "pattern": "^CondaEnvironment@0$" }, "inputs": { "description": "Conda environment inputs", "properties": { - "createCustomEnvironment": { - "type": "boolean", - "description": "Create a custom environment", - "ignoreCase": "key" - }, "environmentName": { "type": "string", "description": "Environment name", @@ -23256,14 +23653,9 @@ "description": "Update to the latest Conda", "ignoreCase": "key" }, - "installOptions": { - "type": "string", - "description": "Other options for `conda install`", - "ignoreCase": "key" - }, "createOptions": { "type": "string", - "description": "Other options for `conda create`", + "description": "Environment creation options", "ignoreCase": "key" }, "cleanEnvironment": { @@ -23273,16 +23665,18 @@ } }, "additionalProperties": false, - "required": [] + "required": [ + "environmentName" + ] } }, - "deprecationMessage": "CondaEnvironment is deprecated - This task is deprecated. Use `conda` directly in script to work with Anaconda environments.", - "doNotSuggest": true, + "doNotSuggest": false, "firstProperty": [ "task" ], "required": [ - "task" + "task", + "inputs" ] }, { @@ -23603,12 +23997,12 @@ { "properties": { "task": { - "description": "Use .NET Core\n\nAcquires a specific version of the .NET Core SDK from the internet or the local cache and adds it to the PATH. Use this task to change the version of .NET Core used in subsequent tasks. Additionally provides proxy support.", + "description": ".NET Core SDK/runtime installer\n\nAcquire a specific version of the .NET Core SDK from the internet or local cache and add it to the PATH", "ignoreCase": "value", - "pattern": "^UseDotNet@2$" + "pattern": "^DotNetCoreInstaller@0$" }, "inputs": { - "description": "Use .NET Core inputs", + "description": ".NET Core SDK/runtime installer inputs", "properties": { "packageType": { "description": "Package to install", @@ -23618,40 +24012,10 @@ "sdk" ] }, - "useGlobalJson": { - "type": "boolean", - "description": "Use global json", - "ignoreCase": "key" - }, - "workingDirectory": { - "type": "string", - "description": "Working Directory", - "ignoreCase": "key" - }, "version": { "type": "string", "description": "Version", "ignoreCase": "key" - }, - "vsVersion": { - "type": "string", - "description": "Compatible Visual Studio version", - "ignoreCase": "key" - }, - "includePreviewVersions": { - "type": "boolean", - "description": "Include Preview Versions", - "ignoreCase": "key" - }, - "installationPath": { - "type": "string", - "description": "Path To Install .Net Core", - "ignoreCase": "key" - }, - "performMultiLevelLookup": { - "type": "boolean", - "description": "Perform Multi Level Lookup", - "ignoreCase": "key" } }, "additionalProperties": false, @@ -23669,12 +24033,12 @@ { "properties": { "task": { - "description": ".NET Core SDK/runtime installer\n\nAcquire a specific version of the .NET Core SDK from the internet or local cache and add it to the PATH", + "description": ".NET Core sdk/runtime installer\n\nAcquire a specific version of the .NET Core SDK from the internet or local cache and add it to the PATH", "ignoreCase": "value", - "pattern": "^DotNetCoreInstaller@0$" + "pattern": "^DotNetCoreInstaller@1$" }, "inputs": { - "description": ".NET Core SDK/runtime installer inputs", + "description": ".NET Core sdk/runtime installer inputs", "properties": { "packageType": { "description": "Package to install", @@ -23688,13 +24052,29 @@ "type": "string", "description": "Version", "ignoreCase": "key" + }, + "includePreviewVersions": { + "type": "boolean", + "description": "Include Preview Versions", + "ignoreCase": "key" + }, + "installationPath": { + "type": "string", + "description": "Path To Install .Net Core", + "ignoreCase": "key" + }, + "performMultiLevelLookup": { + "type": "boolean", + "description": "Perform Multi Level Lookup", + "ignoreCase": "key" } }, "additionalProperties": false, "required": [] } }, - "doNotSuggest": false, + "deprecationMessage": "DotNetCoreInstaller is deprecated - Acquire a specific version of the .NET Core SDK from the internet or local cache and add it to the PATH", + "doNotSuggest": true, "firstProperty": [ "task" ], @@ -23705,12 +24085,12 @@ { "properties": { "task": { - "description": ".NET Core sdk/runtime installer\n\nAcquire a specific version of the .NET Core SDK from the internet or local cache and add it to the PATH", + "description": "Use .NET Core\n\nAcquires a specific version of the .NET Core SDK from the internet or the local cache and adds it to the PATH. Use this task to change the version of .NET Core used in subsequent tasks. Additionally provides proxy support.", "ignoreCase": "value", - "pattern": "^DotNetCoreInstaller@1$" + "pattern": "^UseDotNet@2$" }, "inputs": { - "description": ".NET Core sdk/runtime installer inputs", + "description": "Use .NET Core inputs", "properties": { "packageType": { "description": "Package to install", @@ -23720,11 +24100,26 @@ "sdk" ] }, + "useGlobalJson": { + "type": "boolean", + "description": "Use global json", + "ignoreCase": "key" + }, + "workingDirectory": { + "type": "string", + "description": "Working Directory", + "ignoreCase": "key" + }, "version": { "type": "string", "description": "Version", "ignoreCase": "key" }, + "vsVersion": { + "type": "string", + "description": "Compatible Visual Studio version", + "ignoreCase": "key" + }, "includePreviewVersions": { "type": "boolean", "description": "Include Preview Versions", @@ -23745,8 +24140,7 @@ "required": [] } }, - "deprecationMessage": "DotNetCoreInstaller is deprecated - Acquire a specific version of the .NET Core SDK from the internet or local cache and add it to the PATH", - "doNotSuggest": true, + "doNotSuggest": false, "firstProperty": [ "task" ], @@ -23875,6 +24269,34 @@ "inputs" ] }, + { + "properties": { + "task": { + "description": "Kubelogin tool installer\n\nHelps to install kubelogin", + "ignoreCase": "value", + "pattern": "^KubeloginInstaller@0$" + }, + "inputs": { + "description": "Kubelogin tool installer inputs", + "properties": { + "kubeloginVersion": { + "type": "string", + "description": "kubelogin version", + "ignoreCase": "key" + } + }, + "additionalProperties": false, + "required": [] + } + }, + "doNotSuggest": false, + "firstProperty": [ + "task" + ], + "required": [ + "task" + ] + }, { "properties": { "task": { @@ -23908,7 +24330,7 @@ "task": { "description": "File transform\n\nReplace tokens with variable values in XML or JSON configuration files", "ignoreCase": "value", - "pattern": "^FileTransform@2$" + "pattern": "^FileTransform@1$" }, "inputs": { "description": "File transform inputs", @@ -23918,19 +24340,27 @@ "description": "Package or folder", "ignoreCase": "key" }, - "xmlTransformationRules": { - "type": "string", - "description": "XML Transformation rules", + "enableXmlTransform": { + "type": "boolean", + "description": "XML transformation", "ignoreCase": "key" }, - "jsonTargetFiles": { + "xmlTransformationRules": { "type": "string", - "description": "JSON target files", + "description": "Transformation rules", "ignoreCase": "key" }, - "xmlTargetFiles": { + "fileType": { + "description": "File format", + "ignoreCase": "all", + "enum": [ + "xml", + "json" + ] + }, + "targetFiles": { "type": "string", - "description": "XML target files", + "description": "Target files", "ignoreCase": "key" } }, @@ -23951,7 +24381,7 @@ "task": { "description": "File transform\n\nReplace tokens with variable values in XML or JSON configuration files", "ignoreCase": "value", - "pattern": "^FileTransform@1$" + "pattern": "^FileTransform@2$" }, "inputs": { "description": "File transform inputs", @@ -23961,27 +24391,19 @@ "description": "Package or folder", "ignoreCase": "key" }, - "enableXmlTransform": { - "type": "boolean", - "description": "XML transformation", - "ignoreCase": "key" - }, "xmlTransformationRules": { "type": "string", - "description": "Transformation rules", + "description": "XML Transformation rules", "ignoreCase": "key" }, - "fileType": { - "description": "File format", - "ignoreCase": "all", - "enum": [ - "xml", - "json" - ] + "jsonTargetFiles": { + "type": "string", + "description": "JSON target files", + "ignoreCase": "key" }, - "targetFiles": { + "xmlTargetFiles": { "type": "string", - "description": "Target files", + "description": "XML target files", "ignoreCase": "key" } }, @@ -24300,7 +24722,8 @@ ] } }, - "doNotSuggest": false, + "deprecationMessage": "DownloadPackage is deprecated - Download a package from a package management feed in Azure Artifacts", + "doNotSuggest": true, "firstProperty": [ "task" ], @@ -24387,43 +24810,32 @@ { "properties": { "task": { - "description": "ARM template deployment\n\nDeploy an Azure Resource Manager (ARM) template to all the deployment scopes", + "description": "Azure resource group deployment\n\nDeploy an Azure Resource Manager (ARM) template to a resource group and manage virtual machines", "ignoreCase": "value", - "pattern": "^AzureResourceManagerTemplateDeployment@3$" + "pattern": "^AzureResourceGroupDeployment@2$" }, "inputs": { - "description": "ARM template deployment inputs", + "description": "Azure resource group deployment inputs", "properties": { - "deploymentScope": { - "description": "Deployment scope", - "ignoreCase": "all", - "enum": [ - "Management Group", - "Subscription", - "Resource Group" - ] - }, - "azureResourceManagerConnection": { + "azureSubscription": { "type": "string", - "description": "Azure Resource Manager connection", + "description": "Azure subscription", "ignoreCase": "key", "aliases": [ "ConnectedServiceName" ] }, - "subscriptionId": { - "type": "string", - "description": "Subscription", - "ignoreCase": "key", - "aliases": [ - "subscriptionName" - ] - }, "action": { "description": "Action", "ignoreCase": "all", "enum": [ "Create Or Update Resource Group", + "Select Resource Group", + "Start", + "Stop", + "StopWithDeallocate", + "Restart", + "Delete", "DeleteRG" ] }, @@ -24479,6 +24891,61 @@ "Validation" ] }, + "enableDeploymentPrerequisites": { + "description": "Enable prerequisites", + "ignoreCase": "all", + "enum": [ + "None", + "ConfigureVMwithWinRM", + "ConfigureVMWithDGAgent" + ] + }, + "teamServicesConnection": { + "type": "string", + "description": "Azure Pipelines service connection", + "ignoreCase": "key", + "aliases": [ + "deploymentGroupEndpoint" + ] + }, + "teamProject": { + "type": "string", + "description": "Team project", + "ignoreCase": "key", + "aliases": [ + "project" + ] + }, + "deploymentGroupName": { + "type": "string", + "description": "Deployment Group", + "ignoreCase": "key" + }, + "copyAzureVMTags": { + "type": "boolean", + "description": "Copy Azure VM tags to agents", + "ignoreCase": "key" + }, + "runAgentServiceAsUser": { + "type": "boolean", + "description": "Run agent service as a user", + "ignoreCase": "key" + }, + "userName": { + "type": "string", + "description": "User name", + "ignoreCase": "key" + }, + "password": { + "type": "string", + "description": "Password", + "ignoreCase": "key" + }, + "outputVariable": { + "type": "string", + "description": "VM details for WinRM", + "ignoreCase": "key" + }, "deploymentName": { "type": "string", "description": "Deployment name", @@ -24493,11 +24960,17 @@ "type": "boolean", "description": "Access service principal details in override parameters", "ignoreCase": "key" + }, + "useWithoutJSON": { + "type": "boolean", + "description": "Use individual output values without JSON.Stringify applied", + "ignoreCase": "key" } }, "additionalProperties": false, "required": [ - "azureResourceManagerConnection" + "azureSubscription", + "resourceGroupName" ] } }, @@ -24513,91 +24986,74 @@ { "properties": { "task": { - "description": "Azure Resource Group Deployment\n\nDeploy, start, stop, delete Azure Resource Groups", + "description": "ARM template deployment\n\nDeploy an Azure Resource Manager (ARM) template to all the deployment scopes", "ignoreCase": "value", - "pattern": "^AzureResourceGroupDeployment@1$" + "pattern": "^AzureResourceManagerTemplateDeployment@3$" }, "inputs": { - "description": "Azure Resource Group Deployment inputs", + "description": "ARM template deployment inputs", "properties": { - "ConnectedServiceNameSelector": { - "description": "Azure Connection Type", + "deploymentScope": { + "description": "Deployment scope", "ignoreCase": "all", "enum": [ - "ConnectedServiceName", - "ConnectedServiceNameClassic" + "Management Group", + "Subscription", + "Resource Group" ] }, - "ConnectedServiceName": { + "azureResourceManagerConnection": { "type": "string", - "description": "Azure Subscription", - "ignoreCase": "key" + "description": "Azure Resource Manager connection", + "ignoreCase": "key", + "aliases": [ + "ConnectedServiceName" + ] }, - "ConnectedServiceNameClassic": { + "subscriptionId": { "type": "string", - "description": "Azure Classic Subscription", - "ignoreCase": "key" + "description": "Subscription", + "ignoreCase": "key", + "aliases": [ + "subscriptionName" + ] }, "action": { "description": "Action", "ignoreCase": "all", "enum": [ "Create Or Update Resource Group", - "Select Resource Group", - "Start", - "Stop", - "Restart", - "Delete", "DeleteRG" ] }, - "actionClassic": { - "description": "Action", - "ignoreCase": "all", - "enum": [ - "Select Resource Group" - ] - }, "resourceGroupName": { "type": "string", - "description": "Resource Group", + "description": "Resource group", "ignoreCase": "key" }, - "cloudService": { + "location": { "type": "string", - "description": "Cloud Service", + "description": "Location", "ignoreCase": "key" }, - "location": { - "description": "Location", + "templateLocation": { + "description": "Template location", "ignoreCase": "all", "enum": [ - "Australia East", - "Australia Southeast", - "Brazil South", - "Canada Central", - "Canada East", - "Central India", - "Central US", - "East Asia", - "East US", - "East US 2 ", - "Japan East", - "Japan West", - "North Central US", - "North Europe", - "South Central US", - "South India", - "Southeast Asia", - "UK South", - "UK West", - "West Central US", - "West Europe", - "West India", - "West US", - "West US 2" + "Linked artifact", + "URL of the file" ] }, + "csmFileLink": { + "type": "string", + "description": "Template link", + "ignoreCase": "key" + }, + "csmParametersFileLink": { + "type": "string", + "description": "Template parameters link", + "ignoreCase": "key" + }, "csmFile": { "type": "string", "description": "Template", @@ -24605,70 +25061,87 @@ }, "csmParametersFile": { "type": "string", - "description": "Template Parameters", + "description": "Template parameters", "ignoreCase": "key" }, "overrideParameters": { "type": "string", - "description": "Override Template Parameters", + "description": "Override template parameters", "ignoreCase": "key" }, "deploymentMode": { - "description": "Deployment Mode", + "description": "Deployment mode", "ignoreCase": "all", "enum": [ - "Validation", "Incremental", - "Complete" + "Complete", + "Validation" ] }, - "enableDeploymentPrerequisitesForCreate": { - "type": "boolean", - "description": "Enable Deployment Prerequisites", + "deploymentName": { + "type": "string", + "description": "Deployment name", "ignoreCase": "key" }, - "enableDeploymentPrerequisitesForSelect": { + "deploymentOutputs": { + "type": "string", + "description": "Deployment outputs", + "ignoreCase": "key" + }, + "addSpnToEnvironment": { "type": "boolean", - "description": "Enable Deployment Prerequisites", + "description": "Access service principal details in override parameters", "ignoreCase": "key" }, - "outputVariable": { - "type": "string", - "description": "Resource Group", + "useWithoutJSON": { + "type": "boolean", + "description": "Use individual output values without JSON.Stringify applied", "ignoreCase": "key" } }, "additionalProperties": false, - "required": [] + "required": [ + "azureResourceManagerConnection" + ] } }, - "deprecationMessage": "AzureResourceGroupDeployment is deprecated - Deploy, start, stop, delete Azure Resource Groups", - "doNotSuggest": true, + "doNotSuggest": false, "firstProperty": [ "task" ], "required": [ - "task" + "task", + "inputs" ] }, { "properties": { "task": { - "description": "Azure resource group deployment\n\nDeploy an Azure Resource Manager (ARM) template to a resource group and manage virtual machines", + "description": "Azure Resource Group Deployment\n\nDeploy, start, stop, delete Azure Resource Groups", "ignoreCase": "value", - "pattern": "^AzureResourceGroupDeployment@2$" + "pattern": "^AzureResourceGroupDeployment@1$" }, "inputs": { - "description": "Azure resource group deployment inputs", + "description": "Azure Resource Group Deployment inputs", "properties": { - "azureSubscription": { - "type": "string", - "description": "Azure subscription", - "ignoreCase": "key", - "aliases": [ - "ConnectedServiceName" + "ConnectedServiceNameSelector": { + "description": "Azure Connection Type", + "ignoreCase": "all", + "enum": [ + "ConnectedServiceName", + "ConnectedServiceNameClassic" ] }, + "ConnectedServiceName": { + "type": "string", + "description": "Azure Subscription", + "ignoreCase": "key" + }, + "ConnectedServiceNameClassic": { + "type": "string", + "description": "Azure Classic Subscription", + "ignoreCase": "key" + }, "action": { "description": "Action", "ignoreCase": "all", @@ -24677,40 +25150,58 @@ "Select Resource Group", "Start", "Stop", - "StopWithDeallocate", "Restart", "Delete", "DeleteRG" ] }, + "actionClassic": { + "description": "Action", + "ignoreCase": "all", + "enum": [ + "Select Resource Group" + ] + }, "resourceGroupName": { "type": "string", - "description": "Resource group", + "description": "Resource Group", "ignoreCase": "key" }, - "location": { + "cloudService": { "type": "string", - "description": "Location", + "description": "Cloud Service", "ignoreCase": "key" }, - "templateLocation": { - "description": "Template location", + "location": { + "description": "Location", "ignoreCase": "all", "enum": [ - "Linked artifact", - "URL of the file" + "Australia East", + "Australia Southeast", + "Brazil South", + "Canada Central", + "Canada East", + "Central India", + "Central US", + "East Asia", + "East US", + "East US 2 ", + "Japan East", + "Japan West", + "North Central US", + "North Europe", + "South Central US", + "South India", + "Southeast Asia", + "UK South", + "UK West", + "West Central US", + "West Europe", + "West India", + "West US", + "West US 2" ] }, - "csmFileLink": { - "type": "string", - "description": "Template link", - "ignoreCase": "key" - }, - "csmParametersFileLink": { - "type": "string", - "description": "Template parameters link", - "ignoreCase": "key" - }, "csmFile": { "type": "string", "description": "Template", @@ -24718,108 +25209,50 @@ }, "csmParametersFile": { "type": "string", - "description": "Template parameters", + "description": "Template Parameters", "ignoreCase": "key" }, "overrideParameters": { "type": "string", - "description": "Override template parameters", + "description": "Override Template Parameters", "ignoreCase": "key" }, "deploymentMode": { - "description": "Deployment mode", + "description": "Deployment Mode", "ignoreCase": "all", "enum": [ + "Validation", "Incremental", - "Complete", - "Validation" - ] - }, - "enableDeploymentPrerequisites": { - "description": "Enable prerequisites", - "ignoreCase": "all", - "enum": [ - "None", - "ConfigureVMwithWinRM", - "ConfigureVMWithDGAgent" - ] - }, - "teamServicesConnection": { - "type": "string", - "description": "Azure Pipelines service connection", - "ignoreCase": "key", - "aliases": [ - "deploymentGroupEndpoint" - ] - }, - "teamProject": { - "type": "string", - "description": "Team project", - "ignoreCase": "key", - "aliases": [ - "project" + "Complete" ] }, - "deploymentGroupName": { - "type": "string", - "description": "Deployment Group", - "ignoreCase": "key" - }, - "copyAzureVMTags": { + "enableDeploymentPrerequisitesForCreate": { "type": "boolean", - "description": "Copy Azure VM tags to agents", + "description": "Enable Deployment Prerequisites", "ignoreCase": "key" }, - "runAgentServiceAsUser": { + "enableDeploymentPrerequisitesForSelect": { "type": "boolean", - "description": "Run agent service as a user", - "ignoreCase": "key" - }, - "userName": { - "type": "string", - "description": "User name", - "ignoreCase": "key" - }, - "password": { - "type": "string", - "description": "Password", + "description": "Enable Deployment Prerequisites", "ignoreCase": "key" }, "outputVariable": { "type": "string", - "description": "VM details for WinRM", - "ignoreCase": "key" - }, - "deploymentName": { - "type": "string", - "description": "Deployment name", - "ignoreCase": "key" - }, - "deploymentOutputs": { - "type": "string", - "description": "Deployment outputs", - "ignoreCase": "key" - }, - "addSpnToEnvironment": { - "type": "boolean", - "description": "Access service principal details in override parameters", + "description": "Resource Group", "ignoreCase": "key" } }, "additionalProperties": false, - "required": [ - "azureSubscription", - "resourceGroupName" - ] + "required": [] } }, - "doNotSuggest": false, + "deprecationMessage": "AzureResourceGroupDeployment is deprecated - Deploy, start, stop, delete Azure Resource Groups", + "doNotSuggest": true, "firstProperty": [ "task" ], "required": [ - "task", - "inputs" + "task" ] }, { @@ -25663,29 +26096,16 @@ { "properties": { "task": { - "description": "Node.js tool installer\n\nFinds or downloads and caches the specified version spec of Node.js and adds it to the PATH", + "description": "Use Node.js ecosystem\n\nSet up a Node.js environment and add it to the PATH, additionally providing proxy support", "ignoreCase": "value", - "pattern": "^NodeTool@0$" + "pattern": "^UseNode@1$" }, "inputs": { - "description": "Node.js tool installer inputs", + "description": "Use Node.js ecosystem inputs", "properties": { - "versionSource": { - "description": "Source of version", - "ignoreCase": "all", - "enum": [ - "spec", - "fromFile" - ] - }, - "versionSpec": { - "type": "string", - "description": "Version Spec", - "ignoreCase": "key" - }, - "versionFilePath": { + "version": { "type": "string", - "description": "Path to the .nvmrc file", + "description": "Version", "ignoreCase": "key" }, "checkLatest": { @@ -25697,11 +26117,6 @@ "type": "boolean", "description": "Use 32 bit version on x64 agents", "ignoreCase": "key" - }, - "nodejsMirror": { - "type": "string", - "description": "Set source for Node.js binaries", - "ignoreCase": "key" } }, "additionalProperties": false, @@ -25719,16 +26134,29 @@ { "properties": { "task": { - "description": "Use Node.js ecosystem\n\nSet up a Node.js environment and add it to the PATH, additionally providing proxy support", + "description": "Node.js tool installer\n\nFinds or downloads and caches the specified version spec of Node.js and adds it to the PATH", "ignoreCase": "value", - "pattern": "^UseNode@1$" + "pattern": "^NodeTool@0$" }, "inputs": { - "description": "Use Node.js ecosystem inputs", + "description": "Node.js tool installer inputs", "properties": { - "version": { + "versionSource": { + "description": "Source of version", + "ignoreCase": "all", + "enum": [ + "spec", + "fromFile" + ] + }, + "versionSpec": { "type": "string", - "description": "Version", + "description": "Version Spec", + "ignoreCase": "key" + }, + "versionFilePath": { + "type": "string", + "description": "Path to the .nvmrc file", "ignoreCase": "key" }, "checkLatest": { @@ -25740,6 +26168,11 @@ "type": "boolean", "description": "Use 32 bit version on x64 agents", "ignoreCase": "key" + }, + "nodejsMirror": { + "type": "string", + "description": "Set source for Node.js binaries", + "ignoreCase": "key" } }, "additionalProperties": false, @@ -25993,7 +26426,7 @@ }, "useDataContractSerializer": { "type": "boolean", - "description": "Use .NET data contract serailizer", + "description": "Use .NET data contract serializer", "ignoreCase": "key" } }, @@ -26061,7 +26494,7 @@ "task": { "description": "Deploy to Kubernetes\n\nUse Kubernetes manifest files to deploy to clusters or even bake the manifest files to be used for deployments using Helm charts", "ignoreCase": "value", - "pattern": "^KubernetesManifest@0$" + "pattern": "^KubernetesManifest@1$" }, "inputs": { "description": "Deploy to Kubernetes inputs", @@ -26080,9 +26513,43 @@ "reject" ] }, + "connectionType": { + "description": "Service connection type", + "ignoreCase": "all", + "enum": [ + "azureResourceManager", + "kubernetesServiceConnection" + ] + }, "kubernetesServiceConnection": { "type": "string", "description": "Kubernetes service connection", + "ignoreCase": "key", + "aliases": [ + "kubernetesServiceEndpoint" + ] + }, + "azureSubscriptionConnection": { + "type": "string", + "description": "Azure subscription", + "ignoreCase": "key", + "aliases": [ + "azureSubscriptionEndpoint" + ] + }, + "azureResourceGroup": { + "type": "string", + "description": "Resource group", + "ignoreCase": "key" + }, + "kubernetesCluster": { + "type": "string", + "description": "Kubernetes cluster", + "ignoreCase": "key" + }, + "useClusterAdmin": { + "type": "boolean", + "description": "Use cluster admin credentials", "ignoreCase": "key" }, "namespace": { @@ -26267,7 +26734,7 @@ "task": { "description": "Deploy to Kubernetes\n\nUse Kubernetes manifest files to deploy to clusters or even bake the manifest files to be used for deployments using Helm charts", "ignoreCase": "value", - "pattern": "^KubernetesManifest@1$" + "pattern": "^KubernetesManifest@0$" }, "inputs": { "description": "Deploy to Kubernetes inputs", @@ -26286,38 +26753,9 @@ "reject" ] }, - "connectionType": { - "description": "Service connection type", - "ignoreCase": "all", - "enum": [ - "azureResourceManager", - "kubernetesServiceConnection" - ] - }, "kubernetesServiceConnection": { "type": "string", "description": "Kubernetes service connection", - "ignoreCase": "key", - "aliases": [ - "kubernetesServiceEndpoint" - ] - }, - "azureSubscriptionConnection": { - "type": "string", - "description": "Azure subscription", - "ignoreCase": "key", - "aliases": [ - "azureSubscriptionEndpoint" - ] - }, - "azureResourceGroup": { - "type": "string", - "description": "Resource group", - "ignoreCase": "key" - }, - "kubernetesCluster": { - "type": "string", - "description": "Kubernetes cluster", "ignoreCase": "key" }, "namespace": { @@ -26502,7 +26940,7 @@ "task": { "description": "Download build artifacts\n\nDownload files that were saved as artifacts of a completed build", "ignoreCase": "value", - "pattern": "^DownloadBuildArtifacts@0$" + "pattern": "^DownloadBuildArtifacts@1$" }, "inputs": { "description": "Download build artifacts inputs", @@ -26628,7 +27066,7 @@ "task": { "description": "Download build artifacts\n\nDownload files that were saved as artifacts of a completed build", "ignoreCase": "value", - "pattern": "^DownloadBuildArtifacts@1$" + "pattern": "^DownloadBuildArtifacts@0$" }, "inputs": { "description": "Download build artifacts inputs", @@ -26793,12 +27231,12 @@ { "properties": { "task": { - "description": "Azure Spring Cloud\n\nDeploy applications to Azure Spring Cloud and manage deployments.", + "description": "Azure Spring Apps\n\nDeploy applications to Azure Spring Apps and manage deployments.", "ignoreCase": "value", "pattern": "^AzureSpringCloud@0$" }, "inputs": { - "description": "Azure Spring Cloud inputs", + "description": "Azure Spring Apps inputs", "properties": { "azureSubscription": { "type": "string", @@ -26819,7 +27257,7 @@ }, "AzureSpringCloud": { "type": "string", - "description": "Azure Spring Cloud Name", + "description": "Azure Spring Apps Name", "ignoreCase": "key" }, "AppName": { @@ -27320,7 +27758,7 @@ "task": { "description": "GitHub Release\n\nCreate, edit, or delete a GitHub release", "ignoreCase": "value", - "pattern": "^GitHubRelease@1$" + "pattern": "^GitHubRelease@0$" }, "inputs": { "description": "GitHub Release inputs", @@ -27353,8 +27791,8 @@ "description": "Tag source", "ignoreCase": "all", "enum": [ - "gitTag", - "userSpecifiedTag" + "auto", + "manual" ] }, "tagPattern": { @@ -27376,16 +27814,16 @@ "description": "Release notes source", "ignoreCase": "all", "enum": [ - "filePath", - "inline" + "file", + "input" ] }, - "releaseNotesFilePath": { + "releaseNotesFile": { "type": "string", "description": "Release notes file path", "ignoreCase": "key" }, - "releaseNotesInline": { + "releaseNotes": { "type": "string", "description": "Release notes", "ignoreCase": "key" @@ -27466,7 +27904,7 @@ "task": { "description": "GitHub Release\n\nCreate, edit, or delete a GitHub release", "ignoreCase": "value", - "pattern": "^GitHubRelease@0$" + "pattern": "^GitHubRelease@1$" }, "inputs": { "description": "GitHub Release inputs", @@ -27499,8 +27937,8 @@ "description": "Tag source", "ignoreCase": "all", "enum": [ - "auto", - "manual" + "gitTag", + "userSpecifiedTag" ] }, "tagPattern": { @@ -27522,16 +27960,16 @@ "description": "Release notes source", "ignoreCase": "all", "enum": [ - "file", - "input" + "filePath", + "inline" ] }, - "releaseNotesFile": { + "releaseNotesFilePath": { "type": "string", "description": "Release notes file path", "ignoreCase": "key" }, - "releaseNotes": { + "releaseNotesInline": { "type": "string", "description": "Release notes", "ignoreCase": "key" @@ -28027,6 +28465,11 @@ "type": "string", "description": "Resource name", "ignoreCase": "key" + }, + "RetryDuration": { + "type": "string", + "description": "Retry duration", + "ignoreCase": "key" } }, "additionalProperties": false, @@ -28049,11 +28492,19 @@ "task": { "description": "Azure Function on Kubernetes\n\nDeploy Azure function to Kubernetes cluster.", "ignoreCase": "value", - "pattern": "^AzureFunctionOnKubernetes@0$" + "pattern": "^AzureFunctionOnKubernetes@1$" }, "inputs": { "description": "Azure Function on Kubernetes inputs", "properties": { + "connectionType": { + "description": "Service connection type", + "ignoreCase": "all", + "enum": [ + "Azure Resource Manager", + "Kubernetes Service Connection" + ] + }, "dockerRegistryServiceConnection": { "type": "string", "description": "Docker registry service connection", @@ -28062,6 +28513,27 @@ "kubernetesServiceConnection": { "type": "string", "description": "Kubernetes service connection", + "ignoreCase": "key", + "aliases": [ + "kubernetesServiceEndpoint" + ] + }, + "azureSubscriptionConnection": { + "type": "string", + "description": "Azure subscription", + "ignoreCase": "key", + "aliases": [ + "azureSubscriptionEndpoint" + ] + }, + "azureResourceGroup": { + "type": "string", + "description": "Resource group", + "ignoreCase": "key" + }, + "kubernetesCluster": { + "type": "string", + "description": "Kubernetes cluster", "ignoreCase": "key" }, "namespace": { @@ -28103,7 +28575,6 @@ "additionalProperties": false, "required": [ "dockerRegistryServiceConnection", - "kubernetesServiceConnection", "appName" ] } @@ -28122,19 +28593,11 @@ "task": { "description": "Azure Function on Kubernetes\n\nDeploy Azure function to Kubernetes cluster.", "ignoreCase": "value", - "pattern": "^AzureFunctionOnKubernetes@1$" + "pattern": "^AzureFunctionOnKubernetes@0$" }, "inputs": { "description": "Azure Function on Kubernetes inputs", "properties": { - "connectionType": { - "description": "Service connection type", - "ignoreCase": "all", - "enum": [ - "Azure Resource Manager", - "Kubernetes Service Connection" - ] - }, "dockerRegistryServiceConnection": { "type": "string", "description": "Docker registry service connection", @@ -28143,27 +28606,6 @@ "kubernetesServiceConnection": { "type": "string", "description": "Kubernetes service connection", - "ignoreCase": "key", - "aliases": [ - "kubernetesServiceEndpoint" - ] - }, - "azureSubscriptionConnection": { - "type": "string", - "description": "Azure subscription", - "ignoreCase": "key", - "aliases": [ - "azureSubscriptionEndpoint" - ] - }, - "azureResourceGroup": { - "type": "string", - "description": "Resource group", - "ignoreCase": "key" - }, - "kubernetesCluster": { - "type": "string", - "description": "Kubernetes cluster", "ignoreCase": "key" }, "namespace": { @@ -28205,6 +28647,7 @@ "additionalProperties": false, "required": [ "dockerRegistryServiceConnection", + "kubernetesServiceConnection", "appName" ] } @@ -28361,6 +28804,11 @@ "ArtifactType" ] }, + "MaxArtifactSize": { + "type": "integer", + "description": "Max Artifact Size", + "ignoreCase": "key" + }, "TargetPath": { "type": "string", "description": "File share path", @@ -28376,11 +28824,6 @@ "description": "Parallel count", "ignoreCase": "key" }, - "FileCopyOptions": { - "type": "string", - "description": "File copy options", - "ignoreCase": "key" - }, "StoreAsTar": { "type": "boolean", "description": "Tar the artifact before uploading", @@ -28627,6 +29070,136 @@ "inputs" ] }, + { + "properties": { + "task": { + "description": "Conda authenticate (for task runners)\n\nAuthentication task for the conda client", + "ignoreCase": "value", + "pattern": "^CondaAuthenticate@0$" + }, + "inputs": { + "description": "Conda authenticate (for task runners) inputs", + "properties": {}, + "additionalProperties": false, + "required": [] + } + }, + "doNotSuggest": false, + "firstProperty": [ + "task" + ], + "required": [ + "task" + ] + }, + { + "properties": { + "task": { + "description": "Azure Cloud Service deployment\n\nDeploy an Azure Cloud Service", + "ignoreCase": "value", + "pattern": "^AzureCloudPowerShellDeployment@2$" + }, + "inputs": { + "description": "Azure Cloud Service deployment inputs", + "properties": { + "ARMConnectedServiceName": { + "type": "string", + "description": "Azure subscription (ARM)", + "ignoreCase": "key" + }, + "ResourceGroupName": { + "type": "string", + "description": "Resource group", + "ignoreCase": "key" + }, + "ARMStorageAccount": { + "type": "string", + "description": "Storage account (ARM)", + "ignoreCase": "key" + }, + "ServiceName": { + "type": "string", + "description": "Service name", + "ignoreCase": "key" + }, + "ServiceLocation": { + "type": "string", + "description": "Service location", + "ignoreCase": "key" + }, + "CsCfg": { + "type": "string", + "description": "CsCfg", + "ignoreCase": "key" + }, + "CsDef": { + "type": "string", + "description": "CsDef", + "ignoreCase": "key" + }, + "CsPkg": { + "type": "string", + "description": "CsPkg", + "ignoreCase": "key" + }, + "KeyVault": { + "type": "string", + "description": "Azure KeyVault", + "ignoreCase": "key" + }, + "DeploymentLabel": { + "type": "string", + "description": "Deployment label", + "ignoreCase": "key" + }, + "AppendDateTimeToLabel": { + "type": "boolean", + "description": "Append current date and time", + "ignoreCase": "key" + }, + "UpgradeMode": { + "type": "string", + "description": "Update mode for the cloud service", + "ignoreCase": "key" + }, + "AllowUpgrade": { + "type": "boolean", + "description": "Allow upgrade", + "ignoreCase": "key" + }, + "VerifyRoleInstanceStatus": { + "type": "boolean", + "description": "Verify role instance status", + "ignoreCase": "key" + }, + "DiagnosticStorageAccountKeys": { + "type": "string", + "description": "Diagnostic storage account keys", + "ignoreCase": "key" + } + }, + "additionalProperties": false, + "required": [ + "ARMConnectedServiceName", + "ResourceGroupName", + "ARMStorageAccount", + "ServiceName", + "ServiceLocation", + "CsCfg", + "CsDef", + "CsPkg" + ] + } + }, + "doNotSuggest": false, + "firstProperty": [ + "task" + ], + "required": [ + "task", + "inputs" + ] + }, { "properties": { "task": { diff --git a/src/check_jsonschema/builtin_schemas/vendor/azure-pipelines.sha256 b/src/check_jsonschema/builtin_schemas/vendor/azure-pipelines.sha256 index 7dbda5987..ec8fd7109 100644 --- a/src/check_jsonschema/builtin_schemas/vendor/azure-pipelines.sha256 +++ b/src/check_jsonschema/builtin_schemas/vendor/azure-pipelines.sha256 @@ -1 +1 @@ -e47013c02013c9ff0b4abb7dc8ff506c8d950b4f016c5bd0a19f066ddba80326 \ No newline at end of file +c14511e83fe4106a971d1dc1910d0d93f0d5ec69231d2c8462e49c3703a3dec2 \ No newline at end of file diff --git a/src/check_jsonschema/builtin_schemas/vendor/gitlab-ci.json b/src/check_jsonschema/builtin_schemas/vendor/gitlab-ci.json index 2dba919cf..0420ffb82 100644 --- a/src/check_jsonschema/builtin_schemas/vendor/gitlab-ci.json +++ b/src/check_jsonschema/builtin_schemas/vendor/gitlab-ci.json @@ -9,22 +9,27 @@ "format": "uri" }, "image": { - "$ref": "#/definitions/image" + "$ref": "#/definitions/image", + "markdownDescription": "Defining `image` globally is deprecated. Use [`default`](https://docs.gitlab.com/ee/ci/yaml/#default) instead. [Learn more](https://docs.gitlab.com/ee/ci/yaml/#globally-defined-image-services-cache-before_script-after_script)." }, "services": { - "$ref": "#/definitions/services" + "$ref": "#/definitions/services", + "markdownDescription": "Defining `services` globally is deprecated. Use [`default`](https://docs.gitlab.com/ee/ci/yaml/#default) instead. [Learn more](https://docs.gitlab.com/ee/ci/yaml/#globally-defined-image-services-cache-before_script-after_script)." }, "before_script": { - "$ref": "#/definitions/before_script" + "$ref": "#/definitions/before_script", + "markdownDescription": "Defining `before_script` globally is deprecated. Use [`default`](https://docs.gitlab.com/ee/ci/yaml/#default) instead. [Learn more](https://docs.gitlab.com/ee/ci/yaml/#globally-defined-image-services-cache-before_script-after_script)." }, "after_script": { - "$ref": "#/definitions/after_script" + "$ref": "#/definitions/after_script", + "markdownDescription": "Defining `after_script` globally is deprecated. Use [`default`](https://docs.gitlab.com/ee/ci/yaml/#default) instead. [Learn more](https://docs.gitlab.com/ee/ci/yaml/#globally-defined-image-services-cache-before_script-after_script)." }, "variables": { "$ref": "#/definitions/globalVariables" }, "cache": { - "$ref": "#/definitions/cache" + "$ref": "#/definitions/cache", + "markdownDescription": "Defining `cache` globally is deprecated. Use [`default`](https://docs.gitlab.com/ee/ci/yaml/#default) instead. [Learn more](https://docs.gitlab.com/ee/ci/yaml/#globally-defined-image-services-cache-before_script-after_script)." }, "!reference": { "$ref": "#/definitions/!reference" @@ -744,39 +749,61 @@ } } }, - "before_script": { - "type": "array", - "markdownDescription": "Defines scripts that should run *before* the job. Can be set globally or per job. [Learn More](https://docs.gitlab.com/ee/ci/yaml/#before_script).", - "items": { - "anyOf": [ - { - "type": "string" + "script": { + "oneOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ] }, - { - "type": "array", - "items": { - "type": "string" - } + "minItems": 1 + } + ] + }, + "optional_script": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ] } - ] - } + } + ] + }, + "before_script": { + "$ref": "#/definitions/optional_script", + "markdownDescription": "Defines scripts that should run *before* the job. Can be set globally or per job. [Learn More](https://docs.gitlab.com/ee/ci/yaml/#before_script)." }, "after_script": { - "type": "array", - "markdownDescription": "Defines scripts that should run *after* the job. Can be set globally or per job. [Learn More](https://docs.gitlab.com/ee/ci/yaml/#after_script).", - "items": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ] - } + "$ref": "#/definitions/optional_script", + "markdownDescription": "Defines scripts that should run *after* the job. Can be set globally or per job. [Learn More](https://docs.gitlab.com/ee/ci/yaml/#after_script)." }, "rules": { "type": [ @@ -1508,30 +1535,8 @@ "$ref": "#/definitions/secrets" }, "script": { - "markdownDescription": "Shell scripts executed by the Runner. The only required property of jobs. Be careful with special characters (e.g. `:`, `{`, `}`, `&`) and use single or double quotes to avoid issues. [Learn More](https://docs.gitlab.com/ee/ci/yaml/#script)", - "oneOf": [ - { - "type": "string", - "minLength": 1 - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ] - }, - "minItems": 1 - } - ] + "$ref": "#/definitions/script", + "markdownDescription": "Shell scripts executed by the Runner. The only required property of jobs. Be careful with special characters (e.g. `:`, `{`, `}`, `&`) and use single or double quotes to avoid issues. [Learn More](https://docs.gitlab.com/ee/ci/yaml/#script)" }, "stage": { "description": "Define what stage the job will run in.", @@ -2145,30 +2150,8 @@ "markdownDescription": "Specifies lists of commands to execute on the runner at certain stages of job execution. [Learn More](https://docs.gitlab.com/ee/ci/yaml/#hooks).", "properties": { "pre_get_sources_script": { - "markdownDescription": "Specifies a list of commands to execute on the runner before updating the Git repository and any submodules. [Learn More](https://docs.gitlab.com/ee/ci/yaml/#hookspre_get_sources_script).", - "oneOf": [ - { - "type": "string", - "minLength": 1 - }, - { - "type": "array", - "items": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ] - }, - "minItems": 1 - } - ] + "$ref": "#/definitions/optional_script", + "markdownDescription": "Specifies a list of commands to execute on the runner before updating the Git repository and any submodules. [Learn More](https://docs.gitlab.com/ee/ci/yaml/#hookspre_get_sources_script)." } }, "additionalProperties": false diff --git a/src/check_jsonschema/builtin_schemas/vendor/gitlab-ci.sha256 b/src/check_jsonschema/builtin_schemas/vendor/gitlab-ci.sha256 index c21762b0d..47b23ba92 100644 --- a/src/check_jsonschema/builtin_schemas/vendor/gitlab-ci.sha256 +++ b/src/check_jsonschema/builtin_schemas/vendor/gitlab-ci.sha256 @@ -1 +1 @@ -16f6b005335375d2f954e17bf6057adb77ef03b8f7b050e0275b21097b712da2 \ No newline at end of file +d8853998ead8e2452590fbc9f66466ba79760f8e57cc395b5ece2d8a97755e3a \ No newline at end of file diff --git a/src/check_jsonschema/builtin_schemas/vendor/renovate.json b/src/check_jsonschema/builtin_schemas/vendor/renovate.json index cf00b79a0..5a8fcaad2 100644 --- a/src/check_jsonschema/builtin_schemas/vendor/renovate.json +++ b/src/check_jsonschema/builtin_schemas/vendor/renovate.json @@ -670,6 +670,85 @@ "default": {}, "$ref": "#" }, + "customManagers": { + "description": "Custom managers using regex matching.", + "type": "array", + "items": { + "allOf": [ + { + "type": "object", + "properties": { + "description": { + "type": "string", + "description": "A custom description for this configuration object" + }, + "autoReplaceStringTemplate": { + "description": "Optional `extractVersion` for extracted dependencies. Valid only within a `customManagers` object.", + "type": "string" + }, + "currentValueTemplate": { + "description": "Optional `currentValue` for extracted dependencies. Valid only within a `customManagers` object.", + "type": "string" + }, + "customType": { + "description": "Custom manager to use. Valid only within a `customManagers` object.", + "type": "string", + "enum": [ + "regex" + ] + }, + "datasourceTemplate": { + "description": "Optional datasource for extracted dependencies. Valid only within a `customManagers` object.", + "type": "string" + }, + "depNameTemplate": { + "description": "Optional depName for extracted dependencies. Valid only within a `customManagers` object.", + "type": "string" + }, + "depTypeTemplate": { + "description": "Optional `depType` for extracted dependencies. Valid only within a `customManagers` object.", + "type": "string" + }, + "extractVersionTemplate": { + "description": "Optional `extractVersion` for extracted dependencies. Valid only within a `customManagers` object.", + "type": "string" + }, + "matchStrings": { + "description": "Regex capture rule to use. Valid only within a `customManagers` object.", + "type": "array", + "items": { + "type": "string", + "format": "regex" + } + }, + "matchStringsStrategy": { + "description": "Strategy how to interpret matchStrings.", + "type": "string", + "enum": [ + "any", + "recursive", + "combination" + ], + "default": "any" + }, + "packageNameTemplate": { + "description": "Optional packageName for extracted dependencies, else defaults to `depName` value. Valid only within a `customManagers` object.", + "type": "string" + }, + "registryUrlTemplate": { + "description": "Optional registry URL for extracted dependencies. Valid only within a `customManagers` object.", + "type": "string" + }, + "versioningTemplate": { + "description": "Optional versioning for extracted dependencies. Valid only within a `customManagers` object.", + "type": "string" + } + } + } + ] + }, + "default": [] + }, "customizeDashboard": { "description": "Customize sections in the dependency dashboard issue.", "type": "object", @@ -801,7 +880,7 @@ "dockerSidecarImage": { "description": "Change this value to override the default Renovate sidecar image.", "type": "string", - "default": "ghcr.io/containerbase/sidecar:9.20.3" + "default": "ghcr.io/containerbase/sidecar:9.20.4" }, "dockerUser": { "description": "Set the `UID` and `GID` for Docker-based binaries if you use `binarySource=docker`.", @@ -948,7 +1027,7 @@ "type": "object", "default": { "fileMatch": [ - "(^|/)flux-system/(?:.+/)?gotk-components\\.ya?ml$" + "(?:^|/)gotk-components\\.ya?ml$" ] }, "$ref": "#" @@ -2672,85 +2751,6 @@ }, "$ref": "#" }, - "regexManagers": { - "description": "Custom managers using regex matching.", - "type": "array", - "items": { - "allOf": [ - { - "type": "object", - "properties": { - "description": { - "type": "string", - "description": "A custom description for this configuration object" - }, - "autoReplaceStringTemplate": { - "description": "Optional `extractVersion` for extracted dependencies. Valid only within a `regexManagers` object.", - "type": "string" - }, - "currentValueTemplate": { - "description": "Optional `currentValue` for extracted dependencies. Valid only within a `regexManagers` object.", - "type": "string" - }, - "customType": { - "description": "Custom manager to use. Valid only within a `regexManagers` object.", - "type": "string", - "enum": [ - "regex" - ] - }, - "datasourceTemplate": { - "description": "Optional datasource for extracted dependencies. Valid only within a `regexManagers` object.", - "type": "string" - }, - "depNameTemplate": { - "description": "Optional depName for extracted dependencies. Valid only within a `regexManagers` object.", - "type": "string" - }, - "depTypeTemplate": { - "description": "Optional `depType` for extracted dependencies. Valid only within a `regexManagers` object.", - "type": "string" - }, - "extractVersionTemplate": { - "description": "Optional `extractVersion` for extracted dependencies. Valid only within a `regexManagers` object.", - "type": "string" - }, - "matchStrings": { - "description": "Regex capture rule to use. Valid only within a `regexManagers` object.", - "type": "array", - "items": { - "type": "string", - "format": "regex" - } - }, - "matchStringsStrategy": { - "description": "Strategy how to interpret matchStrings.", - "type": "string", - "enum": [ - "any", - "recursive", - "combination" - ], - "default": "any" - }, - "packageNameTemplate": { - "description": "Optional packageName for extracted dependencies, else defaults to `depName` value. Valid only within a `regexManagers` object.", - "type": "string" - }, - "registryUrlTemplate": { - "description": "Optional registry URL for extracted dependencies. Valid only within a `regexManagers` object.", - "type": "string" - }, - "versioningTemplate": { - "description": "Optional versioning for extracted dependencies. Valid only within a `regexManagers` object.", - "type": "string" - } - } - } - ] - }, - "default": [] - }, "registryAliases": { "description": "Aliases for registries.", "type": "object", @@ -3089,7 +3089,7 @@ "default": true }, "updateInternalDeps": { - "description": "Whether to update internal dep versions in a monorepo. Works on Lerna or Yarn Workspaces.", + "description": "Whether to update internal dep versions in a monorepo. Works on Yarn Workspaces.", "type": "boolean", "default": false }, diff --git a/src/check_jsonschema/builtin_schemas/vendor/renovate.sha256 b/src/check_jsonschema/builtin_schemas/vendor/renovate.sha256 index 48f091327..d2a307699 100644 --- a/src/check_jsonschema/builtin_schemas/vendor/renovate.sha256 +++ b/src/check_jsonschema/builtin_schemas/vendor/renovate.sha256 @@ -1 +1 @@ -f0779dfecae62b7cc631efdd770881082d267830066ae568efdecef67d104266 \ No newline at end of file +22c8956410e52143faee5efd537aca3f69fd71fedaec720a2d7e665f2c970850 \ No newline at end of file From b45c88ef97a0d933a1c730471fcdbcee124f9a0c Mon Sep 17 00:00:00 2001 From: Stephen Rosen Date: Wed, 27 Sep 2023 22:29:10 -0500 Subject: [PATCH 21/21] Bump version and changelog for release --- CHANGELOG.rst | 10 ++++++++-- README.md | 2 +- docs/optional_parsers.rst | 4 ++-- docs/precommit_usage.rst | 32 ++++++++++++++++---------------- setup.cfg | 2 +- 5 files changed, 28 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 017f22776..2ec7c9d2e 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -10,10 +10,16 @@ Unreleased .. vendor-insert-here -- Update vendored schemas (2023-09-27) +0.27.0 +------ + +- Update vendored schemas: azure-pipelines, bitbucket-pipelines, gitlab-ci, + renovate (2023-09-27) - Add a ``--validator-class`` option for specifying a custom ``jsonschema.protocols.Validator`` class to use (:pr:`327`, :issue:`262`) -- Minor fix to hook regexes to explicitly match `.` chars. Thanks +- Instances and schemas may now be passed on stdin, using ``-`` (:pr:`332`, + :issue:`251`) +- Minor fix to hook regexes to explicitly match ``.`` chars. Thanks :user:`skwde`! (:pr:`325`) 0.26.3 diff --git a/README.md b/README.md index 2ba6bbbe2..89bc68139 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ files. ```yaml - repo: https://github.com/python-jsonschema/check-jsonschema - rev: 0.26.3 + rev: 0.27.0 hooks: - id: check-github-workflows args: ["--verbose"] diff --git a/docs/optional_parsers.rst b/docs/optional_parsers.rst index 52713500a..107e98a9d 100644 --- a/docs/optional_parsers.rst +++ b/docs/optional_parsers.rst @@ -20,7 +20,7 @@ For example, .. code-block:: yaml - repo: https://github.com/python-jsonschema/check-jsonschema - rev: 0.26.3 + rev: 0.27.0 hooks: - id: check-renovate additional_dependencies: ['pyjson5'] @@ -39,7 +39,7 @@ For example, .. code-block:: yaml - repo: https://github.com/python-jsonschema/check-jsonschema - rev: 0.26.3 + rev: 0.27.0 hooks: - id: check-jsonschema name: 'Check GitHub Workflows' diff --git a/docs/precommit_usage.rst b/docs/precommit_usage.rst index 7f8885e3b..2b2bd4198 100644 --- a/docs/precommit_usage.rst +++ b/docs/precommit_usage.rst @@ -17,7 +17,7 @@ You must specify a schema using pre-commit ``args`` configuration. :caption: example config - repo: https://github.com/python-jsonschema/check-jsonschema - rev: 0.26.3 + rev: 0.27.0 hooks: - id: check-jsonschema files: ^data/.*\.json$ @@ -34,7 +34,7 @@ Validate JSON Schema files against their matching metaschema, as specified in th :caption: example config - repo: https://github.com/python-jsonschema/check-jsonschema - rev: 0.26.3 + rev: 0.27.0 hooks: - id: check-metaschema files: ^schemas/.*\.json$ @@ -52,7 +52,7 @@ Validate Azure Pipelines config against the schema provided by Microsoft :caption: example config - repo: https://github.com/python-jsonschema/check-jsonschema - rev: 0.26.3 + rev: 0.27.0 hooks: - id: check-azure-pipelines @@ -66,7 +66,7 @@ Validate Bamboo Specs against the schema provided by SchemaStore :caption: example config - repo: https://github.com/python-jsonschema/check-jsonschema - rev: 0.26.3 + rev: 0.27.0 hooks: - id: check-bamboo-spec @@ -80,7 +80,7 @@ Validate Bitbucket Pipelines against the schema provided by SchemaStore :caption: example config - repo: https://github.com/python-jsonschema/check-jsonschema - rev: 0.26.3 + rev: 0.27.0 hooks: - id: check-bitbucket-pipelines @@ -94,7 +94,7 @@ Validate Buildkite Pipelines against the schema provided by Buildkite :caption: example config - repo: https://github.com/python-jsonschema/check-jsonschema - rev: 0.26.3 + rev: 0.27.0 hooks: - id: check-buildkite @@ -108,7 +108,7 @@ Validate Dependabot Config (v2) against the schema provided by SchemaStore :caption: example config - repo: https://github.com/python-jsonschema/check-jsonschema - rev: 0.26.3 + rev: 0.27.0 hooks: - id: check-dependabot @@ -122,7 +122,7 @@ Validate Drone-CI Config against the schema provided by SchemaStore :caption: example config - repo: https://github.com/python-jsonschema/check-jsonschema - rev: 0.26.3 + rev: 0.27.0 hooks: - id: check-drone-ci @@ -136,7 +136,7 @@ Validate GitHub Actions against the schema provided by SchemaStore :caption: example config - repo: https://github.com/python-jsonschema/check-jsonschema - rev: 0.26.3 + rev: 0.27.0 hooks: - id: check-github-actions @@ -150,7 +150,7 @@ Validate GitHub Workflows against the schema provided by SchemaStore :caption: example config - repo: https://github.com/python-jsonschema/check-jsonschema - rev: 0.26.3 + rev: 0.27.0 hooks: - id: check-github-workflows @@ -164,7 +164,7 @@ Validate GitLab CI config against the schema provided by SchemaStore :caption: example config - repo: https://github.com/python-jsonschema/check-jsonschema - rev: 0.26.3 + rev: 0.27.0 hooks: - id: check-gitlab-ci @@ -178,7 +178,7 @@ Validate ReadTheDocs config against the schema provided by ReadTheDocs :caption: example config - repo: https://github.com/python-jsonschema/check-jsonschema - rev: 0.26.3 + rev: 0.27.0 hooks: - id: check-readthedocs @@ -192,7 +192,7 @@ Validate Renovate config against the schema provided by Renovate (does not suppo :caption: example config - repo: https://github.com/python-jsonschema/check-jsonschema - rev: 0.26.3 + rev: 0.27.0 hooks: - id: check-renovate @@ -206,7 +206,7 @@ Validate Travis Config against the schema provided by SchemaStore :caption: example config - repo: https://github.com/python-jsonschema/check-jsonschema - rev: 0.26.3 + rev: 0.27.0 hooks: - id: check-travis @@ -232,7 +232,7 @@ manually, you could do this: .. code-block:: yaml - repo: https://github.com/python-jsonschema/check-jsonschema - rev: 0.26.3 + rev: 0.27.0 hooks: - id: check-jsonschema name: "Check GitHub Workflows" @@ -251,7 +251,7 @@ To check with the builtin schema that a GitHub workflow sets .. code-block:: yaml - repo: https://github.com/python-jsonschema/check-jsonschema - rev: 0.26.3 + rev: 0.27.0 hooks: - id: check-jsonschema name: "Check GitHub Workflows set timeout-minutes" diff --git a/setup.cfg b/setup.cfg index b5e43dcde..f7d97f808 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = check-jsonschema -version = 0.26.3 +version = 0.27.0 description = A jsonschema CLI and pre-commit hook long_description = file: README.md long_description_content_type = text/markdown