bumpver/src/pycalver/version.py

73 lines
1.9 KiB
Python
Raw Normal View History

2018-09-02 21:48:12 +02:00
# This file is part of the pycalver project
# https://github.com/mbarkhau/pycalver
#
2018-11-06 21:45:33 +01:00
# Copyright (c) 2018 Manuel Barkhau (@mbarkhau) - MIT License
2018-09-02 21:48:12 +02:00
# SPDX-License-Identifier: MIT
2018-11-06 21:45:33 +01:00
"""Functions related to version string manipulation."""
2018-09-02 21:48:12 +02:00
import logging
import pkg_resources
2018-09-04 09:56:53 +02:00
import typing as typ
2018-09-02 21:48:12 +02:00
import datetime as dt
from . import lex_id
2018-09-02 23:36:57 +02:00
from . import parse
2018-09-02 21:48:12 +02:00
log = logging.getLogger("pycalver.version")
def current_calver() -> str:
2018-11-06 21:45:33 +01:00
"""Generate calver version string based on current date.
example result: "v201812"
"""
2018-09-03 22:23:51 +02:00
return dt.date.today().strftime("v%Y%m")
2018-09-02 21:48:12 +02:00
2018-11-06 21:45:33 +01:00
def incr(old_version: str, *, release: str = None) -> str:
"""Increment a full PyCalVer version string.
Old_version is assumed to be a valid calver string,
already validated in pycalver.config.parse.
"""
old_ver = parse.parse_version_info(old_version)
2018-09-02 21:48:12 +02:00
new_calver = current_calver()
2018-09-03 22:23:51 +02:00
if old_ver.calver > new_calver:
log.warning(
2018-11-06 21:45:33 +01:00
f"'version.incr' called with '{old_version}', "
2018-11-04 21:11:42 +01:00
+ f"which is from the future, "
+ f"maybe your system clock is out of sync."
2018-09-03 22:23:51 +02:00
)
# leave calver as is (don't go back in time)
new_calver = old_ver.calver
2018-09-02 23:36:57 +02:00
new_build = lex_id.next_id(old_ver.build[1:])
2018-09-04 09:56:53 +02:00
new_release: typ.Optional[str] = None
2018-09-02 21:48:12 +02:00
if release is None:
2018-09-02 23:36:57 +02:00
if old_ver.release:
# preserve existing release
new_release = old_ver.release[1:]
else:
new_release = None
2018-11-04 21:11:42 +01:00
elif release == 'final':
2018-09-03 22:23:51 +02:00
new_release = None
2018-09-02 21:48:12 +02:00
else:
new_release = release
new_version = new_calver + "." + new_build
if new_release:
new_version += "-" + new_release
return new_version
def pycalver_to_pep440(version: str) -> str:
"""Derive pep440 compliant version string from PyCalVer version string.
>>> pycalver_to_pep440("v201811.0007-beta")
'201811.7b0'
"""
return str(pkg_resources.parse_version(version))