1. Holger Krekel
  2. pytest-cache
Issue #8 closed

pytest-cache plugin not loading when using setuptools integration

jtriley
created an issue

The pytest-cache plugin is not being loaded when using pytest's setuptools integration in the case that pytest-cache is not installed into site-packages. In this case pytest-cache gets downloaded and installed to a local egg in the current working directory by setuptools (due to tests_require=["pytest-cov", "pytest-pep8", "pytest-flakes", "pytest"]) and I get this error when running python setup.py test:

$ pip freeze | grep -i pytest # no output here (ie no pytest* in site-packages)
$ python setup.py test
running test
Searching for pytest
Reading https://pypi.python.org/simple/pytest/
Best match: pytest 2.5.2
Downloading https://pypi.python.org/packages/source/p/pytest/pytest-2.5.2.tar.gz#md5=8ea3d1939e81514ccba9ba0e9566b5be
Processing pytest-2.5.2.tar.gz
Writing /tmp/easy_install-odE70G/pytest-2.5.2/setup.cfg
Running pytest-2.5.2/setup.py -q bdist_egg --dist-dir /tmp/easy_install-odE70G/pytest-2.5.2/egg-dist-tmp-EJlcV7

Installed /repos/starcluster/pytest-2.5.2-py2.6.egg
Searching for pytest-flakes
Reading https://pypi.python.org/simple/pytest-flakes/
Best match: pytest-flakes 0.2
Downloading https://pypi.python.org/packages/source/p/pytest-flakes/pytest-flakes-0.2.zip#md5=44b8f9746fcd827de5c02f14b01728c1
Processing pytest-flakes-0.2.zip
Writing /tmp/easy_install-Va719z/pytest-flakes-0.2/setup.cfg
Running pytest-flakes-0.2/setup.py -q bdist_egg --dist-dir /tmp/easy_install-Va719z/pytest-flakes-0.2/egg-dist-tmp-6BG8vX
zip_safe flag not set; analyzing archive contents...

Installed /repos/starcluster/pytest_flakes-0.2-py2.6.egg
Searching for pytest-pep8
Reading https://pypi.python.org/simple/pytest-pep8/
Best match: pytest-pep8 1.0.5
Downloading https://pypi.python.org/packages/source/p/pytest-pep8/pytest-pep8-1.0.5.tar.gz#md5=6199353734615fde47d1fbfef1ebc737
Processing pytest-pep8-1.0.5.tar.gz
Writing /tmp/easy_install-XWWEl7/pytest-pep8-1.0.5/setup.cfg
Running pytest-pep8-1.0.5/setup.py -q bdist_egg --dist-dir /tmp/easy_install-XWWEl7/pytest-pep8-1.0.5/egg-dist-tmp-yLvZVL
warning: no directories found matching 'doc'
warning: no directories found matching 'test_pep8.py'
zip_safe flag not set; analyzing archive contents...

Installed /repos/starcluster/pytest_pep8-1.0.5-py2.6.egg
Searching for pytest-cov
Reading https://pypi.python.org/simple/pytest-cov/
Best match: pytest-cov 1.6
Downloading https://pypi.python.org/packages/source/p/pytest-cov/pytest-cov-1.6.tar.gz#md5=6da54d74bde9d200de45068ba2ea637a
Processing pytest-cov-1.6.tar.gz
Writing /tmp/easy_install-KJqVFv/pytest-cov-1.6/setup.cfg
Running pytest-cov-1.6/setup.py -q bdist_egg --dist-dir /tmp/easy_install-KJqVFv/pytest-cov-1.6/egg-dist-tmp-nVGVAM

Installed /repos/starcluster/pytest_cov-1.6-py2.6.egg
Searching for pytest-cache
Reading https://pypi.python.org/simple/pytest-cache/
Best match: pytest-cache 1.0
Downloading https://pypi.python.org/packages/source/p/pytest-cache/pytest-cache-1.0.tar.gz#md5=e51ff62fec70a1fd456d975ce47977cd
Processing pytest-cache-1.0.tar.gz
Writing /tmp/easy_install-Rnm1YK/pytest-cache-1.0/setup.cfg
Running pytest-cache-1.0/setup.py -q bdist_egg --dist-dir /tmp/easy_install-Rnm1YK/pytest-cache-1.0/egg-dist-tmp-Gorswt
zip_safe flag not set; analyzing archive contents...

