From 5e1e1a1820504b2709a7201800ff042f0abbad2c Mon Sep 17 00:00:00 2001 From: Vishwas B Sharma Date: Mon, 23 Apr 2018 11:23:11 -0700 Subject: [PATCH] [#149] Make check and diff not mutually exclusive (#161) Fixes #149. --- black.py | 24 ++++++++++++++---------- tests/test_black.py | 18 ++++++++++++++++++ 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/black.py b/black.py index 58f7976..c77166a 100644 --- a/black.py +++ b/black.py @@ -184,12 +184,8 @@ def main( sources.append(Path("-")) else: err(f"invalid path: {s}") - if check and diff: - exc = click.ClickException("Options --check and --diff are mutually exclusive") - exc.exit_code = 2 - raise exc - if check: + if check and not diff: write_back = WriteBack.NO elif diff: write_back = WriteBack.DIFF @@ -200,7 +196,9 @@ def main( return elif len(sources) == 1: - return_code = reformat_one(sources[0], line_length, fast, quiet, write_back) + return_code = reformat_one( + sources[0], line_length, fast, quiet, write_back, check + ) else: loop = asyncio.get_event_loop() executor = ProcessPoolExecutor(max_workers=os.cpu_count()) @@ -208,7 +206,7 @@ def main( try: return_code = loop.run_until_complete( schedule_formatting( - sources, line_length, write_back, fast, quiet, loop, executor + sources, line_length, write_back, fast, quiet, loop, executor, check ) ) finally: @@ -217,14 +215,19 @@ def main( def reformat_one( - src: Path, line_length: int, fast: bool, quiet: bool, write_back: WriteBack + src: Path, + line_length: int, + fast: bool, + quiet: bool, + write_back: WriteBack, + check: bool, ) -> int: """Reformat a single file under `src` without spawning child processes. If `quiet` is True, non-error messages are not output. `line_length`, `write_back`, and `fast` options are passed to :func:`format_file_in_place`. """ - report = Report(check=write_back is WriteBack.NO, quiet=quiet) + report = Report(check=check, quiet=quiet) try: changed = Changed.NO if not src.is_file() and str(src) == "-": @@ -262,6 +265,7 @@ async def schedule_formatting( quiet: bool, loop: BaseEventLoop, executor: Executor, + check: bool, ) -> int: """Run formatting of `sources` in parallel using the provided `executor`. @@ -270,7 +274,7 @@ async def schedule_formatting( `line_length`, `write_back`, and `fast` options are passed to :func:`format_file_in_place`. """ - report = Report(check=write_back is WriteBack.NO, quiet=quiet) + report = Report(check=check, quiet=quiet) cache: Cache = {} if write_back != WriteBack.DIFF: cache = read_cache() diff --git a/tests/test_black.py b/tests/test_black.py index fc31069..b482053 100644 --- a/tests/test_black.py +++ b/tests/test_black.py @@ -595,6 +595,24 @@ class BlackTestCase(unittest.TestCase): mock.side_effect = OSError black.write_cache({}, []) + def test_check_diff_use_together(self) -> None: + with cache_dir(): + # Files which will be reformatted. + src1 = (THIS_DIR / "string_quotes.py").resolve() + result = CliRunner().invoke(black.main, [str(src1), "--diff", "--check"]) + self.assertEqual(result.exit_code, 1) + + # Files which will not be reformatted. + src2 = (THIS_DIR / "composition.py").resolve() + result = CliRunner().invoke(black.main, [str(src2), "--diff", "--check"]) + self.assertEqual(result.exit_code, 0) + + # Multi file command. + result = CliRunner().invoke( + black.main, [str(src1), str(src2), "--diff", "--check"] + ) + self.assertEqual(result.exit_code, 1) + if __name__ == "__main__": unittest.main() -- 2.39.2