Only return exit code 1 when --check is used

Also, output less confusing messages in --check.

Fixes #50
This commit is contained in:
Łukasz Langa 2018-03-22 17:33:44 -07:00
parent 7914a5b0a2
commit 8de552eb4f
3 changed files with 35 additions and 14 deletions

View File

@ -44,10 +44,10 @@ black [OPTIONS] [SRC]...
Options: Options:
-l, --line-length INTEGER Where to wrap around. [default: 88] -l, --line-length INTEGER Where to wrap around. [default: 88]
--check Don't write back the files, just return the --check Don't write back the files, just return the
status. Return code 0 means nothing changed. status. Return code 0 means nothing would
Return code 1 means some files were reformatted. change. Return code 1 means some files would be
Return code 123 means there was an internal reformatted. Return code 123 means there was an
error. internal error.
--fast / --safe If --fast given, skip temporary sanity checks. --fast / --safe If --fast given, skip temporary sanity checks.
[default: --safe] [default: --safe]
--version Show the version and exit. --version Show the version and exit.
@ -58,7 +58,9 @@ Options:
* it does nothing if no sources are passed to it; * it does nothing if no sources are passed to it;
* it will read from standard input and write to standard output if `-` * it will read from standard input and write to standard output if `-`
is used as the filename; is used as the filename;
* it only outputs messages to users on standard error. * it only outputs messages to users on standard error;
* exits with code 0 unless an internal error occured (or `--check` was
used).
## The philosophy behind *Black* ## The philosophy behind *Black*
@ -307,6 +309,8 @@ More details can be found in [CONTRIBUTING](CONTRIBUTING.md).
### 18.3a4 (unreleased) ### 18.3a4 (unreleased)
* only return exit code 1 when --check is used (#50)
* don't remove single trailing commas from square bracket indexing * don't remove single trailing commas from square bracket indexing
(#59) (#59)

View File

@ -62,7 +62,7 @@ class CannotSplit(Exception):
is_flag=True, is_flag=True,
help=( help=(
"Don't write back the files, just return the status. Return code 0 " "Don't write back the files, just return the status. Return code 0 "
"means nothing changed. Return code 1 means some files were " "means nothing would change. Return code 1 means some files would be "
"reformatted. Return code 123 means there was an internal error." "reformatted. Return code 123 means there was an internal error."
), ),
) )
@ -100,7 +100,7 @@ def main(
ctx.exit(0) ctx.exit(0)
elif len(sources) == 1: elif len(sources) == 1:
p = sources[0] p = sources[0]
report = Report() report = Report(check=check)
try: try:
if not p.is_file() and str(p) == '-': if not p.is_file() and str(p) == '-':
changed = format_stdin_to_stdout( changed = format_stdin_to_stdout(
@ -1438,6 +1438,7 @@ def gen_python_files_in_dir(path: Path) -> Iterator[Path]:
@dataclass @dataclass
class Report: class Report:
"""Provides a reformatting counter.""" """Provides a reformatting counter."""
check: bool = False
change_count: int = 0 change_count: int = 0
same_count: int = 0 same_count: int = 0
failure_count: int = 0 failure_count: int = 0
@ -1445,7 +1446,8 @@ class Report:
def done(self, src: Path, changed: bool) -> None: def done(self, src: Path, changed: bool) -> None:
"""Increment the counter for successful reformatting. Write out a message.""" """Increment the counter for successful reformatting. Write out a message."""
if changed: if changed:
out(f'reformatted {src}') reformatted = 'would reformat' if self.check else 'reformatted'
out(f'{reformatted} {src}')
self.change_count += 1 self.change_count += 1
else: else:
out(f'{src} already well formatted, good job.', bold=False) out(f'{src} already well formatted, good job.', bold=False)
@ -1464,7 +1466,7 @@ def return_code(self) -> int:
if self.failure_count: if self.failure_count:
return 123 return 123
elif self.change_count: elif self.change_count and self.check:
return 1 return 1
return 0 return 0
@ -1474,21 +1476,27 @@ def __str__(self) -> str:
Use `click.unstyle` to remove colors. Use `click.unstyle` to remove colors.
""" """
if self.check:
reformatted = "would be reformatted"
unchanged = "would be left unchanged"
failed = "would fail to reformat"
else:
reformatted = "reformatted"
unchanged = "left unchanged"
failed = "failed to reformat"
report = [] report = []
if self.change_count: if self.change_count:
s = 's' if self.change_count > 1 else '' s = 's' if self.change_count > 1 else ''
report.append( report.append(
click.style(f'{self.change_count} file{s} reformatted', bold=True) click.style(f'{self.change_count} file{s} {reformatted}', bold=True)
) )
if self.same_count: if self.same_count:
s = 's' if self.same_count > 1 else '' s = 's' if self.same_count > 1 else ''
report.append(f'{self.same_count} file{s} left unchanged') report.append(f'{self.same_count} file{s} {unchanged}')
if self.failure_count: if self.failure_count:
s = 's' if self.failure_count > 1 else '' s = 's' if self.failure_count > 1 else ''
report.append( report.append(
click.style( click.style(f'{self.failure_count} file{s} {failed}', fg='red')
f'{self.failure_count} file{s} failed to reformat', fg='red'
)
) )
return ', '.join(report) + '.' return ', '.join(report) + '.'

View File

@ -205,7 +205,10 @@ def err(msg: str, **kwargs: Any) -> None:
self.assertEqual( self.assertEqual(
unstyle(str(report)), '1 file reformatted, 1 file left unchanged.' unstyle(str(report)), '1 file reformatted, 1 file left unchanged.'
) )
self.assertEqual(report.return_code, 0)
report.check = True
self.assertEqual(report.return_code, 1) self.assertEqual(report.return_code, 1)
report.check = False
report.failed(Path('e1'), 'boom') report.failed(Path('e1'), 'boom')
self.assertEqual(len(out_lines), 2) self.assertEqual(len(out_lines), 2)
self.assertEqual(len(err_lines), 1) self.assertEqual(len(err_lines), 1)
@ -246,6 +249,12 @@ def err(msg: str, **kwargs: Any) -> None:
'2 files failed to reformat.', '2 files failed to reformat.',
) )
self.assertEqual(report.return_code, 123) self.assertEqual(report.return_code, 123)
report.check = True
self.assertEqual(
unstyle(str(report)),
'2 files would be reformatted, 2 files would be left unchanged, '
'2 files would fail to reformat.',
)
def test_is_python36(self) -> None: def test_is_python36(self) -> None:
node = black.lib2to3_parse("def f(*, arg): ...\n") node = black.lib2to3_parse("def f(*, arg): ...\n")