Chromium Code Reviews| Index: tools/json_schema_compiler/model.py |
| diff --git a/tools/json_schema_compiler/model.py b/tools/json_schema_compiler/model.py |
| index 082fbc60f85910a71bcdb5c5d4ea94423bdeb8e7..cb1826da075f9c9cbfc47cb4b3aba8ddf143a04e 100644 |
| --- a/tools/json_schema_compiler/model.py |
| +++ b/tools/json_schema_compiler/model.py |
| @@ -7,6 +7,7 @@ import os.path |
| from json_parse import OrderedDict |
| from memoize import memoize |
| + |
| class ParseException(Exception): |
| """Thrown when data in the model is invalid. |
| """ |
| @@ -16,6 +17,7 @@ class ParseException(Exception): |
| Exception.__init__( |
| self, 'Model parse exception at:\n' + '\n'.join(hierarchy)) |
| + |
| class Model(object): |
| """Model of all namespaces that comprise an API. |
| @@ -34,6 +36,48 @@ class Model(object): |
| self.namespaces[namespace.name] = namespace |
| return namespace |
| + |
| +class ComplexFeature(object): |
| + """A complex feature which may be made of several simple features. |
| + |
| + Properties: |
| + - |name| the name of the feature |
| + - |unix_name| the unix_name of the feature |
| + - |feature_list| a list of simple features which make up the feature |
| + """ |
| + def __init__(self, feature_name, features, source_file): |
|
not at google - send to devlin
2013/09/17 01:28:07
I thought you weren't using the source_file here a
dhnishi (use Chromium)
2013/09/17 18:17:47
That is correct. Extraneous parameter removed.
|
| + self.name = feature_name |
| + self.unix_name = UnixName(self.name) |
| + self.feature_list = [] |
| + if isinstance(features, dict): |
|
not at google - send to devlin
2013/09/17 01:28:07
instead of this, have a factory method defined in
dhnishi (use Chromium)
2013/09/17 18:17:47
Done.
|
| + self.feature_list.append(SimpleFeature(feature_name, features, |
| + source_file)) |
| + else: |
| + self.feature_list += [SimpleFeature(feature_name, single_def, source_file) |
| + for single_def in features] |
| + |
| + |
| +class SimpleFeature(object): |
| + """A simple feature, which can make up a complex feature, as specified in |
| + files such as chrome/common/extensions/api/_permission_features.json. |
| + |
| + Properties: |
| + - |name| the name of the feature |
| + - |unix_name| the unix_name of the feature |
| + - |source_file| the file that contained the namespace definition |
| + - |channel| the channel where the feature is released |
| + - |extension_types| the types which can use the feature |
| + - |whitelist| a list of extensions allowed to use the feature |
| + """ |
| + def __init__(self, feature_name, feature_def, source_file): |
| + self.name = feature_name |
| + self.unix_name = UnixName(self.name) |
| + self.source_file = source_file |
| + self.channel = feature_def['channel'] |
| + self.extension_types = feature_def['extension_types'] |
| + self.whitelist = feature_def.get('whitelist') |
| + |
| + |
| class Namespace(object): |
| """An API namespace. |
| @@ -74,6 +118,7 @@ class Namespace(object): |
| self.compiler_options = (json.get('compiler_options', {}) |
| if include_compiler_options else {}) |
| + |
| class Origin(object): |
| """Stores the possible origin of model object as a pair of bools. These are: |
| @@ -92,6 +137,7 @@ class Origin(object): |
| self.from_client = from_client |
| self.from_json = from_json |
| + |
| class Type(object): |
| """A Type defined in the json. |
| @@ -198,6 +244,7 @@ class Type(object): |
| else: |
| raise ParseException(self, 'Unsupported JSON type %s' % json_type) |
| + |
| class Function(object): |
| """A Function defined in the API. |
| @@ -268,6 +315,7 @@ class Function(object): |
| namespace, |
| origin) |
| + |
| class Property(object): |
| """A property of a type OR a parameter to a function. |
| Properties: |
| @@ -339,6 +387,7 @@ class Property(object): |
| unix_name = property(GetUnixName, SetUnixName) |
| + |
| class _Enum(object): |
| """Superclass for enum types with a "name" field, setting up repr/eq/ne. |
| Enums need to do this so that equality/non-equality work over pickling. |
| @@ -366,11 +415,13 @@ class _Enum(object): |
| def __str__(self): |
| return repr(self) |
| + |
| class _PropertyTypeInfo(_Enum): |
| def __init__(self, is_fundamental, name): |
| _Enum.__init__(self, name) |
| self.is_fundamental = is_fundamental |
| + |
| class PropertyType(object): |
| """Enum of different types of properties/parameters. |
| """ |
| @@ -388,6 +439,7 @@ class PropertyType(object): |
| REF = _PropertyTypeInfo(False, "ref") |
| STRING = _PropertyTypeInfo(True, "string") |
| + |
| @memoize |
| def UnixName(name): |
| '''Returns the unix_style name for a given lowerCamelCase string. |
| @@ -409,11 +461,13 @@ def UnixName(name): |
| unix_name.append(c.lower()) |
| return ''.join(unix_name) |
| + |
| def _StripNamespace(name, namespace): |
| if name.startswith(namespace.name + '.'): |
| return name[len(namespace.name + '.'):] |
| return name |
| + |
| def _GetModelHierarchy(entity): |
| """Returns the hierarchy of the given model entity.""" |
| hierarchy = [] |
| @@ -425,6 +479,7 @@ def _GetModelHierarchy(entity): |
| hierarchy.reverse() |
| return hierarchy |
| + |
| def _GetTypes(parent, json, namespace, origin): |
| """Creates Type objects extracted from |json|. |
| """ |
| @@ -434,6 +489,7 @@ def _GetTypes(parent, json, namespace, origin): |
| types[type_.name] = type_ |
| return types |
| + |
| def _GetFunctions(parent, json, namespace): |
| """Creates Function objects extracted from |json|. |
| """ |
| @@ -447,6 +503,7 @@ def _GetFunctions(parent, json, namespace): |
| functions[function.name] = function |
| return functions |
| + |
| def _GetEvents(parent, json, namespace): |
| """Creates Function objects generated from the events in |json|. |
| """ |
| @@ -460,6 +517,7 @@ def _GetEvents(parent, json, namespace): |
| events[event.name] = event |
| return events |
| + |
| def _GetProperties(parent, json, namespace, origin): |
| """Generates Property objects extracted from |json|. |
| """ |
| @@ -468,10 +526,12 @@ def _GetProperties(parent, json, namespace, origin): |
| properties[name] = Property(parent, name, property_json, namespace, origin) |
| return properties |
| + |
| class _PlatformInfo(_Enum): |
| def __init__(self, name): |
| _Enum.__init__(self, name) |
| + |
| class Platforms(object): |
| """Enum of the possible platforms. |
| """ |
| @@ -481,6 +541,7 @@ class Platforms(object): |
| MAC = _PlatformInfo("mac") |
| WIN = _PlatformInfo("win") |
| + |
| def _GetPlatforms(json): |
| if 'platforms' not in json: |
| return None |