3
3
import pathlib
4
4
import re
5
5
from dataclasses import dataclass , field
6
- from enum import Enum , auto
7
6
from typing import List , Set , Dict , ClassVar
8
7
9
8
import yaml
@@ -47,7 +46,7 @@ class Class:
47
46
48
47
@dataclass
49
48
class Schema :
50
- classes : Dict [ str , Class ]
49
+ classes : List [ Class ]
51
50
includes : Set [str ] = field (default_factory = set )
52
51
53
52
@@ -65,6 +64,7 @@ def _parse_property(name, type):
65
64
66
65
class _DirSelector :
67
66
""" Default output subdirectory selector for generated QL files, based on the `_directories` global field"""
67
+
68
68
def __init__ (self , dir_to_patterns ):
69
69
self .selector = [(re .compile (p ), pathlib .Path (d )) for d , p in dir_to_patterns ]
70
70
self .selector .append ((re .compile ("" ), pathlib .Path ()))
@@ -73,19 +73,19 @@ def get(self, name):
73
73
return next (d for p , d in self .selector if p .search (name ))
74
74
75
75
76
- def load (file ):
77
- """ Parse the schema from `file` """
78
- data = yaml .load (file , Loader = yaml .SafeLoader )
76
+ def load (path ):
77
+ """ Parse the schema from the file at `path` """
78
+ with open (path ) as input :
79
+ data = yaml .load (input , Loader = yaml .SafeLoader )
79
80
grouper = _DirSelector (data .get ("_directories" , {}).items ())
80
- ret = Schema (classes = {cls : Class (cls , dir = grouper .get (cls )) for cls in data if not cls .startswith ("_" )},
81
- includes = set (data .get ("_includes" , [])))
82
- assert root_class_name not in ret .classes
83
- ret .classes [root_class_name ] = Class (root_class_name )
81
+ classes = {root_class_name : Class (root_class_name )}
82
+ assert root_class_name not in data
83
+ classes .update ((cls , Class (cls , dir = grouper .get (cls ))) for cls in data if not cls .startswith ("_" ))
84
84
for name , info in data .items ():
85
85
if name .startswith ("_" ):
86
86
continue
87
87
assert name [0 ].isupper ()
88
- cls = ret . classes [name ]
88
+ cls = classes [name ]
89
89
for k , v in info .items ():
90
90
if not k .startswith ("_" ):
91
91
cls .properties .append (_parse_property (k , v ))
@@ -94,11 +94,11 @@ def load(file):
94
94
v = [v ]
95
95
for base in v :
96
96
cls .bases .add (base )
97
- ret . classes [base ].derived .add (name )
97
+ classes [base ].derived .add (name )
98
98
elif k == "_dir" :
99
99
cls .dir = pathlib .Path (v )
100
100
if not cls .bases :
101
101
cls .bases .add (root_class_name )
102
- ret . classes [root_class_name ].derived .add (name )
102
+ classes [root_class_name ].derived .add (name )
103
103
104
- return ret
104
+ return Schema ( classes = list ( classes . values ()), includes = set ( data . get ( "_includes" , [])))
0 commit comments