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

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

Issue 344453003: Docserver: separate models for apps and extensions (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase/Add comment Created 6 years, 6 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/features_utility.py
diff --git a/chrome/common/extensions/docs/server2/features_utility.py b/chrome/common/extensions/docs/server2/features_utility.py
deleted file mode 100644
index 88b05acb32172fdfa9451fffdf7bd95bd43ae8a1..0000000000000000000000000000000000000000
--- a/chrome/common/extensions/docs/server2/features_utility.py
+++ /dev/null
@@ -1,134 +0,0 @@
-# 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.
-
-'''
-Utility functions for working with the Feature abstraction. Features are grouped
-into a dictionary by name. Each Feature is guaranteed to have the following two
-keys:
- name - a string, the name of the feature
- platform - a list containing 'apps' or 'extensions', both, or neither.
-
-A Feature may have other keys from a _features.json file as well. Features with
-a whitelist are ignored as they are only useful to specific apps or extensions.
-'''
-
-from copy import copy
-
-from branch_utility import BranchUtility
-
-
-def _GetPlatformsForExtensionTypes(extension_types):
- platforms = []
- if extension_types == 'all' or 'platform_app' in extension_types:
- platforms.append('apps')
- if extension_types == 'all' or 'extension' in extension_types:
- platforms.append('extensions')
- return platforms
-
-
-def Parse(features_json):
- '''Process JSON from a _features.json file, standardizing it into a dictionary
- of Features.
- '''
- features = {}
-
- def ignore_feature(name, value):
- '''Returns true if this feature should be ignored. Features are ignored if
- they are only available to whitelisted apps or component extensions/apps, as
- in these cases the APIs are not available to public developers.
-
- Private APIs are also unavailable to public developers, but logic elsewhere
- makes sure they are not listed. So they shouldn't be ignored via this
- mechanism.
- '''
- if name.endswith('Private'):
- return False
- return value.get('location') == 'component' or 'whitelist' in value
-
- for name, rawvalue in features_json.iteritems():
- # Some feature names correspond to a list, typically because they're
- # whitelisted in stable for certain extensions and available in dev for
- # everybody else. Force a list down to a single feature by attempting to
- # remove the entries that don't affect the typical usage of an API.
- if isinstance(rawvalue, list):
- available_values = [subvalue for subvalue in rawvalue
- if not ignore_feature(name, subvalue)]
- if not available_values:
- continue
-
- if len(available_values) == 1:
- value = available_values[0]
- else:
- # Multiple available values probably implies different feature
- # configurations for apps vs extensions. Currently, this is 'commands'.
- # To get the ball rolling, add a hack to combine the extension types.
- # See http://crbug.com/316194.
- extension_types = set()
- for available_value in available_values:
- extension_types.update(available_value.get('extension_types', ()))
-
- # For the base value, select the one with the most recent availability.
- channel_names = BranchUtility.GetAllChannelNames()
- available_values.sort(
- key=lambda v: channel_names.index(v.get('channel', 'stable')))
-
- # Note: copy() is enough because only a single toplevel key is modified.
- value = copy(available_values[0])
- value['extension_types'] = list(extension_types)
- else:
- value = rawvalue
-
- if ignore_feature(name, value):
- continue
-
- # Now we transform 'extension_types' into the more useful 'platforms'.
- #
- # But first, note that 'platforms' has a double meaning. In the docserver
- # model (what we're in the process of generating) it means 'apps' vs
- # 'extensions'. In the JSON features as read from Chrome it means 'win' vs
- # 'mac'. Ignore the latter.
- value.pop('platforms', None)
- extension_types = value.pop('extension_types', None)
-
- platforms = []
- if extension_types is not None:
- platforms = _GetPlatformsForExtensionTypes(extension_types)
-
- features[name] = {
- 'name': name,
- 'platforms': platforms,
- }
- features[name].update(value)
-
- return features
-
-
-def Filtered(features, platform):
- '''Create a new Features dictionary from |features| that contains only items
- relevant to |platform|. Feature values are unmodified; callers should
- deepcopy() if they need to modify them.
- '''
- return dict((name, feature) for name, feature in features.iteritems()
- if platform in feature['platforms'])
-
-
-def MergedWith(features, other):
- '''Merge |features| with an additional dictionary to create a new features
- dictionary. If a feature is common to both |features| and |other|, then it is
- merged using the standard dictionary update instead of being overwritten.
- Returns the new Features dictionary.
- '''
- for key, value in other.iteritems():
- if key in features:
- features[key].update(value)
- else:
- features[key] = value
-
- # Ensure the Feature schema is enforced for all added items.
- if not 'name' in features[key]:
- features[key]['name'] = key
- if not 'platforms' in features[key]:
- features[key]['platforms'] = []
-
- return features

Powered by Google App Engine
This is Rietveld 408576698