(lines, name, before_text, after_text)
| 114 | |
| 115 | |
| 116 | def append_text_diff(lines, name, before_text, after_text): |
| 117 | diff = list( |
| 118 | difflib.unified_diff( |
| 119 | before_text.splitlines(), |
| 120 | after_text.splitlines(), |
| 121 | fromfile=f"before/{name}", |
| 122 | tofile=f"after/{name}", |
| 123 | lineterm="", |
| 124 | ) |
| 125 | ) |
| 126 | if not diff: |
| 127 | return |
| 128 | truncated = len(diff) > MAX_DIFF_LINES_PER_FILE |
| 129 | if truncated: |
| 130 | diff = diff[:MAX_DIFF_LINES_PER_FILE] |
| 131 | lines.append("<details>") |
| 132 | lines.append(f"<summary>Unified diff for <code>{name}</code></summary>") |
| 133 | lines.append("") |
| 134 | lines.append("```diff") |
| 135 | lines.extend(diff) |
| 136 | if truncated: |
| 137 | lines.append( |
| 138 | f"... truncated after {MAX_DIFF_LINES_PER_FILE} lines; inspect the zip " |
| 139 | "artifacts for the full diff." |
| 140 | ) |
| 141 | lines.append("```") |
| 142 | lines.append("") |
| 143 | lines.append("</details>") |
| 144 | lines.append("") |
| 145 | |
| 146 | |
| 147 | def metadata_line(label, manifest): |
no test coverage detected