コード例 #1
0
async def test_inner_value(subtests):
    """Ensure that coroutine correct value is preserved for all units."""
    containers = [
        # We have to define these values inside the test, because
        # otherwise `anyio` will `await` reused coroutines.
        # And they have to be fresh. That's why we use subtests for it.
        Future.from_futureresult(FutureResult.from_success(1)),
        Future.from_futureresult(FutureResult.from_failure(1)),
    ]
    for container in containers:
        with subtests.test(container=container):
            assert isinstance(await container, IO)
コード例 #2
0
ファイル: test_flatten.py プロジェクト: t94j0/returns
async def test_non_flatten_future(subtests):
    """Ensures that `flatten` is always returning the correct type."""
    futures = [
        # Not flattens:
        FutureResult.from_failure(FutureResult.from_failure(1)),
    ]

    for cont in futures:
        with subtests.test(container=cont):
            assert isinstance(
                (await flatten(cont)).failure()._inner_value,  # noqa: WPS437
                FutureResult,
            )
コード例 #3
0
async def test_flatten_future(subtests):
    """Ensures that `flatten` is always returning the correct type."""
    futures = [
        # Flattens:
        (Future.from_value(Future.from_value(1)), Future.from_value(1)),
        (
            FutureResult.from_value(FutureResult.from_value(1)),
            FutureResult.from_value(1),
        ),
    ]

    for container, merged in futures:
        with subtests.test(container=container, merged=merged):
            assert await flatten(container) == await merged  # type: ignore
コード例 #4
0
 def __call__(
     self,
     inner_value: str,
     use_result: Result[str, str],
 ) -> FutureResult[None, str]:
     self._logs.append((inner_value, use_result))
     return FutureResult.from_value(None)
コード例 #5
0
    def from_ioresult_context(
        cls,
        inner_value:
        'ReaderIOResult[_NewValueType, _NewErrorType, _NewEnvType]',
    ) -> 'ReaderFutureResult[_NewValueType, _NewErrorType, _NewEnvType]':
        """
        Creates new container from ``RequiresContextIOResult`` as a unit value.

        .. code:: python

          >>> import anyio
          >>> from returns.context import RequiresContextIOResult
          >>> from returns.io import IOSuccess, IOFailure

          >>> assert anyio.run(
          ...     RequiresContextFutureResult.from_ioresult_context(
          ...         RequiresContextIOResult.from_value(1),
          ...     ),
          ...     RequiresContextFutureResult.empty,
          ... ) == IOSuccess(1)

          >>> assert anyio.run(
          ...     RequiresContextFutureResult.from_ioresult_context(
          ...         RequiresContextIOResult.from_failure(1),
          ...     ),
          ...     RequiresContextFutureResult.empty,
          ... ) == IOFailure(1)

        """
        return RequiresContextFutureResult(
            lambda deps: FutureResult.from_ioresult(inner_value(deps)), )
コード例 #6
0
    def from_failed_future(
        cls,
        inner_value: Future[_NewErrorType],
    ) -> RequiresContextFutureResult[Any, _NewErrorType, NoDeps]:
        """
        Creates new container with failed ``Future`` as a unit value.

        .. code:: python

          >>> import anyio
          >>> from returns.context import RequiresContextFutureResult
          >>> from returns.future import Future
          >>> from returns.io import IOFailure

          >>> assert anyio.run(
          ...    RequiresContextFutureResult.from_failed_future(
          ...        Future.from_value(1),
          ...    ),
          ...    RequiresContextFutureResult.no_args,
          ... ) == IOFailure(1)

        """
        return RequiresContextFutureResult(
            lambda _: FutureResult.from_failed_future(inner_value),
        )
コード例 #7
0
    def from_ioresult(
        cls,
        inner_value: IOResult[_NewValueType, _NewErrorType],
    ) -> 'RequiresContextFutureResult[_NewValueType, _NewErrorType, NoDeps]':
        """
        Creates new container with ``IOResult`` as a unit value.

        .. code:: python

          >>> import anyio
          >>> from returns.context import RequiresContextFutureResult
          >>> from returns.io import IOSuccess, IOFailure

          >>> assert anyio.run(
          ...    RequiresContextFutureResult.from_ioresult(IOSuccess(1)),
          ...    RequiresContextFutureResult.empty,
          ... ) == IOSuccess(1)

          >>> assert anyio.run(
          ...    RequiresContextFutureResult.from_ioresult(IOFailure(1)),
          ...    RequiresContextFutureResult.empty,
          ... ) == IOFailure(1)

        """
        return RequiresContextFutureResult(
            lambda _: FutureResult.from_ioresult(inner_value), )
