| Index: tools/json_schema_compiler/model.py
|
| diff --git a/tools/json_schema_compiler/model.py b/tools/json_schema_compiler/model.py
|
| index 5ff394af46c471d16ad770a8261580091b1e2ac9..d839ab977be318601d9a79232b1903271fc3ad2e 100644
|
| --- a/tools/json_schema_compiler/model.py
|
| +++ b/tools/json_schema_compiler/model.py
|
| @@ -60,13 +60,22 @@ class Type(object):
|
| - |name| the type name
|
| - |description| the description of the type (if provided)
|
| - |properties| a map of property names to their model.Property
|
| + - |from_client| indicates that instances of the Type can originate from the
|
| + users of generated code, such as top-level types and function results
|
| + - |from_json| indicates that instances of the Type can originate from the
|
| + JSON (as described by the schema), such as top-level types and function
|
| + parameters
|
| """
|
| def __init__(self, json):
|
| self.name = json['id']
|
| self.description = json.get('description')
|
| + self.from_json = True
|
| + self.from_client = True
|
| self.properties = {}
|
| for prop_name, prop_json in json['properties'].items():
|
| - self.properties[prop_name] = Property(prop_name, prop_json)
|
| + self.properties[prop_name] = Property(prop_name, prop_json,
|
| + from_json=True,
|
| + from_client=True)
|
|
|
| class Callback(object):
|
| """A callback parameter to a Function.
|
| @@ -81,7 +90,8 @@ class Callback(object):
|
| return
|
| elif len(params) == 1:
|
| param = params[0]
|
| - self.params.append(Property(param['name'], param))
|
| + self.params.append(Property(param['name'], param,
|
| + from_client=True))
|
| else:
|
| raise AssertionError("Callbacks can have at most a single parameter")
|
|
|
| @@ -106,8 +116,8 @@ class Function(object):
|
| assert (not self.callback), self.name + " has more than one callback"
|
| self.callback = Callback(param)
|
| else:
|
| - self.params.append(Property(param['name'], param))
|
| - assert (self.callback), self.name + " does not support callback"
|
| + self.params.append(Property(param['name'], param,
|
| + from_json=True))
|
|
|
| class Property(object):
|
| """A property of a type OR a parameter to a function.
|
| @@ -125,9 +135,17 @@ class Property(object):
|
| ARRAY
|
| - |properties| the properties of an OBJECT parameter
|
| """
|
| - def __init__(self, name, json):
|
| - if not re.match('^[a-z][a-zA-Z0-9]*$', name):
|
| - raise AssertionError('Name %s must be lowerCamelCase' % name)
|
| + def __init__(self, name, json,
|
| + from_json=False,
|
| + from_client=False):
|
| + """
|
| + Parameters:
|
| + - |from_json| indicates that instances of the Type can originate from the
|
| + JSON (as described by the schema), such as top-level types and function
|
| + parameters
|
| + - |from_client| indicates that instances of the Type can originate from the
|
| + users of generated code, such as top-level types and function results
|
| + """
|
| self.name = name
|
| self._unix_name = _UnixName(self.name)
|
| self._unix_name_used = False
|
| @@ -154,13 +172,20 @@ class Property(object):
|
| elif json_type == 'number':
|
| self.type_ = PropertyType.DOUBLE
|
| elif json_type == 'array':
|
| - self.item_type = Property(name + "Element", json['items'])
|
| + self.item_type = Property(name + "Element", json['items'],
|
| + from_json,
|
| + from_client)
|
| self.type_ = PropertyType.ARRAY
|
| elif json_type == 'object':
|
| - self.properties = {}
|
| self.type_ = PropertyType.OBJECT
|
| - for key, val in json['properties'].items():
|
| - self.properties[key] = Property(key, val)
|
| + # These members are read when this OBJECT Property is used as a Type
|
| + self.properties = {}
|
| + self.from_json = from_json
|
| + self.from_client = from_client
|
| + for key, val in json.get('properties', {}).items():
|
| + self.properties[key] = Property(key, val,
|
| + from_json,
|
| + from_client)
|
| else:
|
| raise NotImplementedError(json_type)
|
| elif 'choices' in json:
|
| @@ -168,7 +193,9 @@ class Property(object):
|
| self.choices = {}
|
| self.type_ = PropertyType.CHOICES
|
| for choice_json in json['choices']:
|
| - choice = Property(self.name, choice_json)
|
| + choice = Property(self.name, choice_json,
|
| + from_json,
|
| + from_client)
|
| # A choice gets its unix_name set in
|
| # cpp_type_generator.GetExpandedChoicesInParams
|
| choice._unix_name = None
|
|
|