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

Side by Side Diff: recipe_engine/util.py

Issue 1785543004: Split Placeholder into InputPlaceholder and OutputPlaceholder. (Closed) Base URL: https://chromium.googlesource.com/external/github.com/luci/recipes-py@master
Patch Set: Address comments. 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 """Base class for json placeholders. Do not use directly.""" 37 """Base class for command line argument placeholders. Do not use directly."""
38 def __init__(self): 38 def __init__(self):
39 self.name_pieces = None 39 self.name_pieces = None
40 40
41 @property 41 @property
42 def backing_file(self): # pragma: no cover 42 def backing_file(self): # pragma: no cover
43 """Return path to a temp file that holds or receives the data. 43 """Return path to a temp file that holds or receives the data.
44 44
45 Valid only after 'render' has been called. 45 Valid only after 'render' has been called.
46 """ 46 """
47 raise NotImplementedError 47 raise NotImplementedError
48 48
49 def render(self, test): # pragma: no cover 49 def render(self, test): # pragma: no cover
50 """Return [cmd items]*""" 50 """Return [cmd items]*"""
51 raise NotImplementedError 51 raise NotImplementedError
52 52
53 def result(self, presentation, test): 53 def result(self, presentation, test):
54 """Called after step completion. 54 """Called after step completion.
55 55
56 Args: 56 Args:
57 presentation (StepPresentation) - for the current step. 57 presentation (StepPresentation) - for the current step.
58 test (PlaceholderTestData) - test data for this placeholder. 58 test (PlaceholderTestData) - test data for this placeholder.
59 59
60 Returns value to add to step result.
61
62 May optionally modify presentation as a side-effect. 60 May optionally modify presentation as a side-effect.
63 """ 61 """
64 pass 62 pass
65 63
66 @property 64 @property
67 def name(self): 65 def name(self):
68 assert self.name_pieces 66 assert self.name_pieces
69 return "%s.%s" % self.name_pieces 67 return "%s.%s" % self.name_pieces
70 68
71 69
70 class InputPlaceholder(Placeholder):
71 """Base class for json/raw_io input placeholders. Do not use directly."""
72 def result(self, presentation, test):
73 """Returned value will be discarded."""
74 pass
iannucci 2016/03/22 22:22:48 I think this method can be removed entirely, right
stgao 2016/03/22 23:19:17 Renaming sounds good to me. Done. However, when p
75 result.__doc__ = Placeholder.result.__doc__
76
77
78 class OutputPlaceholder(Placeholder):
79 """Base class for json/raw_io output placeholders. Do not use directly."""
80 def result(self, presentation, test):
81 """Returned value will be added to the step result."""
82 pass
83 result.__doc__ = Placeholder.result.__doc__
84
85
72 def static_wraps(func): 86 def static_wraps(func):
73 wrapped_fn = func 87 wrapped_fn = func
74 if isinstance(func, staticmethod): 88 if isinstance(func, staticmethod):
75 # __get__(obj) is the way to get the function contained in the staticmethod. 89 # __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 90 # 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 91 # doesn't exist. It doesn't matter what the obj is, as long as it's not
78 # None. 92 # None.
79 wrapped_fn = func.__get__(object) 93 wrapped_fn = func.__get__(object)
80 return functools.wraps(wrapped_fn) 94 return functools.wraps(wrapped_fn)
81 95
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
164 self.lines[-1].write(s) 178 self.lines[-1].write(s)
165 break 179 break
166 self.lines[-1].write(s[:i]) 180 self.lines[-1].write(s[:i])
167 self.lines[-1] = self.lines[-1].getvalue() 181 self.lines[-1] = self.lines[-1].getvalue()
168 self.lines.append(StringIO()) 182 self.lines.append(StringIO())
169 s = s[i+1:] 183 s = s[i+1:]
170 184
171 def close(self): 185 def close(self):
172 if not isinstance(self.lines[-1], basestring): 186 if not isinstance(self.lines[-1], basestring):
173 self.lines[-1] = self.lines[-1].getvalue() 187 self.lines[-1] = self.lines[-1].getvalue()
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698