Example #1
0
def test__version__serialize__pvp_with_metadata() -> None:
    style = Style.Pvp
    assert Version("0.1.0").serialize(style=style) == "0.1.0"
    assert Version("0.1.0").serialize(metadata=True, style=style) == "0.1.0"
    assert Version("0.1.0").serialize(metadata=False, style=style) == "0.1.0"

    assert Version("0.1.0", stage=("a", 1),
                   commit="abc").serialize(style=style) == "0.1.0-a-1"
    assert (Version("0.1.0", stage=("a", 1),
                    commit="abc").serialize(metadata=True,
                                            style=style) == "0.1.0-a-1-abc")
    assert (Version("0.1.0", stage=("a", 1),
                    commit="abc").serialize(metadata=False,
                                            style=style) == "0.1.0-a-1")

    assert Version("0.1.0", distance=1,
                   commit="abc").serialize(style=style) == "0.1.0-post-1-abc"
    assert (Version("0.1.0", distance=1,
                    commit="abc").serialize(metadata=True,
                                            style=style) == "0.1.0-post-1-abc")
    assert (Version("0.1.0", distance=1,
                    commit="abc").serialize(metadata=False,
                                            style=style) == "0.1.0-post-1")

    assert (Version("0.1.0", distance=1, commit="abc",
                    tagged_metadata="def").serialize(
                        style=style,
                        tagged_metadata=True) == "0.1.0-post-1-def-abc")
Example #2
0
def test__version__serialize__semver_with_metadata() -> None:
    style = Style.SemVer
    assert Version("0.1.0").serialize(style=style) == "0.1.0"
    assert Version("0.1.0").serialize(metadata=True, style=style) == "0.1.0"
    assert Version("0.1.0").serialize(metadata=False, style=style) == "0.1.0"

    assert Version("0.1.0", stage=("a", 1),
                   commit="abc").serialize(style=style) == "0.1.0-a.1"
    assert (Version("0.1.0", stage=("a", 1),
                    commit="abc").serialize(metadata=True,
                                            style=style) == "0.1.0-a.1+abc")
    assert (Version("0.1.0", stage=("a", 1),
                    commit="abc").serialize(metadata=False,
                                            style=style) == "0.1.0-a.1")

    assert Version("0.1.0", distance=1,
                   commit="abc").serialize(style=style) == "0.1.0-post.1+abc"
    assert (Version("0.1.0", distance=1,
                    commit="abc").serialize(metadata=True,
                                            style=style) == "0.1.0-post.1+abc")
    assert (Version("0.1.0", distance=1,
                    commit="abc").serialize(metadata=False,
                                            style=style) == "0.1.0-post.1")

    assert (Version("0.1.0", distance=1, commit="abc",
                    tagged_metadata="def").serialize(
                        style=style,
                        tagged_metadata=True) == "0.1.0-post.1+def.abc")
Example #3
0
def test__version__from_git__with_mixed_tags(tmp_path) -> None:
    vcs = tmp_path / "dunamai-git-mixed"
    vcs.mkdir()
    run = make_run_callback(vcs)
    from_vcs = make_from_callback(Version.from_git)

    with chdir(vcs):
        run("git init")
        (vcs / "foo.txt").write_text("hi")
        run("git add .")
        run('git commit -m "Initial commit"')

        run("git tag v0.1.0")
        (vcs / "foo.txt").write_text("hi 2")
        run("git add .")
        avoid_identical_ref_timestamps()
        run('git commit -m "Second"')

        run('git tag v0.2.0 -m "Annotated"')
        assert from_vcs() == Version("0.2.0", commit="abc", dirty=False)
        assert from_vcs(latest_tag=True) == Version("0.2.0",
                                                    commit="abc",
                                                    dirty=False)

        (vcs / "foo.txt").write_text("hi 3")
        run("git add .")
        avoid_identical_ref_timestamps()
        run('git commit -m "Third"')

        run("git tag v0.3.0")
        assert from_vcs() == Version("0.3.0", commit="abc", dirty=False)
        assert from_vcs(latest_tag=True) == Version("0.3.0",
                                                    commit="abc",
                                                    dirty=False)
Example #4
0
def test__version__serialize__format() -> None:
    format = "{base},{stage},{revision},{distance},{commit},{dirty}"
    assert Version("0.1.0").serialize(format=format) == "0.1.0,,,0,,clean"
    assert (Version(
        "1", stage=("a", 2), distance=3, commit="abc",
        dirty=True).serialize(format=format) == "1,a,2,3,abc,dirty")
    with pytest.raises(ValueError):
        Version("0.1.0").serialize(format="v{base}", style=Style.Pep440)
