-
Notifications
You must be signed in to change notification settings - Fork 30
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
Raise error with pytest==8.0.0
#65
Comments
pytest==8.0.0
Since the main branch of this repo hasn't seen an update in two years, I've been looking for an alternative. In my case, I was using something like this: # In conftest.py:
@pytest.fixture
def test_api_sqlite_mp(test_sqlite_mp):
return Platform(_backend=RestTestBackend(test_sqlite_mp.backend))
@pytest.fixture
def test_api_pgsql_mp(test_pgsql_mp):
return Platform(_backend=RestTestBackend(test_pgsql_mp.backend))
# In another file:
api_platforms = pytest.mark.parametrize(
"test_mp",
[
pytest.lazy_fixture("test_api_sqlite_mp"),
pytest.lazy_fixture("test_api_pgsql_mp"),
],
)
# And finally, for the function:
@api_platforms
def test_index_model(test_mp):
... So following suggestions on StackOverflow and here, I changed that to # In conftest.py (everything stays the same):
@pytest.fixture
def test_api_sqlite_mp(test_sqlite_mp):
return Platform(_backend=RestTestBackend(test_sqlite_mp.backend))
@pytest.fixture
def test_api_pgsql_mp(test_pgsql_mp):
return Platform(_backend=RestTestBackend(test_pgsql_mp.backend))
# In another file:
api_platforms = pytest.mark.parametrize(
"test_mp",
[
"test_api_sqlite_mp",
"test_api_pgsql_mp",
],
)
# And finally, for the function:
@api_platforms
def test_index_model(test_mp, request):
test_mp = request.getfixturevalue(test_mp)
... After uninstalling pytest-lazy-fixture, my tests are running just fine again. Hope this helps :) |
Hi All, As mentioned by @glatterf42, it looks like this issue might never get fixed. So what I did was to come out with my own local import dataclasses
import typing
import pytest
@dataclasses.dataclass
class LazyFixture:
"""Lazy fixture dataclass."""
name: str
def lazy_fixture(name: str) -> LazyFixture:
"""Mark a fixture as lazy."""
return LazyFixture(name)
def is_lazy_fixture(value: object) -> bool:
"""Check whether a value is a lazy fixture."""
return isinstance(value, LazyFixture)
def pytest_make_parametrize_id(
config: pytest.Config,
val: object,
argname: str,
) -> str | None:
"""Inject lazy fixture parametrized id.
Reference:
- https://bit.ly/48Off6r
Args:
config (pytest.Config): pytest configuration.
value (object): fixture value.
argname (str): automatic parameter name.
Returns:
str: new parameter id.
"""
if is_lazy_fixture(val):
return typing.cast(LazyFixture, val).name
return None
@pytest.hookimpl(tryfirst=True)
def pytest_fixture_setup(
fixturedef: pytest.FixtureDef,
request: pytest.FixtureRequest,
) -> object | None:
"""Lazy fixture setup hook.
This hook will never take over a fixture setup but just simply will
try to resolve recursively any lazy fixture found in request.param.
Reference:
- https://bit.ly/3SyvsXJ
Args:
fixturedef (pytest.FixtureDef): fixture definition object.
request (pytest.FixtureRequest): fixture request object.
Returns:
object | None: fixture value or None otherwise.
"""
if hasattr(request, "param") and request.param:
request.param = _resolve_lazy_fixture(request.param, request)
return None
def _resolve_lazy_fixture(__val: object, request: pytest.FixtureRequest) -> object:
"""Lazy fixture resolver.
Args:
__val (object): fixture value object.
request (pytest.FixtureRequest): pytest fixture request object.
Returns:
object: resolved fixture value.
"""
if isinstance(__val, list | tuple):
return tuple(_resolve_lazy_fixture(v, request) for v in __val)
if isinstance(__val, typing.Mapping):
return {k: _resolve_lazy_fixture(v, request) for k, v in __val.items()}
if not is_lazy_fixture(__val):
return __val
lazy_obj = typing.cast(LazyFixture, __val)
return request.getfixturevalue(lazy_obj.name) By now I am simply including this into my root |
Bug: TvoroG/pytest-lazy-fixture#65 Signed-off-by: Michał Górny <[email protected]>
The PyArrow test suite relies on the pytest-lazy-fixture plugin, which breaks on pytest 8.0.0: TvoroG/pytest-lazy-fixture#65
### Rationale for this change The PyArrow test suite relies on the pytest-lazy-fixture plugin, which breaks on pytest 8.0.0: TvoroG/pytest-lazy-fixture#65 ### What changes are included in this PR? Avoid installing pytest 8 on CI builds, by putting an upper bound on the pytest version. ### Are these changes tested? Yes, by construction. ### Are there any user-facing changes? No. Authored-by: Antoine Pitrou <[email protected]> Signed-off-by: Antoine Pitrou <[email protected]>
For the record, the minimal set of changes to make things work again doesn't seem to be that massive. This works for me, passing pytest-lazy-fixture's test set (not running tox, just running Python 3.10 with pytest 8.0.0): diff --git a/pytest_lazyfixture.py b/pytest_lazyfixture.py
index abf5db5..df83ce7 100644
--- a/pytest_lazyfixture.py
+++ b/pytest_lazyfixture.py
@@ -71,14 +71,13 @@ def pytest_make_parametrize_id(config, val, argname):
def pytest_generate_tests(metafunc):
yield
- normalize_metafunc_calls(metafunc, 'funcargs')
- normalize_metafunc_calls(metafunc, 'params')
+ normalize_metafunc_calls(metafunc)
-def normalize_metafunc_calls(metafunc, valtype, used_keys=None):
+def normalize_metafunc_calls(metafunc, used_keys=None):
newcalls = []
for callspec in metafunc._calls:
- calls = normalize_call(callspec, metafunc, valtype, used_keys)
+ calls = normalize_call(callspec, metafunc, used_keys)
newcalls.extend(calls)
metafunc._calls = newcalls
@@ -98,17 +97,21 @@ def copy_metafunc(metafunc):
return copied
-def normalize_call(callspec, metafunc, valtype, used_keys):
+def normalize_call(callspec, metafunc, used_keys):
fm = metafunc.config.pluginmanager.get_plugin('funcmanage')
used_keys = used_keys or set()
- valtype_keys = set(getattr(callspec, valtype).keys()) - used_keys
+ keys = set(callspec.params.keys()) - used_keys
+ print(used_keys, keys)
- for arg in valtype_keys:
- val = getattr(callspec, valtype)[arg]
+ for arg in keys:
+ val = callspec.params[arg]
if is_lazy_fixture(val):
try:
- _, fixturenames_closure, arg2fixturedefs = fm.getfixtureclosure([val.name], metafunc.definition.parent)
+ if pytest.version_tuple >= (8, 0, 0):
+ fixturenames_closure, arg2fixturedefs = fm.getfixtureclosure(metafunc.definition.parent, [val.name], {})
+ else:
+ _, fixturenames_closure, arg2fixturedefs = fm.getfixtureclosure([val.name], metafunc.definition.parent)
except ValueError:
# 3.6.0 <= pytest < 3.7.0; `FixtureManager.getfixtureclosure` returns 2 values
fixturenames_closure, arg2fixturedefs = fm.getfixtureclosure([val.name], metafunc.definition.parent)
@@ -117,14 +120,14 @@ def normalize_call(callspec, metafunc, valtype, used_keys):
fixturenames_closure, arg2fixturedefs = fm.getfixtureclosure([val.name], current_node)
extra_fixturenames = [fname for fname in fixturenames_closure
- if fname not in callspec.params and fname not in callspec.funcargs]
+ if fname not in callspec.params]# and fname not in callspec.funcargs]
newmetafunc = copy_metafunc(metafunc)
newmetafunc.fixturenames = extra_fixturenames
newmetafunc._arg2fixturedefs.update(arg2fixturedefs)
newmetafunc._calls = [callspec]
fm.pytest_generate_tests(newmetafunc)
- normalize_metafunc_calls(newmetafunc, valtype, used_keys | set([arg]))
+ normalize_metafunc_calls(newmetafunc, used_keys | set([arg]))
return newmetafunc._calls
used_keys.add(arg) But the bigger question is of course how much more overdue maintenance is waiting to happen, and whether whether @TvoroG would be interested to keep maintaining or to transfer maintenance to someone else (cfr #63). |
I didn't look at the code in detail, but if the only problem is the call to |
I still get an error with pytest-dev/pytest#11888: ______________________ ERROR collecting tests/test_prettytable.py _______________________
/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages/pluggy/_hooks.py:501: in __call__
return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages/pluggy/_manager.py:119: in _hookexec
return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
../pytest/src/_pytest/python.py:274: in pytest_pycollect_makeitem
return list(collector._genfunctions(name, obj))
../pytest/src/_pytest/python.py:489: in _genfunctions
self.ihook.pytest_generate_tests.call_extra(methods, dict(metafunc=metafunc))
/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages/pluggy/_hooks.py:562: in call_extra
return self._hookexec(self.name, hookimpls, kwargs, firstresult)
/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages/pluggy/_manager.py:119: in _hookexec
return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages/pytest_lazyfixture.py:74: in pytest_generate_tests
normalize_metafunc_calls(metafunc, 'funcargs')
/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages/pytest_lazyfixture.py:81: in normalize_metafunc_calls
calls = normalize_call(callspec, metafunc, valtype, used_keys)
/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages/pytest_lazyfixture.py:105: in normalize_call
valtype_keys = set(getattr(callspec, valtype).keys()) - used_keys
E AttributeError: 'CallSpec2' object has no attribute 'funcargs' |
I believe the order of arguments also changed, or am I misreading the 3 different versions in pytest-lazy-fixutre?
And yes, the other fix is that |
Related to error discussed in TvoroG/pytest-lazy-fixture#65 Update pytest version in requirements-dev.txt Temporarily ignore recent release of 8.x Update pytest version in requirements-dev.txt
Since it's no longer being maintained. See TvoroG/pytest-lazy-fixture#65.
* Use python3.8 in docker images * Require pytest<8.0 This is needed becase of pytest-dev/pytest#11890 TvoroG/pytest-lazy-fixture#65 * Update changelog * Revert "Update changelog" This reverts commit 500ee9b. Making changes before having coffee :( * Add a note on recommending Python 3.8 * `ofrak_core` also needs `pytest<8.0`
* Use python3.8 in docker images * Require pytest<8.0 This is needed becase of pytest-dev/pytest#11890 TvoroG/pytest-lazy-fixture#65 * Update changelog * Revert "Update changelog" This reverts commit 500ee9b. Making changes before having coffee :( * Update to latest angr==9.2.89, which also necessitates Python >= 3.8 and capstone==5.0.0.post1 * Apply Edward's attempted fix to angr test failure * Add a note on recommending Python 3.8 * Add a note on recommending Python 3.8 * Document the requirement of Python 3.8+ * Switch to angr 9.2.77 * `ofrak_core` also needs `pytest<8.0` * ignore DataWord in test due to angr bug * add another now missing block * black linting * Attempt to fix a capstone error * Dropping the .altinstr_replacement section from the toolchain (redballoonsecurity#414) * Dropping the .altinstr_replacement section from the toolchain * Updated CHANGELOG * Set the fallback font to monospace (redballoonsecurity#422) * Set the fallback font to monospace * Update CHANGELOG * Display strings with numbers primarily as strings (redballoonsecurity#423) * Display strings with numbers primarily as strings * Update CHANGELOG * Add typing support to ofrak_ghidra package (redballoonsecurity#421) * Add typing to ofrak_ghidra package * Add changelog --------- Co-authored-by: Paul Noalhyt <[email protected]> * Increase time limit on `test_comment_content` * Fix a spurious "no current event loop" test error * Explain 3.7 vs 3.8 better in the docs * Cite specific versions of angr in comment * Update docs/environment-setup.md * Update docs/getting-started.md --------- Co-authored-by: Edward Larson <[email protected]> Co-authored-by: rbs-alexr <[email protected]> Co-authored-by: Jacob Strieb <[email protected]> Co-authored-by: Paul Noalhyt <[email protected]> Co-authored-by: Paul Noalhyt <[email protected]> Co-authored-by: Wyatt <[email protected]>
`pytest-lazy-fixture` has not been maintained since 2022, and it does not work properly with pytest-8 anymore [1]. Switch to the maintained `pytest-lazy-fixtures` replacement. [1] TvoroG/pytest-lazy-fixture#65
`pytest-lazy-fixture` has not been maintained since 2022, and it does not work properly with pytest-8 anymore [1]. Switch to the maintained `pytest-lazy-fixtures` replacement. [1] TvoroG/pytest-lazy-fixture#65
The package seems to be fully replaced with lazy-fixtures which seems to have all the features we get used to. |
It is .... in Debian at least. All reverse-dependencies have been sorted out & pytest-lazy-fixture has been removed. Patches have been sent to upstream projects. |
- Fixes CI pipelines that were broken due to the [deprecated `set-output` command](https://github.blog/changelog/2022-10-11-github-actions-deprecating-save-state-and-set-output-commands/) - Drops support for Python 3.6-3.8 - Updates dependencies, pre-commit hooks and GitHub Actions - Adds `mkdocs` as a dev dependency to build documentation locally - Adds `pytest-xdist` as a dev dependency to run tests in parallel - Removes `pytest-lazy-fixture` as a dev dependency since it [does not support `pytest` 8](TvoroG/pytest-lazy-fixture#65) - Removes `tox` as a dev dependency - Migrates code formatting and linting to ruff
* Switch to the maintained pytest-lazy-fixtures package `pytest-lazy-fixture` has not been maintained since 2022, and it does not work properly with pytest-8 anymore [1]. Switch to the maintained `pytest-lazy-fixtures` replacement. [1] TvoroG/pytest-lazy-fixture#65 * Update dependency pins
Hi!
pytest-lazy-fixture
doesn't work withpytest==8.0.0
The text was updated successfully, but these errors were encountered: