Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[WIP] wheel support (and transitively PEP-518), plus pipe display failed commands #852

Merged
merged 8 commits into from
Jun 29, 2018

Conversation

gaborbernat
Copy link
Member

@gaborbernat gaborbernat commented Jun 21, 2018

#850 PEP-518 support: provide a tox configuration flag build which can be either sdist or wheel. For sdist (default) we build the package as before by using python setup.py sdist. However, when wheel is enabled now we'll use pip wheel to build it, and we'll also install wheels in these case into the environments. Note: pip 10 supports specifying project dependencies (such as setuptools-scm, or a given setuptools version) via pyproject.toml. Once pip supports building sdist to we'll migrate over the sdist build too.

#851 While running tox invokes various commands (such as building the package, pip installing dependencies and so on), these were printed in case they failed as Python arrays. Changed the representation to a shell command, allowing the users to quickly replicate/debug the failure on their own.

@gaborbernat gaborbernat added feature:new something does not exist yet, but should feature:change something exists already but should behave differently area:package-building level:medium rought estimate that this might be neither easy nor hard to implement labels Jun 21, 2018
@gaborbernat gaborbernat changed the title [WIP] wheel support (and transitively PEP-518), and pipe display failed commands [WIP] wheel support (and transitively PEP-518), plus pipe display failed commands Jun 21, 2018
@codecov
Copy link

codecov bot commented Jun 21, 2018

Codecov Report

Merging #852 into master will decrease coverage by <1%.
The diff coverage is 78%.

@@          Coverage Diff           @@
##           master   #852    +/-   ##
======================================
- Coverage      93%    92%   -<1%     
======================================
  Files          12     12            
  Lines        2326   2344    +18     
  Branches      408    413     +5     
======================================
+ Hits         2153   2164    +11     
- Misses        107    110     +3     
- Partials       66     70     +4

@gaborbernat
Copy link
Member Author

To be still added is deprecation messages for using the sdist options.

doc/config.rst Outdated
tox will do for the projects package:

- if it's ``none`` tox will not try to build the package (implies no install happens later),
- if it's ``sdist`` it will create a source distribution by using ``distutils``:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd just say "using setup.py sdist", since it's way more likely to go through setuptools anyway

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

doc/config.rst Outdated

.. code-block:: ini

pip build wheel --no-dep
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I believe you mean pip wheel . --no-deps

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

another note, it might be better (even in the wheel case) to:

  1. build an sdist
  2. build a wheel from the sdist

part of the benefit of tox using the

  1. build sdist
  2. install from sdist

ensures that the package is installable (and not depending on workdir state) -- would be good to keep that assertion going forward even in the "install from wheel" case

Copy link
Member Author

@gaborbernat gaborbernat Jun 25, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@asottile what you're describing there is what pip plans to do part of pip wheel command; so we already have that ensured. I would prefer for us to not re-implement the build infrastructure and leave that to the build fronted, e.g. pip.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this would be a step backward until pip 10 has majority adoption and pep518 is actually implemented

Copy link
Member Author

@gaborbernat gaborbernat Jun 25, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We don't have wheel support at the moment. So that's a step ahead. If we implement pep-518 in tox that would be totally redundant over implementing in pip. So I argue if we add this support let's do it in pip so everyone benefits. Inside tox you can upgrade pip, so I don't understand why you would need pip 10 majority adoption. You already get it with latest virtualenv which is installed even with tox 2.x automatically.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The main point I'm making here is:

  • tox is a tool to prevent incorrect packaging
  • unless you're using pip 10 and pep518, building a wheel from the working directory can bypass some checks that tox currently enforces via the "make sdist then install from it" process (due to lack of workdir isolation)

imo we should either:

  • require pip10 + pep518 support to enable build=wheel
  • sdist => wheel => install

Here's an example project which tox would prevent today, but this PR would incorrecty allow with build=wheel:

status quo, correctly failing

$ tail -n999 setup.py tox.ini requirements.txt 
==> setup.py <==
from setuptools import setup

# oops I goofed, should have made a MANIFEST.in
with open('requirements.txt') as f:
    contents = list(f)

setup(
    name='mylib',
    install_requires=contents,
)

==> tox.ini <==
[testenv]
commands =
    pip freeze --all

==> requirements.txt <==
six
$ tox -e py27
GLOB sdist-make: /private/tmp/g/setup.py
py27 create: /private/tmp/g/.tox/py27
py27 inst: /private/tmp/g/.tox/dist/mylib-0.0.0.zip
ERROR: invocation failed (exit code 1), logfile: /private/tmp/g/.tox/py27/log/py27-1.log
ERROR: actionid: py27
msg: installpkg
cmdargs: ['/private/tmp/g/.tox/py27/bin/pip', 'install', '/private/tmp/g/.tox/dist/mylib-0.0.0.zip']

Processing ./.tox/dist/mylib-0.0.0.zip
    Complete output from command python setup.py egg_info:
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/private/tmp/pip-req-build-CCk4wP/setup.py", line 3, in <module>
        with open('requirements.txt') as f:
    IOError: [Errno 2] No such file or directory: 'requirements.txt'
    
    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /private/tmp/pip-req-build-CCk4wP/

___________________________________ summary ____________________________________
ERROR:   py27: InvocationError for command /private/tmp/g/.tox/py27/bin/pip install /private/tmp/g/.tox/dist/mylib-0.0.0.zip (see /private/tmp/g/.tox/py27/log/py27-1.log) (exited with code 1)

your branch, incorrectly succeeding

[tox]
build = wheel
[testenv]
commands =
    pip freeze --all
$ tox -e py36
GLOB wheel-make: /private/tmp/g/setup.py
py36 create: /private/tmp/g/.tox/py36
py36 inst: /private/tmp/g/.tox/dist/mylib-0.0.0-py3-none-any.whl
py36 installed: mylib==0.0.0,six==1.11.0
py36 runtests: PYTHONHASHSEED='1061640697'
py36 runtests: commands[0] | pip freeze --all
mylib==0.0.0
pip==10.0.1
setuptools==39.2.0
six==1.11.0
wheel==0.31.1
___________________________________ summary ____________________________________
  py36: commands succeeded
  congratulations :)

your branch, unrelated also broken thing

(noticed this while making a reproduction) -- tox's python is python3, but venvs is python2 so there's a wheel mismatch

(note that this is covered by my comment below about the open issue to use the virtualenv python instead of tox's python)

$ tox -e py27
GLOB wheel-make: /private/tmp/g/setup.py
py27 inst-nodeps: /private/tmp/g/.tox/dist/mylib-0.0.0-py3-none-any.whl
ERROR: invocation failed (exit code 1), logfile: /private/tmp/g/.tox/py27/log/py27-5.log
ERROR: actionid: py27
msg: installpkg
cmdargs: '/private/tmp/g/.tox/py27/bin/pip install -U --no-deps /private/tmp/g/.tox/dist/mylib-0.0.0-py3-none-any.whl'

mylib-0.0.0-py3-none-any.whl is not a supported wheel on this platform.

___________________________________ summary ____________________________________
ERROR:   py27: InvocationError for command /private/tmp/g/.tox/py27/bin/pip install -U --no-deps /private/tmp/g/.tox/dist/mylib-0.0.0-py3-none-any.whl (see /private/tmp/g/.tox/py27/log/py27-5.log) (exited with code 1)

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This branch wants to implement require pip10 + pep518 support to enable. Will check how come those succeed and alter the code/create pr for pip to fail. thanks!

cwd=self.config.setupdir,
)
else:
raise RuntimeError("invalid build type {}".format(self.config.build))
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

there's an open issue to change these to instead use the virtualenv python (instead of tox's python) to run these builds -- maybe worth changing in this review since it's already being touched?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Again the creation of a build venv is the responsibility of pip, and in case of the wheel it already does that. For doing the same for sdist the solution will be to move to pip build sdist and we'll support implementing PEP-517 inside pip. tox will not implement what you're describing as it's outside the scope of the tool.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm sorry for breaking into your conversation but I have one argument to invoke pip wheel with virtualenv's python - packages with C extensions. They depend on Python version with which they are built and afaiu pip will build wheels only for interpeter it's being run by, so such wheels built by tox's interpreter will not suit environment with another one.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That’s a valid point. Maybe tox should run pip wheel multiple times for each python version, when it isn’t a universal pure python wheel.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For the first phase we decided to focus on universal wheel. Hence the way this works now. it's still a wip though and likely will wait for pip 517 to merge to adopt this because of some sanity checks not applied by pip at the moment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Makes sense, thanks for the clarification

