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,131 @@
|
|
|
1
|
+
import contextlib
|
|
2
|
+
import io
|
|
3
|
+
import os
|
|
4
|
+
import shutil
|
|
5
|
+
import site
|
|
6
|
+
import sys
|
|
7
|
+
import tempfile
|
|
8
|
+
|
|
9
|
+
from filelock import FileLock
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@contextlib.contextmanager
|
|
13
|
+
def tempdir(cd=lambda dir: None, **kwargs):
|
|
14
|
+
temp_dir = tempfile.mkdtemp(**kwargs)
|
|
15
|
+
orig_dir = os.getcwd()
|
|
16
|
+
try:
|
|
17
|
+
cd(temp_dir)
|
|
18
|
+
yield temp_dir
|
|
19
|
+
finally:
|
|
20
|
+
cd(orig_dir)
|
|
21
|
+
shutil.rmtree(temp_dir)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@contextlib.contextmanager
|
|
25
|
+
def environment(**replacements):
|
|
26
|
+
"""
|
|
27
|
+
In a context, patch the environment with replacements. Pass None values
|
|
28
|
+
to clear the values.
|
|
29
|
+
"""
|
|
30
|
+
saved = dict((key, os.environ[key]) for key in replacements if key in os.environ)
|
|
31
|
+
|
|
32
|
+
# remove values that are null
|
|
33
|
+
remove = (key for (key, value) in replacements.items() if value is None)
|
|
34
|
+
for key in list(remove):
|
|
35
|
+
os.environ.pop(key, None)
|
|
36
|
+
replacements.pop(key)
|
|
37
|
+
|
|
38
|
+
os.environ.update(replacements)
|
|
39
|
+
|
|
40
|
+
try:
|
|
41
|
+
yield saved
|
|
42
|
+
finally:
|
|
43
|
+
for key in replacements:
|
|
44
|
+
os.environ.pop(key, None)
|
|
45
|
+
os.environ.update(saved)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
@contextlib.contextmanager
|
|
49
|
+
def quiet():
|
|
50
|
+
"""
|
|
51
|
+
Redirect stdout/stderr to StringIO objects to prevent console output from
|
|
52
|
+
distutils commands.
|
|
53
|
+
"""
|
|
54
|
+
|
|
55
|
+
old_stdout = sys.stdout
|
|
56
|
+
old_stderr = sys.stderr
|
|
57
|
+
new_stdout = sys.stdout = io.StringIO()
|
|
58
|
+
new_stderr = sys.stderr = io.StringIO()
|
|
59
|
+
try:
|
|
60
|
+
yield new_stdout, new_stderr
|
|
61
|
+
finally:
|
|
62
|
+
new_stdout.seek(0)
|
|
63
|
+
new_stderr.seek(0)
|
|
64
|
+
sys.stdout = old_stdout
|
|
65
|
+
sys.stderr = old_stderr
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
@contextlib.contextmanager
|
|
69
|
+
def save_user_site_setting():
|
|
70
|
+
saved = site.ENABLE_USER_SITE
|
|
71
|
+
try:
|
|
72
|
+
yield saved
|
|
73
|
+
finally:
|
|
74
|
+
site.ENABLE_USER_SITE = saved
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
@contextlib.contextmanager
|
|
78
|
+
def suppress_exceptions(*excs):
|
|
79
|
+
try:
|
|
80
|
+
yield
|
|
81
|
+
except excs:
|
|
82
|
+
pass
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def multiproc(request):
|
|
86
|
+
"""
|
|
87
|
+
Return True if running under xdist and multiple
|
|
88
|
+
workers are used.
|
|
89
|
+
"""
|
|
90
|
+
try:
|
|
91
|
+
worker_id = request.getfixturevalue('worker_id')
|
|
92
|
+
except Exception:
|
|
93
|
+
return False
|
|
94
|
+
return worker_id != 'master'
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
@contextlib.contextmanager
|
|
98
|
+
def session_locked_tmp_dir(request, tmp_path_factory, name):
|
|
99
|
+
"""Uses a file lock to guarantee only one worker can access a temp dir"""
|
|
100
|
+
# get the temp directory shared by all workers
|
|
101
|
+
base = tmp_path_factory.getbasetemp()
|
|
102
|
+
shared_dir = base.parent if multiproc(request) else base
|
|
103
|
+
|
|
104
|
+
locked_dir = shared_dir / name
|
|
105
|
+
with FileLock(locked_dir.with_suffix(".lock")):
|
|
106
|
+
# ^-- prevent multiple workers to access the directory at once
|
|
107
|
+
locked_dir.mkdir(exist_ok=True, parents=True)
|
|
108
|
+
yield locked_dir
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
@contextlib.contextmanager
|
|
112
|
+
def save_paths():
|
|
113
|
+
"""Make sure ``sys.path``, ``sys.meta_path`` and ``sys.path_hooks`` are preserved"""
|
|
114
|
+
prev = sys.path[:], sys.meta_path[:], sys.path_hooks[:]
|
|
115
|
+
|
|
116
|
+
try:
|
|
117
|
+
yield
|
|
118
|
+
finally:
|
|
119
|
+
sys.path, sys.meta_path, sys.path_hooks = prev
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
@contextlib.contextmanager
|
|
123
|
+
def save_sys_modules():
|
|
124
|
+
"""Make sure initial ``sys.modules`` is preserved"""
|
|
125
|
+
prev_modules = sys.modules
|
|
126
|
+
|
|
127
|
+
try:
|
|
128
|
+
sys.modules = sys.modules.copy()
|
|
129
|
+
yield
|
|
130
|
+
finally:
|
|
131
|
+
sys.modules = prev_modules
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import subprocess
|
|
3
|
+
import sys
|
|
4
|
+
import unicodedata
|
|
5
|
+
from subprocess import PIPE as _PIPE, Popen as _Popen
|
|
6
|
+
|
|
7
|
+
import jaraco.envs
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class VirtualEnv(jaraco.envs.VirtualEnv):
|
|
11
|
+
name = '.env'
|
|
12
|
+
# Some version of PyPy will import distutils on startup, implicitly
|
|
13
|
+
# importing setuptools, and thus leading to BackendInvalid errors
|
|
14
|
+
# when upgrading Setuptools. Bypass this behavior by avoiding the
|
|
15
|
+
# early availability and need to upgrade.
|
|
16
|
+
create_opts = ['--no-setuptools']
|
|
17
|
+
|
|
18
|
+
def run(self, cmd, *args, **kwargs):
|
|
19
|
+
cmd = [self.exe(cmd[0])] + cmd[1:]
|
|
20
|
+
kwargs = {"cwd": self.root, "encoding": "utf-8", **kwargs} # Allow overriding
|
|
21
|
+
# In some environments (eg. downstream distro packaging), where:
|
|
22
|
+
# - tox isn't used to run tests and
|
|
23
|
+
# - PYTHONPATH is set to point to a specific setuptools codebase and
|
|
24
|
+
# - no custom env is explicitly set by a test
|
|
25
|
+
# PYTHONPATH will leak into the spawned processes.
|
|
26
|
+
# In that case tests look for module in the wrong place (on PYTHONPATH).
|
|
27
|
+
# Unless the test sets its own special env, pass a copy of the existing
|
|
28
|
+
# environment with removed PYTHONPATH to the subprocesses.
|
|
29
|
+
if "env" not in kwargs:
|
|
30
|
+
env = dict(os.environ)
|
|
31
|
+
if "PYTHONPATH" in env:
|
|
32
|
+
del env["PYTHONPATH"]
|
|
33
|
+
kwargs["env"] = env
|
|
34
|
+
return subprocess.check_output(cmd, *args, **kwargs)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def _which_dirs(cmd):
|
|
38
|
+
result = set()
|
|
39
|
+
for path in os.environ.get('PATH', '').split(os.pathsep):
|
|
40
|
+
filename = os.path.join(path, cmd)
|
|
41
|
+
if os.access(filename, os.X_OK):
|
|
42
|
+
result.add(path)
|
|
43
|
+
return result
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def run_setup_py(cmd, pypath=None, path=None, data_stream=0, env=None):
|
|
47
|
+
"""
|
|
48
|
+
Execution command for tests, separate from those used by the
|
|
49
|
+
code directly to prevent accidental behavior issues
|
|
50
|
+
"""
|
|
51
|
+
if env is None:
|
|
52
|
+
env = dict()
|
|
53
|
+
for envname in os.environ:
|
|
54
|
+
env[envname] = os.environ[envname]
|
|
55
|
+
|
|
56
|
+
# override the python path if needed
|
|
57
|
+
if pypath is not None:
|
|
58
|
+
env["PYTHONPATH"] = pypath
|
|
59
|
+
|
|
60
|
+
# override the execution path if needed
|
|
61
|
+
if path is not None:
|
|
62
|
+
env["PATH"] = path
|
|
63
|
+
if not env.get("PATH", ""):
|
|
64
|
+
env["PATH"] = _which_dirs("tar").union(_which_dirs("gzip"))
|
|
65
|
+
env["PATH"] = os.pathsep.join(env["PATH"])
|
|
66
|
+
|
|
67
|
+
cmd = [sys.executable, "setup.py"] + list(cmd)
|
|
68
|
+
|
|
69
|
+
# https://bugs.python.org/issue8557
|
|
70
|
+
shell = sys.platform == 'win32'
|
|
71
|
+
|
|
72
|
+
try:
|
|
73
|
+
proc = _Popen(
|
|
74
|
+
cmd,
|
|
75
|
+
stdout=_PIPE,
|
|
76
|
+
stderr=_PIPE,
|
|
77
|
+
shell=shell,
|
|
78
|
+
env=env,
|
|
79
|
+
encoding="utf-8",
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
if isinstance(data_stream, tuple):
|
|
83
|
+
data_stream = slice(*data_stream)
|
|
84
|
+
data = proc.communicate()[data_stream]
|
|
85
|
+
except OSError:
|
|
86
|
+
return 1, ''
|
|
87
|
+
|
|
88
|
+
# decode the console string if needed
|
|
89
|
+
if hasattr(data, "decode"):
|
|
90
|
+
# use the default encoding
|
|
91
|
+
data = data.decode()
|
|
92
|
+
data = unicodedata.normalize('NFC', data)
|
|
93
|
+
|
|
94
|
+
# communicate calls wait()
|
|
95
|
+
return proc.returncode, data
|
|
@@ -0,0 +1,392 @@
|
|
|
1
|
+
import contextlib
|
|
2
|
+
import io
|
|
3
|
+
import os
|
|
4
|
+
import subprocess
|
|
5
|
+
import sys
|
|
6
|
+
import tarfile
|
|
7
|
+
import time
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
|
|
10
|
+
import jaraco.path
|
|
11
|
+
import path
|
|
12
|
+
import pytest
|
|
13
|
+
|
|
14
|
+
from setuptools._normalization import safer_name
|
|
15
|
+
|
|
16
|
+
from . import contexts, environment
|
|
17
|
+
from .textwrap import DALS
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
@pytest.fixture
|
|
21
|
+
def user_override(monkeypatch):
|
|
22
|
+
"""
|
|
23
|
+
Override site.USER_BASE and site.USER_SITE with temporary directories in
|
|
24
|
+
a context.
|
|
25
|
+
"""
|
|
26
|
+
with contexts.tempdir() as user_base:
|
|
27
|
+
monkeypatch.setattr('site.USER_BASE', user_base)
|
|
28
|
+
with contexts.tempdir() as user_site:
|
|
29
|
+
monkeypatch.setattr('site.USER_SITE', user_site)
|
|
30
|
+
with contexts.save_user_site_setting():
|
|
31
|
+
yield
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@pytest.fixture
|
|
35
|
+
def tmpdir_cwd(tmpdir):
|
|
36
|
+
with tmpdir.as_cwd() as orig:
|
|
37
|
+
yield orig
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
@pytest.fixture(autouse=True, scope="session")
|
|
41
|
+
def workaround_xdist_376(request):
|
|
42
|
+
"""
|
|
43
|
+
Workaround pytest-dev/pytest-xdist#376
|
|
44
|
+
|
|
45
|
+
``pytest-xdist`` tends to inject '' into ``sys.path``,
|
|
46
|
+
which may break certain isolation expectations.
|
|
47
|
+
Remove the entry so the import
|
|
48
|
+
machinery behaves the same irrespective of xdist.
|
|
49
|
+
"""
|
|
50
|
+
if not request.config.pluginmanager.has_plugin('xdist'):
|
|
51
|
+
return
|
|
52
|
+
|
|
53
|
+
with contextlib.suppress(ValueError):
|
|
54
|
+
sys.path.remove('')
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
@pytest.fixture
|
|
58
|
+
def sample_project(tmp_path):
|
|
59
|
+
"""
|
|
60
|
+
Clone the 'sampleproject' and return a path to it.
|
|
61
|
+
"""
|
|
62
|
+
cmd = ['git', 'clone', 'https://github.com/pypa/sampleproject']
|
|
63
|
+
try:
|
|
64
|
+
subprocess.check_call(cmd, cwd=str(tmp_path))
|
|
65
|
+
except Exception:
|
|
66
|
+
pytest.skip("Unable to clone sampleproject")
|
|
67
|
+
return tmp_path / 'sampleproject'
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
@pytest.fixture
|
|
71
|
+
def sample_project_cwd(sample_project):
|
|
72
|
+
with path.Path(sample_project):
|
|
73
|
+
yield
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
# sdist and wheel artifacts should be stable across a round of tests
|
|
77
|
+
# so we can build them once per session and use the files as "readonly"
|
|
78
|
+
|
|
79
|
+
# In the case of setuptools, building the wheel without sdist may cause
|
|
80
|
+
# it to contain the `build` directory, and therefore create situations with
|
|
81
|
+
# `setuptools/build/lib/build/lib/...`. To avoid that, build both artifacts at once.
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def _build_distributions(tmp_path_factory, request):
|
|
85
|
+
with contexts.session_locked_tmp_dir(
|
|
86
|
+
request, tmp_path_factory, "dist_build"
|
|
87
|
+
) as tmp: # pragma: no cover
|
|
88
|
+
sdist = next(tmp.glob("*.tar.gz"), None)
|
|
89
|
+
wheel = next(tmp.glob("*.whl"), None)
|
|
90
|
+
if sdist and wheel:
|
|
91
|
+
return (sdist, wheel)
|
|
92
|
+
|
|
93
|
+
# Sanity check: should not create recursive setuptools/build/lib/build/lib/...
|
|
94
|
+
assert not Path(request.config.rootdir, "build/lib/build").exists()
|
|
95
|
+
|
|
96
|
+
subprocess.check_output([
|
|
97
|
+
sys.executable,
|
|
98
|
+
"-m",
|
|
99
|
+
"build",
|
|
100
|
+
"--outdir",
|
|
101
|
+
str(tmp),
|
|
102
|
+
str(request.config.rootdir),
|
|
103
|
+
])
|
|
104
|
+
|
|
105
|
+
# Sanity check: should not create recursive setuptools/build/lib/build/lib/...
|
|
106
|
+
assert not Path(request.config.rootdir, "build/lib/build").exists()
|
|
107
|
+
|
|
108
|
+
return next(tmp.glob("*.tar.gz")), next(tmp.glob("*.whl"))
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
@pytest.fixture(scope="session")
|
|
112
|
+
def setuptools_sdist(tmp_path_factory, request):
|
|
113
|
+
prebuilt = os.getenv("PRE_BUILT_SETUPTOOLS_SDIST")
|
|
114
|
+
if prebuilt and os.path.exists(prebuilt): # pragma: no cover
|
|
115
|
+
return Path(prebuilt).resolve()
|
|
116
|
+
|
|
117
|
+
sdist, _ = _build_distributions(tmp_path_factory, request)
|
|
118
|
+
return sdist
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
@pytest.fixture(scope="session")
|
|
122
|
+
def setuptools_wheel(tmp_path_factory, request):
|
|
123
|
+
prebuilt = os.getenv("PRE_BUILT_SETUPTOOLS_WHEEL")
|
|
124
|
+
if prebuilt and os.path.exists(prebuilt): # pragma: no cover
|
|
125
|
+
return Path(prebuilt).resolve()
|
|
126
|
+
|
|
127
|
+
_, wheel = _build_distributions(tmp_path_factory, request)
|
|
128
|
+
return wheel
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
@pytest.fixture
|
|
132
|
+
def venv(tmp_path, setuptools_wheel):
|
|
133
|
+
"""Virtual env with the version of setuptools under test installed"""
|
|
134
|
+
env = environment.VirtualEnv()
|
|
135
|
+
env.root = path.Path(tmp_path / 'venv')
|
|
136
|
+
env.create_opts = ['--no-setuptools', '--wheel=bundle']
|
|
137
|
+
# TODO: Use `--no-wheel` when setuptools implements its own bdist_wheel
|
|
138
|
+
env.req = str(setuptools_wheel)
|
|
139
|
+
# In some environments (eg. downstream distro packaging),
|
|
140
|
+
# where tox isn't used to run tests and PYTHONPATH is set to point to
|
|
141
|
+
# a specific setuptools codebase, PYTHONPATH will leak into the spawned
|
|
142
|
+
# processes.
|
|
143
|
+
# env.create() should install the just created setuptools
|
|
144
|
+
# wheel, but it doesn't if it finds another existing matching setuptools
|
|
145
|
+
# installation present on PYTHONPATH:
|
|
146
|
+
# `setuptools is already installed with the same version as the provided
|
|
147
|
+
# wheel. Use --force-reinstall to force an installation of the wheel.`
|
|
148
|
+
# This prevents leaking PYTHONPATH to the created environment.
|
|
149
|
+
with contexts.environment(PYTHONPATH=None):
|
|
150
|
+
return env.create()
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
@pytest.fixture
|
|
154
|
+
def venv_without_setuptools(tmp_path):
|
|
155
|
+
"""Virtual env without any version of setuptools installed"""
|
|
156
|
+
env = environment.VirtualEnv()
|
|
157
|
+
env.root = path.Path(tmp_path / 'venv_without_setuptools')
|
|
158
|
+
env.create_opts = ['--no-setuptools', '--no-wheel']
|
|
159
|
+
env.ensure_env()
|
|
160
|
+
return env
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
@pytest.fixture
|
|
164
|
+
def bare_venv(tmp_path):
|
|
165
|
+
"""Virtual env without any common packages installed"""
|
|
166
|
+
env = environment.VirtualEnv()
|
|
167
|
+
env.root = path.Path(tmp_path / 'bare_venv')
|
|
168
|
+
env.create_opts = ['--no-setuptools', '--no-pip', '--no-wheel', '--no-seed']
|
|
169
|
+
env.ensure_env()
|
|
170
|
+
return env
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
def make_sdist(dist_path, files):
|
|
174
|
+
"""
|
|
175
|
+
Create a simple sdist tarball at dist_path, containing the files
|
|
176
|
+
listed in ``files`` as ``(filename, content)`` tuples.
|
|
177
|
+
"""
|
|
178
|
+
|
|
179
|
+
# Distributions with only one file don't play well with pip.
|
|
180
|
+
assert len(files) > 1
|
|
181
|
+
with tarfile.open(dist_path, 'w:gz') as dist:
|
|
182
|
+
for filename, content in files:
|
|
183
|
+
file_bytes = io.BytesIO(content.encode('utf-8'))
|
|
184
|
+
file_info = tarfile.TarInfo(name=filename)
|
|
185
|
+
file_info.size = len(file_bytes.getvalue())
|
|
186
|
+
file_info.mtime = int(time.time())
|
|
187
|
+
dist.addfile(file_info, fileobj=file_bytes)
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
def make_trivial_sdist(dist_path, distname, version):
|
|
191
|
+
"""
|
|
192
|
+
Create a simple sdist tarball at dist_path, containing just a simple
|
|
193
|
+
setup.py.
|
|
194
|
+
"""
|
|
195
|
+
|
|
196
|
+
make_sdist(
|
|
197
|
+
dist_path,
|
|
198
|
+
[
|
|
199
|
+
(
|
|
200
|
+
'setup.py',
|
|
201
|
+
DALS(
|
|
202
|
+
f"""\
|
|
203
|
+
import setuptools
|
|
204
|
+
setuptools.setup(
|
|
205
|
+
name={distname!r},
|
|
206
|
+
version={version!r}
|
|
207
|
+
)
|
|
208
|
+
"""
|
|
209
|
+
),
|
|
210
|
+
),
|
|
211
|
+
('setup.cfg', ''),
|
|
212
|
+
],
|
|
213
|
+
)
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
def make_nspkg_sdist(dist_path, distname, version):
|
|
217
|
+
"""
|
|
218
|
+
Make an sdist tarball with distname and version which also contains one
|
|
219
|
+
package with the same name as distname. The top-level package is
|
|
220
|
+
designated a namespace package).
|
|
221
|
+
"""
|
|
222
|
+
# Assert that the distname contains at least one period
|
|
223
|
+
assert '.' in distname
|
|
224
|
+
|
|
225
|
+
parts = distname.split('.')
|
|
226
|
+
nspackage = parts[0]
|
|
227
|
+
|
|
228
|
+
packages = ['.'.join(parts[:idx]) for idx in range(1, len(parts) + 1)]
|
|
229
|
+
|
|
230
|
+
setup_py = DALS(
|
|
231
|
+
f"""\
|
|
232
|
+
import setuptools
|
|
233
|
+
setuptools.setup(
|
|
234
|
+
name={distname!r},
|
|
235
|
+
version={version!r},
|
|
236
|
+
packages={packages!r},
|
|
237
|
+
namespace_packages=[{nspackage!r}]
|
|
238
|
+
)
|
|
239
|
+
"""
|
|
240
|
+
)
|
|
241
|
+
|
|
242
|
+
init = "__import__('pkg_resources').declare_namespace(__name__)"
|
|
243
|
+
|
|
244
|
+
files = [('setup.py', setup_py), (os.path.join(nspackage, '__init__.py'), init)]
|
|
245
|
+
for package in packages[1:]:
|
|
246
|
+
filename = os.path.join(*(package.split('.') + ['__init__.py']))
|
|
247
|
+
files.append((filename, ''))
|
|
248
|
+
|
|
249
|
+
make_sdist(dist_path, files)
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
def make_python_requires_sdist(dist_path, distname, version, python_requires):
|
|
253
|
+
make_sdist(
|
|
254
|
+
dist_path,
|
|
255
|
+
[
|
|
256
|
+
(
|
|
257
|
+
'setup.py',
|
|
258
|
+
DALS(
|
|
259
|
+
"""\
|
|
260
|
+
import setuptools
|
|
261
|
+
setuptools.setup(
|
|
262
|
+
name={name!r},
|
|
263
|
+
version={version!r},
|
|
264
|
+
python_requires={python_requires!r},
|
|
265
|
+
)
|
|
266
|
+
"""
|
|
267
|
+
).format(
|
|
268
|
+
name=distname, version=version, python_requires=python_requires
|
|
269
|
+
),
|
|
270
|
+
),
|
|
271
|
+
('setup.cfg', ''),
|
|
272
|
+
],
|
|
273
|
+
)
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
def create_setup_requires_package(
|
|
277
|
+
path,
|
|
278
|
+
distname='foobar',
|
|
279
|
+
version='0.1',
|
|
280
|
+
make_package=make_trivial_sdist,
|
|
281
|
+
setup_py_template=None,
|
|
282
|
+
setup_attrs=None,
|
|
283
|
+
use_setup_cfg=(),
|
|
284
|
+
):
|
|
285
|
+
"""Creates a source tree under path for a trivial test package that has a
|
|
286
|
+
single requirement in setup_requires--a tarball for that requirement is
|
|
287
|
+
also created and added to the dependency_links argument.
|
|
288
|
+
|
|
289
|
+
``distname`` and ``version`` refer to the name/version of the package that
|
|
290
|
+
the test package requires via ``setup_requires``. The name of the test
|
|
291
|
+
package itself is just 'test_pkg'.
|
|
292
|
+
"""
|
|
293
|
+
|
|
294
|
+
normalized_distname = safer_name(distname)
|
|
295
|
+
test_setup_attrs = {
|
|
296
|
+
'name': 'test_pkg',
|
|
297
|
+
'version': '0.0',
|
|
298
|
+
'setup_requires': [f'{normalized_distname}=={version}'],
|
|
299
|
+
'dependency_links': [os.path.abspath(path)],
|
|
300
|
+
}
|
|
301
|
+
if setup_attrs:
|
|
302
|
+
test_setup_attrs.update(setup_attrs)
|
|
303
|
+
|
|
304
|
+
test_pkg = os.path.join(path, 'test_pkg')
|
|
305
|
+
os.mkdir(test_pkg)
|
|
306
|
+
|
|
307
|
+
# setup.cfg
|
|
308
|
+
if use_setup_cfg:
|
|
309
|
+
options = []
|
|
310
|
+
metadata = []
|
|
311
|
+
for name in use_setup_cfg:
|
|
312
|
+
value = test_setup_attrs.pop(name)
|
|
313
|
+
if name in 'name version'.split():
|
|
314
|
+
section = metadata
|
|
315
|
+
else:
|
|
316
|
+
section = options
|
|
317
|
+
if isinstance(value, (tuple, list)):
|
|
318
|
+
value = ';'.join(value)
|
|
319
|
+
section.append(f'{name}: {value}')
|
|
320
|
+
test_setup_cfg_contents = DALS(
|
|
321
|
+
"""
|
|
322
|
+
[metadata]
|
|
323
|
+
{metadata}
|
|
324
|
+
[options]
|
|
325
|
+
{options}
|
|
326
|
+
"""
|
|
327
|
+
).format(
|
|
328
|
+
options='\n'.join(options),
|
|
329
|
+
metadata='\n'.join(metadata),
|
|
330
|
+
)
|
|
331
|
+
else:
|
|
332
|
+
test_setup_cfg_contents = ''
|
|
333
|
+
with open(os.path.join(test_pkg, 'setup.cfg'), 'w', encoding="utf-8") as f:
|
|
334
|
+
f.write(test_setup_cfg_contents)
|
|
335
|
+
|
|
336
|
+
# setup.py
|
|
337
|
+
if setup_py_template is None:
|
|
338
|
+
setup_py_template = DALS(
|
|
339
|
+
"""\
|
|
340
|
+
import setuptools
|
|
341
|
+
setuptools.setup(**%r)
|
|
342
|
+
"""
|
|
343
|
+
)
|
|
344
|
+
with open(os.path.join(test_pkg, 'setup.py'), 'w', encoding="utf-8") as f:
|
|
345
|
+
f.write(setup_py_template % test_setup_attrs)
|
|
346
|
+
|
|
347
|
+
foobar_path = os.path.join(path, f'{normalized_distname}-{version}.tar.gz')
|
|
348
|
+
make_package(foobar_path, distname, version)
|
|
349
|
+
|
|
350
|
+
return test_pkg
|
|
351
|
+
|
|
352
|
+
|
|
353
|
+
@pytest.fixture
|
|
354
|
+
def pbr_package(tmp_path, monkeypatch, venv):
|
|
355
|
+
files = {
|
|
356
|
+
"pyproject.toml": DALS(
|
|
357
|
+
"""
|
|
358
|
+
[build-system]
|
|
359
|
+
requires = ["setuptools"]
|
|
360
|
+
build-backend = "setuptools.build_meta"
|
|
361
|
+
"""
|
|
362
|
+
),
|
|
363
|
+
"setup.py": DALS(
|
|
364
|
+
"""
|
|
365
|
+
__import__('setuptools').setup(
|
|
366
|
+
pbr=True,
|
|
367
|
+
setup_requires=["pbr"],
|
|
368
|
+
)
|
|
369
|
+
"""
|
|
370
|
+
),
|
|
371
|
+
"setup.cfg": DALS(
|
|
372
|
+
"""
|
|
373
|
+
[metadata]
|
|
374
|
+
name = mypkg
|
|
375
|
+
|
|
376
|
+
[files]
|
|
377
|
+
packages =
|
|
378
|
+
mypkg
|
|
379
|
+
"""
|
|
380
|
+
),
|
|
381
|
+
"mypkg": {
|
|
382
|
+
"__init__.py": "",
|
|
383
|
+
"hello.py": "print('Hello world!')",
|
|
384
|
+
},
|
|
385
|
+
"other": {"test.txt": "Another file in here."},
|
|
386
|
+
}
|
|
387
|
+
venv.run(["python", "-m", "pip", "install", "pbr"])
|
|
388
|
+
prefix = tmp_path / 'mypkg'
|
|
389
|
+
prefix.mkdir()
|
|
390
|
+
jaraco.path.build(files, prefix=prefix)
|
|
391
|
+
monkeypatch.setenv('PBR_VERSION', "0.42")
|
|
392
|
+
return prefix
|
|
File without changes
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"""Reusable functions and classes for different types of integration tests.
|
|
2
|
+
|
|
3
|
+
For example ``Archive`` can be used to check the contents of distribution built
|
|
4
|
+
with setuptools, and ``run`` will always try to be as verbose as possible to
|
|
5
|
+
facilitate debugging.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import os
|
|
9
|
+
import subprocess
|
|
10
|
+
import tarfile
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
from zipfile import ZipFile
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def run(cmd, env=None):
|
|
16
|
+
r = subprocess.run(
|
|
17
|
+
cmd,
|
|
18
|
+
capture_output=True,
|
|
19
|
+
text=True,
|
|
20
|
+
encoding="utf-8",
|
|
21
|
+
env={**os.environ, **(env or {})},
|
|
22
|
+
# ^-- allow overwriting instead of discarding the current env
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
out = r.stdout + "\n" + r.stderr
|
|
26
|
+
# pytest omits stdout/err by default, if the test fails they help debugging
|
|
27
|
+
print("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
|
|
28
|
+
print(f"Command: {cmd}\nreturn code: {r.returncode}\n\n{out}")
|
|
29
|
+
|
|
30
|
+
if r.returncode == 0:
|
|
31
|
+
return out
|
|
32
|
+
raise subprocess.CalledProcessError(r.returncode, cmd, r.stdout, r.stderr)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class Archive:
|
|
36
|
+
"""Compatibility layer for ZipFile/Info and TarFile/Info"""
|
|
37
|
+
|
|
38
|
+
def __init__(self, filename):
|
|
39
|
+
self._filename = filename
|
|
40
|
+
if filename.endswith("tar.gz"):
|
|
41
|
+
self._obj = tarfile.open(filename, "r:gz")
|
|
42
|
+
elif filename.endswith("zip"):
|
|
43
|
+
self._obj = ZipFile(filename)
|
|
44
|
+
else:
|
|
45
|
+
raise ValueError(f"{filename} doesn't seem to be a zip or tar.gz")
|
|
46
|
+
|
|
47
|
+
def __iter__(self):
|
|
48
|
+
if hasattr(self._obj, "infolist"):
|
|
49
|
+
return iter(self._obj.infolist())
|
|
50
|
+
return iter(self._obj)
|
|
51
|
+
|
|
52
|
+
def get_name(self, zip_or_tar_info):
|
|
53
|
+
if hasattr(zip_or_tar_info, "filename"):
|
|
54
|
+
return zip_or_tar_info.filename
|
|
55
|
+
return zip_or_tar_info.name
|
|
56
|
+
|
|
57
|
+
def get_content(self, zip_or_tar_info):
|
|
58
|
+
if hasattr(self._obj, "extractfile"):
|
|
59
|
+
content = self._obj.extractfile(zip_or_tar_info)
|
|
60
|
+
if content is None:
|
|
61
|
+
msg = f"Invalid {zip_or_tar_info.name} in {self._filename}"
|
|
62
|
+
raise ValueError(msg)
|
|
63
|
+
return str(content.read(), "utf-8")
|
|
64
|
+
return str(self._obj.read(zip_or_tar_info), "utf-8")
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def get_sdist_members(sdist_path):
|
|
68
|
+
with tarfile.open(sdist_path, "r:gz") as tar:
|
|
69
|
+
files = [Path(f) for f in tar.getnames()]
|
|
70
|
+
# remove root folder
|
|
71
|
+
relative_files = ("/".join(f.parts[1:]) for f in files)
|
|
72
|
+
return {f for f in relative_files if f}
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def get_wheel_members(wheel_path):
|
|
76
|
+
with ZipFile(wheel_path) as zipfile:
|
|
77
|
+
return set(zipfile.namelist())
|