コード例 #8
0
    def compose_result(
        self,
        function: Callable[
            [Result[_ValueType, _ErrorType]],
            Kind3[
                RequiresContextFutureResult,
                _NewValueType,
                _ErrorType,
                _EnvType,
            ],
        ],
    ) -> RequiresContextFutureResult[_NewValueType, _ErrorType, _EnvType]:
        """
        Composes inner ``Result`` with ``ReaderFutureResult`` returning func.

        Can be useful when you need an access to both states of the result.

        .. code:: python

          >>> import anyio
          >>> from returns.context import ReaderFutureResult, NoDeps
          >>> from returns.io import IOSuccess, IOFailure
          >>> from returns.result import Result

          >>> def count(
          ...    container: Result[int, int],
          ... ) -> ReaderFutureResult[int, int, NoDeps]:
          ...     return ReaderFutureResult.from_result(
          ...         container.map(lambda x: x + 1).alt(abs),
          ...     )

          >>> success = ReaderFutureResult.from_value(1)
          >>> failure = ReaderFutureResult.from_failure(-1)

          >>> assert anyio.run(
          ...     success.compose_result(count), ReaderFutureResult.no_args,
          ... ) == IOSuccess(2)
          >>> assert anyio.run(
          ...     failure.compose_result(count), ReaderFutureResult.no_args,
          ... ) == IOFailure(1)

        """
        return RequiresContextFutureResult(
            lambda deps: FutureResult(
                _reader_future_result.async_compose_result(
                    function, self, deps,
                ),
            ),
        )
コード例 #9
0
    def bind_async(
        self,
        function: Callable[
            [_ValueType],
            Awaitable[
                Kind3[
                    RequiresContextFutureResult,
                    _NewValueType,
                    _ErrorType,
                    _EnvType,
                ],
            ],
        ],
    ) -> RequiresContextFutureResult[_NewValueType, _ErrorType, _EnvType]:
        """
        Composes this container with a async function returning the same type.

        .. code:: python

          >>> import anyio
          >>> from returns.context import RequiresContextFutureResult
          >>> from returns.io import IOSuccess, IOFailure

          >>> async def function(
          ...     number: int,
          ... ) -> RequiresContextFutureResult[str, int, int]:
          ...     return RequiresContextFutureResult.from_value(number + 1)

          >>> assert anyio.run(
          ...     RequiresContextFutureResult.from_value(1).bind_async(
          ...        function,
          ...     ),
          ...     RequiresContextFutureResult.no_args,
          ... ) == IOSuccess(2)
          >>> assert anyio.run(
          ...     RequiresContextFutureResult.from_failure(1).bind_async(
          ...        function,
          ...     ),
          ...     RequiresContextFutureResult.no_args,
          ... ) == IOFailure(1)

        """
        return RequiresContextFutureResult(
            lambda deps: FutureResult(_reader_future_result.async_bind_async(
                function, self, deps,
            )),
        )
コード例 #10
0
    def from_value(
        cls,
        inner_value: _FirstType,
    ) -> RequiresContextFutureResult[_FirstType, Any, NoDeps]:
        """
        Creates new container with successful ``FutureResult`` as a unit value.

        .. code:: python

          >>> import anyio
          >>> from returns.context import RequiresContextFutureResult
          >>> from returns.io import IOSuccess

          >>> assert anyio.run(RequiresContextFutureResult.from_value(1)(
          ...    RequiresContextFutureResult.empty,
          ... ).awaitable) == IOSuccess(1)

        """
        return RequiresContextFutureResult(
            lambda _: FutureResult.from_value(inner_value), )
コード例 #11
0
    def from_failure(
        cls,
        inner_value: _FirstType,
    ) -> 'RequiresContextFutureResult[Any, _FirstType, NoDeps]':
        """
        Creates new container with failed ``FutureResult`` as a unit value.

        .. code:: python

          >>> import anyio
          >>> from returns.context import RequiresContextFutureResult
          >>> from returns.io import IOFailure

          >>> assert anyio.run(RequiresContextFutureResult.from_failure(1)(
          ...     RequiresContextFutureResult.empty,
          ... ).awaitable) == IOFailure(1)

        """
        return RequiresContextFutureResult(
            lambda _: FutureResult.from_failure(inner_value), )
