annotate parse_functions.py @ 0:1ad9c146ebb4 draft

Uploaded
author jaredgk
date Fri, 19 Oct 2018 14:36:02 -0400
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
1 try:
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
2 import ConfigParser
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
3 except ImportError:
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
4 import configparser as ConfigParser
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
5 import argparse
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
6 import sys
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
7
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
8 is_python3 = (sys.version_info[0] == 3)
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
9
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
10
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
11
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
12 def parseOption(val):
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
13 """Given a value read from a config file, returns appropriately formatted
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
14 python variable.
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
15
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
16 -If `val` == 'None', returns None variable
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
17 -If `val` == 'True', returns True
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
18 -If `val` == 'False', returns False
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
19 -If `val` is a float, returns float-casted val
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
20 -If `val` is an int and not a float, returns an int-casted val
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
21 -If none of these criteria are met, returns the input value
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
22
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
23 Parameters
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
24 ----------
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
25 val : str
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
26 String from dict created by config parser
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
27
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
28 Output
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
29 ------
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
30 val : multi
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
31 Parsed config value for use with argparse
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
32
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
33
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
34 """
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
35 if val == 'None':
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
36 return None
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
37 if val == 'True':
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
38 return True
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
39 if val == 'False':
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
40 return False
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
41 try:
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
42 a = int(val)
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
43 b = float(val)
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
44 if a == b:
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
45 return int(val)
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
46 return float(val)
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
47 except:
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
48 pass
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
49 return val
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
50
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
51 def getConfigFilename(arglist, flag='--conf'):
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
52 """Reads argument list to determine if there is a config file provided.
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
53
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
54 Used to work with argparse. If `flag` is present in the input array,
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
55 the next argument is assumed to be the filename for the config file.
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
56
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
57 Parameters
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
58 ----------
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
59 arglist : list
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
60 List of all arguments to input function, from either sys.argv or a
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
61 custom list
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
62 flag : str (optional) ('--conf')
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
63 Command-line flag to look for in arglist to signify next element
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
64 is filename for config options
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
65
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
66 Returns
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
67 -------
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
68 config_filename : str (None)
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
69 Name of config file if 'flag' is present in arglist, otherwise
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
70 defaults to None
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
71 is_first : bool
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
72 Will be true if `flag` is first element of arglist. Used for method
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
73 to allow required args to be passed from config file.
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
74
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
75 """
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
76 config_filename = None
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
77 is_first = False
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
78 if flag in arglist:
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
79 idx = arglist.index(flag)
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
80 config_filename = arglist[idx+1]
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
81 if idx == 0:
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
82 is_first = True
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
83 return config_filename,is_first
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
84 return None,is_first
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
85
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
86
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
87 def defaultsDictForFunction(func_name, config_name):
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
88 """Creates a dict with default values for a given function.
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
89
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
90 Given an input config file and a function name, this function will
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
91 read in all values from the given section of the config file, then
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
92 remove the variables that are used in the config file to define
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
93 parameters for multiple functions.
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
94
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
95 Parameters
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
96 ----------
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
97 func_name : str
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
98 Name of function section of config file. (May not necessarily
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
99 be name of function in code)
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
100 config_name : str
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
101 Name of config file
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
102
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
103 Returns
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
104 -------
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
105 d_func : dict
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
106 Dictionary with all attributes for the given function. Values written
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
107 as 'None' in config file will not be added, so normal defaults
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
108 can be used.
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
109
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
110
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
111 """
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
112 if is_python3:
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
113 config = ConfigParser.ConfigParser()
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
114 else:
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
115 config = ConfigParser.SafeConfigParser()
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
116 config.read(config_name)
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
117 d_vars = dict(config.items("DEFAULT"))
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
118 d_hold = dict(config.items(func_name))
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
119 d_func = {}
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
120 for k in d_hold.keys():
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
121 if k not in d_vars:
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
122 val = parseOption(d_hold[k])
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
123 if val is not None:
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
124 d_func[k] = val
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
125 return d_func
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
126
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
127 def makeRequiredList(argdict, reqlist):
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
128 """Grabs required args from argument dict created by configparser.
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
129
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
130 Generates a list of required parameters that will be passed in lieu of
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
131 a regular arglist or sys.argv. Must be ordered in the same way they will
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
132 be input to argparse.
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
133
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
134 Parameters
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
135 ----------
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
136 argdict : dict
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
137 Dictionary of arguments returned from defaultsDictForFunction.
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
138 reqlist : list
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
139 List of required arguments, in order that they should be passed to
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
140 argparse.
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
141
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
142 Returns
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
143 -------
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
144 req_arglist : list
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
145 List of required argument values for given function, in order for
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
146 passing to argparse
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
147
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
148 Exceptions
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
149 ----------
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
150 Argument value in argdict for required arg is None
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
151
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
152
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
153
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
154 """
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
155 req_arglist = []
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
156 for arg in reqlist:
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
157 argval = argdict[arg]
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
158 if argval is None:
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
159 raise Exception("Value for required argument %s cannot be None"
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
160 % argval)
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
161 req_arglist.append(argdict[arg])
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
162 return req_arglist
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
163
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
164
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
165 def checkRequired(required_args, defaults):
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
166 for req in required_args:
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
167 if req in defaults and req[defaults] is not None:
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
168 raise Exception(('Required argument %s has value present '
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
169 ' in config file (%s) and command line' %
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
170 (req, defaults[req])))
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
171
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
172
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
173 def getArgsWithConfig(parser, sys_args, required_args, func_name):
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
174 config_name, req_included = getConfigFilename(sys_args)
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
175 if config_name is not None:
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
176 defaults = defaultsDictForFunction(func_name, config_name)
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
177 if not req_included:
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
178 checkRequired(required_args, defaults)
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
179 parser.set_defaults(**defaults)
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
180 if not req_included:
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
181 return parser.parse_args(sys_args)
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
182 else:
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
183 req_args = makeRequiredList(defaults, required_args)
1ad9c146ebb4 Uploaded
jaredgk
parents:
diff changeset
184 return parser.parse_args(req_args)