All patches and comments are welcome. Please squash your changes to logical
commits before using git-format-patch and git-send-email to
patches@git.madduck.net.
If you'd read over the Git project's submission guidelines and adhered to them,
I'd be especially grateful.
2 Summarize Black runs to users.
4 from dataclasses import dataclass
6 from pathlib import Path
8 from click import style
10 from black.output import out, err
19 class NothingChanged(UserWarning):
20 """Raised when reformatted code is the same as source."""
25 """Provides a reformatting counter. Can be rendered with `str(report)`."""
33 failure_count: int = 0
35 def done(self, src: Path, changed: Changed) -> None:
36 """Increment the counter for successful reformatting. Write out a message."""
37 if changed is Changed.YES:
38 reformatted = "would reformat" if self.check or self.diff else "reformatted"
39 if self.verbose or not self.quiet:
40 out(f"{reformatted} {src}")
41 self.change_count += 1
44 if changed is Changed.NO:
45 msg = f"{src} already well formatted, good job."
47 msg = f"{src} wasn't modified on disk since last run."
51 def failed(self, src: Path, message: str) -> None:
52 """Increment the counter for failed reformatting. Write out a message."""
53 err(f"error: cannot format {src}: {message}")
54 self.failure_count += 1
56 def path_ignored(self, path: Path, message: str) -> None:
58 out(f"{path} ignored: {message}", bold=False)
61 def return_code(self) -> int:
62 """Return the exit code that the app should use.
64 This considers the current state of changed files and failures:
65 - if there were any failures, return 123;
66 - if any files were changed and --check is being used, return 1;
69 # According to http://tldp.org/LDP/abs/html/exitcodes.html starting with
70 # 126 we have special return codes reserved by the shell.
71 if self.failure_count:
74 elif self.change_count and self.check:
79 def __str__(self) -> str:
80 """Render a color report of the current state.
82 Use `click.unstyle` to remove colors.
84 if self.check or self.diff:
85 reformatted = "would be reformatted"
86 unchanged = "would be left unchanged"
87 failed = "would fail to reformat"
89 reformatted = "reformatted"
90 unchanged = "left unchanged"
91 failed = "failed to reformat"
94 s = "s" if self.change_count > 1 else ""
96 style(f"{self.change_count} file{s} {reformatted}", bold=True)
99 s = "s" if self.same_count > 1 else ""
100 report.append(f"{self.same_count} file{s} {unchanged}")
101 if self.failure_count:
102 s = "s" if self.failure_count > 1 else ""
103 report.append(style(f"{self.failure_count} file{s} {failed}", fg="red"))
104 return ", ".join(report) + "."