def __get_enabled_rules(all_rules: List[Rule], config: Config): enabled_rules = [] for rule in all_rules: if rule.id not in config.get_disabled_rule_ids(): rule_config = config.get_config_for_rule_id(rule.id) if rule_config: rule.severity = rule_config.severity else: rule.severity = Severity.ERROR enabled_rules.append(rule) return enabled_rules
def test_config_with_config_file_existing(_): runner = CliRunner() config_path = "twisted.yml" dummy_rule_config = RuleConfig("a", enabled=False) with runner.isolated_filesystem(): ConfigIO.write(Config(universal=[dummy_rule_config]), config_path) result = runner.invoke(main, ["config", "--config=twisted.yml"]) assert result.exit_code == 0 assert result.output == f"Created/updated config in {config_path}\n" assert (ConfigIO.read(config_path) == Config.empty() ), "existing config not overwritten"
def test_rule_engine_factory_method_with_config_filtering_out_disabled_rules(): engine = RuleEngine.with_configured_rules(config=Config(universal=[ RuleConfig(id="no-rejoin-models", enabled=False), RuleConfig(id="no-disabled-models", enabled=True), ])) assert "no-rejoin-models" not in [rule.id for rule in engine]
def test_rule_engine_factory_method(): engine = RuleEngine.with_configured_rules(Config(universal=[])) count = 0 for rule in engine: assert isinstance(rule, Rule) count += 1 assert count >= 4, "There should be at least 4 rules by default"
def read(cls, path: Union[Path, str]) -> Config: if path is None: if cls.DEFAULT_CONFIG_FILE_PATH.exists(): config = cls.__parse(cls.DEFAULT_CONFIG_FILE_PATH) else: return Config.empty() else: config = cls.__parse(path) return cls.__validate(config)
def update(cls, config: Config) -> Config: all_rules = rules_in_path(olivertwist.__path__[0]) disabled = config.get_disabled_rule_ids() choices = [{ "name": rule.name, "checked": rule.id not in disabled, } for rule in sorted(all_rules, key=attrgetter("name"))] questions = [{ "type": "checkbox", "name": "rules", "message": "Select rules to enable", "choices": choices, "validate": cls.__validate, }] answers = prompt(questions) return Config([ RuleConfig(rule.id, False) for rule in all_rules if rule.name not in answers["rules"] ])
def config(config_path): """Interactively create or edit configuration file""" config_path = Path(config_path or ConfigIO.DEFAULT_CONFIG_FILE_PATH) logging.debug(config_path) try: config_obj = ConfigIO.read(config_path) except FileNotFoundError: config_obj = Config.empty() config_obj = Configurator.update(config_obj) ConfigIO.write(config_obj, config_path) click.echo(f"Created/updated config in {config_path}")
def __parse(cls, config_file_path: Union[Path, str]) -> Config: try: with open(config_file_path, "rb") as handle: yaml_config_dict = yaml.load(handle.read().decode("utf-8"), Loader=YamlLoader) # When we have a later version we can do something with the version... _ = yaml_config_dict.pop("version") return Config.from_dict(yaml_config_dict) except KeyError: raise InvalidConfigError("Version is missing.") except ValidationError as e: raise InvalidConfigError(e)
def test_rule_engine_factory_from_arbitrary_directory(custom_rule_path): with open(custom_rule_path / "my_rule.py", "w") as fh: fh.write("from olivertwist.ruleengine.rule import Rule\n\n") fh.write( 'r = Rule("my-custom-rule", "Some custom rule", lambda _: (passes, failures))' ) engine = RuleEngine.with_configured_rules(config=Config(universal=[]), directory=custom_rule_path) assert len(engine) == 1 assert "my-custom-rule" in (rule.id for rule in engine)
def test_rule_engine_factory_method_with_config_setting_severity(): engine = RuleEngine.with_configured_rules(config=Config(universal=[ RuleConfig( id="no-rejoin-models", enabled=True, severity=Severity.ERROR), RuleConfig( id="no-disabled-models", enabled=True, severity=Severity.WARNING), ])) assert ("no-rejoin-models", Severity.ERROR) in [(rule.id, rule.severity) for rule in engine] assert ("no-disabled-models", Severity.WARNING) in [(rule.id, rule.severity) for rule in engine]
def config(): return Config(universal=[ RuleConfig(id="no-rejoin-models", enabled=False), RuleConfig(id="no-disabled-models", enabled=True), ])
result = runner.invoke( main, [ "--debug", "check", f"--add-rules-from={rule_dir_1}", f"--add-rules-from={rule_dir_2}", manifest_json, ], ) assert result.exit_code == 0 @patch.object(Configurator, "update", return_value=Config.empty()) def test_config_outputs_file(_): runner = CliRunner() with runner.isolated_filesystem(): result = runner.invoke(main, ["config"]) assert result.exit_code == 0 config_path = Path("olivertwist.yml") assert config_path.exists assert result.output == f"Created/updated config in {config_path}\n" @patch.object(Configurator, "update", return_value=Config.empty()) def test_config_with_config_file_not_existing(_): runner = CliRunner() config_path = Path("twisted.yml")
def write(cls, config: Config, path: Union[Path, str]): with open(path, "w") as handle: config_dict = config.to_dict() config_dict["version"] = cls.LATEST_CONFIG_FILE_VERSION yaml.dump(config_dict, handle)