wip: misc project updates

This commit is contained in:
Manuel Barkhau 2018-11-04 21:11:42 +01:00
parent 2ca615d19b
commit e888be1f71
14 changed files with 219 additions and 438 deletions

View file

@ -8,4 +8,4 @@ import os
__version__ = "v201809.0002-beta"
DEBUG = os.environ.get("PYCALVER_DEBUG", "0") == "1"
DEBUG = os.environ.get("PYDEBUG", "0") == "1"

View file

@ -25,13 +25,13 @@ log = logging.getLogger("pycalver.__main__")
def _init_loggers(verbose: bool) -> None:
if DEBUG:
log_formatter = logging.Formatter('%(levelname)s - %(name)s - %(message)s')
log_level = logging.DEBUG
log_level = logging.DEBUG
elif verbose:
log_formatter = logging.Formatter('%(levelname)s - %(message)s')
log_level = logging.INFO
log_level = logging.INFO
else:
log_formatter = logging.Formatter('%(message)s')
log_level = logging.WARNING
log_level = logging.WARNING
loggers = [log, vcs.log, parse.log, config.log, rewrite.log, version.log]
@ -66,10 +66,7 @@ def show() -> None:
@cli.command()
@click.argument("old_version")
@click.option(
"--release",
default=None,
metavar="<name>",
help="Override release name of current_version",
"--release", default=None, metavar="<name>", help="Override release name of current_version"
)
def incr(old_version: str, release: str = None) -> None:
_init_loggers(verbose=False)
@ -79,25 +76,22 @@ def incr(old_version: str, release: str = None) -> None:
log.error(f"Valid arguments are: {', '.join(parse.VALID_RELESE_VALUES)}")
sys.exit(1)
new_version = version.bump(old_version, release=release)
new_version = version.bump(old_version, release=release)
new_version_nfo = parse.parse_version_info(new_version)
print("PyCalVer Version:", new_version)
print("PEP440 Version:", new_version_nfo.pep440_version)
print("PEP440 Version:" , new_version_nfo.pep440_version)
@cli.command()
@click.option(
"--dry",
default=False,
is_flag=True,
help="Display diff of changes, don't rewrite files.",
"--dry", default=False, is_flag=True, help="Display diff of changes, don't rewrite files."
)
def init(dry: bool) -> None:
"""Initialize [pycalver] configuration in setup.cfg"""
_init_loggers(verbose=False)
cfg: config.MaybeConfig = config.parse()
cfg : config.MaybeConfig = config.parse()
if cfg:
log.error("Configuration already initialized in setup.cfg")
sys.exit(1)
@ -123,35 +117,14 @@ def init(dry: bool) -> None:
@cli.command()
@click.option(
"--release",
default=None,
metavar="<name>",
help="Override release name of current_version",
"--release", default=None, metavar="<name>", help="Override release name of current_version"
)
@click.option("--verbose", default=False, is_flag=True, help="Log applied changes to stderr")
@click.option(
"--verbose",
default=False,
is_flag=True,
help="Log applied changes to stderr",
)
@click.option(
"--dry",
default=False,
is_flag=True,
help="Display diff of changes, don't rewrite files.",
)
@click.option(
"--commit",
default=True,
is_flag=True,
help="Commit after updating version strings.",
)
@click.option(
"--tag",
default=True,
is_flag=True,
help="Tag the commit.",
"--dry", default=False, is_flag=True, help="Display diff of changes, don't rewrite files."
)
@click.option("--commit", default=True, is_flag=True, help="Commit after updating version strings.")
@click.option("--tag" , default=True, is_flag=True, help="Tag the commit.")
@click.option(
"--allow-dirty",
default=False,
@ -163,12 +136,7 @@ def init(dry: bool) -> None:
),
)
def bump(
release: str,
verbose: bool,
dry: bool,
commit: bool,
tag: bool,
allow_dirty: bool,
release: str, verbose: bool, dry: bool, commit: bool, tag: bool, allow_dirty: bool
) -> None:
_init_loggers(verbose)
@ -193,7 +161,7 @@ def bump(
log.info("Running with '--dry', showing diffs instead of updating files.")
file_patterns = cfg.file_patterns
filepaths = set(file_patterns.keys())
filepaths = set(file_patterns.keys())
_vcs = vcs.get_vcs()
if _vcs is None:

View file

@ -20,13 +20,13 @@ log = logging.getLogger("pycalver.config")
class Config(typ.NamedTuple):
current_version : str
pep440_version : str
current_version: str
pep440_version : str
tag : bool
commit : bool
tag : bool
commit: bool
file_patterns : typ.Dict[str, typ.List[str]]
file_patterns: typ.Dict[str, typ.List[str]]
MaybeConfig = typ.Optional[Config]
@ -34,7 +34,10 @@ MaybeConfig = typ.Optional[Config]
def parse_buffer(cfg_buffer: io.StringIO) -> MaybeConfig:
cfg_parser = configparser.RawConfigParser()
cfg_parser.readfp(cfg_buffer)
if hasattr(cfg_parser, 'read_file'):
cfg_parser.read_file(cfg_buffer)
else:
cfg_parser.readfp(cfg_buffer)
if not cfg_parser.has_section("pycalver"):
log.error("setup.cfg does not contain a [pycalver] section.")
@ -46,7 +49,7 @@ def parse_buffer(cfg_buffer: io.StringIO) -> MaybeConfig:
log.error("setup.cfg does not have 'pycalver.current_version'")
return None
current_version = base_cfg["current_version"]
current_version = base_cfg['current_version']
if PYCALVER_RE.match(current_version) is None:
log.error(f"setup.cfg 'pycalver.current_version is invalid")
log.error(f"current_version = {current_version}")
@ -54,7 +57,7 @@ def parse_buffer(cfg_buffer: io.StringIO) -> MaybeConfig:
pep440_version = str(pkg_resources.parse_version(current_version))
tag = base_cfg.get("tag", "").lower() in ("yes", "true", "1", "on")
tag = base_cfg.get("tag" , "").lower() in ("yes", "true", "1", "on")
commit = base_cfg.get("commit", "").lower() in ("yes", "true", "1", "on")
file_patterns: typ.Dict[str, typ.List[str]] = {}
@ -76,9 +79,7 @@ def parse_buffer(cfg_buffer: io.StringIO) -> MaybeConfig:
file_patterns[filepath] = ["{version}", "{pep440_version}"]
else:
file_patterns[filepath] = [
line.strip()
for line in patterns.splitlines()
if line.strip()
line.strip() for line in patterns.splitlines() if line.strip()
]
if not file_patterns:
@ -118,29 +119,28 @@ def default_config_lines() -> typ.List[str]:
]
if os.path.exists("setup.py"):
cfg_lines.extend([
"[pycalver:file:setup.py]",
"patterns = ",
" \"{version}\"",
" \"{pep440_version}\"",
"",
])
cfg_lines.extend(
[
"[pycalver:file:setup.py]",
"patterns = ",
" \"{version}\"",
" \"{pep440_version}\"",
"",
]
)
if os.path.exists("README.rst"):
cfg_lines.extend([
"[pycalver:file:README.rst]",
"patterns = ",
" {version}",
" {pep440_version}",
"",
])
cfg_lines.extend(
[
"[pycalver:file:README.rst]",
"patterns = ",
" {version}",
" {pep440_version}",
"",
]
)
if os.path.exists("README.md"):
cfg_lines.extend([
"[pycalver:file:README.md]",
" {version}",
" {pep440_version}",
"",
])
cfg_lines.extend(["[pycalver:file:README.md]", " {version}", " {pep440_version}", ""])
return cfg_lines

View file

@ -90,7 +90,7 @@ def next_id(prev_id: str) -> str:
_prev_id = int(prev_id, 10)
_next_id = int(_prev_id) + 1
next_id = f"{_next_id:0{num_digits}}"
next_id = f"{_next_id:0{num_digits}}"
if prev_id[0] != next_id[0]:
next_id = str(_next_id * 11)
return next_id

View file

@ -1,4 +1,3 @@
#!/usr/bin/env python
# This file is part of the pycalver project
# https://github.com/mbarkhau/pycalver
#
@ -15,42 +14,47 @@ from . import parse
log = logging.getLogger("pycalver.rewrite")
def rewrite(
new_version: str,
file_patterns: typ.Dict[str, typ.List[str]],
dry=False,
verbose=False,
) -> None:
new_version_nfo = parse.parse_version_info(new_version)
def rewrite_lines(
old_lines: typ.List[str], patterns: typ.List[str], new_version: str
) -> typ.List[str]:
new_version_nfo = parse.parse_version_info(new_version)
new_version_fmt_kwargs = new_version_nfo._asdict()
matches: typ.List[parse.PatternMatch]
new_lines = old_lines.copy()
matches: typ.List[parse.PatternMatch] = parse.parse_patterns(old_lines, patterns)
for m in matches:
replacement = m.pattern.format(**new_version_fmt_kwargs)
span_l, span_r = m.span
new_line = m.line[:span_l] + replacement + m.line[span_r:]
new_lines[m.lineno] = new_line
return new_lines
def rewrite(
new_version: str, file_patterns: typ.Dict[str, typ.List[str]], dry=False, verbose=False
) -> None:
for filepath, patterns in file_patterns.items():
with io.open(filepath, mode="rt", encoding="utf-8") as fh:
content = fh.read()
old_lines = content.splitlines()
new_lines = old_lines.copy()
# TODO (mb 2018-09-18): Detect line sep
line_sep = "\n"
matches = parse.parse_patterns(old_lines, patterns)
for m in matches:
replacement = m.pattern.format(**new_version_fmt_kwargs)
span_l, span_r = m.span
new_line = m.line[:span_l] + replacement + m.line[span_r:]
new_lines[m.lineno] = new_line
old_lines = content.splitlines()
new_lines = rewrite_lines(old_lines, patterns, new_version)
if dry or verbose:
print("\n".join(difflib.unified_diff(
old_lines,
new_lines,
lineterm="",
fromfile="a/" + filepath,
tofile="b/" + filepath,
)))
diff_lines = difflib.unified_diff(
old_lines, new_lines, lineterm="", fromfile="a/" + filepath, tofile="b/" + filepath
)
print("\n".join(diff_lines))
if dry:
continue
new_content = "\n".join(new_lines)
new_content = line_sep.join(new_lines)
with io.open(filepath, mode="wt", encoding="utf-8") as fh:
fh.write(new_content)

