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 |