summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorÉric Araujo <merwok@netwok.org>2011-06-19 19:23:43 (GMT)
committerÉric Araujo <merwok@netwok.org>2011-06-19 19:23:43 (GMT)
commit3e425ac64b1f9ed858b098411012909cfe7b854e (patch)
tree72b37a6e204a19ee31d297d1509f415f7c4d58ad
parente043b6bac7c2d2845e0b1d10d140364c73de8456 (diff)
downloadcpython-3e425ac64b1f9ed858b098411012909cfe7b854e.zip
cpython-3e425ac64b1f9ed858b098411012909cfe7b854e.tar.gz
cpython-3e425ac64b1f9ed858b098411012909cfe7b854e.tar.bz2
packaging: Add the project directory to sys.path to support local setup hooks.
Original patch by Vinay Sajip on #11637.
-rw-r--r--Lib/packaging/config.py23
-rw-r--r--Lib/packaging/tests/test_config.py22
-rw-r--r--Misc/NEWS5
3 files changed, 39 insertions, 11 deletions
diff --git a/Lib/packaging/config.py b/Lib/packaging/config.py
index 21bbcf8..43263f7 100644
--- a/Lib/packaging/config.py
+++ b/Lib/packaging/config.py
@@ -134,15 +134,20 @@ class Config:
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 --git a/Lib/packaging/tests/test_config.py b/Lib/packaging/tests/test_config.py
index 6be63eb..43ab2c8 100644
--- a/Lib/packaging/tests/test_config.py
+++ b/Lib/packaging/tests/test_config.py
@@ -126,6 +126,15 @@ language = cxx
"""
+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 @@ class ConfigTestCase(support.TempdirManager,
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 --git a/Misc/NEWS b/Misc/NEWS
index c05a32a..89eab0e 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -193,7 +193,10 @@ Core and Builtins
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.