Skip to content

Commit

Permalink
validate args before constructing Parameter object
Browse files Browse the repository at this point in the history
added semver pattern for the most thorough users
compile
  • Loading branch information
why-not-try-calmer committed Oct 2, 2023
1 parent ccb4c3f commit a12048d
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 2 deletions.
1 change: 1 addition & 0 deletions qgispluginci/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
28 changes: 26 additions & 2 deletions qgispluginci/parameters.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
17 changes: 17 additions & 0 deletions test/test_release.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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()

0 comments on commit a12048d

Please sign in to comment.