• Xavier Thompson's avatar
    [feat] Use pip install --editable in easy_install.develop · 7ffca476
    Xavier Thompson authored
    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.
    7ffca476
buildout.py 97.2 KB