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

Unified Diff: chrome/common/extensions/docs/server2/manifest_features.py

Issue 23867003: Docserver: Consolidate features caching and access. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: . 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: chrome/common/extensions/docs/server2/manifest_features.py
diff --git a/chrome/common/extensions/docs/server2/manifest_features.py b/chrome/common/extensions/docs/server2/manifest_features.py
index e535592482fec1c804afd4ac82951356528114a5..8a487c6348a410f1f60ea4cf28f76cfa59ef9f1f 100644
--- a/chrome/common/extensions/docs/server2/manifest_features.py
+++ b/chrome/common/extensions/docs/server2/manifest_features.py
@@ -12,7 +12,11 @@ indicating how an app or extension should define a manifest property. If 'level'
is missing, 'optional' is assumed.
'''
+import json
+
+from features import Features
import features_utility
+from third_party.json_schema_compiler.json_parse import Parse
def CreateManifestFeatures(features_json, manifest_json, filter_platform=None):
'''Create a manifest features dictionary by normalizing |features_json| and
@@ -60,3 +64,116 @@ def ConvertDottedKeysToNested(features):
insert_children(features)
return features
+
+def _ListifyAndSortDocs(features, app_name):
not at google - send to devlin 2013/09/23 18:31:30 most of this code is specifically for passing to t
+ '''Convert a |features| dictionary, and all 'children' dictionaries, into
+ lists recursively. Sort lists first by 'level' then by name.
+ '''
+ def sort_key(item):
+ '''Key function to sort items primarily by level (according to index into
+ levels) then subsort by name.
+ '''
+ levels = ('required', 'recommended', 'only_one', 'optional')
+
+ return (levels.index(item.get('level', 'optional')), item['name'])
+
+ def coerce_example_to_feature(feature):
+ '''To display json in examples more clearly, convert the example of
+ |feature| into the feature format, with a name and children, to be rendered
+ by the templates. Only applicable to examples that are dictionaries.
+ '''
+ if not isinstance(feature.get('example'), dict):
+ if 'example' in feature:
+ feature['example'] = json.dumps(feature['example'])
+ return
+ # Add any keys/value pairs in the dict as children
+ for key, value in feature['example'].iteritems():
+ if not 'children' in feature:
+ feature['children'] = {}
+ feature['children'][key] = { 'name': key, 'example': value }
+ del feature['example']
+ del feature['has_example']
+
+ def convert_and_sort(features):
+ for key, value in features.items():
+ if 'example' in value:
+ value['has_example'] = True
+ example = json.dumps(value['example'])
+ if example == '{}':
+ value['example'] = '{...}'
+ elif example == '[]':
+ value['example'] = '[...]'
+ else:
+ coerce_example_to_feature(value)
+ if 'children' in value:
+ features[key]['children'] = convert_and_sort(value['children'])
+ return sorted(features.values(), key=sort_key)
+
+ # Replace {{title}} in the 'name' manifest property example with |app_name|
+ if 'name' in features:
+ name = features['name']
+ name['example'] = name['example'].replace('{{title}}', app_name)
+
+ features = convert_and_sort(features)
+
+ return features
+
+def _AddLevelAnnotations(features):
+ '''Add level annotations to |features|. |features| and children lists must be
+ sorted by 'level'. Annotations are added to the first item in a group of
+ features of the same 'level'.
+
+ The last item in a list has 'is_last' set to True.
+ '''
+ annotations = {
+ 'required': 'Required',
+ 'recommended': 'Recommended',
+ 'only_one': 'Pick one (or none)',
+ 'optional': 'Optional'
+ }
+
+ def add_annotation(item, annotation):
+ if not 'annotations' in item:
+ item['annotations'] = []
+ item['annotations'].insert(0, annotation)
+
+ def annotate(parent_level, features):
+ current_level = parent_level
+ for item in features:
+ level = item.get('level', 'optional')
+ if level != current_level:
+ add_annotation(item, annotations[level])
+ current_level = level
+ if 'children' in item:
+ annotate(level, item['children'])
+ if features:
+ features[-1]['is_last'] = True
+
+ annotate('required', features)
+ return features
+
+class ManifestFeatures(Features):
+ '''Subclass of Features to provide special annotation and ordering as well as
+ the merging of _manifest_features.json data with manifest.json.
+ '''
+ def __init__(self,
+ compiled_fs_factory,
+ manifest_features_path,
+ file_system,
+ manifest_json_path):
+ self._file_system = file_system
+ self._manifest_json_path = manifest_json_path
+ super(ManifestFeatures, self).__init__(compiled_fs_factory,
+ manifest_features_path)
+
+ def Parse(self, features_json):
+ manifest_json = Parse(
+ self._file_system.ReadSingle(self._manifest_json_path))
+ return CreateManifestFeatures(features_json, manifest_json)
+
+ def FilterByPlatform(self, features, platform):
+ features = super(ManifestFeatures, self).FilterByPlatform(features,
+ platform)
+ return _AddLevelAnnotations(
+ _ListifyAndSortDocs(ConvertDottedKeysToNested(features),
+ app_name=platform.capitalize()))

Powered by Google App Engine
This is Rietveld 408576698