11#!/usr/bin/env python3
22
3+ from __future__ import annotations
4+
35import argparse
4- import os
56import re
67import sys
78import time
89from contextlib import contextmanager
10+ from pathlib import Path
11+ from typing import TYPE_CHECKING , Sequence
12+
13+ from typing_extensions import TypeAlias
914
10- script_dir = os .path .dirname (__file__ )
11- package_dir = os .path .abspath (os .path .join (script_dir , '..' ))
15+ if TYPE_CHECKING :
16+ from collections .abc import Iterator
17+
18+ script_dir = Path (__file__ ).parent
19+ package_dir = script_dir .parent
1220
1321RELEASE_TYPE = {'a' : 'alpha' , 'b' : 'beta' }
1422
23+ VersionInfo : TypeAlias = tuple [int , int , int , str , int ]
24+
1525
16- def stringify_version (version_info , in_develop = True ):
26+ def stringify_version (
27+ version_info : VersionInfo , in_develop : bool = True ,
28+ ) -> str :
1729 version = '.' .join (str (v ) for v in version_info [:3 ])
1830 if not in_develop and version_info [3 ] != 'final' :
1931 version += version_info [3 ][0 ] + str (version_info [4 ])
2032
2133 return version
2234
2335
24- def bump_version (path , version_info , in_develop = True ) -> None :
36+ def bump_version (
37+ path : Path , version_info : VersionInfo , in_develop : bool = True ,
38+ ) -> None :
2539 version = stringify_version (version_info , in_develop )
2640
2741 with open (path , encoding = 'utf-8' ) as f :
@@ -42,7 +56,7 @@ def bump_version(path, version_info, in_develop=True) -> None:
4256 f .write ('\n ' .join (lines ) + '\n ' )
4357
4458
45- def parse_version (version ) :
59+ def parse_version (version : str ) -> VersionInfo :
4660 matched = re .search (r'^(\d+)\.(\d+)$' , version )
4761 if matched :
4862 major , minor = matched .groups ()
@@ -73,7 +87,7 @@ class Skip(Exception):
7387
7488
7589@contextmanager
76- def processing (message ) :
90+ def processing (message : str ) -> Iterator [ None ] :
7791 try :
7892 print (message + ' ... ' , end = '' )
7993 yield
@@ -87,7 +101,7 @@ def processing(message):
87101
88102
89103class Changes :
90- def __init__ (self , path ) :
104+ def __init__ (self , path : Path ) -> None :
91105 self .path = path
92106 self .fetch_version ()
93107
@@ -120,16 +134,18 @@ def finalize_release_date(self) -> None:
120134 f .write ('=' * len (heading ) + '\n ' )
121135 f .write (self .filter_empty_sections (body ))
122136
123- def add_release (self , version_info ) -> None :
137+ def add_release (self , version_info : VersionInfo ) -> None :
124138 if version_info [- 2 :] in (('beta' , 0 ), ('final' , 0 )):
125139 version = stringify_version (version_info )
126140 else :
127141 reltype = version_info [3 ]
128- version = (f'{ stringify_version (version_info )} '
129- f'{ RELEASE_TYPE .get (reltype , reltype )} { version_info [4 ] or "" } ' )
142+ version = (
143+ f'{ stringify_version (version_info )} '
144+ f'{ RELEASE_TYPE .get (reltype , reltype )} { version_info [4 ] or "" } '
145+ )
130146 heading = 'Release %s (in development)' % version
131147
132- with open (os . path . join ( script_dir , 'CHANGES_template.rst' ) , encoding = 'utf-8' ) as f :
148+ with open (script_dir / 'CHANGES_template.rst' , encoding = 'utf-8' ) as f :
133149 f .readline () # skip first two lines
134150 f .readline ()
135151 tmpl = f .read ()
@@ -145,11 +161,11 @@ def add_release(self, version_info) -> None:
145161 f .write ('\n ' )
146162 f .write (body )
147163
148- def filter_empty_sections (self , body ) :
164+ def filter_empty_sections (self , body : str ) -> str :
149165 return re .sub ('^\n .+\n -{3,}\n +(?=\n .+\n [-=]{3,}\n )' , '' , body , flags = re .MULTILINE )
150166
151167
152- def parse_options (argv ) :
168+ def parse_options (argv : Sequence [ str ]) -> argparse . Namespace :
153169 parser = argparse .ArgumentParser ()
154170 parser .add_argument ('version' , help = 'A version number (cf. 1.6b0)' )
155171 parser .add_argument ('--in-develop' , action = 'store_true' )
@@ -162,11 +178,11 @@ def main() -> None:
162178 options = parse_options (sys .argv [1 :])
163179
164180 with processing ("Rewriting sphinx/__init__.py" ):
165- bump_version (os . path . join ( package_dir , 'sphinx/ __init__.py' ) ,
181+ bump_version (package_dir / 'sphinx' / ' __init__.py' ,
166182 options .version , options .in_develop )
167183
168184 with processing ('Rewriting CHANGES' ):
169- changes = Changes (os . path . join ( package_dir , 'CHANGES.rst' ) )
185+ changes = Changes (package_dir / 'CHANGES.rst' )
170186 if changes .version_info == options .version :
171187 if changes .in_development :
172188 changes .finalize_release_date ()
0 commit comments