diff --git a/CHANGELOG.md b/CHANGELOG.md index fb16c38..8c1be42 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,8 +6,10 @@ All notable changes to this project will be documented in this file ### Changed -- improved version header parsing -- improved version number incrementing. It can now handle other text surrounding a pep440-compliant version number, which will not be modified +- improved version header parsing to be more robust and handle multi-word version names. +- improved version number incrementing in `release`. + - can now handle other text surrounding a pep440-compliant version number, which will not be modified + - can now handle pre-releases correctly. The version to increment is the most recent version in the log with a valid pep440 version number in it. Release increment and prerelease increments can be mixed, allowing e.g: `yaclog release -mr` to create a release candidate with in incremented minor version number. ## 0.3.3 - 2021-04-27 @@ -18,8 +20,7 @@ All notable changes to this project will be documented in this file ### Fixed - Default links and dates in VersionEntry are now consistently `None` -- Changelog links dict now contains version links. - Modified version links will overwrite those in the table when writing to a file +- Changelog links dict now contains version links. Modified version links will overwrite those in the table when writing to a file - Changelog object no longer errors when creating without a path. - `release` now resets lesser version values when incrementing - `release` now works with logs that have only unreleased changes diff --git a/tests/test_cli.py b/tests/test_cli.py index 69bcdde..c6aa368 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -138,7 +138,6 @@ class TestRelease(unittest.TestCase): result = runner.invoke(cli, ['release', '--version', '1.0.0']) check_result(self, result) self.assertEqual(yaclog.read(location).versions[0].name, '1.0.0') - self.assertIn('Unreleased', result.output) self.assertIn('1.0.0', result.output) runner.invoke(cli, ['entry', '-b', 'entry number 2']) @@ -146,7 +145,6 @@ class TestRelease(unittest.TestCase): result = runner.invoke(cli, ['release', '-p']) check_result(self, result) self.assertEqual(yaclog.read(location).versions[0].name, '1.0.1') - self.assertIn('Unreleased', result.output) self.assertIn('1.0.1', result.output) runner.invoke(cli, ['entry', '-b', 'entry number 3']) @@ -154,7 +152,6 @@ class TestRelease(unittest.TestCase): result = runner.invoke(cli, ['release', '-m']) check_result(self, result) self.assertEqual(yaclog.read(location).versions[0].name, '1.1.0') - self.assertIn('Unreleased', result.output) self.assertIn('1.1.0', result.output) runner.invoke(cli, ['entry', '-b', 'entry number 4']) @@ -162,9 +159,30 @@ class TestRelease(unittest.TestCase): result = runner.invoke(cli, ['release', '-M']) check_result(self, result) self.assertEqual(yaclog.read(location).versions[0].name, '2.0.0') - self.assertIn('Unreleased', result.output) self.assertIn('2.0.0', result.output) + runner.invoke(cli, ['entry', '-b', 'entry number 5']) + + result = runner.invoke(cli, ['release', '-Ma']) + check_result(self, result) + self.assertEqual(yaclog.read(location).versions[0].name, '3.0.0a1') + self.assertIn('3.0.0a1', result.output) + + result = runner.invoke(cli, ['release', '-b']) + check_result(self, result) + self.assertEqual(yaclog.read(location).versions[0].name, '3.0.0b1') + self.assertIn('3.0.0b1', result.output) + + result = runner.invoke(cli, ['release', '-r']) + check_result(self, result) + self.assertEqual(yaclog.read(location).versions[0].name, '3.0.0rc1') + self.assertIn('3.0.0rc1', result.output) + + result = runner.invoke(cli, ['release', '-f']) + check_result(self, result) + self.assertEqual(yaclog.read(location).versions[0].name, '3.0.0') + self.assertIn('3.0.0', result.output) + def test_commit(self): """Test committing and tagging releases""" runner = CliRunner() diff --git a/yaclog/changelog.py b/yaclog/changelog.py index 5cfbfd1..fb20574 100644 --- a/yaclog/changelog.py +++ b/yaclog/changelog.py @@ -182,6 +182,10 @@ class VersionEntry: def released(self): return yaclog.version.is_release(self.name) + @property + def version(self): + return yaclog.version.extract_version(self.name)[0] + def __str__(self) -> str: return self.header(False) diff --git a/yaclog/cli/__main__.py b/yaclog/cli/__main__.py index 3095b95..bab65a6 100644 --- a/yaclog/cli/__main__.py +++ b/yaclog/cli/__main__.py @@ -186,21 +186,26 @@ def entry(obj: Changelog, bullets, paragraphs, section_name, version_name): @click.option('-a', '--alpha', 'pre_seg', flag_value='a', default=None, help='Increment alpha version number.') @click.option('-b', '--beta', 'pre_seg', flag_value='b', help='Increment beta version number.') @click.option('-r', '--rc', 'pre_seg', flag_value='rc', help='Increment release candidate version number.') -@click.option('-c', '--commit', is_flag=True, help='Create a git commit tagged with the new version number.') +@click.option('-f', '--full', 'pre_seg', flag_value='', help='Clear the prerelease value creating a full release.') +@click.option('-c', '--commit', is_flag=True, + help='Create a git commit tagged with the new version number. ' + 'If there are no changes to commit, the current commit will be tagged instead.') @click.pass_obj def release(obj: Changelog, version_name, rel_seg, pre_seg, commit): """Release versions in the changelog and increment their version numbers""" - try: - version = obj.current_version(released=True).name - except ValueError: - version = '0.0.0' cur_version = obj.current_version() - new_name = version old_name = cur_version.name if version_name: new_name = version_name + else: + for v in obj.versions: + if v.version is not None: + new_name = v.name + break + else: + new_name = '0.0.0' if rel_seg is not None or pre_seg is not None: new_name = yaclog.version.increment_version(new_name, rel_seg, pre_seg) diff --git a/yaclog/version.py b/yaclog/version.py index eb46589..0b87bb0 100644 --- a/yaclog/version.py +++ b/yaclog/version.py @@ -41,7 +41,7 @@ def increment_version(version_str: str, rel_seg: int = None, pre_seg: str = None :param version_str: The input string to manipulate :param rel_seg: Which segment of the "release" value to increment, if any - :param pre_seg: Which kind of prerelease to use, if any + :param pre_seg: Which kind of prerelease to use, if any. An empty string clears the prerelease field. :return: The original string with the version number incremented """ v, *span = extract_version(version_str) @@ -56,12 +56,15 @@ def increment_version(version_str: str, rel_seg: int = None, pre_seg: str = None if len(release) <= rel_seg: release += (0,) * (1 + rel_seg - len(release)) release = release[0:rel_seg] + (release[rel_seg] + 1,) + (0,) * (len(release) - rel_seg - 1) + pre = None if pre_seg is not None: - if pre and pre[0] == pre_seg: + if pre_seg == '': # full release, clear prerelease field + pre = None + elif pre and pre[0] == pre_seg: # increment current prerelease type pre = (pre_seg, pre[1] + 1) else: - pre = (pre_seg, 1) + pre = (pre_seg, 1) # set prerelease field new_v = join_version(epoch, release, pre, post, dev, local) return version_str[0:span[0]] + new_v + version_str[span[1]:]