def test_full_typing(): """This test is here to be a case for typing.""" logs: List[Tuple[str, Result[str, str]]] = [] pipeline_result = managed( _use_success, _ReleaseSuccess(logs), )(_acquire_success) assert pipeline_result(ReaderIOResult.no_args) == IOSuccess('use success') assert logs == [('acquire success', Success('use success'))]
def test_all_success(acquire, use, release, final_result, log): """Ensures that managed works as intended.""" pipeline_logs: List[Tuple[str, Result[str, str]]] = [] pipeline_result = managed( use, release(pipeline_logs), )(acquire) assert pipeline_result(ReaderIOResult.no_args) == final_result assert pipeline_logs == log
async def test_all_success(acquire, use, release, final_result, log): """Ensures that managed works as intended.""" pipeline_logs: List[Tuple[str, Result[str, str]]] = [] pipeline_result = managed( # type: ignore use, release(pipeline_logs), )(acquire()) assert await pipeline_result == final_result assert pipeline_logs == log
async def test_full_typing(): """This test is here to be a case for typing.""" logs: List[Tuple[str, Result[str, str]]] = [] pipeline_result = managed( _use_success, _ReleaseSuccess(logs), )(_acquire_success()) inner = pipeline_result(ReaderFutureResult.empty) assert await inner == IOSuccess('use success') assert logs == [('acquire success', Success('use success'))]
def _show_titles( number_of_posts: int, ) -> RequiresContextFutureResultE[Sequence[str], httpx.AsyncClient]: def factory(post: _Post) -> str: return post['title'] titles = [ # Notice how easily we compose async and sync functions: _fetch_post(post_id).map(factory) # TODO: try `for post_id in (2, 1, 0):` to see how errors work for post_id in range(1, number_of_posts + 1) ] return Fold.collect(titles, RequiresContextFutureResultE.from_value(())) if __name__ == '__main__': # Let's fetch 3 titles of posts one-by-one, but with async client, # because we want to highlight `managed` in this example: managed_httpx = managed(_show_titles(3), _close) future_result = managed_httpx( FutureResultE.from_value(httpx.AsyncClient(timeout=5)), ) print(anyio.run(future_result.awaitable)) # noqa: WPS421 # <IOResult: <Success: ( # 'sunt aut facere repellat provident occaecati ...', # 'qui est esse', # 'ea molestias quasi exercitationem repellat qui ipsa sit aut', # )>>