From 53065c458157c0d3dea6cbc19b827db36c678a5f Mon Sep 17 00:00:00 2001 From: monosans Date: Mon, 25 Nov 2024 14:38:06 +0300 Subject: [PATCH] chore: reorganize cli files --- pyproject.toml | 2 +- python/pyromark/__main__.py | 69 ++----------------------------------- python/pyromark/_cli.py | 55 +++++++++++++++++++++++++++++ tests/test_pyromark.py | 2 +- 4 files changed, 60 insertions(+), 68 deletions(-) create mode 100644 python/pyromark/_cli.py diff --git a/pyproject.toml b/pyproject.toml index 41b2ab0..d4eb1cf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -31,7 +31,7 @@ classifiers = [ dependencies = ["typing-extensions>=3.7.4.2"] urls.documentation = "https://pyromark.readthedocs.io" urls.repository = "https://github.com/monosans/pyromark" -scripts.pyromark = "pyromark.__main__:_main" +scripts.pyromark = "pyromark._cli:main" [dependency-groups] dev = ["mypy[faster-cache]==1.13", "pytest==8.3.3", "ruff==0.8.0"] diff --git a/python/pyromark/__main__.py b/python/pyromark/__main__.py index fad5652..32999d7 100644 --- a/python/pyromark/__main__.py +++ b/python/pyromark/__main__.py @@ -1,69 +1,6 @@ -# ruff: noqa: T201 from __future__ import annotations -import argparse -import sys -from collections.abc import Iterator, Sequence -from contextlib import contextmanager -from typing import Optional - -import pyromark - - -@contextmanager -def _parse_args( - args: Optional[Sequence[str]], / -) -> Iterator[argparse.Namespace]: - parser = argparse.ArgumentParser( - pyromark.__name__, description=pyromark.__doc__ - ) - parser.add_argument( - "-v", "--version", action="version", version=pyromark.__version__ - ) - parser.add_argument( - "-o", - "--output", - type=argparse.FileType("w", encoding="utf-8"), - help="output file path, default is stdout", - ) - for opt_name in pyromark.Options.__members__: - parser.add_argument( - "--" + opt_name.lower().replace("_", "-"), action="store_true" - ) - parser.add_argument( - "file", - type=argparse.FileType("r", encoding="utf-8"), - help="utf-8 input file path or '-' for stdin", - ) - parsed_args = parser.parse_args(args) - try: - yield parsed_args - finally: - parsed_args.file.close() - if parsed_args.output is not None: - parsed_args.output.close() - - -def _main(args: Optional[Sequence[str]] = None, /) -> None: - with _parse_args(args) as parsed_args: - content = parsed_args.file.read() - parsed_args.file.close() - - opts = pyromark.Options(0) - for opt_name, opt in pyromark.Options.__members__.items(): - if getattr(parsed_args, opt_name.lower()): - opts |= opt - - html = pyromark.html(content, options=opts) - if parsed_args.output is None: - print(html, end="") - else: - parsed_args.output.write(html) - parsed_args.output.close() - - if __name__ == "__main__": - try: - _main() - except KeyboardInterrupt: - sys.exit(130) + from pyromark._cli import main + + main() diff --git a/python/pyromark/_cli.py b/python/pyromark/_cli.py new file mode 100644 index 0000000..18eff78 --- /dev/null +++ b/python/pyromark/_cli.py @@ -0,0 +1,55 @@ +# ruff: noqa: T201 +from __future__ import annotations + +import argparse +from collections.abc import Sequence +from typing import Optional + +import pyromark + + +def _parse_args(args: Optional[Sequence[str]], /) -> argparse.Namespace: + parser = argparse.ArgumentParser( + pyromark.__name__, description=pyromark.__doc__ + ) + parser.add_argument( + "-v", "--version", action="version", version=pyromark.__version__ + ) + parser.add_argument( + "-o", + "--output", + type=argparse.FileType("w", encoding="utf-8"), + help="output file path, default is stdout", + ) + for opt_name in pyromark.Options.__members__: + parser.add_argument( + "--" + opt_name.lower().replace("_", "-"), action="store_true" + ) + parser.add_argument( + "file", + type=argparse.FileType("r", encoding="utf-8"), + help="utf-8 input file path or '-' for stdin", + ) + return parser.parse_args(args) + + +def main(args: Optional[Sequence[str]] = None, /) -> None: + parsed_args = _parse_args(args) + try: + content = parsed_args.file.read() + parsed_args.file.close() + + opts = pyromark.Options(0) + for opt_name, opt in pyromark.Options.__members__.items(): + if getattr(parsed_args, opt_name.lower()): + opts |= opt + + html = pyromark.html(content, options=opts) + if parsed_args.output is None: + print(html, end="") + else: + parsed_args.output.write(html) + finally: + parsed_args.file.close() + if parsed_args.output is not None: + parsed_args.output.close() diff --git a/tests/test_pyromark.py b/tests/test_pyromark.py index caa8aed..3d16d23 100644 --- a/tests/test_pyromark.py +++ b/tests/test_pyromark.py @@ -8,7 +8,7 @@ import pyromark import pytest -from pyromark.__main__ import _main as pyromark_cli # noqa: PLC2701 +from pyromark._cli import main as pyromark_cli # noqa: PLC2701 TABLE = """\ | foo | bar |