Index: tools/json_schema_compiler/model.py |
diff --git a/tools/json_schema_compiler/model.py b/tools/json_schema_compiler/model.py |
index 3de975caebe2fe0ad7ef694c9d618fe6fd4d2432..741a1b594f3c8baf478f63fd1b7340e161a3b765 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,45 @@ class Model(object): |
self.namespaces[namespace.name] = namespace |
return namespace |
+ |
+def CreateFeature(name, model): |
+ if isinstance(model, dict): |
+ return SimpleFeature(name, model) |
+ return ComplexFeature(name, [SimpleFeature(name, child) for child in model]) |
+ |
+ |
+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): |
+ self.name = feature_name |
+ self.unix_name = UnixName(self.name) |
+ self.feature_list = 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 |
+ - |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): |
+ self.name = feature_name |
+ self.unix_name = UnixName(self.name) |
+ self.channel = feature_def['channel'] |
+ self.extension_types = feature_def['extension_types'] |
+ self.whitelist = feature_def.get('whitelist') |
+ |
+ |
class Namespace(object): |
"""An API namespace. |
@@ -75,6 +116,7 @@ class Namespace(object): |
if include_compiler_options else {}) |
self.documentation_options = json.get('documentation_options', {}) |
+ |
class Origin(object): |
"""Stores the possible origin of model object as a pair of bools. These are: |
@@ -93,6 +135,7 @@ class Origin(object): |
self.from_client = from_client |
self.from_json = from_json |
+ |
class Type(object): |
"""A Type defined in the json. |
@@ -199,6 +242,7 @@ class Type(object): |
else: |
raise ParseException(self, 'Unsupported JSON type %s' % json_type) |
+ |
class Function(object): |
"""A Function defined in the API. |
@@ -272,6 +316,7 @@ class Function(object): |
namespace, |
origin) |
+ |
class Property(object): |
"""A property of a type OR a parameter to a function. |
Properties: |
@@ -384,11 +429,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. |
""" |
@@ -406,6 +453,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. |
@@ -427,11 +475,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 = [] |
@@ -443,6 +493,7 @@ def _GetModelHierarchy(entity): |
hierarchy.reverse() |
return hierarchy |
+ |
def _GetTypes(parent, json, namespace, origin): |
"""Creates Type objects extracted from |json|. |
""" |
@@ -452,6 +503,7 @@ def _GetTypes(parent, json, namespace, origin): |
types[type_.name] = type_ |
return types |
+ |
def _GetFunctions(parent, json, namespace): |
"""Creates Function objects extracted from |json|. |
""" |
@@ -465,6 +517,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|. |
""" |
@@ -478,6 +531,7 @@ def _GetEvents(parent, json, namespace): |
events[event.name] = event |
return events |
+ |
def _GetProperties(parent, json, namespace, origin): |
"""Generates Property objects extracted from |json|. |
""" |
@@ -486,10 +540,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. |
""" |
@@ -499,6 +555,7 @@ class Platforms(object): |
MAC = _PlatformInfo("mac") |
WIN = _PlatformInfo("win") |
+ |
def _GetPlatforms(json): |
if 'platforms' not in json or json['platforms'] == None: |
return None |