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,247 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import sys
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
|
|
5
|
+
import pytest
|
|
6
|
+
|
|
7
|
+
from setuptools._static import is_static
|
|
8
|
+
from setuptools.config import expand
|
|
9
|
+
from setuptools.discovery import find_package_path
|
|
10
|
+
|
|
11
|
+
from distutils.errors import DistutilsOptionError
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def write_files(files, root_dir):
|
|
15
|
+
for file, content in files.items():
|
|
16
|
+
path = root_dir / file
|
|
17
|
+
path.parent.mkdir(exist_ok=True, parents=True)
|
|
18
|
+
path.write_text(content, encoding="utf-8")
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def test_glob_relative(tmp_path, monkeypatch):
|
|
22
|
+
files = {
|
|
23
|
+
"dir1/dir2/dir3/file1.txt",
|
|
24
|
+
"dir1/dir2/file2.txt",
|
|
25
|
+
"dir1/file3.txt",
|
|
26
|
+
"a.ini",
|
|
27
|
+
"b.ini",
|
|
28
|
+
"dir1/c.ini",
|
|
29
|
+
"dir1/dir2/a.ini",
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
write_files({k: "" for k in files}, tmp_path)
|
|
33
|
+
patterns = ["**/*.txt", "[ab].*", "**/[ac].ini"]
|
|
34
|
+
monkeypatch.chdir(tmp_path)
|
|
35
|
+
assert set(expand.glob_relative(patterns)) == files
|
|
36
|
+
# Make sure the same APIs work outside cwd
|
|
37
|
+
assert set(expand.glob_relative(patterns, tmp_path)) == files
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def test_read_files(tmp_path, monkeypatch):
|
|
41
|
+
dir_ = tmp_path / "dir_"
|
|
42
|
+
(tmp_path / "_dir").mkdir(exist_ok=True)
|
|
43
|
+
(tmp_path / "a.txt").touch()
|
|
44
|
+
files = {"a.txt": "a", "dir1/b.txt": "b", "dir1/dir2/c.txt": "c"}
|
|
45
|
+
write_files(files, dir_)
|
|
46
|
+
|
|
47
|
+
secrets = Path(str(dir_) + "secrets")
|
|
48
|
+
secrets.mkdir(exist_ok=True)
|
|
49
|
+
write_files({"secrets.txt": "secret keys"}, secrets)
|
|
50
|
+
|
|
51
|
+
with monkeypatch.context() as m:
|
|
52
|
+
m.chdir(dir_)
|
|
53
|
+
assert expand.read_files(list(files)) == "a\nb\nc"
|
|
54
|
+
|
|
55
|
+
cannot_access_msg = r"Cannot access '.*\.\..a\.txt'"
|
|
56
|
+
with pytest.raises(DistutilsOptionError, match=cannot_access_msg):
|
|
57
|
+
expand.read_files(["../a.txt"])
|
|
58
|
+
|
|
59
|
+
cannot_access_secrets_msg = r"Cannot access '.*secrets\.txt'"
|
|
60
|
+
with pytest.raises(DistutilsOptionError, match=cannot_access_secrets_msg):
|
|
61
|
+
expand.read_files(["../dir_secrets/secrets.txt"])
|
|
62
|
+
|
|
63
|
+
# Make sure the same APIs work outside cwd
|
|
64
|
+
assert expand.read_files(list(files), dir_) == "a\nb\nc"
|
|
65
|
+
with pytest.raises(DistutilsOptionError, match=cannot_access_msg):
|
|
66
|
+
expand.read_files(["../a.txt"], dir_)
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
class TestReadAttr:
|
|
70
|
+
@pytest.mark.parametrize(
|
|
71
|
+
"example",
|
|
72
|
+
[
|
|
73
|
+
# No cookie means UTF-8:
|
|
74
|
+
b"__version__ = '\xc3\xa9'\nraise SystemExit(1)\n",
|
|
75
|
+
# If a cookie is present, honor it:
|
|
76
|
+
b"# -*- coding: utf-8 -*-\n__version__ = '\xc3\xa9'\nraise SystemExit(1)\n",
|
|
77
|
+
b"# -*- coding: latin1 -*-\n__version__ = '\xe9'\nraise SystemExit(1)\n",
|
|
78
|
+
],
|
|
79
|
+
)
|
|
80
|
+
def test_read_attr_encoding_cookie(self, example, tmp_path):
|
|
81
|
+
(tmp_path / "mod.py").write_bytes(example)
|
|
82
|
+
assert expand.read_attr('mod.__version__', root_dir=tmp_path) == 'é'
|
|
83
|
+
|
|
84
|
+
def test_read_attr(self, tmp_path, monkeypatch):
|
|
85
|
+
files = {
|
|
86
|
+
"pkg/__init__.py": "",
|
|
87
|
+
"pkg/sub/__init__.py": "VERSION = '0.1.1'",
|
|
88
|
+
"pkg/sub/mod.py": (
|
|
89
|
+
"VALUES = {'a': 0, 'b': {42}, 'c': (0, 1, 1)}\nraise SystemExit(1)"
|
|
90
|
+
),
|
|
91
|
+
}
|
|
92
|
+
write_files(files, tmp_path)
|
|
93
|
+
|
|
94
|
+
with monkeypatch.context() as m:
|
|
95
|
+
m.chdir(tmp_path)
|
|
96
|
+
# Make sure it can read the attr statically without evaluating the module
|
|
97
|
+
version = expand.read_attr('pkg.sub.VERSION')
|
|
98
|
+
values = expand.read_attr('lib.mod.VALUES', {'lib': 'pkg/sub'})
|
|
99
|
+
|
|
100
|
+
assert version == '0.1.1'
|
|
101
|
+
assert is_static(values)
|
|
102
|
+
|
|
103
|
+
assert values['a'] == 0
|
|
104
|
+
assert values['b'] == {42}
|
|
105
|
+
assert is_static(values)
|
|
106
|
+
|
|
107
|
+
# Make sure the same APIs work outside cwd
|
|
108
|
+
assert expand.read_attr('pkg.sub.VERSION', root_dir=tmp_path) == '0.1.1'
|
|
109
|
+
values = expand.read_attr('lib.mod.VALUES', {'lib': 'pkg/sub'}, tmp_path)
|
|
110
|
+
assert values['c'] == (0, 1, 1)
|
|
111
|
+
|
|
112
|
+
@pytest.mark.parametrize(
|
|
113
|
+
"example",
|
|
114
|
+
[
|
|
115
|
+
"VERSION: str\nVERSION = '0.1.1'\nraise SystemExit(1)\n",
|
|
116
|
+
"VERSION: str = '0.1.1'\nraise SystemExit(1)\n",
|
|
117
|
+
],
|
|
118
|
+
)
|
|
119
|
+
def test_read_annotated_attr(self, tmp_path, example):
|
|
120
|
+
files = {
|
|
121
|
+
"pkg/__init__.py": "",
|
|
122
|
+
"pkg/sub/__init__.py": example,
|
|
123
|
+
}
|
|
124
|
+
write_files(files, tmp_path)
|
|
125
|
+
# Make sure this attribute can be read statically
|
|
126
|
+
version = expand.read_attr('pkg.sub.VERSION', root_dir=tmp_path)
|
|
127
|
+
assert version == '0.1.1'
|
|
128
|
+
assert is_static(version)
|
|
129
|
+
|
|
130
|
+
@pytest.mark.parametrize(
|
|
131
|
+
"example",
|
|
132
|
+
[
|
|
133
|
+
"VERSION = (lambda: '0.1.1')()\n",
|
|
134
|
+
"def fn(): return '0.1.1'\nVERSION = fn()\n",
|
|
135
|
+
"VERSION: str = (lambda: '0.1.1')()\n",
|
|
136
|
+
],
|
|
137
|
+
)
|
|
138
|
+
def test_read_dynamic_attr(self, tmp_path, monkeypatch, example):
|
|
139
|
+
files = {
|
|
140
|
+
"pkg/__init__.py": "",
|
|
141
|
+
"pkg/sub/__init__.py": example,
|
|
142
|
+
}
|
|
143
|
+
write_files(files, tmp_path)
|
|
144
|
+
monkeypatch.chdir(tmp_path)
|
|
145
|
+
version = expand.read_attr('pkg.sub.VERSION')
|
|
146
|
+
assert version == '0.1.1'
|
|
147
|
+
assert not is_static(version)
|
|
148
|
+
|
|
149
|
+
def test_import_order(self, tmp_path):
|
|
150
|
+
"""
|
|
151
|
+
Sometimes the import machinery will import the parent package of a nested
|
|
152
|
+
module, which triggers side-effects and might create problems (see issue #3176)
|
|
153
|
+
|
|
154
|
+
``read_attr`` should bypass these limitations by resolving modules statically
|
|
155
|
+
(via ast.literal_eval).
|
|
156
|
+
"""
|
|
157
|
+
files = {
|
|
158
|
+
"src/pkg/__init__.py": "from .main import func\nfrom .about import version",
|
|
159
|
+
"src/pkg/main.py": "import super_complicated_dep\ndef func(): return 42",
|
|
160
|
+
"src/pkg/about.py": "version = '42'",
|
|
161
|
+
}
|
|
162
|
+
write_files(files, tmp_path)
|
|
163
|
+
attr_desc = "pkg.about.version"
|
|
164
|
+
package_dir = {"": "src"}
|
|
165
|
+
# `import super_complicated_dep` should not run, otherwise the build fails
|
|
166
|
+
assert expand.read_attr(attr_desc, package_dir, tmp_path) == "42"
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
@pytest.mark.parametrize(
|
|
170
|
+
("package_dir", "file", "module", "return_value"),
|
|
171
|
+
[
|
|
172
|
+
({"": "src"}, "src/pkg/main.py", "pkg.main", 42),
|
|
173
|
+
({"pkg": "lib"}, "lib/main.py", "pkg.main", 13),
|
|
174
|
+
({}, "single_module.py", "single_module", 70),
|
|
175
|
+
({}, "flat_layout/pkg.py", "flat_layout.pkg", 836),
|
|
176
|
+
],
|
|
177
|
+
)
|
|
178
|
+
def test_resolve_class(monkeypatch, tmp_path, package_dir, file, module, return_value):
|
|
179
|
+
monkeypatch.setattr(sys, "modules", {}) # reproducibility
|
|
180
|
+
files = {file: f"class Custom:\n def testing(self): return {return_value}"}
|
|
181
|
+
write_files(files, tmp_path)
|
|
182
|
+
cls = expand.resolve_class(f"{module}.Custom", package_dir, tmp_path)
|
|
183
|
+
assert cls().testing() == return_value
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
@pytest.mark.parametrize(
|
|
187
|
+
("args", "pkgs"),
|
|
188
|
+
[
|
|
189
|
+
({"where": ["."], "namespaces": False}, {"pkg", "other"}),
|
|
190
|
+
({"where": [".", "dir1"], "namespaces": False}, {"pkg", "other", "dir2"}),
|
|
191
|
+
({"namespaces": True}, {"pkg", "other", "dir1", "dir1.dir2"}),
|
|
192
|
+
({}, {"pkg", "other", "dir1", "dir1.dir2"}), # default value for `namespaces`
|
|
193
|
+
],
|
|
194
|
+
)
|
|
195
|
+
def test_find_packages(tmp_path, args, pkgs):
|
|
196
|
+
files = {
|
|
197
|
+
"pkg/__init__.py",
|
|
198
|
+
"other/__init__.py",
|
|
199
|
+
"dir1/dir2/__init__.py",
|
|
200
|
+
}
|
|
201
|
+
write_files({k: "" for k in files}, tmp_path)
|
|
202
|
+
|
|
203
|
+
package_dir = {}
|
|
204
|
+
kwargs = {"root_dir": tmp_path, "fill_package_dir": package_dir, **args}
|
|
205
|
+
where = kwargs.get("where", ["."])
|
|
206
|
+
assert set(expand.find_packages(**kwargs)) == pkgs
|
|
207
|
+
for pkg in pkgs:
|
|
208
|
+
pkg_path = find_package_path(pkg, package_dir, tmp_path)
|
|
209
|
+
assert os.path.exists(pkg_path)
|
|
210
|
+
|
|
211
|
+
# Make sure the same APIs work outside cwd
|
|
212
|
+
where = [
|
|
213
|
+
str((tmp_path / p).resolve()).replace(os.sep, "/") # ensure posix-style paths
|
|
214
|
+
for p in args.pop("where", ["."])
|
|
215
|
+
]
|
|
216
|
+
|
|
217
|
+
assert set(expand.find_packages(where=where, **args)) == pkgs
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
@pytest.mark.parametrize(
|
|
221
|
+
("files", "where", "expected_package_dir"),
|
|
222
|
+
[
|
|
223
|
+
(["pkg1/__init__.py", "pkg1/other.py"], ["."], {}),
|
|
224
|
+
(["pkg1/__init__.py", "pkg2/__init__.py"], ["."], {}),
|
|
225
|
+
(["src/pkg1/__init__.py", "src/pkg1/other.py"], ["src"], {"": "src"}),
|
|
226
|
+
(["src/pkg1/__init__.py", "src/pkg2/__init__.py"], ["src"], {"": "src"}),
|
|
227
|
+
(
|
|
228
|
+
["src1/pkg1/__init__.py", "src2/pkg2/__init__.py"],
|
|
229
|
+
["src1", "src2"],
|
|
230
|
+
{"pkg1": "src1/pkg1", "pkg2": "src2/pkg2"},
|
|
231
|
+
),
|
|
232
|
+
(
|
|
233
|
+
["src/pkg1/__init__.py", "pkg2/__init__.py"],
|
|
234
|
+
["src", "."],
|
|
235
|
+
{"pkg1": "src/pkg1"},
|
|
236
|
+
),
|
|
237
|
+
],
|
|
238
|
+
)
|
|
239
|
+
def test_fill_package_dir(tmp_path, files, where, expected_package_dir):
|
|
240
|
+
write_files({k: "" for k in files}, tmp_path)
|
|
241
|
+
pkg_dir = {}
|
|
242
|
+
kwargs = {"root_dir": tmp_path, "fill_package_dir": pkg_dir, "namespaces": False}
|
|
243
|
+
pkgs = expand.find_packages(where=where, **kwargs)
|
|
244
|
+
assert set(pkg_dir.items()) == set(expected_package_dir.items())
|
|
245
|
+
for pkg in pkgs:
|
|
246
|
+
pkg_path = find_package_path(pkg, pkg_dir, tmp_path)
|
|
247
|
+
assert os.path.exists(pkg_path)
|
|
@@ -0,0 +1,396 @@
|
|
|
1
|
+
import re
|
|
2
|
+
from configparser import ConfigParser
|
|
3
|
+
from inspect import cleandoc
|
|
4
|
+
|
|
5
|
+
import jaraco.path
|
|
6
|
+
import pytest
|
|
7
|
+
import tomli_w
|
|
8
|
+
from path import Path
|
|
9
|
+
|
|
10
|
+
import setuptools # noqa: F401 # force distutils.core to be patched
|
|
11
|
+
from setuptools.config.pyprojecttoml import (
|
|
12
|
+
_ToolsTypoInMetadata,
|
|
13
|
+
apply_configuration,
|
|
14
|
+
expand_configuration,
|
|
15
|
+
read_configuration,
|
|
16
|
+
validate,
|
|
17
|
+
)
|
|
18
|
+
from setuptools.dist import Distribution
|
|
19
|
+
from setuptools.errors import OptionError
|
|
20
|
+
|
|
21
|
+
import distutils.core
|
|
22
|
+
|
|
23
|
+
EXAMPLE = """
|
|
24
|
+
[project]
|
|
25
|
+
name = "myproj"
|
|
26
|
+
keywords = ["some", "key", "words"]
|
|
27
|
+
dynamic = ["version", "readme"]
|
|
28
|
+
requires-python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
|
|
29
|
+
dependencies = [
|
|
30
|
+
'importlib-metadata>=0.12;python_version<"3.8"',
|
|
31
|
+
'importlib-resources>=1.0;python_version<"3.7"',
|
|
32
|
+
'pathlib2>=2.3.3,<3;python_version < "3.4" and sys.platform != "win32"',
|
|
33
|
+
]
|
|
34
|
+
|
|
35
|
+
[project.optional-dependencies]
|
|
36
|
+
docs = [
|
|
37
|
+
"sphinx>=3",
|
|
38
|
+
"sphinx-argparse>=0.2.5",
|
|
39
|
+
"sphinx-rtd-theme>=0.4.3",
|
|
40
|
+
]
|
|
41
|
+
testing = [
|
|
42
|
+
"pytest>=1",
|
|
43
|
+
"coverage>=3,<5",
|
|
44
|
+
]
|
|
45
|
+
|
|
46
|
+
[project.scripts]
|
|
47
|
+
exec = "pkg.__main__:exec"
|
|
48
|
+
|
|
49
|
+
[build-system]
|
|
50
|
+
requires = ["setuptools", "wheel"]
|
|
51
|
+
build-backend = "setuptools.build_meta"
|
|
52
|
+
|
|
53
|
+
[tool.setuptools]
|
|
54
|
+
package-dir = {"" = "src"}
|
|
55
|
+
zip-safe = true
|
|
56
|
+
platforms = ["any"]
|
|
57
|
+
|
|
58
|
+
[tool.setuptools.packages.find]
|
|
59
|
+
where = ["src"]
|
|
60
|
+
|
|
61
|
+
[tool.setuptools.cmdclass]
|
|
62
|
+
sdist = "pkg.mod.CustomSdist"
|
|
63
|
+
|
|
64
|
+
[tool.setuptools.dynamic.version]
|
|
65
|
+
attr = "pkg.__version__.VERSION"
|
|
66
|
+
|
|
67
|
+
[tool.setuptools.dynamic.readme]
|
|
68
|
+
file = ["README.md"]
|
|
69
|
+
content-type = "text/markdown"
|
|
70
|
+
|
|
71
|
+
[tool.setuptools.package-data]
|
|
72
|
+
"*" = ["*.txt"]
|
|
73
|
+
|
|
74
|
+
[tool.setuptools.data-files]
|
|
75
|
+
"data" = ["_files/*.txt"]
|
|
76
|
+
|
|
77
|
+
[tool.distutils.sdist]
|
|
78
|
+
formats = "gztar"
|
|
79
|
+
|
|
80
|
+
[tool.distutils.bdist_wheel]
|
|
81
|
+
universal = true
|
|
82
|
+
"""
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def create_example(path, pkg_root):
|
|
86
|
+
files = {
|
|
87
|
+
"pyproject.toml": EXAMPLE,
|
|
88
|
+
"README.md": "hello world",
|
|
89
|
+
"_files": {
|
|
90
|
+
"file.txt": "",
|
|
91
|
+
},
|
|
92
|
+
}
|
|
93
|
+
packages = {
|
|
94
|
+
"pkg": {
|
|
95
|
+
"__init__.py": "",
|
|
96
|
+
"mod.py": "class CustomSdist: pass",
|
|
97
|
+
"__version__.py": "VERSION = (3, 10)",
|
|
98
|
+
"__main__.py": "def exec(): print('hello')",
|
|
99
|
+
},
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
assert pkg_root # Meta-test: cannot be empty string.
|
|
103
|
+
|
|
104
|
+
if pkg_root == ".":
|
|
105
|
+
files = {**files, **packages}
|
|
106
|
+
# skip other files: flat-layout will raise error for multi-package dist
|
|
107
|
+
else:
|
|
108
|
+
# Use this opportunity to ensure namespaces are discovered
|
|
109
|
+
files[pkg_root] = {**packages, "other": {"nested": {"__init__.py": ""}}}
|
|
110
|
+
|
|
111
|
+
jaraco.path.build(files, prefix=path)
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def verify_example(config, path, pkg_root):
|
|
115
|
+
pyproject = path / "pyproject.toml"
|
|
116
|
+
pyproject.write_text(tomli_w.dumps(config), encoding="utf-8")
|
|
117
|
+
expanded = expand_configuration(config, path)
|
|
118
|
+
expanded_project = expanded["project"]
|
|
119
|
+
assert read_configuration(pyproject, expand=True) == expanded
|
|
120
|
+
assert expanded_project["version"] == "3.10"
|
|
121
|
+
assert expanded_project["readme"]["text"] == "hello world"
|
|
122
|
+
assert "packages" in expanded["tool"]["setuptools"]
|
|
123
|
+
if pkg_root == ".":
|
|
124
|
+
# Auto-discovery will raise error for multi-package dist
|
|
125
|
+
assert set(expanded["tool"]["setuptools"]["packages"]) == {"pkg"}
|
|
126
|
+
else:
|
|
127
|
+
assert set(expanded["tool"]["setuptools"]["packages"]) == {
|
|
128
|
+
"pkg",
|
|
129
|
+
"other",
|
|
130
|
+
"other.nested",
|
|
131
|
+
}
|
|
132
|
+
assert expanded["tool"]["setuptools"]["include-package-data"] is True
|
|
133
|
+
assert "" in expanded["tool"]["setuptools"]["package-data"]
|
|
134
|
+
assert "*" not in expanded["tool"]["setuptools"]["package-data"]
|
|
135
|
+
assert expanded["tool"]["setuptools"]["data-files"] == [
|
|
136
|
+
("data", ["_files/file.txt"])
|
|
137
|
+
]
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
def test_read_configuration(tmp_path):
|
|
141
|
+
create_example(tmp_path, "src")
|
|
142
|
+
pyproject = tmp_path / "pyproject.toml"
|
|
143
|
+
|
|
144
|
+
config = read_configuration(pyproject, expand=False)
|
|
145
|
+
assert config["project"].get("version") is None
|
|
146
|
+
assert config["project"].get("readme") is None
|
|
147
|
+
|
|
148
|
+
verify_example(config, tmp_path, "src")
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
@pytest.mark.parametrize(
|
|
152
|
+
("pkg_root", "opts"),
|
|
153
|
+
[
|
|
154
|
+
(".", {}),
|
|
155
|
+
("src", {}),
|
|
156
|
+
("lib", {"packages": {"find": {"where": ["lib"]}}}),
|
|
157
|
+
],
|
|
158
|
+
)
|
|
159
|
+
def test_discovered_package_dir_with_attr_directive_in_config(tmp_path, pkg_root, opts):
|
|
160
|
+
create_example(tmp_path, pkg_root)
|
|
161
|
+
|
|
162
|
+
pyproject = tmp_path / "pyproject.toml"
|
|
163
|
+
|
|
164
|
+
config = read_configuration(pyproject, expand=False)
|
|
165
|
+
assert config["project"].get("version") is None
|
|
166
|
+
assert config["project"].get("readme") is None
|
|
167
|
+
config["tool"]["setuptools"].pop("packages", None)
|
|
168
|
+
config["tool"]["setuptools"].pop("package-dir", None)
|
|
169
|
+
|
|
170
|
+
config["tool"]["setuptools"].update(opts)
|
|
171
|
+
verify_example(config, tmp_path, pkg_root)
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
ENTRY_POINTS = {
|
|
175
|
+
"console_scripts": {"a": "mod.a:func"},
|
|
176
|
+
"gui_scripts": {"b": "mod.b:func"},
|
|
177
|
+
"other": {"c": "mod.c:func [extra]"},
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
class TestEntryPoints:
|
|
182
|
+
def write_entry_points(self, tmp_path):
|
|
183
|
+
entry_points = ConfigParser()
|
|
184
|
+
entry_points.read_dict(ENTRY_POINTS)
|
|
185
|
+
with open(tmp_path / "entry-points.txt", "w", encoding="utf-8") as f:
|
|
186
|
+
entry_points.write(f)
|
|
187
|
+
|
|
188
|
+
def pyproject(self, dynamic=None):
|
|
189
|
+
project = {"dynamic": dynamic or ["scripts", "gui-scripts", "entry-points"]}
|
|
190
|
+
tool = {"dynamic": {"entry-points": {"file": "entry-points.txt"}}}
|
|
191
|
+
return {"project": project, "tool": {"setuptools": tool}}
|
|
192
|
+
|
|
193
|
+
def test_all_listed_in_dynamic(self, tmp_path):
|
|
194
|
+
self.write_entry_points(tmp_path)
|
|
195
|
+
expanded = expand_configuration(self.pyproject(), tmp_path)
|
|
196
|
+
expanded_project = expanded["project"]
|
|
197
|
+
assert len(expanded_project["scripts"]) == 1
|
|
198
|
+
assert expanded_project["scripts"]["a"] == "mod.a:func"
|
|
199
|
+
assert len(expanded_project["gui-scripts"]) == 1
|
|
200
|
+
assert expanded_project["gui-scripts"]["b"] == "mod.b:func"
|
|
201
|
+
assert len(expanded_project["entry-points"]) == 1
|
|
202
|
+
assert expanded_project["entry-points"]["other"]["c"] == "mod.c:func [extra]"
|
|
203
|
+
|
|
204
|
+
@pytest.mark.parametrize("missing_dynamic", ("scripts", "gui-scripts"))
|
|
205
|
+
def test_scripts_not_listed_in_dynamic(self, tmp_path, missing_dynamic):
|
|
206
|
+
self.write_entry_points(tmp_path)
|
|
207
|
+
dynamic = {"scripts", "gui-scripts", "entry-points"} - {missing_dynamic}
|
|
208
|
+
|
|
209
|
+
msg = f"defined outside of `pyproject.toml`:.*{missing_dynamic}"
|
|
210
|
+
with pytest.raises(OptionError, match=re.compile(msg, re.S)):
|
|
211
|
+
expand_configuration(self.pyproject(dynamic), tmp_path)
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
class TestClassifiers:
|
|
215
|
+
def test_dynamic(self, tmp_path):
|
|
216
|
+
# Let's create a project example that has dynamic classifiers
|
|
217
|
+
# coming from a txt file.
|
|
218
|
+
create_example(tmp_path, "src")
|
|
219
|
+
classifiers = cleandoc(
|
|
220
|
+
"""
|
|
221
|
+
Framework :: Flask
|
|
222
|
+
Programming Language :: Haskell
|
|
223
|
+
"""
|
|
224
|
+
)
|
|
225
|
+
(tmp_path / "classifiers.txt").write_text(classifiers, encoding="utf-8")
|
|
226
|
+
|
|
227
|
+
pyproject = tmp_path / "pyproject.toml"
|
|
228
|
+
config = read_configuration(pyproject, expand=False)
|
|
229
|
+
dynamic = config["project"]["dynamic"]
|
|
230
|
+
config["project"]["dynamic"] = list({*dynamic, "classifiers"})
|
|
231
|
+
dynamic_config = config["tool"]["setuptools"]["dynamic"]
|
|
232
|
+
dynamic_config["classifiers"] = {"file": "classifiers.txt"}
|
|
233
|
+
|
|
234
|
+
# When the configuration is expanded,
|
|
235
|
+
# each line of the file should be an different classifier.
|
|
236
|
+
validate(config, pyproject)
|
|
237
|
+
expanded = expand_configuration(config, tmp_path)
|
|
238
|
+
|
|
239
|
+
assert set(expanded["project"]["classifiers"]) == {
|
|
240
|
+
"Framework :: Flask",
|
|
241
|
+
"Programming Language :: Haskell",
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
def test_dynamic_without_config(self, tmp_path):
|
|
245
|
+
config = """
|
|
246
|
+
[project]
|
|
247
|
+
name = "myproj"
|
|
248
|
+
version = '42'
|
|
249
|
+
dynamic = ["classifiers"]
|
|
250
|
+
"""
|
|
251
|
+
|
|
252
|
+
pyproject = tmp_path / "pyproject.toml"
|
|
253
|
+
pyproject.write_text(cleandoc(config), encoding="utf-8")
|
|
254
|
+
with pytest.raises(OptionError, match="No configuration .* .classifiers."):
|
|
255
|
+
read_configuration(pyproject)
|
|
256
|
+
|
|
257
|
+
def test_dynamic_readme_from_setup_script_args(self, tmp_path):
|
|
258
|
+
config = """
|
|
259
|
+
[project]
|
|
260
|
+
name = "myproj"
|
|
261
|
+
version = '42'
|
|
262
|
+
dynamic = ["readme"]
|
|
263
|
+
"""
|
|
264
|
+
pyproject = tmp_path / "pyproject.toml"
|
|
265
|
+
pyproject.write_text(cleandoc(config), encoding="utf-8")
|
|
266
|
+
dist = Distribution(attrs={"long_description": "42"})
|
|
267
|
+
# No error should occur because of missing `readme`
|
|
268
|
+
dist = apply_configuration(dist, pyproject)
|
|
269
|
+
assert dist.metadata.long_description == "42"
|
|
270
|
+
|
|
271
|
+
def test_dynamic_without_file(self, tmp_path):
|
|
272
|
+
config = """
|
|
273
|
+
[project]
|
|
274
|
+
name = "myproj"
|
|
275
|
+
version = '42'
|
|
276
|
+
dynamic = ["classifiers"]
|
|
277
|
+
|
|
278
|
+
[tool.setuptools.dynamic]
|
|
279
|
+
classifiers = {file = ["classifiers.txt"]}
|
|
280
|
+
"""
|
|
281
|
+
|
|
282
|
+
pyproject = tmp_path / "pyproject.toml"
|
|
283
|
+
pyproject.write_text(cleandoc(config), encoding="utf-8")
|
|
284
|
+
with pytest.warns(UserWarning, match="File .*classifiers.txt. cannot be found"):
|
|
285
|
+
expanded = read_configuration(pyproject)
|
|
286
|
+
assert "classifiers" not in expanded["project"]
|
|
287
|
+
|
|
288
|
+
|
|
289
|
+
@pytest.mark.parametrize(
|
|
290
|
+
"example",
|
|
291
|
+
(
|
|
292
|
+
"""
|
|
293
|
+
[project]
|
|
294
|
+
name = "myproj"
|
|
295
|
+
version = "1.2"
|
|
296
|
+
|
|
297
|
+
[my-tool.that-disrespect.pep518]
|
|
298
|
+
value = 42
|
|
299
|
+
""",
|
|
300
|
+
),
|
|
301
|
+
)
|
|
302
|
+
def test_ignore_unrelated_config(tmp_path, example):
|
|
303
|
+
pyproject = tmp_path / "pyproject.toml"
|
|
304
|
+
pyproject.write_text(cleandoc(example), encoding="utf-8")
|
|
305
|
+
|
|
306
|
+
# Make sure no error is raised due to 3rd party configs in pyproject.toml
|
|
307
|
+
assert read_configuration(pyproject) is not None
|
|
308
|
+
|
|
309
|
+
|
|
310
|
+
@pytest.mark.parametrize(
|
|
311
|
+
("example", "error_msg"),
|
|
312
|
+
[
|
|
313
|
+
(
|
|
314
|
+
"""
|
|
315
|
+
[project]
|
|
316
|
+
name = "myproj"
|
|
317
|
+
version = "1.2"
|
|
318
|
+
requires = ['pywin32; platform_system=="Windows"' ]
|
|
319
|
+
""",
|
|
320
|
+
"configuration error: .project. must not contain ..requires.. properties",
|
|
321
|
+
),
|
|
322
|
+
],
|
|
323
|
+
)
|
|
324
|
+
def test_invalid_example(tmp_path, example, error_msg):
|
|
325
|
+
pyproject = tmp_path / "pyproject.toml"
|
|
326
|
+
pyproject.write_text(cleandoc(example), encoding="utf-8")
|
|
327
|
+
|
|
328
|
+
pattern = re.compile(f"invalid pyproject.toml.*{error_msg}.*", re.M | re.S)
|
|
329
|
+
with pytest.raises(ValueError, match=pattern):
|
|
330
|
+
read_configuration(pyproject)
|
|
331
|
+
|
|
332
|
+
|
|
333
|
+
@pytest.mark.parametrize("config", ("", "[tool.something]\nvalue = 42"))
|
|
334
|
+
def test_empty(tmp_path, config):
|
|
335
|
+
pyproject = tmp_path / "pyproject.toml"
|
|
336
|
+
pyproject.write_text(config, encoding="utf-8")
|
|
337
|
+
|
|
338
|
+
# Make sure no error is raised
|
|
339
|
+
assert read_configuration(pyproject) == {}
|
|
340
|
+
|
|
341
|
+
|
|
342
|
+
@pytest.mark.parametrize("config", ("[project]\nname = 'myproj'\nversion='42'\n",))
|
|
343
|
+
def test_include_package_data_by_default(tmp_path, config):
|
|
344
|
+
"""Builds with ``pyproject.toml`` should consider ``include-package-data=True`` as
|
|
345
|
+
default.
|
|
346
|
+
"""
|
|
347
|
+
pyproject = tmp_path / "pyproject.toml"
|
|
348
|
+
pyproject.write_text(config, encoding="utf-8")
|
|
349
|
+
|
|
350
|
+
config = read_configuration(pyproject)
|
|
351
|
+
assert config["tool"]["setuptools"]["include-package-data"] is True
|
|
352
|
+
|
|
353
|
+
|
|
354
|
+
def test_include_package_data_in_setuppy(tmp_path):
|
|
355
|
+
"""Builds with ``pyproject.toml`` should consider ``include_package_data`` set in
|
|
356
|
+
``setup.py``.
|
|
357
|
+
|
|
358
|
+
See https://github.com/pypa/setuptools/issues/3197#issuecomment-1079023889
|
|
359
|
+
"""
|
|
360
|
+
files = {
|
|
361
|
+
"pyproject.toml": "[project]\nname = 'myproj'\nversion='42'\n",
|
|
362
|
+
"setup.py": "__import__('setuptools').setup(include_package_data=False)",
|
|
363
|
+
}
|
|
364
|
+
jaraco.path.build(files, prefix=tmp_path)
|
|
365
|
+
|
|
366
|
+
with Path(tmp_path):
|
|
367
|
+
dist = distutils.core.run_setup("setup.py", {}, stop_after="config")
|
|
368
|
+
|
|
369
|
+
assert dist.get_name() == "myproj"
|
|
370
|
+
assert dist.get_version() == "42"
|
|
371
|
+
assert dist.include_package_data is False
|
|
372
|
+
|
|
373
|
+
|
|
374
|
+
def test_warn_tools_typo(tmp_path):
|
|
375
|
+
"""Test that the common ``tools.setuptools`` typo in ``pyproject.toml`` issues a warning
|
|
376
|
+
|
|
377
|
+
See https://github.com/pypa/setuptools/issues/4150
|
|
378
|
+
"""
|
|
379
|
+
config = """
|
|
380
|
+
[build-system]
|
|
381
|
+
requires = ["setuptools"]
|
|
382
|
+
build-backend = "setuptools.build_meta"
|
|
383
|
+
|
|
384
|
+
[project]
|
|
385
|
+
name = "myproj"
|
|
386
|
+
version = '42'
|
|
387
|
+
|
|
388
|
+
[tools.setuptools]
|
|
389
|
+
packages = ["package"]
|
|
390
|
+
"""
|
|
391
|
+
|
|
392
|
+
pyproject = tmp_path / "pyproject.toml"
|
|
393
|
+
pyproject.write_text(cleandoc(config), encoding="utf-8")
|
|
394
|
+
|
|
395
|
+
with pytest.warns(_ToolsTypoInMetadata):
|
|
396
|
+
read_configuration(pyproject)
|