/
/
/
1#!/usr/bin/env python3
2"""Parse manifest.json files to extract dependency changes.
3
4This script compares old and new versions of manifest.json files
5to identify changes in the requirements field.
6"""
7
8# ruff: noqa: T201
9import json
10import sys
11
12
13def parse_requirements(manifest_content: str) -> list[str]:
14 """Extract requirements from manifest JSON content.
15
16 :param manifest_content: JSON string content of manifest file.
17 """
18 try:
19 data = json.loads(manifest_content)
20 return data.get("requirements", [])
21 except (json.JSONDecodeError, KeyError):
22 return []
23
24
25def main() -> int:
26 """Parse manifest dependency changes."""
27 if len(sys.argv) != 3:
28 print("Usage: parse_manifest_deps.py <old_manifest> <new_manifest>")
29 return 1
30
31 old_file = sys.argv[1]
32 new_file = sys.argv[2]
33
34 try:
35 with open(old_file) as f:
36 old_reqs = parse_requirements(f.read())
37 except FileNotFoundError:
38 old_reqs = []
39
40 try:
41 with open(new_file) as f:
42 new_reqs = parse_requirements(f.read())
43 except FileNotFoundError:
44 print("Error: New manifest file not found")
45 return 1
46
47 # Find added, removed, and unchanged requirements
48 old_set = set(old_reqs)
49 new_set = set(new_reqs)
50
51 added = new_set - old_set
52 removed = old_set - new_set
53 unchanged = old_set & new_set
54
55 if not added and not removed:
56 print("No dependency changes")
57 return 0
58
59 # Output in markdown format
60 if added:
61 print("**Added:**")
62 for req in sorted(added):
63 print(f"- â
`{req}`")
64 print()
65
66 if removed:
67 print("**Removed:**")
68 for req in sorted(removed):
69 print(f"- â `{req}`")
70 print()
71
72 if unchanged and (added or removed):
73 print("<details>")
74 print("<summary>Unchanged dependencies</summary>")
75 print()
76 for req in sorted(unchanged):
77 print(f"- `{req}`")
78 print()
79 print("</details>")
80
81 return 0
82
83
84if __name__ == "__main__":
85 sys.exit(main())
86