Coverage for kye/compiled.py: 81%

26 statements  

« prev     ^ index     » next       coverage.py v7.3.2, created at 2023-11-13 15:17 -0700

1from __future__ import annotations 

2from pydantic import BaseModel, constr, model_validator 

3 

4TYPE = constr(pattern=r'[A-Z][a-z][a-zA-Z]*') 

5EDGE = constr(pattern=r'[a-z][a-z_]*') 

6TYPE_REF = constr(pattern=r'[A-Z][a-z][a-zA-Z]*(\.[A-Za-z]+)*') 

7 

8class CompiledEdge(BaseModel): 

9 type: TYPE_REF 

10 nullable: bool = False 

11 multiple: bool = False 

12 

13 def __repr__(self): 

14 return "Edge<{}{}>".format( 

15 self.type or '', 

16 ([['' ,'+'], 

17 ['?','*']])[int(self.nullable)][int(self.multiple)], 

18 ) 

19 

20class CompiledType(BaseModel): 

21 name: TYPE = None 

22 extends: TYPE_REF = None 

23 indexes: list[list[EDGE]] = [] 

24 edges: dict[EDGE, CompiledEdge] = {} 

25 

26 def __getitem__(self, name: EDGE): 

27 return self.edges[name] 

28 

29 def __contains__(self, name: EDGE): 

30 return name in self.edges 

31 

32 def __repr__(self): 

33 all_indexes = [idx for idxs in self.indexes for idx in idxs] 

34 non_index_edges = [edge for edge in self.edges.keys() if edge not in all_indexes] 

35 return "Type<{}{}{}{}>".format( 

36 self.name or '', 

37 ':' + self.extends if self.extends else '', 

38 ''.join('(' + ','.join(idx) + ')' for idx in self.indexes), 

39 '{' + ','.join(non_index_edges) + '}' if len(non_index_edges) else '', 

40 ) 

41 

42class CompiledDataset(BaseModel): 

43 models: dict[TYPE_REF, CompiledType] = {} 

44 

45 def get(self, ref: TYPE_REF, default=None): 

46 return self.models.get(ref, default) 

47 

48 def __getitem__(self, ref: TYPE_REF): 

49 return self.models[ref] 

50 

51 def __contains__(self, ref: TYPE_REF): 

52 return ref in self.models 

53 

54 def __repr__(self): 

55 return "Dataset<{}>".format( 

56 ','.join(ref + (':' + model.name if model.name and model.name != ref else '') for ref, model in self.models.items()), 

57 )