Example #5
0
def test__version__from_git__with_lightweight_tags(tmp_path) -> None:
    vcs = tmp_path / "dunamai-git-lightweight"
    vcs.mkdir()
    run = make_run_callback(vcs)
    from_vcs = make_from_callback(Version.from_git)

    with chdir(vcs):
        run("git init")
        (vcs / "foo.txt").write_text("hi")
        run("git add .")
        run('git commit -m "Initial commit"')

        run("git tag v0.1.0")
        assert from_vcs() == Version("0.1.0", commit="abc", dirty=False)
        assert from_vcs(latest_tag=True) == Version("0.1.0",
                                                    commit="abc",
                                                    dirty=False)
        assert run("dunamai from git") == "0.1.0"
        assert run("dunamai from any") == "0.1.0"

        (vcs / "foo.txt").write_text("bye")
        run("git add .")
        avoid_identical_ref_timestamps()
        run('git commit -m "Second"')
        assert from_vcs() == Version("0.1.0",
                                     distance=1,
                                     commit="abc",
                                     dirty=False)
        assert from_any_vcs() == Version("0.1.0",
                                         distance=1,
                                         commit="abc",
                                         dirty=False)

        (vcs / "foo.txt").write_text("again")
        run("git add .")
        avoid_identical_ref_timestamps()
        run('git commit -m "Third"')
        assert from_vcs() == Version("0.1.0",
                                     distance=2,
                                     commit="abc",
                                     dirty=False)
        assert from_any_vcs() == Version("0.1.0",
                                         distance=2,
                                         commit="abc",
                                         dirty=False)

        run("git tag v0.2.0")
        run("git tag v0.1.1 HEAD~1")
        assert from_vcs() == Version("0.2.0", commit="abc", dirty=False)
        assert from_vcs(latest_tag=True) == Version("0.2.0",
                                                    commit="abc",
                                                    dirty=False)

        run("git checkout v0.1.1")
        assert from_vcs() == Version("0.1.1", commit="abc", dirty=False)
        assert from_vcs(latest_tag=True) == Version("0.1.1",
                                                    commit="abc",
                                                    dirty=False)
Example #6
0
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
Example #7
0
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)
Example #8
0
def from_vcs(
    vcs: Vcs,
    pattern: str,
    metadata: Optional[bool],
    dirty: bool,
    format: Optional[str],
    style: Optional[Style],
    latest_tag: bool,
    tag_dir: str,
    debug: bool,
    bump: bool,
    tagged_metadata: bool,
) -> None:
    version = Version.from_vcs(vcs, pattern, latest_tag, tag_dir)
    print(
        version.serialize(metadata,
                          dirty,
                          format,
                          style,
                          bump,
                          tagged_metadata=tagged_metadata))
    if debug:
        print("# Matched tag: {}".format(version._matched_tag),
              file=sys.stderr)
        print("# Newer unmatched tags: {}".format(
            version._newer_unmatched_tags),
              file=sys.stderr)
Example #9
0
def version() -> None:
    """Shows the version of the project."""
    try:
        v = Version.from_git().serialize(style=Style.SemVer)
    except RuntimeError:
        v = __version__
    print("pynfogen", v)
Example #10
0
def test__version__from_git__with_nonchronological_commits(tmp_path) -> None:
    vcs = tmp_path / "dunamai-git-nonchronological"
    vcs.mkdir()
    run = make_run_callback(vcs)
    from_vcs = make_from_callback(Version.from_git)

    with chdir(vcs):
        run("git init")
        (vcs / "foo.txt").write_text("hi")
        run("git add .")
        run(
            'git commit -m "Initial commit"',
            env={
                "GIT_COMMITTER_DATE": "2000-01-02T01:00:00",
                "GIT_AUTHOR_DATE": "2000-01-02T01:00:00",
                **os.environ,
            },
        )

        run("git tag v0.1.0")
        (vcs / "foo.txt").write_text("hi 2")
        run("git add .")
        avoid_identical_ref_timestamps()
        run(
            'git commit -m "Second"',
            env={
                "GIT_COMMITTER_DATE": "2000-01-01T01:00:00",
                "GIT_AUTHOR_DATE": "2000-01-01T01:00:00",
                **os.environ,
            },
        )

        run("git tag v0.2.0")
        assert from_vcs() == Version("0.2.0", commit="abc", dirty=False)
Example #11
0
def test__version__init() -> None:
    v = Version("1", stage=("a", 2), distance=3, commit="abc", dirty=True)
    assert v.base == "1"
    assert v.stage == "a"
    assert v.revision == 2
    assert v.distance == 3
    assert v.commit == "abc"
    assert v.dirty
Example #12
0
def test__version__repr() -> None:
    v = Version("1",
                stage=("a", 2),
                distance=3,
                commit="abc",
                dirty=True,
                tagged_metadata="tagged")
    assert repr(v) == ("Version(base='1', stage='a', revision=2, distance=3,"
                       " commit='abc', dirty=True, tagged_metadata='tagged')")
