57
57
58
58
test_fail_cwd_file : Final [Path ] = resources_dir / "testing_temp_dir_file.py"
59
59
60
- BuildFrontend = Literal ["pip" , "build" ]
61
-
62
-
63
- def build_frontend_or_default (
64
- setting : BuildFrontend | Literal ["default" ], default : BuildFrontend = "pip"
65
- ) -> BuildFrontend :
66
- if setting == "default" :
67
- return default
68
- return setting
69
-
70
60
71
61
MANYLINUX_ARCHS : Final [tuple [str , ...]] = (
72
62
"x86_64" ,
@@ -376,6 +366,34 @@ def options_summary(self) -> Any:
376
366
return self .base_file_path .name
377
367
378
368
369
+ BuildFrontendName = Literal ["pip" , "build" ]
370
+
371
+
372
+ @dataclass (frozen = True )
373
+ class BuildFrontendConfig :
374
+ name : BuildFrontendName
375
+ args : Sequence [str ] = ()
376
+
377
+ @staticmethod
378
+ def from_config_string (config_string : str ) -> BuildFrontendConfig :
379
+ config_dict = parse_key_value_string (config_string , ["name" ], ["args" ])
380
+ name = " " .join (config_dict ["name" ])
381
+ if name not in {"pip" , "build" }:
382
+ msg = f"Unrecognised build frontend { name } , only 'pip' and 'build' are supported"
383
+ raise ValueError (msg )
384
+
385
+ name = typing .cast (BuildFrontendName , name )
386
+
387
+ args = config_dict .get ("args" ) or []
388
+ return BuildFrontendConfig (name = name , args = args )
389
+
390
+ def options_summary (self ) -> str | dict [str , str ]:
391
+ if not self .args :
392
+ return self .name
393
+ else :
394
+ return {"name" : self .name , "args" : repr (self .args )}
395
+
396
+
379
397
class NonPlatformWheelError (Exception ):
380
398
def __init__ (self ) -> None :
381
399
message = textwrap .dedent (
@@ -699,13 +717,19 @@ def fix_ansi_codes_for_github_actions(text: str) -> str:
699
717
700
718
701
719
def parse_key_value_string (
702
- key_value_string : str , positional_arg_names : list [str ] | None = None
720
+ key_value_string : str ,
721
+ positional_arg_names : Sequence [str ] | None = None ,
722
+ kw_arg_names : Sequence [str ] | None = None ,
703
723
) -> dict [str , list [str ]]:
704
724
"""
705
725
Parses a string like "docker; create_args: --some-option=value another-option"
706
726
"""
707
727
if positional_arg_names is None :
708
728
positional_arg_names = []
729
+ if kw_arg_names is None :
730
+ kw_arg_names = []
731
+
732
+ all_field_names = [* positional_arg_names , * kw_arg_names ]
709
733
710
734
shlexer = shlex .shlex (key_value_string , posix = True , punctuation_chars = ";:" )
711
735
shlexer .commenters = ""
@@ -721,6 +745,9 @@ def parse_key_value_string(
721
745
if len (field ) > 1 and field [1 ] == ":" :
722
746
field_name = field [0 ]
723
747
values = field [2 :]
748
+ if field_name not in all_field_names :
749
+ msg = f"Failed to parse { key_value_string !r} . Unknown field name { field_name !r} "
750
+ raise ValueError (msg )
724
751
else :
725
752
try :
726
753
field_name = positional_arg_names [field_i ]
0 commit comments