setuptools 82.0.0__tar.gz → 83.0.0__tar.gz
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.
- {setuptools-82.0.0 → setuptools-83.0.0}/MANIFEST.in +0 -2
- {setuptools-82.0.0 → setuptools-83.0.0}/NEWS.rst +55 -5
- {setuptools-82.0.0/setuptools.egg-info → setuptools-83.0.0}/PKG-INFO +7 -8
- {setuptools-82.0.0 → setuptools-83.0.0}/README.rst +1 -1
- {setuptools-82.0.0 → setuptools-83.0.0}/conftest.py +0 -1
- {setuptools-82.0.0 → setuptools-83.0.0}/docs/conf.py +3 -2
- {setuptools-82.0.0 → setuptools-83.0.0}/docs/deprecated/distutils/apiref.rst +21 -27
- {setuptools-82.0.0 → setuptools-83.0.0}/docs/deprecated/index.rst +10 -0
- {setuptools-82.0.0/docs → setuptools-83.0.0/docs/deprecated}/pkg_resources.rst +48 -10
- setuptools-83.0.0/docs/deprecated/sdist-reproducibility.rst +202 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/docs/development/developer-guide.rst +1 -2
- {setuptools-82.0.0 → setuptools-83.0.0}/docs/index.rst +0 -1
- {setuptools-82.0.0 → setuptools-83.0.0}/docs/setuptools.rst +2 -3
- {setuptools-82.0.0 → setuptools-83.0.0}/docs/userguide/extension.rst +1 -1
- {setuptools-82.0.0 → setuptools-83.0.0}/docs/userguide/quickstart.rst +1 -1
- {setuptools-82.0.0 → setuptools-83.0.0}/mypy.ini +10 -16
- {setuptools-82.0.0 → setuptools-83.0.0}/pyproject.toml +8 -9
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/_modified.py +1 -1
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/command/build.py +4 -4
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/command/build_ext.py +1 -1
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/command/install.py +9 -9
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/command/install_egg_info.py +3 -3
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/compat/py39.py +1 -1
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/compilers/C/base.py +6 -5
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/compilers/C/cygwin.py +3 -1
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/compilers/C/msvc.py +2 -1
- setuptools-83.0.0/setuptools/_distutils/compilers/C/py.typed +1 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/compilers/C/tests/test_base.py +2 -1
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/compilers/C/unix.py +1 -1
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/dist.py +15 -14
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/fancy_getopt.py +1 -1
- setuptools-83.0.0/setuptools/_distutils/py.typed +1 -0
- setuptools-83.0.0/setuptools/_distutils/tests/compat/py39.py +18 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/tests/test_check.py +53 -43
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/tests/test_filelist.py +12 -11
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/tests/test_util.py +1 -8
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/util.py +1 -1
- setuptools-83.0.0/setuptools/_importlib.py +2 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_path.py +4 -4
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_reqs.py +4 -4
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_shutil.py +2 -1
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/build_meta.py +3 -3
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/command/bdist_egg.py +2 -1
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/command/egg_info.py +27 -1
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/compat/py311.py +4 -2
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/config/__init__.py +2 -1
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/config/_apply_pyprojecttoml.py +14 -6
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/config/_validate_pyproject/NOTICE +1 -1
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/config/_validate_pyproject/error_reporting.py +13 -11
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/config/_validate_pyproject/extra_validations.py +73 -4
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/config/_validate_pyproject/fastjsonschema_validations.py +75 -34
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/config/_validate_pyproject/formats.py +77 -15
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/config/expand.py +2 -2
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/config/pyprojecttoml.py +11 -2
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/config/setupcfg.py +3 -3
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/config/setuptools.schema.json +2 -2
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/dist.py +4 -4
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/config/test_apply_pyprojecttoml.py +24 -4
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/config/test_pyprojecttoml.py +23 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/test_build_meta.py +2 -1
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/test_config_discovery.py +3 -9
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/test_manifest.py +45 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/test_setuptools.py +20 -16
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/unicode_utils.py +14 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/warnings.py +1 -1
- {setuptools-82.0.0 → setuptools-83.0.0/setuptools.egg-info}/PKG-INFO +7 -8
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools.egg-info/SOURCES.txt +5 -2
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools.egg-info/requires.txt +5 -4
- {setuptools-82.0.0 → setuptools-83.0.0}/tox.ini +2 -3
- setuptools-82.0.0/setuptools/_distutils/tests/compat/py39.py +0 -40
- setuptools-82.0.0/setuptools/_importlib.py +0 -9
- {setuptools-82.0.0 → setuptools-83.0.0}/LICENSE +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/_distutils_hack/__init__.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/_distutils_hack/override.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/docs/artwork.rst +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/docs/build_meta.rst +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/docs/deprecated/changed_keywords.rst +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/docs/deprecated/commands.rst +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/docs/deprecated/dependency_links.rst +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/docs/deprecated/distutils/_setuptools_disclaimer.rst +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/docs/deprecated/distutils/builtdist.rst +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/docs/deprecated/distutils/commandref.rst +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/docs/deprecated/distutils/configfile.rst +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/docs/deprecated/distutils/examples.rst +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/docs/deprecated/distutils/extending.rst +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/docs/deprecated/distutils/index.rst +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/docs/deprecated/distutils/introduction.rst +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/docs/deprecated/distutils/packageindex.rst +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/docs/deprecated/distutils/setupscript.rst +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/docs/deprecated/distutils/sourcedist.rst +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/docs/deprecated/distutils/uploading.rst +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/docs/deprecated/distutils-legacy.rst +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/docs/deprecated/easy_install.rst +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/docs/deprecated/functionalities.rst +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/docs/deprecated/python_eggs.rst +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/docs/deprecated/resource_extraction.rst +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/docs/deprecated/zip_safe.rst +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/docs/development/index.rst +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/docs/development/releases.rst +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/docs/history.rst +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/docs/python 2 sunset.rst +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/docs/references/keywords.rst +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/docs/roadmap.rst +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/docs/userguide/datafiles.rst +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/docs/userguide/declarative_config.rst +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/docs/userguide/dependency_management.rst +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/docs/userguide/development_mode.rst +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/docs/userguide/distribution.rst +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/docs/userguide/entry_point.rst +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/docs/userguide/ext_modules.rst +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/docs/userguide/index.rst +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/docs/userguide/interfaces.rst +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/docs/userguide/miscellaneous.rst +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/docs/userguide/package_discovery.rst +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/docs/userguide/pyproject_config.rst +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/exercises.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/launcher.c +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/newsfragments/.gitignore +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/newsfragments/README.rst +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/pytest.ini +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setup.cfg +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setup.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/__init__.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_core_metadata.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_discovery.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/__init__.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/_log.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/_macos_compat.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/_msvccompiler.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/archive_util.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/ccompiler.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/cmd.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/command/__init__.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/command/_framework_compat.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/command/bdist.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/command/bdist_dumb.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/command/bdist_rpm.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/command/build_clib.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/command/build_py.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/command/build_scripts.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/command/check.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/command/clean.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/command/config.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/command/install_data.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/command/install_headers.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/command/install_lib.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/command/install_scripts.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/command/sdist.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/compat/__init__.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/compat/numpy.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/compilers/C/errors.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/compilers/C/tests/test_cygwin.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/compilers/C/tests/test_mingw.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/compilers/C/tests/test_msvc.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/compilers/C/tests/test_unix.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/compilers/C/zos.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/core.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/cygwinccompiler.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/debug.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/dep_util.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/dir_util.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/errors.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/extension.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/file_util.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/filelist.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/log.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/spawn.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/sysconfig.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/tests/__init__.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/tests/compat/__init__.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/tests/support.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/tests/test_archive_util.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/tests/test_bdist.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/tests/test_bdist_dumb.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/tests/test_bdist_rpm.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/tests/test_build.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/tests/test_build_clib.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/tests/test_build_ext.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/tests/test_build_py.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/tests/test_build_scripts.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/tests/test_clean.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/tests/test_cmd.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/tests/test_config_cmd.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/tests/test_core.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/tests/test_dir_util.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/tests/test_dist.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/tests/test_extension.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/tests/test_file_util.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/tests/test_install.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/tests/test_install_data.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/tests/test_install_headers.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/tests/test_install_lib.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/tests/test_install_scripts.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/tests/test_log.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/tests/test_modified.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/tests/test_sdist.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/tests/test_spawn.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/tests/test_sysconfig.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/tests/test_text_file.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/tests/test_version.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/tests/test_versionpredicate.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/tests/unix_compat.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/text_file.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/unixccompiler.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/version.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/versionpredicate.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_distutils/zosccompiler.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_entry_points.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_imp.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_itertools.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_normalization.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_scripts.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_static.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/.lock +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/autocommand/__init__.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/autocommand/autoasync.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/autocommand/autocommand.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/autocommand/automain.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/autocommand/autoparse.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/autocommand/errors.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/autocommand-2.2.2.dist-info/INSTALLER +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/autocommand-2.2.2.dist-info/LICENSE +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/autocommand-2.2.2.dist-info/METADATA +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/autocommand-2.2.2.dist-info/RECORD +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/autocommand-2.2.2.dist-info/REQUESTED +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/autocommand-2.2.2.dist-info/WHEEL +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/autocommand-2.2.2.dist-info/top_level.txt +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/backports/__init__.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/backports/tarfile/__init__.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/backports/tarfile/__main__.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/backports/tarfile/compat/__init__.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/backports/tarfile/compat/py38.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/backports.tarfile-1.2.0.dist-info/INSTALLER +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/backports.tarfile-1.2.0.dist-info/LICENSE +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/backports.tarfile-1.2.0.dist-info/METADATA +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/backports.tarfile-1.2.0.dist-info/RECORD +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/backports.tarfile-1.2.0.dist-info/REQUESTED +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/backports.tarfile-1.2.0.dist-info/WHEEL +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/backports.tarfile-1.2.0.dist-info/top_level.txt +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/importlib_metadata/__init__.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/importlib_metadata/_adapters.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/importlib_metadata/_collections.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/importlib_metadata/_compat.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/importlib_metadata/_functools.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/importlib_metadata/_itertools.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/importlib_metadata/_meta.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/importlib_metadata/_text.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/importlib_metadata/_typing.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/importlib_metadata/compat/__init__.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/importlib_metadata/compat/py311.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/importlib_metadata/compat/py39.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/importlib_metadata/diagnose.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/importlib_metadata/py.typed +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/importlib_metadata-8.7.1.dist-info/INSTALLER +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/importlib_metadata-8.7.1.dist-info/METADATA +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/importlib_metadata-8.7.1.dist-info/RECORD +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/importlib_metadata-8.7.1.dist-info/REQUESTED +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/importlib_metadata-8.7.1.dist-info/WHEEL +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/importlib_metadata-8.7.1.dist-info/licenses/LICENSE +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/importlib_metadata-8.7.1.dist-info/top_level.txt +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/jaraco/context/__init__.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/jaraco/context/py.typed +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/jaraco/functools/__init__.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/jaraco/functools/__init__.pyi +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/jaraco/functools/py.typed +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/jaraco/text/Lorem ipsum.txt +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/jaraco/text/__init__.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/jaraco/text/layouts.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/jaraco/text/show-newlines.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/jaraco/text/strip-prefix.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/jaraco/text/to-dvorak.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/jaraco/text/to-qwerty.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/jaraco.text-4.0.0.dist-info/INSTALLER +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/jaraco.text-4.0.0.dist-info/LICENSE +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/jaraco.text-4.0.0.dist-info/METADATA +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/jaraco.text-4.0.0.dist-info/RECORD +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/jaraco.text-4.0.0.dist-info/REQUESTED +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/jaraco.text-4.0.0.dist-info/WHEEL +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/jaraco.text-4.0.0.dist-info/top_level.txt +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/jaraco_context-6.1.0.dist-info/INSTALLER +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/jaraco_context-6.1.0.dist-info/METADATA +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/jaraco_context-6.1.0.dist-info/RECORD +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/jaraco_context-6.1.0.dist-info/REQUESTED +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/jaraco_context-6.1.0.dist-info/WHEEL +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/jaraco_context-6.1.0.dist-info/licenses/LICENSE +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/jaraco_context-6.1.0.dist-info/top_level.txt +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/jaraco_functools-4.4.0.dist-info/INSTALLER +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/jaraco_functools-4.4.0.dist-info/METADATA +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/jaraco_functools-4.4.0.dist-info/RECORD +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/jaraco_functools-4.4.0.dist-info/REQUESTED +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/jaraco_functools-4.4.0.dist-info/WHEEL +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/jaraco_functools-4.4.0.dist-info/licenses/LICENSE +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/jaraco_functools-4.4.0.dist-info/top_level.txt +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/more_itertools/__init__.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/more_itertools/__init__.pyi +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/more_itertools/more.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/more_itertools/more.pyi +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/more_itertools/py.typed +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/more_itertools/recipes.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/more_itertools/recipes.pyi +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/more_itertools-10.8.0.dist-info/INSTALLER +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/more_itertools-10.8.0.dist-info/METADATA +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/more_itertools-10.8.0.dist-info/RECORD +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/more_itertools-10.8.0.dist-info/REQUESTED +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/more_itertools-10.8.0.dist-info/WHEEL +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/more_itertools-10.8.0.dist-info/licenses/LICENSE +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/packaging/__init__.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/packaging/_elffile.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/packaging/_manylinux.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/packaging/_musllinux.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/packaging/_parser.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/packaging/_structures.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/packaging/_tokenizer.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/packaging/licenses/__init__.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/packaging/licenses/_spdx.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/packaging/markers.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/packaging/metadata.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/packaging/py.typed +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/packaging/pylock.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/packaging/requirements.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/packaging/specifiers.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/packaging/tags.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/packaging/utils.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/packaging/version.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/packaging-26.0.dist-info/INSTALLER +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/packaging-26.0.dist-info/METADATA +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/packaging-26.0.dist-info/RECORD +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/packaging-26.0.dist-info/REQUESTED +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/packaging-26.0.dist-info/WHEEL +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/packaging-26.0.dist-info/licenses/LICENSE +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/packaging-26.0.dist-info/licenses/LICENSE.APACHE +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/packaging-26.0.dist-info/licenses/LICENSE.BSD +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/platformdirs/__init__.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/platformdirs/__main__.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/platformdirs/android.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/platformdirs/api.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/platformdirs/macos.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/platformdirs/py.typed +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/platformdirs/unix.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/platformdirs/version.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/platformdirs/windows.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/platformdirs-4.4.0.dist-info/INSTALLER +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/platformdirs-4.4.0.dist-info/METADATA +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/platformdirs-4.4.0.dist-info/RECORD +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/platformdirs-4.4.0.dist-info/REQUESTED +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/platformdirs-4.4.0.dist-info/WHEEL +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/platformdirs-4.4.0.dist-info/licenses/LICENSE +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/ruff.toml +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/tomli/__init__.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/tomli/_parser.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/tomli/_re.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/tomli/_types.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/tomli/py.typed +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/tomli-2.4.0.dist-info/INSTALLER +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/tomli-2.4.0.dist-info/METADATA +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/tomli-2.4.0.dist-info/RECORD +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/tomli-2.4.0.dist-info/REQUESTED +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/tomli-2.4.0.dist-info/WHEEL +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/tomli-2.4.0.dist-info/licenses/LICENSE +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/wheel/__init__.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/wheel/__main__.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/wheel/_bdist_wheel.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/wheel/_commands/__init__.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/wheel/_commands/convert.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/wheel/_commands/pack.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/wheel/_commands/tags.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/wheel/_commands/unpack.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/wheel/_metadata.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/wheel/_setuptools_logging.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/wheel/bdist_wheel.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/wheel/macosx_libfile.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/wheel/metadata.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/wheel/wheelfile.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/wheel-0.46.3.dist-info/INSTALLER +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/wheel-0.46.3.dist-info/METADATA +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/wheel-0.46.3.dist-info/RECORD +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/wheel-0.46.3.dist-info/REQUESTED +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/wheel-0.46.3.dist-info/WHEEL +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/wheel-0.46.3.dist-info/entry_points.txt +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/wheel-0.46.3.dist-info/licenses/LICENSE.txt +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/zipp/__init__.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/zipp/_functools.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/zipp/compat/__init__.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/zipp/compat/overlay.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/zipp/compat/py310.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/zipp/compat/py313.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/zipp/glob.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/zipp-3.23.0.dist-info/INSTALLER +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/zipp-3.23.0.dist-info/METADATA +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/zipp-3.23.0.dist-info/RECORD +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/zipp-3.23.0.dist-info/REQUESTED +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/zipp-3.23.0.dist-info/WHEEL +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/zipp-3.23.0.dist-info/licenses/LICENSE +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/_vendor/zipp-3.23.0.dist-info/top_level.txt +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/archive_util.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/cli-32.exe +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/cli-64.exe +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/cli-arm64.exe +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/cli.exe +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/command/__init__.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/command/_requirestxt.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/command/alias.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/command/bdist_rpm.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/command/bdist_wheel.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/command/build.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/command/build_clib.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/command/build_ext.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/command/build_py.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/command/develop.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/command/dist_info.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/command/easy_install.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/command/editable_wheel.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/command/install.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/command/install_egg_info.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/command/install_lib.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/command/install_scripts.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/command/rotate.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/command/saveopts.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/command/sdist.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/command/setopt.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/command/test.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/compat/__init__.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/compat/py310.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/compat/py312.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/compat/py39.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/config/NOTICE +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/config/_validate_pyproject/__init__.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/config/_validate_pyproject/fastjsonschema_exceptions.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/config/distutils.schema.json +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/depends.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/discovery.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/errors.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/extension.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/glob.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/gui-32.exe +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/gui-64.exe +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/gui-arm64.exe +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/gui.exe +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/installer.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/launch.py +0 -0
- {setuptools-82.0.0/setuptools/command → setuptools-83.0.0/setuptools}/launcher manifest.xml +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/logging.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/modified.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/monkey.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/msvc.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/namespaces.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/script (dev).tmpl +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/script.tmpl +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/__init__.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/compat/__init__.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/compat/py39.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/config/__init__.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/config/downloads/__init__.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/config/downloads/preload.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/config/setupcfg_examples.txt +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/config/test_expand.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/config/test_pyprojecttoml_dynamic_deps.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/config/test_setupcfg.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/contexts.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/environment.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/fixtures.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/indexes/test_links_priority/external.html +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/indexes/test_links_priority/simple/foobar/index.html +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/integration/__init__.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/integration/helpers.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/integration/test_pbr.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/integration/test_pip_install_sdist.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/mod_with_constant.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/namespaces.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/script-with-bom.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/test_archive_util.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/test_bdist_deprecations.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/test_bdist_egg.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/test_bdist_wheel.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/test_build.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/test_build_clib.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/test_build_ext.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/test_build_py.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/test_core_metadata.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/test_depends.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/test_develop.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/test_dist.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/test_dist_info.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/test_distutils_adoption.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/test_editable_install.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/test_egg_info.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/test_extern.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/test_find_packages.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/test_find_py_modules.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/test_glob.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/test_install_scripts.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/test_logging.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/test_namespaces.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/test_scripts.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/test_sdist.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/test_setopt.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/test_shutil_wrapper.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/test_unicode_utils.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/test_virtualenv.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/test_warnings.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/test_wheel.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/test_windows_wrappers.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/text.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/tests/textwrap.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/version.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/wheel.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools/windows_support.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools.egg-info/dependency_links.txt +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools.egg-info/entry_points.txt +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/setuptools.egg-info/top_level.txt +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/tools/build_launchers.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/tools/finalize.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/tools/generate_validation_code.py +0 -0
- {setuptools-82.0.0 → setuptools-83.0.0}/tools/vendored.py +0 -0
|
@@ -3,8 +3,6 @@ recursive-include tests *.py
|
|
|
3
3
|
recursive-include setuptools/tests *.html
|
|
4
4
|
recursive-include docs *.py *.txt *.rst *.conf *.css *.css_t Makefile indexsidebar.html
|
|
5
5
|
recursive-include setuptools/_vendor *
|
|
6
|
-
recursive-include pkg_resources *.py *.txt
|
|
7
|
-
recursive-include pkg_resources/tests/data *
|
|
8
6
|
recursive-include tools *
|
|
9
7
|
recursive-include newsfragments *
|
|
10
8
|
include *.py
|
|
@@ -1,3 +1,52 @@
|
|
|
1
|
+
v83.0.0
|
|
2
|
+
=======
|
|
3
|
+
|
|
4
|
+
Features
|
|
5
|
+
--------
|
|
6
|
+
|
|
7
|
+
- Require Python 3.10 or later.
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
Bugfixes
|
|
11
|
+
--------
|
|
12
|
+
|
|
13
|
+
- ``MANIFEST.in`` matching (via ``FileList``) is now insensitive to Unicode
|
|
14
|
+
normalization form. A pattern authored in one form (e.g. NFC, as typically
|
|
15
|
+
saved by editors) now matches a file whose name is stored on disk in another
|
|
16
|
+
(e.g. NFD, as produced by macOS APFS/HFS+). Previously an ``exclude``,
|
|
17
|
+
``global-exclude``, ``recursive-exclude``, or ``prune`` rule could silently
|
|
18
|
+
fail to drop a non-ASCII-named file from the source distribution, publishing
|
|
19
|
+
it despite the exclusion -- see GHSA-h35f-9h28-mq5c.
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
Deprecations and Removals
|
|
23
|
+
-------------------------
|
|
24
|
+
|
|
25
|
+
- Synced with pypa/distutils@d7633fbed including removal of dry_run support (pypa/distutils#334).
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
v82.0.1
|
|
29
|
+
=======
|
|
30
|
+
|
|
31
|
+
Bugfixes
|
|
32
|
+
--------
|
|
33
|
+
|
|
34
|
+
- Fix the loading of ``launcher manifest.xml`` file. (#5047)
|
|
35
|
+
- Replaced deprecated ``json.__version__`` with fixture in tests. (#5186)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
Improved Documentation
|
|
39
|
+
----------------------
|
|
40
|
+
|
|
41
|
+
- Add advice about how to improve predictability when installing sdists. (#5168)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
Misc
|
|
45
|
+
----
|
|
46
|
+
|
|
47
|
+
- #4941, #5157, #5169, #5175
|
|
48
|
+
|
|
49
|
+
|
|
1
50
|
v82.0.0
|
|
2
51
|
=======
|
|
3
52
|
|
|
@@ -394,6 +443,7 @@ Bugfixes
|
|
|
394
443
|
--------
|
|
395
444
|
|
|
396
445
|
- Backport CVE-47273 from 78.1.1 for Python 3.8. (#4946)
|
|
446
|
+
- Reverted distutils changes that broke the monkey patching of command classes. (#4902)
|
|
397
447
|
|
|
398
448
|
|
|
399
449
|
v75.3.3
|
|
@@ -786,7 +836,7 @@ Features
|
|
|
786
836
|
|
|
787
837
|
- Added return types to typed public functions -- by :user:`Avasam`
|
|
788
838
|
|
|
789
|
-
Marked
|
|
839
|
+
Marked ``pkg_resources`` as ``py.typed`` -- by :user:`Avasam` (#4409)
|
|
790
840
|
|
|
791
841
|
|
|
792
842
|
Misc
|
|
@@ -920,7 +970,7 @@ Features
|
|
|
920
970
|
- Improved `AttributeError` error message if ``pkg_resources.EntryPoint.require`` is called without extras or distribution
|
|
921
971
|
Gracefully "do nothing" when trying to activate a ``pkg_resources.Distribution`` with a `None` location, rather than raising a `TypeError`
|
|
922
972
|
-- by :user:`Avasam` (#4262)
|
|
923
|
-
- Typed the dynamically defined variables from
|
|
973
|
+
- Typed the dynamically defined variables from ``pkg_resources`` -- by :user:`Avasam` (#4267)
|
|
924
974
|
- Modernized and refactored VCS handling in package_index. (#4332)
|
|
925
975
|
|
|
926
976
|
|
|
@@ -1050,8 +1100,8 @@ Features
|
|
|
1050
1100
|
Bugfixes
|
|
1051
1101
|
--------
|
|
1052
1102
|
|
|
1053
|
-
- Clarify some
|
|
1054
|
-
- Return an empty
|
|
1103
|
+
- Clarify some ``pkg_resources`` methods return ``bytes``, not ``str``. Also return an empty ``bytes`` in ``EmptyProvider._get`` -- by :user:`Avasam` (#4243)
|
|
1104
|
+
- Return an empty ``list`` by default in ``pkg_resources.ResourceManager.cleanup_resources`` -- by :user:`Avasam` (#4244)
|
|
1055
1105
|
- Made ``pkg_resoursces.NullProvider``'s ``has_metadata`` and ``metadata_isdir`` methods return actual booleans like all other Providers. -- by :user:`Avasam` (#4254)
|
|
1056
1106
|
|
|
1057
1107
|
|
|
@@ -1084,7 +1134,7 @@ Features
|
|
|
1084
1134
|
--------
|
|
1085
1135
|
|
|
1086
1136
|
- Updated and removed obsolete Python < 3.8 code and comments. -- by :user:`Avasam` (#4096)
|
|
1087
|
-
- Updated
|
|
1137
|
+
- Updated ``pkg_resources`` to use stdlib ``importlib.machinery`` instead of ``importlib_machinery`` -- by :user:`Avasam` (#4097)
|
|
1088
1138
|
|
|
1089
1139
|
|
|
1090
1140
|
Bugfixes
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: setuptools
|
|
3
|
-
Version:
|
|
4
|
-
Summary:
|
|
3
|
+
Version: 83.0.0
|
|
4
|
+
Summary: Most extensible Python build backend with support for C/C++ extension modules
|
|
5
5
|
Author-email: Python Packaging Authority <distutils-sig@python.org>
|
|
6
6
|
License-Expression: MIT
|
|
7
7
|
Project-URL: Source, https://github.com/pypa/setuptools
|
|
@@ -16,7 +16,7 @@ Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
|
16
16
|
Classifier: Topic :: System :: Archiving :: Packaging
|
|
17
17
|
Classifier: Topic :: System :: Systems Administration
|
|
18
18
|
Classifier: Topic :: Utilities
|
|
19
|
-
Requires-Python: >=3.
|
|
19
|
+
Requires-Python: >=3.10
|
|
20
20
|
Description-Content-Type: text/x-rst
|
|
21
21
|
License-File: LICENSE
|
|
22
22
|
Provides-Extra: test
|
|
@@ -63,19 +63,18 @@ Requires-Dist: jaraco.text>=3.7; extra == "core"
|
|
|
63
63
|
Requires-Dist: importlib_metadata>=6; python_version < "3.10" and extra == "core"
|
|
64
64
|
Requires-Dist: tomli>=2.0.1; python_version < "3.11" and extra == "core"
|
|
65
65
|
Requires-Dist: wheel>=0.43.0; extra == "core"
|
|
66
|
-
Requires-Dist: platformdirs>=4.2.2; extra == "core"
|
|
67
66
|
Requires-Dist: jaraco.functools>=4; extra == "core"
|
|
68
67
|
Requires-Dist: more_itertools; extra == "core"
|
|
69
68
|
Provides-Extra: check
|
|
70
|
-
Requires-Dist: pytest-checkdocs>=2.
|
|
69
|
+
Requires-Dist: pytest-checkdocs>=2.14; extra == "check"
|
|
71
70
|
Requires-Dist: pytest-ruff>=0.2.1; sys_platform != "cygwin" and extra == "check"
|
|
72
71
|
Requires-Dist: ruff>=0.13.0; sys_platform != "cygwin" and extra == "check"
|
|
73
72
|
Provides-Extra: cover
|
|
74
73
|
Requires-Dist: pytest-cov; extra == "cover"
|
|
75
74
|
Provides-Extra: enabler
|
|
76
|
-
Requires-Dist: pytest-enabler>=
|
|
75
|
+
Requires-Dist: pytest-enabler>=3.4; extra == "enabler"
|
|
77
76
|
Provides-Extra: type
|
|
78
|
-
Requires-Dist: pytest-mypy; extra == "type"
|
|
77
|
+
Requires-Dist: pytest-mypy>=1.0.1; platform_python_implementation != "PyPy" and extra == "type"
|
|
79
78
|
Requires-Dist: mypy==1.18.*; extra == "type"
|
|
80
79
|
Requires-Dist: importlib_metadata>=7.0.2; python_version < "3.10" and extra == "type"
|
|
81
80
|
Requires-Dist: jaraco.develop>=7.21; sys_platform != "cygwin" and extra == "type"
|
|
@@ -97,7 +96,7 @@ Dynamic: license-file
|
|
|
97
96
|
.. |docs-badge| image:: https://img.shields.io/readthedocs/setuptools/latest.svg
|
|
98
97
|
:target: https://setuptools.pypa.io
|
|
99
98
|
|
|
100
|
-
.. |skeleton-badge| image:: https://img.shields.io/badge/skeleton-
|
|
99
|
+
.. |skeleton-badge| image:: https://img.shields.io/badge/skeleton-2026-informational
|
|
101
100
|
:target: https://blog.jaraco.com/skeleton
|
|
102
101
|
|
|
103
102
|
.. |codecov-badge| image:: https://img.shields.io/codecov/c/github/pypa/setuptools/master.svg?logo=codecov&logoColor=white
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
.. |docs-badge| image:: https://img.shields.io/readthedocs/setuptools/latest.svg
|
|
15
15
|
:target: https://setuptools.pypa.io
|
|
16
16
|
|
|
17
|
-
.. |skeleton-badge| image:: https://img.shields.io/badge/skeleton-
|
|
17
|
+
.. |skeleton-badge| image:: https://img.shields.io/badge/skeleton-2026-informational
|
|
18
18
|
:target: https://blog.jaraco.com/skeleton
|
|
19
19
|
|
|
20
20
|
.. |codecov-badge| image:: https://img.shields.io/codecov/c/github/pypa/setuptools/master.svg?logo=codecov&logoColor=white
|
|
@@ -146,6 +146,7 @@ extensions += ['sphinx_reredirects']
|
|
|
146
146
|
redirects = {
|
|
147
147
|
"userguide/keywords": "/deprecated/changed_keywords.html",
|
|
148
148
|
"userguide/commands": "/deprecated/commands.html",
|
|
149
|
+
"pkg_resources": "/deprecated/pkg_resources.html",
|
|
149
150
|
}
|
|
150
151
|
|
|
151
152
|
# Add support for inline tabs
|
|
@@ -238,8 +239,8 @@ favicons = [
|
|
|
238
239
|
]
|
|
239
240
|
|
|
240
241
|
intersphinx_mapping.update({
|
|
241
|
-
'pip': ('https://pip.pypa.io/en/
|
|
242
|
-
'build': ('https://build.pypa.io/en/
|
|
242
|
+
'pip': ('https://pip.pypa.io/en/stable', None),
|
|
243
|
+
'build': ('https://build.pypa.io/en/stable', None),
|
|
243
244
|
'PyPUG': ('https://packaging.python.org/en/latest', None),
|
|
244
245
|
'pytest': ('https://docs.pytest.org/en/stable', None),
|
|
245
246
|
'packaging': ('https://packaging.pypa.io/en/latest', None),
|
|
@@ -361,7 +361,7 @@ This module provides the following functions.
|
|
|
361
361
|
are not given.
|
|
362
362
|
|
|
363
363
|
|
|
364
|
-
.. function:: new_compiler(plat=None, compiler=None, verbose=False,
|
|
364
|
+
.. function:: new_compiler(plat=None, compiler=None, verbose=False, force=False)
|
|
365
365
|
|
|
366
366
|
Factory function to generate an instance of some CCompiler subclass for the
|
|
367
367
|
supplied platform/compiler combination. *plat* defaults to ``os.name`` (eg.
|
|
@@ -383,7 +383,7 @@ This module provides the following functions.
|
|
|
383
383
|
to :command:`build`, :command:`build_ext`, :command:`build_clib`).
|
|
384
384
|
|
|
385
385
|
|
|
386
|
-
.. class:: CCompiler([verbose=False,
|
|
386
|
+
.. class:: CCompiler([verbose=False, force=False])
|
|
387
387
|
|
|
388
388
|
The abstract base class :class:`CCompiler` defines the interface that must be
|
|
389
389
|
implemented by real compiler classes. The class also has some utility methods
|
|
@@ -398,8 +398,7 @@ This module provides the following functions.
|
|
|
398
398
|
or per-link basis.
|
|
399
399
|
|
|
400
400
|
The constructor for each subclass creates an instance of the Compiler object.
|
|
401
|
-
Flags are *verbose* (show verbose output)
|
|
402
|
-
steps) and *force* (rebuild everything, regardless of dependencies). All of
|
|
401
|
+
Flags are *verbose* (show verbose output) and *force* (rebuild everything, regardless of dependencies). All of
|
|
403
402
|
these flags default to ``0`` (off). Note that you probably don't want to
|
|
404
403
|
instantiate :class:`CCompiler` or one of its subclasses directly - use the
|
|
405
404
|
:func:`distutils.CCompiler.new_compiler` factory function instead.
|
|
@@ -755,8 +754,7 @@ This module provides the following functions.
|
|
|
755
754
|
.. method:: CCompiler.execute(func, args[, msg=None, level=1])
|
|
756
755
|
|
|
757
756
|
Invokes :func:`distutils.util.execute`. This method invokes a Python function
|
|
758
|
-
*func* with the given arguments *args*, after
|
|
759
|
-
the *dry_run* flag.
|
|
757
|
+
*func* with the given arguments *args*, after logging.
|
|
760
758
|
|
|
761
759
|
|
|
762
760
|
.. method:: CCompiler.spawn(cmd)
|
|
@@ -884,7 +882,7 @@ This module provides a few functions for creating archive files, such as
|
|
|
884
882
|
tarballs or zipfiles.
|
|
885
883
|
|
|
886
884
|
|
|
887
|
-
.. function:: make_archive(base_name, format[, root_dir=None, base_dir=None, verbose=False
|
|
885
|
+
.. function:: make_archive(base_name, format[, root_dir=None, base_dir=None, verbose=False])
|
|
888
886
|
|
|
889
887
|
Create an archive file (eg. ``zip`` or ``tar``). *base_name* is the name of
|
|
890
888
|
the file to create, minus any format-specific extension; *format* is the
|
|
@@ -900,7 +898,7 @@ tarballs or zipfiles.
|
|
|
900
898
|
Added support for the ``xztar`` format.
|
|
901
899
|
|
|
902
900
|
|
|
903
|
-
.. function:: make_tarball(base_name, base_dir[, compress='gzip', verbose=False
|
|
901
|
+
.. function:: make_tarball(base_name, base_dir[, compress='gzip', verbose=False])
|
|
904
902
|
|
|
905
903
|
'Create an (optional compressed) archive as a tar file from all files in and
|
|
906
904
|
under *base_dir*. *compress* must be ``'gzip'`` (the default),
|
|
@@ -915,7 +913,7 @@ tarballs or zipfiles.
|
|
|
915
913
|
Added support for the ``xz`` compression.
|
|
916
914
|
|
|
917
915
|
|
|
918
|
-
.. function:: make_zipfile(base_name, base_dir[, verbose=False
|
|
916
|
+
.. function:: make_zipfile(base_name, base_dir[, verbose=False])
|
|
919
917
|
|
|
920
918
|
Create a zip file from all files in and under *base_dir*. The output zip file
|
|
921
919
|
will be named *base_name* + :file:`.zip`. Uses either the :mod:`zipfile` Python
|
|
@@ -978,7 +976,7 @@ This module provides functions for operating on directories and trees of
|
|
|
978
976
|
directories.
|
|
979
977
|
|
|
980
978
|
|
|
981
|
-
.. function:: mkpath(name[, mode=0o777, verbose=False
|
|
979
|
+
.. function:: mkpath(name[, mode=0o777, verbose=False])
|
|
982
980
|
|
|
983
981
|
Create a directory and any missing ancestor directories. If the directory
|
|
984
982
|
already exists (or if *name* is the empty string, which means the current
|
|
@@ -989,17 +987,17 @@ directories.
|
|
|
989
987
|
directories actually created.
|
|
990
988
|
|
|
991
989
|
|
|
992
|
-
.. function:: create_tree(base_dir, files[, mode=0o777, verbose=False
|
|
990
|
+
.. function:: create_tree(base_dir, files[, mode=0o777, verbose=False])
|
|
993
991
|
|
|
994
992
|
Create all the empty directories under *base_dir* needed to put *files* there.
|
|
995
993
|
*base_dir* is just the name of a directory which doesn't necessarily exist
|
|
996
994
|
yet; *files* is a list of filenames to be interpreted relative to *base_dir*.
|
|
997
995
|
*base_dir* + the directory portion of every file in *files* will be created if
|
|
998
|
-
it doesn't already exist. *mode
|
|
996
|
+
it doesn't already exist. *mode* and *verbose* flags are as for
|
|
999
997
|
:func:`mkpath`.
|
|
1000
998
|
|
|
1001
999
|
|
|
1002
|
-
.. function:: copy_tree(src, dst[, preserve_mode=True, preserve_times=True, preserve_symlinks=False, update=False, verbose=False
|
|
1000
|
+
.. function:: copy_tree(src, dst[, preserve_mode=True, preserve_times=True, preserve_symlinks=False, update=False, verbose=False])
|
|
1003
1001
|
|
|
1004
1002
|
Copy an entire directory tree *src* to a new location *dst*. Both *src* and
|
|
1005
1003
|
*dst* must be directory names. If *src* is not a directory, raise
|
|
@@ -1007,7 +1005,7 @@ directories.
|
|
|
1007
1005
|
:func:`mkpath`. The end result of the copy is that every file in *src* is
|
|
1008
1006
|
copied to *dst*, and directories under *src* are recursively copied to *dst*.
|
|
1009
1007
|
Return the list of files that were copied or might have been copied, using their
|
|
1010
|
-
output name. The return value is unaffected by *update
|
|
1008
|
+
output name. The return value is unaffected by *update*: it is
|
|
1011
1009
|
simply the list of all files under *src*, with the names changed to be under
|
|
1012
1010
|
*dst*.
|
|
1013
1011
|
|
|
@@ -1026,7 +1024,7 @@ directories.
|
|
|
1026
1024
|
.. versionchanged:: 3.3.1
|
|
1027
1025
|
NFS files are ignored.
|
|
1028
1026
|
|
|
1029
|
-
.. function:: remove_tree(directory[, verbose=False
|
|
1027
|
+
.. function:: remove_tree(directory[, verbose=False])
|
|
1030
1028
|
|
|
1031
1029
|
Recursively remove *directory* and all files and directories underneath it. Any
|
|
1032
1030
|
errors are ignored (apart from being reported to ``sys.stdout`` if *verbose* is
|
|
@@ -1043,7 +1041,7 @@ directories.
|
|
|
1043
1041
|
This module contains some utility functions for operating on individual files.
|
|
1044
1042
|
|
|
1045
1043
|
|
|
1046
|
-
.. function:: copy_file(src, dst[, preserve_mode=True, preserve_times=True, update=False, link=None, verbose=False
|
|
1044
|
+
.. function:: copy_file(src, dst[, preserve_mode=True, preserve_times=True, update=False, link=None, verbose=False])
|
|
1047
1045
|
|
|
1048
1046
|
Copy file *src* to *dst*. If *dst* is a directory, then *src* is copied there
|
|
1049
1047
|
with the same name; otherwise, it must be a filename. (If the file exists, it
|
|
@@ -1062,8 +1060,7 @@ This module contains some utility functions for operating on individual files.
|
|
|
1062
1060
|
contents.
|
|
1063
1061
|
|
|
1064
1062
|
Return a tuple ``(dest_name, copied)``: *dest_name* is the actual name of the
|
|
1065
|
-
output file, and *copied* is true if the file was copied
|
|
1066
|
-
copied, if *dry_run* true).
|
|
1063
|
+
output file, and *copied* is true if the file was copied.
|
|
1067
1064
|
|
|
1068
1065
|
.. % XXX if the destination file already exists, we clobber it if
|
|
1069
1066
|
.. % copying, but blow up if linking. Hmmm. And I don't know what
|
|
@@ -1073,7 +1070,7 @@ This module contains some utility functions for operating on individual files.
|
|
|
1073
1070
|
.. % (not update) and (src newer than dst)).
|
|
1074
1071
|
|
|
1075
1072
|
|
|
1076
|
-
.. function:: move_file(src, dst[, verbose
|
|
1073
|
+
.. function:: move_file(src, dst[, verbose])
|
|
1077
1074
|
|
|
1078
1075
|
Move file *src* to *dst*. If *dst* is a directory, the file will be moved into
|
|
1079
1076
|
it with the same name; otherwise, *src* is just renamed to *dst*. Returns the
|
|
@@ -1216,12 +1213,12 @@ other utility module.
|
|
|
1216
1213
|
.. % Should probably be moved into the standard library.
|
|
1217
1214
|
|
|
1218
1215
|
|
|
1219
|
-
.. function:: execute(func, args[, msg=None, verbose=False
|
|
1216
|
+
.. function:: execute(func, args[, msg=None, verbose=False])
|
|
1220
1217
|
|
|
1221
1218
|
Perform some action that affects the outside world (for instance, writing to the
|
|
1222
|
-
filesystem).
|
|
1223
|
-
*dry_run* flag.
|
|
1224
|
-
|
|
1219
|
+
filesystem). Historically, such actions were special because they could be disabled
|
|
1220
|
+
by a *dry_run* flag. This method takes care of all that bureaucracy;
|
|
1221
|
+
simply supply the function to call and an argument tuple for it (to
|
|
1225
1222
|
embody the "external action" being performed), and an optional message to print.
|
|
1226
1223
|
|
|
1227
1224
|
|
|
@@ -1234,7 +1231,7 @@ other utility module.
|
|
|
1234
1231
|
:exc:`ValueError` if *val* is anything else.
|
|
1235
1232
|
|
|
1236
1233
|
|
|
1237
|
-
.. function:: byte_compile(py_files[, optimize=0, force=False, prefix=None, base_dir=None, verbose=True,
|
|
1234
|
+
.. function:: byte_compile(py_files[, optimize=0, force=False, prefix=None, base_dir=None, verbose=True, direct=None])
|
|
1238
1235
|
|
|
1239
1236
|
Byte-compile a collection of Python source files to :file:`.pyc` files in a
|
|
1240
1237
|
:file:`__pycache__` subdirectory (see :pep:`3147` and :pep:`488`).
|
|
@@ -1254,9 +1251,6 @@ other utility module.
|
|
|
1254
1251
|
stripped). You can supply either or both (or neither) of *prefix* and
|
|
1255
1252
|
*base_dir*, as you wish.
|
|
1256
1253
|
|
|
1257
|
-
If *dry_run* is true, doesn't actually do anything that would affect the
|
|
1258
|
-
filesystem.
|
|
1259
|
-
|
|
1260
1254
|
Byte-compilation is either done directly in this interpreter process with the
|
|
1261
1255
|
standard :mod:`py_compile` module, or indirectly by writing a temporary script
|
|
1262
1256
|
and executing it. Normally, you should let :func:`byte_compile` figure out to
|
|
@@ -23,3 +23,13 @@ objectives.
|
|
|
23
23
|
distutils-legacy
|
|
24
24
|
functionalities
|
|
25
25
|
commands
|
|
26
|
+
pkg_resources
|
|
27
|
+
|
|
28
|
+
Notes for Consumers of Packages Built with Setuptools
|
|
29
|
+
=====================================================
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
.. toctree::
|
|
33
|
+
:maxdepth: 1
|
|
34
|
+
|
|
35
|
+
sdist-reproducibility
|
|
@@ -2,7 +2,54 @@
|
|
|
2
2
|
Package Discovery and Resource Access using ``pkg_resources``
|
|
3
3
|
=============================================================
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
.. attention:: **This documentation is retained solely for historical purposes**
|
|
6
|
+
|
|
7
|
+
``pkg_resources`` has long been **discouraged** due to architectural
|
|
8
|
+
limitations that led to persistent performance issues.
|
|
9
|
+
These limitations were inherent to its design (e.g. importing on startup,
|
|
10
|
+
scanning the entire environment for metadata, and eager, global
|
|
11
|
+
working‑set management) and could not be corrected.
|
|
12
|
+
|
|
13
|
+
.. version-deprecated:: v67.5.0
|
|
14
|
+
``pkg_resources`` issued official deprecation warnings as early as
|
|
15
|
+
``setuptools`` **v67.5.0**.
|
|
16
|
+
|
|
17
|
+
.. version-removed:: v82.0.0
|
|
18
|
+
``pkg_resources`` is no longer maintained, no longer used internally by
|
|
19
|
+
``setuptools``, and is no longer included in current
|
|
20
|
+
distributions/installations as of ``setuptools`` **v82.0.0**.
|
|
21
|
+
|
|
22
|
+
Projects must migrate away from ``pkg_resources``. The recommended
|
|
23
|
+
replacements are:
|
|
24
|
+
|
|
25
|
+
* Resource access: use :mod:`importlib.resources`
|
|
26
|
+
(or its backport :pypi:`importlib_resources`).
|
|
27
|
+
* Distribution metadata & entry points: use :mod:`importlib.metadata`
|
|
28
|
+
(or its backport :pypi:`importlib_metadata`).
|
|
29
|
+
* Requirement and version parsing: use :pypi:`packaging`.
|
|
30
|
+
This includes parsing and evaluating ``extras`` and markers via
|
|
31
|
+
``packaging.requirements.Requirement`` and ``packaging.markers.Marker``.
|
|
32
|
+
Note that automatic installation or detection of extras is not provided;
|
|
33
|
+
projects requiring that behaviour must implement it themselves using
|
|
34
|
+
a combination of ``packaging``, ``importlib.metadata`` and other tools
|
|
35
|
+
as building blocks.
|
|
36
|
+
* Coexistence of multiple versions of a package: please consider using a different
|
|
37
|
+
approach, as this functionality is not supported by Python itself.
|
|
38
|
+
Alternatives include isolated environments and orchestration tools
|
|
39
|
+
(:mod:`venv`, :pypi:`tox`, :pypi:`nox`, etc.).
|
|
40
|
+
* Handling of ``.egg`` distributions: please consider using a different
|
|
41
|
+
approach, as the ``.egg`` and ``easy_install`` mechanisms have also been
|
|
42
|
+
discontinued.
|
|
43
|
+
Please use currently supported packaging formats
|
|
44
|
+
(see :external+PyPUG:doc:`specifications/section-distribution-formats`)
|
|
45
|
+
and build/installation workflows (see :pep:`517`).
|
|
46
|
+
|
|
47
|
+
**Note:** The following documentation may no longer accurately describe the
|
|
48
|
+
behaviour of the distributed package and has been frozen at the last
|
|
49
|
+
``setuptools`` release that still contained ``pkg_resources``.
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
The ``pkg_resources`` module provides an API
|
|
6
53
|
for Python libraries to access their resource files, and for extensible
|
|
7
54
|
applications and frameworks to automatically discover plugins. It also
|
|
8
55
|
provides runtime support for using C extensions that are inside zipfile-format
|
|
@@ -10,15 +57,6 @@ eggs, support for merging packages that have separately-distributed modules or
|
|
|
10
57
|
subpackages, and APIs for managing Python's current "working set" of active
|
|
11
58
|
packages.
|
|
12
59
|
|
|
13
|
-
.. attention::
|
|
14
|
-
Use of ``pkg_resources`` is deprecated in favor of
|
|
15
|
-
:mod:`importlib.resources`, :mod:`importlib.metadata`
|
|
16
|
-
and their backports (:pypi:`importlib_resources`, :pypi:`importlib_metadata`).
|
|
17
|
-
Some useful APIs are also provided by :pypi:`packaging` (e.g. requirements
|
|
18
|
-
and version parsing).
|
|
19
|
-
Users should refrain from new usage of ``pkg_resources`` and
|
|
20
|
-
should work to port to importlib-based solutions.
|
|
21
|
-
|
|
22
60
|
|
|
23
61
|
--------
|
|
24
62
|
Overview
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
===========================================================================================
|
|
2
|
+
Drawbacks of installing source distributions (``sdist``) and how to improve reproducibility
|
|
3
|
+
===========================================================================================
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
.. admonition:: Scope and audience
|
|
7
|
+
|
|
8
|
+
This page contains relevant information for **package consumers** (people
|
|
9
|
+
installing third-party projects that may have been built with Setuptools).
|
|
10
|
+
It explains why installing from :external+PyPUG:term:`Source Distributions
|
|
11
|
+
<Source Distribution (or "sdist")>` can be less predictable than installing
|
|
12
|
+
from :external+PyPUG:term:`wheels <Wheel>`, and contains tips on how to improve
|
|
13
|
+
**installation-time** reproducibility. It does **not** describe how to build
|
|
14
|
+
packages with Setuptools, nor is it a statement of policy about what
|
|
15
|
+
publishers must do [#publishing]_.
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
The ``sdist`` format was one of the first packaging formats to be created by the
|
|
19
|
+
Python community (predating the advent of ``wheel``). Although very
|
|
20
|
+
useful today to distribute and share Python libraries and applications,
|
|
21
|
+
``sdist``\s are notoriously difficult to work with in circumstances that
|
|
22
|
+
require high build reproducibility and tolerance to disruptions.
|
|
23
|
+
|
|
24
|
+
This guide reviews the concept of ``sdist``, highlights its potential uses
|
|
25
|
+
and drawbacks and explores potential practices to improve build reproducibility
|
|
26
|
+
when relying on ``sdist``\s.
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
What is an ``sdist``?
|
|
30
|
+
=====================
|
|
31
|
+
|
|
32
|
+
You can read more about the ``sdist`` format and its ``wheel`` counterpart in
|
|
33
|
+
:external+PyPUG:doc:`discussions/package-formats`, but for the sake of this
|
|
34
|
+
document an ``sdist`` can be considered a simple ``.tar.gz`` archive that
|
|
35
|
+
contains all the files necessary to build a Python project that later will be
|
|
36
|
+
installed in the end-user's environment.
|
|
37
|
+
|
|
38
|
+
The most defining characteristic of the ``sdist`` format is its
|
|
39
|
+
platform-independence, as the distributions do not include binary executable files.
|
|
40
|
+
This format is very flexible and, although usually composed by a simple copy
|
|
41
|
+
of the source code files with some extra metadata files added, it can also include
|
|
42
|
+
platform-independent code automatically generated during the build
|
|
43
|
+
phase [#examples]_.
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
When is an ``sdist`` useful?
|
|
47
|
+
============================
|
|
48
|
+
|
|
49
|
+
Sometimes it can be tricky to distribute Python packages that contain binary
|
|
50
|
+
extensions, especially when they are built for platforms that do not define a
|
|
51
|
+
cross-version stable ABI_.
|
|
52
|
+
Moreover package indexes like PyPI_ may restrict their offer to a handful of
|
|
53
|
+
well-known platforms.
|
|
54
|
+
Finally, for certain edge cases, the build process may require machine specific
|
|
55
|
+
parameters.
|
|
56
|
+
|
|
57
|
+
In this context, distributing code via ``sdist``\s becomes a valuable fallback.
|
|
58
|
+
It allows users in other platforms to access the source code
|
|
59
|
+
and attempt to recompile the extensions locally.
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
What are the drawbacks of an ``sdist``?
|
|
63
|
+
=======================================
|
|
64
|
+
|
|
65
|
+
Despite their usefulness, working with ``sdist``\s can be challenging. One
|
|
66
|
+
major difficulty is reconstructing a compatible build environment in which the
|
|
67
|
+
``sdist`` can be processed into a ``wheel``, especially when it comes to build
|
|
68
|
+
dependencies.
|
|
69
|
+
|
|
70
|
+
While :pep:`518` introduced a standard for declaring build dependencies
|
|
71
|
+
distributed as Python packages (e.g. via PyPI), many projects also rely on
|
|
72
|
+
non-Python dependencies, such as compilers and binary system-level libraries,
|
|
73
|
+
that are not declared as a standard metadata. These dependencies can vary
|
|
74
|
+
significantly across systems and its installation is often not automated and
|
|
75
|
+
undocumented, i.e., simply assumed to be present.
|
|
76
|
+
|
|
77
|
+
Another issue is *tooling drift*: even if a project was originally buildable
|
|
78
|
+
from its ``sdist``, changes in the build dependencies (e.g., updates,
|
|
79
|
+
deprecations and security fixes) can break compatibility over time [#pinning]_.
|
|
80
|
+
This is a natural tendency of software systems and especially true for older
|
|
81
|
+
projects.
|
|
82
|
+
|
|
83
|
+
Therefore, mission-critical systems and environments that cannot afford
|
|
84
|
+
unforeseen/unintended interruptions should not rely on ``sdist``\s.
|
|
85
|
+
If your project or product requires high reliability and minimal disruption,
|
|
86
|
+
you should adapt your workflow to increase resiliency and reproducibility or
|
|
87
|
+
disallow ``sdist``\s all together.
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
How to improve reproducibility in your workflow and avoid ``sdist`` drawbacks?
|
|
91
|
+
==============================================================================
|
|
92
|
+
|
|
93
|
+
The first step to improve your workflow is to determine whether your workflow
|
|
94
|
+
is directly or indirectly relying on ``sdist``\s — and to prevent them from being
|
|
95
|
+
compiled on demand.
|
|
96
|
+
|
|
97
|
+
Installers like ``pip`` or ``uv`` have options that help with this.
|
|
98
|
+
For example, you can set the environment variable |PIP_ONLY_BINARY|_ with
|
|
99
|
+
the value ``:all:``, to prevent ``sdist``\s from being installed
|
|
100
|
+
(see the corresponding `uv alternative`_).
|
|
101
|
+
When this setting is enabled, any installation that fails will indicate which
|
|
102
|
+
packages are not available as ``wheel``\s, helping you pinpoint installations
|
|
103
|
+
relying on ``sdist``\s.
|
|
104
|
+
|
|
105
|
+
Once these packages are identified, the next step is to build them in
|
|
106
|
+
a controlled environment.
|
|
107
|
+
You can use ``pip``\'s |PIP_CONSTRAINT|_ / |PIP_BUILD_CONSTRAINT|_
|
|
108
|
+
environment variables or the
|
|
109
|
+
|build-constraint|_ ``uv``\'s CLI option to enforce specific versions of
|
|
110
|
+
Python packages [#build-isolation]_.
|
|
111
|
+
|
|
112
|
+
To further improve the consistency of OS-level tools and libraries,
|
|
113
|
+
you can leverage your CI/CD provider's configuration method, for example
|
|
114
|
+
`GitHub Workflows`_, `Bitbucket Pipelines`_, `GitLab CI/CD`_, Jenkins_,
|
|
115
|
+
CircleCI_ or Semaphore_.
|
|
116
|
+
|
|
117
|
+
Alternatively, you can use containers (e.g. docker_, nerdctl_ or podman_),
|
|
118
|
+
immutable operating system distributions or package managers (e.g. `NixOS/Nix`_)
|
|
119
|
+
or configuration management tools (e.g. Ansible_, chef_ or puppet_)
|
|
120
|
+
to implement `Infrastructure as Code`_ (IaC) and ensure build environments
|
|
121
|
+
are reproducible and version-controlled.
|
|
122
|
+
|
|
123
|
+
Consider caching the resulting ``wheel``\s
|
|
124
|
+
locally via |wheelhouse directories|_ or hosting them in
|
|
125
|
+
*private package indexes* (such as devpi_).
|
|
126
|
+
This allows you to serve pre-built distributions internally,
|
|
127
|
+
which reduces reliance on external sources, improves build stability,
|
|
128
|
+
and often results in faster workflows as a welcome side effect.
|
|
129
|
+
|
|
130
|
+
Finally, it's important to regularly audit your pinned or cached (build)
|
|
131
|
+
dependencies for known security vulnerabilities and critical bug fixes and/or
|
|
132
|
+
update them accordingly.
|
|
133
|
+
This can be done through an *out-of-band* workflow — such as a scheduled job
|
|
134
|
+
or a monthly CI/CD pipeline — that does not interfere with your
|
|
135
|
+
mission-critical or low-tolerance environments. This approach ensures that your
|
|
136
|
+
systems remain secure and up to date without compromising the stability of your
|
|
137
|
+
primary workflows.
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
.. rubric:: Footnotes
|
|
141
|
+
|
|
142
|
+
.. [#publishing]
|
|
143
|
+
The PyPA recommendation, documented in the `packaging tutorial`_, is to
|
|
144
|
+
publish both ``sdists`` and ``wheels``.
|
|
145
|
+
|
|
146
|
+
.. [#examples]
|
|
147
|
+
Examples of platform-independent generated code in ``sdist``\s include
|
|
148
|
+
``.pyx`` files transpiled into ``.c`` and Python code created from
|
|
149
|
+
``.proto``, JSON schema or grammar files, etc.
|
|
150
|
+
|
|
151
|
+
.. [#pinning]
|
|
152
|
+
Although developers can try to minimize the impact of tooling drift by
|
|
153
|
+
locking the version of build dependencies, this approach also has
|
|
154
|
+
its own drawbacks. In fact, it is very common in the Python community to
|
|
155
|
+
avoid specifying version caps. For a deeper discussion on this topic, see:
|
|
156
|
+
https://iscinumpy.dev/post/bound-version-constraints/ and
|
|
157
|
+
https://hynek.me/articles/semver-will-not-save-you/.
|
|
158
|
+
|
|
159
|
+
.. [#build-isolation]
|
|
160
|
+
When a virtual environment with hand picked versions of build dependencies
|
|
161
|
+
is crafted (either manually or via tools supporting one of the
|
|
162
|
+
:external+PyPUG:doc:`specifications/pylock-toml` or
|
|
163
|
+
:external+pip:doc:`reference/requirements-file-format`), it is also possible
|
|
164
|
+
to use features like |no-isolation|_, |no-build-isolation|_ or the
|
|
165
|
+
`equivalent uv settings`_ to ensure packages are built against the currently
|
|
166
|
+
active virtual environment.
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
.. _ABI: https://en.wikipedia.org/wiki/Application_binary_interface
|
|
170
|
+
.. _PyPI: https://pypi.org
|
|
171
|
+
.. |PIP_ONLY_BINARY| replace:: ``PIP_ONLY_BINARY``
|
|
172
|
+
.. _PIP_ONLY_BINARY: https://pip.pypa.io/en/stable/cli/pip_install/#cmdoption-only-binary
|
|
173
|
+
.. _uv alternative: https://docs.astral.sh/uv/reference/settings/#pip_only-binary
|
|
174
|
+
.. |PIP_CONSTRAINT| replace:: ``PIP_CONSTRAINT``
|
|
175
|
+
.. _PIP_CONSTRAINT: https://pip.pypa.io/en/stable/cli/pip_install/#cmdoption-c
|
|
176
|
+
.. |PIP_BUILD_CONSTRAINT| replace:: ``PIP_BUILD_CONSTRAINT``
|
|
177
|
+
.. _PIP_BUILD_CONSTRAINT: https://pip.pypa.io/en/stable/cli/pip_download/#cmdoption-build-constraint
|
|
178
|
+
.. |build-constraint| replace:: ``--build-constraint``
|
|
179
|
+
.. _build-constraint: https://docs.astral.sh/uv/concepts/projects/build/#build-constraints
|
|
180
|
+
.. _GitHub Workflows: https://docs.github.com/en/actions/writing-workflows
|
|
181
|
+
.. _Bitbucket Pipelines: https://www.atlassian.com/software/bitbucket/features/pipelines
|
|
182
|
+
.. _GitLab CI/CD: https://docs.gitlab.com/ci/
|
|
183
|
+
.. _Jenkins: https://www.jenkins.io/doc/
|
|
184
|
+
.. _CircleCI: https://circleci.com
|
|
185
|
+
.. _Semaphore: https://semaphore.io
|
|
186
|
+
.. _docker: https://www.docker.com
|
|
187
|
+
.. _nerdctl: https://github.com/containerd/nerdctl
|
|
188
|
+
.. _podman: https://podman.io
|
|
189
|
+
.. _NixOS/Nix: https://nixos.org
|
|
190
|
+
.. _Ansible: https://docs.ansible.com
|
|
191
|
+
.. _chef: https://docs.chef.io
|
|
192
|
+
.. _puppet: https://www.puppet.com/docs/index.html
|
|
193
|
+
.. _Infrastructure as Code: https://en.wikipedia.org/wiki/Infrastructure_as_code
|
|
194
|
+
.. |wheelhouse directories| replace:: *"wheelhouse" directories*
|
|
195
|
+
.. _wheelhouse directories: https://pip.pypa.io/en/stable/cli/pip_wheel/#examples
|
|
196
|
+
.. _devpi: https://doc.devpi.net/
|
|
197
|
+
.. |no-isolation| replace:: ``--no-isolation``
|
|
198
|
+
.. _no-isolation: https://build.pypa.io/en/stable/#python--m-build---no-isolation
|
|
199
|
+
.. |no-build-isolation| replace:: ``--no-build-isolation``
|
|
200
|
+
.. _no-build-isolation: https://pip.pypa.io/en/stable/cli/pip_install/#cmdoption-no-build-isolation
|
|
201
|
+
.. _equivalent uv settings: https://docs.astral.sh/uv/concepts/projects/config/#build-isolation
|
|
202
|
+
.. _packaging tutorial: https://packaging.python.org/en/latest/tutorials/packaging-projects/#generating-distribution-archives
|