reorg to avoid circular import

This commit is contained in:
Manuel Barkhau 2018-12-09 14:49:13 +01:00
parent aafcc459f1
commit 9c2883d8ef
7 changed files with 172 additions and 171 deletions

View file

@ -71,9 +71,9 @@ def incr(old_version: str, verbose: int = 0, release: str = None) -> None:
"""Increment a version number for demo purposes.""" """Increment a version number for demo purposes."""
_init_logging(verbose=max(_VERBOSE, verbose)) _init_logging(verbose=max(_VERBOSE, verbose))
if release and release not in parse.VALID_RELESE_VALUES: if release and release not in parse.VALID_RELEASE_VALUES:
log.error(f"Invalid argument --release={release}") log.error(f"Invalid argument --release={release}")
log.error(f"Valid arguments are: {', '.join(parse.VALID_RELESE_VALUES)}") log.error(f"Valid arguments are: {', '.join(parse.VALID_RELEASE_VALUES)}")
sys.exit(1) sys.exit(1)
new_version = version.incr(old_version, release=release) new_version = version.incr(old_version, release=release)
@ -91,7 +91,7 @@ def _update_cfg_from_vcs(cfg: config.Config, fetch: bool) -> config.Config:
log.info(f"fetching tags from remote") log.info(f"fetching tags from remote")
_vcs.fetch() _vcs.fetch()
version_tags = [tag for tag in _vcs.ls_tags() if parse.PYCALVER_RE.match(tag)] version_tags = [tag for tag in _vcs.ls_tags() if version.PYCALVER_RE.match(tag)]
if version_tags: if version_tags:
version_tags.sort(reverse=True) version_tags.sort(reverse=True)
log.debug(f"found {len(version_tags)} tags: {version_tags[:2]}") log.debug(f"found {len(version_tags)} tags: {version_tags[:2]}")
@ -110,7 +110,9 @@ def _update_cfg_from_vcs(cfg: config.Config, fetch: bool) -> config.Config:
@cli.command() @cli.command()
@click.option('-v', '--verbose', count=True, help="Control log level. -vv for debug level.") @click.option('-v', '--verbose', count=True, help="Control log level. -vv for debug level.")
@click.option('-f', "--fetch/--no-fetch", is_flag=True, default=True, help="Sync tags from remote origin.") @click.option(
'-f', "--fetch/--no-fetch", is_flag=True, default=True, help="Sync tags from remote origin."
)
def show(verbose: int = 0, fetch: bool = True) -> None: def show(verbose: int = 0, fetch: bool = True) -> None:
"""Show current version.""" """Show current version."""
_init_logging(verbose=max(_VERBOSE, verbose)) _init_logging(verbose=max(_VERBOSE, verbose))
@ -232,9 +234,9 @@ def bump(
verbose = max(_VERBOSE, verbose) verbose = max(_VERBOSE, verbose)
_init_logging(verbose) _init_logging(verbose)
if release and release not in parse.VALID_RELESE_VALUES: if release and release not in parse.VALID_RELEASE_VALUES:
log.error(f"Invalid argument --release={release}") log.error(f"Invalid argument --release={release}")
log.error(f"Valid arguments are: {', '.join(parse.VALID_RELESE_VALUES)}") log.error(f"Valid arguments are: {', '.join(parse.VALID_RELEASE_VALUES)}")
sys.exit(1) sys.exit(1)
ctx: config.ProjectContext = config.init_project_ctx(project_path=".") ctx: config.ProjectContext = config.init_project_ctx(project_path=".")

View file

@ -15,7 +15,6 @@ import datetime as dt
import logging import logging
from .parse import PYCALVER_RE
from . import version from . import version
log = logging.getLogger("pycalver.config") log = logging.getLogger("pycalver.config")
@ -179,7 +178,7 @@ def _parse_config(raw_cfg: RawConfig) -> Config:
version_str = raw_cfg['current_version'] version_str = raw_cfg['current_version']
version_str = raw_cfg['current_version'] = version_str.strip("'\" ") version_str = raw_cfg['current_version'] = version_str.strip("'\" ")
if PYCALVER_RE.match(version_str) is None: if version.PYCALVER_RE.match(version_str) is None:
raise ValueError(f"Invalid current_version = {version_str}") raise ValueError(f"Invalid current_version = {version_str}")
pep440_version = version.pycalver_to_pep440(version_str) pep440_version = version.pycalver_to_pep440(version_str)

View file

@ -3,63 +3,18 @@
# #
# Copyright (c) 2018 Manuel Barkhau (@mbarkhau) - MIT License # Copyright (c) 2018 Manuel Barkhau (@mbarkhau) - MIT License
# SPDX-License-Identifier: MIT # SPDX-License-Identifier: MIT
"""Parse PyCalVer strings. """Parse PyCalVer strings from files."""
>>> version_info = PYCALVER_RE.match("v201712.0123-alpha").groupdict()
>>> assert version_info == {
... "version" : "v201712.0123-alpha",
... "calver" : "v201712",
... "year" : "2017",
... "month" : "12",
... "build" : ".0123",
... "release" : "-alpha",
... }
>>>
>>> version_info = PYCALVER_RE.match("v201712.0033").groupdict()
>>> assert version_info == {
... "version" : "v201712.0033",
... "calver" : "v201712",
... "year" : "2017",
... "month" : "12",
... "build" : ".0033",
... "release" : None,
... }
"""
import re import re
import logging import logging
import typing as typ import typing as typ
from . import version
log = logging.getLogger("pycalver.parse") log = logging.getLogger("pycalver.parse")
VALID_RELESE_VALUES = ("alpha", "beta", "dev", "rc", "post") VALID_RELEASE_VALUES = ("alpha", "beta", "dev", "rc", "post")
# https://regex101.com/r/fnj60p/10
PYCALVER_PATTERN = r"""
\b
(?P<version>
(?P<calver>
v # "v" version prefix
(?P<year>\d{4})
(?P<month>\d{2})
)
(?P<build>
\. # "." build nr prefix
\d{4,}
)
(?P<release>
\- # "-" release prefix
(?:alpha|beta|dev|rc|post)
)?
)(?:\s|$)
"""
PYCALVER_RE: typ.Pattern[str] = re.compile(PYCALVER_PATTERN, flags=re.VERBOSE)
PATTERN_ESCAPES = [ PATTERN_ESCAPES = [
("\u005c", "\u005c\u005c"), ("\u005c", "\u005c\u005c"),
("-" , "\u005c-"), ("-" , "\u005c-"),
@ -86,41 +41,6 @@ RE_PATTERN_PARTS = {
} }
class VersionInfo(typ.NamedTuple):
"""Container for parsed version string."""
version : str
pep440_version: str
calver : str
year : str
month : str
build : str
release : typ.Optional[str]
def parse_version_info(version_str: str) -> VersionInfo:
"""Parse a PyCalVer string.
>>> vnfo = parse_version_info("v201712.0033-beta")
>>> assert vnfo == VersionInfo(
... version="v201712.0033-beta",
... pep440_version="201712.33b0",
... calver="v201712",
... year="2017",
... month="12",
... build=".0033",
... release="-beta",
... )
"""
match = PYCALVER_RE.match(version_str)
if match is None:
raise ValueError(f"Invalid PyCalVer string: {version_str}")
kwargs = match.groupdict()
kwargs['pep440_version'] = version.pycalver_to_pep440(kwargs['version'])
return VersionInfo(**kwargs)
class PatternMatch(typ.NamedTuple): class PatternMatch(typ.NamedTuple):
"""Container to mark a version string in a file.""" """Container to mark a version string in a file."""

View file

@ -12,6 +12,7 @@ import typing as typ
from . import parse from . import parse
from . import config from . import config
from . import version
log = logging.getLogger("pycalver.rewrite") log = logging.getLogger("pycalver.rewrite")
@ -47,7 +48,7 @@ def rewrite_lines(
>>> new_lines = rewrite_lines(patterns, "v201811.0123-beta", old_lines) >>> new_lines = rewrite_lines(patterns, "v201811.0123-beta", old_lines)
>>> assert new_lines == ['__version__ = "v201811.0123-beta"'] >>> assert new_lines == ['__version__ = "v201811.0123-beta"']
""" """
new_version_nfo = parse.parse_version_info(new_version) new_version_nfo = version.parse_version_info(new_version)
new_version_fmt_kwargs = new_version_nfo._asdict() new_version_fmt_kwargs = new_version_nfo._asdict()
new_lines = old_lines.copy() new_lines = old_lines.copy()

View file

@ -3,19 +3,98 @@
# #
# Copyright (c) 2018 Manuel Barkhau (@mbarkhau) - MIT License # Copyright (c) 2018 Manuel Barkhau (@mbarkhau) - MIT License
# SPDX-License-Identifier: MIT # SPDX-License-Identifier: MIT
"""Functions related to version string manipulation.""" """Functions related to version string manipulation.
>>> version_info = PYCALVER_RE.match("v201712.0123-alpha").groupdict()
>>> assert version_info == {
... "version" : "v201712.0123-alpha",
... "calver" : "v201712",
... "year" : "2017",
... "month" : "12",
... "build" : ".0123",
... "release" : "-alpha",
... }
>>>
>>> version_info = PYCALVER_RE.match("v201712.0033").groupdict()
>>> assert version_info == {
... "version" : "v201712.0033",
... "calver" : "v201712",
... "year" : "2017",
... "month" : "12",
... "build" : ".0033",
... "release" : None,
... }
"""
import re
import logging import logging
import pkg_resources import pkg_resources
import typing as typ import typing as typ
import datetime as dt import datetime as dt
from . import lex_id from . import lex_id
from . import parse
log = logging.getLogger("pycalver.version") log = logging.getLogger("pycalver.version")
# https://regex101.com/r/fnj60p/10
PYCALVER_PATTERN = r"""
\b
(?P<version>
(?P<calver>
v # "v" version prefix
(?P<year>\d{4})
(?P<month>\d{2})
)
(?P<build>
\. # "." build nr prefix
\d{4,}
)
(?P<release>
\- # "-" release prefix
(?:alpha|beta|dev|rc|post)
)?
)(?:\s|$)
"""
PYCALVER_RE: typ.Pattern[str] = re.compile(PYCALVER_PATTERN, flags=re.VERBOSE)
class VersionInfo(typ.NamedTuple):
"""Container for parsed version string."""
version : str
pep440_version: str
calver : str
year : str
month : str
build : str
release : typ.Optional[str]
def parse_version_info(version_str: str) -> VersionInfo:
"""Parse a PyCalVer string.
>>> vnfo = parse_version_info("v201712.0033-beta")
>>> assert vnfo == VersionInfo(
... version="v201712.0033-beta",
... pep440_version="201712.33b0",
... calver="v201712",
... year="2017",
... month="12",
... build=".0033",
... release="-beta",
... )
"""
match = PYCALVER_RE.match(version_str)
if match is None:
raise ValueError(f"Invalid PyCalVer string: {version_str}")
kwargs = match.groupdict()
kwargs['pep440_version'] = pycalver_to_pep440(kwargs['version'])
return VersionInfo(**kwargs)
def current_calver() -> str: def current_calver() -> str:
"""Generate calver version string based on current date. """Generate calver version string based on current date.
@ -30,7 +109,7 @@ def incr(old_version: str, *, release: str = None) -> str:
Old_version is assumed to be a valid calver string, Old_version is assumed to be a valid calver string,
already validated in pycalver.config.parse. already validated in pycalver.config.parse.
""" """
old_ver = parse.parse_version_info(old_version) old_ver = parse_version_info(old_version)
new_calver = current_calver() new_calver = current_calver()

View file

@ -2,34 +2,6 @@ import re
from pycalver import parse from pycalver import parse
def test_readme_pycalver1():
version_str = "v201712.0001-alpha"
version_info = parse.PYCALVER_RE.match(version_str).groupdict()
assert version_info == {
'version': "v201712.0001-alpha",
'calver' : "v201712",
'year' : "2017",
'month' : "12",
'build' : ".0001",
'release': "-alpha",
}
def test_readme_pycalver2():
version_str = "v201712.0033"
version_info = parse.PYCALVER_RE.match(version_str).groupdict()
assert version_info == {
'version': "v201712.0033",
'calver' : "v201712",
'year' : "2017",
'month' : "12",
'build' : ".0033",
'release': None,
}
def test_re_pattern_parts(): def test_re_pattern_parts():
part_re_by_name = { part_re_by_name = {
part_name: re.compile(part_re_str) part_name: re.compile(part_re_str)
@ -73,30 +45,6 @@ def test_re_pattern_parts():
assert result_val == expected, (part_name, line) assert result_val == expected, (part_name, line)
def test_parse_version_info():
version_str = "v201712.0001-alpha"
version_nfo = parse.parse_version_info(version_str)
assert version_nfo.pep440_version == "201712.1a0"
assert version_nfo.version == "v201712.0001-alpha"
assert version_nfo.calver == "v201712"
assert version_nfo.year == "2017"
assert version_nfo.month == "12"
assert version_nfo.build == ".0001"
assert version_nfo.release == "-alpha"
version_str = "v201712.0001"
version_nfo = parse.parse_version_info(version_str)
assert version_nfo.pep440_version == "201712.1"
assert version_nfo.version == "v201712.0001"
assert version_nfo.calver == "v201712"
assert version_nfo.year == "2017"
assert version_nfo.month == "12"
assert version_nfo.build == ".0001"
assert version_nfo.release is None
SETUP_PY_FIXTURE = """ SETUP_PY_FIXTURE = """
# setup.py # setup.py
import setuptools import setuptools
@ -167,27 +115,3 @@ def test_badge_parse_patterns():
assert matches[0].match == "badge/CalVer-v201809.0002--beta-blue.svg" assert matches[0].match == "badge/CalVer-v201809.0002--beta-blue.svg"
assert matches[1].match == ":alt: CalVer v201809.0002-beta" assert matches[1].match == ":alt: CalVer v201809.0002-beta"
def test_parse_error_empty():
try:
parse.parse_version_info("")
assert False
except ValueError as err:
pass
def test_parse_error_noprefix():
try:
parse.parse_version_info("201809.0002")
assert False
except ValueError as err:
pass
def test_parse_error_nopadding():
try:
parse.parse_version_info("v201809.2b0")
assert False
except ValueError as err:
pass

View file

@ -52,3 +52,79 @@ def test_bump_random(monkeypatch):
) )
assert cur_version < new_version assert cur_version < new_version
cur_version = new_version cur_version = new_version
def test_parse_version_info():
version_str = "v201712.0001-alpha"
version_nfo = version.parse_version_info(version_str)
assert version_nfo.pep440_version == "201712.1a0"
assert version_nfo.version == "v201712.0001-alpha"
assert version_nfo.calver == "v201712"
assert version_nfo.year == "2017"
assert version_nfo.month == "12"
assert version_nfo.build == ".0001"
assert version_nfo.release == "-alpha"
version_str = "v201712.0001"
version_nfo = version.parse_version_info(version_str)
assert version_nfo.pep440_version == "201712.1"
assert version_nfo.version == "v201712.0001"
assert version_nfo.calver == "v201712"
assert version_nfo.year == "2017"
assert version_nfo.month == "12"
assert version_nfo.build == ".0001"
assert version_nfo.release is None
def test_readme_pycalver1():
version_str = "v201712.0001-alpha"
version_info = version.PYCALVER_RE.match(version_str).groupdict()
assert version_info == {
'version': "v201712.0001-alpha",
'calver' : "v201712",
'year' : "2017",
'month' : "12",
'build' : ".0001",
'release': "-alpha",
}
def test_readme_pycalver2():
version_str = "v201712.0033"
version_info = version.PYCALVER_RE.match(version_str).groupdict()
assert version_info == {
'version': "v201712.0033",
'calver' : "v201712",
'year' : "2017",
'month' : "12",
'build' : ".0033",
'release': None,
}
def test_parse_error_empty():
try:
version.parse_version_info("")
assert False
except ValueError as err:
pass
def test_parse_error_noprefix():
try:
version.parse_version_info("201809.0002")
assert False
except ValueError as err:
pass
def test_parse_error_nopadding():
try:
version.parse_version_info("v201809.2b0")
assert False
except ValueError as err:
pass