diff options
author | Ronny Pfannschmidt <opensource@ronnypfannschmidt.de> | 2021-12-29 23:30:08 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-12-29 23:30:08 +0100 |
commit | 88efad42f90ef636443ac6ce25561b9118cd74c2 (patch) | |
tree | c3efbcbf9f6832d51efed8abcb32ab5e9328a6b7 | |
parent | ad383a2a122aa1908ef4b70769a566f7b974fd2a (diff) | |
parent | d664d3f8a3d080d90a2934555d979737d18aca92 (diff) | |
download | setuptools-scm-88efad42f90ef636443ac6ce25561b9118cd74c2.tar.gz |
Merge pull request #646 from abravalheri/improve-main
Consider configuration when running `__main__`
-rw-r--r-- | src/setuptools_scm/__main__.py | 63 | ||||
-rw-r--r-- | testing/test_main.py | 52 |
2 files changed, 110 insertions, 5 deletions
diff --git a/src/setuptools_scm/__main__.py b/src/setuptools_scm/__main__.py index f3377b0..ef64819 100644 --- a/src/setuptools_scm/__main__.py +++ b/src/setuptools_scm/__main__.py @@ -1,15 +1,68 @@ -import sys +import argparse +import os +import warnings -from setuptools_scm import get_version +from setuptools_scm import _get_version +from setuptools_scm.config import Configuration +from setuptools_scm.discover import walk_potential_roots from setuptools_scm.integration import find_files def main() -> None: - print("Guessed Version", get_version()) - if "ls" in sys.argv: - for fname in find_files("."): + opts = _get_cli_opts() + root = opts.root or "." + + try: + pyproject = opts.config or _find_pyproject(root) + root = opts.root or os.path.relpath(os.path.dirname(pyproject)) + config = Configuration.from_file(pyproject) + config.root = root + except (LookupError, FileNotFoundError) as ex: + # no pyproject.toml OR no [tool.setuptools_scm] + warnings.warn(f"{ex}. Using default configuration.") + config = Configuration(root) + + print(_get_version(config)) + + if opts.command == "ls": + for fname in find_files(config.root): print(fname) +def _get_cli_opts(): + prog = "python -m setuptools_scm" + desc = "Print project version according to SCM metadata" + parser = argparse.ArgumentParser(prog, description=desc) + # By default, help for `--help` starts with lower case, so we keep the pattern: + parser.add_argument( + "-r", + "--root", + default=None, + help='directory managed by the SCM, default: inferred from config file, or "."', + ) + parser.add_argument( + "-c", + "--config", + default=None, + metavar="PATH", + help="path to 'pyproject.toml' with setuptools_scm config, " + "default: looked up in the current or parent directories", + ) + sub = parser.add_subparsers(title="extra commands", dest="command", metavar="") + # We avoid `metavar` to prevent printing repetitive information + desc = "List files managed by the SCM" + sub.add_parser("ls", help=desc[0].lower() + desc[1:], description=desc) + return parser.parse_args() + + +def _find_pyproject(parent): + for directory in walk_potential_roots(os.path.abspath(parent)): + pyproject = os.path.join(directory, "pyproject.toml") + if os.path.exists(pyproject): + return pyproject + + raise FileNotFoundError("'pyproject.toml' was not found") + + if __name__ == "__main__": main() diff --git a/testing/test_main.py b/testing/test_main.py index 97ea05e..ea1373f 100644 --- a/testing/test_main.py +++ b/testing/test_main.py @@ -1,4 +1,8 @@ import os.path +import sys +import textwrap + +import pytest def test_main(): @@ -8,3 +12,51 @@ def test_main(): with open(mainfile) as f: code = compile(f.read(), "__main__.py", "exec") exec(code) + + +@pytest.fixture +def repo(wd): + wd("git init") + wd("git config user.email user@host") + wd("git config user.name user") + wd.add_command = "git add ." + wd.commit_command = "git commit -m test-{reason}" + + wd.write("README.rst", "My example") + wd.add_and_commit() + wd("git tag v0.1.0") + + wd.write("file.txt", "file.txt") + wd.add_and_commit() + + return wd + + +def test_repo_with_config(repo): + pyproject = """\ + [tool.setuptools_scm] + version_scheme = "no-guess-dev" + + [project] + name = "example" + """ + repo.write("pyproject.toml", textwrap.dedent(pyproject)) + repo.add_and_commit() + res = repo((sys.executable, "-m", "setuptools_scm")) + assert res.startswith("0.1.0.post1.dev2") + + +def test_repo_without_config(repo): + res = repo((sys.executable, "-m", "setuptools_scm")) + assert res.startswith("0.1.1.dev1") + + +def test_repo_with_pyproject_missing_setuptools_scm(repo): + pyproject = """\ + [project] + name = "example" + """ + repo.write("pyproject.toml", textwrap.dedent(pyproject)) + repo.add_and_commit() + res = repo((sys.executable, "-m", "setuptools_scm")) + assert res.startswith("0.1.1.dev2") |