android-notify 1.60.0__py3-none-any.whl → 1.60.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of android-notify might be problematic. Click here for more details.
- android_notify/config.py +1 -1
- {android_notify-1.60.0.dist-info → android_notify-1.60.2.dist-info}/METADATA +4 -4
- {android_notify-1.60.0.dist-info → android_notify-1.60.2.dist-info}/RECORD +375 -6
- venv/Lib/site-packages/_distutils_hack/__init__.py +239 -0
- venv/Lib/site-packages/_distutils_hack/override.py +1 -0
- venv/Lib/site-packages/pkg_resources/__init__.py +3713 -0
- venv/Lib/site-packages/pkg_resources/py.typed +0 -0
- venv/Lib/site-packages/pkg_resources/tests/__init__.py +0 -0
- venv/Lib/site-packages/pkg_resources/tests/data/my-test-package-source/setup.py +7 -0
- venv/Lib/site-packages/pkg_resources/tests/test_find_distributions.py +56 -0
- venv/Lib/site-packages/pkg_resources/tests/test_integration_zope_interface.py +54 -0
- venv/Lib/site-packages/pkg_resources/tests/test_markers.py +8 -0
- venv/Lib/site-packages/pkg_resources/tests/test_pkg_resources.py +485 -0
- venv/Lib/site-packages/pkg_resources/tests/test_resources.py +869 -0
- venv/Lib/site-packages/pkg_resources/tests/test_working_set.py +505 -0
- venv/Lib/site-packages/setuptools/__init__.py +248 -0
- venv/Lib/site-packages/setuptools/_core_metadata.py +337 -0
- venv/Lib/site-packages/setuptools/_discovery.py +33 -0
- venv/Lib/site-packages/setuptools/_distutils/__init__.py +14 -0
- venv/Lib/site-packages/setuptools/_distutils/_log.py +3 -0
- venv/Lib/site-packages/setuptools/_distutils/_macos_compat.py +12 -0
- venv/Lib/site-packages/setuptools/_distutils/_modified.py +95 -0
- venv/Lib/site-packages/setuptools/_distutils/_msvccompiler.py +16 -0
- venv/Lib/site-packages/setuptools/_distutils/archive_util.py +294 -0
- venv/Lib/site-packages/setuptools/_distutils/ccompiler.py +26 -0
- venv/Lib/site-packages/setuptools/_distutils/cmd.py +554 -0
- venv/Lib/site-packages/setuptools/_distutils/command/__init__.py +23 -0
- venv/Lib/site-packages/setuptools/_distutils/command/_framework_compat.py +54 -0
- venv/Lib/site-packages/setuptools/_distutils/command/bdist.py +167 -0
- venv/Lib/site-packages/setuptools/_distutils/command/bdist_dumb.py +141 -0
- venv/Lib/site-packages/setuptools/_distutils/command/bdist_rpm.py +598 -0
- venv/Lib/site-packages/setuptools/_distutils/command/build.py +156 -0
- venv/Lib/site-packages/setuptools/_distutils/command/build_clib.py +201 -0
- venv/Lib/site-packages/setuptools/_distutils/command/build_ext.py +812 -0
- venv/Lib/site-packages/setuptools/_distutils/command/build_py.py +407 -0
- venv/Lib/site-packages/setuptools/_distutils/command/build_scripts.py +160 -0
- venv/Lib/site-packages/setuptools/_distutils/command/check.py +152 -0
- venv/Lib/site-packages/setuptools/_distutils/command/clean.py +77 -0
- venv/Lib/site-packages/setuptools/_distutils/command/config.py +358 -0
- venv/Lib/site-packages/setuptools/_distutils/command/install.py +805 -0
- venv/Lib/site-packages/setuptools/_distutils/command/install_data.py +94 -0
- venv/Lib/site-packages/setuptools/_distutils/command/install_egg_info.py +91 -0
- venv/Lib/site-packages/setuptools/_distutils/command/install_headers.py +46 -0
- venv/Lib/site-packages/setuptools/_distutils/command/install_lib.py +238 -0
- venv/Lib/site-packages/setuptools/_distutils/command/install_scripts.py +62 -0
- venv/Lib/site-packages/setuptools/_distutils/command/sdist.py +521 -0
- venv/Lib/site-packages/setuptools/_distutils/compat/__init__.py +18 -0
- venv/Lib/site-packages/setuptools/_distutils/compat/numpy.py +2 -0
- venv/Lib/site-packages/setuptools/_distutils/compat/py39.py +66 -0
- venv/Lib/site-packages/setuptools/_distutils/compilers/C/base.py +1394 -0
- venv/Lib/site-packages/setuptools/_distutils/compilers/C/cygwin.py +340 -0
- venv/Lib/site-packages/setuptools/_distutils/compilers/C/errors.py +24 -0
- venv/Lib/site-packages/setuptools/_distutils/compilers/C/msvc.py +614 -0
- venv/Lib/site-packages/setuptools/_distutils/compilers/C/tests/test_base.py +83 -0
- venv/Lib/site-packages/setuptools/_distutils/compilers/C/tests/test_cygwin.py +76 -0
- venv/Lib/site-packages/setuptools/_distutils/compilers/C/tests/test_mingw.py +48 -0
- venv/Lib/site-packages/setuptools/_distutils/compilers/C/tests/test_msvc.py +136 -0
- venv/Lib/site-packages/setuptools/_distutils/compilers/C/tests/test_unix.py +413 -0
- venv/Lib/site-packages/setuptools/_distutils/compilers/C/unix.py +422 -0
- venv/Lib/site-packages/setuptools/_distutils/compilers/C/zos.py +230 -0
- venv/Lib/site-packages/setuptools/_distutils/core.py +289 -0
- venv/Lib/site-packages/setuptools/_distutils/cygwinccompiler.py +31 -0
- venv/Lib/site-packages/setuptools/_distutils/debug.py +5 -0
- venv/Lib/site-packages/setuptools/_distutils/dep_util.py +14 -0
- venv/Lib/site-packages/setuptools/_distutils/dir_util.py +244 -0
- venv/Lib/site-packages/setuptools/_distutils/dist.py +1386 -0
- venv/Lib/site-packages/setuptools/_distutils/errors.py +108 -0
- venv/Lib/site-packages/setuptools/_distutils/extension.py +258 -0
- venv/Lib/site-packages/setuptools/_distutils/fancy_getopt.py +471 -0
- venv/Lib/site-packages/setuptools/_distutils/file_util.py +236 -0
- venv/Lib/site-packages/setuptools/_distutils/filelist.py +431 -0
- venv/Lib/site-packages/setuptools/_distutils/log.py +56 -0
- venv/Lib/site-packages/setuptools/_distutils/spawn.py +134 -0
- venv/Lib/site-packages/setuptools/_distutils/sysconfig.py +598 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/__init__.py +42 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/compat/__init__.py +0 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/compat/py39.py +40 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/support.py +134 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_archive_util.py +353 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_bdist.py +47 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_bdist_dumb.py +78 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_bdist_rpm.py +127 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_build.py +49 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_build_clib.py +134 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_build_ext.py +628 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_build_py.py +196 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_build_scripts.py +96 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_check.py +194 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_clean.py +45 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_cmd.py +107 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_config_cmd.py +87 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_core.py +130 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_dir_util.py +139 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_dist.py +552 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_extension.py +117 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_file_util.py +95 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_filelist.py +336 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_install.py +245 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_install_data.py +74 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_install_headers.py +33 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_install_lib.py +110 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_install_scripts.py +52 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_log.py +12 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_modified.py +126 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_sdist.py +470 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_spawn.py +141 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_sysconfig.py +319 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_text_file.py +127 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_util.py +243 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_version.py +80 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/test_versionpredicate.py +0 -0
- venv/Lib/site-packages/setuptools/_distutils/tests/unix_compat.py +17 -0
- venv/Lib/site-packages/setuptools/_distutils/text_file.py +286 -0
- venv/Lib/site-packages/setuptools/_distutils/unixccompiler.py +9 -0
- venv/Lib/site-packages/setuptools/_distutils/util.py +518 -0
- venv/Lib/site-packages/setuptools/_distutils/version.py +348 -0
- venv/Lib/site-packages/setuptools/_distutils/versionpredicate.py +175 -0
- venv/Lib/site-packages/setuptools/_distutils/zosccompiler.py +3 -0
- venv/Lib/site-packages/setuptools/_entry_points.py +94 -0
- venv/Lib/site-packages/setuptools/_imp.py +87 -0
- venv/Lib/site-packages/setuptools/_importlib.py +9 -0
- venv/Lib/site-packages/setuptools/_itertools.py +23 -0
- venv/Lib/site-packages/setuptools/_normalization.py +177 -0
- venv/Lib/site-packages/setuptools/_path.py +93 -0
- venv/Lib/site-packages/setuptools/_reqs.py +42 -0
- venv/Lib/site-packages/setuptools/_scripts.py +361 -0
- venv/Lib/site-packages/setuptools/_shutil.py +59 -0
- venv/Lib/site-packages/setuptools/_static.py +188 -0
- venv/Lib/site-packages/setuptools/_vendor/autocommand/__init__.py +27 -0
- venv/Lib/site-packages/setuptools/_vendor/autocommand/autoasync.py +142 -0
- venv/Lib/site-packages/setuptools/_vendor/autocommand/autocommand.py +70 -0
- venv/Lib/site-packages/setuptools/_vendor/autocommand/automain.py +59 -0
- venv/Lib/site-packages/setuptools/_vendor/autocommand/autoparse.py +333 -0
- venv/Lib/site-packages/setuptools/_vendor/autocommand/errors.py +23 -0
- venv/Lib/site-packages/setuptools/_vendor/backports/__init__.py +1 -0
- venv/Lib/site-packages/setuptools/_vendor/backports/tarfile/__init__.py +2937 -0
- venv/Lib/site-packages/setuptools/_vendor/backports/tarfile/__main__.py +5 -0
- venv/Lib/site-packages/setuptools/_vendor/backports/tarfile/compat/__init__.py +0 -0
- venv/Lib/site-packages/setuptools/_vendor/backports/tarfile/compat/py38.py +24 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/__init__.py +1083 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_adapters.py +83 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_collections.py +30 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_compat.py +57 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_functools.py +104 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_itertools.py +73 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_meta.py +67 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/_text.py +99 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/compat/__init__.py +0 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/compat/py311.py +22 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/compat/py39.py +36 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/diagnose.py +21 -0
- venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/py.typed +0 -0
- venv/Lib/site-packages/setuptools/_vendor/inflect/__init__.py +3986 -0
- venv/Lib/site-packages/setuptools/_vendor/inflect/compat/__init__.py +0 -0
- venv/Lib/site-packages/setuptools/_vendor/inflect/compat/py38.py +7 -0
- venv/Lib/site-packages/setuptools/_vendor/inflect/py.typed +0 -0
- venv/Lib/site-packages/setuptools/_vendor/jaraco/collections/__init__.py +1091 -0
- venv/Lib/site-packages/setuptools/_vendor/jaraco/collections/py.typed +0 -0
- venv/Lib/site-packages/setuptools/_vendor/jaraco/context.py +361 -0
- venv/Lib/site-packages/setuptools/_vendor/jaraco/functools/__init__.py +633 -0
- venv/Lib/site-packages/setuptools/_vendor/jaraco/functools/__init__.pyi +125 -0
- venv/Lib/site-packages/setuptools/_vendor/jaraco/functools/py.typed +0 -0
- venv/Lib/site-packages/setuptools/_vendor/jaraco/text/__init__.py +624 -0
- venv/Lib/site-packages/setuptools/_vendor/jaraco/text/layouts.py +25 -0
- venv/Lib/site-packages/setuptools/_vendor/jaraco/text/show-newlines.py +33 -0
- venv/Lib/site-packages/setuptools/_vendor/jaraco/text/strip-prefix.py +21 -0
- venv/Lib/site-packages/setuptools/_vendor/jaraco/text/to-dvorak.py +6 -0
- venv/Lib/site-packages/setuptools/_vendor/jaraco/text/to-qwerty.py +6 -0
- venv/Lib/site-packages/setuptools/_vendor/more_itertools/__init__.py +6 -0
- venv/Lib/site-packages/setuptools/_vendor/more_itertools/__init__.pyi +2 -0
- venv/Lib/site-packages/setuptools/_vendor/more_itertools/more.py +4806 -0
- venv/Lib/site-packages/setuptools/_vendor/more_itertools/more.pyi +709 -0
- venv/Lib/site-packages/setuptools/_vendor/more_itertools/py.typed +0 -0
- venv/Lib/site-packages/setuptools/_vendor/more_itertools/recipes.py +1046 -0
- venv/Lib/site-packages/setuptools/_vendor/more_itertools/recipes.pyi +136 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/__init__.py +15 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/_elffile.py +110 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/_manylinux.py +263 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/_musllinux.py +85 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/_parser.py +354 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/_structures.py +61 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/_tokenizer.py +194 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/licenses/__init__.py +145 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/licenses/_spdx.py +759 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/markers.py +331 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/metadata.py +863 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/py.typed +0 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/requirements.py +91 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/specifiers.py +1020 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/tags.py +617 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/utils.py +163 -0
- venv/Lib/site-packages/setuptools/_vendor/packaging/version.py +582 -0
- venv/Lib/site-packages/setuptools/_vendor/platformdirs/__init__.py +627 -0
- venv/Lib/site-packages/setuptools/_vendor/platformdirs/__main__.py +55 -0
- venv/Lib/site-packages/setuptools/_vendor/platformdirs/android.py +249 -0
- venv/Lib/site-packages/setuptools/_vendor/platformdirs/api.py +292 -0
- venv/Lib/site-packages/setuptools/_vendor/platformdirs/macos.py +130 -0
- venv/Lib/site-packages/setuptools/_vendor/platformdirs/py.typed +0 -0
- venv/Lib/site-packages/setuptools/_vendor/platformdirs/unix.py +275 -0
- venv/Lib/site-packages/setuptools/_vendor/platformdirs/version.py +16 -0
- venv/Lib/site-packages/setuptools/_vendor/platformdirs/windows.py +272 -0
- venv/Lib/site-packages/setuptools/_vendor/tomli/__init__.py +11 -0
- venv/Lib/site-packages/setuptools/_vendor/tomli/_parser.py +691 -0
- venv/Lib/site-packages/setuptools/_vendor/tomli/_re.py +107 -0
- venv/Lib/site-packages/setuptools/_vendor/tomli/_types.py +10 -0
- venv/Lib/site-packages/setuptools/_vendor/tomli/py.typed +1 -0
- venv/Lib/site-packages/setuptools/_vendor/typeguard/__init__.py +48 -0
- venv/Lib/site-packages/setuptools/_vendor/typeguard/_checkers.py +993 -0
- venv/Lib/site-packages/setuptools/_vendor/typeguard/_config.py +108 -0
- venv/Lib/site-packages/setuptools/_vendor/typeguard/_decorators.py +235 -0
- venv/Lib/site-packages/setuptools/_vendor/typeguard/_exceptions.py +42 -0
- venv/Lib/site-packages/setuptools/_vendor/typeguard/_functions.py +308 -0
- venv/Lib/site-packages/setuptools/_vendor/typeguard/_importhook.py +213 -0
- venv/Lib/site-packages/setuptools/_vendor/typeguard/_memo.py +48 -0
- venv/Lib/site-packages/setuptools/_vendor/typeguard/_pytest_plugin.py +127 -0
- venv/Lib/site-packages/setuptools/_vendor/typeguard/_suppression.py +86 -0
- venv/Lib/site-packages/setuptools/_vendor/typeguard/_transformer.py +1229 -0
- venv/Lib/site-packages/setuptools/_vendor/typeguard/_union_transformer.py +55 -0
- venv/Lib/site-packages/setuptools/_vendor/typeguard/_utils.py +173 -0
- venv/Lib/site-packages/setuptools/_vendor/typeguard/py.typed +0 -0
- venv/Lib/site-packages/setuptools/_vendor/typing_extensions.py +3641 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/__init__.py +3 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/__main__.py +23 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/_bdist_wheel.py +613 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/_setuptools_logging.py +26 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/bdist_wheel.py +26 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/cli/__init__.py +155 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/cli/convert.py +332 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/cli/pack.py +85 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/cli/tags.py +139 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/cli/unpack.py +30 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/macosx_libfile.py +482 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/metadata.py +183 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/util.py +17 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/__init__.py +0 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/__init__.py +0 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/_elffile.py +108 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/_manylinux.py +260 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/_musllinux.py +83 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/_parser.py +356 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/_structures.py +61 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/_tokenizer.py +192 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/markers.py +253 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/requirements.py +90 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/specifiers.py +1011 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/tags.py +571 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/utils.py +172 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/vendored/packaging/version.py +561 -0
- venv/Lib/site-packages/setuptools/_vendor/wheel/wheelfile.py +227 -0
- venv/Lib/site-packages/setuptools/_vendor/zipp/__init__.py +501 -0
- venv/Lib/site-packages/setuptools/_vendor/zipp/compat/__init__.py +0 -0
- venv/Lib/site-packages/setuptools/_vendor/zipp/compat/py310.py +11 -0
- venv/Lib/site-packages/setuptools/_vendor/zipp/glob.py +106 -0
- venv/Lib/site-packages/setuptools/archive_util.py +219 -0
- venv/Lib/site-packages/setuptools/build_meta.py +548 -0
- venv/Lib/site-packages/setuptools/command/__init__.py +21 -0
- venv/Lib/site-packages/setuptools/command/_requirestxt.py +131 -0
- venv/Lib/site-packages/setuptools/command/alias.py +77 -0
- venv/Lib/site-packages/setuptools/command/bdist_egg.py +477 -0
- venv/Lib/site-packages/setuptools/command/bdist_rpm.py +42 -0
- venv/Lib/site-packages/setuptools/command/bdist_wheel.py +604 -0
- venv/Lib/site-packages/setuptools/command/build.py +135 -0
- venv/Lib/site-packages/setuptools/command/build_clib.py +103 -0
- venv/Lib/site-packages/setuptools/command/build_ext.py +470 -0
- venv/Lib/site-packages/setuptools/command/build_py.py +400 -0
- venv/Lib/site-packages/setuptools/command/develop.py +55 -0
- venv/Lib/site-packages/setuptools/command/dist_info.py +103 -0
- venv/Lib/site-packages/setuptools/command/easy_install.py +30 -0
- venv/Lib/site-packages/setuptools/command/editable_wheel.py +908 -0
- venv/Lib/site-packages/setuptools/command/egg_info.py +718 -0
- venv/Lib/site-packages/setuptools/command/install.py +131 -0
- venv/Lib/site-packages/setuptools/command/install_egg_info.py +58 -0
- venv/Lib/site-packages/setuptools/command/install_lib.py +137 -0
- venv/Lib/site-packages/setuptools/command/install_scripts.py +67 -0
- venv/Lib/site-packages/setuptools/command/rotate.py +65 -0
- venv/Lib/site-packages/setuptools/command/saveopts.py +21 -0
- venv/Lib/site-packages/setuptools/command/sdist.py +217 -0
- venv/Lib/site-packages/setuptools/command/setopt.py +141 -0
- venv/Lib/site-packages/setuptools/command/test.py +45 -0
- venv/Lib/site-packages/setuptools/compat/__init__.py +0 -0
- venv/Lib/site-packages/setuptools/compat/py310.py +20 -0
- venv/Lib/site-packages/setuptools/compat/py311.py +27 -0
- venv/Lib/site-packages/setuptools/compat/py312.py +13 -0
- venv/Lib/site-packages/setuptools/compat/py39.py +9 -0
- venv/Lib/site-packages/setuptools/config/__init__.py +43 -0
- venv/Lib/site-packages/setuptools/config/_apply_pyprojecttoml.py +526 -0
- venv/Lib/site-packages/setuptools/config/_validate_pyproject/__init__.py +34 -0
- venv/Lib/site-packages/setuptools/config/_validate_pyproject/error_reporting.py +336 -0
- venv/Lib/site-packages/setuptools/config/_validate_pyproject/extra_validations.py +82 -0
- venv/Lib/site-packages/setuptools/config/_validate_pyproject/fastjsonschema_exceptions.py +51 -0
- venv/Lib/site-packages/setuptools/config/_validate_pyproject/fastjsonschema_validations.py +1412 -0
- venv/Lib/site-packages/setuptools/config/_validate_pyproject/formats.py +402 -0
- venv/Lib/site-packages/setuptools/config/expand.py +452 -0
- venv/Lib/site-packages/setuptools/config/pyprojecttoml.py +468 -0
- venv/Lib/site-packages/setuptools/config/setupcfg.py +780 -0
- venv/Lib/site-packages/setuptools/depends.py +185 -0
- venv/Lib/site-packages/setuptools/discovery.py +614 -0
- venv/Lib/site-packages/setuptools/dist.py +1119 -0
- venv/Lib/site-packages/setuptools/errors.py +67 -0
- venv/Lib/site-packages/setuptools/extension.py +177 -0
- venv/Lib/site-packages/setuptools/glob.py +185 -0
- venv/Lib/site-packages/setuptools/installer.py +155 -0
- venv/Lib/site-packages/setuptools/launch.py +36 -0
- venv/Lib/site-packages/setuptools/logging.py +40 -0
- venv/Lib/site-packages/setuptools/modified.py +18 -0
- venv/Lib/site-packages/setuptools/monkey.py +126 -0
- venv/Lib/site-packages/setuptools/msvc.py +1536 -0
- venv/Lib/site-packages/setuptools/namespaces.py +106 -0
- venv/Lib/site-packages/setuptools/tests/__init__.py +13 -0
- venv/Lib/site-packages/setuptools/tests/compat/__init__.py +0 -0
- venv/Lib/site-packages/setuptools/tests/compat/py39.py +3 -0
- venv/Lib/site-packages/setuptools/tests/config/__init__.py +0 -0
- venv/Lib/site-packages/setuptools/tests/config/downloads/__init__.py +59 -0
- venv/Lib/site-packages/setuptools/tests/config/downloads/preload.py +18 -0
- venv/Lib/site-packages/setuptools/tests/config/test_apply_pyprojecttoml.py +772 -0
- venv/Lib/site-packages/setuptools/tests/config/test_expand.py +247 -0
- venv/Lib/site-packages/setuptools/tests/config/test_pyprojecttoml.py +396 -0
- venv/Lib/site-packages/setuptools/tests/config/test_pyprojecttoml_dynamic_deps.py +109 -0
- venv/Lib/site-packages/setuptools/tests/config/test_setupcfg.py +980 -0
- venv/Lib/site-packages/setuptools/tests/contexts.py +131 -0
- venv/Lib/site-packages/setuptools/tests/environment.py +95 -0
- venv/Lib/site-packages/setuptools/tests/fixtures.py +392 -0
- venv/Lib/site-packages/setuptools/tests/integration/__init__.py +0 -0
- venv/Lib/site-packages/setuptools/tests/integration/helpers.py +77 -0
- venv/Lib/site-packages/setuptools/tests/integration/test_pbr.py +20 -0
- venv/Lib/site-packages/setuptools/tests/integration/test_pip_install_sdist.py +223 -0
- venv/Lib/site-packages/setuptools/tests/mod_with_constant.py +1 -0
- venv/Lib/site-packages/setuptools/tests/namespaces.py +90 -0
- venv/Lib/site-packages/setuptools/tests/script-with-bom.py +1 -0
- venv/Lib/site-packages/setuptools/tests/test_archive_util.py +36 -0
- venv/Lib/site-packages/setuptools/tests/test_bdist_deprecations.py +28 -0
- venv/Lib/site-packages/setuptools/tests/test_bdist_egg.py +73 -0
- venv/Lib/site-packages/setuptools/tests/test_bdist_wheel.py +708 -0
- venv/Lib/site-packages/setuptools/tests/test_build.py +33 -0
- venv/Lib/site-packages/setuptools/tests/test_build_clib.py +84 -0
- venv/Lib/site-packages/setuptools/tests/test_build_ext.py +293 -0
- venv/Lib/site-packages/setuptools/tests/test_build_meta.py +959 -0
- venv/Lib/site-packages/setuptools/tests/test_build_py.py +480 -0
- venv/Lib/site-packages/setuptools/tests/test_config_discovery.py +647 -0
- venv/Lib/site-packages/setuptools/tests/test_core_metadata.py +622 -0
- venv/Lib/site-packages/setuptools/tests/test_depends.py +15 -0
- venv/Lib/site-packages/setuptools/tests/test_develop.py +112 -0
- venv/Lib/site-packages/setuptools/tests/test_dist.py +278 -0
- venv/Lib/site-packages/setuptools/tests/test_dist_info.py +147 -0
- venv/Lib/site-packages/setuptools/tests/test_distutils_adoption.py +198 -0
- venv/Lib/site-packages/setuptools/tests/test_editable_install.py +1263 -0
- venv/Lib/site-packages/setuptools/tests/test_egg_info.py +1306 -0
- venv/Lib/site-packages/setuptools/tests/test_extern.py +15 -0
- venv/Lib/site-packages/setuptools/tests/test_find_packages.py +218 -0
- venv/Lib/site-packages/setuptools/tests/test_find_py_modules.py +73 -0
- venv/Lib/site-packages/setuptools/tests/test_glob.py +45 -0
- venv/Lib/site-packages/setuptools/tests/test_install_scripts.py +89 -0
- venv/Lib/site-packages/setuptools/tests/test_logging.py +76 -0
- venv/Lib/site-packages/setuptools/tests/test_manifest.py +622 -0
- venv/Lib/site-packages/setuptools/tests/test_namespaces.py +138 -0
- venv/Lib/site-packages/setuptools/tests/test_scripts.py +12 -0
- venv/Lib/site-packages/setuptools/tests/test_sdist.py +984 -0
- venv/Lib/site-packages/setuptools/tests/test_setopt.py +40 -0
- venv/Lib/site-packages/setuptools/tests/test_setuptools.py +290 -0
- venv/Lib/site-packages/setuptools/tests/test_shutil_wrapper.py +23 -0
- venv/Lib/site-packages/setuptools/tests/test_unicode_utils.py +10 -0
- venv/Lib/site-packages/setuptools/tests/test_virtualenv.py +113 -0
- venv/Lib/site-packages/setuptools/tests/test_warnings.py +106 -0
- venv/Lib/site-packages/setuptools/tests/test_wheel.py +690 -0
- venv/Lib/site-packages/setuptools/tests/test_windows_wrappers.py +258 -0
- venv/Lib/site-packages/setuptools/tests/text.py +4 -0
- venv/Lib/site-packages/setuptools/tests/textwrap.py +6 -0
- venv/Lib/site-packages/setuptools/unicode_utils.py +102 -0
- venv/Lib/site-packages/setuptools/version.py +6 -0
- venv/Lib/site-packages/setuptools/warnings.py +110 -0
- venv/Lib/site-packages/setuptools/wheel.py +261 -0
- venv/Lib/site-packages/setuptools/windows_support.py +30 -0
- {android_notify-1.60.0.dist-info → android_notify-1.60.2.dist-info}/WHEEL +0 -0
- {android_notify-1.60.0.dist-info → android_notify-1.60.2.dist-info}/entry_points.txt +0 -0
- {android_notify-1.60.0.dist-info → android_notify-1.60.2.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,984 @@
|
|
|
1
|
+
"""sdist tests"""
|
|
2
|
+
|
|
3
|
+
import contextlib
|
|
4
|
+
import io
|
|
5
|
+
import logging
|
|
6
|
+
import os
|
|
7
|
+
import pathlib
|
|
8
|
+
import sys
|
|
9
|
+
import tarfile
|
|
10
|
+
import tempfile
|
|
11
|
+
import unicodedata
|
|
12
|
+
from inspect import cleandoc
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
from unittest import mock
|
|
15
|
+
|
|
16
|
+
import jaraco.path
|
|
17
|
+
import pytest
|
|
18
|
+
|
|
19
|
+
from setuptools import Command, SetuptoolsDeprecationWarning
|
|
20
|
+
from setuptools._importlib import metadata
|
|
21
|
+
from setuptools.command.egg_info import manifest_maker
|
|
22
|
+
from setuptools.command.sdist import sdist
|
|
23
|
+
from setuptools.dist import Distribution
|
|
24
|
+
from setuptools.extension import Extension
|
|
25
|
+
from setuptools.tests import fail_on_ascii
|
|
26
|
+
|
|
27
|
+
from .text import Filenames
|
|
28
|
+
|
|
29
|
+
import distutils
|
|
30
|
+
from distutils.core import run_setup
|
|
31
|
+
|
|
32
|
+
SETUP_ATTRS = {
|
|
33
|
+
'name': 'sdist_test',
|
|
34
|
+
'version': '0.0',
|
|
35
|
+
'packages': ['sdist_test'],
|
|
36
|
+
'package_data': {'sdist_test': ['*.txt']},
|
|
37
|
+
'data_files': [("data", [os.path.join("d", "e.dat")])],
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
SETUP_PY = f"""\
|
|
41
|
+
from setuptools import setup
|
|
42
|
+
|
|
43
|
+
setup(**{SETUP_ATTRS!r})
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
EXTENSION = Extension(
|
|
47
|
+
name="sdist_test.f",
|
|
48
|
+
sources=[os.path.join("sdist_test", "f.c")],
|
|
49
|
+
depends=[os.path.join("sdist_test", "f.h")],
|
|
50
|
+
)
|
|
51
|
+
EXTENSION_SOURCES = EXTENSION.sources + EXTENSION.depends
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
@contextlib.contextmanager
|
|
55
|
+
def quiet():
|
|
56
|
+
old_stdout, old_stderr = sys.stdout, sys.stderr
|
|
57
|
+
sys.stdout, sys.stderr = io.StringIO(), io.StringIO()
|
|
58
|
+
try:
|
|
59
|
+
yield
|
|
60
|
+
finally:
|
|
61
|
+
sys.stdout, sys.stderr = old_stdout, old_stderr
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
# Convert to POSIX path
|
|
65
|
+
def posix(path):
|
|
66
|
+
if not isinstance(path, str):
|
|
67
|
+
return path.replace(os.sep.encode('ascii'), b'/')
|
|
68
|
+
else:
|
|
69
|
+
return path.replace(os.sep, '/')
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
# HFS Plus uses decomposed UTF-8
|
|
73
|
+
def decompose(path):
|
|
74
|
+
if isinstance(path, str):
|
|
75
|
+
return unicodedata.normalize('NFD', path)
|
|
76
|
+
try:
|
|
77
|
+
path = path.decode('utf-8')
|
|
78
|
+
path = unicodedata.normalize('NFD', path)
|
|
79
|
+
path = path.encode('utf-8')
|
|
80
|
+
except UnicodeError:
|
|
81
|
+
pass # Not UTF-8
|
|
82
|
+
return path
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def read_all_bytes(filename):
|
|
86
|
+
with open(filename, 'rb') as fp:
|
|
87
|
+
return fp.read()
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def latin1_fail():
|
|
91
|
+
try:
|
|
92
|
+
desc, filename = tempfile.mkstemp(suffix=Filenames.latin_1)
|
|
93
|
+
os.close(desc)
|
|
94
|
+
os.remove(filename)
|
|
95
|
+
except Exception:
|
|
96
|
+
return True
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
fail_on_latin1_encoded_filenames = pytest.mark.xfail(
|
|
100
|
+
latin1_fail(),
|
|
101
|
+
reason="System does not support latin-1 filenames",
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
skip_under_xdist = pytest.mark.skipif(
|
|
106
|
+
"os.environ.get('PYTEST_XDIST_WORKER')",
|
|
107
|
+
reason="pytest-dev/pytest-xdist#843",
|
|
108
|
+
)
|
|
109
|
+
skip_under_stdlib_distutils = pytest.mark.skipif(
|
|
110
|
+
not distutils.__package__.startswith('setuptools'),
|
|
111
|
+
reason="the test is not supported with stdlib distutils",
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def touch(path):
|
|
116
|
+
open(path, 'wb').close()
|
|
117
|
+
return path
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def symlink_or_skip_test(src, dst):
|
|
121
|
+
try:
|
|
122
|
+
os.symlink(src, dst)
|
|
123
|
+
except (OSError, NotImplementedError):
|
|
124
|
+
pytest.skip("symlink not supported in OS")
|
|
125
|
+
return None
|
|
126
|
+
return dst
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
class TestSdistTest:
|
|
130
|
+
@pytest.fixture(autouse=True)
|
|
131
|
+
def source_dir(self, tmpdir):
|
|
132
|
+
tmpdir = tmpdir / "project_root"
|
|
133
|
+
tmpdir.mkdir()
|
|
134
|
+
|
|
135
|
+
(tmpdir / 'setup.py').write_text(SETUP_PY, encoding='utf-8')
|
|
136
|
+
|
|
137
|
+
# Set up the rest of the test package
|
|
138
|
+
test_pkg = tmpdir / 'sdist_test'
|
|
139
|
+
test_pkg.mkdir()
|
|
140
|
+
data_folder = tmpdir / 'd'
|
|
141
|
+
data_folder.mkdir()
|
|
142
|
+
# *.rst was not included in package_data, so c.rst should not be
|
|
143
|
+
# automatically added to the manifest when not under version control
|
|
144
|
+
for fname in ['__init__.py', 'a.txt', 'b.txt', 'c.rst']:
|
|
145
|
+
touch(test_pkg / fname)
|
|
146
|
+
touch(data_folder / 'e.dat')
|
|
147
|
+
# C sources are not included by default, but they will be,
|
|
148
|
+
# if an extension module uses them as sources or depends
|
|
149
|
+
for fname in EXTENSION_SOURCES:
|
|
150
|
+
touch(tmpdir / fname)
|
|
151
|
+
|
|
152
|
+
with tmpdir.as_cwd():
|
|
153
|
+
yield tmpdir
|
|
154
|
+
|
|
155
|
+
def assert_package_data_in_manifest(self, cmd):
|
|
156
|
+
manifest = cmd.filelist.files
|
|
157
|
+
assert os.path.join('sdist_test', 'a.txt') in manifest
|
|
158
|
+
assert os.path.join('sdist_test', 'b.txt') in manifest
|
|
159
|
+
assert os.path.join('sdist_test', 'c.rst') not in manifest
|
|
160
|
+
assert os.path.join('d', 'e.dat') in manifest
|
|
161
|
+
|
|
162
|
+
def setup_with_extension(self):
|
|
163
|
+
setup_attrs = {**SETUP_ATTRS, 'ext_modules': [EXTENSION]}
|
|
164
|
+
|
|
165
|
+
dist = Distribution(setup_attrs)
|
|
166
|
+
dist.script_name = 'setup.py'
|
|
167
|
+
cmd = sdist(dist)
|
|
168
|
+
cmd.ensure_finalized()
|
|
169
|
+
|
|
170
|
+
with quiet():
|
|
171
|
+
cmd.run()
|
|
172
|
+
|
|
173
|
+
return cmd
|
|
174
|
+
|
|
175
|
+
def test_package_data_in_sdist(self):
|
|
176
|
+
"""Regression test for pull request #4: ensures that files listed in
|
|
177
|
+
package_data are included in the manifest even if they're not added to
|
|
178
|
+
version control.
|
|
179
|
+
"""
|
|
180
|
+
|
|
181
|
+
dist = Distribution(SETUP_ATTRS)
|
|
182
|
+
dist.script_name = 'setup.py'
|
|
183
|
+
cmd = sdist(dist)
|
|
184
|
+
cmd.ensure_finalized()
|
|
185
|
+
|
|
186
|
+
with quiet():
|
|
187
|
+
cmd.run()
|
|
188
|
+
|
|
189
|
+
self.assert_package_data_in_manifest(cmd)
|
|
190
|
+
|
|
191
|
+
def test_package_data_and_include_package_data_in_sdist(self):
|
|
192
|
+
"""
|
|
193
|
+
Ensure package_data and include_package_data work
|
|
194
|
+
together.
|
|
195
|
+
"""
|
|
196
|
+
setup_attrs = {**SETUP_ATTRS, 'include_package_data': True}
|
|
197
|
+
assert setup_attrs['package_data']
|
|
198
|
+
|
|
199
|
+
dist = Distribution(setup_attrs)
|
|
200
|
+
dist.script_name = 'setup.py'
|
|
201
|
+
cmd = sdist(dist)
|
|
202
|
+
cmd.ensure_finalized()
|
|
203
|
+
|
|
204
|
+
with quiet():
|
|
205
|
+
cmd.run()
|
|
206
|
+
|
|
207
|
+
self.assert_package_data_in_manifest(cmd)
|
|
208
|
+
|
|
209
|
+
def test_extension_sources_in_sdist(self):
|
|
210
|
+
"""
|
|
211
|
+
Ensure that the files listed in Extension.sources and Extension.depends
|
|
212
|
+
are automatically included in the manifest.
|
|
213
|
+
"""
|
|
214
|
+
cmd = self.setup_with_extension()
|
|
215
|
+
self.assert_package_data_in_manifest(cmd)
|
|
216
|
+
manifest = cmd.filelist.files
|
|
217
|
+
for path in EXTENSION_SOURCES:
|
|
218
|
+
assert path in manifest
|
|
219
|
+
|
|
220
|
+
def test_missing_extension_sources(self):
|
|
221
|
+
"""
|
|
222
|
+
Similar to test_extension_sources_in_sdist but the referenced files don't exist.
|
|
223
|
+
Missing files should not be included in distribution (with no error raised).
|
|
224
|
+
"""
|
|
225
|
+
for path in EXTENSION_SOURCES:
|
|
226
|
+
os.remove(path)
|
|
227
|
+
|
|
228
|
+
cmd = self.setup_with_extension()
|
|
229
|
+
self.assert_package_data_in_manifest(cmd)
|
|
230
|
+
manifest = cmd.filelist.files
|
|
231
|
+
for path in EXTENSION_SOURCES:
|
|
232
|
+
assert path not in manifest
|
|
233
|
+
|
|
234
|
+
def test_symlinked_extension_sources(self):
|
|
235
|
+
"""
|
|
236
|
+
Similar to test_extension_sources_in_sdist but the referenced files are
|
|
237
|
+
instead symbolic links to project-local files. Referenced file paths
|
|
238
|
+
should be included. Symlink targets themselves should NOT be included.
|
|
239
|
+
"""
|
|
240
|
+
symlinked = []
|
|
241
|
+
for path in EXTENSION_SOURCES:
|
|
242
|
+
base, ext = os.path.splitext(path)
|
|
243
|
+
target = base + "_target." + ext
|
|
244
|
+
|
|
245
|
+
os.rename(path, target)
|
|
246
|
+
symlink_or_skip_test(os.path.basename(target), path)
|
|
247
|
+
symlinked.append(target)
|
|
248
|
+
|
|
249
|
+
cmd = self.setup_with_extension()
|
|
250
|
+
self.assert_package_data_in_manifest(cmd)
|
|
251
|
+
manifest = cmd.filelist.files
|
|
252
|
+
for path in EXTENSION_SOURCES:
|
|
253
|
+
assert path in manifest
|
|
254
|
+
for path in symlinked:
|
|
255
|
+
assert path not in manifest
|
|
256
|
+
|
|
257
|
+
_INVALID_PATHS = {
|
|
258
|
+
"must be relative": lambda: (
|
|
259
|
+
os.path.abspath(os.path.join("sdist_test", "f.h"))
|
|
260
|
+
),
|
|
261
|
+
"can't have `..` segments": lambda: (
|
|
262
|
+
os.path.join("sdist_test", "..", "sdist_test", "f.h")
|
|
263
|
+
),
|
|
264
|
+
"doesn't exist": lambda: (
|
|
265
|
+
os.path.join("sdist_test", "this_file_does_not_exist.h")
|
|
266
|
+
),
|
|
267
|
+
"must be inside the project root": lambda: (
|
|
268
|
+
symlink_or_skip_test(
|
|
269
|
+
touch(os.path.join("..", "outside_of_project_root.h")),
|
|
270
|
+
"symlink.h",
|
|
271
|
+
)
|
|
272
|
+
),
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
@skip_under_stdlib_distutils
|
|
276
|
+
@pytest.mark.parametrize("reason", _INVALID_PATHS.keys())
|
|
277
|
+
def test_invalid_extension_depends(self, reason, caplog):
|
|
278
|
+
"""
|
|
279
|
+
Due to backwards compatibility reasons, `Extension.depends` should accept
|
|
280
|
+
invalid/weird paths, but then ignore them when building a sdist.
|
|
281
|
+
|
|
282
|
+
This test verifies that the source distribution is still built
|
|
283
|
+
successfully with such paths, but that instead of adding these paths to
|
|
284
|
+
the manifest, we emit an informational message, notifying the user that
|
|
285
|
+
the invalid path won't be automatically included.
|
|
286
|
+
"""
|
|
287
|
+
invalid_path = self._INVALID_PATHS[reason]()
|
|
288
|
+
extension = Extension(
|
|
289
|
+
name="sdist_test.f",
|
|
290
|
+
sources=[],
|
|
291
|
+
depends=[invalid_path],
|
|
292
|
+
)
|
|
293
|
+
setup_attrs = {**SETUP_ATTRS, 'ext_modules': [extension]}
|
|
294
|
+
|
|
295
|
+
dist = Distribution(setup_attrs)
|
|
296
|
+
dist.script_name = 'setup.py'
|
|
297
|
+
cmd = sdist(dist)
|
|
298
|
+
cmd.ensure_finalized()
|
|
299
|
+
|
|
300
|
+
with quiet(), caplog.at_level(logging.INFO):
|
|
301
|
+
cmd.run()
|
|
302
|
+
|
|
303
|
+
self.assert_package_data_in_manifest(cmd)
|
|
304
|
+
manifest = cmd.filelist.files
|
|
305
|
+
assert invalid_path not in manifest
|
|
306
|
+
|
|
307
|
+
expected_message = [
|
|
308
|
+
message
|
|
309
|
+
for (logger, level, message) in caplog.record_tuples
|
|
310
|
+
if (
|
|
311
|
+
logger == "root" #
|
|
312
|
+
and level == logging.INFO #
|
|
313
|
+
and invalid_path in message #
|
|
314
|
+
)
|
|
315
|
+
]
|
|
316
|
+
assert len(expected_message) == 1
|
|
317
|
+
(expected_message,) = expected_message
|
|
318
|
+
assert reason in expected_message
|
|
319
|
+
|
|
320
|
+
def test_custom_build_py(self):
|
|
321
|
+
"""
|
|
322
|
+
Ensure projects defining custom build_py don't break
|
|
323
|
+
when creating sdists (issue #2849)
|
|
324
|
+
"""
|
|
325
|
+
from distutils.command.build_py import build_py as OrigBuildPy
|
|
326
|
+
|
|
327
|
+
using_custom_command_guard = mock.Mock()
|
|
328
|
+
|
|
329
|
+
class CustomBuildPy(OrigBuildPy):
|
|
330
|
+
"""
|
|
331
|
+
Some projects have custom commands inheriting from `distutils`
|
|
332
|
+
"""
|
|
333
|
+
|
|
334
|
+
def get_data_files(self):
|
|
335
|
+
using_custom_command_guard()
|
|
336
|
+
return super().get_data_files()
|
|
337
|
+
|
|
338
|
+
setup_attrs = {**SETUP_ATTRS, 'include_package_data': True}
|
|
339
|
+
assert setup_attrs['package_data']
|
|
340
|
+
|
|
341
|
+
dist = Distribution(setup_attrs)
|
|
342
|
+
dist.script_name = 'setup.py'
|
|
343
|
+
cmd = sdist(dist)
|
|
344
|
+
cmd.ensure_finalized()
|
|
345
|
+
|
|
346
|
+
# Make sure we use the custom command
|
|
347
|
+
cmd.cmdclass = {'build_py': CustomBuildPy}
|
|
348
|
+
cmd.distribution.cmdclass = {'build_py': CustomBuildPy}
|
|
349
|
+
assert cmd.distribution.get_command_class('build_py') == CustomBuildPy
|
|
350
|
+
|
|
351
|
+
msg = "setuptools instead of distutils"
|
|
352
|
+
with quiet(), pytest.warns(SetuptoolsDeprecationWarning, match=msg):
|
|
353
|
+
cmd.run()
|
|
354
|
+
|
|
355
|
+
using_custom_command_guard.assert_called()
|
|
356
|
+
self.assert_package_data_in_manifest(cmd)
|
|
357
|
+
|
|
358
|
+
def test_setup_py_exists(self):
|
|
359
|
+
dist = Distribution(SETUP_ATTRS)
|
|
360
|
+
dist.script_name = 'foo.py'
|
|
361
|
+
cmd = sdist(dist)
|
|
362
|
+
cmd.ensure_finalized()
|
|
363
|
+
|
|
364
|
+
with quiet():
|
|
365
|
+
cmd.run()
|
|
366
|
+
|
|
367
|
+
manifest = cmd.filelist.files
|
|
368
|
+
assert 'setup.py' in manifest
|
|
369
|
+
|
|
370
|
+
def test_setup_py_missing(self):
|
|
371
|
+
dist = Distribution(SETUP_ATTRS)
|
|
372
|
+
dist.script_name = 'foo.py'
|
|
373
|
+
cmd = sdist(dist)
|
|
374
|
+
cmd.ensure_finalized()
|
|
375
|
+
|
|
376
|
+
if os.path.exists("setup.py"):
|
|
377
|
+
os.remove("setup.py")
|
|
378
|
+
with quiet():
|
|
379
|
+
cmd.run()
|
|
380
|
+
|
|
381
|
+
manifest = cmd.filelist.files
|
|
382
|
+
assert 'setup.py' not in manifest
|
|
383
|
+
|
|
384
|
+
def test_setup_py_excluded(self):
|
|
385
|
+
with open("MANIFEST.in", "w", encoding="utf-8") as manifest_file:
|
|
386
|
+
manifest_file.write("exclude setup.py")
|
|
387
|
+
|
|
388
|
+
dist = Distribution(SETUP_ATTRS)
|
|
389
|
+
dist.script_name = 'foo.py'
|
|
390
|
+
cmd = sdist(dist)
|
|
391
|
+
cmd.ensure_finalized()
|
|
392
|
+
|
|
393
|
+
with quiet():
|
|
394
|
+
cmd.run()
|
|
395
|
+
|
|
396
|
+
manifest = cmd.filelist.files
|
|
397
|
+
assert 'setup.py' not in manifest
|
|
398
|
+
|
|
399
|
+
def test_defaults_case_sensitivity(self, source_dir):
|
|
400
|
+
"""
|
|
401
|
+
Make sure default files (README.*, etc.) are added in a case-sensitive
|
|
402
|
+
way to avoid problems with packages built on Windows.
|
|
403
|
+
"""
|
|
404
|
+
|
|
405
|
+
touch(source_dir / 'readme.rst')
|
|
406
|
+
touch(source_dir / 'SETUP.cfg')
|
|
407
|
+
|
|
408
|
+
dist = Distribution(SETUP_ATTRS)
|
|
409
|
+
# the extension deliberately capitalized for this test
|
|
410
|
+
# to make sure the actual filename (not capitalized) gets added
|
|
411
|
+
# to the manifest
|
|
412
|
+
dist.script_name = 'setup.PY'
|
|
413
|
+
cmd = sdist(dist)
|
|
414
|
+
cmd.ensure_finalized()
|
|
415
|
+
|
|
416
|
+
with quiet():
|
|
417
|
+
cmd.run()
|
|
418
|
+
|
|
419
|
+
# lowercase all names so we can test in a
|
|
420
|
+
# case-insensitive way to make sure the files
|
|
421
|
+
# are not included.
|
|
422
|
+
manifest = map(lambda x: x.lower(), cmd.filelist.files)
|
|
423
|
+
assert 'readme.rst' not in manifest, manifest
|
|
424
|
+
assert 'setup.py' not in manifest, manifest
|
|
425
|
+
assert 'setup.cfg' not in manifest, manifest
|
|
426
|
+
|
|
427
|
+
def test_exclude_dev_only_cache_folders(self, source_dir):
|
|
428
|
+
included = {
|
|
429
|
+
# Emulate problem in https://github.com/pypa/setuptools/issues/4601
|
|
430
|
+
"MANIFEST.in": (
|
|
431
|
+
"global-include LICEN[CS]E* COPYING* NOTICE* AUTHORS*\n"
|
|
432
|
+
"global-include *.txt\n"
|
|
433
|
+
),
|
|
434
|
+
# For the sake of being conservative and limiting unforeseen side-effects
|
|
435
|
+
# we just exclude dev-only cache folders at the root of the repository:
|
|
436
|
+
"test/.venv/lib/python3.9/site-packages/bar-2.dist-info/AUTHORS.rst": "",
|
|
437
|
+
"src/.nox/py/lib/python3.12/site-packages/bar-2.dist-info/COPYING.txt": "",
|
|
438
|
+
"doc/.tox/default/lib/python3.11/site-packages/foo-4.dist-info/LICENSE": "",
|
|
439
|
+
# Let's test against false positives with similarly named files:
|
|
440
|
+
".venv-requirements.txt": "",
|
|
441
|
+
".tox-coveragerc.txt": "",
|
|
442
|
+
".noxy/coveragerc.txt": "",
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
excluded = {
|
|
446
|
+
# .tox/.nox/.venv are well-know folders present at the root of Python repos
|
|
447
|
+
# and therefore should be excluded
|
|
448
|
+
".tox/release/lib/python3.11/site-packages/foo-4.dist-info/LICENSE": "",
|
|
449
|
+
".nox/py/lib/python3.12/site-packages/bar-2.dist-info/COPYING.txt": "",
|
|
450
|
+
".venv/lib/python3.9/site-packages/bar-2.dist-info/AUTHORS.rst": "",
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
for file, content in {**excluded, **included}.items():
|
|
454
|
+
Path(source_dir, file).parent.mkdir(parents=True, exist_ok=True)
|
|
455
|
+
Path(source_dir, file).write_text(content, encoding="utf-8")
|
|
456
|
+
|
|
457
|
+
cmd = self.setup_with_extension()
|
|
458
|
+
self.assert_package_data_in_manifest(cmd)
|
|
459
|
+
manifest = {f.replace(os.sep, '/') for f in cmd.filelist.files}
|
|
460
|
+
for path in excluded:
|
|
461
|
+
assert os.path.exists(path)
|
|
462
|
+
assert path not in manifest, (path, manifest)
|
|
463
|
+
for path in included:
|
|
464
|
+
assert os.path.exists(path)
|
|
465
|
+
assert path in manifest, (path, manifest)
|
|
466
|
+
|
|
467
|
+
@fail_on_ascii
|
|
468
|
+
def test_manifest_is_written_with_utf8_encoding(self):
|
|
469
|
+
# Test for #303.
|
|
470
|
+
dist = Distribution(SETUP_ATTRS)
|
|
471
|
+
dist.script_name = 'setup.py'
|
|
472
|
+
mm = manifest_maker(dist)
|
|
473
|
+
mm.manifest = os.path.join('sdist_test.egg-info', 'SOURCES.txt')
|
|
474
|
+
os.mkdir('sdist_test.egg-info')
|
|
475
|
+
|
|
476
|
+
# UTF-8 filename
|
|
477
|
+
filename = os.path.join('sdist_test', 'smörbröd.py')
|
|
478
|
+
|
|
479
|
+
# Must create the file or it will get stripped.
|
|
480
|
+
touch(filename)
|
|
481
|
+
|
|
482
|
+
# Add UTF-8 filename and write manifest
|
|
483
|
+
with quiet():
|
|
484
|
+
mm.run()
|
|
485
|
+
mm.filelist.append(filename)
|
|
486
|
+
mm.write_manifest()
|
|
487
|
+
|
|
488
|
+
contents = read_all_bytes(mm.manifest)
|
|
489
|
+
|
|
490
|
+
# The manifest should be UTF-8 encoded
|
|
491
|
+
u_contents = contents.decode('UTF-8')
|
|
492
|
+
|
|
493
|
+
# The manifest should contain the UTF-8 filename
|
|
494
|
+
assert posix(filename) in u_contents
|
|
495
|
+
|
|
496
|
+
@fail_on_ascii
|
|
497
|
+
def test_write_manifest_allows_utf8_filenames(self):
|
|
498
|
+
# Test for #303.
|
|
499
|
+
dist = Distribution(SETUP_ATTRS)
|
|
500
|
+
dist.script_name = 'setup.py'
|
|
501
|
+
mm = manifest_maker(dist)
|
|
502
|
+
mm.manifest = os.path.join('sdist_test.egg-info', 'SOURCES.txt')
|
|
503
|
+
os.mkdir('sdist_test.egg-info')
|
|
504
|
+
|
|
505
|
+
filename = os.path.join(b'sdist_test', Filenames.utf_8)
|
|
506
|
+
|
|
507
|
+
# Must touch the file or risk removal
|
|
508
|
+
touch(filename)
|
|
509
|
+
|
|
510
|
+
# Add filename and write manifest
|
|
511
|
+
with quiet():
|
|
512
|
+
mm.run()
|
|
513
|
+
u_filename = filename.decode('utf-8')
|
|
514
|
+
mm.filelist.files.append(u_filename)
|
|
515
|
+
# Re-write manifest
|
|
516
|
+
mm.write_manifest()
|
|
517
|
+
|
|
518
|
+
contents = read_all_bytes(mm.manifest)
|
|
519
|
+
|
|
520
|
+
# The manifest should be UTF-8 encoded
|
|
521
|
+
contents.decode('UTF-8')
|
|
522
|
+
|
|
523
|
+
# The manifest should contain the UTF-8 filename
|
|
524
|
+
assert posix(filename) in contents
|
|
525
|
+
|
|
526
|
+
# The filelist should have been updated as well
|
|
527
|
+
assert u_filename in mm.filelist.files
|
|
528
|
+
|
|
529
|
+
@skip_under_xdist
|
|
530
|
+
def test_write_manifest_skips_non_utf8_filenames(self):
|
|
531
|
+
"""
|
|
532
|
+
Files that cannot be encoded to UTF-8 (specifically, those that
|
|
533
|
+
weren't originally successfully decoded and have surrogate
|
|
534
|
+
escapes) should be omitted from the manifest.
|
|
535
|
+
See https://bitbucket.org/tarek/distribute/issue/303 for history.
|
|
536
|
+
"""
|
|
537
|
+
dist = Distribution(SETUP_ATTRS)
|
|
538
|
+
dist.script_name = 'setup.py'
|
|
539
|
+
mm = manifest_maker(dist)
|
|
540
|
+
mm.manifest = os.path.join('sdist_test.egg-info', 'SOURCES.txt')
|
|
541
|
+
os.mkdir('sdist_test.egg-info')
|
|
542
|
+
|
|
543
|
+
# Latin-1 filename
|
|
544
|
+
filename = os.path.join(b'sdist_test', Filenames.latin_1)
|
|
545
|
+
|
|
546
|
+
# Add filename with surrogates and write manifest
|
|
547
|
+
with quiet():
|
|
548
|
+
mm.run()
|
|
549
|
+
u_filename = filename.decode('utf-8', 'surrogateescape')
|
|
550
|
+
mm.filelist.append(u_filename)
|
|
551
|
+
# Re-write manifest
|
|
552
|
+
mm.write_manifest()
|
|
553
|
+
|
|
554
|
+
contents = read_all_bytes(mm.manifest)
|
|
555
|
+
|
|
556
|
+
# The manifest should be UTF-8 encoded
|
|
557
|
+
contents.decode('UTF-8')
|
|
558
|
+
|
|
559
|
+
# The Latin-1 filename should have been skipped
|
|
560
|
+
assert posix(filename) not in contents
|
|
561
|
+
|
|
562
|
+
# The filelist should have been updated as well
|
|
563
|
+
assert u_filename not in mm.filelist.files
|
|
564
|
+
|
|
565
|
+
@fail_on_ascii
|
|
566
|
+
def test_manifest_is_read_with_utf8_encoding(self):
|
|
567
|
+
# Test for #303.
|
|
568
|
+
dist = Distribution(SETUP_ATTRS)
|
|
569
|
+
dist.script_name = 'setup.py'
|
|
570
|
+
cmd = sdist(dist)
|
|
571
|
+
cmd.ensure_finalized()
|
|
572
|
+
|
|
573
|
+
# Create manifest
|
|
574
|
+
with quiet():
|
|
575
|
+
cmd.run()
|
|
576
|
+
|
|
577
|
+
# Add UTF-8 filename to manifest
|
|
578
|
+
filename = os.path.join(b'sdist_test', Filenames.utf_8)
|
|
579
|
+
cmd.manifest = os.path.join('sdist_test.egg-info', 'SOURCES.txt')
|
|
580
|
+
manifest = open(cmd.manifest, 'ab')
|
|
581
|
+
manifest.write(b'\n' + filename)
|
|
582
|
+
manifest.close()
|
|
583
|
+
|
|
584
|
+
# The file must exist to be included in the filelist
|
|
585
|
+
touch(filename)
|
|
586
|
+
|
|
587
|
+
# Re-read manifest
|
|
588
|
+
cmd.filelist.files = []
|
|
589
|
+
with quiet():
|
|
590
|
+
cmd.read_manifest()
|
|
591
|
+
|
|
592
|
+
# The filelist should contain the UTF-8 filename
|
|
593
|
+
filename = filename.decode('utf-8')
|
|
594
|
+
assert filename in cmd.filelist.files
|
|
595
|
+
|
|
596
|
+
@fail_on_latin1_encoded_filenames
|
|
597
|
+
def test_read_manifest_skips_non_utf8_filenames(self):
|
|
598
|
+
# Test for #303.
|
|
599
|
+
dist = Distribution(SETUP_ATTRS)
|
|
600
|
+
dist.script_name = 'setup.py'
|
|
601
|
+
cmd = sdist(dist)
|
|
602
|
+
cmd.ensure_finalized()
|
|
603
|
+
|
|
604
|
+
# Create manifest
|
|
605
|
+
with quiet():
|
|
606
|
+
cmd.run()
|
|
607
|
+
|
|
608
|
+
# Add Latin-1 filename to manifest
|
|
609
|
+
filename = os.path.join(b'sdist_test', Filenames.latin_1)
|
|
610
|
+
cmd.manifest = os.path.join('sdist_test.egg-info', 'SOURCES.txt')
|
|
611
|
+
manifest = open(cmd.manifest, 'ab')
|
|
612
|
+
manifest.write(b'\n' + filename)
|
|
613
|
+
manifest.close()
|
|
614
|
+
|
|
615
|
+
# The file must exist to be included in the filelist
|
|
616
|
+
touch(filename)
|
|
617
|
+
|
|
618
|
+
# Re-read manifest
|
|
619
|
+
cmd.filelist.files = []
|
|
620
|
+
with quiet():
|
|
621
|
+
cmd.read_manifest()
|
|
622
|
+
|
|
623
|
+
# The Latin-1 filename should have been skipped
|
|
624
|
+
filename = filename.decode('latin-1')
|
|
625
|
+
assert filename not in cmd.filelist.files
|
|
626
|
+
|
|
627
|
+
@fail_on_ascii
|
|
628
|
+
@fail_on_latin1_encoded_filenames
|
|
629
|
+
def test_sdist_with_utf8_encoded_filename(self):
|
|
630
|
+
# Test for #303.
|
|
631
|
+
dist = Distribution(self.make_strings(SETUP_ATTRS))
|
|
632
|
+
dist.script_name = 'setup.py'
|
|
633
|
+
cmd = sdist(dist)
|
|
634
|
+
cmd.ensure_finalized()
|
|
635
|
+
|
|
636
|
+
filename = os.path.join(b'sdist_test', Filenames.utf_8)
|
|
637
|
+
touch(filename)
|
|
638
|
+
|
|
639
|
+
with quiet():
|
|
640
|
+
cmd.run()
|
|
641
|
+
|
|
642
|
+
if sys.platform == 'darwin':
|
|
643
|
+
filename = decompose(filename)
|
|
644
|
+
|
|
645
|
+
fs_enc = sys.getfilesystemencoding()
|
|
646
|
+
|
|
647
|
+
if sys.platform == 'win32':
|
|
648
|
+
if fs_enc == 'cp1252':
|
|
649
|
+
# Python mangles the UTF-8 filename
|
|
650
|
+
filename = filename.decode('cp1252')
|
|
651
|
+
assert filename in cmd.filelist.files
|
|
652
|
+
else:
|
|
653
|
+
filename = filename.decode('mbcs')
|
|
654
|
+
assert filename in cmd.filelist.files
|
|
655
|
+
else:
|
|
656
|
+
filename = filename.decode('utf-8')
|
|
657
|
+
assert filename in cmd.filelist.files
|
|
658
|
+
|
|
659
|
+
@classmethod
|
|
660
|
+
def make_strings(cls, item):
|
|
661
|
+
if isinstance(item, dict):
|
|
662
|
+
return {key: cls.make_strings(value) for key, value in item.items()}
|
|
663
|
+
if isinstance(item, list):
|
|
664
|
+
return list(map(cls.make_strings, item))
|
|
665
|
+
return str(item)
|
|
666
|
+
|
|
667
|
+
@fail_on_latin1_encoded_filenames
|
|
668
|
+
@skip_under_xdist
|
|
669
|
+
def test_sdist_with_latin1_encoded_filename(self):
|
|
670
|
+
# Test for #303.
|
|
671
|
+
dist = Distribution(self.make_strings(SETUP_ATTRS))
|
|
672
|
+
dist.script_name = 'setup.py'
|
|
673
|
+
cmd = sdist(dist)
|
|
674
|
+
cmd.ensure_finalized()
|
|
675
|
+
|
|
676
|
+
# Latin-1 filename
|
|
677
|
+
filename = os.path.join(b'sdist_test', Filenames.latin_1)
|
|
678
|
+
touch(filename)
|
|
679
|
+
assert os.path.isfile(filename)
|
|
680
|
+
|
|
681
|
+
with quiet():
|
|
682
|
+
cmd.run()
|
|
683
|
+
|
|
684
|
+
# not all windows systems have a default FS encoding of cp1252
|
|
685
|
+
if sys.platform == 'win32':
|
|
686
|
+
# Latin-1 is similar to Windows-1252 however
|
|
687
|
+
# on mbcs filesys it is not in latin-1 encoding
|
|
688
|
+
fs_enc = sys.getfilesystemencoding()
|
|
689
|
+
if fs_enc != 'mbcs':
|
|
690
|
+
fs_enc = 'latin-1'
|
|
691
|
+
filename = filename.decode(fs_enc)
|
|
692
|
+
|
|
693
|
+
assert filename in cmd.filelist.files
|
|
694
|
+
else:
|
|
695
|
+
# The Latin-1 filename should have been skipped
|
|
696
|
+
filename = filename.decode('latin-1')
|
|
697
|
+
assert filename not in cmd.filelist.files
|
|
698
|
+
|
|
699
|
+
_EXAMPLE_DIRECTIVES = {
|
|
700
|
+
"setup.cfg - long_description and version": """
|
|
701
|
+
[metadata]
|
|
702
|
+
name = testing
|
|
703
|
+
version = file: src/VERSION.txt
|
|
704
|
+
license_files = DOWHATYOUWANT
|
|
705
|
+
long_description = file: README.rst, USAGE.rst
|
|
706
|
+
""",
|
|
707
|
+
"pyproject.toml - static readme/license files and dynamic version": """
|
|
708
|
+
[project]
|
|
709
|
+
name = "testing"
|
|
710
|
+
readme = "USAGE.rst"
|
|
711
|
+
license-files = ["DOWHATYOUWANT"]
|
|
712
|
+
dynamic = ["version"]
|
|
713
|
+
[tool.setuptools.dynamic]
|
|
714
|
+
version = {file = ["src/VERSION.txt"]}
|
|
715
|
+
""",
|
|
716
|
+
"pyproject.toml - directive with str instead of list": """
|
|
717
|
+
[project]
|
|
718
|
+
name = "testing"
|
|
719
|
+
readme = "USAGE.rst"
|
|
720
|
+
license-files = ["DOWHATYOUWANT"]
|
|
721
|
+
dynamic = ["version"]
|
|
722
|
+
[tool.setuptools.dynamic]
|
|
723
|
+
version = {file = "src/VERSION.txt"}
|
|
724
|
+
""",
|
|
725
|
+
"pyproject.toml - deprecated license table with file entry": """
|
|
726
|
+
[project]
|
|
727
|
+
name = "testing"
|
|
728
|
+
readme = "USAGE.rst"
|
|
729
|
+
license = {file = "DOWHATYOUWANT"}
|
|
730
|
+
dynamic = ["version"]
|
|
731
|
+
[tool.setuptools.dynamic]
|
|
732
|
+
version = {file = "src/VERSION.txt"}
|
|
733
|
+
""",
|
|
734
|
+
}
|
|
735
|
+
|
|
736
|
+
@pytest.mark.parametrize("config", _EXAMPLE_DIRECTIVES.keys())
|
|
737
|
+
@pytest.mark.filterwarnings(
|
|
738
|
+
"ignore:.project.license. as a TOML table is deprecated"
|
|
739
|
+
)
|
|
740
|
+
def test_add_files_referenced_by_config_directives(self, source_dir, config):
|
|
741
|
+
config_file, _, _ = config.partition(" - ")
|
|
742
|
+
config_text = self._EXAMPLE_DIRECTIVES[config]
|
|
743
|
+
(source_dir / 'src').mkdir()
|
|
744
|
+
(source_dir / 'src/VERSION.txt').write_text("0.42", encoding="utf-8")
|
|
745
|
+
(source_dir / 'README.rst').write_text("hello world!", encoding="utf-8")
|
|
746
|
+
(source_dir / 'USAGE.rst').write_text("hello world!", encoding="utf-8")
|
|
747
|
+
(source_dir / 'DOWHATYOUWANT').write_text("hello world!", encoding="utf-8")
|
|
748
|
+
(source_dir / config_file).write_text(config_text, encoding="utf-8")
|
|
749
|
+
|
|
750
|
+
dist = Distribution({"packages": []})
|
|
751
|
+
dist.script_name = 'setup.py'
|
|
752
|
+
dist.parse_config_files()
|
|
753
|
+
|
|
754
|
+
cmd = sdist(dist)
|
|
755
|
+
cmd.ensure_finalized()
|
|
756
|
+
with quiet():
|
|
757
|
+
cmd.run()
|
|
758
|
+
|
|
759
|
+
assert (
|
|
760
|
+
'src/VERSION.txt' in cmd.filelist.files
|
|
761
|
+
or 'src\\VERSION.txt' in cmd.filelist.files
|
|
762
|
+
)
|
|
763
|
+
assert 'USAGE.rst' in cmd.filelist.files
|
|
764
|
+
assert 'DOWHATYOUWANT' in cmd.filelist.files
|
|
765
|
+
assert '/' not in cmd.filelist.files
|
|
766
|
+
assert '\\' not in cmd.filelist.files
|
|
767
|
+
|
|
768
|
+
def test_pyproject_toml_in_sdist(self, source_dir):
|
|
769
|
+
"""
|
|
770
|
+
Check if pyproject.toml is included in source distribution if present
|
|
771
|
+
"""
|
|
772
|
+
touch(source_dir / 'pyproject.toml')
|
|
773
|
+
dist = Distribution(SETUP_ATTRS)
|
|
774
|
+
dist.script_name = 'setup.py'
|
|
775
|
+
cmd = sdist(dist)
|
|
776
|
+
cmd.ensure_finalized()
|
|
777
|
+
with quiet():
|
|
778
|
+
cmd.run()
|
|
779
|
+
manifest = cmd.filelist.files
|
|
780
|
+
assert 'pyproject.toml' in manifest
|
|
781
|
+
|
|
782
|
+
def test_pyproject_toml_excluded(self, source_dir):
|
|
783
|
+
"""
|
|
784
|
+
Check that pyproject.toml can excluded even if present
|
|
785
|
+
"""
|
|
786
|
+
touch(source_dir / 'pyproject.toml')
|
|
787
|
+
with open('MANIFEST.in', 'w', encoding="utf-8") as mts:
|
|
788
|
+
print('exclude pyproject.toml', file=mts)
|
|
789
|
+
dist = Distribution(SETUP_ATTRS)
|
|
790
|
+
dist.script_name = 'setup.py'
|
|
791
|
+
cmd = sdist(dist)
|
|
792
|
+
cmd.ensure_finalized()
|
|
793
|
+
with quiet():
|
|
794
|
+
cmd.run()
|
|
795
|
+
manifest = cmd.filelist.files
|
|
796
|
+
assert 'pyproject.toml' not in manifest
|
|
797
|
+
|
|
798
|
+
def test_build_subcommand_source_files(self, source_dir):
|
|
799
|
+
touch(source_dir / '.myfile~')
|
|
800
|
+
|
|
801
|
+
# Sanity check: without custom commands file list should not be affected
|
|
802
|
+
dist = Distribution({**SETUP_ATTRS, "script_name": "setup.py"})
|
|
803
|
+
cmd = sdist(dist)
|
|
804
|
+
cmd.ensure_finalized()
|
|
805
|
+
with quiet():
|
|
806
|
+
cmd.run()
|
|
807
|
+
manifest = cmd.filelist.files
|
|
808
|
+
assert '.myfile~' not in manifest
|
|
809
|
+
|
|
810
|
+
# Test: custom command should be able to augment file list
|
|
811
|
+
dist = Distribution({**SETUP_ATTRS, "script_name": "setup.py"})
|
|
812
|
+
build = dist.get_command_obj("build")
|
|
813
|
+
build.sub_commands = [*build.sub_commands, ("build_custom", None)]
|
|
814
|
+
|
|
815
|
+
class build_custom(Command):
|
|
816
|
+
def initialize_options(self): ...
|
|
817
|
+
|
|
818
|
+
def finalize_options(self): ...
|
|
819
|
+
|
|
820
|
+
def run(self): ...
|
|
821
|
+
|
|
822
|
+
def get_source_files(self):
|
|
823
|
+
return ['.myfile~']
|
|
824
|
+
|
|
825
|
+
dist.cmdclass.update(build_custom=build_custom)
|
|
826
|
+
|
|
827
|
+
cmd = sdist(dist)
|
|
828
|
+
cmd.use_defaults = True
|
|
829
|
+
cmd.ensure_finalized()
|
|
830
|
+
with quiet():
|
|
831
|
+
cmd.run()
|
|
832
|
+
manifest = cmd.filelist.files
|
|
833
|
+
assert '.myfile~' in manifest
|
|
834
|
+
|
|
835
|
+
@pytest.mark.skipif("os.environ.get('SETUPTOOLS_USE_DISTUTILS') == 'stdlib'")
|
|
836
|
+
def test_build_base_pathlib(self, source_dir):
|
|
837
|
+
"""
|
|
838
|
+
Ensure if build_base is a pathlib.Path, the build still succeeds.
|
|
839
|
+
"""
|
|
840
|
+
dist = Distribution({
|
|
841
|
+
**SETUP_ATTRS,
|
|
842
|
+
"script_name": "setup.py",
|
|
843
|
+
"options": {"build": {"build_base": pathlib.Path('build')}},
|
|
844
|
+
})
|
|
845
|
+
cmd = sdist(dist)
|
|
846
|
+
cmd.ensure_finalized()
|
|
847
|
+
with quiet():
|
|
848
|
+
cmd.run()
|
|
849
|
+
|
|
850
|
+
|
|
851
|
+
def test_default_revctrl():
|
|
852
|
+
"""
|
|
853
|
+
When _default_revctrl was removed from the `setuptools.command.sdist`
|
|
854
|
+
module in 10.0, it broke some systems which keep an old install of
|
|
855
|
+
setuptools (Distribute) around. Those old versions require that the
|
|
856
|
+
setuptools package continue to implement that interface, so this
|
|
857
|
+
function provides that interface, stubbed. See #320 for details.
|
|
858
|
+
|
|
859
|
+
This interface must be maintained until Ubuntu 12.04 is no longer
|
|
860
|
+
supported (by Setuptools).
|
|
861
|
+
"""
|
|
862
|
+
(ep,) = metadata.EntryPoints._from_text(
|
|
863
|
+
"""
|
|
864
|
+
[setuptools.file_finders]
|
|
865
|
+
svn_cvs = setuptools.command.sdist:_default_revctrl
|
|
866
|
+
"""
|
|
867
|
+
)
|
|
868
|
+
res = ep.load()
|
|
869
|
+
assert hasattr(res, '__iter__')
|
|
870
|
+
|
|
871
|
+
|
|
872
|
+
class TestRegressions:
|
|
873
|
+
"""
|
|
874
|
+
Can be removed/changed if the project decides to change how it handles symlinks
|
|
875
|
+
or external files.
|
|
876
|
+
"""
|
|
877
|
+
|
|
878
|
+
@staticmethod
|
|
879
|
+
def files_for_symlink_in_extension_depends(tmp_path, dep_path):
|
|
880
|
+
return {
|
|
881
|
+
"external": {
|
|
882
|
+
"dir": {"file.h": ""},
|
|
883
|
+
},
|
|
884
|
+
"project": {
|
|
885
|
+
"setup.py": cleandoc(
|
|
886
|
+
f"""
|
|
887
|
+
from setuptools import Extension, setup
|
|
888
|
+
setup(
|
|
889
|
+
name="myproj",
|
|
890
|
+
version="42",
|
|
891
|
+
ext_modules=[
|
|
892
|
+
Extension(
|
|
893
|
+
"hello", sources=["hello.pyx"],
|
|
894
|
+
depends=[{dep_path!r}]
|
|
895
|
+
)
|
|
896
|
+
],
|
|
897
|
+
)
|
|
898
|
+
"""
|
|
899
|
+
),
|
|
900
|
+
"hello.pyx": "",
|
|
901
|
+
"MANIFEST.in": "global-include *.h",
|
|
902
|
+
},
|
|
903
|
+
}
|
|
904
|
+
|
|
905
|
+
@pytest.mark.parametrize(
|
|
906
|
+
"dep_path", ("myheaders/dir/file.h", "myheaders/dir/../dir/file.h")
|
|
907
|
+
)
|
|
908
|
+
def test_symlink_in_extension_depends(self, monkeypatch, tmp_path, dep_path):
|
|
909
|
+
# Given a project with a symlinked dir and a "depends" targeting that dir
|
|
910
|
+
files = self.files_for_symlink_in_extension_depends(tmp_path, dep_path)
|
|
911
|
+
jaraco.path.build(files, prefix=str(tmp_path))
|
|
912
|
+
symlink_or_skip_test(tmp_path / "external", tmp_path / "project/myheaders")
|
|
913
|
+
|
|
914
|
+
# When `sdist` runs, there should be no error
|
|
915
|
+
members = run_sdist(monkeypatch, tmp_path / "project")
|
|
916
|
+
# and the sdist should contain the symlinked files
|
|
917
|
+
for expected in (
|
|
918
|
+
"myproj-42/hello.pyx",
|
|
919
|
+
"myproj-42/myheaders/dir/file.h",
|
|
920
|
+
):
|
|
921
|
+
assert expected in members
|
|
922
|
+
|
|
923
|
+
@staticmethod
|
|
924
|
+
def files_for_external_path_in_extension_depends(tmp_path, dep_path):
|
|
925
|
+
head, _, tail = dep_path.partition("$tmp_path$/")
|
|
926
|
+
dep_path = tmp_path / tail if tail else head
|
|
927
|
+
|
|
928
|
+
return {
|
|
929
|
+
"external": {
|
|
930
|
+
"dir": {"file.h": ""},
|
|
931
|
+
},
|
|
932
|
+
"project": {
|
|
933
|
+
"setup.py": cleandoc(
|
|
934
|
+
f"""
|
|
935
|
+
from setuptools import Extension, setup
|
|
936
|
+
setup(
|
|
937
|
+
name="myproj",
|
|
938
|
+
version="42",
|
|
939
|
+
ext_modules=[
|
|
940
|
+
Extension(
|
|
941
|
+
"hello", sources=["hello.pyx"],
|
|
942
|
+
depends=[{str(dep_path)!r}]
|
|
943
|
+
)
|
|
944
|
+
],
|
|
945
|
+
)
|
|
946
|
+
"""
|
|
947
|
+
),
|
|
948
|
+
"hello.pyx": "",
|
|
949
|
+
"MANIFEST.in": "global-include *.h",
|
|
950
|
+
},
|
|
951
|
+
}
|
|
952
|
+
|
|
953
|
+
@pytest.mark.parametrize(
|
|
954
|
+
"dep_path", ("$tmp_path$/external/dir/file.h", "../external/dir/file.h")
|
|
955
|
+
)
|
|
956
|
+
def test_external_path_in_extension_depends(self, monkeypatch, tmp_path, dep_path):
|
|
957
|
+
# Given a project with a "depends" targeting an external dir
|
|
958
|
+
files = self.files_for_external_path_in_extension_depends(tmp_path, dep_path)
|
|
959
|
+
jaraco.path.build(files, prefix=str(tmp_path))
|
|
960
|
+
# When `sdist` runs, there should be no error
|
|
961
|
+
members = run_sdist(monkeypatch, tmp_path / "project")
|
|
962
|
+
# and the sdist should not contain the external file
|
|
963
|
+
for name in members:
|
|
964
|
+
assert "file.h" not in name
|
|
965
|
+
|
|
966
|
+
|
|
967
|
+
def run_sdist(monkeypatch, project):
|
|
968
|
+
"""Given a project directory, run the sdist and return its contents"""
|
|
969
|
+
monkeypatch.chdir(project)
|
|
970
|
+
with quiet():
|
|
971
|
+
run_setup("setup.py", ["sdist"])
|
|
972
|
+
|
|
973
|
+
archive = next((project / "dist").glob("*.tar.gz"))
|
|
974
|
+
with tarfile.open(str(archive)) as tar:
|
|
975
|
+
return set(tar.getnames())
|
|
976
|
+
|
|
977
|
+
|
|
978
|
+
def test_sanity_check_setuptools_own_sdist(setuptools_sdist):
|
|
979
|
+
with tarfile.open(setuptools_sdist) as tar:
|
|
980
|
+
files = tar.getnames()
|
|
981
|
+
|
|
982
|
+
# setuptools sdist should not include the .tox folder
|
|
983
|
+
tox_files = [name for name in files if ".tox" in name]
|
|
984
|
+
assert len(tox_files) == 0, f"not empty {tox_files}"
|