diff options
author | Éric Araujo <merwok@netwok.org> | 2011-09-01 05:01:13 (GMT) |
---|---|---|
committer | Éric Araujo <merwok@netwok.org> | 2011-09-01 05:01:13 (GMT) |
commit | d9299e97ab9ff7fa8f158740be61572e04a936fa (patch) | |
tree | 95aa72197d836016e9398145ef209fb97f28be00 /Lib/packaging | |
parent | 336b4e4ff3edea750eb79bc59dab0f63141a1caa (diff) | |
download | cpython-d9299e97ab9ff7fa8f158740be61572e04a936fa.zip cpython-d9299e97ab9ff7fa8f158740be61572e04a936fa.tar.gz cpython-d9299e97ab9ff7fa8f158740be61572e04a936fa.tar.bz2 |
Minor improvement to extensions in setup.cfg: check parent package
Diffstat (limited to 'Lib/packaging')
-rw-r--r-- | Lib/packaging/config.py | 20 | ||||
-rw-r--r-- | Lib/packaging/tests/test_config.py | 31 |
2 files changed, 47 insertions, 4 deletions
diff --git a/Lib/packaging/config.py b/Lib/packaging/config.py index b138d08..e02800e 100644 --- a/Lib/packaging/config.py +++ b/Lib/packaging/config.py @@ -16,6 +16,19 @@ from packaging.command import set_command from packaging.markers import interpret +def _check_name(name, packages): + if '.' not in name: + return + parts = name.split('.') + modname = parts[-1] + parent = '.'.join(parts[:-1]) + if parent not in packages: + # we could log a warning instead of raising, but what's the use + # of letting people build modules they can't import? + raise PackagingOptionError( + 'parent package for extension %r not found' % name) + + def _pop_values(values_dct, key): """Remove values from the dictionary and convert them as a list""" vals_str = values_dct.pop(key, '') @@ -142,7 +155,8 @@ class Config: try: hook = resolve_name(line) except ImportError as e: - logger.warning('cannot find setup hook: %s', e.args[0]) + logger.warning('cannot find setup hook: %s', + e.args[0]) else: self.setup_hooks.append(hook) self.run_hooks(content) @@ -259,8 +273,10 @@ class Config: raise PackagingOptionError( 'extension name should be given as [extension: name], ' 'not as key') + name = labels[1].strip() + _check_name(name, self.dist.packages) ext_modules.append(Extension( - labels[1].strip(), + name, _pop_values(values_dct, 'sources'), _pop_values(values_dct, 'include_dirs'), _pop_values(values_dct, 'define_macros'), diff --git a/Lib/packaging/tests/test_config.py b/Lib/packaging/tests/test_config.py index ce01629..bcb55fb 100644 --- a/Lib/packaging/tests/test_config.py +++ b/Lib/packaging/tests/test_config.py @@ -105,6 +105,7 @@ EXT_SETUP_CFG = """ [files] packages = one two + parent.undeclared [extension:one.speed_coconuts] sources = c_src/speed_coconuts.c @@ -122,6 +123,11 @@ extra_compile_args = -fPIC -O2 -DGECODE_VERSION=$(./gecode_version) -- sys.platform != 'win32' /DGECODE_VERSION='win32' -- sys.platform == 'win32' language = cxx + +# corner case: if the parent package of an extension is declared but +# not its grandparent, it's legal +[extension: parent.undeclared._speed] +sources = parent/undeclared/_speed.c """ EXT_SETUP_CFG_BUGGY_1 = """ @@ -129,6 +135,21 @@ EXT_SETUP_CFG_BUGGY_1 = """ name = crash_here """ +EXT_SETUP_CFG_BUGGY_2 = """ +[files] +packages = ham + +[extension: spam.eggs] +""" + +EXT_SETUP_CFG_BUGGY_3 = """ +[files] +packages = ok + ok.works + +[extension: ok.works.breaks._ext] +""" + HOOKS_MODULE = """ import logging @@ -314,7 +335,7 @@ class ConfigTestCase(support.TempdirManager, dist = self.get_dist() ext_modules = dict((mod.name, mod) for mod in dist.ext_modules) - self.assertEqual(len(ext_modules), 2) + self.assertEqual(len(ext_modules), 3) ext = ext_modules.get('one.speed_coconuts') self.assertEqual(ext.sources, ['c_src/speed_coconuts.c']) self.assertEqual(ext.define_macros, ['HAVE_CAIRO', 'HAVE_GTK2']) @@ -341,6 +362,12 @@ class ConfigTestCase(support.TempdirManager, self.write_file('setup.cfg', EXT_SETUP_CFG_BUGGY_1) self.assertRaises(PackagingOptionError, self.get_dist) + self.write_file('setup.cfg', EXT_SETUP_CFG_BUGGY_2) + self.assertRaises(PackagingOptionError, self.get_dist) + + self.write_file('setup.cfg', EXT_SETUP_CFG_BUGGY_3) + self.assertRaises(PackagingOptionError, self.get_dist) + def test_project_setup_hook_works(self): # Bug #11637: ensure the project directory is on sys.path to allow # project-specific hooks @@ -364,7 +391,7 @@ class ConfigTestCase(support.TempdirManager, self.write_setup({ 'setup-hooks': '\n packaging.tests.test_config.first_hook' '\n packaging.tests.test_config.missing_hook' - '\n packaging.tests.test_config.third_hook' + '\n packaging.tests.test_config.third_hook', }) self.write_file('README', 'yeah') dist = self.get_dist() |