Coverage for kye/api.py: 54%
39 statements
« prev ^ index » next coverage.py v7.3.2, created at 2023-11-13 15:17 -0700
« prev ^ index » next coverage.py v7.3.2, created at 2023-11-13 15:17 -0700
1from __future__ import annotations
2from functools import cached_property
3from typing import Any
4import kye.parser.parser as parser
5from kye.compiled import CompiledDataset
6from kye.dataset import Models
7from kye.loader.loader import Loader
8from kye.validate import Validate
10class ModelApi:
11 def __init__(self, api: Api, model_name: str):
12 self.api = api
13 self.model_name = model_name
15 def from_records(self, json):
16 assert not self.api.done_loading, 'Cannot call from_records after loading is done'
17 self.api.loader.from_json(self.model_name, json)
19class Api:
20 def __init__(self, text):
21 self.compiled = parser.compile(text)
22 self.models = Models(CompiledDataset(models=self.compiled))
23 self.loader = Loader(self.models)
24 self.done_loading = False
26 for model_name in self.compiled.keys():
27 if '.' not in model_name:
28 setattr(self, model_name, ModelApi(self, model_name))
30 @cached_property
31 def validate(self):
32 self.done_loading = True
33 return Validate(self.loader)
35 @property
36 def errors(self):
37 return set(self.validate.errors.aggregate(f"rule_ref, error_type").fetchall())
39 @property
40 def tables(self):
41 return self.validate.tables
43 def from_records(self, model_name: str, json: Any):
44 getattr(self, model_name).from_records(json)
45 return self
47def compile(text) -> Api:
48 return Api(text)