Skip to content

Injector module breaks when used a second time. #83

@danielknell

Description

@danielknell

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

No one assigned

    Labels

    bugA bug fix

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions