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

--pyargs discovery for zipped packages/unpacked wheels/eggs #1445

Open
bjodah opened this issue Mar 9, 2016 · 13 comments
Open

--pyargs discovery for zipped packages/unpacked wheels/eggs #1445

bjodah opened this issue Mar 9, 2016 · 13 comments
Labels
topic: collection related to the collection phase type: enhancement new feature or API change, should be merged into features branch

Comments

@bjodah
Copy link

bjodah commented Mar 9, 2016

EDIT:

Using py.test --pyargs mypackage does not seem to work for .egg distributed packages.
Adding

[easy_install]
zip_ok = False

to setup.cfg seems to be a viable fix until py.test supports zipped packages.

Original issue text:

Using py.test --pyargs mypackage under a conda environment seems to be broken.
I've reported it here: conda/conda#2075

I am reposting it here in case someone has an idea what might be going on here.
Here is a Dockerfile to reproduce the bug:

FROM continuumio/miniconda:3.19.0
MAINTAINER Björn Dahlgren <bjodah@DELETEMEgmail.com>
ENV PATH /opt/miniconda2/bin:$PATH
RUN git clone https://github.com/bjodah/dummypkg.git && \
    cd dummypkg && \
    conda install conda-build pytest && \
    conda build conda-recipe && \
    conda install --use-local dummypkg
RUN cd /tmp && \
    python -c 'import dummypkg; print(dummypkg.__file__)' && \
    python -m pytest --pyargs dummypkg

Running docker build generates the following output:

$ docker build revised-docker-environment/
Sending build context to Docker daemon 2.048 kB
Sending build context to Docker daemon 
Step 0 : FROM continuumio/miniconda:3.19.0
 ---> bc9d0fb804ac
Step 1 : MAINTAINER Björn Dahlgren <bjodah@DELETEMEgmail.com>
 ---> Using cache
 ---> f81cd6785b68
Step 2 : ENV PATH /opt/miniconda2/bin:$PATH
 ---> Using cache
 ---> 3227b31b6bd9
Step 3 : RUN git clone https://github.com/bjodah/dummypkg.git &&     cd dummypkg &&     conda install conda-build pytest &&     conda build conda-recipe &&     conda install --use-local dummypkg
 ---> Using cache
 ---> 6765cf1fae4d
Step 4 : RUN cd /tmp &&     python -c 'import dummypkg; print(dummypkg.__file__)' &&     python -m pytest --pyargs dummypkg
 ---> Running in e9c721e5c4c2
/opt/conda/lib/python2.7/site-packages/dummypkg-0.1.0-py2.7.egg/dummypkg/__init__.pyc
============================= test session starts ==============================
platform linux2 -- Python 2.7.10, pytest-2.8.5, py-1.4.31, pluggy-0.3.1
rootdir: /tmp, inifile: 

========================= no tests ran in 0.00 seconds =========================
ERROR: file or package not found: dummypkg
INFO[0000] The command [/bin/sh -c cd /tmp &&     python -c 'import dummypkg; print(dummypkg.__file__)' &&     python -m pytest --pyargs dummypkg] returned a non-zero code: 4 
@nicoddemus
Copy link
Member

I tried your recipe on Windows (after creating an appropriate bld.bat) without Docker, and I see the same issue. I noticed though that your recipe is creating an egg package:

λ conda package -L dummypkg

INFO: The location for available packages: E:\Miniconda\pkgs
INFO: All files belonging to 'dummypkg-0.1.0-py27_0' package:

E:\Miniconda\pkgs/dummypkg-0.1.0-py27_0/info/files
E:\Miniconda\pkgs/dummypkg-0.1.0-py27_0/info/index.json
E:\Miniconda\pkgs/dummypkg-0.1.0-py27_0/info/recipe.json
E:\Miniconda\pkgs/dummypkg-0.1.0-py27_0/info/recipe/bld.bat
E:\Miniconda\pkgs/dummypkg-0.1.0-py27_0/info/recipe/build.sh
E:\Miniconda\pkgs/dummypkg-0.1.0-py27_0/info/recipe/meta.yaml
E:\Miniconda\pkgs/dummypkg-0.1.0-py27_0/info/recipe/run_test.py
E:\Miniconda\pkgs/dummypkg-0.1.0-py27_0/Lib/site-packages/dummypkg-0.1.0-py2.7.egg
E:\Miniconda\pkgs/dummypkg-0.1.0-py27_0/Lib/site-packages/dummypkg.pth

