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

pytest-4.6.0 (and beyond) does not work in metabot's tox config #53

Closed
nmlorg opened this issue Jun 4, 2019 · 2 comments
Closed

pytest-4.6.0 (and beyond) does not work in metabot's tox config #53

nmlorg opened this issue Jun 4, 2019 · 2 comments
Assignees
Labels
cleanup Code changes that improve maintainability without changing behavior

Comments

@nmlorg
Copy link
Owner

nmlorg commented Jun 4, 2019

py27 run-test: commands[1] | python -B -m pytest
== test session starts ==
platform linux2 -- Python 2.7.15rc1, pytest-4.5.0, py-1.8.0, pluggy-0.12.0 -- /home/n/metabot/.tox/py27/bin/python
cachedir: .tox/py27/.pytest_cache
rootdir: /home/n/metabot, inifile: setup.cfg, testpaths: metabot
plugins: cov-2.7.1, requests-mock-1.6.0
collected 64 items

metabot/test_botconf.py::test_save_load PASSED
metabot/test_multibot.py::test_add_bot PASSED
 ...
py27 run-test: commands[1] | python -B -m pytest
== test session starts ==
platform linux2 -- Python 2.7.15rc1, pytest-4.6.0, py-1.8.0, pluggy-0.12.0 -- /home/n/metabot/.tox/py27/bin/python
cachedir: .tox/py27/.pytest_cache
rootdir: /home/n/metabot, inifile: setup.cfg, testpaths: metabot
plugins: cov-2.7.1, requests-mock-1.6.0
collected 0 items / 1 errors                                                                                                                                                                                                                                                              
Coverage.py warning: No data was collected. (no-data-collected)

== ERRORS ==
__ ERROR collecting test session __
.tox/py27/local/lib/python2.7/site-packages/_pytest/runner.py:226: in from_call
    result = func()
.tox/py27/local/lib/python2.7/site-packages/_pytest/runner.py:253: in <lambda>
    call = CallInfo.from_call(lambda: list(collector.collect()), "collect")
.tox/py27/local/lib/python2.7/site-packages/_pytest/main.py:543: in collect
    for x in self._collect(arg):
.tox/py27/local/lib/python2.7/site-packages/_pytest/main.py:571: in _collect
    col = self._collectfile(pkginit, handle_dupes=False)
.tox/py27/local/lib/python2.7/site-packages/_pytest/main.py:636: in _collectfile
    ihook = self.gethookproxy(path)
.tox/py27/local/lib/python2.7/site-packages/_pytest/main.py:482: in gethookproxy
    my_conftestmodules = pm._getconftestmodules(fspath)
.tox/py27/local/lib/python2.7/site-packages/_pytest/config/__init__.py:424: in _getconftestmodules
    mod = self._importconftest(conftestpath.realpath())
.tox/py27/local/lib/python2.7/site-packages/_pytest/config/__init__.py:463: in _importconftest
    raise ConftestImportFailure(conftestpath, sys.exc_info())
E   ConftestImportFailure: (local('/home/n/metabot/metabot/conftest.py'), (<class 'py._path.local.ImportMismatchError'>, ImportMismatchError('metabot.conftest', '/home/n/metabot/.tox/py27/local/lib/python2.7/site-packages/metabot/conftest.py', local('/home/n/metabot/metabot/conftest.py')), <traceback object at 0x7fe3c8c056c8>))
py27 run-test: commands[1] | python -B -m pytest
== test session starts ==
platform linux2 -- Python 2.7.15rc1, pytest-4.6.2, py-1.8.0, pluggy-0.12.0 -- /home/n/metabot/.tox/py27/bin/python
cachedir: .tox/py27/.pytest_cache
rootdir: /home/n/metabot, inifile: setup.cfg, testpaths: metabot
plugins: cov-2.7.1, requests-mock-1.6.0
collected 0 items / 1 errors                                                                                                                                                                                                                                                              
Coverage.py warning: No data was collected. (no-data-collected)

== ERRORS ==
__ ERROR collecting test session __
.tox/py27/local/lib/python2.7/site-packages/_pytest/runner.py:226: in from_call
    result = func()
.tox/py27/local/lib/python2.7/site-packages/_pytest/runner.py:253: in <lambda>
    call = CallInfo.from_call(lambda: list(collector.collect()), "collect")
.tox/py27/local/lib/python2.7/site-packages/_pytest/main.py:543: in collect
    for x in self._collect(arg):
.tox/py27/local/lib/python2.7/site-packages/_pytest/main.py:571: in _collect
    col = self._collectfile(pkginit, handle_dupes=False)
.tox/py27/local/lib/python2.7/site-packages/_pytest/main.py:636: in _collectfile
    ihook = self.gethookproxy(path)
.tox/py27/local/lib/python2.7/site-packages/_pytest/main.py:482: in gethookproxy
    my_conftestmodules = pm._getconftestmodules(fspath)