Installed /repos/starcluster/pytest_cache-1.0-py2.6.egg
running egg_info
writing dependency_links to StarCluster.egg-info/dependency_links.txt
writing requirements to StarCluster.egg-info/requires.txt
writing StarCluster.egg-info/PKG-INFO
writing top-level names to StarCluster.egg-info/top_level.txt
writing entry points to StarCluster.egg-info/entry_points.txt
reading manifest file 'StarCluster.egg-info/SOURCES.txt'
reading manifest template 'MANIFEST.in'
warning: no previously-included files found matching 'requirements.txt'
writing manifest file 'StarCluster.egg-info/SOURCES.txt'
running build_ext
usage: setup.py [options] [file_or_dir] [file_or_dir] [...]
setup.py: error: unrecognized arguments: --clearcache

If I then install pytest-cache into site-packages the plugin loads as expected:

$ rm -rf pytest_cache-1.0-py2.6.egg
$ pip install pytest-cache
$ python setup.py test
running test
running egg_info
writing dependency_links to StarCluster.egg-info/dependency_links.txt
writing requirements to StarCluster.egg-info/requires.txt
writing StarCluster.egg-info/PKG-INFO
writing top-level names to StarCluster.egg-info/top_level.txt
writing entry points to StarCluster.egg-info/entry_points.txt
reading manifest file 'StarCluster.egg-info/SOURCES.txt'
reading manifest template 'MANIFEST.in'
warning: no previously-included files found matching 'requirements.txt'
writing manifest file 'StarCluster.egg-info/SOURCES.txt'
running build_ext
========== test session starts ====================
platform linux2 -- Python 2.6.8 -- py-1.4.20 -- pytest-2.5.2 -- /home/user/.virtualenvs/starcluster/bin/python
cachedir: /repos/starcluster/.cache
plugins: flakes, pep8, cov, cache
collected 272 items

starcluster/__init__.py:0: PEP8-check PASSED
...

To fix this I've applied the following patch to PyTest's run_tests method in order to properly load the cache plugin:

class PyTest(TestCommand):
    ...
    def run_tests(self):
        import pytest
        import _pytest.config
        pm = _pytest.config.get_plugin_manager()
        pm.consider_setuptools_entrypoints()
        errno = pytest.main(self.test_args)
        sys.exit(errno)

Another approach is to simply import the pytest-cache plugin and pass it to pytest.main via the plugins kwarg.

The pytest-cache plugin for my project gets pulled in by pytest-pep8. Interestingly if I install pytest and plugins (pytest-cov, pytest-cache, pytest-pep8, and pytest-flakes) to site-packages first and then pip uninstall pytest-cache then setuptools will download and install pytest-cache to the current working directory as an egg and the plugin gets loaded:

$ pip freeze | grep -i pytest # no pytest* packages installed
$ pip install pytest pytest-{cov,pep8,flakes}                                                                                                                                                                                                                                                                              <<<
Downloading/unpacking pytest
  Using download cache from /home/user/.pip/cache/https%3A%2F%2Fpypi.python.org%2Fpackages%2Fsource%2Fp%2Fpytest%2Fpytest-2.5.2.tar.gz
  Running setup.py (path:/home/user/.virtualenvs/starcluster/build/pytest/setup.py) egg_info for package pytest
Downloading/unpacking pytest-cov
  Using download cache from /home/user/.pip/cache/https%3A%2F%2Fpypi.python.org%2Fpackages%2Fsource%2Fp%2Fpytest-cov%2Fpytest-cov-1.6.tar.gz
  Running setup.py (path:/home/user/.virtualenvs/starcluster/build/pytest-cov/setup.py) egg_info for package pytest-cov
Downloading/unpacking pytest-pep8
  Using download cache from /home/user/.pip/cache/https%3A%2F%2Fpypi.python.org%2Fpackages%2Fsource%2Fp%2Fpytest-pep8%2Fpytest-pep8-1.0.5.tar.gz
  Running setup.py (path:/home/user/.virtualenvs/starcluster/build/pytest-pep8/setup.py) egg_info for package pytest-pep8
    warning: no directories found matching 'doc'
    warning: no directories found matching 'test_pep8.py'
