Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(63)

Unified Diff: tools/json_schema_compiler/model.py

Issue 23594008: Initial code generation for features. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Addressing comments. Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698