.tox/py27/local/lib/python2.7/site-packages/_pytest/config/__init__.py:424: in _getconftestmodules
    mod = self._importconftest(conftestpath.realpath())
.tox/py27/local/lib/python2.7/site-packages/_pytest/config/__init__.py:463: in _importconftest
    raise ConftestImportFailure(conftestpath, sys.exc_info())
E   ConftestImportFailure: (local('/home/n/metabot/metabot/conftest.py'), (<class 'py._path.local.ImportMismatchError'>, ImportMismatchError('metabot.conftest', '/home/n/metabot/.tox/py27/local/lib/python2.7/site-packages/metabot/conftest.py', local('/home/n/metabot/metabot/conftest.py')), <traceback object at 0x7fad79a4d758>))

 

Note that pytest-4.6.2 does work in metabot's Cirrus CL config:

pytest
== test session starts ==
platform linux2 -- Python 2.7.16, pytest-4.6.2, py-1.8.0, pluggy-0.12.0 -- /usr/local/bin/python
cachedir: .pytest_cache
rootdir: /tmp/cirrus-ci-build, inifile: setup.cfg, testpaths: metabot
plugins: cov-2.7.1, requests-mock-1.6.0
collecting ... collected 64 items
metabot/test_botconf.py::test_save_load PASSED
metabot/test_multibot.py::test_add_bot PASSED
 ...

however changing tox.ini to more closely mimic .cirrus.yml appears to have no effect.

@nmlorg nmlorg added the cleanup Code changes that improve maintainability without changing behavior label Jun 4, 2019
@nmlorg nmlorg self-assigned this Jun 4, 2019
@nmlorg
Copy link
Owner Author

nmlorg commented Jun 5, 2019

I'm not 100% sure why, but it appears to be related to pytest-dev/pytest#5063:  Changing metabot/__init__.py (etc.) from:

__import__('pkg_resources').declare_namespace(__name__)

to:

__path__ = __import__('pkgutil').extend_path(__path__, __name__)

(as described in https://packaging.python.org/guides/packaging-namespace-packages/), then removing namespace_packages=setuptools.find_packages(include=('metabot', 'metabot.*')), from setup.py, then reverting 45efe0a seems to work.

Doing this for real will have to be coordinated with metabot.calendars.google and manually tested to verify it won't mess up any existing installs during pip install -U.

nmlorg added a commit that referenced this issue Jun 6, 2019
I do not know exactly what this does. But it seems to be important to make pytest work in tox (see #53).

A followup to nmlorg/metabot.calendars.google will do the same.
@nmlorg
Copy link
Owner Author

nmlorg commented Jun 6, 2019

$ virtualenv  -ppython3 quicktest
$ cd quicktest/
$ . bin/activate
$ pip install -U metabot metabot.calendars.google
$ python
>>> import pkgutil
>>> import pprint
>>> from metabot import calendars
>>> pprint.pprint(list(pkgutil.iter_modules(calendars.__path__)))
[ModuleInfo(module_finder=FileFinder('/home/n/quicktest/lib/python3.6/site-packages/metabot/calendars'), name='base', ispkg=False),
 ModuleInfo(module_finder=FileFinder('/home/n/quicktest/lib/python3.6/site-packages/metabot/calendars'), name='google', ispkg=False),
 ModuleInfo(module_finder=FileFinder('/home/n/quicktest/lib/python3.6/site-packages/metabot/calendars'), name='loader', ispkg=False),
 ModuleInfo(module_finder=FileFinder('/home/n/quicktest/lib/python3.6/site-packages/metabot/calendars'), name='multicalendar', ispkg=False),
 ModuleInfo(module_finder=FileFinder('/home/n/quicktest/lib/python3.6/site-packages/metabot/calendars'), name='static', ispkg=False),
 ModuleInfo(module_finder=FileFinder('/home/n/quicktest/lib/python3.6/site-packages/metabot/calendars'), name='test_base', ispkg=False),
 ModuleInfo(module_finder=FileFinder('/home/n/quicktest/lib/python3.6/site-packages/metabot/calendars'), name='test_google', ispkg=False),
 ModuleInfo(module_finder=FileFinder('/home/n/quicktest/lib/python3.6/site-packages/metabot/calendars'), name='test_loader', ispkg=False),
 ModuleInfo(module_finder=FileFinder('/home/n/quicktest/lib/python3.6/site-packages/metabot/calendars'), name='test_multicalendar', ispkg=False)]
$ pip install ../metabot/dist/metabot-0.2-py2.py3-none-any.whl 
$ python
>>> import pkgutil
>>> import pprint
>>> from metabot import calendars
>>> pprint.pprint(list(pkgutil.iter_modules(calendars.__path__)))
[ModuleInfo(module_finder=FileFinder('/home/n/quicktest/lib/python3.6/site-packages/metabot/calendars'), name='base', ispkg=False),
 ModuleInfo(module_finder=FileFinder('/home/n/quicktest/lib/python3.6/site-packages/metabot/calendars'), name='google', ispkg=False),
 ModuleInfo(module_finder=FileFinder('/home/n/quicktest/lib/python3.6/site-packages/metabot/calendars'), name='loader', ispkg=False),
 ModuleInfo(module_finder=FileFinder('/home/n/quicktest/lib/python3.6/site-packages/metabot/calendars'), name='multicalendar', ispkg=False),
 ModuleInfo(module_finder=FileFinder('/home/n/quicktest/lib/python3.6/site-packages/metabot/calendars'), name='static', ispkg=False),
 ModuleInfo(module_finder=FileFinder('/home/n/quicktest/lib/python3.6/site-packages/metabot/calendars'), name='test_base', ispkg=False),
 ModuleInfo(module_finder=FileFinder('/home/n/quicktest/lib/python3.6/site-packages/metabot/calendars'), name='test_google', ispkg=False),
 ModuleInfo(module_finder=FileFinder('/home/n/quicktest/lib/python3.6/site-packages/metabot/calendars'), name='test_loader', ispkg=False),
 ModuleInfo(module_finder=FileFinder('/home/n/quicktest/lib/python3.6/site-packages/metabot/calendars'), name='test_multicalendar', ispkg=False)]

... wait, really? <shrug>

$ cd
$ deactivate 
$ rm -rf quicktest/
$ virtualenv  -ppython3 quicktest
$ cd quicktest/
$ . bin/activate
$ pip install -U ../metabot/dist/metabot-0.2-py2.py3-none-any.whl metabot.calendars.google
$ python
>>> import pkgutil
>>> import pprint
>>> from metabot import calendars
>>> pprint.pprint(list(pkgutil.iter_modules(calendars.__path__)))
[ModuleInfo(module_finder=FileFinder('/home/n/quicktest/lib/python3.6/site-packages/metabot/calendars'), name='base', ispkg=False),
 ModuleInfo(module_finder=FileFinder('/home/n/quicktest/lib/python3.6/site-packages/metabot/calendars'), name='google', ispkg=False),
 ModuleInfo(module_finder=FileFinder('/home/n/quicktest/lib/python3.6/site-packages/metabot/calendars'), name='loader', ispkg=False),
 ModuleInfo(module_finder=FileFinder('/home/n/quicktest/lib/python3.6/site-packages/metabot/calendars'), name='multicalendar', ispkg=False),
 ModuleInfo(module_finder=FileFinder('/home/n/quicktest/lib/python3.6/site-packages/metabot/calendars'), name='static', ispkg=False),
 ModuleInfo(module_finder=FileFinder('/home/n/quicktest/lib/python3.6/site-packages/metabot/calendars'), name='test_base', ispkg=False),
 ModuleInfo(module_finder=FileFinder('/home/n/quicktest/lib/python3.6/site-packages/metabot/calendars'), name='test_google', ispkg=False),
 ModuleInfo(module_finder=FileFinder('/home/n/quicktest/lib/python3.6/site-packages/metabot/calendars'), name='test_loader', ispkg=False),
 ModuleInfo(module_finder=FileFinder('/home/n/quicktest/lib/python3.6/site-packages/metabot/calendars'), name='test_multicalendar', ispkg=False)]

 
And just for fun (despite #54):

$ cd
$ deactivate
$ rm -rf quicktest
$ virtualenv quicktest
$ cd quicktest/
$ . bin/activate
$ pip install -U ../metabot/dist/metabot-0.2-py2.py3-none-any.whl metabot.calendars.google
$ python
Python 2.7.15rc1 (default, Nov 12 2018, 14:31:15) 
>>> import pkgutil
>>> import pprint
>>> from metabot import calendars
>>> pprint.pprint(list(pkgutil.iter_modules(calendars.__path__)))
[(<pkgutil.ImpImporter instance at 0x7f507f07ecb0>, 'base', False),
 (<pkgutil.ImpImporter instance at 0x7f507f07ecb0>, 'google', False),
 (<pkgutil.ImpImporter instance at 0x7f507f07ecb0>, 'loader', False),
 (<pkgutil.ImpImporter instance at 0x7f507f07ecb0>, 'multicalendar', False),
 (<pkgutil.ImpImporter instance at 0x7f507f07ecb0>, 'static', False),
 (<pkgutil.ImpImporter instance at 0x7f507f07ecb0>, 'test_base', False),
 (<pkgutil.ImpImporter instance at 0x7f507f07ecb0>, 'test_google', False),
 (<pkgutil.ImpImporter instance at 0x7f507f07ecb0>, 'test_loader', False),
 (<pkgutil.ImpImporter instance at 0x7f507f07ecb0>,
  'test_multicalendar',
  False)]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
cleanup Code changes that improve maintainability without changing behavior
Projects
None yet
Development

No branches or pull requests

1 participant