(before_path, after_path, before_entries, after_entries, output_path)
| 158 | |
| 159 | |
| 160 | def write_report(before_path, after_path, before_entries, after_entries, output_path): |
| 161 | before_manifest = load_manifest(before_entries) |
| 162 | after_manifest = load_manifest(after_entries) |
| 163 | before_names = set(before_entries) |
| 164 | after_names = set(after_entries) |
| 165 | compare_names = sorted((before_names | after_names) - {MANIFEST_NAME}) |
| 166 | added_files = sorted(after_names - before_names - {MANIFEST_NAME}) |
| 167 | removed_files = sorted(before_names - after_names - {MANIFEST_NAME}) |
| 168 | changed_files = [ |
| 169 | name |
| 170 | for name in compare_names |
| 171 | if name in before_entries |
| 172 | and name in after_entries |
| 173 | and before_entries[name]["data"] != after_entries[name]["data"] |
| 174 | ] |
| 175 | |
| 176 | lines = [ |
| 177 | "# OpenCC Resource Zip Diff", |
| 178 | "", |
| 179 | "## Inputs", |
| 180 | "", |
| 181 | f"- Before zip: `{before_path}`", |
| 182 | f"- After zip: `{after_path}`", |
| 183 | metadata_line("Before manifest", before_manifest), |
| 184 | metadata_line("After manifest", after_manifest), |
| 185 | "", |
| 186 | "## Summary", |
| 187 | "", |
| 188 | f"- Added files: {len(added_files)}", |
| 189 | f"- Removed files: {len(removed_files)}", |
| 190 | f"- Changed files: {len(changed_files)}", |
| 191 | f"- Unchanged files: {len(compare_names) - len(added_files) - len(removed_files) - len(changed_files)}", |
| 192 | "", |
| 193 | ] |
| 194 | |
| 195 | if added_files: |
| 196 | lines.append("## Added Files") |
| 197 | lines.append("") |
| 198 | for name in added_files: |
| 199 | entries = dictionary_file_summary(name, after_entries[name]["data"]) |
| 200 | entry_suffix = f", {len(entries)} entries" if entries is not None else "" |
| 201 | lines.append(f"- `{name}` ({after_entries[name]['size']} bytes{entry_suffix})") |
| 202 | append_dictionary_file_examples(lines, entries) |
| 203 | lines.append("") |
| 204 | if removed_files: |
| 205 | lines.append("## Removed Files") |
| 206 | lines.append("") |
| 207 | for name in removed_files: |
| 208 | entries = dictionary_file_summary(name, before_entries[name]["data"]) |
| 209 | entry_suffix = f", {len(entries)} entries" if entries is not None else "" |
| 210 | lines.append( |
| 211 | f"- `{name}` ({before_entries[name]['size']} bytes{entry_suffix})" |
| 212 | ) |
| 213 | append_dictionary_file_examples(lines, entries) |
| 214 | lines.append("") |
| 215 | |
| 216 | if changed_files: |
| 217 | lines.append("## Changed Files") |
no test coverage detected