diff options
author | Anderson Bravalheri <andersonbravalheri@gmail.com> | 2022-05-16 18:34:35 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-05-16 18:34:35 +0100 |
commit | e66ee6206feb49fe4bdec417c84d601d6b4bbf72 (patch) | |
tree | 465f4f09951508299000c9ae25573a68fde2d385 /setuptools/command/build_py.py | |
parent | aec2215be6711c850339484cd7f47d542a6c06a1 (diff) | |
parent | 2b218927334c58a655fc285a5c241828d394cffe (diff) | |
download | python-setuptools-git-e66ee6206feb49fe4bdec417c84d601d6b4bbf72.tar.gz |
Warn about deprecation of behaviour that considers modules/packages as data when include_package_data=True (#3308)
Diffstat (limited to 'setuptools/command/build_py.py')
-rw-r--r-- | setuptools/command/build_py.py | 54 |
1 files changed, 52 insertions, 2 deletions
diff --git a/setuptools/command/build_py.py b/setuptools/command/build_py.py index ac7cff95..91f47416 100644 --- a/setuptools/command/build_py.py +++ b/setuptools/command/build_py.py @@ -9,6 +9,9 @@ import io import distutils.errors import itertools import stat +import warnings +from pathlib import Path +from setuptools._deprecation_warning import SetuptoolsDeprecationWarning from setuptools.extern.more_itertools import unique_everseen @@ -130,6 +133,7 @@ class build_py(orig.build_py): src_dirs[assert_relative(self.get_package_dir(package))] = package self.run_command('egg_info') + check = _IncludePackageDataAbuse() ei_cmd = self.get_finalized_command('egg_info') for path in ei_cmd.filelist.files: d, f = os.path.split(assert_relative(path)) @@ -140,8 +144,13 @@ class build_py(orig.build_py): d, df = os.path.split(d) f = os.path.join(df, f) if d in src_dirs: - if path.endswith('.py') and f == oldf: - continue # it's a module, not data + if f == oldf: + if check.is_module(f): + continue # it's a module, not data + else: + importable = check.importable_subpackage(src_dirs[d], f) + if importable: + check.warn(importable) mf.setdefault(src_dirs[d], []).append(path) def get_data_files(self): @@ -241,3 +250,44 @@ def assert_relative(path): % path ) raise DistutilsSetupError(msg) + + +class _IncludePackageDataAbuse: + """Inform users that package or module is included as 'data file'""" + + MESSAGE = """\ + !!\n\n + ############################ + # Package would be ignored # + ############################ + Python recognizes {importable!r} as an importable package, however it is + included in the distribution as "data". + This behavior is likely to change in future versions of setuptools (and + therefore is considered deprecated). + + Please make sure that {importable!r} is included as a package by using + setuptools' `packages` configuration field or the proper discovery methods. + + You can read more about "package discovery" and "data files" on setuptools + documentation page. + \n\n!! + """ + + def __init__(self): + self._already_warned = set() + + def is_module(self, file): + return file.endswith(".py") and file[:-len(".py")].isidentifier() + + def importable_subpackage(self, parent, file): + pkg = Path(file).parent + parts = list(itertools.takewhile(str.isidentifier, pkg.parts)) + if parts: + return ".".join([parent, *parts]) + return None + + def warn(self, importable): + if importable not in self._already_warned: + msg = textwrap.dedent(self.MESSAGE).format(importable=importable) + warnings.warn(msg, SetuptoolsDeprecationWarning, stacklevel=2) + self._already_warned.add(importable) |