Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use returns in testing #235

Open
sobolevn opened this issue Jun 20, 2021 · 9 comments
Open

Use returns in testing #235

sobolevn opened this issue Jun 20, 2021 · 9 comments
Assignees
Labels
enhancement New feature or request

Comments

@sobolevn
Copy link
Member

We need to be sure that classes and returns can be used together and that typing works.

Plan:

  1. Install returns as dev-dependency
  2. Create special typesafety/test_integration/test_returns folder where we would test it
  3. In pytest-mypy-plugins we would need to add returns_plugin to mypy settings
@sobolevn sobolevn added the enhancement New feature or request label Jun 20, 2021
@sobolevn
Copy link
Member Author

We would probably would need to improve https://classes.readthedocs.io/en/latest/pages/dry-python.html page as well.

@thepabloaguilar thepabloaguilar self-assigned this Oct 2, 2021
@thepabloaguilar
Copy link
Member

Could you say more about what those tests should be, please?

@sobolevn
Copy link
Member Author

sobolevn commented Oct 2, 2021

We need to test:

  1. Result.success_type and failure_type
  2. Maybe with empty
  3. IOResult

So, imagine that you want to dispatch some action based on the result/mayb type using classes. That's we basically need to cover for different types.

@thepabloaguilar
Copy link
Member

thepabloaguilar commented Oct 3, 2021

I got some errors with Result using the example from the docs:

from classes import typeclass
from returns.result import Result, Success, Failure

@typeclass
def result_to_str(instance) -> str:
    """This is a typeclass definition to convert Result container to str."""

@result_to_str.instance(Result.success_type)
def _result_to_str_success(instance: Result) -> str:
    return str(instance.unwrap())  # will always receive `Success` types

@result_to_str.instance(Result.failure_type)
def _result_to_str_failure(instance: Result) -> str:
    return str(instance.failure())  # will always receive `Failure` types

if __name__ == '__main__':
    result_to_str(Success('test'))
    result_to_str(Failure('test'))

mypy output:

ex.py:10: error: Instance "returns.result.Result[Any, Any]" does not match inferred type "Type[returns.result._Success[Any]]"
ex.py:16: error: Instance "returns.result.Result[Any, Any]" does not match inferred type "Type[returns.result._Failure[Any]]"
ex.py:23: error: Argument 1 to "result_to_str" has incompatible type "Result[str, Any]"; expected <nothing>
ex.py:24: error: Argument 1 to "result_to_str" has incompatible type "Result[Any, str]"; expected <nothing>
Found 4 errors in 1 file (checked 1 source file)

PS.: I'm using the returns plugin too

@thepabloaguilar
Copy link
Member

The same thing for Maybe 😢

from classes import typeclass
from returns.maybe import Maybe, Some, Nothing

@typeclass
def maybe_to_str(instance) -> str:
    """This is a typeclass definition to convert Maybe container to str."""

@maybe_to_str.instance(Maybe.success_type)
def _maybe_to_str(instance: Maybe) -> str:
    return str(instance.unwrap())  # will always receive `Maybe` types

@maybe_to_str.instance(Maybe.failure_type)
def _nothing_to_str(instance: Maybe) -> str:
    return str(instance)  # will always receive `Nothing`

if __name__ == '__main__':
    maybe_to_str(Some('test'))
    maybe_to_str(Nothing)

mypy output:

ex.py:10: error: Instance "returns.maybe.Maybe[Any]" does not match inferred type "Type[returns.maybe._Some[Any]]"
ex.py:15: error: Instance "returns.maybe.Maybe[Any]" does not match inferred type "Type[returns.maybe._Nothing]"
ex.py:21: error: Argument 1 to "maybe_to_str" has incompatible type "Maybe[str]"; expected <nothing>
ex.py:22: error: Argument 1 to "maybe_to_str" has incompatible type "Maybe[NoReturn]"; expected <nothing>
Found 4 errors in 1 file (checked 1 source file)

@sobolevn
Copy link
Member Author

sobolevn commented Oct 3, 2021

@thepabloaguilar Will you have the time to debug why this happens?

@thepabloaguilar
Copy link
Member

I can try, it's a problem with classes mypy plugin

@thepabloaguilar
Copy link
Member

How do you develop mypy plugin locally? I want to put some breakpoints 😄

@sobolevn
Copy link
Member Author

sobolevn commented Oct 4, 2021

Try --pdb option for mypy. I don't use debuggers, sorry.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Development

No branches or pull requests

2 participants