[feat] Use pip install --editable in easy_install.develop
Instead of running python setup.py develop directly. This will allow using zc.buildout.easy_install.develop on recent projects that have only a pyproject.toml. It also fixes develop leaving build artifacts in the source directory that caused later runs to do nothing, e.g. preventing develop-eggs to be rebuilt when a build dependency passed in setup-eggs option of zc.recipe.egg:develop changed. A verbosity parameter to tune verbosity of pip is added, with adjusted values for the case of buildout:develop and of zc.recipe.egg:develop, so as to remain close to the previous behavior with regards to logs. Technical details: For packages using PEP-660-style editable installs, supported by more recent versions of pip, pip will not delegate to `setup.py develop` - enabling editable installs for pure pyproject.toml projects - and will instead generate a .dist-info metadata folder but not a .egg-link. Since buildout currently requires a .egg-link, as it does not support PEP 660's mechanism that relies on having a sites-packages directory, we need to create this .egg-link after the fact. The tricky part is finding out where the .egg-link should point: the path containing the pyproject.toml, or a subdirectory? For this we make use of *.dist-info/top_level.txt to first determine the list of top-level packages, and then importlib to extract info from the PEP-660-style install. If top_level.txt does not exist, is empty, or otherwise does not list any package that resolves to an import path, fallback to the path of the folder that contains the pyproject.toml as the .egg-link target. If it lists multiple packages that resolve to different import paths, arbitrarily use the first one and emit a warning. Support namespace packages where `spec.submodule_search_locations` is a `_NamespacePath` object instead of a simple `list` and also support cases where the layout of the source project does not follow the same structure as the package tree - meaning some custom magic might be involved in making editable imports work as intended.
Showing
Please register or sign in to comment