Coverage for lobster/tools/trlc/lobster_trlc_config.py: 0%
32 statements
« prev ^ index » next coverage.py v7.10.5, created at 2025-08-27 13:02 +0000
« prev ^ index » next coverage.py v7.10.5, created at 2025-08-27 13:02 +0000
1from dataclasses import dataclass
2from pathlib import Path
3from typing import List
5import yamale
6import yaml
8from lobster.common.items import Requirement
9from lobster.common.multi_file_input_config import Config
10from lobster.tools.trlc.conversion_rule import ConversionRule
11from lobster.tools.trlc.to_string_rules import ToStringRules
14@dataclass
15class LobsterTrlcConfig(Config):
16 conversion_rules: List[ConversionRule]
17 to_string_rules: List[ToStringRules]
19 @classmethod
20 def from_dict(cls, data: dict) -> "LobsterTrlcConfig":
21 conversion_rules = []
22 for conversion_rule_dict in data.get("conversion-rules", []):
23 # The YAML schema uses hyphens, but those are not valid Python identifiers.
24 # Replace hyphens with underscores to create valid attribute names.
25 conversion_rule_dict_updated = {
26 key.replace("-", "_"): value
27 for key, value in conversion_rule_dict.items()
28 }
29 conversion_rules.append(ConversionRule(**conversion_rule_dict_updated))
31 return LobsterTrlcConfig(
32 conversion_rules=conversion_rules,
33 to_string_rules=[ToStringRules.from_dict(rules)
34 for rules in data.get("to-string-rules", [])],
35 inputs=data.get("inputs", ""),
36 inputs_from_file=data.get("inputs-from-file", ""),
37 extensions=(".rsl", ".trlc"),
38 exclude_patterns=data.get("exclude-patterns", []),
39 schema=Requirement,
40 )
42 @staticmethod
43 def _validate_config(filename: str):
44 schema_file = Path(__file__).parent / "schema.yamale"
45 schema = yamale.make_schema(schema_file)
46 # Note: using 'resolve()' only for the purpose that yamale prints the full path
47 # in its exception in case of validation errors.
48 data = yamale.make_data(Path(filename).resolve())
49 yamale.validate(schema, data)
51 @classmethod
52 def from_file(cls, filename: str) -> "LobsterTrlcConfig":
53 cls._validate_config(filename)
55 with open(filename, "r", encoding="UTF-8") as f:
56 config_data = yaml.safe_load(f)
58 return cls.from_dict(config_data)