From a12048d082ea216ea64782a862488b7e21c13b2d Mon Sep 17 00:00:00 2001 From: why-not-try-calmer Date: Mon, 2 Oct 2023 23:36:40 +0200 Subject: [PATCH 01/16] validate args before constructing Parameter object added semver pattern for the most thorough users compile --- qgispluginci/cli.py | 1 + qgispluginci/parameters.py | 28 ++++++++++++++++++++++++++-- test/test_release.py | 17 +++++++++++++++++ 3 files changed, 44 insertions(+), 2 deletions(-) diff --git a/qgispluginci/cli.py b/qgispluginci/cli.py index 7d9f9de0..abe3ca7f 100755 --- a/qgispluginci/cli.py +++ b/qgispluginci/cli.py @@ -152,6 +152,7 @@ def cli(): push_tr_parser.add_argument("transifex_token", help="The Transifex API token") args = parser.parse_args() + Parameters.validate_args(args) # set log level depending on verbosity argument args.verbosity = 40 - (10 * args.verbosity) if args.verbosity > 0 else 0 diff --git a/qgispluginci/parameters.py b/qgispluginci/parameters.py index ba4ac862..0a2a0f9d 100644 --- a/qgispluginci/parameters.py +++ b/qgispluginci/parameters.py @@ -8,14 +8,17 @@ # ########## Libraries ############# # ################################## -# standard library import configparser import datetime import logging import os +import re import sys + +# standard library +from argparse import Namespace from pathlib import Path -from typing import Any, Callable, Dict, Iterator, Literal, Optional, Tuple +from typing import Any, Callable, Dict, Iterator, Optional, Tuple import toml import yaml @@ -104,6 +107,17 @@ class Parameters: """ + release_version_patterns = { + "simple": re.compile(r"\d+\.\d+$"), + "double": re.compile(r"\d+\.\d+\.\d+$"), + "v2": re.compile(r"^v\d+\.\d+$"), + "v3": re.compile(r"^v\d+\.\d+\.\d+$"), + # See https://github.com/semver/semver/blob/master/semver.md#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string + "semver": re.compile( + r"^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$" + ), + } + @classmethod def make_from( cls, *, args: Optional[Any] = None, path_to_config_file: Optional[Path] = None @@ -228,6 +242,16 @@ def __init__(self, definition: Dict[str, Any]): ) self.repository_url = get_metadata("repository") + @staticmethod + def validate_args(args: Namespace): + if args.release_version and not any( + re.match(pattern, args.release_version) + for pattern in Parameters.release_version_patterns.values() + ): + raise ValueError( + f"Unable to validate the release version '{args.release_version}'. Please use a version name that looks like this: 'v1.1.1', 'v1.1', '1.0.1', '1.1'." + ) + @staticmethod def archive_name( plugin_name, release_version: str, experimental: bool = False diff --git a/test/test_release.py b/test/test_release.py index ab4783b4..014d49f5 100644 --- a/test/test_release.py +++ b/test/test_release.py @@ -6,6 +6,7 @@ import re import unittest import urllib.request +from itertools import product from pathlib import Path from tempfile import mkstemp from zipfile import ZipFile @@ -205,6 +206,22 @@ def test_release_changelog(self): # Commit sha1 not in the metadata.txt self.assertEqual(0, len(re.findall(r"commitSha1=\d+", str(data)))) + def test_release_version(self): + valid_tags = ["v1.1.1", "v1.1", "1.0.1", "1.1", "1.0.0-alpha", "1.0.0-dev"] + invalid_tags = ["1", "v1", ".", ".1"] + valid_results = {tag: [] for tag in valid_tags} + invalid_results = {tag: [] for tag in invalid_tags} + + for key, cand in product(Parameters.release_version_patterns, valid_results): + if re.match(Parameters.release_version_patterns[key], cand): + valid_results[cand].append(key) + self.assertTrue(all(valid_results.values())) + + for key, cand in product(Parameters.release_version_patterns, invalid_results): + if re.match(Parameters.release_version_patterns[key], cand): + invalid_results[cand].append(key) + self.assertFalse(any(invalid_results.values())) + if __name__ == "__main__": unittest.main() From 62e82c47257570a2417fc78b8811f367de441167 Mon Sep 17 00:00:00 2001 From: why-not-try-calmer Date: Wed, 4 Oct 2023 12:12:06 +0200 Subject: [PATCH 02/16] enabled turning off validation; added warning; added tests --- qgispluginci/cli.py | 5 +++++ qgispluginci/parameters.py | 37 ++++++++++++++++++++++--------------- test/test_release.py | 27 ++++++++++++++++++++++----- 3 files changed, 49 insertions(+), 20 deletions(-) diff --git a/qgispluginci/cli.py b/qgispluginci/cli.py index abe3ca7f..73b06067 100755 --- a/qgispluginci/cli.py +++ b/qgispluginci/cli.py @@ -88,6 +88,11 @@ def cli(): release_parser.add_argument( "release_version", help="The version to be released (x.y.z)." ) + release_parser.add_argument( + "--no-validation", + action="store_false", + help="Turn off validation of `release version`", + ) release_parser.add_argument( "--release-tag", help="The release tag, if different from the version (e.g. vx.y.z).", diff --git a/qgispluginci/parameters.py b/qgispluginci/parameters.py index 0a2a0f9d..6f3bca1c 100644 --- a/qgispluginci/parameters.py +++ b/qgispluginci/parameters.py @@ -107,17 +107,6 @@ class Parameters: """ - release_version_patterns = { - "simple": re.compile(r"\d+\.\d+$"), - "double": re.compile(r"\d+\.\d+\.\d+$"), - "v2": re.compile(r"^v\d+\.\d+$"), - "v3": re.compile(r"^v\d+\.\d+\.\d+$"), - # See https://github.com/semver/semver/blob/master/semver.md#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string - "semver": re.compile( - r"^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$" - ), - } - @classmethod def make_from( cls, *, args: Optional[Any] = None, path_to_config_file: Optional[Path] = None @@ -242,14 +231,32 @@ def __init__(self, definition: Dict[str, Any]): ) self.repository_url = get_metadata("repository") + @staticmethod + def get_release_version_patterns() -> dict[str, re.Pattern]: + return { + "simple": r"\d+\.\d+$", + "double": r"\d+\.\d+\.\d+$", + "v2": r"^v\d+\.\d+$", + "v3": r"^v\d+\.\d+\.\d+$", + # See https://github.com/semver/semver/blob/master/semver.md#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string + "semver": r"^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$", + } + @staticmethod def validate_args(args: Namespace): - if args.release_version and not any( - re.match(pattern, args.release_version) - for pattern in Parameters.release_version_patterns.values() + if not args.release_version: + return + if not args.no_validation: + logger.warning( + f"Disabled release version validation for '{args.release_version}'." + ) + return + patterns = Parameters.get_release_version_patterns() + if not any( + re.match(pattern, args.release_version) for pattern in patterns.values() ): raise ValueError( - f"Unable to validate the release version '{args.release_version}'. Please use a version name that looks like this: 'v1.1.1', 'v1.1', '1.0.1', '1.1'." + f"Unable to validate the release version '{args.release_version}'. You can disable validation by running the very command with an extra '--no-validation'. Otherwise please use a release version identifier in the shape of 'v1.1.1', 'v1.1', '1.0.1', '1.1'. Version semantic (semvar) identifiers are even better. Take a look at https://en.wikipedia.org/wiki/Software_versioning#Semantic_versioning for a refresher." ) @staticmethod diff --git a/test/test_release.py b/test/test_release.py index 014d49f5..a905ac7c 100644 --- a/test/test_release.py +++ b/test/test_release.py @@ -1,6 +1,7 @@ #! /usr/bin/env python # standard +import argparse import filecmp import os import re @@ -206,22 +207,38 @@ def test_release_changelog(self): # Commit sha1 not in the metadata.txt self.assertEqual(0, len(re.findall(r"commitSha1=\d+", str(data)))) - def test_release_version(self): + def test_release_version_validated_patterns(self): valid_tags = ["v1.1.1", "v1.1", "1.0.1", "1.1", "1.0.0-alpha", "1.0.0-dev"] invalid_tags = ["1", "v1", ".", ".1"] valid_results = {tag: [] for tag in valid_tags} invalid_results = {tag: [] for tag in invalid_tags} - for key, cand in product(Parameters.release_version_patterns, valid_results): - if re.match(Parameters.release_version_patterns[key], cand): + patterns = Parameters.get_release_version_patterns() + for key, cand in product(patterns, valid_results): + if re.match(patterns[key], cand): valid_results[cand].append(key) self.assertTrue(all(valid_results.values())) - for key, cand in product(Parameters.release_version_patterns, invalid_results): - if re.match(Parameters.release_version_patterns[key], cand): + for key, cand in product(patterns, invalid_results): + if re.match(patterns[key], cand): invalid_results[cand].append(key) self.assertFalse(any(invalid_results.values())) + def test_release_version_validation_on(self): + parser = argparse.ArgumentParser() + parser.add_argument("release_version") + parser.add_argument("--no-validation", action="store_false") + args = parser.parse_args(["v1"]) + with self.assertRaises(ValueError): + Parameters.validate_args(args) + + def test_release_version_validation_off(self): + parser = argparse.ArgumentParser() + parser.add_argument("release_version") + parser.add_argument("--no-validation", action="store_false") + args = parser.parse_args([".", "--no-validation"]) + Parameters.validate_args(args) + if __name__ == "__main__": unittest.main() From 81ccd0103e2e83855c4c02bf8b4c5263c07a93d9 Mon Sep 17 00:00:00 2001 From: why-not-try-calmer Date: Wed, 4 Oct 2023 12:14:34 +0200 Subject: [PATCH 03/16] language --- qgispluginci/parameters.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qgispluginci/parameters.py b/qgispluginci/parameters.py index 6f3bca1c..8e541471 100644 --- a/qgispluginci/parameters.py +++ b/qgispluginci/parameters.py @@ -256,7 +256,7 @@ def validate_args(args: Namespace): re.match(pattern, args.release_version) for pattern in patterns.values() ): raise ValueError( - f"Unable to validate the release version '{args.release_version}'. You can disable validation by running the very command with an extra '--no-validation'. Otherwise please use a release version identifier in the shape of 'v1.1.1', 'v1.1', '1.0.1', '1.1'. Version semantic (semvar) identifiers are even better. Take a look at https://en.wikipedia.org/wiki/Software_versioning#Semantic_versioning for a refresher." + f"Unable to validate the release version '{args.release_version}'. You can disable validation by running this command again with an extra '--no-validation' flag. Otherwise please use a release version identifier in the shape of 'v1.1.1', 'v1.1', '1.0.1', '1.1'. Version semantic (semvar) identifiers are recommended. Take a look at https://en.wikipedia.org/wiki/Software_versioning#Semantic_versioning for a refresher." ) @staticmethod From 71a71311e8b297bc194ee7d53d0ca1cb572a74d0 Mon Sep 17 00:00:00 2001 From: why-not-try-calmer Date: Wed, 4 Oct 2023 12:18:00 +0200 Subject: [PATCH 04/16] type hints --- qgispluginci/parameters.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qgispluginci/parameters.py b/qgispluginci/parameters.py index 8e541471..11340823 100644 --- a/qgispluginci/parameters.py +++ b/qgispluginci/parameters.py @@ -232,7 +232,7 @@ def __init__(self, definition: Dict[str, Any]): self.repository_url = get_metadata("repository") @staticmethod - def get_release_version_patterns() -> dict[str, re.Pattern]: + def get_release_version_patterns() -> Dict[str, re.Pattern]: return { "simple": r"\d+\.\d+$", "double": r"\d+\.\d+\.\d+$", From 9e6239165b4eb8fb709756cf76d1111700897f66 Mon Sep 17 00:00:00 2001 From: why-not-try-calmer Date: Wed, 4 Oct 2023 12:38:26 +0200 Subject: [PATCH 05/16] more user-friendliness --- qgispluginci/parameters.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/qgispluginci/parameters.py b/qgispluginci/parameters.py index 11340823..d6482c85 100644 --- a/qgispluginci/parameters.py +++ b/qgispluginci/parameters.py @@ -246,14 +246,16 @@ def get_release_version_patterns() -> Dict[str, re.Pattern]: def validate_args(args: Namespace): if not args.release_version: return + patterns = Parameters.get_release_version_patterns() if not args.no_validation: - logger.warning( - f"Disabled release version validation for '{args.release_version}'." - ) + msg = f"Disabled release version validation." + if not re.match(patterns.pop("semver"), args.release_version): + msg += f" Be aware that '{args.release_version}' is not a semver-compliant version." + logger.warning(msg) return - patterns = Parameters.get_release_version_patterns() if not any( - re.match(pattern, args.release_version) for pattern in patterns.values() + re.match(other_pattern, args.release_version) + for other_pattern in patterns.values() ): raise ValueError( f"Unable to validate the release version '{args.release_version}'. You can disable validation by running this command again with an extra '--no-validation' flag. Otherwise please use a release version identifier in the shape of 'v1.1.1', 'v1.1', '1.0.1', '1.1'. Version semantic (semvar) identifiers are recommended. Take a look at https://en.wikipedia.org/wiki/Software_versioning#Semantic_versioning for a refresher." From f726152276d67bbfe70cf22725fab9b0e28e4a1a Mon Sep 17 00:00:00 2001 From: why-not-try-calmer Date: Wed, 4 Oct 2023 13:09:16 +0200 Subject: [PATCH 06/16] code legibility --- qgispluginci/parameters.py | 12 ++++++++---- test/test_release.py | 2 +- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/qgispluginci/parameters.py b/qgispluginci/parameters.py index d6482c85..1aa77570 100644 --- a/qgispluginci/parameters.py +++ b/qgispluginci/parameters.py @@ -246,13 +246,17 @@ def get_release_version_patterns() -> Dict[str, re.Pattern]: def validate_args(args: Namespace): if not args.release_version: return + patterns = Parameters.get_release_version_patterns() + if re.match(patterns.pop("semver"), args.release_version) is None: + logging.warning( + f"Be aware that '{args.release_version}' is not a semver-compliant version." + ) + if not args.no_validation: - msg = f"Disabled release version validation." - if not re.match(patterns.pop("semver"), args.release_version): - msg += f" Be aware that '{args.release_version}' is not a semver-compliant version." - logger.warning(msg) + logging.warning("Disabled release version validation.") return + if not any( re.match(other_pattern, args.release_version) for other_pattern in patterns.values() diff --git a/test/test_release.py b/test/test_release.py index a905ac7c..13fdfee2 100644 --- a/test/test_release.py +++ b/test/test_release.py @@ -207,7 +207,7 @@ def test_release_changelog(self): # Commit sha1 not in the metadata.txt self.assertEqual(0, len(re.findall(r"commitSha1=\d+", str(data)))) - def test_release_version_validated_patterns(self): + def test_release_version_valid_invalid(self): valid_tags = ["v1.1.1", "v1.1", "1.0.1", "1.1", "1.0.0-alpha", "1.0.0-dev"] invalid_tags = ["1", "v1", ".", ".1"] valid_results = {tag: [] for tag in valid_tags} From bd4c62d0251b060b6416c8715513919e76de5c8c Mon Sep 17 00:00:00 2001 From: why-not-try-calmer Date: Wed, 4 Oct 2023 13:14:18 +0200 Subject: [PATCH 07/16] loose ends --- qgispluginci/parameters.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/qgispluginci/parameters.py b/qgispluginci/parameters.py index 1aa77570..54c78d73 100644 --- a/qgispluginci/parameters.py +++ b/qgispluginci/parameters.py @@ -248,7 +248,9 @@ def validate_args(args: Namespace): return patterns = Parameters.get_release_version_patterns() - if re.match(patterns.pop("semver"), args.release_version) is None: + semvar_compliance = re.match(patterns.pop("semver"), args.release_version) + + if semvar_compliance is None: logging.warning( f"Be aware that '{args.release_version}' is not a semver-compliant version." ) @@ -257,7 +259,7 @@ def validate_args(args: Namespace): logging.warning("Disabled release version validation.") return - if not any( + if not semvar_compliance or not any( re.match(other_pattern, args.release_version) for other_pattern in patterns.values() ): From 3f01fc602c81722f259f0424d619029f46a8597b Mon Sep 17 00:00:00 2001 From: why-not-try-calmer Date: Wed, 4 Oct 2023 13:15:30 +0200 Subject: [PATCH 08/16] simplified --- qgispluginci/parameters.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qgispluginci/parameters.py b/qgispluginci/parameters.py index 54c78d73..d6cdc4ba 100644 --- a/qgispluginci/parameters.py +++ b/qgispluginci/parameters.py @@ -259,7 +259,7 @@ def validate_args(args: Namespace): logging.warning("Disabled release version validation.") return - if not semvar_compliance or not any( + if semvar_compliance or any( re.match(other_pattern, args.release_version) for other_pattern in patterns.values() ): From 6c48654e8b0204098522705a67d7ca04ec3591ac Mon Sep 17 00:00:00 2001 From: why-not-try-calmer Date: Wed, 4 Oct 2023 13:25:05 +0200 Subject: [PATCH 09/16] fix missing return --- qgispluginci/parameters.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/qgispluginci/parameters.py b/qgispluginci/parameters.py index d6cdc4ba..b42b8fcc 100644 --- a/qgispluginci/parameters.py +++ b/qgispluginci/parameters.py @@ -250,7 +250,7 @@ def validate_args(args: Namespace): patterns = Parameters.get_release_version_patterns() semvar_compliance = re.match(patterns.pop("semver"), args.release_version) - if semvar_compliance is None: + if not semvar_compliance: logging.warning( f"Be aware that '{args.release_version}' is not a semver-compliant version." ) @@ -263,9 +263,11 @@ def validate_args(args: Namespace): re.match(other_pattern, args.release_version) for other_pattern in patterns.values() ): - raise ValueError( - f"Unable to validate the release version '{args.release_version}'. You can disable validation by running this command again with an extra '--no-validation' flag. Otherwise please use a release version identifier in the shape of 'v1.1.1', 'v1.1', '1.0.1', '1.1'. Version semantic (semvar) identifiers are recommended. Take a look at https://en.wikipedia.org/wiki/Software_versioning#Semantic_versioning for a refresher." - ) + return + + raise ValueError( + f"Unable to validate the release version '{args.release_version}'. You can disable validation by running this command again with an extra '--no-validation' flag. Otherwise please use a release version identifier in the shape of 'v1.1.1', 'v1.1', '1.0.1', '1.1'. Version semantic (semvar) identifiers are recommended. Take a look at https://en.wikipedia.org/wiki/Software_versioning#Semantic_versioning for a refresher." + ) @staticmethod def archive_name( From 0ad704debc39adf7e029c28d806b9cbbfe8685ff Mon Sep 17 00:00:00 2001 From: why-not-try-calmer Date: Wed, 4 Oct 2023 13:26:12 +0200 Subject: [PATCH 10/16] typo --- qgispluginci/parameters.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/qgispluginci/parameters.py b/qgispluginci/parameters.py index b42b8fcc..656ac4c5 100644 --- a/qgispluginci/parameters.py +++ b/qgispluginci/parameters.py @@ -248,9 +248,9 @@ def validate_args(args: Namespace): return patterns = Parameters.get_release_version_patterns() - semvar_compliance = re.match(patterns.pop("semver"), args.release_version) + semver_compliance = re.match(patterns.pop("semver"), args.release_version) - if not semvar_compliance: + if not semver_compliance: logging.warning( f"Be aware that '{args.release_version}' is not a semver-compliant version." ) @@ -259,7 +259,7 @@ def validate_args(args: Namespace): logging.warning("Disabled release version validation.") return - if semvar_compliance or any( + if semver_compliance or any( re.match(other_pattern, args.release_version) for other_pattern in patterns.values() ): From ab62d376bee3a732417897b4576a353f39d490dc Mon Sep 17 00:00:00 2001 From: why-not-try-calmer Date: Wed, 4 Oct 2023 13:31:23 +0200 Subject: [PATCH 11/16] docstring --- qgispluginci/parameters.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/qgispluginci/parameters.py b/qgispluginci/parameters.py index 656ac4c5..7c8f0678 100644 --- a/qgispluginci/parameters.py +++ b/qgispluginci/parameters.py @@ -244,6 +244,12 @@ def get_release_version_patterns() -> Dict[str, re.Pattern]: @staticmethod def validate_args(args: Namespace): + """ + Raise an exception just in case: + - the user didn't opt-out of validation using the `--no-validation` flag; and + - the value of `release_version` matches no supported pattern. + In any case, warn the user if the value of `release_version` doesn't match the semver pattern. + """ if not args.release_version: return From 98443322c4e29d56011c97603b37bd90c336d4fe Mon Sep 17 00:00:00 2001 From: why-not-try-calmer Date: Wed, 4 Oct 2023 13:34:17 +0200 Subject: [PATCH 12/16] msg --- qgispluginci/parameters.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qgispluginci/parameters.py b/qgispluginci/parameters.py index 7c8f0678..7cec0d85 100644 --- a/qgispluginci/parameters.py +++ b/qgispluginci/parameters.py @@ -272,7 +272,7 @@ def validate_args(args: Namespace): return raise ValueError( - f"Unable to validate the release version '{args.release_version}'. You can disable validation by running this command again with an extra '--no-validation' flag. Otherwise please use a release version identifier in the shape of 'v1.1.1', 'v1.1', '1.0.1', '1.1'. Version semantic (semvar) identifiers are recommended. Take a look at https://en.wikipedia.org/wiki/Software_versioning#Semantic_versioning for a refresher." + f"Unable to validate the release version '{args.release_version}'. You can disable validation by running this command again with an extra '--no-validation' flag. Otherwise please use a release version identifier in the shape of 'v1.1.1', 'v1.1', '1.0.1', '1.1'. Semantic versioning (semvar) identifiers are recommended. Take a look at https://en.wikipedia.org/wiki/Software_versioning#Semantic_versioning for a refresher." ) @staticmethod From ba211f4f7acf95a66d9d6135d93d10cef21752c0 Mon Sep 17 00:00:00 2001 From: why-not-try-calmer Date: Wed, 4 Oct 2023 16:44:31 +0200 Subject: [PATCH 13/16] negation --- qgispluginci/cli.py | 2 +- qgispluginci/parameters.py | 2 +- test/test_release.py | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/qgispluginci/cli.py b/qgispluginci/cli.py index 73b06067..c115239f 100755 --- a/qgispluginci/cli.py +++ b/qgispluginci/cli.py @@ -90,7 +90,7 @@ def cli(): ) release_parser.add_argument( "--no-validation", - action="store_false", + action="store_true", help="Turn off validation of `release version`", ) release_parser.add_argument( diff --git a/qgispluginci/parameters.py b/qgispluginci/parameters.py index 7cec0d85..41852ad6 100644 --- a/qgispluginci/parameters.py +++ b/qgispluginci/parameters.py @@ -261,7 +261,7 @@ def validate_args(args: Namespace): f"Be aware that '{args.release_version}' is not a semver-compliant version." ) - if not args.no_validation: + if args.no_validation: logging.warning("Disabled release version validation.") return diff --git a/test/test_release.py b/test/test_release.py index 13fdfee2..ee10ed71 100644 --- a/test/test_release.py +++ b/test/test_release.py @@ -227,7 +227,7 @@ def test_release_version_valid_invalid(self): def test_release_version_validation_on(self): parser = argparse.ArgumentParser() parser.add_argument("release_version") - parser.add_argument("--no-validation", action="store_false") + parser.add_argument("--no-validation", action="store_true") args = parser.parse_args(["v1"]) with self.assertRaises(ValueError): Parameters.validate_args(args) @@ -235,7 +235,7 @@ def test_release_version_validation_on(self): def test_release_version_validation_off(self): parser = argparse.ArgumentParser() parser.add_argument("release_version") - parser.add_argument("--no-validation", action="store_false") + parser.add_argument("--no-validation", action="store_true") args = parser.parse_args([".", "--no-validation"]) Parameters.validate_args(args) From 1d75e6e596abf2f9d887b102297ee2a5bfface50 Mon Sep 17 00:00:00 2001 From: why-not-try-calmer Date: Wed, 4 Oct 2023 18:41:00 +0200 Subject: [PATCH 14/16] more visible test expectations & results --- test/test_release.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/test/test_release.py b/test/test_release.py index ee10ed71..805ba8d8 100644 --- a/test/test_release.py +++ b/test/test_release.py @@ -210,15 +210,22 @@ def test_release_changelog(self): def test_release_version_valid_invalid(self): valid_tags = ["v1.1.1", "v1.1", "1.0.1", "1.1", "1.0.0-alpha", "1.0.0-dev"] invalid_tags = ["1", "v1", ".", ".1"] + expected_valid_results = { + "v1.1.1": ["v3"], + "v1.1": ["v2"], + "1.0.1": ["double", "semver"], + "1.1": ["simple"], + "1.0.0-alpha": ["semver"], + "1.0.0-dev": ["semver"], + } valid_results = {tag: [] for tag in valid_tags} - invalid_results = {tag: [] for tag in invalid_tags} - patterns = Parameters.get_release_version_patterns() for key, cand in product(patterns, valid_results): if re.match(patterns[key], cand): valid_results[cand].append(key) - self.assertTrue(all(valid_results.values())) + self.assertEqual(valid_results, expected_valid_results) + invalid_results = {tag: [] for tag in invalid_tags} for key, cand in product(patterns, invalid_results): if re.match(patterns[key], cand): invalid_results[cand].append(key) From bbe4cbd33526a3cfe31e97bcfc79a4eefb060618 Mon Sep 17 00:00:00 2001 From: why-not-try-calmer Date: Mon, 9 Oct 2023 19:18:43 +0200 Subject: [PATCH 15/16] accomodated suggestion --- qgispluginci/parameters.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/qgispluginci/parameters.py b/qgispluginci/parameters.py index 41852ad6..27c63934 100644 --- a/qgispluginci/parameters.py +++ b/qgispluginci/parameters.py @@ -272,7 +272,13 @@ def validate_args(args: Namespace): return raise ValueError( - f"Unable to validate the release version '{args.release_version}'. You can disable validation by running this command again with an extra '--no-validation' flag. Otherwise please use a release version identifier in the shape of 'v1.1.1', 'v1.1', '1.0.1', '1.1'. Semantic versioning (semvar) identifiers are recommended. Take a look at https://en.wikipedia.org/wiki/Software_versioning#Semantic_versioning for a refresher." + f""" + Unable to validate the release version '{args.release_version}'. + Please use a release version identifier such as '1.0.1' (recommended, semantic versioning), 'v1.1.1', 'v1.1', or '1.1'. + You can disable validation by running this command again with an extra '--no-validation' flag. + Semantic versioning (semvar) identifiers are recommended. + Take a look at https://en.wikipedia.org/wiki/Software_versioning#Semantic_versioning for a refresher." + """ ) @staticmethod From 5bfa5f6a71cdc184e9865b9a6f2842db7f01e743 Mon Sep 17 00:00:00 2001 From: why-not-try-calmer Date: Mon, 9 Oct 2023 19:20:14 +0200 Subject: [PATCH 16/16] phrasing --- qgispluginci/parameters.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qgispluginci/parameters.py b/qgispluginci/parameters.py index 27c63934..e9e98455 100644 --- a/qgispluginci/parameters.py +++ b/qgispluginci/parameters.py @@ -275,7 +275,7 @@ def validate_args(args: Namespace): f""" Unable to validate the release version '{args.release_version}'. Please use a release version identifier such as '1.0.1' (recommended, semantic versioning), 'v1.1.1', 'v1.1', or '1.1'. - You can disable validation by running this command again with an extra '--no-validation' flag. + Otherwise you can disable validation by running this command again with an extra '--no-validation' flag. Semantic versioning (semvar) identifiers are recommended. Take a look at https://en.wikipedia.org/wiki/Software_versioning#Semantic_versioning for a refresher." """