diff options
author | kalman@chromium.org <kalman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-01-10 04:05:55 +0000 |
---|---|---|
committer | kalman@chromium.org <kalman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-01-10 04:05:55 +0000 |
commit | 3044046b89190e30dedbfe43b8b021ed44a85e5d (patch) | |
tree | 60cbaede9751a3d3e4532e15bdd6268dbac4dd48 /tools/json_schema_compiler/model.py | |
parent | b40ffe723a35565425c58c581144d7b697593c03 (diff) | |
download | chromium_src-3044046b89190e30dedbfe43b8b021ed44a85e5d.zip chromium_src-3044046b89190e30dedbfe43b8b021ed44a85e5d.tar.gz chromium_src-3044046b89190e30dedbfe43b8b021ed44a85e5d.tar.bz2 |
Run the JSON Schema Compiler's bundle compilation on JSON files. Previously it
was only run on IDL files. Clean up all the code which that simplifies.
TBR=isherman@chromium.org,battre@chromium.org,akalin@chromium.org
BUG=141318
Review URL: https://chromiumcodereview.appspot.com/11747025
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@176015 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'tools/json_schema_compiler/model.py')
-rw-r--r-- | tools/json_schema_compiler/model.py | 76 |
1 files changed, 63 insertions, 13 deletions
diff --git a/tools/json_schema_compiler/model.py b/tools/json_schema_compiler/model.py index b583712..36be5a3 100644 --- a/tools/json_schema_compiler/model.py +++ b/tools/json_schema_compiler/model.py @@ -26,10 +26,12 @@ class Model(object): def __init__(self): self.namespaces = {} - def AddNamespace(self, json, source_file): + def AddNamespace(self, json, source_file, include_compiler_options=False): """Add a namespace's json to the model and returns the namespace. """ - namespace = Namespace(json, source_file) + namespace = Namespace(json, + source_file, + include_compiler_options=include_compiler_options) self.namespaces[namespace.name] = namespace return namespace @@ -42,21 +44,28 @@ class Namespace(object): - |source_file| the file that contained the namespace definition - |source_file_dir| the directory component of |source_file| - |source_file_filename| the filename component of |source_file| + - |platforms| if not None, the list of platforms that the namespace is + available to - |types| a map of type names to their model.Type - |functions| a map of function names to their model.Function - |events| a map of event names to their model.Function - |properties| a map of property names to their model.Property + - |compiler_options| the compiler_options dict, only present if + |include_compiler_options| is True """ - def __init__(self, json, source_file): + def __init__(self, json, source_file, include_compiler_options=False): self.name = json['namespace'] self.unix_name = UnixName(self.name) self.source_file = source_file self.source_file_dir, self.source_file_filename = os.path.split(source_file) self.parent = None + self.platforms = _GetPlatforms(json) _AddTypes(self, json, self) _AddFunctions(self, json, self) _AddEvents(self, json, self) _AddProperties(self, json, self) + if include_compiler_options: + self.compiler_options = json.get('compiler_options', {}) class Type(object): """A Type defined in the json. @@ -127,13 +136,15 @@ class Function(object): Properties: - |name| the function name + - |platforms| if not None, the list of platforms that the function is + available to - |params| a list of parameters to the function (order matters). A separate - parameter is used for each choice of a 'choices' parameter. + parameter is used for each choice of a 'choices' parameter - |description| a description of the function (if provided) - |callback| the callback parameter to the function. There should be exactly - one + one - |optional| whether the Function is "optional"; this only makes sense to be - present when the Function is representing a callback property. + present when the Function is representing a callback property - |simple_name| the name of this Function without a namespace """ def __init__(self, @@ -144,6 +155,7 @@ class Function(object): from_client=False): self.name = json['name'] self.simple_name = _StripNamespace(self.name, namespace) + self.platforms = _GetPlatforms(json) self.params = [] self.description = json.get('description') self.callback = None @@ -357,23 +369,37 @@ class Property(object): unix_name = property(GetUnixName, SetUnixName) -class _PropertyTypeInfo(object): - """This class is not an inner class of |PropertyType| so it can be pickled. +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. """ - def __init__(self, is_fundamental, name): - self.is_fundamental = is_fundamental + + @staticmethod + def GetAll(cls): + """Yields all _Enum objects declared in |cls|. + """ + for prop_key in dir(cls): + prop_value = getattr(cls, prop_key) + if isinstance(prop_value, _Enum): + yield prop_value + + def __init__(self, name): self.name = name - def __repr__(self): + def __repr(self): return self.name def __eq__(self, other): - return isinstance(other, _PropertyTypeInfo) and self.name == other.name + return type(other) == type(self) and other.name == self.name def __ne__(self, other): - # Yes. You seriously do need this. return not (self == other) +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. """ @@ -461,3 +487,27 @@ def _AddProperties(model, namespace, from_json=from_json, from_client=from_client) + +class _PlatformInfo(_Enum): + def __init__(self, name): + _Enum.__init__(self, name) + +class Platforms(object): + """Enum of the possible platforms. + """ + CHROMEOS = _PlatformInfo("chromeos") + CHROMEOS_TOUCH = _PlatformInfo("chromeos_touch") + LINUX = _PlatformInfo("linux") + MAC = _PlatformInfo("mac") + WIN = _PlatformInfo("win") + +def _GetPlatforms(json): + if 'platforms' not in json: + return None + platforms = [] + for platform_name in json['platforms']: + for platform_enum in _Enum.GetAll(Platforms): + if platform_name == platform_enum.name: + platforms.append(platform_enum) + break + return platforms |