Index: third_party/recipe_engine/config_types.py |
diff --git a/third_party/recipe_engine/config_types.py b/third_party/recipe_engine/config_types.py |
deleted file mode 100644 |
index 5dd216e1fcaed3a0494c83efb62110c980415e84..0000000000000000000000000000000000000000 |
--- a/third_party/recipe_engine/config_types.py |
+++ /dev/null |
@@ -1,164 +0,0 @@ |
-# Copyright 2013-2015 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. |
- |
-import abc |
-import re |
- |
-from collections import namedtuple |
- |
-from infra.libs import infra_types |
- |
- |
-RECIPE_MODULE_PREFIX = 'RECIPE_MODULES' |
- |
- |
-def ResetTostringFns(): |
- RecipeConfigType._TOSTRING_MAP.clear() # pylint: disable=W0212 |
- |
- |
-def json_fixup(obj): |
- if isinstance(obj, RecipeConfigType): |
- return str(obj) |
- thawed = infra_types.thaw(obj) |
- if thawed is not obj: # i.e. it was a frozen type |
- return thawed |
- raise TypeError("%r is not JSON serializable" % obj) |
- |
- |
-class RecipeConfigType(object): |
- """Base class for custom Recipe config types, intended to be subclassed. |
- |
- RecipeConfigTypes are meant to be PURE data. There should be no dependency on |
- any external systems (i.e. no importing sys, os, etc.). |
- |
- The subclasses should override default_tostring_fn. This method should |
- produce a string representation of the object. This string representation |
- should contain all of the data members of the subclass. This representation |
- will be used during the execution of the recipe_config_tests. |
- |
- External entities (usually recipe modules), can override the default |
- tostring_fn method by calling <RecipeConfigType |
- subclass>.set_tostring_fn(<new method>). This new method will receive an |
- instance of the RecipeConfigType subclass as its single argument, and is |
- expected to return a string. There is no restriction on the data that the |
- override tostring_fn may use. For example, the Path class in this module has |
- its tostring_fn overridden by the 'path' recipe_module. This new tostring_fn |
- uses data from the current recipe run, like the host os, to return platform |
- specific strings using the data in the Path object. |
- """ |
- _TOSTRING_MAP = {} |
- |
- @property |
- def tostring_fn(self): |
- cls = self.__class__ |
- return self._TOSTRING_MAP.get(cls.__name__, cls.default_tostring_fn) |
- |
- @classmethod |
- def set_tostring_fn(cls, new_tostring_fn): |
- assert cls.__name__ not in cls._TOSTRING_MAP, ( |
- 'tostring_fn already installed for %s' % cls) |
- cls._TOSTRING_MAP[cls.__name__] = new_tostring_fn |
- |
- def default_tostring_fn(self): |
- raise NotImplementedError |
- |
- def __str__(self): |
- return self.tostring_fn(self) # pylint: disable=not-callable |
- |
- |
-class BasePath(object): |
- __metaclass__ = abc.ABCMeta |
- |
- |
-class NamedBasePath(BasePath, namedtuple('NamedBasePath', 'name')): |
- # Restrict basenames to '[ALL_CAPS]'. This will help catch |
- # errors if someone attempts to provide an actual string path '/some/example' |
- # as the 'base'. |
- BASE_RE = re.compile(r'\[([A-Z][A-Z_]*)\]') |
- |
- @staticmethod |
- def parse(base): |
- base_match = NamedBasePath.BASE_RE.match(base) |
- assert base_match, 'Base should be [ALL_CAPS], got %r' % base |
- return NamedBasePath(base_match.group(1).lower()) |
- |
- def __repr__(self): |
- return '[%s]' % self.name.upper() |
- |
- |
-class ModuleBasePath(BasePath, namedtuple('ModuleBasePath', 'module')): |
- def __repr__(self): |
- prefix = '%s.' % RECIPE_MODULE_PREFIX |
- assert self.module.__name__.startswith(prefix) |
- name = self.module.__name__[len(prefix):] |
- return 'RECIPE_MODULE[%s]' % name |
- |
- |
-class Path(RecipeConfigType): |
- """Represents a path which is relative to a semantically-named base. |
- |
- Because there's a lot of platform (separator style) and runtime-specific |
- context (working directory) which goes into assembling a final OS-specific |
- absolute path, we only store three context-free attributes in this Path |
- object. |
- """ |
- |
- def __init__(self, base, *pieces, **kwargs): |
- """Creates a Path |
- |
- Args: |
- base (str) - The 'name' of a base path, to be filled in at recipe runtime |
- by the 'path' recipe module. |
- pieces (tuple(str)) - The components of the path relative to base. These |
- pieces must be non-relative (i.e. no '..' or '.', etc. as a piece). |
- |
- Kwargs: |
- platform_ext (dict(str, str)) - A mapping from platform name (as defined |
- by the 'platform' module), to a suffix for the path. |
- """ |
- super(Path, self).__init__() |
- assert all(isinstance(x, basestring) for x in pieces), pieces |
- assert not any(x in ('..', '.', '/', '\\') for x in pieces) |
- self.pieces = pieces |
- |
- if isinstance(base, BasePath): |
- self.base = base |
- elif isinstance(base, basestring): |
- self.base = NamedBasePath.parse(base) |
- else: |
- raise ValueError('%s is not a valid base path' % base) |
- |
- self.platform_ext = kwargs.get('platform_ext', {}) |
- |
- def __eq__(self, other): |
- return (self.base == other.base and |
- self.pieces == other.pieces and |
- self.platform_ext == other.platform_ext) |
- |
- def __ne__(self, other): |
- return not self.base == other |
- |
- def join(self, *pieces, **kwargs): |
- kwargs.setdefault('platform_ext', self.platform_ext) |
- return Path(self.base, *filter(bool, self.pieces + pieces), **kwargs) |
- |
- def is_parent_of(self, child): |
- """True if |child| is in a subdirectory of this path.""" |
- # Assumes base paths are not nested. |
- # TODO(vadimsh): We should not rely on this assumption. |
- if self.base != child.base: |
- return False |
- # A path is not a parent to itself. |
- if len(self.pieces) >= len(child.pieces): |
- return False |
- return child.pieces[:len(self.pieces)] == self.pieces |
- |
- def default_tostring_fn(self): |
- suffix = '' |
- if self.platform_ext: |
- suffix = ', platform_ext=%r' % (self.platform_ext,) |
- pieces = '' |
- if self.pieces: |
- pieces = ', ' + (', '.join(map(repr, self.pieces))) |
- return 'Path(\'%s\'%s%s)' % (self.base, pieces, suffix) |