def test_infers_major_bump_correctly(): with GitRepo() as g: g.commit("feat: initial commit", allow_empty=True) g.tag("1.1.0") g.commit("feat: breaking\nBREAKING CHANGE: breaking", allow_empty=True) assert infer_vnext(g.log()) == SemVer(2, 0, 0) g.tag("2.0.0") g.commit("feat: test\nBREAKING CHANGE: test", allow_empty=True) assert infer_vnext(g.log()) == SemVer(3, 0, 0)
def test_infers_micro_bump_correctly(): with GitRepo() as g: g.commit("feat: initial commit", allow_empty=True) g.tag("0.1.0") assert infer_vnext(g.log()) == SemVer(0, 1, 1) g.commit("chore: test", allow_empty=True) g.tag("0.1.1") g.commit("fix: test", allow_empty=True) assert infer_vnext(g.log()) == SemVer(0, 1, 2)
def infer_vnext(log, suffix=None, suffix_dot_suffix=False, suffix_dash_prefix=False): latest_tag_index = get_latest_tag_index(log) if latest_tag_index is None: if suffix: return SemVer( 0, 1, 0, suffix=suffix, suffix_number=1, suffix_dot_suffix=suffix_dot_suffix, suffix_dash_prefix=suffix_dash_prefix, ) else: return SemVer(0, 1, 0) else: version = SemVer.fromstr(log[latest_tag_index]["tag"].replace("v", "")) if (version.isprerelease() and version.suffix_dash_prefix == suffix_dash_prefix and version.suffix == suffix and version.suffix_dot_suffix == suffix_dot_suffix): version.increment_suffix_number() return version if latest_tag_index == len(log) - 1: version.increment_micro() return version major_bump, minor_bump = False, False for commit in log[latest_tag_index + 1:]: try: cc_msg_type = ConventionalCommitMsg(commit["message"]).msg_type if cc_msg_type == "BREAKING CHANGE": major_bump = True elif cc_msg_type == "feat": minor_bump = True except Exception as e: print( f"WARNING: Commit '{commit['hash']}' did not have a Conventional Commits-compliant message.", file=sys.stderr, ) print(e, file=sys.stderr) if major_bump: version.increment_major() elif minor_bump: version.increment_minor() else: version.increment_micro() return version
def test_fromstr_parses_correctly( param, major, minor, micro, suffix_dash_prefix, suffix, suffix_dot_suffix, suffix_number, ): s = SemVer.fromstr(param) assert s.major == major assert s.minor == minor assert s.micro == micro assert s.suffix_dash_prefix == suffix_dash_prefix assert s.suffix == suffix assert s.suffix_dot_suffix == suffix_dot_suffix assert s.suffix_number == suffix_number assert s == param
def test_floats_raise_valueerror(params): with pytest.raises(ValueError): SemVer(params[0], params[1], params[2])
def test_repr_gives_properly_formatted_string(): assert repr(SemVer()) == "0.1.0"
def test_increment_suffix_number(): s = SemVer(0, 1, 0, suffix="test", suffix_number=1) assert s == "0.1.0test1" s.increment_suffix_number() assert s == "0.1.0test2"
def test_increment_suffix_number_raises_typeerror_when_none(): with pytest.raises(TypeError): SemVer().increment_suffix_number()
def test_isvalid_method(subject, isvalid): assert SemVer.isvalid(subject) == isvalid
def test_isprelease(version, isprerelease): assert SemVer.fromstr(version).isprerelease() == isprerelease
def test_default_semver_is_0_1_0(): s = SemVer() assert s == "0.1.0"
def test_passing_version_flag_prints_version_and_exits(args, capsys): with pytest.raises(SystemExit): main(args) c = capsys.readouterr() assert SemVer.isvalid(c.out)
def test_string_parameters(): s = SemVer("1", "1", "1") assert s == "1.1.1"
def test_fromstr(param): assert SemVer.fromstr(param) == param
def test_incrementting_micro_leaves_major_and_minor(): s = SemVer(1, 1, 1) s.increment_micro() assert s == "1.1.2"
def test_incrementing_minor_resets_micro_leaves_major(): s = SemVer(1, 1, 1) s.increment_minor() assert s == "1.2.0"
(1.0, 0, 1.0), ], ) def test_floats_raise_valueerror(params): with pytest.raises(ValueError): SemVer(params[0], params[1], params[2]) def test_repr_gives_properly_formatted_string(): assert repr(SemVer()) == "0.1.0" @pytest.mark.parametrize( "p1,p2,p3", [ (SemVer(), SemVer(), "0.1.0"), ( SemVer(13, 24, 24, False, suffix="rc", suffix_number="24"), SemVer(13, 24, 24, False, suffix="rc", suffix_number="24"), "13.24.24rc24", ), ], ) def test_equality(p1, p2, p3): assert p1 == p2 == p3 @pytest.mark.parametrize( "p1,p2", [ (SemVer(), SemVer(0, 1, 2)),
def test_mixed_string_and_numeric_params(params, semver): assert SemVer(params[0], params[1], params[2]) == semver
def test_negative_numbers_raise_valueerror(params): with pytest.raises(ValueError): SemVer(params[0], params[1], params[2])
def test_incrementing_major_resets_minor_and_micro(): s = SemVer() s.increment_major() assert s == "1.0.0"
def test_bad_param_in_fromstr_raises_valueerror(param): with pytest.raises(ValueError): SemVer.fromstr(param)