Source code for warg.packages.versioning

#!/usr/bin/env python3

__all__ = ["get_version"]

from pathlib import Path

import datetime
import logging

_logger = logging.getLogger(__name__)


class NotGitException(Exception):
    pass


[docs] def get_version(version: str, append_time: bool = False, verbose: bool = False, context: Path = None) -> str: """ :param context: :param verbose: :param version: :param append_time: :return: """ if not version: version = "0.0.0" try: import subprocess if context is None: import inspect import os caller_parent = Path(os.path.abspath((inspect.stack()[1])[1])).resolve().parent else: context = Path(context) if context.is_file(): caller_parent = context.parent else: caller_parent = context if (caller_parent / ".git").exists() and (caller_parent / ".git").is_dir(): git_version = ( subprocess.check_output( [ "git", "describe", "--always", # "--dirty", "origin/HEAD", ], cwd=caller_parent, ) .strip() .decode() ) current_git_version = ( subprocess.check_output( [ "git", "describe", "--always", "--dirty", ], cwd=caller_parent, ) .strip() .decode() ) if "dirty" in current_git_version: _logger.warning(f"{caller_parent} git is dirty, {current_git_version}") if git_version.split("-")[0] != version: msg = f"{caller_parent} git version {git_version} does not match __version__" f" {version}" _logger.warning(msg) assert git_version.split("-")[0] == version, msg else: if verbose: msg = f"{caller_parent} git version {git_version} matches __version__" f" {version}" _logger.info(msg) else: raise NotGitException except: if append_time: try: now = datetime.datetime.now(datetime.UTC) except: now = datetime.datetime.utcnow() date_version = now.strftime("%Y%m%d%H%M%S") # date_version = time.time() if version: # Most git tags are prefixed with 'v' (example: v1.2.3) this is # never desirable for artefact repositories, so we strip the # leading 'v' if it's present. version = version[1:] if isinstance(version, str) and version.startswith("v") else version else: # The Default version is an ISO8601 compliant datetime. PyPI doesn't allow # the colon ':' character in its versions, and time is required to allow # for multiple publications to master in one day. This datetime string # uses the 'basic' ISO8601 format for both its date and time components # to avoid issues with the colon character (ISO requires that date and # time components of a date-time string must be uniformly basic or # extended, which is why the date component does not have dashes.) # # Publications using datetime versions should only be made from master # to represent the HEAD moving forward. _logger.warning( f"Environment variable VERSION is not set, only using datetime: {date_version}" ) # warn(f'Environment variable VERSION is not set, only using timestamp: {version}') version = f"{version}.{date_version}" return version
if __name__ == "__main__": from warg import __version__ _logger.info(__version__) _logger.info(get_version("1.2.7", verbose=True))