[#149] Make check and diff not mutually exclusive (#161)

Fixes #149.
This commit is contained in:
Vishwas B Sharma 2018-04-23 11:23:11 -07:00 committed by Łukasz Langa
parent b07ca2b7d5
commit 5e1e1a1820
2 changed files with 32 additions and 10 deletions

View File

@ -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()

View File

@ -595,6 +595,24 @@ def test_write_cache_write_fail(self) -> None:
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()