| # Copyright 2020 The Fuchsia Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| """Helper functions for common boilerplate tasks. |
| |
| Top-level functions can be imported and used directly (without needing a |
| `RecipeApi` object) using `RECIPE_MODULES` imports. E.g.: |
| |
| ``` |
| from RECIPE_MODULES.fuchsia.utils.api import memoize |
| |
| @memoize |
| def expensive_computation(inputs): |
| return do_work(inputs) |
| |
| def RunSteps(api, ...): |
| expensive_computation(...) |
| ``` |
| """ |
| |
| import functools |
| |
| from recipe_engine import recipe_api |
| |
| |
| def memoize(func): |
| """A decorator to cache the return values of a function by args/kwargs.""" |
| cache = {} |
| |
| @functools.wraps(func) |
| def wrapper(*args, **kwargs): |
| key = (args, frozenset(kwargs.iteritems())) |
| if key not in cache: |
| cache[key] = func(*args, **kwargs) |
| return cache[key] |
| |
| return wrapper |
| |
| |
| class CodeUtilsApi(recipe_api.RecipeApi): |
| memoize = staticmethod(memoize) |