View file

@ -22,8 +22,8 @@ log = logging.getLogger("pycalver.vcs")
class BaseVCS:
_TEST_USABLE_COMMAND: typ.List[str]
_COMMIT_COMMAND: typ.List[str]
_STATUS_COMMAND: typ.List[str]
_COMMIT_COMMAND : typ.List[str]
_STATUS_COMMAND : typ.List[str]
@classmethod
def commit(cls, message: str) -> None:
@ -38,18 +38,14 @@ class BaseVCS:
env = os.environ.copy()
# TODO (mb 2018-09-04): check that this works on py27,
# might need to be bytes there, idk.
env["HGENCODING"] = "utf-8"
env['HGENCODING'] = "utf-8"
sp.check_output(cmd, env=env)
os.unlink(tmp_file.name)
@classmethod
def is_usable(cls) -> bool:
try:
return sp.call(
cls._TEST_USABLE_COMMAND,
stderr=sp.PIPE,
stdout=sp.PIPE,
) == 0
return sp.call(cls._TEST_USABLE_COMMAND, stderr=sp.PIPE, stdout=sp.PIPE) == 0
except OSError as e:
if e.errno == 2:
# mercurial is not installed then, ok.
@ -88,8 +84,8 @@ class BaseVCS:
class Git(BaseVCS):
_TEST_USABLE_COMMAND = ["git", "rev-parse", "--git-dir"]
_COMMIT_COMMAND = ["git", "commit", "-F"]
_STATUS_COMMAND = ["git", "status", "--porcelain"]
_COMMIT_COMMAND = ["git", "commit" , "-F"]
_STATUS_COMMAND = ["git", "status" , "--porcelain"]
@classmethod
def tag(cls, name):
@ -102,9 +98,9 @@ class Git(BaseVCS):
class Mercurial(BaseVCS):
_TEST_USABLE_COMMAND = ["hg", "root"]
_COMMIT_COMMAND = ["hg", "commit", "--logfile"]
_STATUS_COMMAND = ["hg", "status", "-mard"]
_TEST_USABLE_COMMAND = ["hg", 'root']
_COMMIT_COMMAND = ["hg", "commit", "--logfile"]
_STATUS_COMMAND = ["hg", "status", "-mard"]
@classmethod
def tag(cls, name):

View file

@ -27,9 +27,9 @@ def bump(old_version: str, *, release: str = None) -> str:
if old_ver.calver > new_calver:
log.warning(
f"'version.bump' called with '{old_version}', " +
f"which is from the future, " +
f"maybe your system clock is out of sync."
f"'version.bump' called with '{old_version}', "
+ f"which is from the future, "
+ f"maybe your system clock is out of sync."
)
# leave calver as is (don't go back in time)
new_calver = old_ver.calver
@ -43,7 +43,7 @@ def bump(old_version: str, *, release: str = None) -> str:
new_release = old_ver.release[1:]
else:
new_release = None
elif release == "final":
elif release == 'final':
new_release = None
else:
new_release = release