()
| 163 | |
| 164 | |
| 165 | def main(): |
| 166 | dry_run = "--dry-run" in sys.argv |
| 167 | diff_only = "--diff" in sys.argv |
| 168 | |
| 169 | if not SRC_PATH.exists(): |
| 170 | print(f"Source not found: {SRC_PATH}") |
| 171 | sys.exit(1) |
| 172 | |
| 173 | text = SRC_PATH.read_text(encoding="utf-8") |
| 174 | entries = parse_table(text) |
| 175 | |
| 176 | from collections import Counter |
| 177 | scopes = Counter(e["scope"] for e in entries) |
| 178 | classes = Counter(e["device_class"] for e in entries) |
| 179 | |
| 180 | print(f"Parsed {len(entries)} exemption entries") |
| 181 | print(f" By scope: {dict(scopes)}") |
| 182 | print(f" By class: {dict(classes)}") |
| 183 | |
| 184 | l1_entries = [e for e in entries if e["scope"] == "l1"] |
| 185 | print(f"\nL1-level exemptions ({len(l1_entries)}):") |
| 186 | for e in l1_entries: |
| 187 | print(f" {e['classification_code']} {e['product_name'][:40]} [{e['device_class']}]") |
| 188 | |
| 189 | if diff_only: |
| 190 | old = _load_existing_entries() |
| 191 | d = _diff_entries(old, entries) |
| 192 | print(f"\n[diff] old={len(old)} new={len(entries)}") |
| 193 | print(f" added={d['added_count']} removed={d['removed_count']} changed={d['changed_count']}") |
| 194 | if d["added"]: |
| 195 | print(f" added (first 15):") |
| 196 | for k in d["added"]: |
| 197 | print(f" {k}") |
| 198 | if d["removed"]: |
| 199 | print(f" removed (first 15):") |
| 200 | for k in d["removed"]: |
| 201 | print(f" {k}") |
| 202 | return |
| 203 | |
| 204 | if dry_run: |
| 205 | print("\n[DRY RUN] First 5 L3 entries:") |
| 206 | l3 = [e for e in entries if e["scope"] == "l3"] |
| 207 | for e in l3[:5]: |
| 208 | print(f" {e['classification_code']} {e['product_name'][:40]} [{e['device_class']}]") |
| 209 | else: |
| 210 | out = { |
| 211 | "version": "2025", |
| 212 | "source": "NMPA 2025 Clinical Evaluation Exemption List", |
| 213 | "effective_date": "2025-05-15", |
| 214 | "total_entries": len(entries), |
| 215 | "entries": entries, |
| 216 | } |
| 217 | OUT_PATH.parent.mkdir(parents=True, exist_ok=True) |
| 218 | with open(OUT_PATH, "w", encoding="utf-8") as f: |
| 219 | json.dump(out, f, ensure_ascii=False, indent=2) |
| 220 | print(f"\nWrote {OUT_PATH}") |
| 221 | |
| 222 |
no test coverage detected