def _get_version(config: Mapping) -> Tuple[Version, str]: vcs = Vcs(config["vcs"]) style = config["style"] if style is not None: style = Style(style) version = Version.from_vcs(vcs, config["pattern"], config["latest-tag"], config["subversion"]["tag-dir"]) if config["format-jinja"]: base = version.base revision = version.revision if config["bump"]: if version.stage is None: base = bump_version(version.base) else: if version.revision is None: revision = 2 else: revision = version.revision + 1 default_context = { "base": base, "version": version, "stage": version.stage, "revision": revision, "distance": version.distance, "commit": version.commit, "dirty": version.dirty, "env": os.environ, "bump_version": bump_version, "tagged_metadata": version.tagged_metadata, "serialize_pep440": serialize_pep440, "serialize_pvp": serialize_pvp, "serialize_semver": serialize_semver, } custom_context = {} # type: dict for entry in config["format-jinja-imports"]: if "module" in entry: module = import_module(entry["module"]) if "item" in entry: custom_context[entry["item"]] = getattr( module, entry["item"]) else: custom_context[entry["module"]] = module serialized = jinja2.Template( config["format-jinja"]).render(**default_context, **custom_context) if style is not None: check_version(serialized, style) else: serialized = version.serialize( metadata=config["metadata"], dirty=config["dirty"], format=config["format"], style=style, bump=config["bump"], tagged_metadata=config["tagged-metadata"], ) return (version, serialized)
def _bump_version_per_config(version: Version, bump: bool) -> Version: if not bump or version.distance == 0: return version version = copy.deepcopy(version) if version.stage is None: version.base = bump_version(version.base) else: if version.revision is None: version.revision = 2 else: version.revision += 1 return version
from dunamai import Version, bump_version, serialize_pep440 if "CI_MERGE_REQUEST_IID" in os.environ: mr_version: Optional[str] = os.environ["CI_MERGE_REQUEST_IID"] else: mr_version = None build_official = "BUILD_OFFICIAL" in os.environ v = Version.from_git(pattern=r"^(?P<base>\d+\.\d+\.\d+)$") if v.distance == 0: out = serialize_pep440(v.base, v.stage, v.revision) else: if build_official: out = serialize_pep440(bump_version(v.base), None, None, dev=v.distance) elif mr_version is not None: out = serialize_pep440(bump_version(v.base), None, None, dev=v.distance, metadata=[f"mr{mr_version}"]) else: out = serialize_pep440(bump_version(v.base), None, None, dev=v.distance, metadata=[f"g{v.commit}"])
def test__bump_version(): assert bump_version("1.2.3") == "1.2.4" assert bump_version("1.2.3", 0) == "2.0.0" assert bump_version("1.2.3", 1) == "1.3.0" assert bump_version("1.2.3", 2) == "1.2.4" assert bump_version("1.2.3", -1) == "1.2.4" assert bump_version("1.2.3", -2) == "1.3.0" assert bump_version("1.2.3", -3) == "2.0.0" with pytest.raises(IndexError): bump_version("1.2.3", 3) with pytest.raises(IndexError): bump_version("1.2.3", -4) with pytest.raises(ValueError): bump_version("foo", 0)