Coverage for lobster/tools/trlc/lobster_trlc_config.py: 100%

32 statements  

« 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 

4 

5import yamale 

6import yaml 

7 

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 

12 

13 

14@dataclass 

15class LobsterTrlcConfig(Config): 

16 conversion_rules: List[ConversionRule] 

17 to_string_rules: List[ToStringRules] 

18 

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)) 

30 

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 ) 

41 

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) 

50 

51 @classmethod 

52 def from_file(cls, filename: str) -> "LobsterTrlcConfig": 

53 cls._validate_config(filename) 

54 

55 with open(filename, "r", encoding="UTF-8") as f: 

56 config_data = yaml.safe_load(f) 

57 

58 return cls.from_dict(config_data)