I'm not sure, but perhaps py.test can't load tests from eggs?

For the record, I added this to your recipe:

build:
  preserve_egg_dir: True

But still the package only contained the .egg file, while I expected it to also contain the egg dir... I don't have time right now to investigate this further, but this might give you some hint.

@nicoddemus nicoddemus added the topic: collection related to the collection phase label Mar 9, 2016
@bjodah
Copy link
Author

bjodah commented Mar 10, 2016

@nicoddemus spot on! This fixes it:
https://github.com/bjodah/dummypkg/blob/master/revised2-docker-environment-non-egg/Dockerfile#L7

i.e. the following is added to setup.cfg:

[easy_install]
zip_ok = False

Perhaps a word about this in the docs where --pyargs is discussed is in order? (I could try to write something up and submit a PR if you want).

Just to make things even more complicated there is the issue of zip_ok vs. zip_safe: http://stackoverflow.com/a/34552171/790973

@nicoddemus
Copy link
Member

Cool, thanks for the links. A PR for the docs would be welcome. 😁

@RonnyPfannschmidt
Copy link
Member

We should handle zipped packages

@nicoddemus
Copy link
Member

Agree, but perhaps we should edit the description or, better yet, create a
new issue and point to this one?

Em sex, 11 de mar de 2016 07:08, Ronny Pfannschmidt <
notifications@github.com> escreveu:

We should handle zipped packages


Reply to this email directly or view it on GitHub
#1445 (comment).

@bjodah bjodah changed the title py.test package discovery does not work under conda py.test package discovery does not work for zipped packages Mar 11, 2016
@michaelaye

This comment has been minimized.

@RonnyPfannschmidt

This comment has been minimized.

@michaelaye

This comment has been minimized.

@katzdm
Copy link

katzdm commented Jun 21, 2019

Is this still an open problem? Is it correct to say that pytest can't test a module from a zip file (e.g. PEX, egg, etc) without first extracting the test file?

@RonnyPfannschmidt
Copy link
Member

Correct

@nicoddemus
Copy link
Member

nicoddemus commented Jun 22, 2019

I'm curious @katzdm, what's your use case for pytest to import a module from a zipped package? To run a test suite against a created PEX file to ensure it was correctly built?

@katzdm
Copy link

katzdm commented Jun 24, 2019

I've been experimenting with an open-source build system that prefers PEX as the format-of-choice for python "executables". Since tests are "executable", the current implementation assembles a PEX consisting of {application code, test files, pytest, third-party dependencies, test-runner-script}, where the test-runner-script does some initial setup before invoking pytest.main().

I think this model is probably more of an artifact of other design choices, than an endorsement of this as The Best Way to build and run tests. I came across an issue that eventually led me here though, and wanted to make sure I correctly understood the root cause (thanks for the quick reply!)

@RonnyPfannschmidt RonnyPfannschmidt changed the title py.test package discovery does not work for zipped packages --pyargs discovery for zipped packages/unpacked wheels/eggs Sep 22, 2021
@effigies
Copy link

Just to add a specific use case:

Downstream packages may want to distribute a zipapp including my package, so I want to exercise all of its functionality when zipped. The most straightforward way I can think to do this would be to use PYTHONPACKAGE=$( ls $PWD/dist/mypkg*.whl ) pytest --pyargs mypkg.

This doesn't currently work, and I can't readily find an alternative approach.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
topic: collection related to the collection phase type: enhancement new feature or API change, should be merged into features branch
Projects
None yet
Development

No branches or pull requests

6 participants