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,95 @@
|
|
|
1
|
+
"""Tests for distutils.file_util."""
|
|
2
|
+
|
|
3
|
+
import errno
|
|
4
|
+
import os
|
|
5
|
+
import unittest.mock as mock
|
|
6
|
+
from distutils.errors import DistutilsFileError
|
|
7
|
+
from distutils.file_util import copy_file, move_file
|
|
8
|
+
|
|
9
|
+
import jaraco.path
|
|
10
|
+
import pytest
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@pytest.fixture(autouse=True)
|
|
14
|
+
def stuff(request, tmp_path):
|
|
15
|
+
self = request.instance
|
|
16
|
+
self.source = tmp_path / 'f1'
|
|
17
|
+
self.target = tmp_path / 'f2'
|
|
18
|
+
self.target_dir = tmp_path / 'd1'
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class TestFileUtil:
|
|
22
|
+
def test_move_file_verbosity(self, caplog):
|
|
23
|
+
jaraco.path.build({self.source: 'some content'})
|
|
24
|
+
|
|
25
|
+
move_file(self.source, self.target, verbose=False)
|
|
26
|
+
assert not caplog.messages
|
|
27
|
+
|
|
28
|
+
# back to original state
|
|
29
|
+
move_file(self.target, self.source, verbose=False)
|
|
30
|
+
|
|
31
|
+
move_file(self.source, self.target, verbose=True)
|
|
32
|
+
wanted = [f'moving {self.source} -> {self.target}']
|
|
33
|
+
assert caplog.messages == wanted
|
|
34
|
+
|
|
35
|
+
# back to original state
|
|
36
|
+
move_file(self.target, self.source, verbose=False)
|
|
37
|
+
|
|
38
|
+
caplog.clear()
|
|
39
|
+
# now the target is a dir
|
|
40
|
+
os.mkdir(self.target_dir)
|
|
41
|
+
move_file(self.source, self.target_dir, verbose=True)
|
|
42
|
+
wanted = [f'moving {self.source} -> {self.target_dir}']
|
|
43
|
+
assert caplog.messages == wanted
|
|
44
|
+
|
|
45
|
+
def test_move_file_exception_unpacking_rename(self):
|
|
46
|
+
# see issue 22182
|
|
47
|
+
with (
|
|
48
|
+
mock.patch("os.rename", side_effect=OSError("wrong", 1)),
|
|
49
|
+
pytest.raises(DistutilsFileError),
|
|
50
|
+
):
|
|
51
|
+
jaraco.path.build({self.source: 'spam eggs'})
|
|
52
|
+
move_file(self.source, self.target, verbose=False)
|
|
53
|
+
|
|
54
|
+
def test_move_file_exception_unpacking_unlink(self):
|
|
55
|
+
# see issue 22182
|
|
56
|
+
with (
|
|
57
|
+
mock.patch("os.rename", side_effect=OSError(errno.EXDEV, "wrong")),
|
|
58
|
+
mock.patch("os.unlink", side_effect=OSError("wrong", 1)),
|
|
59
|
+
pytest.raises(DistutilsFileError),
|
|
60
|
+
):
|
|
61
|
+
jaraco.path.build({self.source: 'spam eggs'})
|
|
62
|
+
move_file(self.source, self.target, verbose=False)
|
|
63
|
+
|
|
64
|
+
def test_copy_file_hard_link(self):
|
|
65
|
+
jaraco.path.build({self.source: 'some content'})
|
|
66
|
+
# Check first that copy_file() will not fall back on copying the file
|
|
67
|
+
# instead of creating the hard link.
|
|
68
|
+
try:
|
|
69
|
+
os.link(self.source, self.target)
|
|
70
|
+
except OSError as e:
|
|
71
|
+
self.skipTest(f'os.link: {e}')
|
|
72
|
+
else:
|
|
73
|
+
self.target.unlink()
|
|
74
|
+
st = os.stat(self.source)
|
|
75
|
+
copy_file(self.source, self.target, link='hard')
|
|
76
|
+
st2 = os.stat(self.source)
|
|
77
|
+
st3 = os.stat(self.target)
|
|
78
|
+
assert os.path.samestat(st, st2), (st, st2)
|
|
79
|
+
assert os.path.samestat(st2, st3), (st2, st3)
|
|
80
|
+
assert self.source.read_text(encoding='utf-8') == 'some content'
|
|
81
|
+
|
|
82
|
+
def test_copy_file_hard_link_failure(self):
|
|
83
|
+
# If hard linking fails, copy_file() falls back on copying file
|
|
84
|
+
# (some special filesystems don't support hard linking even under
|
|
85
|
+
# Unix, see issue #8876).
|
|
86
|
+
jaraco.path.build({self.source: 'some content'})
|
|
87
|
+
st = os.stat(self.source)
|
|
88
|
+
with mock.patch("os.link", side_effect=OSError(0, "linking unsupported")):
|
|
89
|
+
copy_file(self.source, self.target, link='hard')
|
|
90
|
+
st2 = os.stat(self.source)
|
|
91
|
+
st3 = os.stat(self.target)
|
|
92
|
+
assert os.path.samestat(st, st2), (st, st2)
|
|
93
|
+
assert not os.path.samestat(st2, st3), (st2, st3)
|
|
94
|
+
for fn in (self.source, self.target):
|
|
95
|
+
assert fn.read_text(encoding='utf-8') == 'some content'
|
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
"""Tests for distutils.filelist."""
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
import os
|
|
5
|
+
import re
|
|
6
|
+
from distutils import debug, filelist
|
|
7
|
+
from distutils.errors import DistutilsTemplateError
|
|
8
|
+
from distutils.filelist import FileList, glob_to_re, translate_pattern
|
|
9
|
+
|
|
10
|
+
import jaraco.path
|
|
11
|
+
import pytest
|
|
12
|
+
|
|
13
|
+
from .compat import py39 as os_helper
|
|
14
|
+
|
|
15
|
+
MANIFEST_IN = """\
|
|
16
|
+
include ok
|
|
17
|
+
include xo
|
|
18
|
+
exclude xo
|
|
19
|
+
include foo.tmp
|
|
20
|
+
include buildout.cfg
|
|
21
|
+
global-include *.x
|
|
22
|
+
global-include *.txt
|
|
23
|
+
global-exclude *.tmp
|
|
24
|
+
recursive-include f *.oo
|
|
25
|
+
recursive-exclude global *.x
|
|
26
|
+
graft dir
|
|
27
|
+
prune dir3
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def make_local_path(s):
|
|
32
|
+
"""Converts '/' in a string to os.sep"""
|
|
33
|
+
return s.replace('/', os.sep)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class TestFileList:
|
|
37
|
+
def assertNoWarnings(self, caplog):
|
|
38
|
+
warnings = [rec for rec in caplog.records if rec.levelno == logging.WARNING]
|
|
39
|
+
assert not warnings
|
|
40
|
+
caplog.clear()
|
|
41
|
+
|
|
42
|
+
def assertWarnings(self, caplog):
|
|
43
|
+
warnings = [rec for rec in caplog.records if rec.levelno == logging.WARNING]
|
|
44
|
+
assert warnings
|
|
45
|
+
caplog.clear()
|
|
46
|
+
|
|
47
|
+
def test_glob_to_re(self):
|
|
48
|
+
sep = os.sep
|
|
49
|
+
if os.sep == '\\':
|
|
50
|
+
sep = re.escape(os.sep)
|
|
51
|
+
|
|
52
|
+
for glob, regex in (
|
|
53
|
+
# simple cases
|
|
54
|
+
('foo*', r'(?s:foo[^%(sep)s]*)\Z'),
|
|
55
|
+
('foo?', r'(?s:foo[^%(sep)s])\Z'),
|
|
56
|
+
('foo??', r'(?s:foo[^%(sep)s][^%(sep)s])\Z'),
|
|
57
|
+
# special cases
|
|
58
|
+
(r'foo\\*', r'(?s:foo\\\\[^%(sep)s]*)\Z'),
|
|
59
|
+
(r'foo\\\*', r'(?s:foo\\\\\\[^%(sep)s]*)\Z'),
|
|
60
|
+
('foo????', r'(?s:foo[^%(sep)s][^%(sep)s][^%(sep)s][^%(sep)s])\Z'),
|
|
61
|
+
(r'foo\\??', r'(?s:foo\\\\[^%(sep)s][^%(sep)s])\Z'),
|
|
62
|
+
):
|
|
63
|
+
regex = regex % {'sep': sep}
|
|
64
|
+
assert glob_to_re(glob) == regex
|
|
65
|
+
|
|
66
|
+
def test_process_template_line(self):
|
|
67
|
+
# testing all MANIFEST.in template patterns
|
|
68
|
+
file_list = FileList()
|
|
69
|
+
mlp = make_local_path
|
|
70
|
+
|
|
71
|
+
# simulated file list
|
|
72
|
+
file_list.allfiles = [
|
|
73
|
+
'foo.tmp',
|
|
74
|
+
'ok',
|
|
75
|
+
'xo',
|
|
76
|
+
'four.txt',
|
|
77
|
+
'buildout.cfg',
|
|
78
|
+
# filelist does not filter out VCS directories,
|
|
79
|
+
# it's sdist that does
|
|
80
|
+
mlp('.hg/last-message.txt'),
|
|
81
|
+
mlp('global/one.txt'),
|
|
82
|
+
mlp('global/two.txt'),
|
|
83
|
+
mlp('global/files.x'),
|
|
84
|
+
mlp('global/here.tmp'),
|
|
85
|
+
mlp('f/o/f.oo'),
|
|
86
|
+
mlp('dir/graft-one'),
|
|
87
|
+
mlp('dir/dir2/graft2'),
|
|
88
|
+
mlp('dir3/ok'),
|
|
89
|
+
mlp('dir3/sub/ok.txt'),
|
|
90
|
+
]
|
|
91
|
+
|
|
92
|
+
for line in MANIFEST_IN.split('\n'):
|
|
93
|
+
if line.strip() == '':
|
|
94
|
+
continue
|
|
95
|
+
file_list.process_template_line(line)
|
|
96
|
+
|
|
97
|
+
wanted = [
|
|
98
|
+
'ok',
|
|
99
|
+
'buildout.cfg',
|
|
100
|
+
'four.txt',
|
|
101
|
+
mlp('.hg/last-message.txt'),
|
|
102
|
+
mlp('global/one.txt'),
|
|
103
|
+
mlp('global/two.txt'),
|
|
104
|
+
mlp('f/o/f.oo'),
|
|
105
|
+
mlp('dir/graft-one'),
|
|
106
|
+
mlp('dir/dir2/graft2'),
|
|
107
|
+
]
|
|
108
|
+
|
|
109
|
+
assert file_list.files == wanted
|
|
110
|
+
|
|
111
|
+
def test_debug_print(self, capsys, monkeypatch):
|
|
112
|
+
file_list = FileList()
|
|
113
|
+
file_list.debug_print('xxx')
|
|
114
|
+
assert capsys.readouterr().out == ''
|
|
115
|
+
|
|
116
|
+
monkeypatch.setattr(debug, 'DEBUG', True)
|
|
117
|
+
file_list.debug_print('xxx')
|
|
118
|
+
assert capsys.readouterr().out == 'xxx\n'
|
|
119
|
+
|
|
120
|
+
def test_set_allfiles(self):
|
|
121
|
+
file_list = FileList()
|
|
122
|
+
files = ['a', 'b', 'c']
|
|
123
|
+
file_list.set_allfiles(files)
|
|
124
|
+
assert file_list.allfiles == files
|
|
125
|
+
|
|
126
|
+
def test_remove_duplicates(self):
|
|
127
|
+
file_list = FileList()
|
|
128
|
+
file_list.files = ['a', 'b', 'a', 'g', 'c', 'g']
|
|
129
|
+
# files must be sorted beforehand (sdist does it)
|
|
130
|
+
file_list.sort()
|
|
131
|
+
file_list.remove_duplicates()
|
|
132
|
+
assert file_list.files == ['a', 'b', 'c', 'g']
|
|
133
|
+
|
|
134
|
+
def test_translate_pattern(self):
|
|
135
|
+
# not regex
|
|
136
|
+
assert hasattr(translate_pattern('a', anchor=True, is_regex=False), 'search')
|
|
137
|
+
|
|
138
|
+
# is a regex
|
|
139
|
+
regex = re.compile('a')
|
|
140
|
+
assert translate_pattern(regex, anchor=True, is_regex=True) == regex
|
|
141
|
+
|
|
142
|
+
# plain string flagged as regex
|
|
143
|
+
assert hasattr(translate_pattern('a', anchor=True, is_regex=True), 'search')
|
|
144
|
+
|
|
145
|
+
# glob support
|
|
146
|
+
assert translate_pattern('*.py', anchor=True, is_regex=False).search(
|
|
147
|
+
'filelist.py'
|
|
148
|
+
)
|
|
149
|
+
|
|
150
|
+
def test_exclude_pattern(self):
|
|
151
|
+
# return False if no match
|
|
152
|
+
file_list = FileList()
|
|
153
|
+
assert not file_list.exclude_pattern('*.py')
|
|
154
|
+
|
|
155
|
+
# return True if files match
|
|
156
|
+
file_list = FileList()
|
|
157
|
+
file_list.files = ['a.py', 'b.py']
|
|
158
|
+
assert file_list.exclude_pattern('*.py')
|
|
159
|
+
|
|
160
|
+
# test excludes
|
|
161
|
+
file_list = FileList()
|
|
162
|
+
file_list.files = ['a.py', 'a.txt']
|
|
163
|
+
file_list.exclude_pattern('*.py')
|
|
164
|
+
assert file_list.files == ['a.txt']
|
|
165
|
+
|
|
166
|
+
def test_include_pattern(self):
|
|
167
|
+
# return False if no match
|
|
168
|
+
file_list = FileList()
|
|
169
|
+
file_list.set_allfiles([])
|
|
170
|
+
assert not file_list.include_pattern('*.py')
|
|
171
|
+
|
|
172
|
+
# return True if files match
|
|
173
|
+
file_list = FileList()
|
|
174
|
+
file_list.set_allfiles(['a.py', 'b.txt'])
|
|
175
|
+
assert file_list.include_pattern('*.py')
|
|
176
|
+
|
|
177
|
+
# test * matches all files
|
|
178
|
+
file_list = FileList()
|
|
179
|
+
assert file_list.allfiles is None
|
|
180
|
+
file_list.set_allfiles(['a.py', 'b.txt'])
|
|
181
|
+
file_list.include_pattern('*')
|
|
182
|
+
assert file_list.allfiles == ['a.py', 'b.txt']
|
|
183
|
+
|
|
184
|
+
def test_process_template(self, caplog):
|
|
185
|
+
mlp = make_local_path
|
|
186
|
+
# invalid lines
|
|
187
|
+
file_list = FileList()
|
|
188
|
+
for action in (
|
|
189
|
+
'include',
|
|
190
|
+
'exclude',
|
|
191
|
+
'global-include',
|
|
192
|
+
'global-exclude',
|
|
193
|
+
'recursive-include',
|
|
194
|
+
'recursive-exclude',
|
|
195
|
+
'graft',
|
|
196
|
+
'prune',
|
|
197
|
+
'blarg',
|
|
198
|
+
):
|
|
199
|
+
with pytest.raises(DistutilsTemplateError):
|
|
200
|
+
file_list.process_template_line(action)
|
|
201
|
+
|
|
202
|
+
# include
|
|
203
|
+
file_list = FileList()
|
|
204
|
+
file_list.set_allfiles(['a.py', 'b.txt', mlp('d/c.py')])
|
|
205
|
+
|
|
206
|
+
file_list.process_template_line('include *.py')
|
|
207
|
+
assert file_list.files == ['a.py']
|
|
208
|
+
self.assertNoWarnings(caplog)
|
|
209
|
+
|
|
210
|
+
file_list.process_template_line('include *.rb')
|
|
211
|
+
assert file_list.files == ['a.py']
|
|
212
|
+
self.assertWarnings(caplog)
|
|
213
|
+
|
|
214
|
+
# exclude
|
|
215
|
+
file_list = FileList()
|
|
216
|
+
file_list.files = ['a.py', 'b.txt', mlp('d/c.py')]
|
|
217
|
+
|
|
218
|
+
file_list.process_template_line('exclude *.py')
|
|
219
|
+
assert file_list.files == ['b.txt', mlp('d/c.py')]
|
|
220
|
+
self.assertNoWarnings(caplog)
|
|
221
|
+
|
|
222
|
+
file_list.process_template_line('exclude *.rb')
|
|
223
|
+
assert file_list.files == ['b.txt', mlp('d/c.py')]
|
|
224
|
+
self.assertWarnings(caplog)
|
|
225
|
+
|
|
226
|
+
# global-include
|
|
227
|
+
file_list = FileList()
|
|
228
|
+
file_list.set_allfiles(['a.py', 'b.txt', mlp('d/c.py')])
|
|
229
|
+
|
|
230
|
+
file_list.process_template_line('global-include *.py')
|
|
231
|
+
assert file_list.files == ['a.py', mlp('d/c.py')]
|
|
232
|
+
self.assertNoWarnings(caplog)
|
|
233
|
+
|
|
234
|
+
file_list.process_template_line('global-include *.rb')
|
|
235
|
+
assert file_list.files == ['a.py', mlp('d/c.py')]
|
|
236
|
+
self.assertWarnings(caplog)
|
|
237
|
+
|
|
238
|
+
# global-exclude
|
|
239
|
+
file_list = FileList()
|
|
240
|
+
file_list.files = ['a.py', 'b.txt', mlp('d/c.py')]
|
|
241
|
+
|
|
242
|
+
file_list.process_template_line('global-exclude *.py')
|
|
243
|
+
assert file_list.files == ['b.txt']
|
|
244
|
+
self.assertNoWarnings(caplog)
|
|
245
|
+
|
|
246
|
+
file_list.process_template_line('global-exclude *.rb')
|
|
247
|
+
assert file_list.files == ['b.txt']
|
|
248
|
+
self.assertWarnings(caplog)
|
|
249
|
+
|
|
250
|
+
# recursive-include
|
|
251
|
+
file_list = FileList()
|
|
252
|
+
file_list.set_allfiles(['a.py', mlp('d/b.py'), mlp('d/c.txt'), mlp('d/d/e.py')])
|
|
253
|
+
|
|
254
|
+
file_list.process_template_line('recursive-include d *.py')
|
|
255
|
+
assert file_list.files == [mlp('d/b.py'), mlp('d/d/e.py')]
|
|
256
|
+
self.assertNoWarnings(caplog)
|
|
257
|
+
|
|
258
|
+
file_list.process_template_line('recursive-include e *.py')
|
|
259
|
+
assert file_list.files == [mlp('d/b.py'), mlp('d/d/e.py')]
|
|
260
|
+
self.assertWarnings(caplog)
|
|
261
|
+
|
|
262
|
+
# recursive-exclude
|
|
263
|
+
file_list = FileList()
|
|
264
|
+
file_list.files = ['a.py', mlp('d/b.py'), mlp('d/c.txt'), mlp('d/d/e.py')]
|
|
265
|
+
|
|
266
|
+
file_list.process_template_line('recursive-exclude d *.py')
|
|
267
|
+
assert file_list.files == ['a.py', mlp('d/c.txt')]
|
|
268
|
+
self.assertNoWarnings(caplog)
|
|
269
|
+
|
|
270
|
+
file_list.process_template_line('recursive-exclude e *.py')
|
|
271
|
+
assert file_list.files == ['a.py', mlp('d/c.txt')]
|
|
272
|
+
self.assertWarnings(caplog)
|
|
273
|
+
|
|
274
|
+
# graft
|
|
275
|
+
file_list = FileList()
|
|
276
|
+
file_list.set_allfiles(['a.py', mlp('d/b.py'), mlp('d/d/e.py'), mlp('f/f.py')])
|
|
277
|
+
|
|
278
|
+
file_list.process_template_line('graft d')
|
|
279
|
+
assert file_list.files == [mlp('d/b.py'), mlp('d/d/e.py')]
|
|
280
|
+
self.assertNoWarnings(caplog)
|
|
281
|
+
|
|
282
|
+
file_list.process_template_line('graft e')
|
|
283
|
+
assert file_list.files == [mlp('d/b.py'), mlp('d/d/e.py')]
|
|
284
|
+
self.assertWarnings(caplog)
|
|
285
|
+
|
|
286
|
+
# prune
|
|
287
|
+
file_list = FileList()
|
|
288
|
+
file_list.files = ['a.py', mlp('d/b.py'), mlp('d/d/e.py'), mlp('f/f.py')]
|
|
289
|
+
|
|
290
|
+
file_list.process_template_line('prune d')
|
|
291
|
+
assert file_list.files == ['a.py', mlp('f/f.py')]
|
|
292
|
+
self.assertNoWarnings(caplog)
|
|
293
|
+
|
|
294
|
+
file_list.process_template_line('prune e')
|
|
295
|
+
assert file_list.files == ['a.py', mlp('f/f.py')]
|
|
296
|
+
self.assertWarnings(caplog)
|
|
297
|
+
|
|
298
|
+
|
|
299
|
+
class TestFindAll:
|
|
300
|
+
@os_helper.skip_unless_symlink
|
|
301
|
+
def test_missing_symlink(self, temp_cwd):
|
|
302
|
+
os.symlink('foo', 'bar')
|
|
303
|
+
assert filelist.findall() == []
|
|
304
|
+
|
|
305
|
+
def test_basic_discovery(self, temp_cwd):
|
|
306
|
+
"""
|
|
307
|
+
When findall is called with no parameters or with
|
|
308
|
+
'.' as the parameter, the dot should be omitted from
|
|
309
|
+
the results.
|
|
310
|
+
"""
|
|
311
|
+
jaraco.path.build({'foo': {'file1.txt': ''}, 'bar': {'file2.txt': ''}})
|
|
312
|
+
file1 = os.path.join('foo', 'file1.txt')
|
|
313
|
+
file2 = os.path.join('bar', 'file2.txt')
|
|
314
|
+
expected = [file2, file1]
|
|
315
|
+
assert sorted(filelist.findall()) == expected
|
|
316
|
+
|
|
317
|
+
def test_non_local_discovery(self, tmp_path):
|
|
318
|
+
"""
|
|
319
|
+
When findall is called with another path, the full
|
|
320
|
+
path name should be returned.
|
|
321
|
+
"""
|
|
322
|
+
jaraco.path.build({'file1.txt': ''}, tmp_path)
|
|
323
|
+
expected = [str(tmp_path / 'file1.txt')]
|
|
324
|
+
assert filelist.findall(tmp_path) == expected
|
|
325
|
+
|
|
326
|
+
@os_helper.skip_unless_symlink
|
|
327
|
+
def test_symlink_loop(self, tmp_path):
|
|
328
|
+
jaraco.path.build(
|
|
329
|
+
{
|
|
330
|
+
'link-to-parent': jaraco.path.Symlink('.'),
|
|
331
|
+
'somefile': '',
|
|
332
|
+
},
|
|
333
|
+
tmp_path,
|
|
334
|
+
)
|
|
335
|
+
files = filelist.findall(tmp_path)
|
|
336
|
+
assert len(files) == 1
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
"""Tests for distutils.command.install."""
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
import os
|
|
5
|
+
import pathlib
|
|
6
|
+
import site
|
|
7
|
+
import sys
|
|
8
|
+
from distutils import sysconfig
|
|
9
|
+
from distutils.command import install as install_module
|
|
10
|
+
from distutils.command.build_ext import build_ext
|
|
11
|
+
from distutils.command.install import INSTALL_SCHEMES, install
|
|
12
|
+
from distutils.core import Distribution
|
|
13
|
+
from distutils.errors import DistutilsOptionError
|
|
14
|
+
from distutils.extension import Extension
|
|
15
|
+
from distutils.tests import missing_compiler_executable, support
|
|
16
|
+
from distutils.util import is_mingw
|
|
17
|
+
|
|
18
|
+
import pytest
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def _make_ext_name(modname):
|
|
22
|
+
return modname + sysconfig.get_config_var('EXT_SUFFIX')
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@support.combine_markers
|
|
26
|
+
@pytest.mark.usefixtures('save_env')
|
|
27
|
+
class TestInstall(
|
|
28
|
+
support.TempdirManager,
|
|
29
|
+
):
|
|
30
|
+
@pytest.mark.xfail(
|
|
31
|
+
'platform.system() == "Windows" and sys.version_info > (3, 11)',
|
|
32
|
+
reason="pypa/distutils#148",
|
|
33
|
+
)
|
|
34
|
+
def test_home_installation_scheme(self):
|
|
35
|
+
# This ensure two things:
|
|
36
|
+
# - that --home generates the desired set of directory names
|
|
37
|
+
# - test --home is supported on all platforms
|
|
38
|
+
builddir = self.mkdtemp()
|
|
39
|
+
destination = os.path.join(builddir, "installation")
|
|
40
|
+
|
|
41
|
+
dist = Distribution({"name": "foopkg"})
|
|
42
|
+
# script_name need not exist, it just need to be initialized
|
|
43
|
+
dist.script_name = os.path.join(builddir, "setup.py")
|
|
44
|
+
dist.command_obj["build"] = support.DummyCommand(
|
|
45
|
+
build_base=builddir,
|
|
46
|
+
build_lib=os.path.join(builddir, "lib"),
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
cmd = install(dist)
|
|
50
|
+
cmd.home = destination
|
|
51
|
+
cmd.ensure_finalized()
|
|
52
|
+
|
|
53
|
+
assert cmd.install_base == destination
|
|
54
|
+
assert cmd.install_platbase == destination
|
|
55
|
+
|
|
56
|
+
def check_path(got, expected):
|
|
57
|
+
got = os.path.normpath(got)
|
|
58
|
+
expected = os.path.normpath(expected)
|
|
59
|
+
assert got == expected
|
|
60
|
+
|
|
61
|
+
impl_name = sys.implementation.name.replace("cpython", "python")
|
|
62
|
+
libdir = os.path.join(destination, "lib", impl_name)
|
|
63
|
+
check_path(cmd.install_lib, libdir)
|
|
64
|
+
_platlibdir = getattr(sys, "platlibdir", "lib")
|
|
65
|
+
platlibdir = os.path.join(destination, _platlibdir, impl_name)
|
|
66
|
+
check_path(cmd.install_platlib, platlibdir)
|
|
67
|
+
check_path(cmd.install_purelib, libdir)
|
|
68
|
+
check_path(
|
|
69
|
+
cmd.install_headers,
|
|
70
|
+
os.path.join(destination, "include", impl_name, "foopkg"),
|
|
71
|
+
)
|
|
72
|
+
check_path(cmd.install_scripts, os.path.join(destination, "bin"))
|
|
73
|
+
check_path(cmd.install_data, destination)
|
|
74
|
+
|
|
75
|
+
def test_user_site(self, monkeypatch):
|
|
76
|
+
# test install with --user
|
|
77
|
+
# preparing the environment for the test
|
|
78
|
+
self.tmpdir = self.mkdtemp()
|
|
79
|
+
orig_site = site.USER_SITE
|
|
80
|
+
orig_base = site.USER_BASE
|
|
81
|
+
monkeypatch.setattr(site, 'USER_BASE', os.path.join(self.tmpdir, 'B'))
|
|
82
|
+
monkeypatch.setattr(site, 'USER_SITE', os.path.join(self.tmpdir, 'S'))
|
|
83
|
+
monkeypatch.setattr(install_module, 'USER_BASE', site.USER_BASE)
|
|
84
|
+
monkeypatch.setattr(install_module, 'USER_SITE', site.USER_SITE)
|
|
85
|
+
|
|
86
|
+
def _expanduser(path):
|
|
87
|
+
if path.startswith('~'):
|
|
88
|
+
return os.path.normpath(self.tmpdir + path[1:])
|
|
89
|
+
return path
|
|
90
|
+
|
|
91
|
+
monkeypatch.setattr(os.path, 'expanduser', _expanduser)
|
|
92
|
+
|
|
93
|
+
for key in ('nt_user', 'posix_user'):
|
|
94
|
+
assert key in INSTALL_SCHEMES
|
|
95
|
+
|
|
96
|
+
dist = Distribution({'name': 'xx'})
|
|
97
|
+
cmd = install(dist)
|
|
98
|
+
|
|
99
|
+
# making sure the user option is there
|
|
100
|
+
options = [name for name, short, label in cmd.user_options]
|
|
101
|
+
assert 'user' in options
|
|
102
|
+
|
|
103
|
+
# setting a value
|
|
104
|
+
cmd.user = True
|
|
105
|
+
|
|
106
|
+
# user base and site shouldn't be created yet
|
|
107
|
+
assert not os.path.exists(site.USER_BASE)
|
|
108
|
+
assert not os.path.exists(site.USER_SITE)
|
|
109
|
+
|
|
110
|
+
# let's run finalize
|
|
111
|
+
cmd.ensure_finalized()
|
|
112
|
+
|
|
113
|
+
# now they should
|
|
114
|
+
assert os.path.exists(site.USER_BASE)
|
|
115
|
+
assert os.path.exists(site.USER_SITE)
|
|
116
|
+
|
|
117
|
+
assert 'userbase' in cmd.config_vars
|
|
118
|
+
assert 'usersite' in cmd.config_vars
|
|
119
|
+
|
|
120
|
+
actual_headers = os.path.relpath(cmd.install_headers, site.USER_BASE)
|
|
121
|
+
if os.name == 'nt' and not is_mingw():
|
|
122
|
+
site_path = os.path.relpath(os.path.dirname(orig_site), orig_base)
|
|
123
|
+
include = os.path.join(site_path, 'Include')
|
|
124
|
+
else:
|
|
125
|
+
include = sysconfig.get_python_inc(0, '')
|
|
126
|
+
expect_headers = os.path.join(include, 'xx')
|
|
127
|
+
|
|
128
|
+
assert os.path.normcase(actual_headers) == os.path.normcase(expect_headers)
|
|
129
|
+
|
|
130
|
+
def test_handle_extra_path(self):
|
|
131
|
+
dist = Distribution({'name': 'xx', 'extra_path': 'path,dirs'})
|
|
132
|
+
cmd = install(dist)
|
|
133
|
+
|
|
134
|
+
# two elements
|
|
135
|
+
cmd.handle_extra_path()
|
|
136
|
+
assert cmd.extra_path == ['path', 'dirs']
|
|
137
|
+
assert cmd.extra_dirs == 'dirs'
|
|
138
|
+
assert cmd.path_file == 'path'
|
|
139
|
+
|
|
140
|
+
# one element
|
|
141
|
+
cmd.extra_path = ['path']
|
|
142
|
+
cmd.handle_extra_path()
|
|
143
|
+
assert cmd.extra_path == ['path']
|
|
144
|
+
assert cmd.extra_dirs == 'path'
|
|
145
|
+
assert cmd.path_file == 'path'
|
|
146
|
+
|
|
147
|
+
# none
|
|
148
|
+
dist.extra_path = cmd.extra_path = None
|
|
149
|
+
cmd.handle_extra_path()
|
|
150
|
+
assert cmd.extra_path is None
|
|
151
|
+
assert cmd.extra_dirs == ''
|
|
152
|
+
assert cmd.path_file is None
|
|
153
|
+
|
|
154
|
+
# three elements (no way !)
|
|
155
|
+
cmd.extra_path = 'path,dirs,again'
|
|
156
|
+
with pytest.raises(DistutilsOptionError):
|
|
157
|
+
cmd.handle_extra_path()
|
|
158
|
+
|
|
159
|
+
def test_finalize_options(self):
|
|
160
|
+
dist = Distribution({'name': 'xx'})
|
|
161
|
+
cmd = install(dist)
|
|
162
|
+
|
|
163
|
+
# must supply either prefix/exec-prefix/home or
|
|
164
|
+
# install-base/install-platbase -- not both
|
|
165
|
+
cmd.prefix = 'prefix'
|
|
166
|
+
cmd.install_base = 'base'
|
|
167
|
+
with pytest.raises(DistutilsOptionError):
|
|
168
|
+
cmd.finalize_options()
|
|
169
|
+
|
|
170
|
+
# must supply either home or prefix/exec-prefix -- not both
|
|
171
|
+
cmd.install_base = None
|
|
172
|
+
cmd.home = 'home'
|
|
173
|
+
with pytest.raises(DistutilsOptionError):
|
|
174
|
+
cmd.finalize_options()
|
|
175
|
+
|
|
176
|
+
# can't combine user with prefix/exec_prefix/home or
|
|
177
|
+
# install_(plat)base
|
|
178
|
+
cmd.prefix = None
|
|
179
|
+
cmd.user = 'user'
|
|
180
|
+
with pytest.raises(DistutilsOptionError):
|
|
181
|
+
cmd.finalize_options()
|
|
182
|
+
|
|
183
|
+
def test_record(self):
|
|
184
|
+
install_dir = self.mkdtemp()
|
|
185
|
+
project_dir, dist = self.create_dist(py_modules=['hello'], scripts=['sayhi'])
|
|
186
|
+
os.chdir(project_dir)
|
|
187
|
+
self.write_file('hello.py', "def main(): print('o hai')")
|
|
188
|
+
self.write_file('sayhi', 'from hello import main; main()')
|
|
189
|
+
|
|
190
|
+
cmd = install(dist)
|
|
191
|
+
dist.command_obj['install'] = cmd
|
|
192
|
+
cmd.root = install_dir
|
|
193
|
+
cmd.record = os.path.join(project_dir, 'filelist')
|
|
194
|
+
cmd.ensure_finalized()
|
|
195
|
+
cmd.run()
|
|
196
|
+
|
|
197
|
+
content = pathlib.Path(cmd.record).read_text(encoding='utf-8')
|
|
198
|
+
|
|
199
|
+
found = [pathlib.Path(line).name for line in content.splitlines()]
|
|
200
|
+
expected = [
|
|
201
|
+
'hello.py',
|
|
202
|
+
f'hello.{sys.implementation.cache_tag}.pyc',
|
|
203
|
+
'sayhi',
|
|
204
|
+
'UNKNOWN-0.0.0-py{}.{}.egg-info'.format(*sys.version_info[:2]),
|
|
205
|
+
]
|
|
206
|
+
assert found == expected
|
|
207
|
+
|
|
208
|
+
def test_record_extensions(self):
|
|
209
|
+
cmd = missing_compiler_executable()
|
|
210
|
+
if cmd is not None:
|
|
211
|
+
pytest.skip(f'The {cmd!r} command is not found')
|
|
212
|
+
install_dir = self.mkdtemp()
|
|
213
|
+
project_dir, dist = self.create_dist(
|
|
214
|
+
ext_modules=[Extension('xx', ['xxmodule.c'])]
|
|
215
|
+
)
|
|
216
|
+
os.chdir(project_dir)
|
|
217
|
+
support.copy_xxmodule_c(project_dir)
|
|
218
|
+
|
|
219
|
+
buildextcmd = build_ext(dist)
|
|
220
|
+
support.fixup_build_ext(buildextcmd)
|
|
221
|
+
buildextcmd.ensure_finalized()
|
|
222
|
+
|
|
223
|
+
cmd = install(dist)
|
|
224
|
+
dist.command_obj['install'] = cmd
|
|
225
|
+
dist.command_obj['build_ext'] = buildextcmd
|
|
226
|
+
cmd.root = install_dir
|
|
227
|
+
cmd.record = os.path.join(project_dir, 'filelist')
|
|
228
|
+
cmd.ensure_finalized()
|
|
229
|
+
cmd.run()
|
|
230
|
+
|
|
231
|
+
content = pathlib.Path(cmd.record).read_text(encoding='utf-8')
|
|
232
|
+
|
|
233
|
+
found = [pathlib.Path(line).name for line in content.splitlines()]
|
|
234
|
+
expected = [
|
|
235
|
+
_make_ext_name('xx'),
|
|
236
|
+
'UNKNOWN-0.0.0-py{}.{}.egg-info'.format(*sys.version_info[:2]),
|
|
237
|
+
]
|
|
238
|
+
assert found == expected
|
|
239
|
+
|
|
240
|
+
def test_debug_mode(self, caplog, monkeypatch):
|
|
241
|
+
# this covers the code called when DEBUG is set
|
|
242
|
+
monkeypatch.setattr(install_module, 'DEBUG', True)
|
|
243
|
+
caplog.set_level(logging.DEBUG)
|
|
244
|
+
self.test_record()
|
|
245
|
+
assert any(rec for rec in caplog.records if rec.levelno == logging.DEBUG)
|