Provides a reformatting counter. Can be rendered with `str(report)`.
| 23 | |
| 24 | @dataclass |
| 25 | class Report: |
| 26 | """Provides a reformatting counter. Can be rendered with `str(report)`.""" |
| 27 | |
| 28 | check: bool = False |
| 29 | diff: bool = False |
| 30 | quiet: bool = False |
| 31 | verbose: bool = False |
| 32 | change_count: int = 0 |
| 33 | same_count: int = 0 |
| 34 | failure_count: int = 0 |
| 35 | |
| 36 | def done(self, src: Path, changed: Changed) -> None: |
| 37 | """Increment the counter for successful reformatting. Write out a message.""" |
| 38 | if changed is Changed.YES: |
| 39 | reformatted = "would reformat" if self.check or self.diff else "reformatted" |
| 40 | if self.verbose or not self.quiet: |
| 41 | out(f"{reformatted} {src}") |
| 42 | self.change_count += 1 |
| 43 | else: |
| 44 | if self.verbose: |
| 45 | if changed is Changed.NO: |
| 46 | msg = f"{src} already well formatted, good job." |
| 47 | else: |
| 48 | msg = f"{src} wasn't modified on disk since last run." |
| 49 | out(msg, bold=False) |
| 50 | self.same_count += 1 |
| 51 | |
| 52 | def failed(self, src: Path, message: str) -> None: |
| 53 | """Increment the counter for failed reformatting. Write out a message.""" |
| 54 | err(f"error: cannot format {src}: {message}") |
| 55 | self.failure_count += 1 |
| 56 | |
| 57 | def path_ignored(self, path: Path, message: str) -> None: |
| 58 | if self.verbose: |
| 59 | out(f"{path} ignored: {message}", bold=False) |
| 60 | |
| 61 | @property |
| 62 | def return_code(self) -> int: |
| 63 | """Return the exit code that the app should use. |
| 64 | |
| 65 | This considers the current state of changed files and failures: |
| 66 | - if there were any failures, return 123; |
| 67 | - if any files were changed and --check is being used, return 1; |
| 68 | - otherwise return 0. |
| 69 | """ |
| 70 | # According to http://tldp.org/LDP/abs/html/exitcodes.html starting with |
| 71 | # 126 we have special return codes reserved by the shell. |
| 72 | if self.failure_count: |
| 73 | return 123 |
| 74 | |
| 75 | elif self.change_count and self.check: |
| 76 | return 1 |
| 77 | |
| 78 | return 0 |
| 79 | |
| 80 | def __str__(self) -> str: |
| 81 | """Render a color report of the current state. |
| 82 |
no outgoing calls