X-Git-Url: https://git.madduck.net/etc/vim.git/blobdiff_plain/a20a3eeb0f738d3434efe3be8932db11722757a4..f8e9544c930a1469bee8b3f131687e2cae52e59b:/black.py diff --git a/black.py b/black.py index c2c118a..01390b3 100644 --- a/black.py +++ b/black.py @@ -38,7 +38,7 @@ from blib2to3 import pygram, pytree from blib2to3.pgen2 import driver, token from blib2to3.pgen2.parse import ParseError -__version__ = "18.3a4" +__version__ = "18.4a0" DEFAULT_LINE_LENGTH = 88 # types syms = pygram.python_symbols @@ -129,6 +129,15 @@ class WriteBack(Enum): is_flag=True, help="If --fast given, skip temporary sanity checks. [default: --safe]", ) +@click.option( + "-q", + "--quiet", + is_flag=True, + help=( + "Don't emit non-error messages to stderr. Errors are still emitted, " + "silence those with 2>/dev/null." + ), +) @click.version_option(version=__version__) @click.argument( "src", @@ -144,6 +153,7 @@ def main( check: bool, diff: bool, fast: bool, + quiet: bool, src: List[str], ) -> None: """The uncompromising code formatter.""" @@ -174,7 +184,7 @@ def main( ctx.exit(0) elif len(sources) == 1: p = sources[0] - report = Report(check=check) + report = Report(check=check, quiet=quiet) try: if not p.is_file() and str(p) == "-": changed = format_stdin_to_stdout( @@ -195,7 +205,7 @@ def main( try: return_code = loop.run_until_complete( schedule_formatting( - sources, line_length, write_back, fast, loop, executor + sources, line_length, write_back, fast, quiet, loop, executor ) ) finally: @@ -208,6 +218,7 @@ async def schedule_formatting( line_length: int, write_back: WriteBack, fast: bool, + quiet: bool, loop: BaseEventLoop, executor: Executor, ) -> int: @@ -235,7 +246,7 @@ async def schedule_formatting( loop.add_signal_handler(signal.SIGTERM, cancel, _task_values) await asyncio.wait(tasks.values()) cancelled = [] - report = Report(check=not write_back) + report = Report(check=write_back is WriteBack.NO, quiet=quiet) for src, task in tasks.items(): if not task.done(): report.failed(src, "timed out, cancelling") @@ -249,9 +260,10 @@ async def schedule_formatting( report.done(src, task.result()) if cancelled: await asyncio.gather(*cancelled, loop=loop, return_exceptions=True) - else: + elif not quiet: out("All done! ✨ 🍰 ✨") - click.echo(str(report)) + if not quiet: + click.echo(str(report)) return report.return_code @@ -1134,6 +1146,10 @@ class LineGenerator(Visitor[Line]): yield from self.line() yield from self.visit(node) + if node.type == token.ENDMARKER: + # somebody decided not to put a final `# fmt: on` + yield from self.line() + def __attrs_post_init__(self) -> None: """You are in a twisty little maze of passages.""" v = self.visit_stmt @@ -1537,7 +1553,12 @@ def generate_comments(leaf: Leaf) -> Iterator[Leaf]: raise FormatOn(consumed) if comment in {"# fmt: off", "# yapf: disable"}: - raise FormatOff(consumed) + if comment_type == STANDALONE_COMMENT: + raise FormatOff(consumed) + + prev = preceding_leaf(leaf) + if not prev or prev.type in WHITESPACE: # standalone comment in disguise + raise FormatOff(consumed) nlines = 0 @@ -1796,9 +1817,10 @@ def delimiter_split(line: Line, py36: bool = False) -> Iterator[Line]: current_line = Line(depth=line.depth, inside_brackets=line.inside_brackets) if current_line: if ( - delimiter_priority == COMMA_PRIORITY + trailing_comma_safe + and delimiter_priority == COMMA_PRIORITY and current_line.leaves[-1].type != token.COMMA - and trailing_comma_safe + and current_line.leaves[-1].type != STANDALONE_COMMENT ): current_line.append(Leaf(token.COMMA, ",")) yield current_line @@ -1964,6 +1986,7 @@ def gen_python_files_in_dir(path: Path) -> Iterator[Path]: class Report: """Provides a reformatting counter. Can be rendered with `str(report)`.""" check: bool = False + quiet: bool = False change_count: int = 0 same_count: int = 0 failure_count: int = 0 @@ -1972,10 +1995,12 @@ class Report: """Increment the counter for successful reformatting. Write out a message.""" if changed: reformatted = "would reformat" if self.check else "reformatted" - out(f"{reformatted} {src}") + if not self.quiet: + out(f"{reformatted} {src}") self.change_count += 1 else: - out(f"{src} already well formatted, good job.", bold=False) + if not self.quiet: + out(f"{src} already well formatted, good job.", bold=False) self.same_count += 1 def failed(self, src: Path, message: str) -> None: