Skip to content

Commit 1d4dfbc

Browse files
authored
Merge pull request #34 from CDAT/issue_31
fix #31
2 parents c42cbc5 + f9805f9 commit 1d4dfbc

File tree

3 files changed

+139
-87
lines changed

3 files changed

+139
-87
lines changed

cdp/cdp_parser.py

Lines changed: 76 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,10 @@ def _was_command_used(self, cmdline_arg):
5656
run the script that has this parser."""
5757
# self.cmd_used is like: ['something.py', '-p', 'test.py', '--s1', 'something']
5858
for cmd in self.cmd_used:
59-
if cmdline_arg in cmd:
60-
return True
59+
# Sometimes, a command is run with '=': 'driver.py --something=this'
60+
for c in cmd.split('='):
61+
if cmdline_arg == c:
62+
return True
6163
return False
6264

6365
def _is_arg_default_value(self, arg):
@@ -67,11 +69,7 @@ def _is_arg_default_value(self, arg):
6769
"""
6870
# each cmdline_arg is either '-*' or '--*'.
6971
for cmdline_arg in self._option_string_actions:
70-
#print('examining arg == self._option_string_actions[cmdline_arg].dest: {} == {}'.format(arg, self._option_string_actions[cmdline_arg].dest))
71-
#print('examining cmdline_arg in self.cmd_used: {} in {}'.format(cmdline_arg, self.cmd_used))
72-
# if arg == self._option_string_actions[cmdline_arg].dest and cmdline_arg in self.cmd_used:
7372
if arg == self._option_string_actions[cmdline_arg].dest and self._was_command_used(cmdline_arg):
74-
#print('{} IS NOT SET TO ITS DEFAULT VALUE!'.format(arg))
7573
return False
7674
return True
7775

@@ -89,7 +87,7 @@ def _parse_arguments(self):
8987
if self.__args_namespace is None:
9088
self.__args_namespace = self.parse_args()
9189

92-
def get_orig_parameters(self, default_vars=True, check_values=True, cmd_default_vars=True):
90+
def get_orig_parameters(self, check_values=False):
9391
"""Returns the parameters created by -p. If -p wasn't used, returns None."""
9492
self._parse_arguments()
9593

