|
34 | 34 | Self, |
35 | 35 | overload, |
36 | 36 | ) |
| 37 | +from urllib.request import urlopen |
37 | 38 |
|
38 | 39 | COMMASPACE = ", " |
39 | 40 | SPACE = " " |
@@ -71,6 +72,11 @@ def get( |
71 | 72 | @overload |
72 | 73 | def get(self, key: Literal["sign_gpg"], default: bool | None = None) -> bool: ... |
73 | 74 |
|
| 75 | + @overload |
| 76 | + def get( |
| 77 | + self, key: Literal["security_release"], default: bool | None = None |
| 78 | + ) -> bool: ... |
| 79 | + |
74 | 80 | @overload |
75 | 81 | def get(self, key: Literal["release"], default: Tag | None = None) -> Tag: ... |
76 | 82 |
|
@@ -98,6 +104,9 @@ def __getitem__(self, key: Literal["ssh_key"]) -> str | None: ... |
98 | 104 | @overload |
99 | 105 | def __getitem__(self, key: Literal["sign_gpg"]) -> bool: ... |
100 | 106 |
|
| 107 | + @overload |
| 108 | + def __getitem__(self, key: Literal["security_release"]) -> bool: ... |
| 109 | + |
101 | 110 | @overload |
102 | 111 | def __getitem__(self, key: Literal["release"]) -> Tag: ... |
103 | 112 |
|
@@ -127,6 +136,9 @@ def __setitem__(self, key: Literal["ssh_key"], value: str | None) -> None: ... |
127 | 136 | @overload |
128 | 137 | def __setitem__(self, key: Literal["sign_gpg"], value: bool) -> None: ... |
129 | 138 |
|
| 139 | + @overload |
| 140 | + def __setitem__(self, key: Literal["security_release"], value: bool) -> None: ... |
| 141 | + |
130 | 142 | @overload |
131 | 143 | def __setitem__(self, key: Literal["release"], value: Tag) -> None: ... |
132 | 144 |
|
@@ -196,6 +208,13 @@ def is_release_candidate(self) -> bool: |
196 | 208 | def is_feature_freeze_release(self) -> bool: |
197 | 209 | return self.level == "b" and self.serial == 1 |
198 | 210 |
|
| 211 | + @property |
| 212 | + def is_security_release(self) -> bool: |
| 213 | + url = "https://peps.python.org/api/release-cycle.json" |
| 214 | + with urlopen(url) as response: |
| 215 | + data = json.loads(response.read()) |
| 216 | + return str(data[self.basic_version]["status"]) == "security" |
| 217 | + |
199 | 218 | @property |
200 | 219 | def nickname(self) -> str: |
201 | 220 | return self.text.replace(".", "") |
@@ -465,10 +484,9 @@ def tweak_readme(tag: Tag, filename: str = "README.rst") -> None: |
465 | 484 | print(f"Updating {filename}...", end=" ") |
466 | 485 | readme = Path(filename) |
467 | 486 |
|
468 | | - # Update first line: "This is Python version 3.14.0 alpha 7" |
| 487 | + # Update first line: "This is Python version X.Y.Z {release_level} N" |
469 | 488 | # and update length of underline in second line to match. |
470 | | - content = readme.read_text() |
471 | | - lines = content.split("\n") |
| 489 | + lines = readme.read_text().split("\n") |
472 | 490 | this_is = f"This is Python version {tag.long_name}" |
473 | 491 | underline = "=" * len(this_is) |
474 | 492 | lines[0] = this_is |
|
0 commit comments