diff --git a/pyvcc/__main__.py b/pyvcc/__main__.py index 4df4fb2..a5158f7 100644 --- a/pyvcc/__main__.py +++ b/pyvcc/__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/pyvcc/semver.py b/pyvcc/semver.py index 2f815e8..a6f191a 100644 --- a/pyvcc/semver.py +++ b/pyvcc/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,14 +96,15 @@ 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: - 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 @@ -112,7 +115,7 @@ def bump_type(cls, message: str) -> BumpEnum: 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 aeb4662..41b0ed9 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" 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" },