@@ -98,22 +96,19 @@ def get_orig_parameters(self, default_vars=True, check_values=True, cmd_default_
9896

9997
parameter = self.__parameter_cls()
10098

101-
if not default_vars: # remove all of the variables
102-
parameter.__dict__.clear()
99+
# remove all of the variables
100+
parameter.__dict__.clear()
103101

104102
# if self.__args_namespace.parameters is not None:
105103
parameter.load_parameter_from_py(
106104
self.__args_namespace.parameters)
107105

108-
if cmd_default_vars:
109-
self._get_default_from_cmdline(parameter)
110-
111106
if check_values:
112107
parameter.check_values()
113108

114109
return parameter
115110

116-
def get_parameters_from_json(self, json_file, default_vars=True, check_values=True, cmd_default_vars=True):
111+
def get_parameters_from_json(self, json_file, check_values=False):
117112
"""Given a json file, return the parameters from it."""
118113
with open(json_file) as f:
119114
json_data = json.loads(f.read())
@@ -123,15 +118,12 @@ def get_parameters_from_json(self, json_file, default_vars=True, check_values=Tr
123118
for single_run in json_data[key]:
124119
p = self.__parameter_cls()
125120

126-
if not default_vars: # remove all of the variables
127-
p.__dict__.clear()
121+
# remove all of the variables
122+
p.__dict__.clear()
128123

129124
for attr_name in single_run:
130125
setattr(p, attr_name, single_run[attr_name])
131126

132-
if cmd_default_vars:
133-
self._get_default_from_cmdline(p)
134-
135127
if check_values:
136128
p.check_values()
137129

@@ -166,7 +158,7 @@ def _create_cfg_hash_titles(self, cfg_file):
166158
i += 1
167159
return StringIO('\n'.join(lines))
168160

169-
def get_parameters_from_cfg(self, cfg_file, default_vars=True, check_values=True, cmd_default_vars=True):
161+
def get_parameters_from_cfg(self, cfg_file, check_values=False):
170162
"""Given a cfg file, return the parameters from it."""
171163
parameters = []
172164

@@ -178,24 +170,21 @@ def get_parameters_from_cfg(self, cfg_file, default_vars=True, check_values=True
178170
for section in config.sections():
179171
p = self.__parameter_cls()
180172

181-
if not default_vars: # remove all of the variables
182-
p.__dict__.clear()
173+
# remove all of the variables
174+
p.__dict__.clear()
183175

184176
for k, v in config.items(section):
185177
v = yaml.safe_load(v)
186178
setattr(p, k, v)
187179

188-
if cmd_default_vars:
189-
self._get_default_from_cmdline(p)
190-
191180
if check_values:
192181
p.check_values()
193182

194183
parameters.append(p)
195184

196185
return parameters
197186

198-
def get_other_parameters(self, files_to_open=[], default_vars=True, check_values=True, cmd_default_vars=True):
187+
def get_other_parameters(self, files_to_open=[], check_values=False):
199188
"""Returns the parameters created by -d, If files_to_open is defined,
200189
then use the path specified instead of -d"""
201190
parameters = []
@@ -208,9 +197,9 @@ def get_other_parameters(self, files_to_open=[], default_vars=True, check_values
208197
if files_to_open is not None:
209198
for diags_file in files_to_open:
210199
if '.json' in diags_file:
211-
params = self.get_parameters_from_json(diags_file, default_vars, check_values, cmd_default_vars)
200+
params = self.get_parameters_from_json(diags_file, check_values)
212201
elif '.cfg' in diags_file:
213-
params = self.get_parameters_from_cfg(diags_file, default_vars, check_values, cmd_default_vars)
202+
params = self.get_parameters_from_cfg(diags_file, check_values)
214203
else:
215204
raise RuntimeError(
216205
'The parameters input file must be either a .json or .cfg file')
@@ -229,32 +218,17 @@ def _were_cmdline_args_used(self):
229218
return True
230219
return False
231220

232-
def _overwrite_parameters_with_cmdline_args(self, parameters, cmd_default_vars=True):
221+
def _overwrite_parameters_with_cmdline_args(self, parameters):
233222
"""
234-
Overwrite the parameters with the user's command line arguments.
235-
Case 1: No param in parameters, use what's in --param. Even if cmdline arg (--param) is a default argument.
236-
Case 2: When there's a param in parameters and --param is given, use cmdline arg, but only if it's NOT a default value.
237-
238-
So the only use of the default in a cmdline arg is when there's nothing for it in parameters.
223+
Add the command line parameters used to the parameter object.
239224
"""
240225
for arg_name, arg_value in vars(self.__args_namespace).items():
241-
#print('Examining (arg, value): ({}, {})'.format(arg_name, arg_value))
242-
if not cmd_default_vars and self._is_arg_default_value(arg_name):
243-
#print('_is_arg_default_value(arg_name): {}'.format(self._is_arg_default_value(arg_name)))
244-
#print('NOT USING: {}'.format(arg_name))
245-
continue
246-
247-
# Case 1
248-
if not hasattr(parameters, arg_name):
249-
setattr(parameters, arg_name, arg_value)
250-
# Case 2
251-
if hasattr(parameters, arg_name) and not self._is_arg_default_value(arg_name):
226+
if not self._is_arg_default_value(arg_name):
252227
setattr(parameters, arg_name, arg_value)
253228

254-
def get_cmdline_parameters(self, default_vars=True, check_values=False, cmd_default_vars=True):
229+
def get_cmdline_parameters(self, check_values=False):
255230
"""
256231
Use the other command line args besides -p and -d to create a single parameters object.
257-
cmd_default_vars is used to see if the `default` option in ArgumentParser.add_argument() should be used.
258232
"""
259233
self._parse_arguments()
260234

@@ -263,20 +237,48 @@ def get_cmdline_parameters(self, default_vars=True, check_values=False, cmd_defa
263237

264238
parameter = self.__parameter_cls()
265239

266-
if not default_vars: # remove all of the variables
267-
parameter.__dict__.clear()
240+
# remove all of the variables
241+
parameter.__dict__.clear()
268242

269-
self._overwrite_parameters_with_cmdline_args(parameter, cmd_default_vars)
243+
self._overwrite_parameters_with_cmdline_args(parameter)
270244

271245
if check_values:
272246
parameter.check_values()
273247

274248
return parameter
275249

276-
def combine_params(self, cmdline_parameters=None, orig_parameters=None, other_parameters=None, vars_to_ignore=[]):
277-
"""Combine cmdline_params (-* or --*), orig_parameters (-p), and other_parameters (-d), while ignoring vars_to_ignore"""
250+
def _add_default_values(self, parameter, default_vars=False, cmd_default_vars=False):
251+
"""
252+
Add the default values to the parameter.
253+
These can come from the default values defined in the Parameter class,
254+
or the `default` option defined in ArgumentParser.add_argument().
255+
"""
256+
# Add the command line default parameters first
257+
if cmd_default_vars:
258+
for arg_name, arg_value in vars(self.__args_namespace).items():
259+
#print('examining (arg_name, arg_value): ({}, {})'.format(arg_name, arg_value))
260+
if arg_name in parameter.__dict__ or not self._is_arg_default_value(arg_name):
261+
continue
262+
# Only add the default values, that aren't already in parameter.
263+
setattr(parameter, arg_name, arg_value)
264+
265+
# Then add the defaults defined in the Parameter class
266+
if default_vars:
267+
for arg_name, arg_value in vars(self.__parameter_cls()).items():
268+
if arg_name in parameter.__dict__:
269+
continue
270+
setattr(parameter, arg_name, arg_value)
271+
272+
def combine_params(self, cmdline_parameters=None, orig_parameters=None, other_parameters=None, vars_to_ignore=[], default_vars=False, cmd_default_vars=False):
273+
"""
274+
Combine cmdline_params (-* or --*), orig_parameters (-p), and other_parameters (-d),
275+
while ignoring vars_to_ignore.
276+
Add any default arguments here as well.
277+
"""
278278
if other_parameters:
279279
for parameters in other_parameters:
280+
self._add_default_values(parameters, default_vars, cmd_default_vars)
281+
280282
# orig_parameters args take precedence over other_parameters
281283
if orig_parameters:
282284
for var in orig_parameters.__dict__:
@@ -289,13 +291,21 @@ def combine_params(self, cmdline_parameters=None, orig_parameters=None, other_pa
289291
if var not in vars_to_ignore:
290292
parameters.__dict__[var] = cmdline_parameters.__dict__[var]
291293

292-
# might just combine cmdline_params with orig_params
293-
elif not other_parameters and orig_parameters and cmdline_parameters:
294-
#print('ADDING CMDLINE_PARAMETERS TO ORIG_PARAMETERS.')
295-
for var in cmdline_parameters.__dict__:
296-
if var not in vars_to_ignore:
297-
#print('ADDING {}'.format(var))
298-
orig_parameters.__dict__[var] = cmdline_parameters.__dict__[var]
294+
else:
295+
# just combine cmdline_params with orig_params
296+
if orig_parameters and cmdline_parameters:
297+
self._add_default_values(orig_parameters, default_vars, cmd_default_vars)
298+
299+
for var in cmdline_parameters.__dict__:
300+
# if var not in vars_to_ignore and self._was_command_used(var):
301+
if var not in vars_to_ignore:
302+
# Only add it if it was not in param and was passed from cmd line
303+
orig_parameters.__dict__[var] = cmdline_parameters.__dict__[var]
304+
305+
elif orig_parameters:
306+
self._add_default_values(orig_parameters, default_vars, cmd_default_vars)
307+
elif cmdline_parameters:
308+
self._add_default_values(cmdline_parameters, default_vars, cmd_default_vars)
299309

300310
def combine_orig_and_other_params(self, orig_parameters, other_parameters, vars_to_ignore=[]):
301311
"""Combine orig_parameters with all of the other_parameters, while ignoring vars_to_ignore"""
@@ -340,13 +350,12 @@ def granulate(self, parameters):
340350
def get_parameters(self, cmdline_parameters=None, orig_parameters=None, other_parameters=[], vars_to_ignore=[], default_vars=True, cmd_default_vars=True, *args, **kwargs):
341351
"""Get the parameters based on the command line arguments and return a list of them."""
342352
if not cmdline_parameters:
343-
cmdline_parameters = self.get_cmdline_parameters(default_vars=default_vars, cmd_default_vars=cmd_default_vars, *args, **kwargs)
353+
cmdline_parameters = self.get_cmdline_parameters(*args, **kwargs)
344354
if not orig_parameters:
345-
orig_parameters = self.get_orig_parameters(default_vars=default_vars, cmd_default_vars=cmd_default_vars, *args, **kwargs)
355+
orig_parameters = self.get_orig_parameters(*args, **kwargs)
346356
if other_parameters == []:
347-
other_parameters = self.get_other_parameters(default_vars=default_vars, cmd_default_vars=cmd_default_vars, *args, **kwargs)
348-
349-
self.combine_params(cmdline_parameters, orig_parameters, other_parameters, vars_to_ignore)
357+
other_parameters = self.get_other_parameters(*args, **kwargs)
358+
self.combine_params(cmdline_parameters, orig_parameters, other_parameters, vars_to_ignore, default_vars, cmd_default_vars)
350359

351360
if other_parameters != []:
352361
return self.granulate(other_parameters)
@@ -374,7 +383,7 @@ def get_parameter(self, warning=False, *args, **kwargs):
374383
return self.get_parameters(*args, **kwargs)[0]
375384

376385
def load_default_args_from_json(self, files):
377-
""" take in a list of json files (or a single json file) and create the args from it"""
386+
"""Take in a list of json files (or a single json file) and create the args from it."""
378387
if not isinstance(files, (list, tuple)):
379388
files = [files]
380389
success = None
@@ -392,9 +401,9 @@ def load_default_args_from_json(self, files):
392401
self.store_default_arguments(option_strings, params)
393402
success = True
394403
except:
395-
warnings.warn("failed to load param {} from json file {}".format(
396-
k,afile))
397-
pass
404+
warnings.warn("Failed to load param {} from json file {}".format(
405+
k, afile))
406+
398407
return success
399408

400409
def store_default_arguments(self, options, params):
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Aarg = 10
2+
Barg = 11
3+
Darg = 13

0 commit comments

Comments
 (0)