Example #13
0
def from_vcs(
    vcs: Vcs,
    pattern: str,
    metadata: Optional[bool],
    dirty: bool,
    format: Optional[str],
    style: Optional[Style],
    latest_tag: bool,
    tag_dir: str,
) -> None:
    version = Version.from_vcs(vcs, pattern, latest_tag, tag_dir)
    print(version.serialize(metadata, dirty, format, style))
Example #14
0
def test__version__serialize__pep440_with_dirty() -> None:
    assert Version("0.1.0", dirty=True).serialize() == "0.1.0"
    assert Version("0.1.0", dirty=True).serialize(dirty=True) == "0.1.0+dirty"

    assert Version("0.1.0", dirty=False).serialize() == "0.1.0"
    assert Version("0.1.0", dirty=False).serialize(dirty=True) == "0.1.0"

    assert Version("0.1.0", dirty=True).serialize(metadata=True) == "0.1.0"
    assert Version("0.1.0", dirty=True).serialize(metadata=True,
                                                  dirty=True) == "0.1.0+dirty"

    assert Version("0.1.0", dirty=True).serialize(metadata=False) == "0.1.0"
    assert Version("0.1.0", dirty=True).serialize(metadata=False,
                                                  dirty=True) == "0.1.0"
Example #15
0
def test__version__serialize__pep440_metadata() -> None:
    assert Version("0.1.0").serialize() == "0.1.0"
    assert Version("0.1.0").serialize(metadata=True) == "0.1.0"
    assert Version("0.1.0").serialize(metadata=False) == "0.1.0"

    assert Version("0.1.0", stage=("a", 1),
                   commit="abc").serialize() == "0.1.0a1"
    assert Version("0.1.0", stage=("a", 1),
                   commit="abc").serialize(metadata=True) == "0.1.0a1+abc"
    assert Version("0.1.0", stage=("a", 1),
                   commit="abc").serialize(metadata=False) == "0.1.0a1"

    assert Version("0.1.0", distance=1,
                   commit="abc").serialize() == "0.1.0.post1.dev0+abc"
    assert (Version(
        "0.1.0", distance=1,
        commit="abc").serialize(metadata=True) == "0.1.0.post1.dev0+abc")
    assert (Version(
        "0.1.0", distance=1,
        commit="abc").serialize(metadata=False) == "0.1.0.post1.dev0")
Example #16
0
def test__check_version__semver() -> None:
    style = Style.SemVer

    check_version("0.1.0", style=style)
    check_version("0.1.0-alpha.1", style=style)
    check_version("0.1.0+abc", style=style)
    check_version("0.1.0+a.b.c", style=style)
    check_version("0.1.0-alpha.1.beta.2+abc.dirty", style=style)

    with pytest.raises(ValueError):
        check_version("1", style=style)
    with pytest.raises(ValueError):
        check_version("0.1", style=style)
    with pytest.raises(ValueError):
        check_version("0.0.0.1", style=style)

    # "-" is a valid identifier.
    Version("0.1.0--").serialize(style=style)
    Version("0.1.0--.-").serialize(style=style)

    # No leading zeroes in numeric segments:
    with pytest.raises(ValueError):
        Version("00.0.0").serialize(style=style)
    with pytest.raises(ValueError):
        Version("0.01.0").serialize(style=style)
    with pytest.raises(ValueError):
        Version("0.1.0-alpha.02").serialize(style=style)
    # But leading zeroes are fine for non-numeric parts:
    Version("0.1.0-alpha.02a").serialize(style=style)

    # Identifiers can't be empty:
    with pytest.raises(ValueError):
        Version("0.1.0-.").serialize(style=style)
    with pytest.raises(ValueError):
        Version("0.1.0-a.").serialize(style=style)
    with pytest.raises(ValueError):
        Version("0.1.0-.a").serialize(style=style)
Example #17
0
def test__version__serialize__pvp_with_dirty() -> None:
    style = Style.Pvp
    assert Version("0.1.0", dirty=True).serialize(style=style) == "0.1.0"
    assert Version("0.1.0", dirty=True).serialize(dirty=True,
                                                  style=style) == "0.1.0-dirty"

    assert Version("0.1.0", dirty=False).serialize(style=style) == "0.1.0"
    assert Version("0.1.0", dirty=False).serialize(dirty=True,
                                                   style=style) == "0.1.0"

    assert Version("0.1.0", dirty=True).serialize(metadata=True,
                                                  style=style) == "0.1.0"
    assert (Version("0.1.0",
                    dirty=True).serialize(metadata=True,
                                          dirty=True,
                                          style=style) == "0.1.0-dirty")

    assert Version("0.1.0", dirty=True).serialize(metadata=False,
                                                  style=style) == "0.1.0"
    assert (Version("0.1.0", dirty=True).serialize(metadata=False,
                                                   dirty=True,
                                                   style=style) == "0.1.0")
