Coverage for kye/api.py: 28%

39 statements  

« prev     ^ index     » next       coverage.py v7.3.2, created at 2024-01-16 14:17 -0700

1from functools import wraps 

2import inspect 

3from pathlib import Path 

4import yaml 

5from kye.types import from_compiled 

6from kye.engine.engine import DuckDBEngine 

7 

8__all__ = [ 

9 'validate', 

10] 

11 

12_global_engine = None 

13 

14def find_kye_file(filepath: str): 

15 dir = Path(filepath).parent 

16 models_file = dir / 'models.yaml' 

17 if not models_file.exists(): 

18 raise Exception(f'Could not find models.yaml file in directory "{dir}"') 

19 return models_file 

20 

21def get_engine(filepath: str): 

22 global _global_engine 

23 if _global_engine is None: 

24 with find_kye_file(filepath).open('r') as f: 

25 src = yaml.safe_load(f) 

26 models = from_compiled(src) 

27 _global_engine = DuckDBEngine(models) 

28 return _global_engine 

29 

30def validate(model: str): 

31 def wrapper(fn): 

32 @wraps(fn) 

33 def wrapped(*args, **kwargs): 

34 engine = get_engine(inspect.getfile(fn)) 

35 assert model in engine.models, f'Undefined model {model}' 

36 data = fn(*args, **kwargs) 

37 engine.load_json(model, data) 

38 engine.validate() 

39 errors = engine.get_errors() 

40 if len(errors) > 1: 

41 messages = '\n\t'.join( 

42 err.message 

43 for err in errors 

44 ) 

45 raise Exception(f'Validation Errors:\n\t{messages}') 

46 elif len(errors) == 1: 

47 raise Exception(errors[0].message) 

48 return data 

49 return wrapped 

50 return wrapper