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,628 @@
|
|
|
1
|
+
import contextlib
|
|
2
|
+
import glob
|
|
3
|
+
import importlib
|
|
4
|
+
import os.path
|
|
5
|
+
import platform
|
|
6
|
+
import re
|
|
7
|
+
import shutil
|
|
8
|
+
import site
|
|
9
|
+
import subprocess
|
|
10
|
+
import sys
|
|
11
|
+
import tempfile
|
|
12
|
+
import textwrap
|
|
13
|
+
import time
|
|
14
|
+
from distutils import sysconfig
|
|
15
|
+
from distutils.command.build_ext import build_ext
|
|
16
|
+
from distutils.core import Distribution
|
|
17
|
+
from distutils.errors import (
|
|
18
|
+
CompileError,
|
|
19
|
+
DistutilsPlatformError,
|
|
20
|
+
DistutilsSetupError,
|
|
21
|
+
UnknownFileError,
|
|
22
|
+
)
|
|
23
|
+
from distutils.extension import Extension
|
|
24
|
+
from distutils.tests import missing_compiler_executable
|
|
25
|
+
from distutils.tests.support import TempdirManager, copy_xxmodule_c, fixup_build_ext
|
|
26
|
+
from io import StringIO
|
|
27
|
+
|
|
28
|
+
import jaraco.path
|
|
29
|
+
import path
|
|
30
|
+
import pytest
|
|
31
|
+
from test import support
|
|
32
|
+
|
|
33
|
+
from .compat import py39 as import_helper
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
@pytest.fixture()
|
|
37
|
+
def user_site_dir(request):
|
|
38
|
+
self = request.instance
|
|
39
|
+
self.tmp_dir = self.mkdtemp()
|
|
40
|
+
self.tmp_path = path.Path(self.tmp_dir)
|
|
41
|
+
from distutils.command import build_ext
|
|
42
|
+
|
|
43
|
+
orig_user_base = site.USER_BASE
|
|
44
|
+
|
|
45
|
+
site.USER_BASE = self.mkdtemp()
|
|
46
|
+
build_ext.USER_BASE = site.USER_BASE
|
|
47
|
+
|
|
48
|
+
# bpo-30132: On Windows, a .pdb file may be created in the current
|
|
49
|
+
# working directory. Create a temporary working directory to cleanup
|
|
50
|
+
# everything at the end of the test.
|
|
51
|
+
with self.tmp_path:
|
|
52
|
+
yield
|
|
53
|
+
|
|
54
|
+
site.USER_BASE = orig_user_base
|
|
55
|
+
build_ext.USER_BASE = orig_user_base
|
|
56
|
+
|
|
57
|
+
if sys.platform == 'cygwin':
|
|
58
|
+
time.sleep(1)
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
@contextlib.contextmanager
|
|
62
|
+
def safe_extension_import(name, path):
|
|
63
|
+
with import_helper.CleanImport(name):
|
|
64
|
+
with extension_redirect(name, path) as new_path:
|
|
65
|
+
with import_helper.DirsOnSysPath(new_path):
|
|
66
|
+
yield
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
@contextlib.contextmanager
|
|
70
|
+
def extension_redirect(mod, path):
|
|
71
|
+
"""
|
|
72
|
+
Tests will fail to tear down an extension module if it's been imported.
|
|
73
|
+
|
|
74
|
+
Before importing, copy the file to a temporary directory that won't
|
|
75
|
+
be cleaned up. Yield the new path.
|
|
76
|
+
"""
|
|
77
|
+
if platform.system() != "Windows" and sys.platform != "cygwin":
|
|
78
|
+
yield path
|
|
79
|
+
return
|
|
80
|
+
with import_helper.DirsOnSysPath(path):
|
|
81
|
+
spec = importlib.util.find_spec(mod)
|
|
82
|
+
filename = os.path.basename(spec.origin)
|
|
83
|
+
trash_dir = tempfile.mkdtemp(prefix='deleteme')
|
|
84
|
+
dest = os.path.join(trash_dir, os.path.basename(filename))
|
|
85
|
+
shutil.copy(spec.origin, dest)
|
|
86
|
+
yield trash_dir
|
|
87
|
+
# TODO: can the file be scheduled for deletion?
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
@pytest.mark.usefixtures('user_site_dir')
|
|
91
|
+
class TestBuildExt(TempdirManager):
|
|
92
|
+
def build_ext(self, *args, **kwargs):
|
|
93
|
+
return build_ext(*args, **kwargs)
|
|
94
|
+
|
|
95
|
+
@pytest.mark.parametrize("copy_so", [False])
|
|
96
|
+
def test_build_ext(self, copy_so):
|
|
97
|
+
missing_compiler_executable()
|
|
98
|
+
copy_xxmodule_c(self.tmp_dir)
|
|
99
|
+
xx_c = os.path.join(self.tmp_dir, 'xxmodule.c')
|
|
100
|
+
xx_ext = Extension('xx', [xx_c])
|
|
101
|
+
if sys.platform != "win32":
|
|
102
|
+
if not copy_so:
|
|
103
|
+
xx_ext = Extension(
|
|
104
|
+
'xx',
|
|
105
|
+
[xx_c],
|
|
106
|
+
library_dirs=['/usr/lib'],
|
|
107
|
+
libraries=['z'],
|
|
108
|
+
runtime_library_dirs=['/usr/lib'],
|
|
109
|
+
)
|
|
110
|
+
elif sys.platform == 'linux':
|
|
111
|
+
libz_so = {
|
|
112
|
+
os.path.realpath(name) for name in glob.iglob('/usr/lib*/libz.so*')
|
|
113
|
+
}
|
|
114
|
+
libz_so = sorted(libz_so, key=lambda lib_path: len(lib_path))
|
|
115
|
+
shutil.copyfile(libz_so[-1], '/tmp/libxx_z.so')
|
|
116
|
+
|
|
117
|
+
xx_ext = Extension(
|
|
118
|
+
'xx',
|
|
119
|
+
[xx_c],
|
|
120
|
+
library_dirs=['/tmp'],
|
|
121
|
+
libraries=['xx_z'],
|
|
122
|
+
runtime_library_dirs=['/tmp'],
|
|
123
|
+
)
|
|
124
|
+
dist = Distribution({'name': 'xx', 'ext_modules': [xx_ext]})
|
|
125
|
+
dist.package_dir = self.tmp_dir
|
|
126
|
+
cmd = self.build_ext(dist)
|
|
127
|
+
fixup_build_ext(cmd)
|
|
128
|
+
cmd.build_lib = self.tmp_dir
|
|
129
|
+
cmd.build_temp = self.tmp_dir
|
|
130
|
+
|
|
131
|
+
old_stdout = sys.stdout
|
|
132
|
+
if not support.verbose:
|
|
133
|
+
# silence compiler output
|
|
134
|
+
sys.stdout = StringIO()
|
|
135
|
+
try:
|
|
136
|
+
cmd.ensure_finalized()
|
|
137
|
+
cmd.run()
|
|
138
|
+
finally:
|
|
139
|
+
sys.stdout = old_stdout
|
|
140
|
+
|
|
141
|
+
with safe_extension_import('xx', self.tmp_dir):
|
|
142
|
+
self._test_xx(copy_so)
|
|
143
|
+
|
|
144
|
+
if sys.platform == 'linux' and copy_so:
|
|
145
|
+
os.unlink('/tmp/libxx_z.so')
|
|
146
|
+
|
|
147
|
+
@staticmethod
|
|
148
|
+
def _test_xx(copy_so):
|
|
149
|
+
import xx # type: ignore[import-not-found] # Module generated for tests
|
|
150
|
+
|
|
151
|
+
for attr in ('error', 'foo', 'new', 'roj'):
|
|
152
|
+
assert hasattr(xx, attr)
|
|
153
|
+
|
|
154
|
+
assert xx.foo(2, 5) == 7
|
|
155
|
+
assert xx.foo(13, 15) == 28
|
|
156
|
+
assert xx.new().demo() is None
|
|
157
|
+
if support.HAVE_DOCSTRINGS:
|
|
158
|
+
doc = 'This is a template module just for instruction.'
|
|
159
|
+
assert xx.__doc__ == doc
|
|
160
|
+
assert isinstance(xx.Null(), xx.Null)
|
|
161
|
+
assert isinstance(xx.Str(), xx.Str)
|
|
162
|
+
|
|
163
|
+
if sys.platform == 'linux':
|
|
164
|
+
so_headers = subprocess.check_output(
|
|
165
|
+
["readelf", "-d", xx.__file__], universal_newlines=True
|
|
166
|
+
)
|
|
167
|
+
import pprint
|
|
168
|
+
|
|
169
|
+
pprint.pprint(so_headers)
|
|
170
|
+
rpaths = [
|
|
171
|
+
rpath
|
|
172
|
+
for line in so_headers.split("\n")
|
|
173
|
+
if "RPATH" in line or "RUNPATH" in line
|
|
174
|
+
for rpath in line.split()[2][1:-1].split(":")
|
|
175
|
+
]
|
|
176
|
+
if not copy_so:
|
|
177
|
+
pprint.pprint(rpaths)
|
|
178
|
+
# Linked against a library in /usr/lib{,64}
|
|
179
|
+
assert "/usr/lib" not in rpaths and "/usr/lib64" not in rpaths
|
|
180
|
+
else:
|
|
181
|
+
# Linked against a library in /tmp
|
|
182
|
+
assert "/tmp" in rpaths
|
|
183
|
+
# The import is the real test here
|
|
184
|
+
|
|
185
|
+
def test_solaris_enable_shared(self):
|
|
186
|
+
dist = Distribution({'name': 'xx'})
|
|
187
|
+
cmd = self.build_ext(dist)
|
|
188
|
+
old = sys.platform
|
|
189
|
+
|
|
190
|
+
sys.platform = 'sunos' # fooling finalize_options
|
|
191
|
+
from distutils.sysconfig import _config_vars
|
|
192
|
+
|
|
193
|
+
old_var = _config_vars.get('Py_ENABLE_SHARED')
|
|
194
|
+
_config_vars['Py_ENABLE_SHARED'] = True
|
|
195
|
+
try:
|
|
196
|
+
cmd.ensure_finalized()
|
|
197
|
+
finally:
|
|
198
|
+
sys.platform = old
|
|
199
|
+
if old_var is None:
|
|
200
|
+
del _config_vars['Py_ENABLE_SHARED']
|
|
201
|
+
else:
|
|
202
|
+
_config_vars['Py_ENABLE_SHARED'] = old_var
|
|
203
|
+
|
|
204
|
+
# make sure we get some library dirs under solaris
|
|
205
|
+
assert len(cmd.library_dirs) > 0
|
|
206
|
+
|
|
207
|
+
def test_user_site(self):
|
|
208
|
+
import site
|
|
209
|
+
|
|
210
|
+
dist = Distribution({'name': 'xx'})
|
|
211
|
+
cmd = self.build_ext(dist)
|
|
212
|
+
|
|
213
|
+
# making sure the user option is there
|
|
214
|
+
options = [name for name, short, label in cmd.user_options]
|
|
215
|
+
assert 'user' in options
|
|
216
|
+
|
|
217
|
+
# setting a value
|
|
218
|
+
cmd.user = True
|
|
219
|
+
|
|
220
|
+
# setting user based lib and include
|
|
221
|
+
lib = os.path.join(site.USER_BASE, 'lib')
|
|
222
|
+
incl = os.path.join(site.USER_BASE, 'include')
|
|
223
|
+
os.mkdir(lib)
|
|
224
|
+
os.mkdir(incl)
|
|
225
|
+
|
|
226
|
+
# let's run finalize
|
|
227
|
+
cmd.ensure_finalized()
|
|
228
|
+
|
|
229
|
+
# see if include_dirs and library_dirs
|
|
230
|
+
# were set
|
|
231
|
+
assert lib in cmd.library_dirs
|
|
232
|
+
assert lib in cmd.rpath
|
|
233
|
+
assert incl in cmd.include_dirs
|
|
234
|
+
|
|
235
|
+
def test_optional_extension(self):
|
|
236
|
+
# this extension will fail, but let's ignore this failure
|
|
237
|
+
# with the optional argument.
|
|
238
|
+
modules = [Extension('foo', ['xxx'], optional=False)]
|
|
239
|
+
dist = Distribution({'name': 'xx', 'ext_modules': modules})
|
|
240
|
+
cmd = self.build_ext(dist)
|
|
241
|
+
cmd.ensure_finalized()
|
|
242
|
+
with pytest.raises((UnknownFileError, CompileError)):
|
|
243
|
+
cmd.run() # should raise an error
|
|
244
|
+
|
|
245
|
+
modules = [Extension('foo', ['xxx'], optional=True)]
|
|
246
|
+
dist = Distribution({'name': 'xx', 'ext_modules': modules})
|
|
247
|
+
cmd = self.build_ext(dist)
|
|
248
|
+
cmd.ensure_finalized()
|
|
249
|
+
cmd.run() # should pass
|
|
250
|
+
|
|
251
|
+
def test_finalize_options(self):
|
|
252
|
+
# Make sure Python's include directories (for Python.h, pyconfig.h,
|
|
253
|
+
# etc.) are in the include search path.
|
|
254
|
+
modules = [Extension('foo', ['xxx'], optional=False)]
|
|
255
|
+
dist = Distribution({'name': 'xx', 'ext_modules': modules})
|
|
256
|
+
cmd = self.build_ext(dist)
|
|
257
|
+
cmd.finalize_options()
|
|
258
|
+
|
|
259
|
+
py_include = sysconfig.get_python_inc()
|
|
260
|
+
for p in py_include.split(os.path.pathsep):
|
|
261
|
+
assert p in cmd.include_dirs
|
|
262
|
+
|
|
263
|
+
plat_py_include = sysconfig.get_python_inc(plat_specific=True)
|
|
264
|
+
for p in plat_py_include.split(os.path.pathsep):
|
|
265
|
+
assert p in cmd.include_dirs
|
|
266
|
+
|
|
267
|
+
# make sure cmd.libraries is turned into a list
|
|
268
|
+
# if it's a string
|
|
269
|
+
cmd = self.build_ext(dist)
|
|
270
|
+
cmd.libraries = 'my_lib, other_lib lastlib'
|
|
271
|
+
cmd.finalize_options()
|
|
272
|
+
assert cmd.libraries == ['my_lib', 'other_lib', 'lastlib']
|
|
273
|
+
|
|
274
|
+
# make sure cmd.library_dirs is turned into a list
|
|
275
|
+
# if it's a string
|
|
276
|
+
cmd = self.build_ext(dist)
|
|
277
|
+
cmd.library_dirs = f'my_lib_dir{os.pathsep}other_lib_dir'
|
|
278
|
+
cmd.finalize_options()
|
|
279
|
+
assert 'my_lib_dir' in cmd.library_dirs
|
|
280
|
+
assert 'other_lib_dir' in cmd.library_dirs
|
|
281
|
+
|
|
282
|
+
# make sure rpath is turned into a list
|
|
283
|
+
# if it's a string
|
|
284
|
+
cmd = self.build_ext(dist)
|
|
285
|
+
cmd.rpath = f'one{os.pathsep}two'
|
|
286
|
+
cmd.finalize_options()
|
|
287
|
+
assert cmd.rpath == ['one', 'two']
|
|
288
|
+
|
|
289
|
+
# make sure cmd.link_objects is turned into a list
|
|
290
|
+
# if it's a string
|
|
291
|
+
cmd = build_ext(dist)
|
|
292
|
+
cmd.link_objects = 'one two,three'
|
|
293
|
+
cmd.finalize_options()
|
|
294
|
+
assert cmd.link_objects == ['one', 'two', 'three']
|
|
295
|
+
|
|
296
|
+
# XXX more tests to perform for win32
|
|
297
|
+
|
|
298
|
+
# make sure define is turned into 2-tuples
|
|
299
|
+
# strings if they are ','-separated strings
|
|
300
|
+
cmd = self.build_ext(dist)
|
|
301
|
+
cmd.define = 'one,two'
|
|
302
|
+
cmd.finalize_options()
|
|
303
|
+
assert cmd.define == [('one', '1'), ('two', '1')]
|
|
304
|
+
|
|
305
|
+
# make sure undef is turned into a list of
|
|
306
|
+
# strings if they are ','-separated strings
|
|
307
|
+
cmd = self.build_ext(dist)
|
|
308
|
+
cmd.undef = 'one,two'
|
|
309
|
+
cmd.finalize_options()
|
|
310
|
+
assert cmd.undef == ['one', 'two']
|
|
311
|
+
|
|
312
|
+
# make sure swig_opts is turned into a list
|
|
313
|
+
cmd = self.build_ext(dist)
|
|
314
|
+
cmd.swig_opts = None
|
|
315
|
+
cmd.finalize_options()
|
|
316
|
+
assert cmd.swig_opts == []
|
|
317
|
+
|
|
318
|
+
cmd = self.build_ext(dist)
|
|
319
|
+
cmd.swig_opts = '1 2'
|
|
320
|
+
cmd.finalize_options()
|
|
321
|
+
assert cmd.swig_opts == ['1', '2']
|
|
322
|
+
|
|
323
|
+
def test_check_extensions_list(self):
|
|
324
|
+
dist = Distribution()
|
|
325
|
+
cmd = self.build_ext(dist)
|
|
326
|
+
cmd.finalize_options()
|
|
327
|
+
|
|
328
|
+
# 'extensions' option must be a list of Extension instances
|
|
329
|
+
with pytest.raises(DistutilsSetupError):
|
|
330
|
+
cmd.check_extensions_list('foo')
|
|
331
|
+
|
|
332
|
+
# each element of 'ext_modules' option must be an
|
|
333
|
+
# Extension instance or 2-tuple
|
|
334
|
+
exts = [('bar', 'foo', 'bar'), 'foo']
|
|
335
|
+
with pytest.raises(DistutilsSetupError):
|
|
336
|
+
cmd.check_extensions_list(exts)
|
|
337
|
+
|
|
338
|
+
# first element of each tuple in 'ext_modules'
|
|
339
|
+
# must be the extension name (a string) and match
|
|
340
|
+
# a python dotted-separated name
|
|
341
|
+
exts = [('foo-bar', '')]
|
|
342
|
+
with pytest.raises(DistutilsSetupError):
|
|
343
|
+
cmd.check_extensions_list(exts)
|
|
344
|
+
|
|
345
|
+
# second element of each tuple in 'ext_modules'
|
|
346
|
+
# must be a dictionary (build info)
|
|
347
|
+
exts = [('foo.bar', '')]
|
|
348
|
+
with pytest.raises(DistutilsSetupError):
|
|
349
|
+
cmd.check_extensions_list(exts)
|
|
350
|
+
|
|
351
|
+
# ok this one should pass
|
|
352
|
+
exts = [('foo.bar', {'sources': [''], 'libraries': 'foo', 'some': 'bar'})]
|
|
353
|
+
cmd.check_extensions_list(exts)
|
|
354
|
+
ext = exts[0]
|
|
355
|
+
assert isinstance(ext, Extension)
|
|
356
|
+
|
|
357
|
+
# check_extensions_list adds in ext the values passed
|
|
358
|
+
# when they are in ('include_dirs', 'library_dirs', 'libraries'
|
|
359
|
+
# 'extra_objects', 'extra_compile_args', 'extra_link_args')
|
|
360
|
+
assert ext.libraries == 'foo'
|
|
361
|
+
assert not hasattr(ext, 'some')
|
|
362
|
+
|
|
363
|
+
# 'macros' element of build info dict must be 1- or 2-tuple
|
|
364
|
+
exts = [
|
|
365
|
+
(
|
|
366
|
+
'foo.bar',
|
|
367
|
+
{
|
|
368
|
+
'sources': [''],
|
|
369
|
+
'libraries': 'foo',
|
|
370
|
+
'some': 'bar',
|
|
371
|
+
'macros': [('1', '2', '3'), 'foo'],
|
|
372
|
+
},
|
|
373
|
+
)
|
|
374
|
+
]
|
|
375
|
+
with pytest.raises(DistutilsSetupError):
|
|
376
|
+
cmd.check_extensions_list(exts)
|
|
377
|
+
|
|
378
|
+
exts[0][1]['macros'] = [('1', '2'), ('3',)]
|
|
379
|
+
cmd.check_extensions_list(exts)
|
|
380
|
+
assert exts[0].undef_macros == ['3']
|
|
381
|
+
assert exts[0].define_macros == [('1', '2')]
|
|
382
|
+
|
|
383
|
+
def test_get_source_files(self):
|
|
384
|
+
modules = [Extension('foo', ['xxx'], optional=False)]
|
|
385
|
+
dist = Distribution({'name': 'xx', 'ext_modules': modules})
|
|
386
|
+
cmd = self.build_ext(dist)
|
|
387
|
+
cmd.ensure_finalized()
|
|
388
|
+
assert cmd.get_source_files() == ['xxx']
|
|
389
|
+
|
|
390
|
+
def test_unicode_module_names(self):
|
|
391
|
+
modules = [
|
|
392
|
+
Extension('foo', ['aaa'], optional=False),
|
|
393
|
+
Extension('föö', ['uuu'], optional=False),
|
|
394
|
+
]
|
|
395
|
+
dist = Distribution({'name': 'xx', 'ext_modules': modules})
|
|
396
|
+
cmd = self.build_ext(dist)
|
|
397
|
+
cmd.ensure_finalized()
|
|
398
|
+
assert re.search(r'foo(_d)?\..*', cmd.get_ext_filename(modules[0].name))
|
|
399
|
+
assert re.search(r'föö(_d)?\..*', cmd.get_ext_filename(modules[1].name))
|
|
400
|
+
assert cmd.get_export_symbols(modules[0]) == ['PyInit_foo']
|
|
401
|
+
assert cmd.get_export_symbols(modules[1]) == ['PyInitU_f_1gaa']
|
|
402
|
+
|
|
403
|
+
def test_export_symbols__init__(self):
|
|
404
|
+
# https://github.com/python/cpython/issues/80074
|
|
405
|
+
# https://github.com/pypa/setuptools/issues/4826
|
|
406
|
+
modules = [
|
|
407
|
+
Extension('foo.__init__', ['aaa']),
|
|
408
|
+
Extension('föö.__init__', ['uuu']),
|
|
409
|
+
]
|
|
410
|
+
dist = Distribution({'name': 'xx', 'ext_modules': modules})
|
|
411
|
+
cmd = self.build_ext(dist)
|
|
412
|
+
cmd.ensure_finalized()
|
|
413
|
+
assert cmd.get_export_symbols(modules[0]) == ['PyInit_foo']
|
|
414
|
+
assert cmd.get_export_symbols(modules[1]) == ['PyInitU_f_1gaa']
|
|
415
|
+
|
|
416
|
+
def test_compiler_option(self):
|
|
417
|
+
# cmd.compiler is an option and
|
|
418
|
+
# should not be overridden by a compiler instance
|
|
419
|
+
# when the command is run
|
|
420
|
+
dist = Distribution()
|
|
421
|
+
cmd = self.build_ext(dist)
|
|
422
|
+
cmd.compiler = 'unix'
|
|
423
|
+
cmd.ensure_finalized()
|
|
424
|
+
cmd.run()
|
|
425
|
+
assert cmd.compiler == 'unix'
|
|
426
|
+
|
|
427
|
+
def test_get_outputs(self):
|
|
428
|
+
missing_compiler_executable()
|
|
429
|
+
tmp_dir = self.mkdtemp()
|
|
430
|
+
c_file = os.path.join(tmp_dir, 'foo.c')
|
|
431
|
+
self.write_file(c_file, 'void PyInit_foo(void) {}\n')
|
|
432
|
+
ext = Extension('foo', [c_file], optional=False)
|
|
433
|
+
dist = Distribution({'name': 'xx', 'ext_modules': [ext]})
|
|
434
|
+
cmd = self.build_ext(dist)
|
|
435
|
+
fixup_build_ext(cmd)
|
|
436
|
+
cmd.ensure_finalized()
|
|
437
|
+
assert len(cmd.get_outputs()) == 1
|
|
438
|
+
|
|
439
|
+
cmd.build_lib = os.path.join(self.tmp_dir, 'build')
|
|
440
|
+
cmd.build_temp = os.path.join(self.tmp_dir, 'tempt')
|
|
441
|
+
|
|
442
|
+
# issue #5977 : distutils build_ext.get_outputs
|
|
443
|
+
# returns wrong result with --inplace
|
|
444
|
+
other_tmp_dir = os.path.realpath(self.mkdtemp())
|
|
445
|
+
old_wd = os.getcwd()
|
|
446
|
+
os.chdir(other_tmp_dir)
|
|
447
|
+
try:
|
|
448
|
+
cmd.inplace = True
|
|
449
|
+
cmd.run()
|
|
450
|
+
so_file = cmd.get_outputs()[0]
|
|
451
|
+
finally:
|
|
452
|
+
os.chdir(old_wd)
|
|
453
|
+
assert os.path.exists(so_file)
|
|
454
|
+
ext_suffix = sysconfig.get_config_var('EXT_SUFFIX')
|
|
455
|
+
assert so_file.endswith(ext_suffix)
|
|
456
|
+
so_dir = os.path.dirname(so_file)
|
|
457
|
+
assert so_dir == other_tmp_dir
|
|
458
|
+
|
|
459
|
+
cmd.inplace = False
|
|
460
|
+
cmd.compiler = None
|
|
461
|
+
cmd.run()
|
|
462
|
+
so_file = cmd.get_outputs()[0]
|
|
463
|
+
assert os.path.exists(so_file)
|
|
464
|
+
assert so_file.endswith(ext_suffix)
|
|
465
|
+
so_dir = os.path.dirname(so_file)
|
|
466
|
+
assert so_dir == cmd.build_lib
|
|
467
|
+
|
|
468
|
+
# inplace = False, cmd.package = 'bar'
|
|
469
|
+
build_py = cmd.get_finalized_command('build_py')
|
|
470
|
+
build_py.package_dir = {'': 'bar'}
|
|
471
|
+
path = cmd.get_ext_fullpath('foo')
|
|
472
|
+
# checking that the last directory is the build_dir
|
|
473
|
+
path = os.path.split(path)[0]
|
|
474
|
+
assert path == cmd.build_lib
|
|
475
|
+
|
|
476
|
+
# inplace = True, cmd.package = 'bar'
|
|
477
|
+
cmd.inplace = True
|
|
478
|
+
other_tmp_dir = os.path.realpath(self.mkdtemp())
|
|
479
|
+
old_wd = os.getcwd()
|
|
480
|
+
os.chdir(other_tmp_dir)
|
|
481
|
+
try:
|
|
482
|
+
path = cmd.get_ext_fullpath('foo')
|
|
483
|
+
finally:
|
|
484
|
+
os.chdir(old_wd)
|
|
485
|
+
# checking that the last directory is bar
|
|
486
|
+
path = os.path.split(path)[0]
|
|
487
|
+
lastdir = os.path.split(path)[-1]
|
|
488
|
+
assert lastdir == 'bar'
|
|
489
|
+
|
|
490
|
+
def test_ext_fullpath(self):
|
|
491
|
+
ext = sysconfig.get_config_var('EXT_SUFFIX')
|
|
492
|
+
# building lxml.etree inplace
|
|
493
|
+
# etree_c = os.path.join(self.tmp_dir, 'lxml.etree.c')
|
|
494
|
+
# etree_ext = Extension('lxml.etree', [etree_c])
|
|
495
|
+
# dist = Distribution({'name': 'lxml', 'ext_modules': [etree_ext]})
|
|
496
|
+
dist = Distribution()
|
|
497
|
+
cmd = self.build_ext(dist)
|
|
498
|
+
cmd.inplace = True
|
|
499
|
+
cmd.distribution.package_dir = {'': 'src'}
|
|
500
|
+
cmd.distribution.packages = ['lxml', 'lxml.html']
|
|
501
|
+
curdir = os.getcwd()
|
|
502
|
+
wanted = os.path.join(curdir, 'src', 'lxml', 'etree' + ext)
|
|
503
|
+
path = cmd.get_ext_fullpath('lxml.etree')
|
|
504
|
+
assert wanted == path
|
|
505
|
+
|
|
506
|
+
# building lxml.etree not inplace
|
|
507
|
+
cmd.inplace = False
|
|
508
|
+
cmd.build_lib = os.path.join(curdir, 'tmpdir')
|
|
509
|
+
wanted = os.path.join(curdir, 'tmpdir', 'lxml', 'etree' + ext)
|
|
510
|
+
path = cmd.get_ext_fullpath('lxml.etree')
|
|
511
|
+
assert wanted == path
|
|
512
|
+
|
|
513
|
+
# building twisted.runner.portmap not inplace
|
|
514
|
+
build_py = cmd.get_finalized_command('build_py')
|
|
515
|
+
build_py.package_dir = {}
|
|
516
|
+
cmd.distribution.packages = ['twisted', 'twisted.runner.portmap']
|
|
517
|
+
path = cmd.get_ext_fullpath('twisted.runner.portmap')
|
|
518
|
+
wanted = os.path.join(curdir, 'tmpdir', 'twisted', 'runner', 'portmap' + ext)
|
|
519
|
+
assert wanted == path
|
|
520
|
+
|
|
521
|
+
# building twisted.runner.portmap inplace
|
|
522
|
+
cmd.inplace = True
|
|
523
|
+
path = cmd.get_ext_fullpath('twisted.runner.portmap')
|
|
524
|
+
wanted = os.path.join(curdir, 'twisted', 'runner', 'portmap' + ext)
|
|
525
|
+
assert wanted == path
|
|
526
|
+
|
|
527
|
+
@pytest.mark.skipif('platform.system() != "Darwin"')
|
|
528
|
+
@pytest.mark.usefixtures('save_env')
|
|
529
|
+
def test_deployment_target_default(self):
|
|
530
|
+
# Issue 9516: Test that, in the absence of the environment variable,
|
|
531
|
+
# an extension module is compiled with the same deployment target as
|
|
532
|
+
# the interpreter.
|
|
533
|
+
self._try_compile_deployment_target('==', None)
|
|
534
|
+
|
|
535
|
+
@pytest.mark.skipif('platform.system() != "Darwin"')
|
|
536
|
+
@pytest.mark.usefixtures('save_env')
|
|
537
|
+
def test_deployment_target_too_low(self):
|
|
538
|
+
# Issue 9516: Test that an extension module is not allowed to be
|
|
539
|
+
# compiled with a deployment target less than that of the interpreter.
|
|
540
|
+
with pytest.raises(DistutilsPlatformError):
|
|
541
|
+
self._try_compile_deployment_target('>', '10.1')
|
|
542
|
+
|
|
543
|
+
@pytest.mark.skipif('platform.system() != "Darwin"')
|
|
544
|
+
@pytest.mark.usefixtures('save_env')
|
|
545
|
+
def test_deployment_target_higher_ok(self): # pragma: no cover
|
|
546
|
+
# Issue 9516: Test that an extension module can be compiled with a
|
|
547
|
+
# deployment target higher than that of the interpreter: the ext
|
|
548
|
+
# module may depend on some newer OS feature.
|
|
549
|
+
deptarget = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET')
|
|
550
|
+
if deptarget:
|
|
551
|
+
# increment the minor version number (i.e. 10.6 -> 10.7)
|
|
552
|
+
deptarget = [int(x) for x in deptarget.split('.')]
|
|
553
|
+
deptarget[-1] += 1
|
|
554
|
+
deptarget = '.'.join(str(i) for i in deptarget)
|
|
555
|
+
self._try_compile_deployment_target('<', deptarget)
|
|
556
|
+
|
|
557
|
+
def _try_compile_deployment_target(self, operator, target): # pragma: no cover
|
|
558
|
+
if target is None:
|
|
559
|
+
if os.environ.get('MACOSX_DEPLOYMENT_TARGET'):
|
|
560
|
+
del os.environ['MACOSX_DEPLOYMENT_TARGET']
|
|
561
|
+
else:
|
|
562
|
+
os.environ['MACOSX_DEPLOYMENT_TARGET'] = target
|
|
563
|
+
|
|
564
|
+
jaraco.path.build(
|
|
565
|
+
{
|
|
566
|
+
'deptargetmodule.c': textwrap.dedent(f"""\
|
|
567
|
+
#include <AvailabilityMacros.h>
|
|
568
|
+
|
|
569
|
+
int dummy;
|
|
570
|
+
|
|
571
|
+
#if TARGET {operator} MAC_OS_X_VERSION_MIN_REQUIRED
|
|
572
|
+
#else
|
|
573
|
+
#error "Unexpected target"
|
|
574
|
+
#endif
|
|
575
|
+
|
|
576
|
+
"""),
|
|
577
|
+
},
|
|
578
|
+
self.tmp_path,
|
|
579
|
+
)
|
|
580
|
+
|
|
581
|
+
# get the deployment target that the interpreter was built with
|
|
582
|
+
target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET')
|
|
583
|
+
target = tuple(map(int, target.split('.')[0:2]))
|
|
584
|
+
# format the target value as defined in the Apple
|
|
585
|
+
# Availability Macros. We can't use the macro names since
|
|
586
|
+
# at least one value we test with will not exist yet.
|
|
587
|
+
if target[:2] < (10, 10):
|
|
588
|
+
# for 10.1 through 10.9.x -> "10n0"
|
|
589
|
+
tmpl = '{:02}{:01}0'
|
|
590
|
+
else:
|
|
591
|
+
# for 10.10 and beyond -> "10nn00"
|
|
592
|
+
if len(target) >= 2:
|
|
593
|
+
tmpl = '{:02}{:02}00'
|
|
594
|
+
else:
|
|
595
|
+
# 11 and later can have no minor version (11 instead of 11.0)
|
|
596
|
+
tmpl = '{:02}0000'
|
|
597
|
+
target = tmpl.format(*target)
|
|
598
|
+
deptarget_ext = Extension(
|
|
599
|
+
'deptarget',
|
|
600
|
+
[self.tmp_path / 'deptargetmodule.c'],
|
|
601
|
+
extra_compile_args=[f'-DTARGET={target}'],
|
|
602
|
+
)
|
|
603
|
+
dist = Distribution({'name': 'deptarget', 'ext_modules': [deptarget_ext]})
|
|
604
|
+
dist.package_dir = self.tmp_dir
|
|
605
|
+
cmd = self.build_ext(dist)
|
|
606
|
+
cmd.build_lib = self.tmp_dir
|
|
607
|
+
cmd.build_temp = self.tmp_dir
|
|
608
|
+
|
|
609
|
+
try:
|
|
610
|
+
old_stdout = sys.stdout
|
|
611
|
+
if not support.verbose:
|
|
612
|
+
# silence compiler output
|
|
613
|
+
sys.stdout = StringIO()
|
|
614
|
+
try:
|
|
615
|
+
cmd.ensure_finalized()
|
|
616
|
+
cmd.run()
|
|
617
|
+
finally:
|
|
618
|
+
sys.stdout = old_stdout
|
|
619
|
+
|
|
620
|
+
except CompileError:
|
|
621
|
+
self.fail("Wrong deployment target during compilation")
|
|
622
|
+
|
|
623
|
+
|
|
624
|
+
class TestParallelBuildExt(TestBuildExt):
|
|
625
|
+
def build_ext(self, *args, **kwargs):
|
|
626
|
+
build_ext = super().build_ext(*args, **kwargs)
|
|
627
|
+
build_ext.parallel = True
|
|
628
|
+
return build_ext
|