Coverage for kye/compiled.py: 0%
26 statements
« prev ^ index » next coverage.py v7.3.2, created at 2023-12-05 16:38 -0700
« prev ^ index » next coverage.py v7.3.2, created at 2023-12-05 16:38 -0700
1from __future__ import annotations
2from pydantic import BaseModel, constr, model_validator
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]+)*')
8class CompiledEdge(BaseModel):
9 type: TYPE_REF
10 nullable: bool = False
11 multiple: bool = False
13 def __repr__(self):
14 return "Edge<{}{}>".format(
15 self.type or '',
16 ([['' ,'+'],
17 ['?','*']])[int(self.nullable)][int(self.multiple)],
18 )
20class CompiledType(BaseModel):
21 name: TYPE = None
22 extends: TYPE_REF = None
23 indexes: list[list[EDGE]] = []
24 edges: dict[EDGE, CompiledEdge] = {}
26 def __getitem__(self, name: EDGE):
27 return self.edges[name]
29 def __contains__(self, name: EDGE):
30 return name in self.edges
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 )
42class CompiledDataset(BaseModel):
43 models: dict[TYPE_REF, CompiledType] = {}
45 def get(self, ref: TYPE_REF, default=None):
46 return self.models.get(ref, default)
48 def __getitem__(self, ref: TYPE_REF):
49 return self.models[ref]
51 def __contains__(self, ref: TYPE_REF):
52 return ref in self.models
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 )