]> granicus.if.org Git - python/commitdiff
packaging: Add the project directory to sys.path to support local setup hooks.
authorÉric Araujo <merwok@netwok.org>
Sun, 19 Jun 2011 19:23:43 +0000 (21:23 +0200)
committerÉric Araujo <merwok@netwok.org>
Sun, 19 Jun 2011 19:23:43 +0000 (21:23 +0200)
Original patch by Vinay Sajip on #11637.

Lib/packaging/config.py
Lib/packaging/tests/test_config.py
Misc/NEWS

index 21bbcf8567ad6b3994de678956e2b757922c197a..43263f7eead029c90fcbf19f434d25682c6b4412 100644 (file)
@@ -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
 
index 6be63ebbeb7e5b0062c83c151271e62a862c962e..43ab2c85b4cc3e4b54fe4a7fd8646e1b8767449c 100644 (file)
@@ -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])
index c05a32ade8177b7cf0ecfabe182e3c1e0505d64c..89eab0efe98ed130a699e131cf69111b80a9baae 100644 (file)
--- 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.