Skip to content

Commit 2e8c57b

Browse files
committed
fix: issues related to duplicated args
1 parent ec99972 commit 2e8c57b

File tree

2 files changed

+143
-76
lines changed

2 files changed

+143
-76
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,3 +165,4 @@ cython_debug/
165165
helper/
166166
package/
167167
_autosummary/
168+
args.txt

src/pyconverter/xml2py/ast_tree.py

Lines changed: 142 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,12 @@
8383

8484
NO_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

8793
class 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

208217
def 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-
21552113
class 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+
23712440
class 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

Comments
 (0)