def get_file_permutations(self, file, device, scheduler): """Creates interpolated files of permutated template settings. Args: file: The input file. device: The device. scheduler: The scheduler. Returns: Yields tuples of file names and setting permutations. Raises: InvalidSettingError: If `file` does not exist. """ if not os.path.isfile(file): raise InvalidSettingError( 'Setting file {} does not exist'.format(file) ) if self.enabled: for sp in self._get_setting_permutations(): temp_file_name = self._interpolate_file(file, device, scheduler, sp) yield temp_file_name, sp os.remove(temp_file_name) else: yield file, ()
def add_setting(self, setting, value): """Adds a setting to the configuration object. Args: setting: The setting. value: The value. Raises: InvalidSettingError: If setting is not defined in `_get_settings`. """ if setting not in self._settings: raise InvalidSettingError('Setting {} is not valid'.format(setting)) sa = self._settings[setting] setattr(self, setting, sa.conversion_fn(value))
def _validate_setting(self, setting_name, setting): """Validates a config setting attribute. Args: setting_name: The attribute. setting: The SettingAttribute. Raises: InvalidSettingError: If no value set and `default_value` not set on `setting`. Or if fails `validate_fn` on `setting`. """ setting_value = getattr(self, setting_name, None) if setting_value is None: if setting.default_value is None: raise InvalidSettingError( 'Required setting {} is not defined'.format(setting_name)) setting_value = setting.default_value setting.default_used = True setattr(self, setting_name, setting.default_value) if not setting.validation_fn(setting_value): raise InvalidSettingError('Setting {}={} is not valid'.format( setting_name, setting_value))
def validate(self): """Validates the settings. Raises: InvalidSettingError: If settings are not valid or dependencies not met. """ # NOTE: Assumes that there are no circular dependencies roots = { k for k, v in self._settings.items() if not v.dependent_attributes } unvalidated = { k for k, v in self._settings.items() if v.dependent_attributes } inc_deps = {s: set() for s in self._settings} out_deps = { k: set(v.dependent_attributes) for k, v in self._settings.items() if v.dependent_attributes } for k, v in self._settings.items(): if v.dependent_attributes: for dep in v.dependent_attributes: inc_deps[dep].add(k) while roots: setting_name = roots.pop() setting = self._settings[setting_name] self._validate_setting(setting_name, setting) for dep in inc_deps[setting_name]: out_deps[dep].remove(setting_name) if not out_deps[dep]: del out_deps[dep] unvalidated.remove(dep) roots.add(dep) if unvalidated: raise InvalidSettingError( 'Setting(s) {} do not have dependencies met'.format( ', '.join(unvalidated)))
def get(*settings): """Retrieves attributes on self. Args: settings: The attributes to retrieve. Returns: The values of the attributes on self. Raises: InvalidSettingError: If setting does not exist on self. """ ret = [] for setting in settings: try: ret.append(getattr(SettingsManager, setting)) except AttributeError: raise InvalidSettingError('{} does not exist'.format(setting)) if len(ret) == 1: return ret[0] return ret