Пример #1
0
 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
Пример #2
0
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"
Пример #3
0
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]
Пример #4
0
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"
Пример #5
0
    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)
Пример #6
0
 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"]
     ])
Пример #7
0
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}")
Пример #8
0
 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)
Пример #9
0
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)
Пример #10
0
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]
Пример #11
0
def config():
    return Config(universal=[
        RuleConfig(id="no-rejoin-models", enabled=False),
        RuleConfig(id="no-disabled-models", enabled=True),
    ])
Пример #12
0
        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")
Пример #13
0
 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)