Skip to content

Commit 4286013

Browse files
authored
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
1 parent 48df949 commit 4286013

File tree

4 files changed

+38
-16
lines changed

4 files changed

+38
-16
lines changed

.coveragerc

+3
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,8 @@ source = src/dependency_injector
33
omit = tests/unit
44
plugins = Cython.Coverage
55

6+
[report]
7+
show_missing = true
8+
69
[html]
710
directory=reports/unittests/

docs/main/changelog.rst

+4
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ follows `Semantic versioning`_
1313
See issue `#477 <https://github.com/ets-labs/python-dependency-injector/issues/477>`_.
1414
Thanks to `Andrey Torsunov @gtors <https://github.com/gtors>`_ for reporting the issue.
1515
- Fix typing stub for ``container.override_providers()`` to accept other types besides ``Provider``.
16+
- Fix runtime issue with generic typing in resource initializer classes ``resources.Resource``
17+
and ``resources.AsyncResource``.
18+
See issue `#488 <https://github.com/ets-labs/python-dependency-injector/issues/488>`_.
19+
Thanks to `@EdwardBlair <https://github.com/EdwardBlair>`_ for reporting the issue.
1620

1721
4.35.2
1822
------

src/dependency_injector/resources.py

+2-15
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,13 @@
11
"""Resources module."""
22

33
import abc
4-
import sys
54
from typing import TypeVar, Generic
65

7-
if sys.version_info < (3, 7):
8-
from typing import GenericMeta
9-
else:
10-
class GenericMeta(type):
11-
...
12-
136

147
T = TypeVar('T')
158

169

17-
class ResourceMeta(GenericMeta, abc.ABCMeta):
18-
def __getitem__(cls, item):
19-
# Spike for Python 3.6
20-
return cls(item)
21-
22-
23-
class Resource(Generic[T], metaclass=ResourceMeta):
10+
class Resource(Generic[T]):
2411

2512
@abc.abstractmethod
2613
def init(self, *args, **kwargs) -> T:
@@ -31,7 +18,7 @@ def shutdown(self, resource: T) -> None:
3118
...
3219

3320

34-
class AsyncResource(Generic[T], metaclass=ResourceMeta):
21+
class AsyncResource(Generic[T]):
3522

3623
@abc.abstractmethod
3724
async def init(self, *args, **kwargs) -> T:

tests/unit/providers/test_resource_py35.py

+29-1
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
"""Dependency injector resource provider unit tests."""
22

33
import asyncio
4-
54
import unittest
5+
from typing import Any
66

77
from dependency_injector import containers, providers, resources, errors
88

@@ -603,3 +603,31 @@ async def _init():
603603

604604
self.assertIs(result2, resource)
605605
self.assertEqual(_init.counter, 1)
606+
607+
608+
class ResourceTypingTest(unittest.TestCase):
609+
# See issue: https://github.com/ets-labs/python-dependency-injector/issues/488
610+
611+
def test_sync_generic_type(self):
612+
class MyDependency:
613+
...
614+
615+
class MyResource(resources.Resource[MyDependency]):
616+
def init(self, *args: Any, **kwargs: Any) -> MyDependency:
617+
return MyDependency()
618+
619+
def shutdown(self, resource: MyDependency) -> None: ...
620+
621+
self.assertTrue(issubclass(MyResource, resources.Resource))
622+
623+
def test_async_generic_type(self):
624+
class MyDependency:
625+
...
626+
627+
class MyAsyncResource(resources.AsyncResource[MyDependency]):
628+
async def init(self, *args: Any, **kwargs: Any) -> MyDependency:
629+
return MyDependency()
630+
631+
async def shutdown(self, resource: MyDependency) -> None: ...
632+
633+
self.assertTrue(issubclass(MyAsyncResource, resources.AsyncResource))

0 commit comments

Comments
 (0)