def test_simple(self): bscript = """\ from bento.commands import hooks PRE = False POST = False @hooks.pre_configure def pre_configure(ctx): global PRE PRE = True @hooks.post_configure def post_configure(ctx): global POST POST = True """ bento = """\ Name: foo Version: 1.0 HookFile: bscript """ create_fake_package_from_bento_infos(self.top_node, {"bento.info": bento}, {"bscript": bscript}) conf, configure = prepare_configure(self.top_node, bento, ConfigureContext) bscript = self.top_node.search("bscript") m = create_hook_module(bscript.abspath()) self.assertEqual(len(find_pre_hooks([m], "configure")), 1) self.assertEqual(len(find_post_hooks([m], "configure")), 1)
def test_hook(self): root = self.root top_node = self.top_node bento_info = """\ Name: foo HookFile: bar/bscript Recurse: bar """ bento_info2 = """\ Library: Packages: fubar """ bscript = """\ from bento.commands import hooks @hooks.pre_configure def configure(ctx): packages = ctx.local_pkg.packages ctx.local_node.make_node("test").write(str(packages)) """ bentos = { "bento.info": bento_info, os.path.join("bar", "bento.info"): bento_info2 } bscripts = {os.path.join("bar", "bscript"): bscript} create_fake_package_from_bento_infos(top_node, bentos, bscripts) conf, configure = prepare_configure(self.run_node, bento_info, ConfigureYakuContext) try: hook = top_node.search("bar/bscript") m = create_hook_module(hook.abspath()) for hook in find_pre_hooks([m], "configure"): conf.pre_recurse(root.find_dir(hook.local_dir)) try: hook(conf) finally: conf.post_recurse() test = top_node.search("bar/test") if test: self.assertEqual(test.read(), "['fubar']") else: self.fail("test dummy not found") finally: configure.finish(conf) conf.finish()
def test_hook(self): root = self.root top_node = self.top_node bento_info = """\ Name: foo HookFile: bar/bscript Recurse: bar """ bento_info2 = """\ Library: Packages: fubar """ bscript = """\ from bento.commands import hooks @hooks.pre_configure def configure(ctx): packages = ctx.local_pkg.packages ctx.local_node.make_node("test").write(str(packages)) """ bentos = {"bento.info": bento_info, os.path.join("bar", "bento.info"): bento_info2} bscripts = {os.path.join("bar", "bscript"): bscript} create_fake_package_from_bento_infos(top_node, bentos, bscripts) conf, configure = prepare_configure(self.run_node, bento_info, ConfigureYakuContext) try: hook = top_node.search("bar/bscript") m = create_hook_module(hook.abspath()) for hook in find_pre_hooks([m], "configure"): conf.pre_recurse(root.find_dir(hook.local_dir)) try: hook(conf) finally: conf.post_recurse() test = top_node.search("bar/test") if test: self.failUnlessEqual(test.read(), "['fubar']") else: self.fail("test dummy not found") finally: configure.finish(conf) conf.finish()
def _setup_hooks(self, package, global_context, mods): if package.use_backends: if len(package.use_backends) > 1: raise ValueError("Only up to one backend supported for now") else: assert global_context.backend is None global_context.backend = load_backend( package.use_backends[0])() startup_hooks = find_startup_hooks(mods) option_hooks = find_options_hooks(mods) shutdown_hooks = find_shutdown_hooks(mods) if startup_hooks: # FIXME: there should be an error or a warning if startup defined in # mods beyond the first one startup_hooks[0](global_context) if global_context.backend: global_context.backend.register_command_contexts(global_context) for command in find_command_hooks(mods): global_context.register_command(command.name, command) if global_context.backend: global_context.backend.register_options_contexts(global_context) if option_hooks: # FIXME: there should be an error or a warning if shutdown defined in # mods beyond the first one option_hooks[0](global_context) # FIXME: this registered options for new commands registered in hook. It # should be made all in one place (hook and non-hook) for cmd_name in global_context.command_names(public_only=False): if not global_context.is_options_context_registered(cmd_name): # FIXME: this should be supported in global context directly # (redundant with bentomakerlib) cmd = global_context.retrieve_command(cmd_name) context = OptionsContext.from_command(cmd) if not global_context.is_options_context_registered(cmd_name): global_context.register_options_context(cmd_name, context) for cmd_name in global_context.command_names(): for hook in find_pre_hooks(mods, cmd_name): global_context.add_pre_hook(hook, cmd_name) for hook in find_post_hooks(mods, cmd_name): global_context.add_post_hook(hook, cmd_name)
def _setup_hooks(self, package, global_context, mods): if package.use_backends: if len(package.use_backends) > 1: raise ValueError("Only up to one backend supported for now") else: assert global_context.backend is None global_context.backend = load_backend(package.use_backends[0])() startup_hooks = find_startup_hooks(mods) option_hooks = find_options_hooks(mods) shutdown_hooks = find_shutdown_hooks(mods) if startup_hooks: # FIXME: there should be an error or a warning if startup defined in # mods beyond the first one startup_hooks[0](global_context) if global_context.backend: global_context.backend.register_command_contexts(global_context) for command in find_command_hooks(mods): global_context.register_command(command.name, command) if global_context.backend: global_context.backend.register_options_contexts(global_context) if option_hooks: # FIXME: there should be an error or a warning if shutdown defined in # mods beyond the first one option_hooks[0](global_context) # FIXME: this registered options for new commands registered in hook. It # should be made all in one place (hook and non-hook) for cmd_name in global_context.command_names(public_only=False): if not global_context.is_options_context_registered(cmd_name): # FIXME: this should be supported in global context directly # (redundant with bentomakerlib) cmd = global_context.retrieve_command(cmd_name) context = OptionsContext.from_command(cmd) if not global_context.is_options_context_registered(cmd_name): global_context.register_options_context(cmd_name, context) for cmd_name in global_context.command_names(): for hook in find_pre_hooks(mods, cmd_name): global_context.add_pre_hook(hook, cmd_name) for hook in find_post_hooks(mods, cmd_name): global_context.add_post_hook(hook, cmd_name)
def _wrapped_main(global_context, popts, run_node, top_node, build_node): def _big_ugly_hack(): # FIXME: huge ugly hack - we need to specify once and for all when the # package info is parsed and available, so that we can define options # and co for commands from bento.commands.configure import _setup_options_parser # FIXME: logic to handle codepaths which work without a bento.info # should be put in one place n = top_node.find_node(BENTO_SCRIPT) if n: package_options = __get_package_options(top_node) _setup_options_parser(OPTIONS_REGISTRY.retrieve("configure"), package_options) else: import warnings warnings.warn("No %r file in current directory - not all options " "will be displayed" % BENTO_SCRIPT) return mods = set_main(top_node, build_node) if mods: mods[0].startup(global_context) for command in find_hook_commands(mods): global_context.register_command(command.name, command) register_stuff(global_context) _big_ugly_hack() if mods: mods[0].options(global_context) # FIXME: this registered options for new commands registered in hook. It # should be made all in one place (hook and non-hook) for cmd_name in global_context.command_names(public_only=False): if not OPTIONS_REGISTRY.is_registered(cmd_name): register_options(global_context, cmd_name) for cmd_name in global_context.command_names(): for hook in find_pre_hooks(mods, cmd_name): global_context.add_pre_hook(hook, cmd_name) for hook in find_post_hooks(mods, cmd_name): global_context.add_post_hook(hook, cmd_name) try: return _main(global_context, popts, run_node, top_node, build_node) finally: if mods: mods[0].shutdown()
def _wrapped_main(global_context, popts, run_node, top_node, build_node): # Some commands work without a bento description file (convert, help) # FIXME: this should not be called here then - clearly separate commands # which require bento.info from the ones who do not bento_info_node = top_node.find_node(BENTO_SCRIPT) if bento_info_node is not None: db_node = build_node.make_node(DB_FILE) cached_package = CachedPackage(db_node) package = cached_package.get_package(bento_info_node) package_options = cached_package.get_options(bento_info_node) if package.use_backends: if len(package.use_backends) > 1: raise ValueError("Only up to one backend supported for now") else: assert global_context.backend is None global_context.backend = load_backend( package.use_backends[0])() global_context.register_package_options(package_options) mods = set_main(package, top_node, build_node) else: warnings.warn("No %r file in current directory - only generic options " "will be displayed" % BENTO_SCRIPT) cached_package = None package_options = None mods = [] startup_hooks = find_startup_hooks(mods) option_hooks = find_options_hooks(mods) shutdown_hooks = find_shutdown_hooks(mods) if startup_hooks: # FIXME: there should be an error or a warning if startup defined in # mods beyond the first one startup_hooks[0](global_context) if global_context.backend: global_context.backend.register_command_contexts(global_context) for command in find_command_hooks(mods): global_context.register_command(command.name, command) register_stuff(global_context) for cmd_name in global_context.command_names(): register_options(global_context, cmd_name) if global_context.backend: global_context.backend.register_options_contexts(global_context) if option_hooks: # FIXME: there should be an error or a warning if shutdown defined in # mods beyond the first one option_hooks[0](global_context) # FIXME: this registered options for new commands registered in hook. It # should be made all in one place (hook and non-hook) for cmd_name in global_context.command_names(public_only=False): if not global_context.is_options_context_registered(cmd_name): register_options(global_context, cmd_name) for cmd_name in global_context.command_names(): for hook in find_pre_hooks(mods, cmd_name): global_context.add_pre_hook(hook, cmd_name) for hook in find_post_hooks(mods, cmd_name): global_context.add_post_hook(hook, cmd_name) try: return _main(global_context, cached_package, popts, run_node, top_node, build_node) finally: if shutdown_hooks: shutdown_hooks[0](global_context)
def _wrapped_main(global_context, popts, run_node, top_node, build_node): # Some commands work without a bento description file (convert, help) # FIXME: this should not be called here then - clearly separate commands # which require bento.info from the ones who do not bento_info_node = top_node.find_node(BENTO_SCRIPT) if bento_info_node is not None: db_node = build_node.make_node(DB_FILE) cached_package = CachedPackage(db_node) package = cached_package.get_package(bento_info_node) package_options = cached_package.get_options(bento_info_node) if package.use_backends: if len(package.use_backends) > 1: raise ValueError("Only up to one backend supported for now") else: assert global_context.backend is None global_context.backend = load_backend(package.use_backends[0])() global_context.register_package_options(package_options) mods = set_main(package, top_node, build_node) else: warnings.warn("No %r file in current directory - only generic options " "will be displayed" % BENTO_SCRIPT) cached_package = None package_options = None mods = [] startup_hooks = find_startup_hooks(mods) option_hooks = find_options_hooks(mods) shutdown_hooks = find_shutdown_hooks(mods) if startup_hooks: # FIXME: there should be an error or a warning if startup defined in # mods beyond the first one startup_hooks[0](global_context) if global_context.backend: global_context.backend.register_command_contexts(global_context) for command in find_command_hooks(mods): global_context.register_command(command.name, command) register_stuff(global_context) for cmd_name in global_context.command_names(): register_options(global_context, cmd_name) if global_context.backend: global_context.backend.register_options_contexts(global_context) if option_hooks: # FIXME: there should be an error or a warning if shutdown defined in # mods beyond the first one option_hooks[0](global_context) # FIXME: this registered options for new commands registered in hook. It # should be made all in one place (hook and non-hook) for cmd_name in global_context.command_names(public_only=False): if not global_context.is_options_context_registered(cmd_name): register_options(global_context, cmd_name) for cmd_name in global_context.command_names(): for hook in find_pre_hooks(mods, cmd_name): global_context.add_pre_hook(hook, cmd_name) for hook in find_post_hooks(mods, cmd_name): global_context.add_post_hook(hook, cmd_name) try: return _main(global_context, cached_package, popts, run_node, top_node, build_node) finally: if shutdown_hooks: shutdown_hooks[0](global_context)