コード例 #12
0
    def from_io(
        cls,
        inner_value: IO[_NewValueType],
    ) -> 'RequiresContextFutureResult[_NewValueType, Any, NoDeps]':
        """
        Creates new container from successful ``IO`` value.

        .. code:: python

          >>> import anyio
          >>> from returns.io import IO, IOSuccess
          >>> from returns.context import RequiresContextFutureResult

          >>> assert anyio.run(
          ...     RequiresContextFutureResult.from_io(IO(1)),
          ...     RequiresContextFutureResult.empty,
          ... ) == IOSuccess(1)

        """
        return RequiresContextFutureResult(
            lambda deps: FutureResult.from_io(inner_value), )
コード例 #13
0
    def from_failed_io(
        cls,
        inner_value: IO[_NewErrorType],
    ) -> 'RequiresContextFutureResult[Any, _NewErrorType, NoDeps]':
        """
        Creates a new container from failed ``IO`` value.

        .. code:: python

          >>> import anyio
          >>> from returns.io import IO, IOFailure
          >>> from returns.context import RequiresContextFutureResult

          >>> assert anyio.run(
          ...     RequiresContextFutureResult.from_failed_io(IO(1)),
          ...     RequiresContextFutureResult.empty,
          ... ) == IOFailure(1)

        """
        return RequiresContextFutureResult(
            lambda deps: FutureResult.from_failed_io(inner_value), )
コード例 #14
0
    def from_future(
        cls,
        inner_value: Future[_NewValueType],
    ) -> 'RequiresContextFutureResult[_NewValueType, Any, NoDeps]':
        """
        Creates new container with successful ``Future`` as a unit value.

        .. code:: python

          >>> import anyio
          >>> from returns.context import RequiresContextFutureResult
          >>> from returns.future import Future
          >>> from returns.io import IOSuccess

          >>> assert anyio.run(
          ...    RequiresContextFutureResult.from_future(Future.from_value(1)),
          ...    RequiresContextFutureResult.empty,
          ... ) == IOSuccess(1)

        """
        return RequiresContextFutureResult(
            lambda _: FutureResult.from_future(inner_value), )
コード例 #15
0
    def from_failed_context(
        cls,
        inner_value: 'RequiresContext[_NewValueType, _NewEnvType]',
    ) -> 'RequiresContextFutureResult[Any, _NewValueType, _NewEnvType]':
        """
        Creates new container from ``RequiresContext`` as a failure unit.

        .. code:: python

          >>> import anyio
          >>> from returns.context import RequiresContext
          >>> from returns.io import IOFailure

          >>> assert anyio.run(
          ...     RequiresContextFutureResult.from_failed_context(
          ...         RequiresContext.from_value(1),
          ...     ),
          ...     RequiresContextFutureResult.empty,
          ... ) == IOFailure(1)

        """
        return RequiresContextFutureResult(
            lambda deps: FutureResult.from_failure(inner_value(deps)), )
コード例 #16
0
    def from_context(
        cls,
        inner_value: 'RequiresContext[_FirstType, _EnvType]',
    ) -> 'RequiresContextFutureResult[_FirstType, Any, _EnvType]':
        """
        Creates new container from ``RequiresContext`` as a success unit.

        .. code:: python

          >>> import anyio
          >>> from returns.context import RequiresContext
          >>> from returns.io import IOSuccess

          >>> assert anyio.run(
          ...     RequiresContextFutureResult.from_context(
          ...         RequiresContext.from_value(1),
          ...     ),
          ...     RequiresContextFutureResult.empty,
          ... ) == IOSuccess(1)

        """
        return RequiresContextFutureResult(
            lambda deps: FutureResult.from_value(inner_value(deps)), )
コード例 #17
0
def _acquire_success() -> FutureResult[str, str]:
    return FutureResult.from_value('acquire success')
コード例 #18
0
def _future_result_function(argument: int) -> FutureResult[str, float]:
    return FutureResult.from_value(str(argument + 1))
コード例 #19
0
def test_nonequality():
    """Ensures that containers can be compared."""
    assert FutureResult.from_success(1) != FutureResult.from_success(1)
    assert hash(FutureResult.from_success(1))
コード例 #20
0
from returns.maybe import Maybe
from returns.primitives.asserts import assert_equal
from returns.primitives.container import BaseContainer
from returns.result import Result

