• Xavier Thompson's avatar
    [feat] Use pip install --editable in easy_install.develop · 3eda85fb
    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 or is empty, 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.
    3eda85fb
easy_install.py 77.2 KB