Coverage for kye/api.py: 54%

39 statements  

« 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 

9 

10class ModelApi: 

11 def __init__(self, api: Api, model_name: str): 

12 self.api = api 

13 self.model_name = model_name 

14 

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) 

18 

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 

25 

26 for model_name in self.compiled.keys(): 

27 if '.' not in model_name: 

28 setattr(self, model_name, ModelApi(self, model_name)) 

29 

30 @cached_property 

31 def validate(self): 

32 self.done_loading = True 

33 return Validate(self.loader) 

34 

35 @property 

36 def errors(self): 

37 return set(self.validate.errors.aggregate(f"rule_ref, error_type").fetchall()) 

38 

39 @property 

40 def tables(self): 

41 return self.validate.tables 

42 

43 def from_records(self, model_name: str, json: Any): 

44 getattr(self, model_name).from_records(json) 

45 return self 

46 

47def compile(text) -> Api: 

48 return Api(text)