Source code for byoc.params.toggle

#!/usr/bin/env python3

from .. import model
from .param import param, UNSPECIFIED
from ..utils import noop
from ..errors import NoValueFound
from more_itertools import partition, first

class Toggle:

    def __init__(self, value):
        self.value = value

def pick_toggled(values):
    bases, toggles = partition(
            lambda x: isinstance(x, Toggle),
            values,
    )

    toggle = first(toggles, Toggle(False))

    try:
        base = first(bases)
    except ValueError:
        raise NoValueFound("can't find base value to toggle", values.log)

    return toggle.value != base

class toggle_param(param):

[docs] def __init__( self, *keys, cast=noop, default=UNSPECIFIED, ignore=UNSPECIFIED, get=lambda obj, x: x, dynamic=False, ): super().__init__( *keys, cast=cast, pick=pick_toggled, default=default, ignore=ignore, get=get, dynamic=dynamic, )
[docs] def _calc_bound_getters(self, obj): bound_getters = super()._calc_bound_getters(obj) for bg in bound_getters: if bg.kwargs.get('toggle', False): bg.cast_funcs.append(Toggle) return bound_getters
[docs] def _get_known_getter_kwargs(self): return super()._get_known_getter_kwargs() | {'toggle'}