Example #18
0
def _get_version(config: Mapping, pyproject_path: Path) -> Tuple[Version, str]:
    if _state.version:
        return _state.version

    pyproject = tomlkit.parse(pyproject_path.read_text(encoding='utf8'))
    if not _state.original_version:
        _state.original_version = pyproject["tool"]["poetry"]["version"]

    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"]:
        serialized = jinja2.Template(config["format-jinja"]).render(
            base=version.base,
            stage=version.stage,
            revision=version.revision,
            distance=version.distance,
            commit=version.commit,
            dirty=version.dirty,
            env=os.environ,
            bump_version=bump_version,
            serialize_pep440=serialize_pep440,
            serialize_pvp=serialize_pvp,
            serialize_semver=serialize_semver,
        )
        if style is not None:
            check_version(serialized, style)
    else:
        serialized = version.serialize(config["metadata"], config["dirty"],
                                       config["format"], style)

    pyproject["tool"]["poetry"]["version"] = serialized
    pyproject_path.write_text(tomlkit.dumps(pyproject))
    _state.version = (version, serialized)
    return (version, serialized)
Example #19
0
def _get_version(config: Mapping, pyproject_path: Path) -> Tuple[Version, str]:
    if _state.version:
        return _state.version

    pyproject = tomlkit.parse(pyproject_path.read_text())
    if not _state.original_version:
        _state.original_version = pyproject["tool"]["poetry"]["version"]

    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"])
    serialized = version.serialize(config["metadata"], config["dirty"],
                                   config["format"], style)

    pyproject["tool"]["poetry"]["version"] = serialized
    pyproject_path.write_text(tomlkit.dumps(pyproject))
    _state.version = (version, serialized)
    return (version, serialized)
Example #20
0
def test_git(temp_tree: TempTreeCB, has_src, with_v, version):
    src_path = Path("git_mod.py")
    content: Desc = {src_path: "print('hello')\n"}
    if has_src:
        src_path = Path("src") / src_path
        content = dict(src=content)
    with temp_tree(content) as package:
        with get_version.working_dir(package):

            def add_and_commit(msg: str):
                run(f"git add {src_path}".split(), check=True)
                run([*"git commit -m".split(), msg], check=True)

            run("git init".split(), check=True)
            add_and_commit("initial")
            run(f"git tag {'v' if with_v else ''}{version}".split(),
                check=True)
            src_path.write_text("print('modified')")
            add_and_commit("modified")
            hash = run(
                "git rev-parse --short HEAD".split(),
                capture_output=True,
                encoding="ascii",
            ).stdout.strip()
            src_path.write_text("print('dirty')")

        v = get_version.dunamai_get_from_vcs(package)
        assert (Version(
            version.base,
            stage=(version.stage, version.revision),
            distance=1,
            commit=hash,
            dirty=True,
        ) == v)

        parent = (package / "src") if has_src else package
        v_str = get_version.get_version(parent / "git_mod.py")
        assert f"{version}.post1.dev0+{hash}.dirty" == v_str
Example #21
0
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
#
# import os
# import sys
# sys.path.insert(0, os.path.abspath('.'))

# -- Project information -----------------------------------------------------

project = 'pydvdcss'
copyright = '2021, PHOENiX'
author = 'PHOENiX'

# The full version, including alpha/beta/rc tags
version = Version.from_git().base
release = version

# -- General configuration ---------------------------------------------------

# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
extensions = ['sphinx.ext.autosectionlabel', 'sphinx.ext.autodoc']

# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']

# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
# This pattern also affects html_static_path and html_extra_path.
Example #22
0
def test__version__from_fossil(tmp_path) -> None:
    vcs = tmp_path / "dunamai-fossil"
    vcs.mkdir()
    run = make_run_callback(vcs)
    from_vcs = make_from_callback(Version.from_fossil)

    with chdir(vcs):
        run("fossil init repo")
        run("fossil open repo")
        assert from_vcs() == Version("0.0.0",
                                     distance=0,
                                     commit="abc",
                                     dirty=False)

        (vcs / "foo.txt").write_text("hi")
        assert from_vcs() == Version("0.0.0",
                                     distance=0,
                                     commit="abc",
                                     dirty=True)

        run("fossil add .")
        run('fossil commit -m "Initial commit"')
        assert from_vcs() == Version("0.0.0",
                                     distance=1,
                                     commit="abc",
                                     dirty=False)

        run("fossil tag add v0.1.0 trunk")
        assert from_vcs() == Version("0.1.0", commit="abc", dirty=False)
        assert from_vcs(latest_tag=True) == Version("0.1.0",
                                                    commit="abc",
                                                    dirty=False)
        assert run("dunamai from fossil") == "0.1.0"
        assert run("dunamai from any") == "0.1.0"

        (vcs / "foo.txt").write_text("bye")
        assert from_vcs() == Version("0.1.0", commit="abc", dirty=True)

        run("fossil add .")
        run('fossil commit -m "Second"')
        assert from_vcs() == Version("0.1.0",
                                     distance=1,
                                     commit="abc",
                                     dirty=False)
        assert from_any_vcs() == Version("0.1.0",
                                         distance=1,
                                         commit="abc",
                                         dirty=False)

        run("fossil tag add unmatched trunk")
        assert from_vcs() == Version("0.1.0",
                                     distance=1,
                                     commit="abc",
                                     dirty=False)
        with pytest.raises(ValueError):
            from_vcs(latest_tag=True)

        (vcs / "foo.txt").write_text("third")
        run("fossil add .")
        run("fossil commit --tag v0.2.0 -m 'Third'")
        assert from_vcs() == Version("0.2.0", commit="abc", dirty=False)
        assert from_vcs(latest_tag=True) == Version("0.2.0",
                                                    commit="abc",
                                                    dirty=False)

        run("fossil tag add v0.1.1 v0.1.0")
        assert from_vcs() == Version("0.2.0", commit="abc", dirty=False)
        assert from_vcs(latest_tag=True) == Version("0.2.0",
                                                    commit="abc",
                                                    dirty=False)

        run("fossil checkout v0.1.0")
        assert from_vcs() == Version("0.1.1", commit="abc", dirty=False)
        assert from_vcs(latest_tag=True) == Version("0.1.1",
                                                    commit="abc",
                                                    dirty=False)
Example #23
0
import os
from typing import Optional

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,
Example #24
0
def test__version__from_git__with_annotated_tags(tmp_path) -> None:
    vcs = tmp_path / "dunamai-git-annotated"
    vcs.mkdir()
    run = make_run_callback(vcs)
    from_vcs = make_from_callback(Version.from_git)

    with chdir(vcs):
        run("git init")
        assert from_vcs() == Version("0.0.0",
                                     distance=0,
                                     commit=None,
                                     dirty=True)

        (vcs / "foo.txt").write_text("hi")
        assert from_vcs() == Version("0.0.0",
                                     distance=0,
                                     commit=None,
                                     dirty=True)

        run("git add .")
        run('git commit -m "Initial commit"')
        assert from_vcs() == Version("0.0.0",
                                     distance=1,
                                     commit="abc",
                                     dirty=False)

        # Detect dirty if untracked files
        (vcs / "bar.txt").write_text("bye")
        assert from_vcs() == Version("0.0.0",
                                     distance=1,
                                     commit="abc",
                                     dirty=True)

        # Once the untracked file is removed we are no longer dirty
        (vcs / "bar.txt").unlink()
        assert from_vcs() == Version("0.0.0",
                                     distance=1,
                                     commit="abc",
                                     dirty=False)

        # Additional one-off check not in other VCS integration tests:
        # when the only tag in the repository does not match the pattern.
        run("git tag other -m Annotated")
        with pytest.raises(ValueError):
            from_vcs()

        avoid_identical_ref_timestamps()
        run("git tag v0.1.0 -m Annotated")
        assert from_vcs() == Version("0.1.0", commit="abc", dirty=False)
        assert from_vcs(latest_tag=True) == Version("0.1.0",
                                                    commit="abc",
                                                    dirty=False)
        assert run("dunamai from git") == "0.1.0"
        assert run("dunamai from any") == "0.1.0"

        # Additional one-off checks not in other VCS integration tests:
        assert run(
            r'dunamai from any --pattern "(?P<base>\d\.\d\.\d)"') == "0.1.0"
        run(r'dunamai from any --pattern "(\d\.\d\.\d)"', 1)
        assert run('dunamai from any --format "v{base}"') == "v0.1.0"
        assert run('dunamai from any --style "semver"') == "0.1.0"
        assert (
            run('dunamai from any --format "v{base}" --style "semver"', 1) ==
            "Version 'v0.1.0' does not conform to the Semantic Versioning style"
        )
        assert run("dunamai from any --latest-tag") == "0.1.0"
        assert from_explicit_vcs(Vcs.Any) == Version("0.1.0",
                                                     commit="abc",
                                                     dirty=False)
        assert from_explicit_vcs(Vcs.Git) == Version("0.1.0",
                                                     commit="abc",
                                                     dirty=False)
        assert run("dunamai from any --bump") == "0.1.1"

        (vcs / "foo.txt").write_text("bye")
        assert from_vcs() == Version("0.1.0", commit="abc", dirty=True)

        run("git add .")
        run('git commit -m "Second"')
        assert from_vcs() == Version("0.1.0",
                                     distance=1,
                                     commit="abc",
                                     dirty=False)
        assert from_any_vcs() == Version("0.1.0",
                                         distance=1,
                                         commit="abc",
                                         dirty=False)

        run("git tag unmatched -m Annotated")
        assert from_vcs() == Version("0.1.0",
                                     distance=1,
                                     commit="abc",
                                     dirty=False)
        with pytest.raises(ValueError):
            from_vcs(latest_tag=True)

        avoid_identical_ref_timestamps()
        run("git tag v0.2.0 -m Annotated")
        avoid_identical_ref_timestamps()
        run("git tag v0.1.1 HEAD~1 -m Annotated")
        assert from_vcs() == Version("0.2.0", commit="abc", dirty=False)
        assert from_vcs(latest_tag=True) == Version("0.2.0",
                                                    commit="abc",
                                                    dirty=False)

        # Check handling with identical tag and branch names:
        run("git checkout -b v0.2.0")
        assert from_vcs() == Version("0.2.0", commit="abc", dirty=False)
        assert from_vcs(latest_tag=True) == Version("0.2.0",
                                                    commit="abc",
                                                    dirty=False)

        run("git checkout v0.1.0")
        assert from_vcs() == Version("0.1.1", commit="abc", dirty=False)
        assert from_vcs(latest_tag=True) == Version("0.1.1",
                                                    commit="abc",
                                                    dirty=False)

        # Additional one-off check not in other VCS integration tests:
        # tag with pre-release segment.
        run("git checkout master")
        (vcs / "foo.txt").write_text("third")
        run("git add .")
        run('git commit -m "Third"')
        run("git tag v0.2.1b3 -m Annotated")
        assert from_vcs() == Version("0.2.1",
                                     stage=("b", 3),
                                     commit="abc",
                                     dirty=False)
