|
3 | 3 | from ..dynamic_typing import DOptional, ModelMeta, ModelPtr |
4 | 4 |
|
5 | 5 | Index = str |
| 6 | +ModelsStructureType = Tuple[List[dict], Dict[ModelMeta, ModelMeta]] |
| 7 | + |
6 | 8 | T = TypeVar('T') |
7 | 9 |
|
8 | 10 |
|
@@ -35,33 +37,6 @@ def insert_after(self, value: T, *after: T): |
35 | 37 | self.insert(pos + 1, value) |
36 | 38 |
|
37 | 39 |
|
38 | | -def filter_pointers(model: ModelMeta) -> Iterable[ModelPtr]: |
39 | | - """ |
40 | | - Return iterator over pointers with not None parent |
41 | | - """ |
42 | | - return (ptr for ptr in model.pointers if ptr.parent) |
43 | | - |
44 | | - |
45 | | -def extract_root(model: ModelMeta) -> Set[Index]: |
46 | | - """ |
47 | | - Return set of indexes of root models that are use given ``model`` directly or through another nested model. |
48 | | - """ |
49 | | - seen: Set[Index] = set() |
50 | | - nodes: List[ModelPtr] = list(filter_pointers(model)) |
51 | | - roots: Set[Index] = set() |
52 | | - while nodes: |
53 | | - node = nodes.pop() |
54 | | - seen.add(node.type.index) |
55 | | - filtered = list(filter_pointers(node.parent)) |
56 | | - nodes.extend(ptr for ptr in filtered if ptr.type.index not in seen) |
57 | | - if not filtered: |
58 | | - roots.add(node.parent.index) |
59 | | - return roots |
60 | | - |
61 | | - |
62 | | -ModelsStructureType = Tuple[List[dict], Dict[ModelMeta, ModelMeta]] |
63 | | - |
64 | | - |
65 | 40 | def compose_models(models_map: Dict[str, ModelMeta]) -> ModelsStructureType: |
66 | 41 | """ |
67 | 42 | Generate nested sorted models structure for internal usage. |
@@ -116,6 +91,30 @@ def compose_models(models_map: Dict[str, ModelMeta]) -> ModelsStructureType: |
116 | 91 | return root_models, path_injections |
117 | 92 |
|
118 | 93 |
|
| 94 | +def filter_pointers(model: ModelMeta) -> Iterable[ModelPtr]: |
| 95 | + """ |
| 96 | + Return iterator over pointers with not None parent |
| 97 | + """ |
| 98 | + return (ptr for ptr in model.pointers if ptr.parent) |
| 99 | + |
| 100 | + |
| 101 | +def extract_root(model: ModelMeta) -> Set[Index]: |
| 102 | + """ |
| 103 | + Return set of indexes of root models that are use given ``model`` directly or through another nested model. |
| 104 | + """ |
| 105 | + seen: Set[Index] = set() |
| 106 | + nodes: List[ModelPtr] = list(filter_pointers(model)) |
| 107 | + roots: Set[Index] = set() |
| 108 | + while nodes: |
| 109 | + node = nodes.pop() |
| 110 | + seen.add(node.type.index) |
| 111 | + filtered = list(filter_pointers(node.parent)) |
| 112 | + nodes.extend(ptr for ptr in filtered if ptr.type.index not in seen) |
| 113 | + if not filtered: |
| 114 | + roots.add(node.parent.index) |
| 115 | + return roots |
| 116 | + |
| 117 | + |
119 | 118 | def sort_fields(model_meta: ModelMeta) -> Tuple[List[str], List[str]]: |
120 | 119 | """ |
121 | 120 | Split fields into required and optional groups |
|
0 commit comments