Chromium Code Reviews| Index: recipe_engine/loader.py |
| diff --git a/recipe_engine/loader.py b/recipe_engine/loader.py |
| index 97927de48d84daed0a6ba66ebe65ad3273c05a79..d5e7bca9e96f7479814de3228ee89d7f4b19774c 100644 |
| --- a/recipe_engine/loader.py |
| +++ b/recipe_engine/loader.py |
| @@ -13,6 +13,7 @@ from . import env |
| from .config import ConfigContext, ConfigGroupSchema |
| from .config_types import Path, ModuleBasePath, PackageRepoBasePath |
| +from .config_types import RecipeScriptBasePath |
| from .config_types import RECIPE_MODULE_PREFIX |
| from .recipe_api import RecipeApi, RecipeApiPlain, RecipeScriptApi |
| from .recipe_api import _UnresolvedRequirement |
| @@ -35,8 +36,8 @@ class NoSuchRecipe(LoaderError): |
| class RecipeScript(object): |
| """Holds dict of an evaluated recipe script.""" |
| - def __init__(self, recipe_globals, name): |
| - self.name = name |
| + def __init__(self, recipe_globals, path): |
| + self.path = path |
| self._recipe_globals = recipe_globals |
| self.run_steps, self.gen_tests = [ |
| @@ -53,6 +54,11 @@ class RecipeScript(object): |
| 'ConfigGroupSchema') |
| @property |
| + def name(self): |
| + # 'a/b/c/my_name.py' -> my_name |
| + return os.path.basename(self.path).split('.')[0] |
|
nodir
2016/11/18 22:42:25
os.path.splitext?
iannucci
2016/11/19 00:00:57
Done.
|
| + |
| + @property |
| def globals(self): |
| return self._recipe_globals |
| @@ -96,9 +102,7 @@ class RecipeScript(object): |
| recipe_globals['LOADED_DEPS'] = universe_view.deps_from_spec( |
| recipe_globals.get('DEPS', [])) |
| - # 'a/b/c/my_name.py' -> my_name |
| - name = os.path.basename(script_path).split('.')[0] |
| - return cls(recipe_globals, name) |
| + return cls(recipe_globals, script_path) |
| class RecipeUniverse(object): |
| @@ -384,6 +388,7 @@ def _patchup_module(name, submod, universe_view): |
| submod.NAME = name |
| submod.UNIQUE_NAME = fullname |
| submod.MODULE_DIRECTORY = Path(ModuleBasePath(submod)) |
| + submod.RESOURCE_DIRECTORY = submod.MODULE_DIRECTORY.join('resources') |
| submod.PACKAGE_REPO_ROOT = Path(PackageRepoBasePath(universe_view.package)) |
| submod.CONFIG_CTX = getattr(submod, 'CONFIG_CTX', None) |
| @@ -544,7 +549,8 @@ def invoke_with_properties(callable_obj, all_props, prop_defs, |
| **additional_args) |
| -def create_recipe_api(toplevel_deps, engine, test_data=DisabledTestData()): |
| +def create_recipe_api(toplevel_package, toplevel_deps, recipe_script_path, |
| + engine, test_data=DisabledTestData()): |
| def instantiator(mod, deps): |
| kwargs = { |
| 'module': mod, |
| @@ -570,7 +576,28 @@ def create_recipe_api(toplevel_deps, engine, test_data=DisabledTestData()): |
| return mod_api |
| mapper = DependencyMapper(instantiator) |
| - api = RecipeScriptApi(module=None, engine=engine, |
| + # Provide a fake module to the ScriptApi so that recipes can use: |
| + # * .name |
| + # * .resource |
| + # * .package_repo_resource |
| + # This is obviously a hack, however it homogenizes the api and removes the |
| + # need for some ugly workarounds in user code. A better way to do this would |
| + # be to migrate all recipes to be members of modules. |
| + |
| + print toplevel_package.recipe_dirs |
| + print recipe_script_path |
|
nodir
2016/11/18 22:42:25
left by mistake?
iannucci
2016/11/19 00:00:57
Oops! 0:)
|
| + name = os.path.join( |
| + toplevel_package.name, |
| + os.path.relpath( |
| + os.path.splitext(recipe_script_path)[0], |
| + toplevel_package.recipe_dirs[0])) |
| + fakeModule = collections.namedtuple( |
| + "fakeModule", "PACKAGE_REPO_ROOT NAME RESOURCE_DIRECTORY")( |
| + Path(PackageRepoBasePath(toplevel_package)), |
| + name, |
| + Path(RecipeScriptBasePath( |
| + name, os.path.splitext(recipe_script_path)[0]+".resources"))) |
| + api = RecipeScriptApi(module=fakeModule, engine=engine, |
| test_data=test_data.get_module_test_data(None)) |
| for k, v in toplevel_deps.iteritems(): |
| setattr(api, k, mapper.instantiate(v)) |