Example #25
0
def test__version__from_bazaar(tmp_path) -> None:
    vcs = tmp_path / "dunamai-bzr"
    vcs.mkdir()
    run = make_run_callback(vcs)
    from_vcs = make_from_callback(Version.from_bazaar, mock_commit=None)

    with chdir(vcs):
        run("bzr init")
        assert from_vcs() == Version("0.0.0",
                                     distance=0,
                                     commit=None,
                                     dirty=False)

        (vcs / "foo.txt").write_text("hi")
        assert from_vcs() == Version("0.0.0",
                                     distance=0,
                                     commit=None,
                                     dirty=True)

        run("bzr add .")
        run('bzr commit -m "Initial commit"')
        assert from_vcs() == Version("0.0.0",
                                     distance=1,
                                     commit="1",
                                     dirty=False)

        run("bzr tag v0.1.0")
        assert from_vcs() == Version("0.1.0", commit="1", dirty=False)
        assert from_vcs(latest_tag=True) == Version("0.1.0",
                                                    commit="1",
                                                    dirty=False)
        assert run("dunamai from bazaar") == "0.1.0"
        assert run("dunamai from any") == "0.1.0"

        (vcs / "foo.txt").write_text("bye")
        assert from_vcs() == Version("0.1.0", commit="1", dirty=True)

        run("bzr add .")
        run('bzr commit -m "Second"')
        assert from_vcs() == Version("0.1.0",
                                     distance=1,
                                     commit="2",
                                     dirty=False)
        assert from_any_vcs_unmocked() == Version("0.1.0",
                                                  distance=1,
                                                  commit="2",
                                                  dirty=False)

        run("bzr tag unmatched")
        assert from_vcs() == Version("0.1.0",
                                     distance=1,
                                     commit="2",
                                     dirty=False)
        with pytest.raises(ValueError):
            from_vcs(latest_tag=True)

        run("bzr tag v0.2.0")
        run("bzr tag v0.1.1 -r v0.1.0")
        assert from_vcs() == Version("0.2.0", commit="2", dirty=False)
        assert from_vcs(latest_tag=True) == Version("0.2.0",
                                                    commit="2",
                                                    dirty=False)

        run("bzr checkout . old -r v0.1.0")

    with chdir(vcs / "old"):
        assert from_vcs() == Version("0.1.1", commit="1", dirty=False)
        assert from_vcs(latest_tag=True) == Version("0.1.1",
                                                    commit="1",
                                                    dirty=False)
