diff --git a/python/ruff-ecosystem/ruff_ecosystem/check.py b/python/ruff-ecosystem/ruff_ecosystem/check.py index 1a202e9be5..8b08361c79 100644 --- a/python/ruff-ecosystem/ruff_ecosystem/check.py +++ b/python/ruff-ecosystem/ruff_ecosystem/check.py @@ -61,8 +61,9 @@ def markdown_check_result(result: Result) -> str: total_added_fixes = all_rule_changes.total_added_fixes() total_removed_fixes = all_rule_changes.total_removed_fixes() error_count = len(result.errored) + total_affected_rules = len(all_rule_changes.rule_codes()) - if total_removed == 0 and total_added == 0 and error_count == 0: + if total_affected_rules == 0 and error_count == 0: return "\u2705 ecosystem check detected no linter changes." # Summarize the total changes @@ -72,32 +73,51 @@ def markdown_check_result(result: Result) -> str: lines.append(f"\u2139\ufe0f ecosystem check **detected linter changes**. {changes}") lines.append("") - # Then per-project changes + # Limit the number of items displayed per rule with a floor of 10 and + # ceiling of 200 depending on the total number of affected rules + max_display_per_rule = max(10, 200 // total_affected_rules) + + # Display per project changes for project, comparison in result.completed: if not comparison.diff: continue # Skip empty diffs diff = project_diffs[project] - # limited_diff = limit_rule_lines(diff, project.check_options.max_lines_per_rule) + rule_changes = project_rule_changes[project] # Display the diff + displayed_per_rule = Counter() + # Wrap with `
` for code-styling with support for links
         diff_lines = ["
"]
         for line in diff.parsed_lines:
             if line in diff.fix_only_lines:
                 continue
 
+            rule_code = line.rule_code
+
+            # Limit the number of changes we'll show per rule code
+            if displayed_per_rule[rule_code] > max_display_per_rule:
+                continue
+
             diff_lines.append(
                 add_permalink_to_diagnostic_line(comparison.repo, line.construct_line())
             )
 
-        # omitted_lines = len(limited_diff) - max_lines_per_project
-        # if omitted_lines > 0:
-        #     diff_lines.append(f"... {omitted_lines} additional lines omitted")
+            displayed_per_rule[rule_code] += 1
+            # If we just reached the maximum... display an omission line
+            if displayed_per_rule[rule_code] > max_display_per_rule:
+                hidden_count = (
+                    rule_changes.added_violations[rule_code]
+                    + rule_changes.removed_violations[rule_code]
+                    - max_display_per_rule
+                )
+                diff_lines.append(
+                    f"... {hidden_count} additional changes omitted for rule {rule_code}"
+                )
 
         diff_lines.append("
") - rule_changes = project_rule_changes[project] title = ( f"+{rule_changes.total_added_violations()} " f"-{rule_changes.total_removed_violations()} violations, " @@ -125,33 +145,32 @@ def markdown_check_result(result: Result) -> str: ) # Display a summary table of changed rules - if all_rule_changes: - table_lines = [] - table_lines.append("| code | total | + violation | - violation | + fix | - fix") - table_lines.append("| ---- | ------- | --------- | -------- |") - for rule, total in sorted( - all_rule_changes.total_changes_by_rule(), - key=lambda item: item[1], # Sort by the total changes - reverse=True, - ): - added_violations, removed_violations, added_fixes, removed_fixes = ( - all_rule_changes.added_violations[rule], - all_rule_changes.removed_violations[rule], - all_rule_changes.added_fixes[rule], - all_rule_changes.removed_fixes[rule], - ) - table_lines.append( - f"| {rule} | {total} | {added_violations} | {removed_violations} " - f"| {added_fixes} | {removed_fixes} |" - ) - - lines.extend( - markdown_details( - summary=f"Changes by rule ({len(all_rule_changes.rule_codes())} rules affected)", - preface="", - content=table_lines, - ) + table_lines = [] + table_lines.append("| code | total | + violation | - violation | + fix | - fix") + table_lines.append("| ---- | ------- | --------- | -------- |") + for rule, total in sorted( + all_rule_changes.total_changes_by_rule(), + key=lambda item: item[1], # Sort by the total changes + reverse=True, + ): + added_violations, removed_violations, added_fixes, removed_fixes = ( + all_rule_changes.added_violations[rule], + all_rule_changes.removed_violations[rule], + all_rule_changes.added_fixes[rule], + all_rule_changes.removed_fixes[rule], ) + table_lines.append( + f"| {rule} | {total} | {added_violations} | {removed_violations} " + f"| {added_fixes} | {removed_fixes} |" + ) + + lines.extend( + markdown_details( + summary=f"Changes by rule ({total_affected_rules} rules affected)", + preface="", + content=table_lines, + ) + ) return "\n".join(lines) @@ -360,39 +379,6 @@ class CheckDiff(Diff): ) -def limit_rule_lines(diff: Diff, max_per_rule: int | None = 100) -> list[str]: - """ - Reduce the diff to include a maximum number of lines for each rule. - """ - if max_per_rule is None: - return diff - - counts = Counter() - reduced = [] - - for line in diff: - code = parse_diagnostic_line(line).rule_code - - # Do not omit any unparsable lines - if not code: - reduced.append(line) - continue - - counts[code] += 1 - if counts[code] > max_per_rule: - continue - - reduced.append(line) - - # Add lines summarizing the omitted changes - for code, count in counts.items(): - hidden_count = count - max_per_rule - if hidden_count > 0: - reduced.append(f"... {hidden_count} changes omitted for rule {code}") - - return reduced - - def add_permalink_to_diagnostic_line(repo: ClonedRepository, line: str) -> str: match = CHECK_DIFF_LINE_RE.match(line) if match is None: