12
12
# See the License for the specific language governing permissions and
13
13
# limitations under the License.
14
14
15
+ from __future__ import annotations
16
+
15
17
import argparse
16
18
import dataclasses
17
19
import logging
18
20
import sys
19
21
import typing
20
- from collections .abc import Sequence
22
+ from typing import override
23
+
24
+ if typing .TYPE_CHECKING :
25
+ from collections .abc import Sequence
26
+ from typing import Never , TextIO
27
+
28
+ from _typeshed import SupportsWrite
21
29
22
30
type ExitCode = int
23
31
24
- def main (args : Sequence [str ], stdout : typing .TextIO , stderr : typing .TextIO ) -> ExitCode :
32
+
33
+ def main (args : Sequence [str ], stdout : TextIO , stderr : TextIO ) -> ExitCode :
25
34
try :
26
35
parsed_args = parse_args (args [0 ], args [1 :], stdout )
27
36
except MyArgumentParser .Error as e :
28
37
if e .exit_code != 0 :
29
38
print (f"ERROR: invalid command-line arguments: { e } " , file = stderr )
30
- print (f "Run with --help for help" , file = stderr )
39
+ print ("Run with --help for help" , file = stderr )
31
40
return e .exit_code
32
41
42
+ print (f"Successfully parsed arguments: { parsed_args !r} " )
33
43
return 0
34
44
45
+
35
46
@dataclasses .dataclass (frozen = True )
36
47
class GetIssueNumberCommand :
37
48
github_ref : str
38
49
github_event_name : str
39
50
default_github_issue : int
40
51
52
+
41
53
@dataclasses .dataclass (frozen = True )
42
54
class ParsedArgs :
43
55
log_level : int
44
56
command : GetIssueNumberCommand
45
57
46
- class MyArgumentParser (argparse .ArgumentParser ):
47
58
48
- def __init__ (self , prog : str , stdout : typing .TextIO ) -> None :
59
+ class MyArgumentParser (argparse .ArgumentParser ):
60
+ def __init__ (self , prog : str , stdout : SupportsWrite [str ]) -> None :
49
61
super ().__init__ (prog = prog , usage = "%(prog)s <command> [options]" )
50
62
self .stdout = stdout
51
63
52
- @typing . override
53
- def exit (self , status : int = 0 , message : str | None = None ) -> typing . Never :
64
+ @override
65
+ def exit (self , status : int = 0 , message : str | None = None ) -> Never :
54
66
raise self .Error (exit_code = status , message = message )
55
67
56
- @typing . override
57
- def error (self , message : str ) -> typing . Never :
68
+ @override
69
+ def error (self , message : str ) -> Never :
58
70
self .exit (2 , message )
59
71
60
- @typing . override
61
- def print_usage (self , file : typing . TextIO | None = None ) -> None :
72
+ @override
73
+ def print_usage (self , file : SupportsWrite [ str ] | None = None ) -> None :
62
74
file = file if file is not None else self .stdout
63
75
super ().print_usage (file )
64
76
65
- @typing . override
66
- def print_help (self , file : typing . TextIO | None = None ) -> None :
77
+ @override
78
+ def print_help (self , file : SupportsWrite [ str ] | None = None ) -> None :
67
79
file = file if file is not None else self .stdout
68
80
super ().print_help (file )
69
81
@@ -73,9 +85,19 @@ def __init__(self, exit_code: ExitCode, message: str | None) -> None:
73
85
self .exit_code = exit_code
74
86
75
87
76
- def parse_args (prog : str , args : Sequence [str ], stdout : typing . TextIO ) -> ExitCode :
88
+ def parse_args (prog : str , args : Sequence [str ], stdout : TextIO ) -> ParsedArgs :
77
89
arg_parser = MyArgumentParser (prog , stdout )
78
90
parsed_args = arg_parser .parse_args (args )
91
+ print (f"parsed_args: { parsed_args !r} " )
92
+ return ParsedArgs (
93
+ log_level = logging .INFO ,
94
+ command = GetIssueNumberCommand (
95
+ github_ref = "sample_github_ref" ,
96
+ github_event_name = "sample_github_event_name" ,
97
+ default_github_issue = 123456 ,
98
+ ),
99
+ )
100
+
79
101
80
102
if __name__ == "__main__" :
81
103
try :
0 commit comments