blob: af384c745682cb30c4707923c092400fb36f067c [file] [log] [blame]
# Copyright 2016 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
#
# This module provides an extended subset of the asyncio.futures.Futures
# interface.
from __future__ import unicode_literals
__all__ = (
'CancelledError',
'ExtendedFuture',
'InvalidStateError',
)
from portage.util.futures.futures import (Future, InvalidStateError,
CancelledError)
# Create our one time settable unset constant
UNSET_CONST = Future()
UNSET_CONST.set_result(object())
class ExtendedFuture(Future):
'''Extended Future class adding convienince get and set operations with
default result capabilities for unset result(). It also adds pass
capability for duplicate set_result() calls.
'''
def __init__(self, default_result=UNSET_CONST.result()):
'''Class init
@param default_result: Optional data type/value to return in the event
of a result() call when result has not yet been
set.
'''
self.default_result = default_result
super(ExtendedFuture, self).__init__()
self.set = self.set_result
def set_result(self, data, ignore_InvalidState=False):
'''Set the Future's result to the data, optionally don't raise
an error for 'InvalidStateError' errors
@param ignore_exception: Boolean
'''
if ignore_InvalidState:
try:
super(ExtendedFuture, self).set_result(data)
except InvalidStateError:
pass
else:
super(ExtendedFuture, self).set_result(data)
def get(self, default=UNSET_CONST.result()):
'''Convienience function to wrap result() but adds an optional
default value to return rather than raise an InvalidStateError
@param default: Optional override for the classwide default_result
@returns: the result data or the default value, raisies an exception
if result is unset and no default is defined.
'''
if default is not UNSET_CONST.result():
pass
elif self.default_result is not UNSET_CONST.result():
default = self.default_result
if default is not UNSET_CONST.result():
try:
data = super(ExtendedFuture, self).result()
except InvalidStateError:
data = default
else:
data = super(ExtendedFuture, self).result()
return data