diff --git a/src/pycalver/v2patterns.py b/src/pycalver/v2patterns.py index 6e33891..3336dce 100644 --- a/src/pycalver/v2patterns.py +++ b/src/pycalver/v2patterns.py @@ -64,27 +64,27 @@ PART_PATTERNS = { 'GG' : r"[1-9][0-9]?", '0G' : r"[0-9]{2}", 'Q' : r"[1-4]", - 'MM' : r"(?:1[0-2]|[1-9])", - '0M' : r"(?:1[0-2]|0[1-9])", - 'DD' : r"(?:3[0-1]|[1-2][0-9]|[1-9])", - '0D' : r"(?:3[0-1]|[1-2][0-9]|0[1-9])", - 'JJJ' : r"(?:36[0-6]|3[0-5][0-9]|[1-2][0-9][0-9]|[1-9][0-9]|[1-9])", - '00J' : r"(?:36[0-6]|3[0-5][0-9]|[1-2][0-9][0-9]|0[1-9][0-9]|00[1-9])", + 'MM' : r"1[0-2]|[1-9]", + '0M' : r"1[0-2]|0[1-9]", + 'DD' : r"3[0-1]|[1-2][0-9]|[1-9]", + '0D' : r"3[0-1]|[1-2][0-9]|0[1-9]", + 'JJJ' : r"36[0-6]|3[0-5][0-9]|[1-2][0-9][0-9]|[1-9][0-9]|[1-9]", + '00J' : r"36[0-6]|3[0-5][0-9]|[1-2][0-9][0-9]|0[1-9][0-9]|00[1-9]", # week numbering parts - 'WW': r"(?:5[0-2]|[1-4][0-9]|[0-9])", - '0W': r"(?:5[0-2]|[0-4][0-9])", - 'UU': r"(?:5[0-2]|[1-4][0-9]|[0-9])", - '0U': r"(?:5[0-2]|[0-4][0-9])", - 'VV': r"(?:5[0-3]|[1-4][0-9]|[1-9])", - '0V': r"(?:5[0-3]|[1-4][0-9]|0[1-9])", + 'WW': r"5[0-2]|[1-4][0-9]|[0-9]", + '0W': r"5[0-2]|[0-4][0-9]", + 'UU': r"5[0-2]|[1-4][0-9]|[0-9]", + '0U': r"5[0-2]|[0-4][0-9]", + 'VV': r"5[0-3]|[1-4][0-9]|[1-9]", + '0V': r"5[0-3]|[1-4][0-9]|0[1-9]", # non calver parts 'MAJOR' : r"[0-9]+", 'MINOR' : r"[0-9]+", 'PATCH' : r"[0-9]+", 'BUILD' : r"[0-9]+", 'BLD' : r"[1-9][0-9]*", - 'RELEASE': r"(?:preview|final|alpha|beta|post|pre|dev|rc|a|b|c|r)", - 'PYTAG' : r"(?:post|dev|rc|a|b)", + 'RELEASE': r"preview|final|alpha|beta|post|rc", + 'PYTAG' : r"post|rc|a|b", 'NUM' : r"[0-9]+", } diff --git a/test/test_patterns.py b/test/test_patterns.py index e51be13..7c6302b 100644 --- a/test/test_patterns.py +++ b/test/test_patterns.py @@ -147,21 +147,27 @@ V2_PART_PATTERN_CASES = [ ] +def _compile_part_re(pattern_str): + grouped_pattern_str = r"(?:" + pattern_str + r")" + return re.compile(grouped_pattern_str) + + @pytest.mark.parametrize("parts, testcase, expected", V2_PART_PATTERN_CASES) -def test_part_patterns(parts, testcase, expected): +def test_v2_part_patterns(parts, testcase, expected): for part in parts: - pattern_str = v2patterns.PART_PATTERNS[part] - match = re.match("^" + pattern_str + "$", testcase) + part_re = _compile_part_re(v2patterns.PART_PATTERNS[part]) + match = part_re.match(testcase) assert (match is None and expected is None) or (match.group(0) == expected) -def _part_re_by_name(name): - return re.compile(v1patterns.PART_PATTERNS[name]) +@pytest.mark.parametrize("part_name", v2patterns.PART_PATTERNS.keys()) +def test_v1_part_compilation(part_name): + assert _compile_part_re(v2patterns.PART_PATTERNS[part_name]) @pytest.mark.parametrize("part_name", v1patterns.PART_PATTERNS.keys()) -def test_part_compilation(part_name): - assert _part_re_by_name(part_name) +def test_v2_part_compilation(part_name): + assert _compile_part_re(v1patterns.PART_PATTERNS[part_name]) PATTERN_PART_CASES = [ @@ -194,8 +200,8 @@ PATTERN_PART_CASES = [ @pytest.mark.parametrize("part_name, line, expected", PATTERN_PART_CASES) -def test_re_pattern_parts(part_name, line, expected): - part_re = _part_re_by_name(part_name) +def test_v1_re_pattern_parts(part_name, line, expected): + part_re = _compile_part_re(v1patterns.PART_PATTERNS[part_name]) result = part_re.search(line) if result is None: assert expected is None, (part_name, line) @@ -213,7 +219,7 @@ PATTERN_V1_CASES = [ @pytest.mark.parametrize("pattern_str, line, expected", PATTERN_V1_CASES) -def test_patterns_v1(pattern_str, line, expected): +def test_v1_patterns(pattern_str, line, expected): pattern = v1patterns.compile_pattern(pattern_str) result = pattern.regexp.search(line) if result is None: @@ -234,7 +240,7 @@ PATTERN_V2_CASES = [ @pytest.mark.parametrize("pattern_str, line, expected", PATTERN_V2_CASES) -def test_patterns_v2(pattern_str, line, expected): +def test_v2_patterns(pattern_str, line, expected): pattern = v2patterns.compile_pattern(pattern_str) result = pattern.regexp.search(line) result_val = None if result is None else result.group(0)