From 6e03b145bab56277ca8ce3f602357b713049bc71 Mon Sep 17 00:00:00 2001 From: Regen Date: Sun, 1 Mar 2020 15:41:38 +0900 Subject: [PATCH] Add stdin mode to cmake-format --- src/cmake_language_server/formatter.py | 23 ++++++++++++++++++--- tests/test_fomatter.py | 28 +++++++++++++++++++++++--- 2 files changed, 45 insertions(+), 6 deletions(-) diff --git a/src/cmake_language_server/formatter.py b/src/cmake_language_server/formatter.py index 3338967..a5238c3 100644 --- a/src/cmake_language_server/formatter.py +++ b/src/cmake_language_server/formatter.py @@ -86,10 +86,16 @@ def main(args: List[str] = None): from argparse import ArgumentParser from difflib import unified_diff from pathlib import Path + import sys from . import __version__ from .parser import ListParser - parser = ArgumentParser() + parser = ArgumentParser( + description='Format CMake list files.', + epilog=''' + If no arguments are specified, it formats the code from + standard input and writes the result to the standard output.''', + ) parser.add_argument('lists', type=Path, nargs='*', help='CMake list files') group = parser.add_mutually_exclusive_group() group.add_argument('-i', @@ -103,11 +109,22 @@ def main(args: List[str] = None): args = parser.parse_args(args) + if not args.lists and args.inplace: + print('error: cannot use -i when no arguments are specified.', + file=sys.stderr) + return + if not args.lists: + args.lists.append(None) + list_parser = ListParser() formatter = Formatter() for listpath in args.lists: - with listpath.open() as fp: - content = fp.read() + if listpath is None: + listpath = '(stdin)' + content = sys.stdin.read() + else: + with listpath.open() as fp: + content = fp.read() tokens, remain = list_parser.parse(content) formatted = content if remain else formatter.format(tokens) diff --git a/tests/test_fomatter.py b/tests/test_fomatter.py index 6ce0be3..153829f 100644 --- a/tests/test_fomatter.py +++ b/tests/test_fomatter.py @@ -1,3 +1,7 @@ +import sys +from contextlib import contextmanager +from io import StringIO + from cmake_language_server.formatter import Formatter, main from cmake_language_server.parser import ListParser @@ -74,10 +78,28 @@ endif() ''') -def test_main_noinput(capsys): - main([]) +@contextmanager +def mock_stdin(buf: str): + stdin = sys.stdin + sys.stdin = StringIO(buf) + yield + sys.stdin = stdin + + +def test_main_stdin(capsys): + with mock_stdin(' a()'): + main([]) captured = capsys.readouterr() - assert captured.out == '' + assert captured.out == 'a()\n' + assert captured.err == '' + + +def test_main_stdin_diff(capsys): + with mock_stdin(' a()'): + main(['-d']) + captured = capsys.readouterr() + assert '- a()' in captured.out + assert '+a()' in captured.out assert captured.err == ''