1
1
"""Classes for reading from a JSON schema"""
2
2
3
3
from __future__ import print_function
4
+ from __future__ import unicode_literals
4
5
from collections import OrderedDict
6
+ from six .moves import UserDict
5
7
import jsonref
6
8
from warnings import warn
7
9
from flattentool .sheet import Sheet
@@ -15,6 +17,24 @@ def get_property_type_set(property_schema_dict):
15
17
return set (property_type )
16
18
17
19
20
+ class TitleLookup (UserDict ):
21
+ property_name = None
22
+
23
+ def lookup_header (self , title_header ):
24
+ return self .lookup_header_list (title_header .split (':' ))
25
+
26
+ def lookup_header_list (self , title_header_list ):
27
+ first_title = title_header_list [0 ]
28
+ remaining_titles = title_header_list [1 :]
29
+ if first_title in self :
30
+ if remaining_titles :
31
+ return self [first_title ].property_name + '/' + self [first_title ].lookup_header_list (remaining_titles )
32
+ else :
33
+ return self [first_title ].property_name
34
+ else :
35
+ return '/' .join (title_header_list )
36
+
37
+
18
38
class SchemaParser (object ):
19
39
"""Parse the fields of a JSON schema into a flattened structure."""
20
40
@@ -26,6 +46,7 @@ def __init__(self, schema_filename=None, root_schema_dict=None, main_sheet_name=
26
46
self .rollup = rollup
27
47
self .root_id = root_id
28
48
self .use_titles = use_titles
49
+ self .title_lookup = TitleLookup ()
29
50
30
51
if root_schema_dict is None and schema_filename is None :
31
52
raise ValueError ('One of schema_filename or root_schema_dict must be supplied' )
@@ -52,11 +73,10 @@ def parse(self):
52
73
self .main_sheet .append (title )
53
74
else :
54
75
self .main_sheet .append (field )
55
- if title :
56
- self .main_sheet .titles [title ] = field
57
76
58
- def parse_schema_dict (self , parent_name , schema_dict , parent_id_fields = None ):
77
+ def parse_schema_dict (self , parent_name , schema_dict , parent_id_fields = None , title_lookup = None ):
59
78
parent_id_fields = parent_id_fields or []
79
+ title_lookup = self .title_lookup if title_lookup is None else title_lookup
60
80
if 'properties' in schema_dict :
61
81
if 'id' in schema_dict ['properties' ]:
62
82
id_fields = parent_id_fields + [parent_name + '/id' ]
@@ -67,11 +87,20 @@ def parse_schema_dict(self, parent_name, schema_dict, parent_id_fields=None):
67
87
property_type_set = get_property_type_set (property_schema_dict )
68
88
69
89
title = property_schema_dict .get ('title' )
90
+ title_lookup [title ] = TitleLookup ()
91
+ title_lookup [title ].property_name = property_name
70
92
71
93
if 'object' in property_type_set :
72
- for field , child_title in self .parse_schema_dict (parent_name + '/' + property_name , property_schema_dict ,
73
- parent_id_fields = id_fields ):
74
- yield property_name + '/' + field , (title + ':' + child_title if title and child_title else None ) # TODO ambiguous use of "title"
94
+ for field , child_title in self .parse_schema_dict (
95
+ parent_name + '/' + property_name ,
96
+ property_schema_dict ,
97
+ parent_id_fields = id_fields ,
98
+ title_lookup = title_lookup [title ]):
99
+ yield (
100
+ property_name + '/' + field ,
101
+ # TODO ambiguous use of "title"
102
+ (title + ':' + child_title if title and child_title else None )
103
+ )
75
104
76
105
elif 'array' in property_type_set :
77
106
type_set = get_property_type_set (property_schema_dict ['items' ])
@@ -83,6 +112,7 @@ def parse_schema_dict(self, parent_name, schema_dict, parent_id_fields=None):
83
112
else :
84
113
raise ValueError
85
114
elif 'object' in type_set :
115
+ title_lookup [title ].property_name = property_name + '[]'
86
116
if hasattr (property_schema_dict ['items' ], '__reference__' ):
87
117
sub_sheet_name = property_schema_dict ['items' ].__reference__ ['$ref' ].split ('/' )[- 1 ]
88
118
else :
@@ -98,7 +128,8 @@ def parse_schema_dict(self, parent_name, schema_dict, parent_id_fields=None):
98
128
sub_sheet .add_field (field + ':' + property_name , id_field = True )
99
129
fields = self .parse_schema_dict (parent_name + '/' + property_name + '[]' ,
100
130
property_schema_dict ['items' ],
101
- parent_id_fields = id_fields )
131
+ parent_id_fields = id_fields ,
132
+ title_lookup = title_lookup [title ])
102
133
103
134
rolledUp = set ()
104
135
@@ -110,8 +141,6 @@ def parse_schema_dict(self, parent_name, schema_dict, parent_id_fields=None):
110
141
sub_sheet .add_field (child_title )
111
142
else :
112
143
sub_sheet .add_field (field )
113
- if child_title :
114
- self .sub_sheets [sub_sheet_name ].titles [child_title ] = field
115
144
if self .rollup and 'rollUp' in property_schema_dict and field in property_schema_dict ['rollUp' ]:
116
145
rolledUp .add (field )
117
146
yield property_name + '[]/' + field , (title + ':' + child_title if title and child_title else None )
0 commit comments