Skip to content

Commit 5a1da10

Browse files
author
Sergio García Prado
authored
Merge pull request #476 from minos-framework/issue-475-fix-concurrency-issues-check
#475 - Fix handling functions concurrency issues
2 parents f0ef877 + 22e90ab commit 5a1da10

File tree

7 files changed

+41
-49
lines changed

7 files changed

+41
-49
lines changed

packages/core/minos-microservice-networks/minos/networks/brokers/dispatchers/impl.py

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
)
1717
from typing import (
1818
Optional,
19-
Union,
2019
)
2120

2221
from minos.common import (
@@ -28,13 +27,13 @@
2827

2928
from ...decorators import (
3029
EnrouteFactory,
30+
Handler,
3131
)
3232
from ...exceptions import (
3333
MinosActionNotFoundException,
3434
)
3535
from ...requests import (
3636
REQUEST_USER_CONTEXT_VAR,
37-
Request,
3837
Response,
3938
ResponseException,
4039
)
@@ -50,16 +49,17 @@
5049
)
5150
from .requests import (
5251
BrokerRequest,
53-
BrokerResponse,
5452
)
5553

5654
logger = logging.getLogger(__name__)
5755

56+
AdaptedHandler = Callable[[BrokerMessage], Awaitable[BrokerMessageV1Payload]]
57+
5858

5959
class BrokerDispatcher(SetupMixin):
6060
"""Broker Dispatcher class."""
6161

62-
def __init__(self, actions: dict[str, Optional[Callable]], publisher: BrokerPublisher, **kwargs):
62+
def __init__(self, actions: dict[str, Handler], publisher: BrokerPublisher, **kwargs):
6363
super().__init__(**kwargs)
6464
self._actions = actions
6565
self._publisher = publisher
@@ -72,9 +72,7 @@ def _from_config(cls, config: Config, **kwargs) -> BrokerDispatcher:
7272
return cls(**kwargs)
7373

7474
@staticmethod
75-
def _get_actions(
76-
config: Config, handlers: dict[str, Optional[Callable]] = None, **kwargs
77-
) -> dict[str, Callable[[BrokerRequest], Awaitable[Optional[BrokerResponse]]]]:
75+
def _get_actions(config: Config, handlers: dict[str, Handler] = None, **kwargs) -> dict[str, Handler]:
7876
if handlers is None:
7977
builder = EnrouteFactory(*config.get_services(), middleware=config.get_middleware())
8078
decorators = builder.get_broker_command_query_event(config=config, **kwargs)
@@ -104,7 +102,7 @@ def publisher(self) -> BrokerPublisher:
104102
return self._publisher
105103

106104
@property
107-
def actions(self) -> dict[str, Optional[Callable]]:
105+
def actions(self) -> dict[str, Handler]:
108106
"""Actions getter.
109107
110108
:return: A dictionary in which the keys are topics and the values are the handler.
@@ -127,9 +125,7 @@ async def dispatch(self, message: BrokerMessage) -> None:
127125
await self.publisher.send(reply)
128126

129127
@staticmethod
130-
def get_callback(
131-
fn: Callable[[BrokerRequest], Union[Optional[BrokerResponse], Awaitable[Optional[BrokerResponse]]]]
132-
) -> Callable[[BrokerMessage], Awaitable[BrokerMessageV1Payload]]:
128+
def get_callback(fn: Handler) -> AdaptedHandler:
133129
"""Get the handler function to be used by the Broker Handler.
134130
135131
:param fn: The action function.
@@ -169,7 +165,7 @@ async def _wrapper(raw: BrokerMessage) -> BrokerMessageV1Payload:
169165

170166
return _wrapper
171167

172-
def get_action(self, topic: str) -> Callable[[Request], Union[Optional[Response], Awaitable[Optional[Response]]]]:
168+
def get_action(self, topic: str) -> Handler:
173169
"""Get the handling function to be called.
174170
175171
:param topic: The name of the topic that matches the action.

packages/core/minos-microservice-networks/minos/networks/decorators/callables/handlers.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
TYPE_CHECKING,
2222
Optional,
2323
Protocol,
24-
Type,
2524
Union,
2625
runtime_checkable,
2726
)
@@ -57,7 +56,7 @@ class HandlerWrapper(Protocol):
5756
"""Handler Wrapper class."""
5857

5958
meta: HandlerMeta
60-
check: Type[CheckDecorator]
59+
check: type[CheckDecorator]
6160
__call__: Handler
6261

6362

@@ -114,11 +113,10 @@ async def _wrapper(*args, **kwargs) -> Optional[Response]:
114113

115114
_wrapper.meta = self
116115
_wrapper.check = self.check
117-
_wrapper.__decorators__ = self.decorators # FIXME: This attribute should be removed in future versions.
118116

119117
return _wrapper
120118

121-
@cached_property
119+
@property
122120
def sync_wrapper(self) -> HandlerWrapper:
123121
"""Get the sync ``HandlerWrapper`` instance.
124122
@@ -139,7 +137,6 @@ def _wrapper(*args, **kwargs) -> Optional[Response]:
139137

140138
_wrapper.meta = self
141139
_wrapper.check = self.check
142-
_wrapper.__decorators__ = self.decorators # FIXME: This attribute should be removed in future versions.
143140

144141
return _wrapper
145142

@@ -157,7 +154,7 @@ def add_decorator(self, decorator: EnrouteDecorator) -> None:
157154
self.decorators.add(decorator)
158155

159156
@cached_property
160-
def check(self) -> Type[CheckDecorator]:
157+
def check(self) -> type[CheckDecorator]:
161158
"""Get the check decorator.
162159
163160
:return: A ``CheckDecorator`` type.

packages/core/minos-microservice-networks/minos/networks/decorators/collectors.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,7 @@
55
)
66
from typing import (
77
Any,
8-
Callable,
98
Optional,
10-
Type,
119
)
1210

1311
from minos.common import (
@@ -84,7 +82,7 @@ def get_periodic_event(self) -> dict[str, set[PeriodicEventEnrouteDecorator]]:
8482
# noinspection PyTypeChecker
8583
return self._get_items({PeriodicEventEnrouteDecorator})
8684

87-
def _get_items(self, expected_types: set[Type[EnrouteDecorator]]) -> dict[str, set[EnrouteDecorator]]:
85+
def _get_items(self, expected_types: set[type[EnrouteDecorator]]) -> dict[str, set[EnrouteDecorator]]:
8886
items = dict()
8987
for fn, decorators in self.get_all().items():
9088
decorators = {decorator for decorator in decorators if type(decorator) in expected_types}
@@ -97,7 +95,7 @@ def get_all(self) -> dict[str, set[EnrouteDecorator]]:
9795
9896
:return: A mapping with functions as keys and a sets of decorators as values.
9997
"""
100-
fn: Callable = getattr(self.decorated, "__get_enroute__", self._get_all)
98+
fn = getattr(self.decorated, "__get_enroute__", self._get_all)
10199
return fn(config=self.config)
102100

103101
# noinspection PyUnusedLocal

packages/core/minos-microservice-networks/minos/networks/decorators/factories.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
defaultdict,
66
)
77
from collections.abc import (
8-
Awaitable,
98
Callable,
109
Collection,
1110
)
@@ -17,6 +16,7 @@
1716
isawaitable,
1817
)
1918
from typing import (
19+
Awaitable,
2020
Optional,
2121
Union,
2222
)
@@ -25,6 +25,9 @@
2525
import_module,
2626
)
2727

28+
from ..decorators import (
29+
Handler,
30+
)
2831
from ..exceptions import (
2932
MinosRedefinedEnrouteDecoratorException,
3033
)
@@ -43,14 +46,16 @@
4346
RestEnrouteDecorator,
4447
)
4548

46-
Handler = Callable[[Request], Awaitable[Optional[Response]]]
49+
Middleware = Callable[[Request, Handler], Union[Optional[Response], Awaitable[Optional[Response]]]]
4750

4851

4952
class EnrouteFactory:
5053
"""Enroute factory class."""
5154

5255
def __init__(
53-
self, *classes: Union[str, type], middleware: Optional[Union[str, Callable, list[Union[str, Callable]]]] = None
56+
self,
57+
*classes: Union[str, type],
58+
middleware: Optional[Union[str, Middleware, list[Union[str, Middleware]]]] = None,
5459
):
5560
if middleware is None:
5661
middleware = tuple()

packages/core/minos-microservice-networks/minos/networks/http/adapters.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,6 @@
33
)
44

55
import logging
6-
from collections.abc import (
7-
Callable,
8-
)
96
from typing import (
107
Any,
118
)
@@ -17,6 +14,7 @@
1714
)
1815

1916
from ..decorators import (
17+
Handler,
2018
HttpEnrouteDecorator,
2119
)
2220
from ..exceptions import (
@@ -44,16 +42,17 @@ def _from_config(cls, *args, config: Config, **kwargs) -> HttpAdapter:
4442
@staticmethod
4543
def _routers_from_config(config: Config, **kwargs) -> list[HttpRouter]:
4644
classes = config.get_routers()
45+
# noinspection PyTypeChecker
4746
classes = tuple((class_ if not isinstance(class_, str) else import_module(class_)) for class_ in classes)
4847
classes = filter(lambda router: issubclass(router, HttpRouter), classes)
4948
routers = [router.from_config(config) for router in classes]
5049
return routers
5150

5251
@property
53-
def routes(self) -> dict[HttpEnrouteDecorator, Callable]:
52+
def routes(self) -> dict[HttpEnrouteDecorator, Handler]:
5453
"""Get routes.
5554
56-
:return: A ``dict`` with ``HttpEnrouteDecorator`` and ``Callable`` as values.
55+
:return: A ``dict`` with ``HttpEnrouteDecorator`` and ``Handler`` as values.
5756
"""
5857
routes = dict()
5958
for router in self._routers:

packages/core/minos-microservice-networks/minos/networks/http/connectors.py

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
Semaphore,
1313
)
1414
from collections.abc import (
15+
Awaitable,
1516
Callable,
1617
)
1718
from functools import (
@@ -21,11 +22,9 @@
2122
isawaitable,
2223
)
2324
from typing import (
24-
Awaitable,
2525
Generic,
2626
Optional,
2727
TypeVar,
28-
Union,
2928
)
3029

3130
from minos.common import (
@@ -35,6 +34,7 @@
3534
)
3635

3736
from ..decorators import (
37+
Handler,
3838
HttpEnrouteDecorator,
3939
)
4040
from ..requests import (
@@ -47,10 +47,9 @@
4747
HttpAdapter,
4848
)
4949

50-
_Callback = Callable[[Request], Union[Optional[Response], Awaitable[Optional[Response]]]]
51-
5250
RawRequest = TypeVar("RawRequest")
5351
RawResponse = TypeVar("RawResponse")
52+
AdaptedHandler = Callable[[RawRequest], Awaitable[RawResponse]]
5453

5554
logger = logging.getLogger(__name__)
5655

@@ -124,7 +123,7 @@ def mount_routes(self) -> None:
124123
for decorator, callback in self.routes.items():
125124
self.mount_route(decorator.path, decorator.method, callback)
126125

127-
def mount_route(self, path: str, method: str, callback: Callable[[Request], Optional[Response]]):
126+
def mount_route(self, path: str, method: str, callback: Handler):
128127
"""Mount a new route on the application.
129128
130129
:param path: The request's path.
@@ -136,12 +135,10 @@ def mount_route(self, path: str, method: str, callback: Callable[[Request], Opti
136135
self._mount_route(path, method, adapted_callback)
137136

138137
@abstractmethod
139-
def _mount_route(self, path: str, method: str, adapted_callback: Callable) -> None:
138+
def _mount_route(self, path: str, method: str, adapted_callback: AdaptedHandler) -> None:
140139
raise NotImplementedError
141140

142-
def adapt_callback(
143-
self, callback: Callable[[Request], Union[Optional[Response], Awaitable[Optional[Response]]]]
144-
) -> Callable[[RawRequest], Awaitable[RawResponse]]:
141+
def adapt_callback(self, callback: Handler) -> AdaptedHandler:
145142
"""Get the adapted callback to be used by the connector.
146143
147144
:param callback: The function.
@@ -206,7 +203,7 @@ def port(self) -> int:
206203
return self._port
207204

208205
@property
209-
def routes(self) -> dict[HttpEnrouteDecorator, _Callback]:
206+
def routes(self) -> dict[HttpEnrouteDecorator, Handler]:
210207
"""Get the port.
211208
212209
:return: A ``int`` value.

packages/core/minos-microservice-networks/minos/networks/routers.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
)
99
from typing import (
1010
Any,
11-
Callable,
1211
)
1312

1413
from cached_property import (
@@ -24,6 +23,7 @@
2423
BrokerEnrouteDecorator,
2524
EnrouteDecorator,
2625
EnrouteFactory,
26+
Handler,
2727
HttpEnrouteDecorator,
2828
PeriodicEnrouteDecorator,
2929
)
@@ -42,25 +42,25 @@ def _from_config(cls, config: Config, **kwargs) -> Router:
4242
return cls(config)
4343

4444
@cached_property
45-
def routes(self) -> dict[EnrouteDecorator, Callable]:
45+
def routes(self) -> dict[EnrouteDecorator, Handler]:
4646
"""Get the routes stored on the router.
4747
4848
:return: A dict with decorators as keys and callbacks as values.
4949
"""
5050
return self._build_routes()
5151

52-
def _build_routes(self) -> dict[EnrouteDecorator, Callable]:
52+
def _build_routes(self) -> dict[EnrouteDecorator, Handler]:
5353
routes = self._get_all_routes()
5454
routes = self._filter_routes(routes)
5555
return routes
5656

57-
def _get_all_routes(self) -> dict[EnrouteDecorator, Callable]:
57+
def _get_all_routes(self) -> dict[EnrouteDecorator, Handler]:
5858
builder = EnrouteFactory(*self._config.get_services(), middleware=self._config.get_middleware())
5959
routes = builder.get_all(config=self._config)
6060
return routes
6161

6262
@abstractmethod
63-
def _filter_routes(self, routes: dict[EnrouteDecorator, Callable]) -> dict[EnrouteDecorator, Callable]:
63+
def _filter_routes(self, routes: dict[EnrouteDecorator, Handler]) -> dict[EnrouteDecorator, Handler]:
6464
raise NotImplementedError
6565

6666
def __eq__(self, other: Any) -> bool:
@@ -80,13 +80,13 @@ def __eq__(self, other: Any) -> bool:
8080
class HttpRouter(Router, ABC):
8181
"""Http Router base class."""
8282

83-
routes: dict[HttpEnrouteDecorator, Callable]
83+
routes: dict[HttpEnrouteDecorator, Handler]
8484

8585

8686
class RestHttpRouter(HttpRouter):
8787
"""Rest Http Router class."""
8888

89-
def _filter_routes(self, routes: dict[EnrouteDecorator, Callable]) -> dict[EnrouteDecorator, Callable]:
89+
def _filter_routes(self, routes: dict[EnrouteDecorator, Handler]) -> dict[EnrouteDecorator, Handler]:
9090
routes = {
9191
decorator: callback for decorator, callback in routes.items() if isinstance(decorator, HttpEnrouteDecorator)
9292
}
@@ -96,7 +96,7 @@ def _filter_routes(self, routes: dict[EnrouteDecorator, Callable]) -> dict[Enrou
9696
class BrokerRouter(Router):
9797
"""Broker Router class."""
9898

99-
def _filter_routes(self, routes: dict[EnrouteDecorator, Callable]) -> dict[EnrouteDecorator, Callable]:
99+
def _filter_routes(self, routes: dict[EnrouteDecorator, Handler]) -> dict[EnrouteDecorator, Handler]:
100100
routes = {
101101
decorator: callback
102102
for decorator, callback in routes.items()
@@ -108,7 +108,7 @@ def _filter_routes(self, routes: dict[EnrouteDecorator, Callable]) -> dict[Enrou
108108
class PeriodicRouter(Router):
109109
"""Periodic Router class."""
110110

111-
def _filter_routes(self, routes: dict[EnrouteDecorator, Callable]) -> dict[EnrouteDecorator, Callable]:
111+
def _filter_routes(self, routes: dict[EnrouteDecorator, Handler]) -> dict[EnrouteDecorator, Handler]:
112112
routes = {
113113
decorator: callback
114114
for decorator, callback in routes.items()

0 commit comments

Comments
 (0)