Example #26
0
def test__version__from_subversion(tmp_path) -> None:
    vcs = tmp_path / "dunamai-svn"
    vcs.mkdir()
    run = make_run_callback(vcs)
    from_vcs = make_from_callback(Version.from_subversion, mock_commit=None)

    vcs_srv = tmp_path / "dunamai-svn-srv"
    vcs_srv.mkdir()
    run_srv = make_run_callback(vcs_srv)
    vcs_srv_uri = vcs_srv.as_uri()

    with chdir(vcs_srv):
        run_srv("svnadmin create .")

    with chdir(vcs):
        run('svn checkout "{}" .'.format(vcs_srv_uri))
        assert from_vcs() == Version("0.0.0",
                                     distance=0,
                                     commit=None,
                                     dirty=False)

        run("svn mkdir trunk tags")
        (vcs / "trunk" / "foo.txt").write_text("hi")
        assert from_vcs() == Version("0.0.0",
                                     distance=0,
                                     commit=None,
                                     dirty=True)

        run("svn add --force .")
        run('svn commit -m "Initial commit"')  # commit 1
        run("svn update")
        assert from_vcs() == Version("0.0.0",
                                     distance=1,
                                     commit="1",
                                     dirty=False)

        run('svn copy {0}/trunk {0}/tags/v0.1.0 -m "Tag 1"'.format(
            vcs_srv_uri))  # commit 2
        run("svn update")
        assert from_vcs() == Version("0.1.0", commit="2", dirty=False)
        assert run("dunamai from subversion") == "0.1.0"
        assert run("dunamai from any") == "0.1.0"

        (vcs / "trunk" / "foo.txt").write_text("bye")
        assert from_vcs() == Version("0.1.0", commit="2", dirty=True)

        run('svn commit -m "Second"')  # commit 3
        run("svn update")
        assert from_vcs() == Version("0.1.0",
                                     distance=1,
                                     commit="3",
                                     dirty=False)
        assert from_any_vcs_unmocked() == Version("0.1.0",
                                                  distance=1,
                                                  commit="3",
                                                  dirty=False)

        # Ensure we get the tag based on the highest commit, not necessarily
        # just the newest tag.
        run('svn copy {0}/trunk {0}/tags/v0.2.0 -m "Tag 2"'.format(
            vcs_srv_uri))  # commit 4
        run('svn copy {0}/trunk {0}/tags/v0.1.1 -r 1 -m "Tag 3"'.format(
            vcs_srv_uri))  # commit 5
        run("svn update")
        assert from_vcs() == Version("0.2.0",
                                     distance=1,
                                     commit="5",
                                     dirty=False)
        assert from_vcs(latest_tag=True) == Version("0.2.0",
                                                    distance=1,
                                                    commit="5",
                                                    dirty=False)

        run('svn copy {0}/trunk {0}/tags/unmatched -m "Tag 4"'.format(
            vcs_srv_uri))  # commit 6
        run("svn update")
        assert from_vcs() == Version("0.2.0",
                                     distance=2,
                                     commit="6",
                                     dirty=False)
        with pytest.raises(ValueError):
            from_vcs(latest_tag=True)

        run("svn update -r 2")
        assert from_vcs() == Version("0.1.0", commit="2", dirty=False)
        assert from_vcs(latest_tag=True) == Version("0.1.0",
                                                    commit="2",
                                                    dirty=False)
Example #27
0
def test__version__from_darcs(tmp_path) -> None:
    vcs = tmp_path / "dunamai-darcs"
    vcs.mkdir()
    run = make_run_callback(vcs)
    from_vcs = make_from_callback(Version.from_darcs)

    with chdir(vcs):
        run("darcs init")
        assert from_vcs() == Version("0.0.0",
                                     distance=0,
                                     commit=None,
                                     dirty=False)

        (vcs / "foo.txt").write_text("hi")
        assert from_vcs() == Version("0.0.0",
                                     distance=0,
                                     commit=None,
                                     dirty=True)

        run("darcs add foo.txt")
        run('darcs record -am "Initial commit"')
        assert from_vcs() == Version("0.0.0",
                                     distance=1,
                                     commit="abc",
                                     dirty=False)

        run("darcs tag v0.1.0")
        assert from_vcs() == Version("0.1.0", commit="abc", dirty=False)
        assert from_vcs(latest_tag=True) == Version("0.1.0",
                                                    commit="abc",
                                                    dirty=False)
        assert run("dunamai from darcs") == "0.1.0"
        assert run("dunamai from any") == "0.1.0"

        (vcs / "foo.txt").write_text("bye")
        assert from_vcs() == Version("0.1.0", commit="abc", dirty=True)

        run('darcs record -am "Second"')
        assert from_vcs() == Version("0.1.0",
                                     distance=1,
                                     commit="abc",
                                     dirty=False)
        assert from_any_vcs() == Version("0.1.0",
                                         distance=1,
                                         commit="abc",
                                         dirty=False)

        run("darcs tag unmatched")
        assert from_vcs() == Version("0.1.0",
                                     distance=2,
                                     commit="abc",
                                     dirty=False)
        with pytest.raises(ValueError):
            from_vcs(latest_tag=True)

        run("darcs tag v0.2.0")
        assert from_vcs() == Version("0.2.0", commit="abc", dirty=False)

        run("darcs obliterate --all --last 3")
        assert from_vcs() == Version("0.1.0", commit="abc", dirty=False)
