| Index: tools/json_schema_compiler/model.py
|
| diff --git a/tools/json_schema_compiler/model.py b/tools/json_schema_compiler/model.py
|
| index 2351ecd1f999b17bf7077c52d8baaeb00e09cd83..b7f76621cf3f92bc283feef294acabeef0ff4df6 100644
|
| --- a/tools/json_schema_compiler/model.py
|
| +++ b/tools/json_schema_compiler/model.py
|
| @@ -150,6 +150,8 @@ class Property(object):
|
| - |optional| a boolean representing whether the property is optional
|
| - |description| a description of the property (if provided)
|
| - |type_| the model.PropertyType of this property
|
| + - |compiled_type| the model.PropertyType that this property should be
|
| + compiled to from the JSON. Defaults to |type_|.
|
| - |ref_type| the type that the REF property is referencing. Can be used to
|
| map to its model.Type
|
| - |item_type| a model.Property representing the type of each element in an
|
| @@ -189,40 +191,23 @@ class Property(object):
|
| self.enum_values.append(value)
|
| self.type_ = PropertyType.ENUM
|
| elif 'type' in json:
|
| - json_type = json['type']
|
| - if json_type == 'string':
|
| - self.type_ = PropertyType.STRING
|
| - elif json_type == 'any':
|
| - self.type_ = PropertyType.ANY
|
| - elif json_type == 'boolean':
|
| - self.type_ = PropertyType.BOOLEAN
|
| - elif json_type == 'integer':
|
| - self.type_ = PropertyType.INTEGER
|
| - elif json_type == 'number':
|
| - self.type_ = PropertyType.DOUBLE
|
| - elif json_type == 'array':
|
| + self.type_ = self._JsonTypeToPropertyType(json['type'])
|
| + if self.type_ == PropertyType.ARRAY:
|
| self.item_type = Property(self, name + "Element", json['items'],
|
| from_json=from_json,
|
| from_client=from_client)
|
| - self.type_ = PropertyType.ARRAY
|
| - elif json_type == 'object':
|
| - self.type_ = PropertyType.OBJECT
|
| + elif self.type_ == PropertyType.OBJECT:
|
| # These members are read when this OBJECT Property is used as a Type
|
| type_ = Type(self, self.name, json)
|
| # self.properties will already have some value from |_AddProperties|.
|
| self.properties.update(type_.properties)
|
| self.functions = type_.functions
|
| - elif json_type == 'function':
|
| - self.type_ = PropertyType.FUNCTION
|
| - elif json_type == 'binary':
|
| - self.type_ = PropertyType.BINARY
|
| - else:
|
| - raise ParseException(self, 'type ' + json_type + ' not recognized')
|
| elif 'choices' in json:
|
| if not json['choices'] or len(json['choices']) == 0:
|
| raise ParseException(self, 'Choices has no choices')
|
| self.choices = {}
|
| self.type_ = PropertyType.CHOICES
|
| + self.compiled_type = self.type_
|
| for choice_json in json['choices']:
|
| choice = Property(self, self.name, choice_json,
|
| from_json=from_json,
|
| @@ -236,6 +221,7 @@ class Property(object):
|
| self.value = json['value']
|
| if type(self.value) == int:
|
| self.type_ = PropertyType.INTEGER
|
| + self.compiled_type = self.type_
|
| else:
|
| # TODO(kalman): support more types as necessary.
|
| raise ParseException(
|
| @@ -243,6 +229,30 @@ class Property(object):
|
| else:
|
| raise ParseException(
|
| self, 'Property has no type, $ref, choices, or value')
|
| + if 'compiled_type' in json:
|
| + if 'type' in json:
|
| + self.compiled_type = self._JsonTypeToPropertyType(json['compiled_type'])
|
| + else:
|
| + raise ParseException(self, 'Property has compiled_type but no type')
|
| + else:
|
| + self.compiled_type = self.type_
|
| +
|
| + def _JsonTypeToPropertyType(self, json_type):
|
| + try:
|
| + return {
|
| + 'any': PropertyType.ANY,
|
| + 'array': PropertyType.ARRAY,
|
| + 'binary': PropertyType.BINARY,
|
| + 'boolean': PropertyType.BOOLEAN,
|
| + 'integer': PropertyType.INTEGER,
|
| + 'int64': PropertyType.INT64,
|
| + 'function': PropertyType.FUNCTION,
|
| + 'number': PropertyType.DOUBLE,
|
| + 'object': PropertyType.OBJECT,
|
| + 'string': PropertyType.STRING,
|
| + }[json_type]
|
| + except KeyError:
|
| + raise NotImplementedError('Type %s not recognized' % json_type)
|
|
|
| def GetUnixName(self):
|
| """Gets the property's unix_name. Raises AttributeError if not set.
|
| @@ -287,6 +297,7 @@ class PropertyType(object):
|
| return self.name
|
|
|
| INTEGER = _Info(True, "INTEGER")
|
| + INT64 = _Info(True, "INT64")
|
| DOUBLE = _Info(True, "DOUBLE")
|
| BOOLEAN = _Info(True, "BOOLEAN")
|
| STRING = _Info(True, "STRING")
|
|
|