Downloading/unpacking pytest-flakes
  Using download cache from /home/user/.pip/cache/https%3A%2F%2Fpypi.python.org%2Fpackages%2Fsource%2Fp%2Fpytest-flakes%2Fpytest-flakes-0.2.zip
  Running setup.py (path:/home/user/.virtualenvs/starcluster/build/pytest-flakes/setup.py) egg_info for package pytest-flakes
Requirement already satisfied (use --upgrade to upgrade): py>=1.4.20 in /home/user/.virtualenvs/starcluster/lib/python2.6/site-packages (from pytest)
Requirement already satisfied (use --upgrade to upgrade): argparse in /home/user/.virtualenvs/starcluster/lib/python2.6/site-packages (from pytest)
Requirement already satisfied (use --upgrade to upgrade): cov-core>=1.6 in /home/user/.virtualenvs/starcluster/lib/python2.6/site-packages (from pytest-cov)
Downloading/unpacking pytest-cache (from pytest-pep8)
  Using download cache from /home/user/.pip/cache/https%3A%2F%2Fpypi.python.org%2Fpackages%2Fsource%2Fp%2Fpytest-cache%2Fpytest-cache-1.0.tar.gz
  Running setup.py (path:/home/user/.virtualenvs/starcluster/build/pytest-cache/setup.py) egg_info for package pytest-cache
Requirement already satisfied (use --upgrade to upgrade): pep8>=1.3 in /home/user/.virtualenvs/starcluster/lib/python2.6/site-packages (from pytest-pep8)
Requirement already satisfied (use --upgrade to upgrade): pyflakes in /home/user/.virtualenvs/starcluster/lib/python2.6/site-packages (from pytest-flakes)
Requirement already satisfied (use --upgrade to upgrade): coverage>=3.4 in /home/user/.virtualenvs/starcluster/lib/python2.6/site-packages (from cov-core>=1.6->pytest-cov)
Requirement already satisfied (use --upgrade to upgrade): execnet>=1.1.dev1 in /home/user/.virtualenvs/starcluster/lib/python2.6/site-packages (from pytest-cache->pytest-pep8)
Installing collected packages: pytest, pytest-cov, pytest-pep8, pytest-flakes, pytest-cache
  Running setup.py install for pytest
    Installing py.test script to /home/user/.virtualenvs/starcluster/bin
    Installing py.test-2.6 script to /home/user/.virtualenvs/starcluster/bin
  Running setup.py install for pytest-cov
  Running setup.py install for pytest-pep8
    warning: no directories found matching 'doc'
    warning: no directories found matching 'test_pep8.py'
  Running setup.py install for pytest-flakes
  Running setup.py install for pytest-cache
Successfully installed pytest pytest-cov pytest-pep8 pytest-flakes pytest-cache
Cleaning up...

$ pip uninstall pytest-cache
Uninstalling pytest-cache:
  /home/user/.virtualenvs/starcluster/lib/python2.6/site-packages/pytest_cache-1.0-py2.6.egg-info
  /home/user/.virtualenvs/starcluster/lib/python2.6/site-packages/pytest_cache.py
  /home/user/.virtualenvs/starcluster/lib/python2.6/site-packages/pytest_cache.pyc
Proceed (y/n)? y
  Successfully uninstalled pytest-cache

$ python setup.py test
running test
Searching for pytest-cache
Reading https://pypi.python.org/simple/pytest-cache/
Best match: pytest-cache 1.0
Downloading https://pypi.python.org/packages/source/p/pytest-cache/pytest-cache-1.0.tar.gz#md5=e51ff62fec70a1fd456d975ce47977cd
Processing pytest-cache-1.0.tar.gz
Writing /tmp/easy_install-VNYw5V/pytest-cache-1.0/setup.cfg
Running pytest-cache-1.0/setup.py -q bdist_egg --dist-dir /tmp/easy_install-VNYw5V/pytest-cache-1.0/egg-dist-tmp-8eoxLc
zip_safe flag not set; analyzing archive contents...

Installed /repos/starcluster/pytest_cache-1.0-py2.6.egg
running egg_info
writing dependency_links to StarCluster.egg-info/dependency_links.txt
writing requirements to StarCluster.egg-info/requires.txt
writing StarCluster.egg-info/PKG-INFO
writing top-level names to StarCluster.egg-info/top_level.txt
writing entry points to StarCluster.egg-info/entry_points.txt
reading manifest file 'StarCluster.egg-info/SOURCES.txt'
reading manifest template 'MANIFEST.in'
warning: no previously-included files found matching 'requirements.txt'
writing manifest file 'StarCluster.egg-info/SOURCES.txt'
running build_ext
=========== test session starts ==========
platform linux2 -- Python 2.6.8 -- py-1.4.20 -- pytest-2.5.2 -- /home/user/.virtualenvs/starcluster/bin/python
cachedir: /repos/starcluster/.cache
plugins: cache, cov, pep8, flakes
collected 272 items

starcluster/__init__.py:0: pyflakes-check PASSED
starcluster/__init__.py:0: PEP8-check PASSED
...

So this may be some chicken and egg problem between pep8 and pyflakes installs. I'm happy to provide more details and/or move the issue to another tracker if the problem turns out to really be in the pytest-pep8 plugin.

Comments (6)

  1. Holger Krekel repo owner

    Thanks for the detailed report. I am not sure why your fix makes a difference. The "consider_setuptools_entrypoints" should be called when pytest.main() happens. Did you find out that it is not?

  2. Chris Allan

    I've spent a little bit of time working through this as I've had pretty much identical problems running the Flask-Security test cases. Just the pytest-pep8 plugin is enough to trigger the issue. There's now a GitHub Gist with two commands (test and show_problems) that should outline the issue; it seems to be down to how pytest loads plugins when running inside a setup.py:

    $ python setup.py test
    running test
    running egg_info
    writing PyTest_Test.egg-info/PKG-INFO
    writing top-level names to PyTest_Test.egg-info/top_level.txt
    writing dependency_links to PyTest_Test.egg-info/dependency_links.txt
    reading manifest file 'PyTest_Test.egg-info/SOURCES.txt'
    writing manifest file 'PyTest_Test.egg-info/SOURCES.txt'
    running build_ext
    usage: setup.py [options] [file_or_dir] [file_or_dir] [...]
    setup.py: error: unrecognized arguments: --clearcache
    
    $ python setup.py show_problems
    running show_problems
    running egg_info
    writing PyTest_Test.egg-info/PKG-INFO
    writing top-level names to PyTest_Test.egg-info/top_level.txt
    writing dependency_links to PyTest_Test.egg-info/dependency_links.txt
    reading manifest file 'PyTest_Test.egg-info/SOURCES.txt'
    writing manifest file 'PyTest_Test.egg-info/SOURCES.txt'
    running build_ext
    dumping initial entry points...
        entry point: EntryPoint.parse('pep8 = pytest_pep8')
        entry point: EntryPoint.parse('cacheprovider = pytest_cache')
    trying to loop through entry points and loading pytest-pep8...
        entry point: EntryPoint.parse('pep8 = pytest_pep8')
    dumping entry points after plugin load...
        entry point: EntryPoint.parse('cacheprovider = pytest_cache')
        entry point: EntryPoint.parse('pep8 = pytest_pep8')
    

    Not sure where to go from here Holger Krekel.

    consider_setuptools_entrypoints could certainly be refactored to not assume consistency when looping through the entry points but that seems really crazy. While trying to track down the base issue I added a few print statements to pkg_resources.iter_entry_points but all that really did is confirm that as soon as load() is called on the pytest-pep8 entry point the pkg_resources.working_set ends up being changed. I'm not sure what causes this to happen.

  3. Holger Krekel repo owner

    Just a quick note here that i did see your mail but didn't get around to look into this, sorry. Also i am going to vacation for three weeks now. Feel free to send a mail to pytest-dev asking for advise or to get to me again in September.

  4. Nicolas Bonnotte

    I've encountered the same issue, although I'm not using pytest-flakes. Without the --clearcache option, the problem manifests itself like that:

    ...
    INTERNALERROR>   File "build/bdist.linux-x86_64/egg/pytest_pep8.py", line 28, in pytest_sessionstart
    INTERNALERROR>     config._pep8mtimes = config.cache.get(HISTKEY, {})
    INTERNALERROR> AttributeError: 'Config' object has no attribute 'cache'
    

    Adding import _pytest.config as jtriley suggested does not fix the problem for me, but adding pytest-cache to setup's tests_require argument seems to do the trick.

  5. Log in to comment