Chromium Code Reviews| Index: chrome/common/extensions/docs/server2/manifest_data_source.py |
| diff --git a/chrome/common/extensions/docs/server2/manifest_data_source.py b/chrome/common/extensions/docs/server2/manifest_data_source.py |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..1ae59f4562687239ca549b349674a32f25a698d4 |
| --- /dev/null |
| +++ b/chrome/common/extensions/docs/server2/manifest_data_source.py |
| @@ -0,0 +1,87 @@ |
| +# Copyright 2013 The Chromium Authors. All rights reserved. |
| +# Use of this source code is governed by a BSD-style license that can be |
| +# found in the LICENSE file. |
| + |
| +from collections import OrderedDict |
| +from copy import deepcopy |
| +from operator import itemgetter |
| + |
| +from third_party.json_schema_compiler.json_parse import Parse |
| + |
| +def create_dict(): |
|
not at google - send to devlin
2013/05/11 22:19:04
if a function is only relevant to a couple of loca
jshumway
2013/05/11 22:50:42
Done.
|
| + d = OrderedDict() |
| + for category in ['required', 'only_one', 'recommended', 'optional']: |
| + d[category] = [] |
| + return d |
| + |
| +class ManifestDataSource(object): |
| + """ Provides a template with access to manifest properties specific to apps or |
| + extensions. |
| + """ |
| + def __init__(self, compiled_fs_factory, file_system, manifest_path, |
| + features_path, channel): |
|
not at google - send to devlin
2013/05/11 22:19:04
channel not needed anymore
also if things don't f
jshumway
2013/05/11 22:50:42
Done.
|
| + self._manifest_path = manifest_path |
| + self._features_path = features_path |
| + self._file_system = file_system |
| + self._cache = compiled_fs_factory.Create( |
| + self._CreateManifestData, ManifestDataSource) |
| + self._channel = channel |
| + |
| + def _ApplyAppsTransformations(self, manifest): |
| + manifest['required'][0]['example'] = 'Application' |
| + manifest['optional'][-1]['is_last'] = True |
| + |
| + def _ApplyExtensionsTransformations(self, manifest): |
| + manifest['optional'][-1]['is_last'] = True |
| + |
| + def _CreateManifestData(self, _, content): |
| + """Take the contents of |_manifest_path| and create apps and extensions |
| + versions of a manifest example based on the contents of |_features_path|. |
| + """ |
| + manifest_json = Parse(content) |
| + features_json = Parse(self._file_system.Read( |
|
not at google - send to devlin
2013/05/11 22:19:04
ReadSingle
jshumway
2013/05/11 22:50:42
Done.
|
| + [self._features_path]).Get()[self._features_path]) |
| + apps = create_dict() |
| + extensions = create_dict() |
| + |
| + def add_property(feature, manifest_key, category): |
| + """If |feature|, from features_json, has the correct extension_types, add |
| + |manifest_key| to either apps or extensions. |
| + """ |
| + added = False |
| + extension_types = feature['extension_types'] |
| + if extension_types == 'all' or 'platform_app' in extension_types: |
| + apps[category].append(deepcopy(manifest_key)) |
| + added = True |
| + if extension_types == 'all' or 'extension' in extension_types: |
| + extensions[category].append(deepcopy(manifest_key)) |
| + added = True |
| + return added |
| + |
| + # Property types are: required, only_one, recommended, and optional. |
| + for category in manifest_json: |
| + for manifest_key in manifest_json[category]: |
| + # If a property is in manifest.json but not _manifest_features, this |
| + # will cause an error. |
| + feature = features_json[manifest_key['name']] |
| + if add_property(feature, manifest_key, category): |
| + del features_json[manifest_key['name']] |
| + |
| + # All of the properties left in features_json are assumed to be optional. |
| + for feature in features_json.keys(): |
| + item = features_json[feature] |
| + # Handles instances where a features entry is a union with a whitelist. |
| + if isinstance(item, list): |
| + item = item[0] |
| + add_property(item, {'name': feature}, 'optional') |
| + |
| + apps['optional'].sort(key=itemgetter('name')) |
| + extensions['optional'].sort(key=itemgetter('name')) |
| + |
| + self._ApplyAppsTransformations(apps) |
| + self._ApplyExtensionsTransformations(extensions) |
| + |
| + return {'apps': apps, 'extensions': extensions} |
| + |
| + def get(self, key): |
| + return self._cache.GetFromFile(self._manifest_path)[key] |