Special thanks to:
- @orsinium
- @thedrow
- @thepabloaguilar
- and other (code and ideas) contributors
for making this release possible. You are awesome!
Announcement: https://sobolevn.me/2020/06/how-async-should-have-been
Features
-
Breaking: renames mypy plugin from
decorator_plugin
toreturns_plugin
because of a complete rewrite and lots of new features -
Breaking: changes
@safe
,@impure
,impure_safe
,@maybe
semantics:
they do not work withasync
functions anymore;
now you are forced to useFuture
and its helpers
to work withasync
functions -
Breaking: renames
Maybe.new
toMaybe.from_value
.
Because all our other containers support this protocol.
OnlyMaybe
was different, sorry for that! -
Breaking: renames
.from_success()
to.from_value()
,
there's no need in two separate methods -
Breaking: renames
.from_successful_io()
to.from_io()
,
there's no need in two separate methods -
Breaking: renames
.from_successful_context()
to.from_context()
,
there's no need in two separate methods -
Breaking: since we now support
.apply()
method,
there's no more need in*_squash
converters, they are removed -
Breaking: renamed
Instanceable
toApplicative
-
Breaking: changes
.from_io
and.from_failed_io
ofIOResult
to returnAny
instead ofNoReturn
unfilled type -
Breaking: removes
.lift
and.lift_*
methods from all containers,
usemap_
,bind_result
,bind_io
, and other pointfree helpers instead -
Breaking: removes
@pipeline
function. It was a mistake:
it does not work with mixed container types,
it does not type failures properly,
it does not work withIO
andFuture
,
it enforces to write imperative code in a functional codebase.
Useflow
instead -
Adds typed
partial
andcurry
mypy plugins! -
Adds typed
flow
plugin, now it can accept any number of arguments,
it now also has excelent type inference -
Adds typed
pipe
plugin, now it can accept any number of arguments,
it now also has good type inference -
Adds
managed
pipeline function that is useful
for working with stateful computations -
Adds typed
map_
,fix
, andalt
pointfree functions -
Adds typed
bind_result
,bind_io
,bind_ioresult
,
bind_context
,bind_context_result
,bind_future
,
bind_async
, andbind_awaitable
pointfree functions -
Adds typed
bind_async_future
andbind_async_future_result
pointfree functions -
Adds typed
unify
pointfree function -
Adds typed
apply
pointfree function -
Adds typed
value_or
pointfree function -
Adds
pytest
plugin with the ability to tests error handling -
Adds
Future
container to easily work withasync
functions -
Adds
FutureResult
container to easily work
withasync
function that might fail -
Adds
RequiresContextFutureResult
container -
Adds
ReaderFutureResult
alias forRequiresContextFutureResult
-
Adds
RequiresContextFutureResultE
andReaderFutureResultE
aliases -
Adds
Future
,FutureResult
andRequiresContextFutureResult
support for all existing pointfree functions -
Adds
bind_io
method toIOResult
-
Adds
bind_io
method toRequiresContextIOResult
-
Adds
or_else
method toMaybe
-
Adds
.from_io
and.from_failed_io
toRequiresContextIOResult
-
Syncs naming in
from_*
methods, now all parameters are namedinner_value
-
Adds
not_
composition helper -
Adds
flatten
support forFuture
,
FutureResult
andRequiresContextFutureResult
-
Adds
__copy__
and__deepcopy__
magic methods toImmutable
class -
Speeds up
is_successful
function -
Makes all
Context
context helpers abstract,
so you cannot create new instances of this class,
also adds__slots__
to these classes -
Improves
RequiresContext*
types withNoDeps
where it is logically true
Bugfixes
- Fixes that
@safe
decorator was generating incorrect signatures
for functions withAny
- Fixes that
.rescue()
ofRequiresContextResult
was returningAny
- Fixes that
.rescue()
ofRequiresContextIOResult
was returningAny
- Fixes that
RequiresContextResult
andRequiresContextIOResult
were notfinal
- Fixes that
ImmutableStateError
was not a subclass ofAttributeError
- Fixes that
IOResult
was not showingstr
representation
of wrappedinner_value
Misc
- Replaces
pytest-asyncio
withanyio
plugin,
now we test compatibility with any IO stack:asyncio
,trio
,curio
- Updates lots of dependencies
- Adds lots of new tests
- Updates lots of docs
- Removes "IO marker" name from docs in favor for "IO container",
it is not special at all. Why would we call it differently?