bumpver/test/test_rewrite.py

339 lines
12 KiB
Python
Raw Normal View History

2020-09-17 23:38:58 +00:00
# -*- coding: utf-8 -*-
from __future__ import division
from __future__ import print_function
from __future__ import absolute_import
from __future__ import unicode_literals
2020-07-19 14:38:57 +00:00
2020-10-02 20:52:54 +00:00
import re
2019-02-21 17:06:47 +01:00
import copy
2020-09-06 20:20:36 +00:00
from test import util
2019-02-21 17:06:47 +01:00
2020-10-18 20:47:35 +00:00
from bumpver import config
from bumpver import rewrite
from bumpver import v1rewrite
from bumpver import v1version
from bumpver import v2rewrite
from bumpver import v2version
from bumpver import v1patterns
from bumpver import v2patterns
2019-02-21 15:41:06 +01:00
2020-09-17 23:38:58 +00:00
# pylint:disable=protected-access ; allowed for test code
2020-10-02 20:52:54 +00:00
# Fix for Python<3.7
# https://stackoverflow.com/a/56935186/62997
copy._deepcopy_dispatch[type(re.compile(''))] = lambda r, _: r
2018-11-15 22:16:16 +01:00
REWRITE_FIXTURE = """
# SPDX-License-Identifier: MIT
__version__ = "v201809.0002-beta"
"""
2020-10-02 20:52:54 +00:00
def test_v1_rewrite_lines_basic():
pattern = v1patterns.compile_pattern("{pycalver}", '__version__ = "{pycalver}"')
2020-09-06 20:20:36 +00:00
new_vinfo = v1version.parse_version_info("v201911.0003")
2020-10-02 20:52:54 +00:00
old_lines = REWRITE_FIXTURE.splitlines()
new_lines = v1rewrite.rewrite_lines([pattern], new_vinfo, old_lines)
assert len(new_lines) == len(old_lines)
assert "v201911.0003" not in "\n".join(old_lines)
assert "v201911.0003" in "\n".join(new_lines)
2020-10-02 20:52:54 +00:00
def test_v1_rewrite_lines():
version_pattern = "{pycalver}"
new_vinfo = v1version.parse_version_info("v201811.0123-beta", version_pattern)
patterns = [v1patterns.compile_pattern(version_pattern, '__version__ = "{pycalver}"')]
lines = v1rewrite.rewrite_lines(patterns, new_vinfo, ['__version__ = "v201809.0002-beta"'])
assert lines == ['__version__ = "v201811.0123-beta"']
patterns = [v1patterns.compile_pattern(version_pattern, '__version__ = "{pep440_version}"')]
lines = v1rewrite.rewrite_lines(patterns, new_vinfo, ['__version__ = "201809.2b0"'])
assert lines == ['__version__ = "201811.123b0"']
def test_v2_rewrite_lines():
2020-10-14 22:17:18 +00:00
version_pattern = "vYYYY0M.BUILD[-TAG]"
2020-10-02 20:52:54 +00:00
new_vinfo = v2version.parse_version_info("v201811.0123-beta", version_pattern)
patterns = [v2patterns.compile_pattern(version_pattern, '__version__ = "{version}"')]
lines = v2rewrite.rewrite_lines(patterns, new_vinfo, ['__version__ = "v201809.0002-alpha" '])
assert lines == ['__version__ = "v201811.0123-beta" ']
lines = v2rewrite.rewrite_lines(
patterns, new_vinfo, ['__version__ = "v201809.0002-alpha" # comment']
)
assert lines == ['__version__ = "v201811.0123-beta" # comment']
patterns = [v2patterns.compile_pattern(version_pattern, '__version__ = "YYYY0M.BLD[PYTAGNUM]"')]
old_lines = ['__version__ = "201809.2a0"']
lines = v2rewrite.rewrite_lines(patterns, new_vinfo, old_lines)
assert lines == ['__version__ = "201811.123b0"']
def test_v1_rewrite_final():
# Patterns written with {release_tag} placeholder preserve
# the release tag even if the new version is -final
2020-10-02 20:52:54 +00:00
pattern = v1patterns.compile_pattern(
"v{year}{month}.{build_no}-{release_tag}",
'__version__ = "v{year}{month}.{build_no}-{release_tag}"',
)
2020-09-06 20:20:36 +00:00
new_vinfo = v1version.parse_version_info("v201911.0003")
2020-10-02 20:52:54 +00:00
old_lines = REWRITE_FIXTURE.splitlines()
new_lines = v1rewrite.rewrite_lines([pattern], new_vinfo, old_lines)
2018-11-04 21:11:42 +01:00
assert len(new_lines) == len(old_lines)
assert "v201911.0003" not in "\n".join(old_lines)
assert "None" not in "\n".join(new_lines)
assert "v201911.0003-final" in "\n".join(new_lines)
2019-02-21 15:41:06 +01:00
def test_iter_file_paths():
with util.Project(project="a") as project:
ctx = config.init_project_ctx(project.dir)
2020-10-15 19:54:26 +00:00
assert ctx
2019-02-21 15:41:06 +01:00
cfg = config.parse(ctx)
assert cfg
2020-09-19 22:35:48 +00:00
_paths_and_patterns = rewrite.iter_path_patterns_items(cfg.file_patterns)
2020-09-06 20:20:36 +00:00
file_paths = {str(file_path) for file_path, patterns in _paths_and_patterns}
2019-02-21 15:41:06 +01:00
2020-10-18 20:47:35 +00:00
assert file_paths == {"bumpver.toml", "README.md"}
2019-02-21 15:41:06 +01:00
def test_iter_file_globs():
with util.Project(project="b") as project:
ctx = config.init_project_ctx(project.dir)
cfg = config.parse(ctx)
assert cfg
2020-09-19 22:35:48 +00:00
_paths_and_patterns = rewrite.iter_path_patterns_items(cfg.file_patterns)
2020-09-06 20:20:36 +00:00
file_paths = {str(file_path) for file_path, patterns in _paths_and_patterns}
2019-02-21 15:41:06 +01:00
assert file_paths == {
"setup.cfg",
"setup.py",
"README.rst",
"src/module_v1/__init__.py",
"src/module_v2/__init__.py",
}
2019-02-21 17:06:47 +01:00
def test_error_bad_path():
with util.Project(project="b") as project:
ctx = config.init_project_ctx(project.dir)
cfg = config.parse(ctx)
assert cfg
(project.dir / "setup.py").unlink()
try:
2020-09-19 22:35:48 +00:00
list(rewrite.iter_path_patterns_items(cfg.file_patterns))
2019-03-29 02:32:29 +01:00
assert False, "expected IOError"
except IOError as ex:
2019-02-21 17:06:47 +01:00
assert "setup.py" in str(ex)
2020-10-02 20:52:54 +00:00
def test_v1_error_bad_pattern():
2019-02-21 17:06:47 +01:00
with util.Project(project="b") as project:
ctx = config.init_project_ctx(project.dir)
cfg = config.parse(ctx)
assert cfg
2020-10-02 20:52:54 +00:00
patterns = copy.deepcopy(cfg.file_patterns)
original_pattern = patterns["setup.py"][0]
invalid_pattern = v1patterns.compile_pattern(
original_pattern.version_pattern,
original_pattern.raw_pattern + ".invalid",
)
patterns["setup.py"] = [invalid_pattern]
2019-02-21 17:06:47 +01:00
try:
2020-09-19 22:35:48 +00:00
old_vinfo = v1version.parse_version_info("v201808.0233")
2020-09-06 20:20:36 +00:00
new_vinfo = v1version.parse_version_info("v201809.1234")
2020-09-19 22:35:48 +00:00
list(v1rewrite.diff(old_vinfo, new_vinfo, patterns))
assert False, "expected rewrite.NoPatternMatch"
except rewrite.NoPatternMatch as ex:
2019-02-21 17:06:47 +01:00
assert "setup.py" in str(ex)
OPTIONAL_RELEASE_FIXTURE = """
# SPDX-License-Identifier: BSD
__version__ = "2018.0002-beta"
"""
2020-09-06 20:20:36 +00:00
def test_v1_optional_release():
2020-10-02 20:52:54 +00:00
version_pattern = "{year}.{build_no}{release}"
new_vinfo = v1version.parse_version_info("2019.0003", version_pattern)
raw_pattern = '__version__ = "{year}.{build_no}{release}"'
pattern = v1patterns.compile_pattern(version_pattern, raw_pattern)
2020-10-02 20:52:54 +00:00
old_lines = OPTIONAL_RELEASE_FIXTURE.splitlines()
new_lines = v1rewrite.rewrite_lines([pattern], new_vinfo, old_lines)
assert len(new_lines) == len(old_lines)
assert "2019.0003" not in "\n".join(old_lines)
2020-10-02 20:52:54 +00:00
assert "2019.0003" in "\n".join(new_lines)
assert '__version__ = "2019.0003"' in "\n".join(new_lines)
2020-10-02 20:52:54 +00:00
new_vinfo = v1version.parse_version_info("2019.0004-beta", version_pattern)
new_lines = v1rewrite.rewrite_lines([pattern], new_vinfo, old_lines)
# make sure optional release tag is added back on
assert len(new_lines) == len(old_lines)
assert "2019.0004-beta" not in "\n".join(old_lines)
assert "2019.0004-beta" in "\n".join(new_lines)
2020-10-02 20:52:54 +00:00
assert '__version__ = "2019.0004-beta"' in "\n".join(new_lines)
2020-09-18 17:02:03 +00:00
def test_v2_optional_release():
2020-10-14 22:17:18 +00:00
version_pattern = "YYYY.BUILD[-TAG]"
2020-10-02 20:52:54 +00:00
new_vinfo = v2version.parse_version_info("2019.0003", version_pattern)
2020-10-14 22:17:18 +00:00
raw_pattern = '__version__ = "YYYY.BUILD[-TAG]"'
2020-10-02 20:52:54 +00:00
pattern = v2patterns.compile_pattern(version_pattern, raw_pattern)
2020-09-18 17:02:03 +00:00
2020-10-02 20:52:54 +00:00
old_lines = OPTIONAL_RELEASE_FIXTURE.splitlines()
new_lines = v2rewrite.rewrite_lines([pattern], new_vinfo, old_lines)
2020-09-18 17:02:03 +00:00
assert len(new_lines) == len(old_lines)
assert "2019.0003" not in "\n".join(old_lines)
2020-10-02 20:52:54 +00:00
assert "2019.0003" in "\n".join(new_lines)
assert '__version__ = "2019.0003"' in "\n".join(new_lines)
2020-09-18 17:02:03 +00:00
2020-10-02 20:52:54 +00:00
new_vinfo = v2version.parse_version_info("2019.0004-beta", version_pattern)
new_lines = v2rewrite.rewrite_lines([pattern], new_vinfo, old_lines)
2020-09-18 17:02:03 +00:00
# make sure optional release tag is added back on
assert len(new_lines) == len(old_lines)
assert "2019.0004-beta" not in "\n".join(old_lines)
assert "2019.0004-beta" in "\n".join(new_lines)
2020-10-02 20:52:54 +00:00
assert '__version__ = "2019.0004-beta"' in "\n".join(new_lines)
def test_v1_iter_rewritten():
2020-10-18 20:47:35 +00:00
version_pattern = "{year}{build}{release}"
new_vinfo = v1version.parse_version_info("2018.0123", version_pattern)
2020-10-02 20:52:54 +00:00
2020-10-14 22:17:18 +00:00
init_pattern = v1patterns.compile_pattern(
2020-10-18 20:47:35 +00:00
version_pattern, '__version__ = "{year}{build}{release}"'
2020-10-14 22:17:18 +00:00
)
2020-10-18 20:47:35 +00:00
file_patterns = {"src/bumpver/__init__.py": [init_pattern]}
2020-10-02 20:52:54 +00:00
rewritten_datas = v1rewrite.iter_rewritten(file_patterns, new_vinfo)
rfd = list(rewritten_datas)[0]
expected = [
"# This file is part of the bumpver project",
"# https://github.com/mbarkhau/bumpver",
2020-10-02 20:52:54 +00:00
"#",
2022-02-11 22:49:58 +00:00
"# Copyright (c) 2018-2022 Manuel Barkhau (mbarkhau@gmail.com) - MIT License",
2020-10-02 20:52:54 +00:00
"# SPDX-License-Identifier: MIT",
2020-10-18 20:47:35 +00:00
'"""BumpVer: A CLI program for versioning."""',
2020-10-02 20:52:54 +00:00
'',
2020-10-18 20:47:35 +00:00
'__version__ = "2018.0123"',
2020-10-02 20:52:54 +00:00
'',
]
assert rfd.new_lines == expected
def test_v2_iter_rewritten():
2020-10-18 20:47:35 +00:00
version_pattern = "YYYY.BUILD[-TAG]"
new_vinfo = v2version.parse_version_info("2018.0123", version_pattern)
2020-10-02 20:52:54 +00:00
file_patterns = {
2020-10-18 20:47:35 +00:00
"src/bumpver/__init__.py": [
v2patterns.compile_pattern(version_pattern, '__version__ = "YYYY.BUILD[-TAG]"'),
2020-10-02 20:52:54 +00:00
]
}
rewritten_datas = v2rewrite.iter_rewritten(file_patterns, new_vinfo)
rfd = list(rewritten_datas)[0]
expected = [
"# This file is part of the bumpver project",
"# https://github.com/mbarkhau/bumpver",
2020-10-02 20:52:54 +00:00
"#",
2022-02-11 22:49:58 +00:00
"# Copyright (c) 2018-2022 Manuel Barkhau (mbarkhau@gmail.com) - MIT License",
2020-10-02 20:52:54 +00:00
"# SPDX-License-Identifier: MIT",
2020-10-18 20:47:35 +00:00
'"""BumpVer: A CLI program for versioning."""',
2020-10-02 20:52:54 +00:00
'',
2020-10-18 20:47:35 +00:00
'__version__ = "2018.0123"',
2020-10-02 20:52:54 +00:00
'',
]
assert rfd.new_lines == expected
def test_v1_diff():
2020-10-18 20:47:35 +00:00
version_pattern = "{year}{build}{release}"
raw_pattern = '__version__ = "{year}{build}{release}"'
2020-10-02 20:52:54 +00:00
pattern = v1patterns.compile_pattern(version_pattern, raw_pattern)
2020-10-18 20:47:35 +00:00
file_patterns = {"src/bumpver/__init__.py": [pattern]}
2020-10-02 20:52:54 +00:00
old_vinfo = v1version.parse_version_info("v201809.0123")
2020-10-14 22:17:18 +00:00
new_vinfo = v1version.parse_version_info("v201911.1124")
assert new_vinfo > old_vinfo
2020-10-18 20:47:35 +00:00
old_vinfo = v1version.parse_version_info("2018.0123", version_pattern)
new_vinfo = v1version.parse_version_info("2019.1124", version_pattern)
2020-10-02 20:52:54 +00:00
diff_str = v1rewrite.diff(old_vinfo, new_vinfo, file_patterns)
lines = diff_str.split("\n")
2020-10-18 20:47:35 +00:00
assert lines[:2] == [
"--- src/bumpver/__init__.py",
"+++ src/bumpver/__init__.py",
]
2020-10-02 20:52:54 +00:00
2020-10-18 20:47:35 +00:00
assert lines[6].startswith('-__version__ = "20')
assert lines[7].startswith('+__version__ = "20')
2020-10-02 20:52:54 +00:00
2020-10-18 20:47:35 +00:00
assert not lines[6].startswith('-__version__ = "2018.0123"')
2020-10-02 20:52:54 +00:00
2020-10-18 20:47:35 +00:00
assert lines[7] == '+__version__ = "2019.1124"'
2020-10-02 20:52:54 +00:00
raw_pattern = "Copyright (c) 2018-{year}"
pattern = v1patterns.compile_pattern(version_pattern, raw_pattern)
file_patterns = {'LICENSE': [pattern]}
diff_str = v1rewrite.diff(old_vinfo, new_vinfo, file_patterns)
lines = diff_str.split("\n")
assert lines[3].startswith("-MIT License Copyright (c) 2018-20")
assert lines[4].startswith("+MIT License Copyright (c) 2018-2019")
def test_v2_diff():
2020-10-18 20:47:35 +00:00
version_pattern = "YYYY.BUILD[-TAG]"
raw_pattern = '__version__ = "YYYY.BUILD[-TAG]"'
2020-10-02 20:52:54 +00:00
pattern = v2patterns.compile_pattern(version_pattern, raw_pattern)
2020-10-18 20:47:35 +00:00
file_patterns = {"src/bumpver/__init__.py": [pattern]}
2020-10-02 20:52:54 +00:00
2020-10-18 20:47:35 +00:00
old_vinfo = v2version.parse_version_info("2018.0123", version_pattern)
new_vinfo = v2version.parse_version_info("2019.1124", version_pattern)
2020-10-02 20:52:54 +00:00
diff_str = v2rewrite.diff(old_vinfo, new_vinfo, file_patterns)
lines = diff_str.split("\n")
2020-10-18 20:47:35 +00:00
assert lines[:2] == [
"--- src/bumpver/__init__.py",
"+++ src/bumpver/__init__.py",
]
2020-10-02 20:52:54 +00:00
2020-10-18 20:47:35 +00:00
assert lines[6].startswith('-__version__ = "20')
assert lines[7].startswith('+__version__ = "20')
2020-10-02 20:52:54 +00:00
2020-10-18 20:47:35 +00:00
assert not lines[6].startswith('-__version__ = "2018.0123"')
2020-10-02 20:52:54 +00:00
2020-10-18 20:47:35 +00:00
assert lines[7] == '+__version__ = "2019.1124"'
2020-10-02 20:52:54 +00:00
raw_pattern = "Copyright (c) 2018-YYYY"
pattern = v2patterns.compile_pattern(version_pattern, raw_pattern)
file_patterns = {'LICENSE': [pattern]}
diff_str = v2rewrite.diff(old_vinfo, new_vinfo, file_patterns)
lines = diff_str.split("\n")
assert lines[3].startswith("-MIT License Copyright (c) 2018-20")
assert lines[4].startswith("+MIT License Copyright (c) 2018-2019")