Example #28
0
def test__version__from_mercurial(tmp_path) -> None:
    vcs = tmp_path / "dunamai-hg"
    vcs.mkdir()
    run = make_run_callback(vcs)
    from_vcs = make_from_callback(Version.from_mercurial)

    with chdir(vcs):
        run("hg init")
        assert from_vcs() == Version("0.0.0",
                                     distance=0,
                                     commit=None,
                                     dirty=False)

        (vcs / "foo.txt").write_text("hi")
        assert from_vcs() == Version("0.0.0",
                                     distance=0,
                                     commit=None,
                                     dirty=True)

        run("hg add .")
        run('hg commit -m "Initial commit"')
        assert from_vcs() == Version("0.0.0",
                                     distance=1,
                                     commit="abc",
                                     dirty=False)

        run("hg tag v0.1.0")
        assert from_vcs() == Version("0.1.0", commit="abc", dirty=False)
        assert from_vcs(latest_tag=True) == Version("0.1.0",
                                                    commit="abc",
                                                    dirty=False)
        assert run("dunamai from mercurial") == "0.1.0"
        assert run("dunamai from any") == "0.1.0"

        (vcs / "foo.txt").write_text("bye")
        assert from_vcs() == Version("0.1.0", commit="abc", dirty=True)

        run("hg add .")
        run('hg commit -m "Second"')
        assert from_vcs() == Version("0.1.0",
                                     distance=1,
                                     commit="abc",
                                     dirty=False)
        assert from_any_vcs() == Version("0.1.0",
                                         distance=1,
                                         commit="abc",
                                         dirty=False)

        run("hg tag unmatched")
        assert from_vcs() == Version("0.1.0",
                                     distance=2,
                                     commit="abc",
                                     dirty=False)
        with pytest.raises(ValueError):
            from_vcs(latest_tag=True)

        run("hg tag v0.2.0")
        assert from_vcs() == Version("0.2.0", commit="abc", dirty=False)
        assert from_vcs(latest_tag=True) == Version("0.2.0",
                                                    commit="abc",
                                                    dirty=False)

        run('hg tag v0.1.1 -r "tag(v0.1.0)"')
        assert from_vcs() == Version("0.2.0",
                                     distance=1,
                                     commit="abc",
                                     dirty=False)
        assert from_vcs(latest_tag=True) == Version("0.2.0",
                                                    distance=1,
                                                    commit="abc",
                                                    dirty=False)

        run("hg checkout v0.1.0")
        assert from_vcs() == Version("0.1.0", commit="abc", dirty=False)
        assert from_vcs(latest_tag=True) == Version("0.1.0",
                                                    commit="abc",
                                                    dirty=False)
Example #29
0
import pathlib

import setuptools

try:
    try:
        from dunamai import Version
    except ImportError:
        import sys
        import subprocess

        subprocess.check_call(
            [sys.executable, '-m', 'pip', 'install', 'dunamai'])
        from dunamai import Version

    version = Version.from_any_vcs().serialize()
except RuntimeError as error:
    logging.exception(error)
    version = '0.0.0'

logging.info(f'using version {version}')

metadata = setuptools.config.read_configuration(
    pathlib.Path(__file__).parent.absolute() / 'setup.cfg')['metadata']

setuptools.setup(
    name=metadata['name'],
    version=version,
    author=metadata['author'],
    author_email=metadata['author_email'],
    description=metadata['description'],
Example #30
0
    else:
        return repository_root(path.parent)


sys.path.insert(0, str(repository_root()))

# -- Project information -----------------------------------------------------
metadata = config.read_configuration('../../setup.cfg')['metadata']

project = metadata['name']
author = metadata['author']
copyright = f'2021, Office of Coast Survey (OCS), National Oceanic and Atmospheric Administration (NOAA)'

# The full version, including alpha/beta/rc tags
try:
    release = Version.from_any_vcs().serialize()
except RuntimeError:
    release = os.environ.get('VERSION')

# -- General configuration ---------------------------------------------------

autoclass_content = 'both'  # include both class docstring and __init__
autodoc_default_options = {
    # Make sure that any autodoc declarations show the right members
    'members': True,
    'inherited-members': True,
    'private-members': True,
    'member-order': 'bysource',
    'exclude-members': '__weakref__',
}
autosummary_generate = True  # Make _autosummary files and include them