5757
5858test_fail_cwd_file : Final [Path ] = resources_dir / "testing_temp_dir_file.py"
5959
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-
7060
7161MANYLINUX_ARCHS : Final [tuple [str , ...]] = (
7262 "x86_64" ,
@@ -376,6 +366,34 @@ def options_summary(self) -> Any:
376366 return self .base_file_path .name
377367
378368
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+
379397class NonPlatformWheelError (Exception ):
380398 def __init__ (self ) -> None :
381399 message = textwrap .dedent (
@@ -699,13 +717,19 @@ def fix_ansi_codes_for_github_actions(text: str) -> str:
699717
700718
701719def 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 ,
703723) -> dict [str , list [str ]]:
704724 """
705725 Parses a string like "docker; create_args: --some-option=value another-option"
706726 """
707727 if positional_arg_names is None :
708728 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 ]
709733
710734 shlexer = shlex .shlex (key_value_string , posix = True , punctuation_chars = ";:" )
711735 shlexer .commenters = ""
@@ -721,6 +745,9 @@ def parse_key_value_string(
721745 if len (field ) > 1 and field [1 ] == ":" :
722746 field_name = field [0 ]
723747 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 )
724751 else :
725752 try :
726753 field_name = positional_arg_names [field_i ]
0 commit comments