Index: recipe_modules/step/api.py |
diff --git a/recipe_modules/step/api.py b/recipe_modules/step/api.py |
index 8530f6ffdafcd8d71d8595732653e2a08a79fa7c..13075f93513b862f9f1275f26455ba159d2cb6ab 100644 |
--- a/recipe_modules/step/api.py |
+++ b/recipe_modules/step/api.py |
@@ -74,9 +74,33 @@ class StepApi(recipe_api.RecipeApiPlain): |
@property |
def context(self): |
- """ See recipe_api.py for docs. """ |
+ """Returns a context manager which can set values applying to all steps |
+ within the block. |
+ |
+ Example usage: |
+ with api.step.context({'cwd': api.path['checkout']}): |
+ api.step(...) |
+ |
+ Valid keys: |
+ cwd (Path object from api.path): working directory |
+ env ({name -> value}): environment variables |
+ infra_step (bool): whether the step failure should be marked as infra |
+ failure |
+ name (str): step name prefix |
+ |
+ See recipe_api.py for more info. |
+ """ |
return recipe_api.context |
+ def get_from_context(self, key, default=None): |
+ """Returns |key|'s value from context if present, otherwise |default|.""" |
+ return recipe_api._STEP_CONTEXT.get(key, default) |
+ |
+ def combine_with_context(self, key, value): |
+ """Combines |value| with the value for |key| in current context, if any. |
+ Returns the combined value.""" |
+ return recipe_api._STEP_CONTEXT.get_with_context(key, value) |
+ |
@contextlib.contextmanager |
def nest(self, name): |
"""Nest is the high-level interface to annotated hierarchical steps. |
@@ -171,9 +195,6 @@ class StepApi(recipe_api.RecipeApiPlain): |
kwargs['timeout'] = timeout |
kwargs['ok_ret'] = ok_ret |
- # Obtain information from composite step parent. |
- compositor = recipe_api._STEP_CONTEXT |
- |
# Calculate our full step name. If a step already has that name, add an |
# index to the end of it. |
# |
@@ -181,7 +202,7 @@ class StepApi(recipe_api.RecipeApiPlain): |
# by the user. If this happens, we'll continue appending indexes until we |
# have a unique step name. |
while True: |
- full_name = compositor.get_with_context('name', name) |
+ full_name = self.combine_with_context('name', name) |
if full_name not in self._seen_steps: |
break |
@@ -191,11 +212,11 @@ class StepApi(recipe_api.RecipeApiPlain): |
self._seen_steps.add(full_name) |
if 'cwd' not in kwargs: |
- kwargs['cwd'] = compositor.get('cwd') |
- kwargs['env'] = compositor.get_with_context('env', kwargs.get('env', {})) |
- kwargs['infra_step'] = compositor.get_with_context( |
+ kwargs['cwd'] = self.get_from_context('cwd') |
+ kwargs['env'] = self.combine_with_context('env', kwargs.get('env', {})) |
+ kwargs['infra_step'] = self.combine_with_context( |
'infra_step', bool(infra_step)) |
- kwargs['step_nest_level'] = compositor.get_with_context('nest_level', 0) |
+ kwargs['step_nest_level'] = self.combine_with_context('nest_level', 0) |
kwargs['name'] = full_name |
kwargs['base_name'] = name |