fix #12: sorting of tags ignored version number semantics

This commit is contained in:
Manuel Barkhau 2020-10-05 17:54:33 +00:00
parent 2660ec03d3
commit 54a5892957
6 changed files with 105 additions and 173 deletions

View file

@ -12,11 +12,12 @@
- New gitlab #2: Added `grep` subcommand to find and debug patterns. - New gitlab #2: Added `grep` subcommand to find and debug patterns.
- New: Added better error messages to debug regular expressions. - New: Added better error messages to debug regular expressions.
- New gitlab #10: `--pin-date` to keep date parts unchanged, and only increment non-date parts. - New gitlab #10: `--pin-date` to keep date parts unchanged, and only increment non-date parts.
- New gitlab #9: Make commit message configurable.
- New: Added `--release-num` to increment the `alphaN`/`betaN`/`a0`/`b0`/etc. release number - New: Added `--release-num` to increment the `alphaN`/`betaN`/`a0`/`b0`/etc. release number
- New: Added `--date=<iso-date>` parameter to set explicit date (instead of current date). - New: Added `--date=<iso-date>` parameter to set explicit date (instead of current date).
- Fix gitlab #8: Push tags only pushed tags, not actual commit. - Fix gitlab #12: Error sorting non-lexical version tags (e.g. semver).
- Fix gitlab #9: Make commit message configurable.
- Fix gitlab #11: Show regexp when `--verbose` is used. - Fix gitlab #11: Show regexp when `--verbose` is used.
- Fix gitlab #8: Push now also pushes HEAD (used to only push the tag).
- Fix: Disallow `--release=dev` which has different semantics than other release tags. - Fix: Disallow `--release=dev` which has different semantics than other release tags.
- Fix: Entries in `file_patterns` were ignored if there were multiple for the same file. - Fix: Entries in `file_patterns` were ignored if there were multiple for the same file.
- Switch main repo from gitlab to github. - Switch main repo from gitlab to github.

View file

@ -20,7 +20,7 @@ warn_redundant_casts = True
[tool:isort] [tool:isort]
known_first_party = pycalver known_first_party = pycalver
known_third_party = click,pathlib2,lexid known_third_party = click,pathlib2,lexid,pkg_resources
force_single_line = True force_single_line = True
length_sort = True length_sort = True

View file

@ -18,10 +18,9 @@ import subprocess as sp
import click import click
import colorama import colorama
import pkg_resources
from . import vcs from . import vcs
from . import v1cli
from . import v2cli
from . import config from . import config
from . import rewrite from . import rewrite
from . import version from . import version
@ -339,6 +338,25 @@ def _colored_diff_lines(diff: str) -> typ.Iterable[str]:
yield line yield line
def _v2_get_diff(cfg: config.Config, new_version: str) -> str:
old_vinfo = v2version.parse_version_info(cfg.current_version, cfg.version_pattern)
new_vinfo = v2version.parse_version_info(new_version, cfg.version_pattern)
return v2rewrite.diff(old_vinfo, new_vinfo, cfg.file_patterns)
def _v1_get_diff(cfg: config.Config, new_version: str) -> str:
old_vinfo = v1version.parse_version_info(cfg.current_version, cfg.version_pattern)
new_vinfo = v1version.parse_version_info(new_version, cfg.version_pattern)
return v1rewrite.diff(old_vinfo, new_vinfo, cfg.file_patterns)
def get_diff(cfg, new_version) -> str:
if cfg.is_new_pattern:
return _v2_get_diff(cfg, new_version)
else:
return _v1_get_diff(cfg, new_version)
def _print_diff_str(diff: str) -> None: def _print_diff_str(diff: str) -> None:
colored_diff = "\n".join(_colored_diff_lines(diff)) colored_diff = "\n".join(_colored_diff_lines(diff))
if sys.stdout.isatty(): if sys.stdout.isatty():
@ -349,11 +367,7 @@ def _print_diff_str(diff: str) -> None:
def _print_diff(cfg: config.Config, new_version: str) -> None: def _print_diff(cfg: config.Config, new_version: str) -> None:
try: try:
if cfg.is_new_pattern: diff = get_diff(cfg, new_version)
diff = v2cli.get_diff(cfg, new_version)
else:
diff = v1cli.get_diff(cfg, new_version)
_print_diff_str(diff) _print_diff_str(diff)
except rewrite.NoPatternMatch as ex: except rewrite.NoPatternMatch as ex:
logger.error(str(ex)) logger.error(str(ex))
@ -489,9 +503,29 @@ def _update_cfg_from_vcs(cfg: config.Config, fetch: bool) -> config.Config:
all_tags = vcs.get_tags(fetch=fetch) all_tags = vcs.get_tags(fetch=fetch)
if cfg.is_new_pattern: if cfg.is_new_pattern:
return v2cli.update_cfg_from_vcs(cfg, all_tags) version_tags = [tag for tag in all_tags if v2version.is_valid(tag, cfg.version_pattern)]
else: else:
return v1cli.update_cfg_from_vcs(cfg, all_tags) version_tags = [tag for tag in all_tags if v1version.is_valid(tag, cfg.version_pattern)]
if not version_tags:
logger.debug("no vcs tags found")
return cfg
else:
version_tags.sort(key=pkg_resources.parse_version, reverse=True)
_debug_tags = ", ".join(version_tags[:3])
logger.debug(f"found tags: {_debug_tags} ... ({len(version_tags)} in total)")
latest_version_tag = version_tags[0]
latest_version_pep440 = version.to_pep440(latest_version_tag)
if latest_version_tag <= cfg.current_version:
return cfg
else:
logger.info(f"Working dir version : {cfg.current_version}")
logger.info(f"Latest version from VCS tag: {latest_version_tag}")
return cfg._replace(
current_version=latest_version_tag,
pep440_version=latest_version_pep440,
)
@cli.command() @cli.command()

