1+ from copy import deepcopy
2+ from fmf .context import Context
3+ #from fmf.base import Tree
4+
5+ class ProfileError (Exception ):
6+ pass
7+
8+
9+ class ProfileWithoutWhereStatement (ProfileError ):
10+ pass
11+
12+
13+ class Profile :
14+
15+ def __init__ (self , rule : dict , name = None ):
16+ self ._raw_rule = rule
17+ self .name = name
18+ if "where" not in self ._raw_rule .keys ():
19+ raise ProfileWithoutWhereStatement
20+ self .where = self ._raw_rule .pop ("where" )
21+ self .rules = deepcopy (self ._raw_rule )
22+
23+ def _check_if_fmf_node_match (self , node ):
24+ context = Context (** node .data )
25+ return context .matches (self .where )
26+
27+ def _apply_rule (self , node ):
28+
29+ if not self ._check_if_fmf_node_match (node ):
30+ return
31+ for rule in self .rules :
32+ if isinstance (rule , str ) and rule .endswith ("?" ):
33+ rule_clear = rule [:- 1 ]
34+ data = {rule_clear : self .rules [rule ]}
35+ if rule_clear in node .data :
36+ # do not override if defined
37+ continue
38+ else :
39+ data = {rule : self .rules [rule ]}
40+ node ._merge_special (node .data , data )
41+
42+ def apply_rule (self , node ):
43+ for item in node .climb ():
44+ self ._apply_rule (item )
0 commit comments