Minor improvement to extensions in setup.cfg: check parent package
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.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 @@
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 @@
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'),