OLD | NEW |
1 # Copyright 2013-2015 The Chromium Authors. All rights reserved. | 1 # Copyright 2013-2015 The Chromium Authors. All rights reserved. |
2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
4 | 4 |
5 import abc | 5 import abc |
6 import re | 6 import re |
7 | 7 |
8 from collections import namedtuple | 8 from collections import namedtuple |
9 | 9 |
10 from infra.libs import infra_types | 10 from . import types |
11 | |
12 | 11 |
13 RECIPE_MODULE_PREFIX = 'RECIPE_MODULES' | 12 RECIPE_MODULE_PREFIX = 'RECIPE_MODULES' |
14 | 13 |
15 | 14 |
16 def ResetTostringFns(): | 15 def ResetTostringFns(): |
17 RecipeConfigType._TOSTRING_MAP.clear() # pylint: disable=W0212 | 16 RecipeConfigType._TOSTRING_MAP.clear() # pylint: disable=W0212 |
18 | 17 |
19 | 18 |
20 def json_fixup(obj): | 19 def json_fixup(obj): |
21 if isinstance(obj, RecipeConfigType): | 20 if isinstance(obj, RecipeConfigType): |
22 return str(obj) | 21 return str(obj) |
23 thawed = infra_types.thaw(obj) | 22 if isinstance(obj, types.FrozenDict): |
24 if thawed is not obj: # i.e. it was a frozen type | 23 return dict(obj) |
25 return thawed | |
26 raise TypeError("%r is not JSON serializable" % obj) | 24 raise TypeError("%r is not JSON serializable" % obj) |
27 | 25 |
28 | 26 |
29 class RecipeConfigType(object): | 27 class RecipeConfigType(object): |
30 """Base class for custom Recipe config types, intended to be subclassed. | 28 """Base class for custom Recipe config types, intended to be subclassed. |
31 | 29 |
32 RecipeConfigTypes are meant to be PURE data. There should be no dependency on | 30 RecipeConfigTypes are meant to be PURE data. There should be no dependency on |
33 any external systems (i.e. no importing sys, os, etc.). | 31 any external systems (i.e. no importing sys, os, etc.). |
34 | 32 |
35 The subclasses should override default_tostring_fn. This method should | 33 The subclasses should override default_tostring_fn. This method should |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
155 return child.pieces[:len(self.pieces)] == self.pieces | 153 return child.pieces[:len(self.pieces)] == self.pieces |
156 | 154 |
157 def default_tostring_fn(self): | 155 def default_tostring_fn(self): |
158 suffix = '' | 156 suffix = '' |
159 if self.platform_ext: | 157 if self.platform_ext: |
160 suffix = ', platform_ext=%r' % (self.platform_ext,) | 158 suffix = ', platform_ext=%r' % (self.platform_ext,) |
161 pieces = '' | 159 pieces = '' |
162 if self.pieces: | 160 if self.pieces: |
163 pieces = ', ' + (', '.join(map(repr, self.pieces))) | 161 pieces = ', ' + (', '.join(map(repr, self.pieces))) |
164 return 'Path(\'%s\'%s%s)' % (self.base, pieces, suffix) | 162 return 'Path(\'%s\'%s%s)' % (self.base, pieces, suffix) |
OLD | NEW |