mirror of
https://github.com/ets-labs/python-dependency-injector.git
synced 2024-11-22 09:36:48 +03:00
Remove generic meta class from resource and async resource classes (#490)
* Remove generic meta class from resource and async resource classes * Add link to the issue into the tests * Update changelog
This commit is contained in:
parent
48df949cd5
commit
4286013ca0
|
@ -3,5 +3,8 @@ source = src/dependency_injector
|
||||||
omit = tests/unit
|
omit = tests/unit
|
||||||
plugins = Cython.Coverage
|
plugins = Cython.Coverage
|
||||||
|
|
||||||
|
[report]
|
||||||
|
show_missing = true
|
||||||
|
|
||||||
[html]
|
[html]
|
||||||
directory=reports/unittests/
|
directory=reports/unittests/
|
||||||
|
|
|
@ -13,6 +13,10 @@ follows `Semantic versioning`_
|
||||||
See issue `#477 <https://github.com/ets-labs/python-dependency-injector/issues/477>`_.
|
See issue `#477 <https://github.com/ets-labs/python-dependency-injector/issues/477>`_.
|
||||||
Thanks to `Andrey Torsunov @gtors <https://github.com/gtors>`_ for reporting the issue.
|
Thanks to `Andrey Torsunov @gtors <https://github.com/gtors>`_ for reporting the issue.
|
||||||
- Fix typing stub for ``container.override_providers()`` to accept other types besides ``Provider``.
|
- Fix typing stub for ``container.override_providers()`` to accept other types besides ``Provider``.
|
||||||
|
- Fix runtime issue with generic typing in resource initializer classes ``resources.Resource``
|
||||||
|
and ``resources.AsyncResource``.
|
||||||
|
See issue `#488 <https://github.com/ets-labs/python-dependency-injector/issues/488>`_.
|
||||||
|
Thanks to `@EdwardBlair <https://github.com/EdwardBlair>`_ for reporting the issue.
|
||||||
|
|
||||||
4.35.2
|
4.35.2
|
||||||
------
|
------
|
||||||
|
|
|
@ -1,26 +1,13 @@
|
||||||
"""Resources module."""
|
"""Resources module."""
|
||||||
|
|
||||||
import abc
|
import abc
|
||||||
import sys
|
|
||||||
from typing import TypeVar, Generic
|
from typing import TypeVar, Generic
|
||||||
|
|
||||||
if sys.version_info < (3, 7):
|
|
||||||
from typing import GenericMeta
|
|
||||||
else:
|
|
||||||
class GenericMeta(type):
|
|
||||||
...
|
|
||||||
|
|
||||||
|
|
||||||
T = TypeVar('T')
|
T = TypeVar('T')
|
||||||
|
|
||||||
|
|
||||||
class ResourceMeta(GenericMeta, abc.ABCMeta):
|
class Resource(Generic[T]):
|
||||||
def __getitem__(cls, item):
|
|
||||||
# Spike for Python 3.6
|
|
||||||
return cls(item)
|
|
||||||
|
|
||||||
|
|
||||||
class Resource(Generic[T], metaclass=ResourceMeta):
|
|
||||||
|
|
||||||
@abc.abstractmethod
|
@abc.abstractmethod
|
||||||
def init(self, *args, **kwargs) -> T:
|
def init(self, *args, **kwargs) -> T:
|
||||||
|
@ -31,7 +18,7 @@ class Resource(Generic[T], metaclass=ResourceMeta):
|
||||||
...
|
...
|
||||||
|
|
||||||
|
|
||||||
class AsyncResource(Generic[T], metaclass=ResourceMeta):
|
class AsyncResource(Generic[T]):
|
||||||
|
|
||||||
@abc.abstractmethod
|
@abc.abstractmethod
|
||||||
async def init(self, *args, **kwargs) -> T:
|
async def init(self, *args, **kwargs) -> T:
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
"""Dependency injector resource provider unit tests."""
|
"""Dependency injector resource provider unit tests."""
|
||||||
|
|
||||||
import asyncio
|
import asyncio
|
||||||
|
|
||||||
import unittest
|
import unittest
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
from dependency_injector import containers, providers, resources, errors
|
from dependency_injector import containers, providers, resources, errors
|
||||||
|
|
||||||
|
@ -603,3 +603,31 @@ class AsyncResourceTest(AsyncTestCase):
|
||||||
|
|
||||||
self.assertIs(result2, resource)
|
self.assertIs(result2, resource)
|
||||||
self.assertEqual(_init.counter, 1)
|
self.assertEqual(_init.counter, 1)
|
||||||
|
|
||||||
|
|
||||||
|
class ResourceTypingTest(unittest.TestCase):
|
||||||
|
# See issue: https://github.com/ets-labs/python-dependency-injector/issues/488
|
||||||
|
|
||||||
|
def test_sync_generic_type(self):
|
||||||
|
class MyDependency:
|
||||||
|
...
|
||||||
|
|
||||||
|
class MyResource(resources.Resource[MyDependency]):
|
||||||
|
def init(self, *args: Any, **kwargs: Any) -> MyDependency:
|
||||||
|
return MyDependency()
|
||||||
|
|
||||||
|
def shutdown(self, resource: MyDependency) -> None: ...
|
||||||
|
|
||||||
|
self.assertTrue(issubclass(MyResource, resources.Resource))
|
||||||
|
|
||||||
|
def test_async_generic_type(self):
|
||||||
|
class MyDependency:
|
||||||
|
...
|
||||||
|
|
||||||
|
class MyAsyncResource(resources.AsyncResource[MyDependency]):
|
||||||
|
async def init(self, *args: Any, **kwargs: Any) -> MyDependency:
|
||||||
|
return MyDependency()
|
||||||
|
|
||||||
|
async def shutdown(self, resource: MyDependency) -> None: ...
|
||||||
|
|
||||||
|
self.assertTrue(issubclass(MyAsyncResource, resources.AsyncResource))
|
||||||
|
|
Loading…
Reference in New Issue
Block a user