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,869 @@
|
|
|
1
|
+
import itertools
|
|
2
|
+
import os
|
|
3
|
+
import platform
|
|
4
|
+
import string
|
|
5
|
+
import sys
|
|
6
|
+
|
|
7
|
+
import pytest
|
|
8
|
+
from packaging.specifiers import SpecifierSet
|
|
9
|
+
|
|
10
|
+
import pkg_resources
|
|
11
|
+
from pkg_resources import (
|
|
12
|
+
Distribution,
|
|
13
|
+
EntryPoint,
|
|
14
|
+
Requirement,
|
|
15
|
+
VersionConflict,
|
|
16
|
+
WorkingSet,
|
|
17
|
+
parse_requirements,
|
|
18
|
+
parse_version,
|
|
19
|
+
safe_name,
|
|
20
|
+
safe_version,
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
# from Python 3.6 docs. Available from itertools on Python 3.10
|
|
25
|
+
def pairwise(iterable):
|
|
26
|
+
"s -> (s0,s1), (s1,s2), (s2, s3), ..."
|
|
27
|
+
a, b = itertools.tee(iterable)
|
|
28
|
+
next(b, None)
|
|
29
|
+
return zip(a, b)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class Metadata(pkg_resources.EmptyProvider):
|
|
33
|
+
"""Mock object to return metadata as if from an on-disk distribution"""
|
|
34
|
+
|
|
35
|
+
def __init__(self, *pairs) -> None:
|
|
36
|
+
self.metadata = dict(pairs)
|
|
37
|
+
|
|
38
|
+
def has_metadata(self, name) -> bool:
|
|
39
|
+
return name in self.metadata
|
|
40
|
+
|
|
41
|
+
def get_metadata(self, name):
|
|
42
|
+
return self.metadata[name]
|
|
43
|
+
|
|
44
|
+
def get_metadata_lines(self, name):
|
|
45
|
+
return pkg_resources.yield_lines(self.get_metadata(name))
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
dist_from_fn = pkg_resources.Distribution.from_filename
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class TestDistro:
|
|
52
|
+
def testCollection(self):
|
|
53
|
+
# empty path should produce no distributions
|
|
54
|
+
ad = pkg_resources.Environment([], platform=None, python=None)
|
|
55
|
+
assert list(ad) == []
|
|
56
|
+
assert ad['FooPkg'] == []
|
|
57
|
+
ad.add(dist_from_fn("FooPkg-1.3_1.egg"))
|
|
58
|
+
ad.add(dist_from_fn("FooPkg-1.4-py2.4-win32.egg"))
|
|
59
|
+
ad.add(dist_from_fn("FooPkg-1.2-py2.4.egg"))
|
|
60
|
+
|
|
61
|
+
# Name is in there now
|
|
62
|
+
assert ad['FooPkg']
|
|
63
|
+
# But only 1 package
|
|
64
|
+
assert list(ad) == ['foopkg']
|
|
65
|
+
|
|
66
|
+
# Distributions sort by version
|
|
67
|
+
expected = ['1.4', '1.3-1', '1.2']
|
|
68
|
+
assert [dist.version for dist in ad['FooPkg']] == expected
|
|
69
|
+
|
|
70
|
+
# Removing a distribution leaves sequence alone
|
|
71
|
+
ad.remove(ad['FooPkg'][1])
|
|
72
|
+
assert [dist.version for dist in ad['FooPkg']] == ['1.4', '1.2']
|
|
73
|
+
|
|
74
|
+
# And inserting adds them in order
|
|
75
|
+
ad.add(dist_from_fn("FooPkg-1.9.egg"))
|
|
76
|
+
assert [dist.version for dist in ad['FooPkg']] == ['1.9', '1.4', '1.2']
|
|
77
|
+
|
|
78
|
+
ws = WorkingSet([])
|
|
79
|
+
foo12 = dist_from_fn("FooPkg-1.2-py2.4.egg")
|
|
80
|
+
foo14 = dist_from_fn("FooPkg-1.4-py2.4-win32.egg")
|
|
81
|
+
(req,) = parse_requirements("FooPkg>=1.3")
|
|
82
|
+
|
|
83
|
+
# Nominal case: no distros on path, should yield all applicable
|
|
84
|
+
assert ad.best_match(req, ws).version == '1.9'
|
|
85
|
+
# If a matching distro is already installed, should return only that
|
|
86
|
+
ws.add(foo14)
|
|
87
|
+
assert ad.best_match(req, ws).version == '1.4'
|
|
88
|
+
|
|
89
|
+
# If the first matching distro is unsuitable, it's a version conflict
|
|
90
|
+
ws = WorkingSet([])
|
|
91
|
+
ws.add(foo12)
|
|
92
|
+
ws.add(foo14)
|
|
93
|
+
with pytest.raises(VersionConflict):
|
|
94
|
+
ad.best_match(req, ws)
|
|
95
|
+
|
|
96
|
+
# If more than one match on the path, the first one takes precedence
|
|
97
|
+
ws = WorkingSet([])
|
|
98
|
+
ws.add(foo14)
|
|
99
|
+
ws.add(foo12)
|
|
100
|
+
ws.add(foo14)
|
|
101
|
+
assert ad.best_match(req, ws).version == '1.4'
|
|
102
|
+
|
|
103
|
+
def checkFooPkg(self, d):
|
|
104
|
+
assert d.project_name == "FooPkg"
|
|
105
|
+
assert d.key == "foopkg"
|
|
106
|
+
assert d.version == "1.3.post1"
|
|
107
|
+
assert d.py_version == "2.4"
|
|
108
|
+
assert d.platform == "win32"
|
|
109
|
+
assert d.parsed_version == parse_version("1.3-1")
|
|
110
|
+
|
|
111
|
+
def testDistroBasics(self):
|
|
112
|
+
d = Distribution(
|
|
113
|
+
"/some/path",
|
|
114
|
+
project_name="FooPkg",
|
|
115
|
+
version="1.3-1",
|
|
116
|
+
py_version="2.4",
|
|
117
|
+
platform="win32",
|
|
118
|
+
)
|
|
119
|
+
self.checkFooPkg(d)
|
|
120
|
+
|
|
121
|
+
d = Distribution("/some/path")
|
|
122
|
+
assert d.py_version == f'{sys.version_info.major}.{sys.version_info.minor}'
|
|
123
|
+
assert d.platform is None
|
|
124
|
+
|
|
125
|
+
def testDistroParse(self):
|
|
126
|
+
d = dist_from_fn("FooPkg-1.3.post1-py2.4-win32.egg")
|
|
127
|
+
self.checkFooPkg(d)
|
|
128
|
+
d = dist_from_fn("FooPkg-1.3.post1-py2.4-win32.egg-info")
|
|
129
|
+
self.checkFooPkg(d)
|
|
130
|
+
|
|
131
|
+
def testDistroMetadata(self):
|
|
132
|
+
d = Distribution(
|
|
133
|
+
"/some/path",
|
|
134
|
+
project_name="FooPkg",
|
|
135
|
+
py_version="2.4",
|
|
136
|
+
platform="win32",
|
|
137
|
+
metadata=Metadata(('PKG-INFO', "Metadata-Version: 1.0\nVersion: 1.3-1\n")),
|
|
138
|
+
)
|
|
139
|
+
self.checkFooPkg(d)
|
|
140
|
+
|
|
141
|
+
def distRequires(self, txt):
|
|
142
|
+
return Distribution("/foo", metadata=Metadata(('depends.txt', txt)))
|
|
143
|
+
|
|
144
|
+
def checkRequires(self, dist, txt, extras=()):
|
|
145
|
+
assert list(dist.requires(extras)) == list(parse_requirements(txt))
|
|
146
|
+
|
|
147
|
+
def testDistroDependsSimple(self):
|
|
148
|
+
for v in "Twisted>=1.5", "Twisted>=1.5\nZConfig>=2.0":
|
|
149
|
+
self.checkRequires(self.distRequires(v), v)
|
|
150
|
+
|
|
151
|
+
needs_object_dir = pytest.mark.skipif(
|
|
152
|
+
not hasattr(object, '__dir__'),
|
|
153
|
+
reason='object.__dir__ necessary for self.__dir__ implementation',
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
def test_distribution_dir(self):
|
|
157
|
+
d = pkg_resources.Distribution()
|
|
158
|
+
dir(d)
|
|
159
|
+
|
|
160
|
+
@needs_object_dir
|
|
161
|
+
def test_distribution_dir_includes_provider_dir(self):
|
|
162
|
+
d = pkg_resources.Distribution()
|
|
163
|
+
before = d.__dir__()
|
|
164
|
+
assert 'test_attr' not in before
|
|
165
|
+
d._provider.test_attr = None
|
|
166
|
+
after = d.__dir__()
|
|
167
|
+
assert len(after) == len(before) + 1
|
|
168
|
+
assert 'test_attr' in after
|
|
169
|
+
|
|
170
|
+
@needs_object_dir
|
|
171
|
+
def test_distribution_dir_ignores_provider_dir_leading_underscore(self):
|
|
172
|
+
d = pkg_resources.Distribution()
|
|
173
|
+
before = d.__dir__()
|
|
174
|
+
assert '_test_attr' not in before
|
|
175
|
+
d._provider._test_attr = None
|
|
176
|
+
after = d.__dir__()
|
|
177
|
+
assert len(after) == len(before)
|
|
178
|
+
assert '_test_attr' not in after
|
|
179
|
+
|
|
180
|
+
def testResolve(self):
|
|
181
|
+
ad = pkg_resources.Environment([])
|
|
182
|
+
ws = WorkingSet([])
|
|
183
|
+
# Resolving no requirements -> nothing to install
|
|
184
|
+
assert list(ws.resolve([], ad)) == []
|
|
185
|
+
# Request something not in the collection -> DistributionNotFound
|
|
186
|
+
with pytest.raises(pkg_resources.DistributionNotFound):
|
|
187
|
+
ws.resolve(parse_requirements("Foo"), ad)
|
|
188
|
+
|
|
189
|
+
Foo = Distribution.from_filename(
|
|
190
|
+
"/foo_dir/Foo-1.2.egg",
|
|
191
|
+
metadata=Metadata(('depends.txt', "[bar]\nBaz>=2.0")),
|
|
192
|
+
)
|
|
193
|
+
ad.add(Foo)
|
|
194
|
+
ad.add(Distribution.from_filename("Foo-0.9.egg"))
|
|
195
|
+
|
|
196
|
+
# Request thing(s) that are available -> list to activate
|
|
197
|
+
for i in range(3):
|
|
198
|
+
targets = list(ws.resolve(parse_requirements("Foo"), ad))
|
|
199
|
+
assert targets == [Foo]
|
|
200
|
+
list(map(ws.add, targets))
|
|
201
|
+
with pytest.raises(VersionConflict):
|
|
202
|
+
ws.resolve(parse_requirements("Foo==0.9"), ad)
|
|
203
|
+
ws = WorkingSet([]) # reset
|
|
204
|
+
|
|
205
|
+
# Request an extra that causes an unresolved dependency for "Baz"
|
|
206
|
+
with pytest.raises(pkg_resources.DistributionNotFound):
|
|
207
|
+
ws.resolve(parse_requirements("Foo[bar]"), ad)
|
|
208
|
+
Baz = Distribution.from_filename(
|
|
209
|
+
"/foo_dir/Baz-2.1.egg", metadata=Metadata(('depends.txt', "Foo"))
|
|
210
|
+
)
|
|
211
|
+
ad.add(Baz)
|
|
212
|
+
|
|
213
|
+
# Activation list now includes resolved dependency
|
|
214
|
+
assert list(ws.resolve(parse_requirements("Foo[bar]"), ad)) == [Foo, Baz]
|
|
215
|
+
# Requests for conflicting versions produce VersionConflict
|
|
216
|
+
with pytest.raises(VersionConflict) as vc:
|
|
217
|
+
ws.resolve(parse_requirements("Foo==1.2\nFoo!=1.2"), ad)
|
|
218
|
+
|
|
219
|
+
msg = 'Foo 0.9 is installed but Foo==1.2 is required'
|
|
220
|
+
assert vc.value.report() == msg
|
|
221
|
+
|
|
222
|
+
def test_environment_marker_evaluation_negative(self):
|
|
223
|
+
"""Environment markers are evaluated at resolution time."""
|
|
224
|
+
ad = pkg_resources.Environment([])
|
|
225
|
+
ws = WorkingSet([])
|
|
226
|
+
res = ws.resolve(parse_requirements("Foo;python_version<'2'"), ad)
|
|
227
|
+
assert list(res) == []
|
|
228
|
+
|
|
229
|
+
def test_environment_marker_evaluation_positive(self):
|
|
230
|
+
ad = pkg_resources.Environment([])
|
|
231
|
+
ws = WorkingSet([])
|
|
232
|
+
Foo = Distribution.from_filename("/foo_dir/Foo-1.2.dist-info")
|
|
233
|
+
ad.add(Foo)
|
|
234
|
+
res = ws.resolve(parse_requirements("Foo;python_version>='2'"), ad)
|
|
235
|
+
assert list(res) == [Foo]
|
|
236
|
+
|
|
237
|
+
def test_environment_marker_evaluation_called(self):
|
|
238
|
+
"""
|
|
239
|
+
If one package foo requires bar without any extras,
|
|
240
|
+
markers should pass for bar without extras.
|
|
241
|
+
"""
|
|
242
|
+
(parent_req,) = parse_requirements("foo")
|
|
243
|
+
(req,) = parse_requirements("bar;python_version>='2'")
|
|
244
|
+
req_extras = pkg_resources._ReqExtras({req: parent_req.extras})
|
|
245
|
+
assert req_extras.markers_pass(req)
|
|
246
|
+
|
|
247
|
+
(parent_req,) = parse_requirements("foo[]")
|
|
248
|
+
(req,) = parse_requirements("bar;python_version>='2'")
|
|
249
|
+
req_extras = pkg_resources._ReqExtras({req: parent_req.extras})
|
|
250
|
+
assert req_extras.markers_pass(req)
|
|
251
|
+
|
|
252
|
+
def test_marker_evaluation_with_extras(self):
|
|
253
|
+
"""Extras are also evaluated as markers at resolution time."""
|
|
254
|
+
ad = pkg_resources.Environment([])
|
|
255
|
+
ws = WorkingSet([])
|
|
256
|
+
Foo = Distribution.from_filename(
|
|
257
|
+
"/foo_dir/Foo-1.2.dist-info",
|
|
258
|
+
metadata=Metadata((
|
|
259
|
+
"METADATA",
|
|
260
|
+
"Provides-Extra: baz\nRequires-Dist: quux; extra=='baz'",
|
|
261
|
+
)),
|
|
262
|
+
)
|
|
263
|
+
ad.add(Foo)
|
|
264
|
+
assert list(ws.resolve(parse_requirements("Foo"), ad)) == [Foo]
|
|
265
|
+
quux = Distribution.from_filename("/foo_dir/quux-1.0.dist-info")
|
|
266
|
+
ad.add(quux)
|
|
267
|
+
res = list(ws.resolve(parse_requirements("Foo[baz]"), ad))
|
|
268
|
+
assert res == [Foo, quux]
|
|
269
|
+
|
|
270
|
+
def test_marker_evaluation_with_extras_normlized(self):
|
|
271
|
+
"""Extras are also evaluated as markers at resolution time."""
|
|
272
|
+
ad = pkg_resources.Environment([])
|
|
273
|
+
ws = WorkingSet([])
|
|
274
|
+
Foo = Distribution.from_filename(
|
|
275
|
+
"/foo_dir/Foo-1.2.dist-info",
|
|
276
|
+
metadata=Metadata((
|
|
277
|
+
"METADATA",
|
|
278
|
+
"Provides-Extra: baz-lightyear\n"
|
|
279
|
+
"Requires-Dist: quux; extra=='baz-lightyear'",
|
|
280
|
+
)),
|
|
281
|
+
)
|
|
282
|
+
ad.add(Foo)
|
|
283
|
+
assert list(ws.resolve(parse_requirements("Foo"), ad)) == [Foo]
|
|
284
|
+
quux = Distribution.from_filename("/foo_dir/quux-1.0.dist-info")
|
|
285
|
+
ad.add(quux)
|
|
286
|
+
res = list(ws.resolve(parse_requirements("Foo[baz-lightyear]"), ad))
|
|
287
|
+
assert res == [Foo, quux]
|
|
288
|
+
|
|
289
|
+
def test_marker_evaluation_with_multiple_extras(self):
|
|
290
|
+
ad = pkg_resources.Environment([])
|
|
291
|
+
ws = WorkingSet([])
|
|
292
|
+
Foo = Distribution.from_filename(
|
|
293
|
+
"/foo_dir/Foo-1.2.dist-info",
|
|
294
|
+
metadata=Metadata((
|
|
295
|
+
"METADATA",
|
|
296
|
+
"Provides-Extra: baz\n"
|
|
297
|
+
"Requires-Dist: quux; extra=='baz'\n"
|
|
298
|
+
"Provides-Extra: bar\n"
|
|
299
|
+
"Requires-Dist: fred; extra=='bar'\n",
|
|
300
|
+
)),
|
|
301
|
+
)
|
|
302
|
+
ad.add(Foo)
|
|
303
|
+
quux = Distribution.from_filename("/foo_dir/quux-1.0.dist-info")
|
|
304
|
+
ad.add(quux)
|
|
305
|
+
fred = Distribution.from_filename("/foo_dir/fred-0.1.dist-info")
|
|
306
|
+
ad.add(fred)
|
|
307
|
+
res = list(ws.resolve(parse_requirements("Foo[baz,bar]"), ad))
|
|
308
|
+
assert sorted(res) == [fred, quux, Foo]
|
|
309
|
+
|
|
310
|
+
def test_marker_evaluation_with_extras_loop(self):
|
|
311
|
+
ad = pkg_resources.Environment([])
|
|
312
|
+
ws = WorkingSet([])
|
|
313
|
+
a = Distribution.from_filename(
|
|
314
|
+
"/foo_dir/a-0.2.dist-info",
|
|
315
|
+
metadata=Metadata(("METADATA", "Requires-Dist: c[a]")),
|
|
316
|
+
)
|
|
317
|
+
b = Distribution.from_filename(
|
|
318
|
+
"/foo_dir/b-0.3.dist-info",
|
|
319
|
+
metadata=Metadata(("METADATA", "Requires-Dist: c[b]")),
|
|
320
|
+
)
|
|
321
|
+
c = Distribution.from_filename(
|
|
322
|
+
"/foo_dir/c-1.0.dist-info",
|
|
323
|
+
metadata=Metadata((
|
|
324
|
+
"METADATA",
|
|
325
|
+
"Provides-Extra: a\n"
|
|
326
|
+
"Requires-Dist: b;extra=='a'\n"
|
|
327
|
+
"Provides-Extra: b\n"
|
|
328
|
+
"Requires-Dist: foo;extra=='b'",
|
|
329
|
+
)),
|
|
330
|
+
)
|
|
331
|
+
foo = Distribution.from_filename("/foo_dir/foo-0.1.dist-info")
|
|
332
|
+
for dist in (a, b, c, foo):
|
|
333
|
+
ad.add(dist)
|
|
334
|
+
res = list(ws.resolve(parse_requirements("a"), ad))
|
|
335
|
+
assert res == [a, c, b, foo]
|
|
336
|
+
|
|
337
|
+
@pytest.mark.xfail(
|
|
338
|
+
sys.version_info[:2] == (3, 12) and sys.version_info.releaselevel != 'final',
|
|
339
|
+
reason="https://github.com/python/cpython/issues/103632",
|
|
340
|
+
)
|
|
341
|
+
def testDistroDependsOptions(self):
|
|
342
|
+
d = self.distRequires(
|
|
343
|
+
"""
|
|
344
|
+
Twisted>=1.5
|
|
345
|
+
[docgen]
|
|
346
|
+
ZConfig>=2.0
|
|
347
|
+
docutils>=0.3
|
|
348
|
+
[fastcgi]
|
|
349
|
+
fcgiapp>=0.1"""
|
|
350
|
+
)
|
|
351
|
+
self.checkRequires(d, "Twisted>=1.5")
|
|
352
|
+
self.checkRequires(
|
|
353
|
+
d, "Twisted>=1.5 ZConfig>=2.0 docutils>=0.3".split(), ["docgen"]
|
|
354
|
+
)
|
|
355
|
+
self.checkRequires(d, "Twisted>=1.5 fcgiapp>=0.1".split(), ["fastcgi"])
|
|
356
|
+
self.checkRequires(
|
|
357
|
+
d,
|
|
358
|
+
"Twisted>=1.5 ZConfig>=2.0 docutils>=0.3 fcgiapp>=0.1".split(),
|
|
359
|
+
["docgen", "fastcgi"],
|
|
360
|
+
)
|
|
361
|
+
self.checkRequires(
|
|
362
|
+
d,
|
|
363
|
+
"Twisted>=1.5 fcgiapp>=0.1 ZConfig>=2.0 docutils>=0.3".split(),
|
|
364
|
+
["fastcgi", "docgen"],
|
|
365
|
+
)
|
|
366
|
+
with pytest.raises(pkg_resources.UnknownExtra):
|
|
367
|
+
d.requires(["foo"])
|
|
368
|
+
|
|
369
|
+
|
|
370
|
+
class TestWorkingSet:
|
|
371
|
+
def test_find_conflicting(self):
|
|
372
|
+
ws = WorkingSet([])
|
|
373
|
+
Foo = Distribution.from_filename("/foo_dir/Foo-1.2.egg")
|
|
374
|
+
ws.add(Foo)
|
|
375
|
+
|
|
376
|
+
# create a requirement that conflicts with Foo 1.2
|
|
377
|
+
req = next(parse_requirements("Foo<1.2"))
|
|
378
|
+
|
|
379
|
+
with pytest.raises(VersionConflict) as vc:
|
|
380
|
+
ws.find(req)
|
|
381
|
+
|
|
382
|
+
msg = 'Foo 1.2 is installed but Foo<1.2 is required'
|
|
383
|
+
assert vc.value.report() == msg
|
|
384
|
+
|
|
385
|
+
def test_resolve_conflicts_with_prior(self):
|
|
386
|
+
"""
|
|
387
|
+
A ContextualVersionConflict should be raised when a requirement
|
|
388
|
+
conflicts with a prior requirement for a different package.
|
|
389
|
+
"""
|
|
390
|
+
# Create installation where Foo depends on Baz 1.0 and Bar depends on
|
|
391
|
+
# Baz 2.0.
|
|
392
|
+
ws = WorkingSet([])
|
|
393
|
+
md = Metadata(('depends.txt', "Baz==1.0"))
|
|
394
|
+
Foo = Distribution.from_filename("/foo_dir/Foo-1.0.egg", metadata=md)
|
|
395
|
+
ws.add(Foo)
|
|
396
|
+
md = Metadata(('depends.txt', "Baz==2.0"))
|
|
397
|
+
Bar = Distribution.from_filename("/foo_dir/Bar-1.0.egg", metadata=md)
|
|
398
|
+
ws.add(Bar)
|
|
399
|
+
Baz = Distribution.from_filename("/foo_dir/Baz-1.0.egg")
|
|
400
|
+
ws.add(Baz)
|
|
401
|
+
Baz = Distribution.from_filename("/foo_dir/Baz-2.0.egg")
|
|
402
|
+
ws.add(Baz)
|
|
403
|
+
|
|
404
|
+
with pytest.raises(VersionConflict) as vc:
|
|
405
|
+
ws.resolve(parse_requirements("Foo\nBar\n"))
|
|
406
|
+
|
|
407
|
+
msg = "Baz 1.0 is installed but Baz==2.0 is required by "
|
|
408
|
+
msg += repr(set(['Bar']))
|
|
409
|
+
assert vc.value.report() == msg
|
|
410
|
+
|
|
411
|
+
|
|
412
|
+
class TestEntryPoints:
|
|
413
|
+
def assertfields(self, ep):
|
|
414
|
+
assert ep.name == "foo"
|
|
415
|
+
assert ep.module_name == "pkg_resources.tests.test_resources"
|
|
416
|
+
assert ep.attrs == ("TestEntryPoints",)
|
|
417
|
+
assert ep.extras == ("x",)
|
|
418
|
+
assert ep.load() is TestEntryPoints
|
|
419
|
+
expect = "foo = pkg_resources.tests.test_resources:TestEntryPoints [x]"
|
|
420
|
+
assert str(ep) == expect
|
|
421
|
+
|
|
422
|
+
def setup_method(self, method):
|
|
423
|
+
self.dist = Distribution.from_filename(
|
|
424
|
+
"FooPkg-1.2-py2.4.egg", metadata=Metadata(('requires.txt', '[x]'))
|
|
425
|
+
)
|
|
426
|
+
|
|
427
|
+
def testBasics(self):
|
|
428
|
+
ep = EntryPoint(
|
|
429
|
+
"foo",
|
|
430
|
+
"pkg_resources.tests.test_resources",
|
|
431
|
+
["TestEntryPoints"],
|
|
432
|
+
["x"],
|
|
433
|
+
self.dist,
|
|
434
|
+
)
|
|
435
|
+
self.assertfields(ep)
|
|
436
|
+
|
|
437
|
+
def testParse(self):
|
|
438
|
+
s = "foo = pkg_resources.tests.test_resources:TestEntryPoints [x]"
|
|
439
|
+
ep = EntryPoint.parse(s, self.dist)
|
|
440
|
+
self.assertfields(ep)
|
|
441
|
+
|
|
442
|
+
ep = EntryPoint.parse("bar baz= spammity[PING]")
|
|
443
|
+
assert ep.name == "bar baz"
|
|
444
|
+
assert ep.module_name == "spammity"
|
|
445
|
+
assert ep.attrs == ()
|
|
446
|
+
assert ep.extras == ("ping",)
|
|
447
|
+
|
|
448
|
+
ep = EntryPoint.parse(" fizzly = wocka:foo")
|
|
449
|
+
assert ep.name == "fizzly"
|
|
450
|
+
assert ep.module_name == "wocka"
|
|
451
|
+
assert ep.attrs == ("foo",)
|
|
452
|
+
assert ep.extras == ()
|
|
453
|
+
|
|
454
|
+
# plus in the name
|
|
455
|
+
spec = "html+mako = mako.ext.pygmentplugin:MakoHtmlLexer"
|
|
456
|
+
ep = EntryPoint.parse(spec)
|
|
457
|
+
assert ep.name == 'html+mako'
|
|
458
|
+
|
|
459
|
+
reject_specs = "foo", "x=a:b:c", "q=x/na", "fez=pish:tush-z", "x=f[a]>2"
|
|
460
|
+
|
|
461
|
+
@pytest.mark.parametrize("reject_spec", reject_specs)
|
|
462
|
+
def test_reject_spec(self, reject_spec):
|
|
463
|
+
with pytest.raises(ValueError):
|
|
464
|
+
EntryPoint.parse(reject_spec)
|
|
465
|
+
|
|
466
|
+
def test_printable_name(self):
|
|
467
|
+
"""
|
|
468
|
+
Allow any printable character in the name.
|
|
469
|
+
"""
|
|
470
|
+
# Create a name with all printable characters; strip the whitespace.
|
|
471
|
+
name = string.printable.strip()
|
|
472
|
+
spec = "{name} = module:attr".format(**locals())
|
|
473
|
+
ep = EntryPoint.parse(spec)
|
|
474
|
+
assert ep.name == name
|
|
475
|
+
|
|
476
|
+
def checkSubMap(self, m):
|
|
477
|
+
assert len(m) == len(self.submap_expect)
|
|
478
|
+
for key, ep in self.submap_expect.items():
|
|
479
|
+
assert m.get(key).name == ep.name
|
|
480
|
+
assert m.get(key).module_name == ep.module_name
|
|
481
|
+
assert sorted(m.get(key).attrs) == sorted(ep.attrs)
|
|
482
|
+
assert sorted(m.get(key).extras) == sorted(ep.extras)
|
|
483
|
+
|
|
484
|
+
submap_expect = dict(
|
|
485
|
+
feature1=EntryPoint('feature1', 'somemodule', ['somefunction']),
|
|
486
|
+
feature2=EntryPoint(
|
|
487
|
+
'feature2', 'another.module', ['SomeClass'], ['extra1', 'extra2']
|
|
488
|
+
),
|
|
489
|
+
feature3=EntryPoint('feature3', 'this.module', extras=['something']),
|
|
490
|
+
)
|
|
491
|
+
submap_str = """
|
|
492
|
+
# define features for blah blah
|
|
493
|
+
feature1 = somemodule:somefunction
|
|
494
|
+
feature2 = another.module:SomeClass [extra1,extra2]
|
|
495
|
+
feature3 = this.module [something]
|
|
496
|
+
"""
|
|
497
|
+
|
|
498
|
+
def testParseList(self):
|
|
499
|
+
self.checkSubMap(EntryPoint.parse_group("xyz", self.submap_str))
|
|
500
|
+
with pytest.raises(ValueError):
|
|
501
|
+
EntryPoint.parse_group("x a", "foo=bar")
|
|
502
|
+
with pytest.raises(ValueError):
|
|
503
|
+
EntryPoint.parse_group("x", ["foo=baz", "foo=bar"])
|
|
504
|
+
|
|
505
|
+
def testParseMap(self):
|
|
506
|
+
m = EntryPoint.parse_map({'xyz': self.submap_str})
|
|
507
|
+
self.checkSubMap(m['xyz'])
|
|
508
|
+
assert list(m.keys()) == ['xyz']
|
|
509
|
+
m = EntryPoint.parse_map("[xyz]\n" + self.submap_str)
|
|
510
|
+
self.checkSubMap(m['xyz'])
|
|
511
|
+
assert list(m.keys()) == ['xyz']
|
|
512
|
+
with pytest.raises(ValueError):
|
|
513
|
+
EntryPoint.parse_map(["[xyz]", "[xyz]"])
|
|
514
|
+
with pytest.raises(ValueError):
|
|
515
|
+
EntryPoint.parse_map(self.submap_str)
|
|
516
|
+
|
|
517
|
+
def testDeprecationWarnings(self):
|
|
518
|
+
ep = EntryPoint(
|
|
519
|
+
"foo", "pkg_resources.tests.test_resources", ["TestEntryPoints"], ["x"]
|
|
520
|
+
)
|
|
521
|
+
with pytest.warns(pkg_resources.PkgResourcesDeprecationWarning):
|
|
522
|
+
ep.load(require=False)
|
|
523
|
+
|
|
524
|
+
|
|
525
|
+
class TestRequirements:
|
|
526
|
+
def testBasics(self):
|
|
527
|
+
r = Requirement.parse("Twisted>=1.2")
|
|
528
|
+
assert str(r) == "Twisted>=1.2"
|
|
529
|
+
assert repr(r) == "Requirement.parse('Twisted>=1.2')"
|
|
530
|
+
assert r == Requirement("Twisted>=1.2")
|
|
531
|
+
assert r == Requirement("twisTed>=1.2")
|
|
532
|
+
assert r != Requirement("Twisted>=2.0")
|
|
533
|
+
assert r != Requirement("Zope>=1.2")
|
|
534
|
+
assert r != Requirement("Zope>=3.0")
|
|
535
|
+
assert r != Requirement("Twisted[extras]>=1.2")
|
|
536
|
+
|
|
537
|
+
def testOrdering(self):
|
|
538
|
+
r1 = Requirement("Twisted==1.2c1,>=1.2")
|
|
539
|
+
r2 = Requirement("Twisted>=1.2,==1.2c1")
|
|
540
|
+
assert r1 == r2
|
|
541
|
+
assert str(r1) == str(r2)
|
|
542
|
+
assert str(r2) == "Twisted==1.2c1,>=1.2"
|
|
543
|
+
assert Requirement("Twisted") != Requirement(
|
|
544
|
+
"Twisted @ https://localhost/twisted.zip"
|
|
545
|
+
)
|
|
546
|
+
|
|
547
|
+
def testBasicContains(self):
|
|
548
|
+
r = Requirement("Twisted>=1.2")
|
|
549
|
+
foo_dist = Distribution.from_filename("FooPkg-1.3_1.egg")
|
|
550
|
+
twist11 = Distribution.from_filename("Twisted-1.1.egg")
|
|
551
|
+
twist12 = Distribution.from_filename("Twisted-1.2.egg")
|
|
552
|
+
assert parse_version('1.2') in r
|
|
553
|
+
assert parse_version('1.1') not in r
|
|
554
|
+
assert '1.2' in r
|
|
555
|
+
assert '1.1' not in r
|
|
556
|
+
assert foo_dist not in r
|
|
557
|
+
assert twist11 not in r
|
|
558
|
+
assert twist12 in r
|
|
559
|
+
|
|
560
|
+
def testOptionsAndHashing(self):
|
|
561
|
+
r1 = Requirement.parse("Twisted[foo,bar]>=1.2")
|
|
562
|
+
r2 = Requirement.parse("Twisted[bar,FOO]>=1.2")
|
|
563
|
+
assert r1 == r2
|
|
564
|
+
assert set(r1.extras) == set(("foo", "bar"))
|
|
565
|
+
assert set(r2.extras) == set(("foo", "bar"))
|
|
566
|
+
assert hash(r1) == hash(r2)
|
|
567
|
+
assert hash(r1) == hash((
|
|
568
|
+
"twisted",
|
|
569
|
+
None,
|
|
570
|
+
SpecifierSet(">=1.2"),
|
|
571
|
+
frozenset(["foo", "bar"]),
|
|
572
|
+
None,
|
|
573
|
+
))
|
|
574
|
+
assert hash(
|
|
575
|
+
Requirement.parse("Twisted @ https://localhost/twisted.zip")
|
|
576
|
+
) == hash((
|
|
577
|
+
"twisted",
|
|
578
|
+
"https://localhost/twisted.zip",
|
|
579
|
+
SpecifierSet(),
|
|
580
|
+
frozenset(),
|
|
581
|
+
None,
|
|
582
|
+
))
|
|
583
|
+
|
|
584
|
+
def testVersionEquality(self):
|
|
585
|
+
r1 = Requirement.parse("foo==0.3a2")
|
|
586
|
+
r2 = Requirement.parse("foo!=0.3a4")
|
|
587
|
+
d = Distribution.from_filename
|
|
588
|
+
|
|
589
|
+
assert d("foo-0.3a4.egg") not in r1
|
|
590
|
+
assert d("foo-0.3a1.egg") not in r1
|
|
591
|
+
assert d("foo-0.3a4.egg") not in r2
|
|
592
|
+
|
|
593
|
+
assert d("foo-0.3a2.egg") in r1
|
|
594
|
+
assert d("foo-0.3a2.egg") in r2
|
|
595
|
+
assert d("foo-0.3a3.egg") in r2
|
|
596
|
+
assert d("foo-0.3a5.egg") in r2
|
|
597
|
+
|
|
598
|
+
def testSetuptoolsProjectName(self):
|
|
599
|
+
"""
|
|
600
|
+
The setuptools project should implement the setuptools package.
|
|
601
|
+
"""
|
|
602
|
+
|
|
603
|
+
assert Requirement.parse('setuptools').project_name == 'setuptools'
|
|
604
|
+
# setuptools 0.7 and higher means setuptools.
|
|
605
|
+
assert Requirement.parse('setuptools == 0.7').project_name == 'setuptools'
|
|
606
|
+
assert Requirement.parse('setuptools == 0.7a1').project_name == 'setuptools'
|
|
607
|
+
assert Requirement.parse('setuptools >= 0.7').project_name == 'setuptools'
|
|
608
|
+
|
|
609
|
+
|
|
610
|
+
class TestParsing:
|
|
611
|
+
def testEmptyParse(self):
|
|
612
|
+
assert list(parse_requirements('')) == []
|
|
613
|
+
|
|
614
|
+
def testYielding(self):
|
|
615
|
+
for inp, out in [
|
|
616
|
+
([], []),
|
|
617
|
+
('x', ['x']),
|
|
618
|
+
([[]], []),
|
|
619
|
+
(' x\n y', ['x', 'y']),
|
|
620
|
+
(['x\n\n', 'y'], ['x', 'y']),
|
|
621
|
+
]:
|
|
622
|
+
assert list(pkg_resources.yield_lines(inp)) == out
|
|
623
|
+
|
|
624
|
+
def testSplitting(self):
|
|
625
|
+
sample = """
|
|
626
|
+
x
|
|
627
|
+
[Y]
|
|
628
|
+
z
|
|
629
|
+
|
|
630
|
+
a
|
|
631
|
+
[b ]
|
|
632
|
+
# foo
|
|
633
|
+
c
|
|
634
|
+
[ d]
|
|
635
|
+
[q]
|
|
636
|
+
v
|
|
637
|
+
"""
|
|
638
|
+
assert list(pkg_resources.split_sections(sample)) == [
|
|
639
|
+
(None, ["x"]),
|
|
640
|
+
("Y", ["z", "a"]),
|
|
641
|
+
("b", ["c"]),
|
|
642
|
+
("d", []),
|
|
643
|
+
("q", ["v"]),
|
|
644
|
+
]
|
|
645
|
+
with pytest.raises(ValueError):
|
|
646
|
+
list(pkg_resources.split_sections("[foo"))
|
|
647
|
+
|
|
648
|
+
def testSafeName(self):
|
|
649
|
+
assert safe_name("adns-python") == "adns-python"
|
|
650
|
+
assert safe_name("WSGI Utils") == "WSGI-Utils"
|
|
651
|
+
assert safe_name("WSGI Utils") == "WSGI-Utils"
|
|
652
|
+
assert safe_name("Money$$$Maker") == "Money-Maker"
|
|
653
|
+
assert safe_name("peak.web") != "peak-web"
|
|
654
|
+
|
|
655
|
+
def testSafeVersion(self):
|
|
656
|
+
assert safe_version("1.2-1") == "1.2.post1"
|
|
657
|
+
assert safe_version("1.2 alpha") == "1.2.alpha"
|
|
658
|
+
assert safe_version("2.3.4 20050521") == "2.3.4.20050521"
|
|
659
|
+
assert safe_version("Money$$$Maker") == "Money-Maker"
|
|
660
|
+
assert safe_version("peak.web") == "peak.web"
|
|
661
|
+
|
|
662
|
+
def testSimpleRequirements(self):
|
|
663
|
+
assert list(parse_requirements('Twis-Ted>=1.2-1')) == [
|
|
664
|
+
Requirement('Twis-Ted>=1.2-1')
|
|
665
|
+
]
|
|
666
|
+
assert list(parse_requirements('Twisted >=1.2, \\ # more\n<2.0')) == [
|
|
667
|
+
Requirement('Twisted>=1.2,<2.0')
|
|
668
|
+
]
|
|
669
|
+
assert Requirement.parse("FooBar==1.99a3") == Requirement("FooBar==1.99a3")
|
|
670
|
+
with pytest.raises(ValueError):
|
|
671
|
+
Requirement.parse(">=2.3")
|
|
672
|
+
with pytest.raises(ValueError):
|
|
673
|
+
Requirement.parse("x\\")
|
|
674
|
+
with pytest.raises(ValueError):
|
|
675
|
+
Requirement.parse("x==2 q")
|
|
676
|
+
with pytest.raises(ValueError):
|
|
677
|
+
Requirement.parse("X==1\nY==2")
|
|
678
|
+
with pytest.raises(ValueError):
|
|
679
|
+
Requirement.parse("#")
|
|
680
|
+
|
|
681
|
+
def test_requirements_with_markers(self):
|
|
682
|
+
assert Requirement.parse("foobar;os_name=='a'") == Requirement.parse(
|
|
683
|
+
"foobar;os_name=='a'"
|
|
684
|
+
)
|
|
685
|
+
assert Requirement.parse(
|
|
686
|
+
"name==1.1;python_version=='2.7'"
|
|
687
|
+
) != Requirement.parse("name==1.1;python_version=='3.6'")
|
|
688
|
+
assert Requirement.parse(
|
|
689
|
+
"name==1.0;python_version=='2.7'"
|
|
690
|
+
) != Requirement.parse("name==1.2;python_version=='2.7'")
|
|
691
|
+
assert Requirement.parse(
|
|
692
|
+
"name[foo]==1.0;python_version=='3.6'"
|
|
693
|
+
) != Requirement.parse("name[foo,bar]==1.0;python_version=='3.6'")
|
|
694
|
+
|
|
695
|
+
def test_local_version(self):
|
|
696
|
+
parse_requirements('foo==1.0+org1')
|
|
697
|
+
|
|
698
|
+
def test_spaces_between_multiple_versions(self):
|
|
699
|
+
parse_requirements('foo>=1.0, <3')
|
|
700
|
+
parse_requirements('foo >= 1.0, < 3')
|
|
701
|
+
|
|
702
|
+
@pytest.mark.parametrize(
|
|
703
|
+
("lower", "upper"),
|
|
704
|
+
[
|
|
705
|
+
('1.2-rc1', '1.2rc1'),
|
|
706
|
+
('0.4', '0.4.0'),
|
|
707
|
+
('0.4.0.0', '0.4.0'),
|
|
708
|
+
('0.4.0-0', '0.4-0'),
|
|
709
|
+
('0post1', '0.0post1'),
|
|
710
|
+
('0pre1', '0.0c1'),
|
|
711
|
+
('0.0.0preview1', '0c1'),
|
|
712
|
+
('0.0c1', '0-rc1'),
|
|
713
|
+
('1.2a1', '1.2.a.1'),
|
|
714
|
+
('1.2.a', '1.2a'),
|
|
715
|
+
],
|
|
716
|
+
)
|
|
717
|
+
def testVersionEquality(self, lower, upper):
|
|
718
|
+
assert parse_version(lower) == parse_version(upper)
|
|
719
|
+
|
|
720
|
+
torture = """
|
|
721
|
+
0.80.1-3 0.80.1-2 0.80.1-1 0.79.9999+0.80.0pre4-1
|
|
722
|
+
0.79.9999+0.80.0pre2-3 0.79.9999+0.80.0pre2-2
|
|
723
|
+
0.77.2-1 0.77.1-1 0.77.0-1
|
|
724
|
+
"""
|
|
725
|
+
|
|
726
|
+
@pytest.mark.parametrize(
|
|
727
|
+
("lower", "upper"),
|
|
728
|
+
[
|
|
729
|
+
('2.1', '2.1.1'),
|
|
730
|
+
('2a1', '2b0'),
|
|
731
|
+
('2a1', '2.1'),
|
|
732
|
+
('2.3a1', '2.3'),
|
|
733
|
+
('2.1-1', '2.1-2'),
|
|
734
|
+
('2.1-1', '2.1.1'),
|
|
735
|
+
('2.1', '2.1post4'),
|
|
736
|
+
('2.1a0-20040501', '2.1'),
|
|
737
|
+
('1.1', '02.1'),
|
|
738
|
+
('3.2', '3.2.post0'),
|
|
739
|
+
('3.2post1', '3.2post2'),
|
|
740
|
+
('0.4', '4.0'),
|
|
741
|
+
('0.0.4', '0.4.0'),
|
|
742
|
+
('0post1', '0.4post1'),
|
|
743
|
+
('2.1.0-rc1', '2.1.0'),
|
|
744
|
+
('2.1dev', '2.1a0'),
|
|
745
|
+
]
|
|
746
|
+
+ list(pairwise(reversed(torture.split()))),
|
|
747
|
+
)
|
|
748
|
+
def testVersionOrdering(self, lower, upper):
|
|
749
|
+
assert parse_version(lower) < parse_version(upper)
|
|
750
|
+
|
|
751
|
+
def testVersionHashable(self):
|
|
752
|
+
"""
|
|
753
|
+
Ensure that our versions stay hashable even though we've subclassed
|
|
754
|
+
them and added some shim code to them.
|
|
755
|
+
"""
|
|
756
|
+
assert hash(parse_version("1.0")) == hash(parse_version("1.0"))
|
|
757
|
+
|
|
758
|
+
|
|
759
|
+
class TestNamespaces:
|
|
760
|
+
ns_str = "__import__('pkg_resources').declare_namespace(__name__)\n"
|
|
761
|
+
|
|
762
|
+
@pytest.fixture
|
|
763
|
+
def symlinked_tmpdir(self, tmpdir):
|
|
764
|
+
"""
|
|
765
|
+
Where available, return the tempdir as a symlink,
|
|
766
|
+
which as revealed in #231 is more fragile than
|
|
767
|
+
a natural tempdir.
|
|
768
|
+
"""
|
|
769
|
+
if not hasattr(os, 'symlink'):
|
|
770
|
+
yield str(tmpdir)
|
|
771
|
+
return
|
|
772
|
+
|
|
773
|
+
link_name = str(tmpdir) + '-linked'
|
|
774
|
+
os.symlink(str(tmpdir), link_name)
|
|
775
|
+
try:
|
|
776
|
+
yield type(tmpdir)(link_name)
|
|
777
|
+
finally:
|
|
778
|
+
os.unlink(link_name)
|
|
779
|
+
|
|
780
|
+
@pytest.fixture(autouse=True)
|
|
781
|
+
def patched_path(self, tmpdir):
|
|
782
|
+
"""
|
|
783
|
+
Patch sys.path to include the 'site-pkgs' dir. Also
|
|
784
|
+
restore pkg_resources._namespace_packages to its
|
|
785
|
+
former state.
|
|
786
|
+
"""
|
|
787
|
+
saved_ns_pkgs = pkg_resources._namespace_packages.copy()
|
|
788
|
+
saved_sys_path = sys.path[:]
|
|
789
|
+
site_pkgs = tmpdir.mkdir('site-pkgs')
|
|
790
|
+
sys.path.append(str(site_pkgs))
|
|
791
|
+
try:
|
|
792
|
+
yield
|
|
793
|
+
finally:
|
|
794
|
+
pkg_resources._namespace_packages = saved_ns_pkgs
|
|
795
|
+
sys.path = saved_sys_path
|
|
796
|
+
|
|
797
|
+
issue591 = pytest.mark.xfail(platform.system() == 'Windows', reason="#591")
|
|
798
|
+
|
|
799
|
+
@issue591
|
|
800
|
+
def test_two_levels_deep(self, symlinked_tmpdir):
|
|
801
|
+
"""
|
|
802
|
+
Test nested namespace packages
|
|
803
|
+
Create namespace packages in the following tree :
|
|
804
|
+
site-packages-1/pkg1/pkg2
|
|
805
|
+
site-packages-2/pkg1/pkg2
|
|
806
|
+
Check both are in the _namespace_packages dict and that their __path__
|
|
807
|
+
is correct
|
|
808
|
+
"""
|
|
809
|
+
real_tmpdir = symlinked_tmpdir.realpath()
|
|
810
|
+
tmpdir = symlinked_tmpdir
|
|
811
|
+
sys.path.append(str(tmpdir / 'site-pkgs2'))
|
|
812
|
+
site_dirs = tmpdir / 'site-pkgs', tmpdir / 'site-pkgs2'
|
|
813
|
+
for site in site_dirs:
|
|
814
|
+
pkg1 = site / 'pkg1'
|
|
815
|
+
pkg2 = pkg1 / 'pkg2'
|
|
816
|
+
pkg2.ensure_dir()
|
|
817
|
+
(pkg1 / '__init__.py').write_text(self.ns_str, encoding='utf-8')
|
|
818
|
+
(pkg2 / '__init__.py').write_text(self.ns_str, encoding='utf-8')
|
|
819
|
+
with pytest.warns(DeprecationWarning, match="pkg_resources.declare_namespace"):
|
|
820
|
+
import pkg1 # pyright: ignore[reportMissingImports] # Temporary package for test
|
|
821
|
+
assert "pkg1" in pkg_resources._namespace_packages
|
|
822
|
+
# attempt to import pkg2 from site-pkgs2
|
|
823
|
+
with pytest.warns(DeprecationWarning, match="pkg_resources.declare_namespace"):
|
|
824
|
+
import pkg1.pkg2 # pyright: ignore[reportMissingImports] # Temporary package for test
|
|
825
|
+
# check the _namespace_packages dict
|
|
826
|
+
assert "pkg1.pkg2" in pkg_resources._namespace_packages
|
|
827
|
+
assert pkg_resources._namespace_packages["pkg1"] == ["pkg1.pkg2"]
|
|
828
|
+
# check the __path__ attribute contains both paths
|
|
829
|
+
expected = [
|
|
830
|
+
str(real_tmpdir / "site-pkgs" / "pkg1" / "pkg2"),
|
|
831
|
+
str(real_tmpdir / "site-pkgs2" / "pkg1" / "pkg2"),
|
|
832
|
+
]
|
|
833
|
+
assert pkg1.pkg2.__path__ == expected
|
|
834
|
+
|
|
835
|
+
@issue591
|
|
836
|
+
def test_path_order(self, symlinked_tmpdir):
|
|
837
|
+
"""
|
|
838
|
+
Test that if multiple versions of the same namespace package subpackage
|
|
839
|
+
are on different sys.path entries, that only the one earliest on
|
|
840
|
+
sys.path is imported, and that the namespace package's __path__ is in
|
|
841
|
+
the correct order.
|
|
842
|
+
|
|
843
|
+
Regression test for https://github.com/pypa/setuptools/issues/207
|
|
844
|
+
"""
|
|
845
|
+
|
|
846
|
+
tmpdir = symlinked_tmpdir
|
|
847
|
+
site_dirs = (
|
|
848
|
+
tmpdir / "site-pkgs",
|
|
849
|
+
tmpdir / "site-pkgs2",
|
|
850
|
+
tmpdir / "site-pkgs3",
|
|
851
|
+
)
|
|
852
|
+
|
|
853
|
+
vers_str = "__version__ = %r"
|
|
854
|
+
|
|
855
|
+
for number, site in enumerate(site_dirs, 1):
|
|
856
|
+
if number > 1:
|
|
857
|
+
sys.path.append(str(site))
|
|
858
|
+
nspkg = site / 'nspkg'
|
|
859
|
+
subpkg = nspkg / 'subpkg'
|
|
860
|
+
subpkg.ensure_dir()
|
|
861
|
+
(nspkg / '__init__.py').write_text(self.ns_str, encoding='utf-8')
|
|
862
|
+
(subpkg / '__init__.py').write_text(vers_str % number, encoding='utf-8')
|
|
863
|
+
|
|
864
|
+
with pytest.warns(DeprecationWarning, match="pkg_resources.declare_namespace"):
|
|
865
|
+
import nspkg # pyright: ignore[reportMissingImports] # Temporary package for test
|
|
866
|
+
import nspkg.subpkg # pyright: ignore[reportMissingImports] # Temporary package for test
|
|
867
|
+
expected = [str(site.realpath() / 'nspkg') for site in site_dirs]
|
|
868
|
+
assert nspkg.__path__ == expected
|
|
869
|
+
assert nspkg.subpkg.__version__ == 1
|