Add --check

Fixes #9
This commit is contained in:
Łukasz Langa 2018-03-15 16:01:57 -07:00 committed by Lukasz Langa
parent 80f9b14a30
commit 4c480bcac2
2 changed files with 42 additions and 8 deletions

View File

@ -43,6 +43,11 @@ 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
status. Return code 0 means nothing changed.
Return code 1 means some files were reformatted.
Return code 123 means there was an 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.
@ -253,6 +258,8 @@ You can still try but prepare to be disappointed.
### 18.3a1 ### 18.3a1
* added `--check`
* fixed invalid spacing of dots in relative imports (#6, #13) * fixed invalid spacing of dots in relative imports (#6, #13)
* fixed spurious space in parenthesized set expressions (#7) * fixed spurious space in parenthesized set expressions (#7)

View File

@ -55,6 +55,15 @@ class CannotSplit(Exception):
help='How many character per line to allow.', help='How many character per line to allow.',
show_default=True, show_default=True,
) )
@click.option(
'--check',
is_flag=True,
help=(
"Don't write back the files, just return the status. Return code 0 "
"means nothing changed. Return code 1 means some files were "
"reformatted. Return code 123 means there was an internal error."
),
)
@click.option( @click.option(
'--fast/--safe', '--fast/--safe',
is_flag=True, is_flag=True,
@ -67,7 +76,9 @@ class CannotSplit(Exception):
type=click.Path(exists=True, file_okay=True, dir_okay=True, readable=True), type=click.Path(exists=True, file_okay=True, dir_okay=True, readable=True),
) )
@click.pass_context @click.pass_context
def main(ctx: click.Context, line_length: int, fast: bool, src: List[str]) -> None: def main(
ctx: click.Context, line_length: int, check: bool, fast: bool, src: List[str]
) -> None:
"""The uncompromising code formatter.""" """The uncompromising code formatter."""
sources: List[Path] = [] sources: List[Path] = []
for s in src: for s in src:
@ -85,7 +96,9 @@ def main(ctx: click.Context, line_length: int, fast: bool, src: List[str]) -> No
p = sources[0] p = sources[0]
report = Report() report = Report()
try: try:
changed = format_file_in_place(p, line_length=line_length, fast=fast) changed = format_file_in_place(
p, line_length=line_length, fast=fast, write_back=not check
)
report.done(p, changed) report.done(p, changed)
except Exception as exc: except Exception as exc:
report.failed(p, str(exc)) report.failed(p, str(exc))
@ -96,7 +109,9 @@ def main(ctx: click.Context, line_length: int, fast: bool, src: List[str]) -> No
return_code = 1 return_code = 1
try: try:
return_code = loop.run_until_complete( return_code = loop.run_until_complete(
schedule_formatting(sources, line_length, fast, loop, executor) schedule_formatting(
sources, line_length, not check, fast, loop, executor
)
) )
finally: finally:
loop.close() loop.close()
@ -106,13 +121,14 @@ def main(ctx: click.Context, line_length: int, fast: bool, src: List[str]) -> No
async def schedule_formatting( async def schedule_formatting(
sources: List[Path], sources: List[Path],
line_length: int, line_length: int,
write_back: bool,
fast: bool, fast: bool,
loop: BaseEventLoop, loop: BaseEventLoop,
executor: Executor, executor: Executor,
) -> int: ) -> int:
tasks = { tasks = {
src: loop.run_in_executor( src: loop.run_in_executor(
executor, format_file_in_place, src, line_length, fast executor, format_file_in_place, src, line_length, fast, write_back
) )
for src in sources for src in sources
} }
@ -135,15 +151,18 @@ async def schedule_formatting(
return report.return_code return report.return_code
def format_file_in_place(src: Path, line_length: int, fast: bool) -> bool: def format_file_in_place(
src: Path, line_length: int, fast: bool, write_back: bool = False
) -> bool:
"""Format the file and rewrite if changed. Return True if changed.""" """Format the file and rewrite if changed. Return True if changed."""
try: try:
contents, encoding = format_file(src, line_length=line_length, fast=fast) contents, encoding = format_file(src, line_length=line_length, fast=fast)
except NothingChanged: except NothingChanged:
return False return False
with open(src, "w", encoding=encoding) as f: if write_back:
f.write(contents) with open(src, "w", encoding=encoding) as f:
f.write(contents)
return True return True
@ -1321,7 +1340,15 @@ def failed(self, src: Path, message: str) -> None:
@property @property
def return_code(self) -> int: def return_code(self) -> int:
"""Which return code should the app use considering the current state.""" """Which return code should the app use considering the current state."""
return 1 if self.failure_count else 0 # According to http://tldp.org/LDP/abs/html/exitcodes.html starting with
# 126 we have special returncodes reserved by the shell.
if self.failure_count:
return 123
elif self.change_count:
return 1
return 0
def __str__(self) -> str: def __str__(self) -> str:
"""A color report of the current state. """A color report of the current state.