| 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..2315cbb6c04e49dedebfd87ef70115aec9968735
|
| --- /dev/null
|
| +++ b/chrome/common/extensions/docs/server2/manifest_data_source.py
|
| @@ -0,0 +1,90 @@
|
| +# 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
|
| +
|
| +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):
|
| + self._manifest_path = manifest_path
|
| + self._features_path = features_path
|
| + self._file_system = file_system
|
| + self._cache = compiled_fs_factory.Create(
|
| + self._CreateManifestData, ManifestDataSource)
|
| +
|
| + 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|.
|
| + """
|
| + def create_manifest_dict():
|
| + d = OrderedDict()
|
| + for category in ['required', 'only_one', 'recommended', 'optional']:
|
| + d[category] = []
|
| + return d
|
| +
|
| + apps = create_manifest_dict()
|
| + extensions = create_manifest_dict()
|
| +
|
| + manifest_json = Parse(content)
|
| + features_json = Parse(self._file_system.ReadSingle(
|
| + self._features_path))
|
| +
|
| + 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]
|
|
|