View file

@ -1,48 +0,0 @@
#!/usr/bin/env python
# This file is part of the pycalver project
# https://github.com/mbarkhau/pycalver
#
# Copyright (c) 2018-2020 Manuel Barkhau (mbarkhau@gmail.com) - MIT License
# SPDX-License-Identifier: MIT
"""
CLI module for PyCalVer.
Provided subcommands: show, test, init, bump
"""
import typing as typ
import logging
from . import config
from . import version
from . import v1rewrite
from . import v1version
logger = logging.getLogger("pycalver.v1cli")
def update_cfg_from_vcs(cfg: config.Config, all_tags: typ.List[str]) -> config.Config:
version_tags = [tag for tag in all_tags if v1version.is_valid(tag, cfg.version_pattern)]
if not version_tags:
logger.debug("no vcs tags found")
return cfg
version_tags.sort(reverse=True)
_debug_tags = ", ".join(version_tags[:3])
logger.debug(f"found tags: {_debug_tags} ... ({len(version_tags)} in total)")
latest_version_tag = version_tags[0]
latest_version_pep440 = version.to_pep440(latest_version_tag)
if latest_version_tag <= cfg.current_version:
return cfg
logger.info(f"Working dir version : {cfg.current_version}")
logger.info(f"Latest version from VCS tag: {latest_version_tag}")
return cfg._replace(
current_version=latest_version_tag,
pep440_version=latest_version_pep440,
)
def get_diff(cfg: config.Config, new_version: str) -> str:
old_vinfo = v1version.parse_version_info(cfg.current_version, cfg.version_pattern)
new_vinfo = v1version.parse_version_info(new_version , cfg.version_pattern)
return v1rewrite.diff(old_vinfo, new_vinfo, cfg.file_patterns)

View file

@ -1,48 +0,0 @@
#!/usr/bin/env python
# This file is part of the pycalver project
# https://github.com/mbarkhau/pycalver
#
# Copyright (c) 2018-2020 Manuel Barkhau (mbarkhau@gmail.com) - MIT License
# SPDX-License-Identifier: MIT
"""
CLI module for PyCalVer.
Provided subcommands: show, test, init, bump
"""
import typing as typ
import logging
from . import config
from . import version
from . import v2rewrite
from . import v2version
logger = logging.getLogger("pycalver.v2cli")
def update_cfg_from_vcs(cfg: config.Config, all_tags: typ.List[str]) -> config.Config:
version_tags = [tag for tag in all_tags if v2version.is_valid(tag, cfg.version_pattern)]
if not version_tags:
logger.debug("no vcs tags found")
return cfg
version_tags.sort(reverse=True)
_debug_tags = ", ".join(version_tags[:3])
logger.debug(f"found tags: {_debug_tags} ... ({len(version_tags)} in total)")
latest_version_tag = version_tags[0]
latest_version_pep440 = version.to_pep440(latest_version_tag)
if latest_version_tag <= cfg.current_version:
return cfg
logger.info(f"Working dir version : {cfg.current_version}")
logger.info(f"Latest version from VCS tag: {latest_version_tag}")
return cfg._replace(
current_version=latest_version_tag,
pep440_version=latest_version_pep440,
)
def get_diff(cfg: config.Config, new_version: str) -> str:
old_vinfo = v2version.parse_version_info(cfg.current_version, cfg.version_pattern)
new_vinfo = v2version.parse_version_info(new_version , cfg.version_pattern)
return v2rewrite.diff(old_vinfo, new_vinfo, cfg.file_patterns)

View file

