(original) (raw)
changeset: 70874:b732b02bd0ba user: Éric Araujo merwok@netwok.org date: Sun Jun 19 21:23:43 2011 +0200 files: Lib/packaging/config.py Lib/packaging/tests/test_config.py Misc/NEWS description: packaging: Add the project directory to sys.path to support local setup hooks. Original patch by Vinay Sajip on #11637. diff -r 8de5fe3b1696 -r b732b02bd0ba Lib/packaging/config.py --- a/Lib/packaging/config.py Sun Jun 19 19:23:48 2011 +0200 +++ b/Lib/packaging/config.py Sun Jun 19 21:23:43 2011 +0200 @@ -134,15 +134,20 @@ if 'setup_hooks' in content['global']: setup_hooks = split_multiline(content['global']['setup_hooks']) - for line in setup_hooks: - try: - hook = resolve_name(line) - except ImportError as e: - logger.warning('cannot find setup hook: %s', e.args[0]) - else: - self.setup_hooks.append(hook) - - self.run_hooks(content) + # add project directory to sys.path, to allow hooks to be + # distributed with the project + sys.path.insert(0, cfg_directory) + try: + for line in setup_hooks: + try: + hook = resolve_name(line) + except ImportError as e: + logger.warning('cannot find setup hook: %s', e.args[0]) + else: + self.setup_hooks.append(hook) + self.run_hooks(content) + finally: + sys.path.pop(0) metadata = self.dist.metadata diff -r 8de5fe3b1696 -r b732b02bd0ba Lib/packaging/tests/test_config.py --- a/Lib/packaging/tests/test_config.py Sun Jun 19 19:23:48 2011 +0200 +++ b/Lib/packaging/tests/test_config.py Sun Jun 19 21:23:43 2011 +0200 @@ -126,6 +126,15 @@ """ +HOOKS_MODULE = """ +import logging + +logger = logging.getLogger('packaging') + +def logging_hook(config): + logger.warning('logging_hook called') +""" + class DCompiler: name = 'd' @@ -326,10 +335,21 @@ self.assertEqual(ext.extra_compile_args, cargs) self.assertEqual(ext.language, 'cxx') + def test_project_setup_hook_works(self): + # Bug #11637: ensure the project directory is on sys.path to allow + # project-specific hooks + self.write_setup({'setup-hooks': 'hooks.logging_hook'}) + self.write_file('README', 'yeah') + self.write_file('hooks.py', HOOKS_MODULE) + self.get_dist() + logs = self.get_logs(logging.WARNING) + self.assertEqual(['logging_hook called'], logs) + self.assertIn('hooks', sys.modules) + def test_missing_setup_hook_warns(self): self.write_setup({'setup-hooks': 'this.does._not.exist'}) self.write_file('README', 'yeah') - dist = self.get_dist() + self.get_dist() logs = self.get_logs(logging.WARNING) self.assertEqual(1, len(logs)) self.assertIn('cannot find setup hook', logs[0]) diff -r 8de5fe3b1696 -r b732b02bd0ba Misc/NEWS --- a/Misc/NEWS Sun Jun 19 19:23:48 2011 +0200 +++ b/Misc/NEWS Sun Jun 19 21:23:43 2011 +0200 @@ -193,7 +193,10 @@ Library ------- -- Issue #6771: moved the curses.wrapper function from the single-function +- Issue #11637: Fix support for importing packaging setup hooks from the + project directory. + +- Issue #6771: Moved the curses.wrapper function from the single-function wrapper module into __init__, eliminating the module. Since __init__ was already importing the function to curses.wrapper, there is no API change. /merwok@netwok.org