135 lines
4.8 KiB
Python
135 lines
4.8 KiB
Python
|
import os
|
||
|
from glob import glob
|
||
|
from distutils.util import convert_path
|
||
|
from distutils.command import sdist
|
||
|
|
||
|
|
||
|
class sdist_add_defaults:
|
||
|
"""
|
||
|
Mix-in providing forward-compatibility for functionality as found in
|
||
|
distutils on Python 3.7.
|
||
|
|
||
|
Do not edit the code in this class except to update functionality
|
||
|
as implemented in distutils. Instead, override in the subclass.
|
||
|
"""
|
||
|
|
||
|
def add_defaults(self):
|
||
|
"""Add all the default files to self.filelist:
|
||
|
- README or README.txt
|
||
|
- setup.py
|
||
|
- test/test*.py
|
||
|
- all pure Python modules mentioned in setup script
|
||
|
- all files pointed by package_data (build_py)
|
||
|
- all files defined in data_files.
|
||
|
- all files defined as scripts.
|
||
|
- all C sources listed as part of extensions or C libraries
|
||
|
in the setup script (doesn't catch C headers!)
|
||
|
Warns if (README or README.txt) or setup.py are missing; everything
|
||
|
else is optional.
|
||
|
"""
|
||
|
self._add_defaults_standards()
|
||
|
self._add_defaults_optional()
|
||
|
self._add_defaults_python()
|
||
|
self._add_defaults_data_files()
|
||
|
self._add_defaults_ext()
|
||
|
self._add_defaults_c_libs()
|
||
|
self._add_defaults_scripts()
|
||
|
|
||
|
@staticmethod
|
||
|
def _cs_path_exists(fspath):
|
||
|
"""
|
||
|
Case-sensitive path existence check
|
||
|
|
||
|
>>> sdist_add_defaults._cs_path_exists(__file__)
|
||
|
True
|
||
|
>>> sdist_add_defaults._cs_path_exists(__file__.upper())
|
||
|
False
|
||
|
"""
|
||
|
if not os.path.exists(fspath):
|
||
|
return False
|
||
|
# make absolute so we always have a directory
|
||
|
abspath = os.path.abspath(fspath)
|
||
|
directory, filename = os.path.split(abspath)
|
||
|
return filename in os.listdir(directory)
|
||
|
|
||
|
def _add_defaults_standards(self):
|
||
|
standards = [self.READMES, self.distribution.script_name]
|
||
|
for fn in standards:
|
||
|
if isinstance(fn, tuple):
|
||
|
alts = fn
|
||
|
got_it = False
|
||
|
for fn in alts:
|
||
|
if self._cs_path_exists(fn):
|
||
|
got_it = True
|
||
|
self.filelist.append(fn)
|
||
|
break
|
||
|
|
||
|
if not got_it:
|
||
|
self.warn("standard file not found: should have one of " +
|
||
|
', '.join(alts))
|
||
|
else:
|
||
|
if self._cs_path_exists(fn):
|
||
|
self.filelist.append(fn)
|
||
|
else:
|
||
|
self.warn("standard file '%s' not found" % fn)
|
||
|
|
||
|
def _add_defaults_optional(self):
|
||
|
optional = ['test/test*.py', 'setup.cfg']
|
||
|
for pattern in optional:
|
||
|
files = filter(os.path.isfile, glob(pattern))
|
||
|
self.filelist.extend(files)
|
||
|
|
||
|
def _add_defaults_python(self):
|
||
|
# build_py is used to get:
|
||
|
# - python modules
|
||
|
# - files defined in package_data
|
||
|
build_py = self.get_finalized_command('build_py')
|
||
|
|
||
|
# getting python files
|
||
|
if self.distribution.has_pure_modules():
|
||
|
self.filelist.extend(build_py.get_source_files())
|
||
|
|
||
|
# getting package_data files
|
||
|
# (computed in build_py.data_files by build_py.finalize_options)
|
||
|
for pkg, src_dir, build_dir, filenames in build_py.data_files:
|
||
|
for filename in filenames:
|
||
|
self.filelist.append(os.path.join(src_dir, filename))
|
||
|
|
||
|
def _add_defaults_data_files(self):
|
||
|
# getting distribution.data_files
|
||
|
if self.distribution.has_data_files():
|
||
|
for item in self.distribution.data_files:
|
||
|
if isinstance(item, str):
|
||
|
# plain file
|
||
|
item = convert_path(item)
|
||
|
if os.path.isfile(item):
|
||
|
self.filelist.append(item)
|
||
|
else:
|
||
|
# a (dirname, filenames) tuple
|
||
|
dirname, filenames = item
|
||
|
for f in filenames:
|
||
|
f = convert_path(f)
|
||
|
if os.path.isfile(f):
|
||
|
self.filelist.append(f)
|
||
|
|
||
|
def _add_defaults_ext(self):
|
||
|
if self.distribution.has_ext_modules():
|
||
|
build_ext = self.get_finalized_command('build_ext')
|
||
|
self.filelist.extend(build_ext.get_source_files())
|
||
|
|
||
|
def _add_defaults_c_libs(self):
|
||
|
if self.distribution.has_c_libraries():
|
||
|
build_clib = self.get_finalized_command('build_clib')
|
||
|
self.filelist.extend(build_clib.get_source_files())
|
||
|
|
||
|
def _add_defaults_scripts(self):
|
||
|
if self.distribution.has_scripts():
|
||
|
build_scripts = self.get_finalized_command('build_scripts')
|
||
|
self.filelist.extend(build_scripts.get_source_files())
|
||
|
|
||
|
|
||
|
if hasattr(sdist.sdist, '_add_defaults_standards'):
|
||
|
# disable the functionality already available upstream
|
||
|
class sdist_add_defaults: # noqa
|
||
|
pass
|