Coverage for kye/api.py: 28%
39 statements
« prev ^ index » next coverage.py v7.3.2, created at 2024-01-16 14:17 -0700
« 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
8__all__ = [
9 'validate',
10]
12_global_engine = None
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
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
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