def process_cfg_conv(raw_cfg, def_cfg_vals=None, req_keys=None, int_list=True): """ Converts the given raw configuration, filling in defaults and converting the specified value (if any) to the default value's type. @param raw_cfg: The configuration map. @param def_cfg_vals: dictionary of default values @param req_keys: dictionary of required types @param int_list: flag to specify if lists should converted to a list of integers @return: The processed configuration. """ proc_cfg = {} for key in raw_cfg: if not (key in def_cfg_vals or key in req_keys): raise InvalidDataError( "Unexpected key '{}' in configuration ('ini') file.".format( key)) key = None try: for key, def_val in def_cfg_vals.items(): proc_cfg[key] = conv_raw_val(raw_cfg.get(key), def_val, int_list) for key, type_func in req_keys.items(): proc_cfg[key] = type_func(raw_cfg[key]) except KeyError as e: raise KeyError("Missing config val for key '{}'".format(key, e)) except Exception as e: raise InvalidDataError('Problem with config vals on key {}: {}'.format( key, e)) if proc_cfg[SCIPY_OPT_METHOD] != DEF_OPT_METHOD: proc_cfg[SCIPY_OPT_METHOD] = proc_cfg[SCIPY_OPT_METHOD].lower() if proc_cfg[SCIPY_OPT_METHOD] not in TESTED_SCIPY_MIN: warning( "Only the following optimization methods have been tested: scipy.optimize.minimize with {}." "".format(TESTED_SCIPY_MIN)) for int_key in [TEMP, NITER_SUCCESS]: if proc_cfg[int_key] is not None: proc_cfg[int_key] = float(proc_cfg[int_key]) # Remove any repeated parameters, or zero-character-length params (can happen if accidentally an additional comma) if len(proc_cfg[OPT_PARAMS]) > 0: filtered_opt_params = [] for param in proc_cfg[OPT_PARAMS]: if len(param) > 0: if param in filtered_opt_params: warning("'{}' repeated in '{}'; skipping repeated entry". format(param, OPT_PARAMS)) else: filtered_opt_params.append(param) proc_cfg[OPT_PARAMS] = filtered_opt_params return proc_cfg
def testNotIntList(self): non_int_str = 'a,b,c' non_int_list = ['a', 'b', 'c'] self.assertEqual(non_int_list, conv_raw_val(non_int_str, [], int_list=False))
def testNotIntMissFlag(self): non_int_str = 'a,b,c' try: conv_raw_val(non_int_str, []) except ValueError as e: self.assertTrue("invalid literal for int()" in e.message)
def testIntList(self): int_str = '2,3,4' int_list = [2, 3, 4] self.assertEquals(int_list, conv_raw_val(int_str, []))