diff --git a/version.py b/version.py index 617da3f..029c90f 100644 --- a/version.py +++ b/version.py @@ -6,11 +6,12 @@ """ import re import sys -import importlib -from datetime import UTC, datetime +from datetime import datetime, timezone from pathlib import Path PACKAGE_NAME = "jsonobject" +PACKAGE_PATH = Path(__file__).parent / PACKAGE_NAME / "__init__.py" +V_EXPR = re.compile(r"""(?<=^__version__ = )['"](.+)['"]$""", flags=re.M) def main(argv=sys.argv): @@ -24,12 +25,12 @@ def main(argv=sys.argv): def check(ref): - pkg = importlib.import_module(PACKAGE_NAME) if not ref.startswith("refs/tags/v"): sys.exit(f"unexpected ref: {ref}") - version = ref.removeprefix("refs/tags/v") - if version != pkg.__version__: - sys.exit(f"version mismatch: {version} != {pkg.__version__}") + tag_version = ref.removeprefix("refs/tags/v") + pkg_version = parse_version(get_module_text()) + if tag_version != pkg_version: + sys.exit(f"version mismatch: {tag_version} != {pkg_version}") def update(sha=""): @@ -40,21 +41,26 @@ def update(sha=""): updating the version for a PyPI release. PyPI error: The use of local versions ... is not allowed """ - path = Path(__file__).parent / PACKAGE_NAME / "__init__.py" - vexpr = re.compile(r"""(?<=^__version__ = )['"](.+)['"]$""", flags=re.M) - with open(path, "r+") as file: - text = file.read() - match = vexpr.search(text) - if not match: - sys.exit(f"{PACKAGE_NAME}.__version__ not found") - devv = datetime.now(UTC).strftime("%Y%m%d%H%M%S") - if sha: - devv += f"+{sha[:7]}" - version = f"{match.group(1)}.dev{devv}" - print("new version:", version) - file.seek(0) - file.write(vexpr.sub(repr(version), text)) - file.truncate() + devv = datetime.now(timezone.utc).strftime("%Y%m%d%H%M%S") + if sha: + devv += f"+{sha[:7]}" + module_text = get_module_text() + version = f"{parse_version(module_text)}.dev{devv}" + print("new version:", version) + with open(PACKAGE_PATH, "w") as file: + file.write(V_EXPR.sub(repr(version), module_text)) + + +def get_module_text(): + with open(PACKAGE_PATH, "r") as file: + return file.read() + + +def parse_version(module_text): + match = V_EXPR.search(module_text) + if not match: + sys.exit(f"{PACKAGE_NAME}.__version__ not found") + return match.group(1) COMMANDS = {"check": check, "update": update}