_containers: Sequence[BaseContainer] = (
    Result.from_failure(1),
    Result.from_value(1),
    IO(1),
    IOResult.from_failure(1),
    IOResult.from_value(1),
    Maybe.from_value(1),
    Maybe.from_value(None),
    Maybe.from_optional(None),
    Future.from_value(1),
    FutureResult.from_value(1),
    FutureResult.from_failure(1),
    Reader.from_value(1),
    ReaderResult.from_value(1),
    ReaderResult.from_failure(1),
    ReaderIOResult.from_value(1),
    ReaderIOResult.from_failure(1),
    ReaderFutureResult.from_value(1),
    ReaderFutureResult.from_failure(1),
)


@pytest.mark.parametrize('container', _containers)
def test_assert_equal(container, anyio_backend_name: str):
    """Ensure that containers can be equal."""
    assert_equal(container, container, backend=anyio_backend_name)
コード例 #21
0
ファイル: test_is_io.py プロジェクト: nsidnev/returns
def test_return_false_with_future_result_container():  # noqa: WPS118
    """Ensures `is_io` function will return False for FutureResult."""
    assert is_io(FutureResult.from_failure('failure')) is False
コード例 #22
0
 def __call__(
     self,
     inner_value: str,
     use_result: Result[str, str],
 ) -> FutureResult[None, str]:
     return FutureResult.from_failure('release failure')
コード例 #23
0
async def test_inner_value(subtests):
    """Ensure that coroutine correct value is preserved for all units."""
    containers = [
        # We have to define these values inside the test, because
        # otherwise `anyio` will `await` reused coroutines.
        # And they have to be fresh. That's why we use subtests for it.
        FutureResult.from_value(1),
        FutureResult.from_failure(1),
        FutureResult.from_io(IO(1)),
        FutureResult.from_failed_io(IO(1)),
        FutureResult.from_ioresult(IOSuccess(1)),
        FutureResult.from_ioresult(IOFailure(1)),
        FutureResult.from_result(Success(1)),
        FutureResult.from_result(Failure(1)),
        FutureResult.from_future(Future.from_value(1)),
        FutureResult.from_failed_future(Future.from_value(1)),
        FutureResult.from_typecast(Future.from_value(Success(1))),
    ]
    for container in containers:
        with subtests.test(container=container):
            result_inst = await container
            assert result_inst._inner_value._inner_value == 1  # noqa: WPS437
コード例 #24
0
def _use_failure(inner_value: str) -> FutureResult[str, str]:
    return FutureResult.from_failure('use failure')
コード例 #25
0
def _use_success(inner_value: str) -> FutureResult[str, str]:
    return FutureResult.from_value('use success')
コード例 #26
0
async def test_bind_future_result():
    """Ensures that functions can be composed and return type is correct."""
    assert await bind(_future_result_function)(
        FutureResult.from_value(1), ) == IOSuccess('2')
    assert await bind(_future_result_function)(
        FutureResult.from_failure(1.0), ) == IOFailure(1.0)
コード例 #27
0
ファイル: managed.py プロジェクト: zeta1999/returns
 async def _future_pipeline(self, inner_value):
     used = self._use(inner_value)
     inner_result = await used._inner_value  # noqa: WPS437
     await self._release(inner_value, inner_result)
     return FutureResult.from_result(inner_result)
コード例 #28
0
ファイル: managed.py プロジェクト: zeta1999/returns
 def factory(deps):
     return _managed(
         lambda inner: self._use(inner)(deps),
         lambda inner, pure: self._release(inner, pure)(deps),
     )(FutureResult.from_value(inner_value))
コード例 #29
0
def _acquire_failure() -> FutureResult[str, str]:
    return FutureResult.from_failure('acquire failure')
コード例 #30
0
from returns.future import FutureResult
from returns.primitives.interfaces import (
    Altable,
    Bindable,
    Fixable,
    Mappable,
    Rescueable,
    Unifiable,
    Unitable,
    Unwrapable,
)


@pytest.mark.parametrize('container', [
    FutureResult.from_success(1),
    FutureResult.from_failure(1),
])
@pytest.mark.parametrize('protocol', [
    Bindable,
    Mappable,
    Rescueable,
    Altable,
    Fixable,
    Unwrapable,
    Unifiable,
    Unitable,
])
def test_protocols(container, protocol):
    """Ensures that Future has all the right protocols."""
    assert isinstance(container, protocol)