diff --git a/pydiator_core/default_pipeline.py b/pydiator_core/default_pipeline.py index 0250e25..517a7a0 100644 --- a/pydiator_core/default_pipeline.py +++ b/pydiator_core/default_pipeline.py @@ -1,3 +1,5 @@ +import inspect + from pydiator_core.interfaces import BaseRequest, BasePipeline from pydiator_core.mediatr_container import BaseMediatrContainer @@ -16,4 +18,8 @@ async def handle(self, req: BaseRequest, **kwargs) -> object: if not callable(handle_func): raise Exception("handle_function_has_not_found_in_handler") + is_async = inspect.iscoroutinefunction(handler.handle) + if not is_async: + return handler.handle(req) + return await handler.handle(req) diff --git a/setup.py b/setup.py index ae1adfc..dacce9f 100644 --- a/setup.py +++ b/setup.py @@ -5,7 +5,7 @@ setuptools.setup( name="pydiator-core", - version="1.0.8", + version="1.0.9", author="Özgür Kara", author_email="ozgurkara85@gmail.com", description="Pydiator", diff --git a/tests/base_test_case.py b/tests/base_test_case.py index 11ddbfe..3d14aa4 100644 --- a/tests/base_test_case.py +++ b/tests/base_test_case.py @@ -60,6 +60,11 @@ async def handle(self, req: BaseRequest): return TestResponse(success=True) +class TestSyncHandler(BaseHandler): + def handle(self, req: BaseRequest): + return TestResponse(success=True) + + class TestPipeline(BasePipeline): def __init__(self, response_success): self.response_success = response_success diff --git a/tests/test_default_pipeline.py b/tests/test_default_pipeline.py index dc154ed..8b114eb 100644 --- a/tests/test_default_pipeline.py +++ b/tests/test_default_pipeline.py @@ -3,7 +3,7 @@ from pydiator_core.default_pipeline import DefaultPipeline from pydiator_core.interfaces import BaseResponse from pydiator_core.mediatr_container import MediatrContainer -from tests.base_test_case import BaseTestCase, TestRequest, TestHandler +from tests.base_test_case import BaseTestCase, TestRequest, TestHandler, TestSyncHandler class TestDefaultPipeline(BaseTestCase): @@ -45,3 +45,15 @@ def test_handle_return_handle_response(self): # Then assert isinstance(response, BaseResponse) + + def test_handle_return_handle_response_when_handle_is_sync(self): + # Given + container = MediatrContainer() + container.register_request(TestRequest, TestSyncHandler()) + self.pipeline = DefaultPipeline(container) + + # When + response = self.async_loop(self.pipeline.handle(req=TestRequest())) + + # Then + assert isinstance(response, BaseResponse)