44import traceback
55from configparser import ConfigParser
66from contextlib import contextmanager
7+ from dataclasses import asdict , dataclass
78from pathlib import Path
8- from typing import (
9- Any ,
10- Dict ,
11- Generator ,
12- List ,
13- Mapping ,
14- NamedTuple ,
15- Optional ,
16- Set ,
17- Tuple ,
18- Union ,
19- )
9+ from typing import Any , Dict , Generator , List , Mapping , Optional , Set , Tuple , Union
2010
2111if sys .version_info >= (3 , 11 ):
2212 import tomllib
4535)
4636
4737
38+ @dataclass
4839class CommandLineArguments :
4940 platform : Literal ["auto" , "linux" , "macos" , "windows" ]
5041 archs : Optional [str ]
@@ -56,15 +47,17 @@ class CommandLineArguments:
5647 prerelease_pythons : bool
5748
5849
59- class GlobalOptions (NamedTuple ):
50+ @dataclass (frozen = True )
51+ class GlobalOptions :
6052 package_dir : Path
6153 output_dir : Path
6254 build_selector : BuildSelector
6355 test_selector : TestSelector
6456 architectures : Set [Architecture ]
6557
6658
67- class BuildOptions (NamedTuple ):
59+ @dataclass (frozen = True )
60+ class BuildOptions :
6861 globals : GlobalOptions
6962 environment : ParsedEnvironment
7063 before_all : str
@@ -104,7 +97,8 @@ def architectures(self) -> Set[Architecture]:
10497Setting = Union [Dict [str , str ], List [str ], str , int ]
10598
10699
107- class Override (NamedTuple ):
100+ @dataclass (frozen = True )
101+ class Override :
108102 select_pattern : str
109103 options : Dict [str , Setting ]
110104
@@ -548,20 +542,20 @@ def check_for_deprecated_options(self) -> None:
548542 def summary (self , identifiers : List [str ]) -> str :
549543 lines = [
550544 f"{ option_name } : { option_value !r} "
551- for option_name , option_value in sorted (self .globals . _asdict ( ).items ())
545+ for option_name , option_value in sorted (asdict ( self .globals ).items ())
552546 ]
553547
554548 build_option_defaults = self .build_options (identifier = None )
555549
556- for option_name , default_value in sorted (build_option_defaults . _asdict ( ).items ()):
550+ for option_name , default_value in sorted (asdict ( build_option_defaults ).items ()):
557551 if option_name == "globals" :
558552 continue
559553
560554 lines .append (f"{ option_name } : { default_value !r} " )
561555
562556 # if any identifiers have an overridden value, print that too
563557 for identifier in identifiers :
564- option_value = self .build_options (identifier = identifier ). _asdict ()[ option_name ]
558+ option_value = getattr ( self .build_options (identifier = identifier ), option_name )
565559 if option_value != default_value :
566560 lines .append (f" { identifier } : { option_value !r} " )
567561
0 commit comments