From 3ae4818d0aa975fc9da77350849c7551528d3ec6 Mon Sep 17 00:00:00 2001 From: lcavalcante <5858507+lcavalcante@users.noreply.github.com> Date: Mon, 12 May 2025 23:49:17 -0300 Subject: [PATCH 1/2] wip: regex Signed-off-by: lcavalcante <5858507+lcavalcante@users.noreply.github.com> --- pyvc/__main__.py | 2 +- pyvc/semver.py | 11 +++++++---- uv.lock | 6 +++--- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/pyvc/__main__.py b/pyvc/__main__.py index 4df4fb2..a5158f7 100644 --- a/pyvc/__main__.py +++ b/pyvc/__main__.py @@ -6,7 +6,7 @@ import sys import argparse import structlog -from pyvc.cli import main, validate_args +from pyvcc.cli import main, validate_args log = structlog.get_logger() diff --git a/pyvc/semver.py b/pyvc/semver.py index 2f815e8..8183459 100644 --- a/pyvc/semver.py +++ b/pyvc/semver.py @@ -98,16 +98,19 @@ def bump_type(cls, message: str) -> BumpEnum: head = message.split("\n")[0] # TODO: regex? - parsed_head = head.split(":") + parsed_head = head.split(": ") if len(parsed_head) > 1: - commit_type = parsed_head[0].strip().upper() + if parsed_head[0].strip().upper().startswith("MERGE"): + commit_type = parsed_head[1].strip().upper() + else: + commit_type = parsed_head[0].strip().upper() if cls.is_breaking_change(commit_type, message): bump = BumpEnum.MAJOR - elif commit_type == CommitEnum.FEAT.name: + elif commit_type.startswith(CommitEnum.FEAT.name): bump = BumpEnum.MINOR - elif commit_type == CommitEnum.FIX.name: + elif commit_type.startswith(CommitEnum.FIX.name): bump = BumpEnum.PATCH else: bump = BumpEnum.NO_BUMP diff --git a/uv.lock b/uv.lock index a54691a..ee1420b 100644 --- a/uv.lock +++ b/uv.lock @@ -355,9 +355,9 @@ wheels = [ ] [[package]] -name = "python-version-controller" -version = "0.2.1" -source = { virtual = "." } +name = "pyvcc" +version = "1.2.2" +source = { editable = "." } dependencies = [ { name = "pygit2" }, { name = "structlog" }, From 7f598d99c05921ed4087206d74642d22018ae6e6 Mon Sep 17 00:00:00 2001 From: Lucas Cavalcante <5858507+lcavalcante@users.noreply.github.com> Date: Sat, 17 May 2025 17:09:41 -0300 Subject: [PATCH 2/2] Merge with fix/regex --- pyvc/semver.py | 22 ++++++++++---------- tests/semver/test_bump_version.py | 34 +++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 11 deletions(-) diff --git a/pyvc/semver.py b/pyvc/semver.py index 8183459..a6f191a 100644 --- a/pyvc/semver.py +++ b/pyvc/semver.py @@ -1,7 +1,9 @@ -from enum import Enum, auto +import re import sys import structlog +from enum import Enum, auto + # Python 3.11+ has Self in typing module if sys.version_info >= (3, 11): from typing import Self @@ -94,28 +96,26 @@ def bump_type(cls, message: str) -> BumpEnum: message (str): commit message content """ + regex = re.compile(r"[.*]?([a-z]*!?)(\(.*\))?:\s(.*)$") bump = BumpEnum.NO_BUMP head = message.split("\n")[0] - # TODO: regex? - parsed_head = head.split(": ") + parsed_head = regex.search(head) - if len(parsed_head) > 1: - if parsed_head[0].strip().upper().startswith("MERGE"): - commit_type = parsed_head[1].strip().upper() - else: - commit_type = parsed_head[0].strip().upper() + if parsed_head is not None: + commit_type = parsed_head.groups()[0].upper() + log.debug("trying bump", type=commit_type, message=head) if cls.is_breaking_change(commit_type, message): bump = BumpEnum.MAJOR - elif commit_type.startswith(CommitEnum.FEAT.name): + elif commit_type == CommitEnum.FEAT.name: bump = BumpEnum.MINOR - elif commit_type.startswith(CommitEnum.FIX.name): + elif commit_type == CommitEnum.FIX.name: bump = BumpEnum.PATCH else: bump = BumpEnum.NO_BUMP else: - log.info("not in conventional commit spec", message=head) + log.error("not in conventional commit spec", message=head) return bump diff --git a/tests/semver/test_bump_version.py b/tests/semver/test_bump_version.py index 14a236d..9c75b8e 100644 --- a/tests/semver/test_bump_version.py +++ b/tests/semver/test_bump_version.py @@ -51,6 +51,20 @@ def test_no_bump_no_type(no_cc_simple_commit: tuple[str, str]): assert str(version) == "1.0.0" +def test_bump_merge(): + version = SemVer(1, 0, 0) + message = "Merged feat!(xyz): break" + version.bump_version(message) + assert str(version) == "2.0.0" + + +def test_bump_merge2(): + version = SemVer(1, 0, 0) + message = "Merged feat(xyz): break" + version.bump_version(message) + assert str(version) == "1.1.0" + + def test_bump_multiple(): """patch -> minor -> major""" version = SemVer(0, 1, 0) @@ -107,6 +121,26 @@ def test_bump_multiple4(): assert str(version) == "0.2.0" +def test_bump_multiple5(): + """patch -> patch -> minor""" + version = SemVer(0, 1, 0) + + version.bump_version("fix: Fix login bug") + assert str(version) == "0.1.1" + + version.bump_version("fix: Fix logout bug") + assert str(version) == "0.1.2" + + version.bump_version("Fix logout bug") + assert str(version) == "0.1.2" + + version.bump_version("feat(asdf): Add new feature") + assert str(version) == "0.2.0" + + version.bump_version("Merge feat!(asdf): break new feature") + assert str(version) == "1.0.0" + + def test_parse_semver_str(): version = SemVer.semver_from_string("1.1.0") assert str(version) == "1.1.0"