@ -17,12 +17,9 @@ import pytest
import pathlib2 as pl import pathlib2 as pl
from click.testing import CliRunner from click.testing import CliRunner
from pycalver import v1cli
from pycalver import v2cli
from pycalver import config from pycalver import config
from pycalver import __main__ as main
from pycalver import v1patterns from pycalver import v1patterns
from pycalver.__main__ import cli
from pycalver.__main__ import incr_dispatch
# pylint:disable=redefined-outer-name ; pytest fixtures # pylint:disable=redefined-outer-name ; pytest fixtures
# pylint:disable=protected-access ; allowed for test code # pylint:disable=protected-access ; allowed for test code
@ -88,7 +85,7 @@ def runner(tmpdir):
def test_help(runner): def test_help(runner):
result = runner.invoke(cli, ['--help', "-vv"]) result = runner.invoke(main.cli, ['--help', "-vv"])
assert result.exit_code == 0 assert result.exit_code == 0
assert "PyCalVer" in result.output assert "PyCalVer" in result.output
assert "bump " in result.output assert "bump " in result.output
@ -98,7 +95,7 @@ def test_help(runner):
def test_version(runner): def test_version(runner):
result = runner.invoke(cli, ['--version', "-vv"]) result = runner.invoke(main.cli, ['--version', "-vv"])
assert result.exit_code == 0 assert result.exit_code == 0
assert " version v20" in result.output assert " version v20" in result.output
match = v1patterns.PYCALVER_RE.search(result.output) match = v1patterns.PYCALVER_RE.search(result.output)
@ -109,19 +106,19 @@ def test_incr_default(runner):
old_version = "v201701.0004-alpha" old_version = "v201701.0004-alpha"
cmd = ['test', "-vv", "--pin-date", "--release", "beta", old_version] cmd = ['test', "-vv", "--pin-date", "--release", "beta", old_version]
result = runner.invoke(cli, cmd) result = runner.invoke(main.cli, cmd)
assert result.exit_code == 0 assert result.exit_code == 0
assert "Version: v201701.0005-beta\n" in result.output assert "Version: v201701.0005-beta\n" in result.output
cmd = ['test', "-vv", "--pin-date", "--release", "beta", old_version, "vYYYY0M.BUILD[-RELEASE]"] cmd = ['test', "-vv", "--pin-date", "--release", "beta", old_version, "vYYYY0M.BUILD[-RELEASE]"]
result = runner.invoke(cli, cmd) result = runner.invoke(main.cli, cmd)
assert result.exit_code == 0 assert result.exit_code == 0
assert "Version: v201701.1005-beta\n" in result.output assert "Version: v201701.1005-beta\n" in result.output
def test_incr_pin_date(runner): def test_incr_pin_date(runner):
old_version = "v201701.0999-alpha" old_version = "v201701.0999-alpha"
result = runner.invoke(cli, ['test', "-vv", "--pin-date", old_version]) result = runner.invoke(main.cli, ['test', "-vv", "--pin-date", old_version])
assert result.exit_code == 0 assert result.exit_code == 0
assert "Version: v201701.11000-alpha\n" in result.output assert "Version: v201701.11000-alpha\n" in result.output
@ -137,27 +134,27 @@ def test_incr_semver(runner):
old_version = "0.1.0" old_version = "0.1.0"
new_version = "0.1.1" new_version = "0.1.1"
result = runner.invoke(cli, ['test', "-vv", "--patch", old_version, semver_pattern]) result = runner.invoke(main.cli, ['test', "-vv", "--patch", old_version, semver_pattern])
assert result.exit_code == 0 assert result.exit_code == 0
assert f"Version: {new_version}\n" in result.output assert f"Version: {new_version}\n" in result.output
old_version = "0.1.1" old_version = "0.1.1"
new_version = "0.2.0" new_version = "0.2.0"
result = runner.invoke(cli, ['test', "-vv", "--minor", old_version, semver_pattern]) result = runner.invoke(main.cli, ['test', "-vv", "--minor", old_version, semver_pattern])
assert result.exit_code == 0 assert result.exit_code == 0
assert f"Version: {new_version}\n" in result.output assert f"Version: {new_version}\n" in result.output
old_version = "0.1.1" old_version = "0.1.1"
new_version = "1.0.0" new_version = "1.0.0"
result = runner.invoke(cli, ['test', "-vv", "--major", old_version, semver_pattern]) result = runner.invoke(main.cli, ['test', "-vv", "--major", old_version, semver_pattern])
assert result.exit_code == 0 assert result.exit_code == 0
assert f"Version: {new_version}\n" in result.output assert f"Version: {new_version}\n" in result.output
def test_incr_semver_invalid(runner, caplog): def test_incr_semver_invalid(runner, caplog):
result = runner.invoke(cli, ['test', "-vv", "--patch", "0.1.1"]) result = runner.invoke(main.cli, ['test', "-vv", "--patch", "0.1.1"])
assert result.exit_code == 1 assert result.exit_code == 1
assert len(caplog.records) > 0 assert len(caplog.records) > 0
log_record = caplog.records[0] log_record = caplog.records[0]
@ -169,7 +166,7 @@ def test_incr_to_beta(runner):
old_version = "v201701.0999-alpha" old_version = "v201701.0999-alpha"
initial_version = config._initial_version() initial_version = config._initial_version()
result = runner.invoke(cli, ['test', old_version, "-vv", "--release", "beta"]) result = runner.invoke(main.cli, ['test', old_version, "-vv", "--release", "beta"])
assert result.exit_code == 0 assert result.exit_code == 0
new_version = initial_version.replace(".1001-alpha", ".11000-beta") new_version = initial_version.replace(".1001-alpha", ".11000-beta")
assert f"Version: {new_version}\n" in result.output assert f"Version: {new_version}\n" in result.output
@ -179,7 +176,7 @@ def test_incr_to_final(runner):
old_version = "v201701.0999-alpha" old_version = "v201701.0999-alpha"
initial_version = config._initial_version() initial_version = config._initial_version()
result = runner.invoke(cli, ['test', old_version, "-vv", "--release", "final"]) result = runner.invoke(main.cli, ['test', old_version, "-vv", "--release", "final"])
assert result.exit_code == 0 assert result.exit_code == 0
new_version = initial_version.replace(".1001-alpha", ".11000") new_version = initial_version.replace(".1001-alpha", ".11000")
assert f"Version: {new_version}\n" in result.output assert f"Version: {new_version}\n" in result.output
@ -191,7 +188,7 @@ def test_incr_release_num(runner):
old_version = "0.1.0b0" old_version = "0.1.0b0"
new_version = "0.1.0b1" new_version = "0.1.0b1"
result = runner.invoke(cli, ['test', "-vv", "--release-num", old_version, semver]) result = runner.invoke(main.cli, ['test', "-vv", "--release-num", old_version, semver])
assert result.exit_code == 0 assert result.exit_code == 0
assert f"Version: {new_version}\n" in result.output assert f"Version: {new_version}\n" in result.output
@ -199,7 +196,7 @@ def test_incr_release_num(runner):
def test_incr_invalid(runner): def test_incr_invalid(runner):
old_version = "v201701.0999-alpha" old_version = "v201701.0999-alpha"
result = runner.invoke(cli, ['test', old_version, "-vv", "--release", "alfa"]) result = runner.invoke(main.cli, ['test', old_version, "-vv", "--release", "alfa"])
assert result.exit_code == 1 assert result.exit_code == 1
@ -239,7 +236,7 @@ def _update_config_val(filename, **kwargs):
def test_nocfg(runner, caplog): def test_nocfg(runner, caplog):
_add_project_files("README.md") _add_project_files("README.md")
result = runner.invoke(cli, ['show', "-vv"]) result = runner.invoke(main.cli, ['show', "-vv"])
assert result.exit_code == 1 assert result.exit_code == 1
expected_msg = "Could not parse configuration. Perhaps try 'pycalver init'." expected_msg = "Could not parse configuration. Perhaps try 'pycalver init'."
assert any(expected_msg in r.message for r in caplog.records) assert any(expected_msg in r.message for r in caplog.records)
@ -248,12 +245,12 @@ def test_nocfg(runner, caplog):
def test_novcs_nocfg_init(runner, caplog): def test_novcs_nocfg_init(runner, caplog):
_add_project_files("README.md") _add_project_files("README.md")
# dry mode test # dry mode test
result = runner.invoke(cli, ['init', "-vv", "--dry"]) result = runner.invoke(main.cli, ['init', "-vv", "--dry"])
assert result.exit_code == 0 assert result.exit_code == 0
assert not os.path.exists("pycalver.toml") assert not os.path.exists("pycalver.toml")
# non dry mode # non dry mode
result = runner.invoke(cli, ['init', "-vv"]) result = runner.invoke(main.cli, ['init', "-vv"])
assert result.exit_code == 0 assert result.exit_code == 0
assert os.path.exists("pycalver.toml") assert os.path.exists("pycalver.toml")
@ -264,12 +261,12 @@ def test_novcs_nocfg_init(runner, caplog):
assert base_str in cfg_content assert base_str in cfg_content
assert config.DEFAULT_TOML_README_MD_STR in cfg_content assert config.DEFAULT_TOML_README_MD_STR in cfg_content
result = runner.invoke(cli, ['show', "-vv"]) result = runner.invoke(main.cli, ['show', "-vv"])
assert result.exit_code == 0 assert result.exit_code == 0
assert f"Current Version: {config._initial_version()}\n" in result.output assert f"Current Version: {config._initial_version()}\n" in result.output
assert f"PEP440 : {config._initial_version_pep440()}\n" in result.output assert f"PEP440 : {config._initial_version_pep440()}\n" in result.output
result = runner.invoke(cli, ['init', "-vv"]) result = runner.invoke(main.cli, ['init', "-vv"])
assert result.exit_code == 1 assert result.exit_code == 1
# check logging # check logging
@ -281,7 +278,7 @@ def test_novcs_nocfg_init(runner, caplog):
def test_novcs_setupcfg_init(runner): def test_novcs_setupcfg_init(runner):
_add_project_files("README.md", "setup.cfg") _add_project_files("README.md", "setup.cfg")
result = runner.invoke(cli, ['init', "-vv"]) result = runner.invoke(main.cli, ['init', "-vv"])
assert result.exit_code == 0 assert result.exit_code == 0
with pl.Path("setup.cfg").open(mode="r", encoding="utf-8") as fobj: with pl.Path("setup.cfg").open(mode="r", encoding="utf-8") as fobj:
@ -293,7 +290,7 @@ def test_novcs_setupcfg_init(runner):
assert base_str in cfg_content assert base_str in cfg_content
assert config.DEFAULT_CONFIGPARSER_README_MD_STR in cfg_content assert config.DEFAULT_CONFIGPARSER_README_MD_STR in cfg_content
result = runner.invoke(cli, ['show', "-vv"]) result = runner.invoke(main.cli, ['show', "-vv"])
assert result.exit_code == 0 assert result.exit_code == 0
assert f"Current Version: {config._initial_version()}\n" in result.output assert f"Current Version: {config._initial_version()}\n" in result.output
assert f"PEP440 : {config._initial_version_pep440()}\n" in result.output assert f"PEP440 : {config._initial_version_pep440()}\n" in result.output
@ -301,7 +298,7 @@ def test_novcs_setupcfg_init(runner):
def test_novcs_pyproject_init(runner): def test_novcs_pyproject_init(runner):
_add_project_files("README.md", "pyproject.toml") _add_project_files("README.md", "pyproject.toml")
result = runner.invoke(cli, ['init', "-vv"]) result = runner.invoke(main.cli, ['init', "-vv"])
assert result.exit_code == 0 assert result.exit_code == 0
with pl.Path("pyproject.toml").open(mode="r", encoding="utf-8") as fobj: with pl.Path("pyproject.toml").open(mode="r", encoding="utf-8") as fobj:
@ -311,7 +308,7 @@ def test_novcs_pyproject_init(runner):
assert base_str in cfg_content assert base_str in cfg_content
assert config.DEFAULT_TOML_README_MD_STR in cfg_content assert config.DEFAULT_TOML_README_MD_STR in cfg_content
result = runner.invoke(cli, ['show']) result = runner.invoke(main.cli, ['show'])
assert result.exit_code == 0 assert result.exit_code == 0
assert f"Current Version: {config._initial_version()}\n" in result.output assert f"Current Version: {config._initial_version()}\n" in result.output
assert f"PEP440 : {config._initial_version_pep440()}\n" in result.output assert f"PEP440 : {config._initial_version_pep440()}\n" in result.output
@ -340,12 +337,12 @@ def test_git_init(runner, version_pattern):
_add_project_files("README.md") _add_project_files("README.md")
_vcs_init("git") _vcs_init("git")
result = runner.invoke(cli, ['init', "-vv"]) result = runner.invoke(main.cli, ['init', "-vv"])
assert result.exit_code == 0 assert result.exit_code == 0
_update_config_val("pycalver.toml", version_pattern=version_pattern) _update_config_val("pycalver.toml", version_pattern=version_pattern)
result = runner.invoke(cli, ['show']) result = runner.invoke(main.cli, ['show'])
assert result.exit_code == 0 assert result.exit_code == 0
assert f"Current Version: {config._initial_version()}\n" in result.output assert f"Current Version: {config._initial_version()}\n" in result.output
assert f"PEP440 : {config._initial_version_pep440()}\n" in result.output assert f"PEP440 : {config._initial_version_pep440()}\n" in result.output
@ -356,12 +353,12 @@ def test_hg_init(runner, version_pattern):
_add_project_files("README.md") _add_project_files("README.md")
_vcs_init("hg") _vcs_init("hg")
result = runner.invoke(cli, ['init', "-vv"]) result = runner.invoke(main.cli, ['init', "-vv"])
assert result.exit_code == 0 assert result.exit_code == 0
_update_config_val("pycalver.toml", version_pattern=version_pattern) _update_config_val("pycalver.toml", version_pattern=version_pattern)
result = runner.invoke(cli, ['show']) result = runner.invoke(main.cli, ['show'])
assert result.exit_code == 0 assert result.exit_code == 0
assert f"Current Version: {config._initial_version()}\n" in result.output assert f"Current Version: {config._initial_version()}\n" in result.output
assert f"PEP440 : {config._initial_version_pep440()}\n" in result.output assert f"PEP440 : {config._initial_version_pep440()}\n" in result.output
@ -374,7 +371,7 @@ def test_v1_git_tag_eval(runner, version_pattern):
# This will set a version that is older than the version tag # This will set a version that is older than the version tag
# we set in the vcs, which should take precedence. # we set in the vcs, which should take precedence.
result = runner.invoke(cli, ['init', "-vv"]) result = runner.invoke(main.cli, ['init', "-vv"])
assert result.exit_code == 0 assert result.exit_code == 0
_update_config_val("pycalver.toml", version_pattern=version_pattern) _update_config_val("pycalver.toml", version_pattern=version_pattern)
@ -385,7 +382,7 @@ def test_v1_git_tag_eval(runner, version_pattern):
shell("git", "tag", "--annotate", tag_version, "--message", f"bump version to {tag_version}") shell("git", "tag", "--annotate", tag_version, "--message", f"bump version to {tag_version}")
result = runner.invoke(cli, ['show', "-vv"]) result = runner.invoke(main.cli, ['show', "-vv"])
assert result.exit_code == 0 assert result.exit_code == 0
assert f"Current Version: {tag_version}\n" in result.output assert f"Current Version: {tag_version}\n" in result.output
assert f"PEP440 : {tag_version_pep440}\n" in result.output assert f"PEP440 : {tag_version_pep440}\n" in result.output
@ -398,7 +395,7 @@ def test_hg_tag_eval(runner, version_pattern):
# This will set a version that is older than the version tag # This will set a version that is older than the version tag
# we set in the vcs, which should take precedence. # we set in the vcs, which should take precedence.
result = runner.invoke(cli, ['init', "-vv"]) result = runner.invoke(main.cli, ['init', "-vv"])
assert result.exit_code == 0 assert result.exit_code == 0
_update_config_val("pycalver.toml", version_pattern=version_pattern) _update_config_val("pycalver.toml", version_pattern=version_pattern)
@ -409,7 +406,7 @@ def test_hg_tag_eval(runner, version_pattern):
shell("hg", "tag", tag_version, "--message", f"bump version to {tag_version}") shell("hg", "tag", tag_version, "--message", f"bump version to {tag_version}")
result = runner.invoke(cli, ['show', "-vv"]) result = runner.invoke(main.cli, ['show', "-vv"])
assert result.exit_code == 0 assert result.exit_code == 0
assert f"Current Version: {tag_version}\n" in result.output assert f"Current Version: {tag_version}\n" in result.output
assert f"PEP440 : {tag_version_pep440}\n" in result.output assert f"PEP440 : {tag_version_pep440}\n" in result.output
@ -419,12 +416,12 @@ def test_hg_tag_eval(runner, version_pattern):
def test_novcs_bump(runner, version_pattern): def test_novcs_bump(runner, version_pattern):
_add_project_files("README.md") _add_project_files("README.md")
result = runner.invoke(cli, ['init', "-vv"]) result = runner.invoke(main.cli, ['init', "-vv"])
assert result.exit_code == 0 assert result.exit_code == 0
_update_config_val("pycalver.toml", version_pattern=version_pattern) _update_config_val("pycalver.toml", version_pattern=version_pattern)
result = runner.invoke(cli, ['bump', "-vv"]) result = runner.invoke(main.cli, ['bump', "-vv"])
assert result.exit_code == 0 assert result.exit_code == 0
calver = config._initial_version().split(".")[0] calver = config._initial_version().split(".")[0]
@ -434,7 +431,7 @@ def test_novcs_bump(runner, version_pattern):
assert calver + ".1002-alpha !\n" in content assert calver + ".1002-alpha !\n" in content
assert calver[1:] + ".1002a0 !]\n" in content assert calver[1:] + ".1002a0 !]\n" in content
result = runner.invoke(cli, ['bump', "-vv", "--release", "beta"]) result = runner.invoke(main.cli, ['bump', "-vv", "--release", "beta"])
assert result.exit_code == 0 assert result.exit_code == 0
with pl.Path("README.md").open() as fobj: with pl.Path("README.md").open() as fobj:
@ -448,7 +445,7 @@ def test_git_bump(runner, version_pattern):
_add_project_files("README.md") _add_project_files("README.md")
_vcs_init("git") _vcs_init("git")
result = runner.invoke(cli, ['init', "-vv"]) result = runner.invoke(main.cli, ['init', "-vv"])
assert result.exit_code == 0 assert result.exit_code == 0
_update_config_val("pycalver.toml", version_pattern=version_pattern) _update_config_val("pycalver.toml", version_pattern=version_pattern)
@ -456,7 +453,7 @@ def test_git_bump(runner, version_pattern):
shell("git", "add", "pycalver.toml") shell("git", "add", "pycalver.toml")
shell("git", "commit", "-m", "initial commit") shell("git", "commit", "-m", "initial commit")
result = runner.invoke(cli, ['bump', "-vv"]) result = runner.invoke(main.cli, ['bump', "-vv"])
assert result.exit_code == 0 assert result.exit_code == 0
calver = config._initial_version()[:7] calver = config._initial_version()[:7]
@ -471,7 +468,7 @@ def test_hg_bump(runner, version_pattern):
_add_project_files("README.md") _add_project_files("README.md")
_vcs_init("hg") _vcs_init("hg")
result = runner.invoke(cli, ['init', "-vv"]) result = runner.invoke(main.cli, ['init', "-vv"])
assert result.exit_code == 0 assert result.exit_code == 0
_update_config_val("pycalver.toml", version_pattern=version_pattern) _update_config_val("pycalver.toml", version_pattern=version_pattern)
@ -479,7 +476,7 @@ def test_hg_bump(runner, version_pattern):
shell("hg", "add", "pycalver.toml") shell("hg", "add", "pycalver.toml")
shell("hg", "commit", "-m", "initial commit") shell("hg", "commit", "-m", "initial commit")
result = runner.invoke(cli, ['bump', "-vv"]) result = runner.invoke(main.cli, ['bump', "-vv"])
assert result.exit_code == 0 assert result.exit_code == 0
calver = config._initial_version()[:7] calver = config._initial_version()[:7]
@ -493,7 +490,7 @@ def test_empty_git_bump(runner, caplog):
shell("git", "init") shell("git", "init")
with pl.Path("setup.cfg").open(mode="w") as fobj: with pl.Path("setup.cfg").open(mode="w") as fobj:
fobj.write("") fobj.write("")
result = runner.invoke(cli, ['init', "-vv"]) result = runner.invoke(main.cli, ['init', "-vv"])
assert result.exit_code == 0 assert result.exit_code == 0
with pl.Path("setup.cfg").open(mode="r") as fobj: with pl.Path("setup.cfg").open(mode="r") as fobj:
@ -504,7 +501,7 @@ def test_empty_git_bump(runner, caplog):
assert "\n[pycalver:file_patterns]\n" in default_cfg_data assert "\n[pycalver:file_patterns]\n" in default_cfg_data
assert "\nsetup.cfg =\n" in default_cfg_data assert "\nsetup.cfg =\n" in default_cfg_data
result = runner.invoke(cli, ['bump']) result = runner.invoke(main.cli, ['bump'])
assert any(("working directory is not clean" in r.message) for r in caplog.records) assert any(("working directory is not clean" in r.message) for r in caplog.records)
assert any(("setup.cfg" in r.message) for r in caplog.records) assert any(("setup.cfg" in r.message) for r in caplog.records)
@ -514,7 +511,7 @@ def test_empty_hg_bump(runner, caplog):
shell("hg", "init") shell("hg", "init")
with pl.Path("setup.cfg").open(mode="w") as fobj: with pl.Path("setup.cfg").open(mode="w") as fobj:
fobj.write("") fobj.write("")
result = runner.invoke(cli, ['init', "-vv"]) result = runner.invoke(main.cli, ['init', "-vv"])
assert result.exit_code == 0 assert result.exit_code == 0
with pl.Path("setup.cfg").open(mode="r") as fobj: with pl.Path("setup.cfg").open(mode="r") as fobj:
@ -525,7 +522,7 @@ def test_empty_hg_bump(runner, caplog):
assert "\n[pycalver:file_patterns]\n" in default_cfg_text assert "\n[pycalver:file_patterns]\n" in default_cfg_text
assert "\nsetup.cfg =\n" in default_cfg_text assert "\nsetup.cfg =\n" in default_cfg_text
result = runner.invoke(cli, ['bump']) result = runner.invoke(main.cli, ['bump'])
assert any(("working directory is not clean" in r.message) for r in caplog.records) assert any(("working directory is not clean" in r.message) for r in caplog.records)
assert any(("setup.cfg" in r.message) for r in caplog.records) assert any(("setup.cfg" in r.message) for r in caplog.records)
@ -565,13 +562,13 @@ def test_v1_bump_semver_warning(runner, caplog, version_pattern):
_vcs_init("hg", files=["README.md", "setup.cfg"]) _vcs_init("hg", files=["README.md", "setup.cfg"])
result = runner.invoke(cli, ['bump', "-vv", "-n", "--dry"]) result = runner.invoke(main.cli, ['bump', "-vv", "-n", "--dry"])
assert result.exit_code == 1 assert result.exit_code == 1
assert any("version did not change" in r.message for r in caplog.records) assert any("version did not change" in r.message for r in caplog.records)
assert any("--major/--minor/--patch required" in r.message for r in caplog.records) assert any("--major/--minor/--patch required" in r.message for r in caplog.records)
result = runner.invoke(cli, ['bump', "-vv", "-n", "--dry", "--patch"]) result = runner.invoke(main.cli, ['bump', "-vv", "-n", "--dry", "--patch"])
assert result.exit_code == 0 assert result.exit_code == 0
@ -589,7 +586,7 @@ def test_v1_bump_semver_diff(runner, caplog, version_pattern):
cases = [("--major", "1.0.0"), ("--minor", "0.2.0"), ("--patch", "0.1.1")] cases = [("--major", "1.0.0"), ("--minor", "0.2.0"), ("--patch", "0.1.1")]
for flag, expected in cases: for flag, expected in cases:
result = runner.invoke(cli, ['bump', "-vv", "-n", "--dry", flag]) result = runner.invoke(main.cli, ['bump', "-vv", "-n", "--dry", flag])
assert result.exit_code == 0 assert result.exit_code == 0
assert len(caplog.records) == 0 assert len(caplog.records) == 0
@ -603,7 +600,7 @@ def test_v1_bump_semver_diff(runner, caplog, version_pattern):
@pytest.mark.parametrize("version_pattern", DEFAULT_VERSION_PATTERNS) @pytest.mark.parametrize("version_pattern", DEFAULT_VERSION_PATTERNS)
def test_get_diff(runner, version_pattern): def test_get_diff(runner, version_pattern):
_add_project_files("README.md", "setup.cfg") _add_project_files("README.md", "setup.cfg")
result = runner.invoke(cli, ['init', "-vv"]) result = runner.invoke(main.cli, ['init', "-vv"])
assert result.exit_code == 0 assert result.exit_code == 0
_update_config_val("setup.cfg", version_pattern=version_pattern) _update_config_val("setup.cfg", version_pattern=version_pattern)
@ -611,11 +608,7 @@ def test_get_diff(runner, version_pattern):
_, cfg = config.init() _, cfg = config.init()
new_version = "v202010.1003-beta" new_version = "v202010.1003-beta"
if cfg.is_new_pattern: diff_str = main.get_diff(cfg, new_version)
diff_str = v2cli.get_diff(cfg, new_version)
else:
diff_str = v1cli.get_diff(cfg, new_version)
diff_lines = set(diff_str.splitlines()) diff_lines = set(diff_str.splitlines())
assert "- Hello World v201701.1002-alpha !" in diff_lines assert "- Hello World v201701.1002-alpha !" in diff_lines
@ -674,14 +667,14 @@ WEEKNUM_TEST_CASES = [
@pytest.mark.parametrize("date, pattern, expected", WEEKNUM_TEST_CASES) @pytest.mark.parametrize("date, pattern, expected", WEEKNUM_TEST_CASES)
def test_weeknum(date, pattern, expected, runner): def test_weeknum(date, pattern, expected, runner):
cmd = shlex.split(f"test -vv --date {date} 2020.40 {pattern}") cmd = shlex.split(f"test -vv --date {date} 2020.40 {pattern}")
result = runner.invoke(cli, cmd) result = runner.invoke(main.cli, cmd)
assert result.exit_code == 0 assert result.exit_code == 0
assert "New Version: " + expected in result.output assert "New Version: " + expected in result.output
def test_hg_commit_message(runner, caplog): def test_hg_commit_message(runner, caplog):
_add_project_files("README.md", "setup.cfg") _add_project_files("README.md", "setup.cfg")
result = runner.invoke(cli, ['init', "-vv"]) result = runner.invoke(main.cli, ['init', "-vv"])
assert result.exit_code == 0 assert result.exit_code == 0
commit_message = """ commit_message = """
@ -693,7 +686,7 @@ def test_hg_commit_message(runner, caplog):
_vcs_init("hg", ["README.md", "setup.cfg"]) _vcs_init("hg", ["README.md", "setup.cfg"])
assert len(caplog.records) > 0 assert len(caplog.records) > 0
result = runner.invoke(cli, ['bump', "-vv", "--pin-date", "--release", "beta"]) result = runner.invoke(main.cli, ['bump', "-vv", "--pin-date", "--release", "beta"])
assert result.exit_code == 0 assert result.exit_code == 0
tags = shell("hg", "tags").decode("utf-8") tags = shell("hg", "tags").decode("utf-8")
@ -708,7 +701,7 @@ def test_hg_commit_message(runner, caplog):
def test_git_commit_message(runner, caplog): def test_git_commit_message(runner, caplog):
_add_project_files("README.md", "setup.cfg") _add_project_files("README.md", "setup.cfg")
result = runner.invoke(cli, ['init', "-vv"]) result = runner.invoke(main.cli, ['init', "-vv"])
assert result.exit_code == 0 assert result.exit_code == 0
commit_message = """ commit_message = """
@ -720,7 +713,7 @@ def test_git_commit_message(runner, caplog):
_vcs_init("git", ["README.md", "setup.cfg"]) _vcs_init("git", ["README.md", "setup.cfg"])
assert len(caplog.records) > 0 assert len(caplog.records) > 0
result = runner.invoke(cli, ['bump', "-vv", "--pin-date", "--release", "beta"]) result = runner.invoke(main.cli, ['bump', "-vv", "--pin-date", "--release", "beta"])
assert result.exit_code == 0 assert result.exit_code == 0
tags = shell("git", "tag", "--list").decode("utf-8") tags = shell("git", "tag", "--list").decode("utf-8")
@ -739,13 +732,13 @@ def test_grep(runner):
search_re = r"^\s+2:\s+Hello World v201701\.1002-alpha !" search_re = r"^\s+2:\s+Hello World v201701\.1002-alpha !"
cmd1 = r'grep "vYYYY0M.BUILD[-RELEASE]" README.md' cmd1 = r'grep "vYYYY0M.BUILD[-RELEASE]" README.md'
result1 = runner.invoke(cli, shlex.split(cmd1)) result1 = runner.invoke(main.cli, shlex.split(cmd1))
assert result1.exit_code == 0 assert result1.exit_code == 0
assert "README.md" in result1.output assert "README.md" in result1.output
assert re.search(search_re, result1.output, flags=re.MULTILINE) assert re.search(search_re, result1.output, flags=re.MULTILINE)
cmd2 = r'grep --version-pattern "vYYYY0M.BUILD[-RELEASE]" "{version}" README.md' cmd2 = r'grep --version-pattern "vYYYY0M.BUILD[-RELEASE]" "{version}" README.md'
result2 = runner.invoke(cli, shlex.split(cmd2)) result2 = runner.invoke(main.cli, shlex.split(cmd2))
assert result2.exit_code == 0 assert result2.exit_code == 0
assert "README.md" in result2.output assert "README.md" in result2.output
assert re.search(search_re, result2.output, flags=re.MULTILINE) assert re.search(search_re, result2.output, flags=re.MULTILINE)
@ -755,7 +748,7 @@ def test_grep(runner):
search_re = r"^\s+3:\s+\[aka\. 201701\.1002a0 \!\]" search_re = r"^\s+3:\s+\[aka\. 201701\.1002a0 \!\]"
cmd3 = r'grep "\[aka. YYYY0M.BLD[PYTAGNUM] \!\]" README.md' cmd3 = r'grep "\[aka. YYYY0M.BLD[PYTAGNUM] \!\]" README.md'
result3 = runner.invoke(cli, shlex.split(cmd3)) result3 = runner.invoke(main.cli, shlex.split(cmd3))
assert result3.exit_code == 0 assert result3.exit_code == 0
assert "README.md" in result3.output assert "README.md" in result3.output
assert re.search(search_re, result3.output, flags=re.MULTILINE) assert re.search(search_re, result3.output, flags=re.MULTILINE)
@ -763,7 +756,7 @@ def test_grep(runner):
cmd4 = ( cmd4 = (
r'grep --version-pattern "vYYYY0M.BUILD[-RELEASE]" "\[aka. {pep440_version} \!\]" README.md' r'grep --version-pattern "vYYYY0M.BUILD[-RELEASE]" "\[aka. {pep440_version} \!\]" README.md'
) )
result4 = runner.invoke(cli, shlex.split(cmd4)) result4 = runner.invoke(main.cli, shlex.split(cmd4))
assert result4.exit_code == 0 assert result4.exit_code == 0
assert "README.md" in result4.output assert "README.md" in result4.output
assert re.search(search_re, result4.output, flags=re.MULTILINE) assert re.search(search_re, result4.output, flags=re.MULTILINE)
@ -791,7 +784,7 @@ def test_multimatch_file_patterns(runner):
with pl.Path("setup.cfg").open(mode="w", encoding="utf-8") as fobj: with pl.Path("setup.cfg").open(mode="w", encoding="utf-8") as fobj:
fobj.write(SETUP_CFG_MULTIMATCH_FILE_PATTERNS_FIXTURE) fobj.write(SETUP_CFG_MULTIMATCH_FILE_PATTERNS_FIXTURE)
result = runner.invoke(cli, ['bump', '--release', 'beta']) result = runner.invoke(main.cli, ['bump', '--release', 'beta'])
assert result.exit_code == 0 assert result.exit_code == 0
with pl.Path("README.md").open(mode="r", encoding="utf-8") as fobj: with pl.Path("README.md").open(mode="r", encoding="utf-8") as fobj:
@ -831,7 +824,7 @@ ROLLOVER_TEST_CASES = [
@pytest.mark.parametrize("version_pattern, old_version, expected, kwargs", ROLLOVER_TEST_CASES) @pytest.mark.parametrize("version_pattern, old_version, expected, kwargs", ROLLOVER_TEST_CASES)
def test_rollover(version_pattern, old_version, expected, kwargs): def test_rollover(version_pattern, old_version, expected, kwargs):
new_version = incr_dispatch(old_version, raw_pattern=version_pattern, **kwargs) new_version = main.incr_dispatch(old_version, raw_pattern=version_pattern, **kwargs)
if new_version is None: if new_version is None:
assert expected is None assert expected is None
else: else: