8383
8484NO_RESIZE_LIST = ["Variablelist" ]
8585
86+ MISSING_ARGUMENT_DESCRIPTION = """The description of the argument is missing in the Python function.
87+ Please, refer to the product documentation for further information."""
88+
89+ ADDITIONAL_ARGUMENT_DESCRIPTION = """Additional arguments can be passed to the intial command.
90+ Please, refer to the product documentation for further information."""
91+
8692
8793class NameMap :
8894 def __init__ (self , name_map ):
@@ -138,6 +144,9 @@ def to_py_arg_name(name: str) -> str:
138144 initial_arg = str (name ).lower ().strip ()
139145 arg = initial_arg
140146 if arg in ["--" , "–" , "" ]:
147+ return ""
148+ elif "--" in arg :
149+ arg = arg .replace ("--" , "" )
141150 return arg
142151 elif arg .isdigit ():
143152 return ""
@@ -207,7 +216,7 @@ def str_types(types, join_str: str) -> str:
207216
208217def to_py_signature (py_arg_name , types ) -> str :
209218 """Return the Python signature of the argument."""
210- if py_arg_name not in [ "--" , "–" , "" ] :
219+ if py_arg_name != "" :
211220 kwarg = f'{ py_arg_name } : { str_types (types , " | " )} = ""'
212221 else :
213222 kwarg = None
@@ -1624,7 +1633,7 @@ def args(self):
16241633 # rename duplicate arguments
16251634 if len (args ) != len (set (args )):
16261635 for arg in args :
1627- if arg not in [ "" , "--" , "–" ] :
1636+ if arg != "" :
16281637 i = 0
16291638 if args .count (arg ) > 1 :
16301639 for j in range (len (args )):
@@ -2101,64 +2110,13 @@ class ProductName(Element):
21012110 pass
21022111
21032112
2104- class ArgumentList :
2105- def __init__ (self , py_name : str , list_entry : VarlistEntry , args : List ) -> None :
2106-
2107- self ._py_name = py_name
2108- self ._list_entry = list_entry
2109- self ._arguments = []
2110- self ._initial_args = args
2111- self ._parse_list_entry ()
2112-
2113- def _parse_list_entry (self ):
2114- for item in self ._list_entry :
2115- if isinstance (item , VarlistEntry ):
2116- argument_obj = Argument (item , self ._initial_args )
2117- additional_args = argument_obj .multiple_args
2118- if len (additional_args ) > 0 :
2119- for arg in additional_args :
2120- arg_name = arg .py_arg_name
2121- if (arg_name in self ._initial_args ) and (arg_name not in self .py_arg_names ):
2122- self ._arguments .append (arg )
2123-
2124- else :
2125- self ._arguments .append (argument_obj )
2126-
2127- def __iadd__ (self , argument_list ):
2128- for arg in argument_list .arguments :
2129- arg_name = arg .py_arg_name
2130- if (arg_name in self ._initial_args ) and (arg_name not in self .py_arg_names ):
2131- self ._arguments .append (arg )
2132- return self
2133-
2134- @property
2135- def arguments (self ):
2136- return self ._arguments
2137-
2138- @arguments .setter
2139- def arguments (self , argument ):
2140- self ._arguments .append (argument )
2141-
2142- @property
2143- def py_name (self ):
2144- return self ._py_name
2145-
2146- @property
2147- def initial_args (self ):
2148- return self ._initial_args
2149-
2150- @property
2151- def py_arg_names (self ):
2152- return [arg .py_arg_name for arg in self ._arguments ]
2153-
2154-
21552113class Argument :
21562114 """Argument object."""
21572115
21582116 def __init__ (
21592117 self ,
21602118 element : str | Element ,
2161- initial_argument : List ,
2119+ initial_arguments : List ,
21622120 description : Element | str | None = None ,
21632121 ) -> None :
21642122 if description is None :
@@ -2177,7 +2135,7 @@ def __init__(
21772135 name = element
21782136 self ._name = name
21792137 self ._description = description
2180- self ._initial_argument = initial_argument
2138+ self ._initial_arguments = initial_arguments
21812139
21822140 @property
21832141 def py_arg_name (self ) -> str :
@@ -2204,27 +2162,26 @@ def multiple_args(self):
22042162 if not self .is_arg_elipsis :
22052163 for item_name in split_name :
22062164 arg_name = item_name .strip ()
2207- new_arg = Argument (arg_name , self ._initial_argument , self ._description )
2208- if new_arg .py_arg_name != "" :
2209- additional_args .append (new_arg )
2165+ new_arg = Argument (arg_name , self ._initial_arguments , self ._description )
2166+ additional_args .append (new_arg )
22102167 else :
22112168
22122169 complete_args = get_complete_args_from_initial_arg (
2213- elipsis_args = split_name , initial_args = self ._initial_argument
2170+ elipsis_args = split_name , initial_args = self ._initial_arguments
22142171 )
22152172
22162173 if len (complete_args ) > 0 :
22172174 for item in complete_args :
2218- new_arg = Argument (item , self ._initial_argument , self ._description )
2219- if new_arg .py_arg_name != "" :
2220- additional_args .append (new_arg )
2175+ new_arg = Argument (item , self ._initial_arguments , self ._description )
2176+ additional_args .append (new_arg )
22212177
22222178 else :
22232179
22242180 for i , item_name in enumerate (split_name ):
22252181 item_name = item_name .strip ()
22262182 if item_name == "" :
2227- continue
2183+ new_arg = Argument (arg_name , self ._initial_arguments , self ._description )
2184+ additional_args .append (new_arg )
22282185 elif is_elipsis (item_name ):
22292186
22302187 if "+" in split_name [i + 1 ]:
@@ -2244,7 +2201,7 @@ def multiple_args(self):
22442201 arg_name = split_name [i + 1 ].strip ()
22452202 arg_name = f"{ arg_name [:initial_pos_final ]} { j } { arg_name [end_pos_final :]} " # noqa : E501
22462203 new_arg = Argument (
2247- arg_name , self ._initial_argument , self ._description
2204+ arg_name , self ._initial_arguments , self ._description
22482205 )
22492206 if new_arg .py_arg_name != "" :
22502207 additional_args .append (new_arg )
@@ -2276,15 +2233,14 @@ def multiple_args(self):
22762233 for j in range (number_iter_prev + 1 , number_iter_next ):
22772234 arg_name = f"{ name_iter_prev } { j } "
22782235 new_arg = Argument (
2279- arg_name , self ._initial_argument , self ._description
2236+ arg_name , self ._initial_arguments , self ._description
22802237 )
2281- if new_arg .py_arg_name != "" :
2282- additional_args .append (new_arg )
2238+ additional_args .append (new_arg )
22832239 else :
22842240 additional_args .append (
22852241 Argument (
22862242 name_iter_next ,
2287- self ._initial_argument ,
2243+ self ._initial_arguments ,
22882244 self ._description ,
22892245 )
22902246 )
@@ -2339,7 +2295,7 @@ def to_py_docstring(
23392295 self , max_length = 100 , indent = "" , links = None , base_url = None , fcache = None
23402296 ) -> List [str ]:
23412297 """Return a list of string to enable converting the element to an RST format."""
2342- if "," not in self . py_arg_name and self .py_arg_name != "" :
2298+ if self .py_arg_name != "" :
23432299 docstring = [f'{ indent } { self .py_arg_name } : { str_types (self .types , " or " )} ' ]
23442300 if isinstance (self ._description , str ):
23452301 rst_description = self ._description
@@ -2368,6 +2324,119 @@ def to_py_docstring(
23682324 return docstring
23692325
23702326
2327+ class ArgumentList :
2328+ def __init__ (self , py_name : str , list_entry : VarlistEntry , args : List ) -> None :
2329+
2330+ self ._py_name = py_name
2331+ self ._list_entry = list_entry
2332+ self ._arguments = []
2333+ self ._additional_args = []
2334+ self ._initial_args = args
2335+ self ._parse_list_entry ()
2336+
2337+ def _parse_list_entry (self ):
2338+ "Parse the list entry to get the main arguments and the additional ones."
2339+ temp_args = {}
2340+ for item in self ._list_entry :
2341+ if isinstance (item , VarlistEntry ):
2342+ argument_obj = Argument (item , self ._initial_args )
2343+ additional_args = argument_obj .multiple_args
2344+ if len (additional_args ) > 0 :
2345+ for arg in additional_args :
2346+ arg_name = arg .py_arg_name
2347+ if (arg_name in self ._initial_args ) and (
2348+ arg_name == "" or arg_name not in self .py_arg_names
2349+ ):
2350+ temp_args [arg_name ] = arg
2351+
2352+ else :
2353+ temp_args [argument_obj .py_arg_name ] = argument_obj
2354+
2355+ for initial_arg in self ._initial_args :
2356+ if initial_arg in temp_args .keys ():
2357+ self ._arguments .append (temp_args [initial_arg ])
2358+ else :
2359+ self ._arguments .append (
2360+ Argument (initial_arg , self ._initial_args , MISSING_ARGUMENT_DESCRIPTION )
2361+ ) # description is missing
2362+
2363+ is_additional_arg = False
2364+ if len (temp_args ) != len (self ._initial_args ):
2365+ for arg in temp_args :
2366+ if arg not in self .py_arg_names :
2367+ self ._additional_args .append (temp_args [arg ])
2368+ is_additional_arg = True
2369+
2370+ if is_additional_arg and "addional_command_arg" not in self .py_arg_names :
2371+ self ._arguments .append (
2372+ Argument (
2373+ "addional_command_arg" , self ._initial_args , ADDITIONAL_ARGUMENT_DESCRIPTION
2374+ )
2375+ )
2376+
2377+ def __iadd__ (self , argument_list ):
2378+ temp_args = {}
2379+ for arg in argument_list .arguments :
2380+ arg_name = arg .py_arg_name
2381+ if (arg_name in self ._initial_args ) and (
2382+ arg_name == "" or arg_name not in self .py_arg_names
2383+ ):
2384+ temp_args [arg_name ] = arg
2385+
2386+ for initial_arg in self ._initial_args :
2387+ if initial_arg in temp_args .keys ():
2388+ if initial_arg not in self .py_arg_names :
2389+ self ._arguments .append (temp_args [initial_arg ])
2390+ else :
2391+ self ._arguments [self .py_arg_names .index (initial_arg )] = temp_args [initial_arg ]
2392+ else :
2393+ if initial_arg not in self .py_arg_names :
2394+ self ._arguments .append (
2395+ Argument (initial_arg , self ._initial_args , MISSING_ARGUMENT_DESCRIPTION )
2396+ )
2397+
2398+ is_additional_arg = False
2399+ if len (temp_args ) != len (self ._initial_args ):
2400+ for arg in temp_args :
2401+ if arg not in self .py_arg_names :
2402+ self ._additional_args .append (temp_args [arg ])
2403+ is_additional_arg = True
2404+
2405+ if is_additional_arg and "addional_command_arg" not in self .py_arg_names :
2406+ self ._arguments .append (
2407+ Argument (
2408+ "addional_command_arg" , self ._initial_args , ADDITIONAL_ARGUMENT_DESCRIPTION
2409+ )
2410+ )
2411+
2412+ return self
2413+
2414+ @property
2415+ def arguments (self ) -> List [Argument ]:
2416+ "Return a list of Argument objects."
2417+ return self ._arguments
2418+
2419+ @arguments .setter
2420+ def arguments (self , argument ):
2421+ self ._arguments .append (argument )
2422+
2423+ @property
2424+ def py_name (self ):
2425+ return self ._py_name
2426+
2427+ @property
2428+ def initial_args (self ):
2429+ return self ._initial_args
2430+
2431+ @property
2432+ def py_arg_names (self ):
2433+ return [arg .py_arg_name for arg in self ._arguments ]
2434+
2435+ @property
2436+ def additional_args (self ):
2437+ return self ._additional_args
2438+
2439+
23712440class XMLCommand (Element ):
23722441 """Provides the XML command from the documentation."""
23732442
@@ -2454,17 +2523,14 @@ def arg_desc(self) -> List[Argument]:
24542523 else :
24552524 last_line = ""
24562525 with open (arg_file , "a" ) as f :
2457- if last_line != f"{ arguments .py_arg_names } \n " :
2526+ if last_line != f"py_arg_name : { arguments .py_arg_names } \n " :
24582527 f .write ("--------------------------------------------------\n " )
24592528 f .write (f"{ self .py_name } : { self .group } \n " )
2529+ f .write ("initial_args : " )
24602530 f .write (f"{ arguments .initial_args } \n " )
2531+ f .write ("py_arg_name : " )
24612532 f .write (f"{ arguments .py_arg_names } \n " )
24622533
2463- # for arg in arguments.initial_args:
2464- # if arg not in arguments.py_arg_names:
2465- # new_arg = Argument(arg, arguments.initial_args, "")
2466- # arguments.arguments.append(new_arg)
2467-
24682534 return arguments .arguments
24692535
24702536 else :
@@ -2906,7 +2972,7 @@ def py_source(self, custom_functions=None, indent=""):
29062972 command = 'command = f"' + self .name
29072973 for arg in self .arg_desc :
29082974 name = arg .py_arg_name
2909- if name in [ "--" , "–" , "" ] :
2975+ if name == "" :
29102976 command += ","
29112977 else :
29122978 command += ",{"
0 commit comments