-
-
Notifications
You must be signed in to change notification settings - Fork 1
Labels
bugA bug fixA bug fix
Description
Description
Using the Injector Module multiple times in one process causes a crash, this prevents some system test configurations.
Expected behavior
To be able to create and use multiple containers with the module.
Actual behavior
=================================================== test session starts ===================================================
platform linux -- Python 3.11.6, pytest-7.4.2, pluggy-1.3.0 -- /VENV/bin/python
cachedir: .pytest_cache
rootdir: /ROOT
configfile: pyproject.toml
plugins: mypy-0.10.3, pylint-0.21.0, cov-4.1.0, pydocstyle-2.3.2, typeguard-4.1.5, anyio-3.7.1, asyncio-0.21.1
asyncio: mode=Mode.STRICT
collected 1 item
tests/bug.py::test_bug FAILED [100%]
======================================================== FAILURES =========================================================
________________________________________________________ test_bug _________________________________________________________
def test_bug() -> None:
r = banshee.Registry()
c = injector.Injector(banshee.extra.injector.BansheeModule(r))
c.get(banshee.Bus)
> c = injector.Injector(banshee.extra.injector.BansheeModule(r))
tests/bug.py:10:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/VENV/lib/python3.11/site-packages/injector/__init__.py:923: in __init__
self.binder.install(module)
/VENV/lib/python3.11/site-packages/injector/__init__.py:564: in install
instance(self)
/VENV/lib/python3.11/site-packages/injector/__init__.py:869: in __call__
self.configure(binder)
/VENV/lib/python3.11/site-packages/banshee/extra/injector.py:95: in configure
binder.bind(injector.inject(banshee.IdentityMiddleware))
/VENV/lib/python3.11/site-packages/injector/__init__.py:1410: in inject
inject(cast(Any, constructor_or_class).__init__)
/VENV/lib/python3.11/site-packages/injector/__init__.py:1415: in inject
read_and_store_bindings(function, bindings)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
f = <slot wrapper '__init__' of 'object' objects>, bindings = {}
@private
def read_and_store_bindings(f: Callable, bindings: Dict[str, type]) -> None:
function_bindings = getattr(f, '__bindings__', None) or {}
if function_bindings == 'deferred':
function_bindings = {}
merged_bindings = dict(function_bindings, **bindings)
if hasattr(f, '__func__'):
f = cast(Any, f).__func__
> cast(Any, f).__bindings__ = merged_bindings
E AttributeError: 'wrapper_descriptor' object has no attribute '__bindings__'
/VENV/lib/python3.11/site-packages/injector/__init__.py:1477: AttributeError
================================================= short test summary info =================================================
FAILED tests/bug.py::test_bug - AttributeError: 'wrapper_descriptor' object has no attribute '__bindings__'
==================================================== 1 failed in 0.06s ====================================================
Possible fixes
The problem seems to stem from calling injector.inject() on a class after it has already been used for injection.
This happens in the configure method of BansheeModule.
The calls seem to be superfluous and can be removed without changing functionality.
Steps to Reproduce
import banshee
import banshee.extra.injector
import injector
def test_bug() -> None:
r = banshee.Registry()
c = injector.Injector(banshee.extra.injector.BansheeModule(r))
c.get(banshee.Bus)
c = injector.Injector(banshee.extra.injector.BansheeModule(r))Your environment
- Version used: 0.1.0
Metadata
Metadata
Assignees
Labels
bugA bug fixA bug fix