sys.executable,
"-m",
"pip",
"wheel",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we could also invoke setup.py bdist_wheel instead of involving pip -- though that drifts further from PEP518

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We plan to come closer to PEP-517/518 not move away from it. Once pip has that support we'll be able to provide flint, poetry etc support natively, without magical tox plugins.

# we clear the PYTHONPATH to allow reporting packages outside of this environment
output = venv._pcall(
args, cwd=venv.envconfig.config.toxinidir, action=action, no_python_path=True
)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is this related to this change?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is. During testing this change I've encountered the situation of a faulty PYTHONPATH can report packages outside the venv as installed during the build. This defends against such.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hmmm, maybe split this into a separate PR so it's more clear why this changed?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Felt linked against this pr to close as without it the tests would fail, so thought not worth the extra effort.

tox.ini Outdated
@@ -102,7 +102,7 @@ commands = python -m pip list --format=columns
[flake8]
max-complexity = 22
max-line-length = 99
ignore = E203, W503
ignore = E203, W503, E501
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hmmm, is black not respecting the max line length?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it does however flake8 falsely signals multiline strings as running long, see https://github.com/gaborbernat/tox/blob/pep-518/tests/test_package_build.py#L148

there is no way to break that, and given black already ensures source code does not flow over 100 I decided to skip it

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd rather # noqa the specific literal instead of blanket turning this off

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The problem is that flake complains not at assignment but middle of the string and one cannot add disable there. Will look to disable for that section then.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if you put """ # noqa (on the end of the tqs) that should work -- it's not super intuitive but 🤷‍♂️

gaborbernat and others added 7 commits June 26, 2018 15:53
…mmands

PEP-518 support: provide a tox configuration flag ``build`` which can be
either ``sdist`` or ``wheel``. For ``sdist`` (default) we build the
package as before by using ``python setup.py sdist``. However, when
``wheel`` is enabled now we'll use ``pip wheel`` to build it, and we'll
also install wheels in these case into the environments. Note: ``pip``
10 supports specifying project dependencies (such as ``setuptools-scm``,
or a given ``setuptools`` version) via ``pyproject.toml``. Once ``pip``
supports building ``sdist`` to we'll migrate over the ``sdist`` build
too.

While running tox invokes various commands (such as building the
package, pip installing dependencies and so on), these were printed in
case they failed as Python arrays. Changed the representation to a shell
command, allowing the users to quickly replicate/debug the failure on
their own.
@gaborbernat gaborbernat force-pushed the pep-518 branch 2 times, most recently from c375365 to 83c1a03 Compare June 26, 2018 15:07
@gaborbernat gaborbernat merged commit 731a962 into tox-dev:master Jun 29, 2018
@gaborbernat gaborbernat deleted the pep-518 branch June 29, 2018 16:17
@gaborbernat gaborbernat restored the pep-518 branch June 29, 2018 16:18
gaborbernat added a commit that referenced this pull request Jun 29, 2018
@asottile
Copy link
Contributor

did we actually want to merge this? I haven't had a chance to look at it since last time and I don't think anyone else has looked at it either :S

@gaborbernat
Copy link
Member Author

Yeah, my bad. Removed it, will open it as a new PR. Sorry!

@gaborbernat gaborbernat mentioned this pull request Jun 29, 2018
@asottile asottile removed their assignment Feb 9, 2020
@pllim
Copy link

pllim commented Jan 13, 2021

Hello. I found this PR looking for ways to build wheel and test it with tox. This PR is shown as merged but I cannot find the documentation added here in https://tox.readthedocs.io/en/latest/config.html . I am wondering what happened to this option since. Thanks.

@gaborbernat
Copy link
Member Author

Sadly we ran into issues with this and had to revert. tox 4 first alpha came out last week, and that contains this feature, though first public release not expected before April.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area:package-building feature:change something exists already but should behave differently feature:new something does not exist yet, but should level:medium rought estimate that this might be neither easy nor hard to implement
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants