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

Side by Side Diff: recipe_engine/util.py

Issue 1773273003: Make output placeholders like json.output index-able by name. (Closed) Base URL: https://chromium.googlesource.com/external/github.com/luci/recipes-py@master
Patch Set: Created 4 years, 9 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 unified diff | Download patch
OLDNEW
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 contextlib 5 import contextlib
6 import functools 6 import functools
7 import os 7 import os
8 import sys 8 import sys
9 import traceback 9 import traceback
10 import urllib 10 import urllib
(...skipping 16 matching lines...) Expand all
27 if self.owner_module is None: 27 if self.owner_module is None:
28 raise ModuleInjectionError( 28 raise ModuleInjectionError(
29 "RecipeApi has no dependency %r. (Add it to DEPS?)" % (key,)) 29 "RecipeApi has no dependency %r. (Add it to DEPS?)" % (key,))
30 else: 30 else:
31 raise ModuleInjectionError( 31 raise ModuleInjectionError(
32 "Recipe Module %r has no dependency %r. (Add it to __init__.py:DEPS?)" 32 "Recipe Module %r has no dependency %r. (Add it to __init__.py:DEPS?)"
33 % (self.owner_module.name, key)) 33 % (self.owner_module.name, key))
34 34
35 35
36 class Placeholder(object): 36 class Placeholder(object):
37 DEFAULT_ID = object()
38
37 """Base class for json placeholders. Do not use directly.""" 39 """Base class for json placeholders. Do not use directly."""
38 def __init__(self): 40 def __init__(self, id=None):
iannucci 2016/03/10 03:17:42 I think you can do id=DEFAULT_ID or maybe
stgao 2016/03/10 20:34:23 No. We can't do that, because subclasses will call
39 self.name_pieces = None 41 self.name_pieces = None
42 self.id = id or Placeholder.DEFAULT_ID
40 43
41 @property 44 @property
42 def backing_file(self): # pragma: no cover 45 def backing_file(self): # pragma: no cover
43 """Return path to a temp file that holds or receives the data. 46 """Return path to a temp file that holds or receives the data.
44 47
45 Valid only after 'render' has been called. 48 Valid only after 'render' has been called.
46 """ 49 """
47 raise NotImplementedError 50 raise NotImplementedError
48 51
49 def render(self, test): # pragma: no cover 52 def render(self, test): # pragma: no cover
(...skipping 11 matching lines...) Expand all
61 64
62 May optionally modify presentation as a side-effect. 65 May optionally modify presentation as a side-effect.
63 """ 66 """
64 pass 67 pass
65 68
66 @property 69 @property
67 def name(self): 70 def name(self):
68 assert self.name_pieces 71 assert self.name_pieces
69 return "%s.%s" % self.name_pieces 72 return "%s.%s" % self.name_pieces
70 73
74 @property
75 def id_name(self):
76 if self.id == self.DEFAULT_ID:
iannucci 2016/03/10 03:17:42 use the `is` keyword for comparison (compares poin
stgao 2016/03/10 20:34:23 Done.
77 return self.name
78 else:
79 return "%s.%s" % (self.id, self.name)
71 80
72 def static_wraps(func): 81 def static_wraps(func):
73 wrapped_fn = func 82 wrapped_fn = func
74 if isinstance(func, staticmethod): 83 if isinstance(func, staticmethod):
75 # __get__(obj) is the way to get the function contained in the staticmethod. 84 # __get__(obj) is the way to get the function contained in the staticmethod.
76 # python 2.7+ has a __func__ member, but previous to this the attribute 85 # python 2.7+ has a __func__ member, but previous to this the attribute
77 # doesn't exist. It doesn't matter what the obj is, as long as it's not 86 # doesn't exist. It doesn't matter what the obj is, as long as it's not
78 # None. 87 # None.
79 wrapped_fn = func.__get__(object) 88 wrapped_fn = func.__get__(object)
80 return functools.wraps(wrapped_fn) 89 return functools.wraps(wrapped_fn)
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
164 self.lines[-1].write(s) 173 self.lines[-1].write(s)
165 break 174 break
166 self.lines[-1].write(s[:i]) 175 self.lines[-1].write(s[:i])
167 self.lines[-1] = self.lines[-1].getvalue() 176 self.lines[-1] = self.lines[-1].getvalue()
168 self.lines.append(StringIO()) 177 self.lines.append(StringIO())
169 s = s[i+1:] 178 s = s[i+1:]
170 179
171 def close(self): 180 def close(self):
172 if not isinstance(self.lines[-1], basestring): 181 if not isinstance(self.lines[-1], basestring):
173 self.lines[-1] = self.lines[-1].getvalue() 182 self.lines[-1] = self.lines[-1].getvalue()
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698