From 771046c78cf9f57523d2a6d103ebdb5963baff2c Mon Sep 17 00:00:00 2001 From: con-f-use Date: Sat, 14 Oct 2023 12:33:33 +0200 Subject: [PATCH 1/4] cli: extend ls comand for more info --- src/setuptools_scm/__main__.py | 2 +- src/setuptools_scm/_cli.py | 104 +++++++++++++++++++++++++++++++-- 2 files changed, 99 insertions(+), 7 deletions(-) diff --git a/src/setuptools_scm/__main__.py b/src/setuptools_scm/__main__.py index dab6068a..3f56d42a 100644 --- a/src/setuptools_scm/__main__.py +++ b/src/setuptools_scm/__main__.py @@ -3,4 +3,4 @@ from ._cli import main if __name__ == "__main__": - main() + raise SystemExit(main()) diff --git a/src/setuptools_scm/_cli.py b/src/setuptools_scm/_cli.py index 66099b12..12cec0d5 100644 --- a/src/setuptools_scm/_cli.py +++ b/src/setuptools_scm/_cli.py @@ -1,8 +1,10 @@ from __future__ import annotations import argparse +import json import os import sys +from typing import Any from setuptools_scm import Configuration from setuptools_scm._file_finders import find_files @@ -10,7 +12,7 @@ from setuptools_scm.discover import walk_potential_roots -def main(args: list[str] | None = None) -> None: +def main(args: list[str] | None = None) -> int: opts = _get_cli_opts(args) inferred_root: str = opts.root or "." @@ -36,11 +38,8 @@ def main(args: list[str] | None = None) -> None: raise SystemExit("ERROR: no version found for", opts) if opts.strip_dev: version = version.partition(".dev")[0] - print(version) - if opts.command == "ls": - for fname in find_files(config.root): - print(fname) + return command(opts, version, config) def _get_cli_opts(args: list[str] | None) -> argparse.Namespace: @@ -67,13 +66,106 @@ def _get_cli_opts(args: list[str] | None) -> argparse.Namespace: action="store_true", help="remove the dev/local parts of the version before printing the version", ) + parser.add_argument( + "-N", + "--no-version", + action="store_true", + help="do not include package version in the output", + ) + output_formats = ["json", "plain", "key-value"] + parser.add_argument( + "-f", + "--format", + type=str.casefold, + default="plain", + help="specify output format", + choices=output_formats, + ) + parser.add_argument( + "-q", + "--query", + type=str.casefold, + nargs="*", + help="display setuptools_scm settings according to query, " + "e.g. dist_name, do not supply an argument in order to " + "print a list of valid queries.", + ) 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" + desc = "List information about the package, e.g. included files" sub.add_parser("ls", help=desc[0].lower() + desc[1:], description=desc) return parser.parse_args(args) +# flake8: noqa: C901 +def command(opts: argparse.Namespace, version: str, config: Configuration) -> int: + data: dict[str, Any] = {} + + if opts.command == "ls": + opts.query = ["files"] + + if opts.query == []: + opts.no_version = True + sys.stderr.write("Available queries:\n\n") + opts.query = ["queries"] + data["queries"] = ["files"] + list(config.__dataclass_fields__.keys()) + + if opts.query is None: + opts.query = [] + + if opts.no_version is False: + data["version"] = version + + if "files" in opts.query: + data["files"] = find_files(config.root) + + for q in opts.query: + if q in ["files", "queries", "version"]: + continue + + try: + if q.startswith("_"): + raise AttributeError() + data[q] = getattr(config, q) + except AttributeError: + sys.stderr.write(f"Error: unknown query: '{q}'\n") + return 1 + + if opts.format == "json": + print(json.dumps(data, indent=2)) + + if opts.format == "plain": + _print_plain(data) + + if opts.format == "key-value": + _print_key_value(data) + + return 0 + + +def _print_plain(data: dict[Any, Any]) -> None: + version = data.pop("version", None) + if version: + print(version) + files = data.pop("files", []) + for file_ in files: + print(file_) + queries = data.pop("queries", []) + for query in queries: + print(query) + if data: + print("\n".join(data.values())) + + +def _print_key_value(data: dict[Any, Any]) -> None: + for key, value in data.items(): + if isinstance(value, str): + print(f"{key} = {value}") + else: + str_value = "\n ".join(value) + print(f"{key} = {str_value}") + + def _find_pyproject(parent: str) -> str: for directory in walk_potential_roots(os.path.abspath(parent)): pyproject = os.path.join(directory, "pyproject.toml") From 1f49a818100ecd8e44ff5f49d9ad359bb69c2369 Mon Sep 17 00:00:00 2001 From: Ronny Pfannschmidt Date: Tue, 5 Mar 2024 11:18:39 +0100 Subject: [PATCH 2/4] Apply suggestions from code review --- src/setuptools_scm/_cli.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/setuptools_scm/_cli.py b/src/setuptools_scm/_cli.py index 12cec0d5..643a9805 100644 --- a/src/setuptools_scm/_cli.py +++ b/src/setuptools_scm/_cli.py @@ -113,7 +113,7 @@ def command(opts: argparse.Namespace, version: str, config: Configuration) -> in if opts.query is None: opts.query = [] - if opts.no_version is False: + if not opts.no_version: data["version"] = version if "files" in opts.query: @@ -143,7 +143,7 @@ def command(opts: argparse.Namespace, version: str, config: Configuration) -> in return 0 -def _print_plain(data: dict[Any, Any]) -> None: +def _print_plain(data: dict[str, Any]) -> None: version = data.pop("version", None) if version: print(version) @@ -157,7 +157,7 @@ def _print_plain(data: dict[Any, Any]) -> None: print("\n".join(data.values())) -def _print_key_value(data: dict[Any, Any]) -> None: +def _print_key_value(data: dict[str, Any]) -> None: for key, value in data.items(): if isinstance(value, str): print(f"{key} = {value}") From 6f9544a1f7d2b0463154b90869acc04ec1fe9846 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 5 Mar 2024 10:20:28 +0000 Subject: [PATCH 3/4] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/setuptools_scm/_cli.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/setuptools_scm/_cli.py b/src/setuptools_scm/_cli.py index 08eaffdd..d08de8e5 100644 --- a/src/setuptools_scm/_cli.py +++ b/src/setuptools_scm/_cli.py @@ -4,6 +4,7 @@ import json import os import sys + from typing import Any from setuptools_scm import Configuration @@ -97,7 +98,6 @@ def _get_cli_opts(args: list[str] | None) -> argparse.Namespace: action="store_true", help="trigger to write the content of the version files\n" "its recommended to use normal/editable installation instead)", - ) sub = parser.add_subparsers(title="extra commands", dest="command", metavar="") # We avoid `metavar` to prevent printing repetitive information From 739a67c92764a390fa59d501e875c09a02f75a1a Mon Sep 17 00:00:00 2001 From: Ronny Pfannschmidt Date: Tue, 5 Mar 2024 11:27:26 +0100 Subject: [PATCH 4/4] fix ruff warning on concat --- src/setuptools_scm/_cli.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/setuptools_scm/_cli.py b/src/setuptools_scm/_cli.py index d08de8e5..8c815237 100644 --- a/src/setuptools_scm/_cli.py +++ b/src/setuptools_scm/_cli.py @@ -117,7 +117,7 @@ def command(opts: argparse.Namespace, version: str, config: Configuration) -> in opts.no_version = True sys.stderr.write("Available queries:\n\n") opts.query = ["queries"] - data["queries"] = ["files"] + list(config.__dataclass_fields__.keys()) + data["queries"] = ["files", *config.__dataclass_fields__] if opts.query is None: opts.query = []