def handle_presets(self, preset_action, save, preset, **kwargs): """Handle preset related arguments. This logic lives here so that the underlying selectors don't need special preset handling. They can all save and load presets the same way. """ from tryselect.util.dicttools import merge user_presets = self.presets.handlers[0] if preset_action == 'list': self.presets.list() sys.exit() if preset_action == 'edit': user_presets.edit() sys.exit() default = self.parser.get_default if save: selector = self.subcommand or self._mach_context.settings['try'][ 'default'] # Only save non-default values for simplicity. kwargs = {k: v for k, v in kwargs.items() if v != default(k)} user_presets.save(save, selector=selector, **kwargs) print('preset saved, run with: --preset={}'.format(save)) sys.exit() if preset: if preset not in self.presets: self.parser.error("preset '{}' does not exist".format(preset)) name = preset preset = self.presets[name] selector = preset.pop('selector') preset.pop('description', None) # description isn't used by any selectors if not self.subcommand: self.subcommand = selector elif self.subcommand != selector: print("error: preset '{}' exists for a different selector " "(did you mean to run 'mach try {}' instead?)".format( name, selector)) sys.exit(1) # Order of precedence is defaults -> presets -> cli. Configuration # from the right overwrites configuration from the left. defaults = {} nondefaults = {} for k, v in kwargs.items(): if v == default(k): defaults[k] = v else: nondefaults[k] = v kwargs = merge(defaults, preset, nondefaults) return kwargs
def handle_try_config(self, **kwargs): from tryselect.util.dicttools import merge kwargs.setdefault('try_config', {}) for cls in self.parser.templates.itervalues(): try_config = cls.try_config(**kwargs) if try_config is not None: kwargs['try_config'] = merge(kwargs['try_config'], try_config) for name in cls.dests: del kwargs[name] return kwargs
def handle_try_config(self, **kwargs): from tryselect.util.dicttools import merge to_validate = [] kwargs.setdefault('try_config', {}) for cls in six.itervalues(self.parser.task_configs): try_config = cls.try_config(**kwargs) if try_config is not None: to_validate.append(cls) kwargs['try_config'] = merge(kwargs['try_config'], try_config) for name in cls.dests: del kwargs[name] # Validate task_configs after they have all been parsed to avoid # depending on the order they were processed. for cls in to_validate: cls.validate(**kwargs) return kwargs
def handle_presets(self, preset_action, save, preset, **kwargs): """Handle preset related arguments. This logic lives here so that the underlying selectors don't need special preset handling. They can all save and load presets the same way. """ from tryselect.preset import MergedHandler, migrate_old_presets from tryselect.util.dicttools import merge # Create our handler using both local and in-tree presets. The first # path in this list will be treated as the 'user' file for the purposes # of saving and editing. All subsequent paths are 'read-only'. We check # an environment variable first for testing purposes. if os.environ.get('MACH_TRY_PRESET_PATHS'): preset_paths = os.environ['MACH_TRY_PRESET_PATHS'].split( os.pathsep) else: preset_paths = [ os.path.join(get_state_dir(), 'try_presets.yml'), os.path.join(self.topsrcdir, 'tools', 'tryselect', 'try_presets.yml'), ] presets = MergedHandler(*preset_paths) user_presets = presets.handlers[0] # TODO: Remove after Jan 1, 2020. migrate_old_presets(user_presets) if preset_action == 'list': presets.list() sys.exit() if preset_action == 'edit': user_presets.edit() sys.exit() default = self.parser.get_default if save: selector = self.subcommand or self._mach_context.settings['try'][ 'default'] # Only save non-default values for simplicity. kwargs = {k: v for k, v in kwargs.items() if v != default(k)} user_presets.save(save, selector=selector, **kwargs) print('preset saved, run with: --preset={}'.format(save)) sys.exit() if preset: if preset not in presets: self.parser.error("preset '{}' does not exist".format(preset)) name = preset preset = presets[name] selector = preset.pop('selector') preset.pop('description', None) # description isn't used by any selectors if not self.subcommand: self.subcommand = selector elif self.subcommand != selector: print("error: preset '{}' exists for a different selector " "(did you mean to run 'mach try {}' instead?)".format( name, selector)) sys.exit(1) # Order of precedence is defaults -> presets -> cli. Configuration # from the right overwrites configuration from the left. defaults = {} nondefaults = {} for k, v in kwargs.items(): if v == default(k): defaults[k] = v else: nondefaults[k] = v kwargs = merge(defaults, preset, nondefaults) return kwargs