Source code for paramdict.paramDictProperties

from .localization import l10n
_ = l10n.gettext

from typing import get_type_hints, Callable, List

from enum import Enum

from .paramDictHandler import baseParamDict

from .colorOutput import outGreen, outRed, outYellow

__all__ = ['pSimple', 'pSimpleOpt', 'pStrict', 'pStrictOpt',
           'UNSET', 'SET',
           'pList', 'pListOpt',
           'pPd', 'pPdOpt', 'pPdList', 'pPdListOpt',
           'pEnm', 'pEnmOpt', 'pEnmList', 'pEnmListOpt']

class ValueStatus(Enum):
    UNSET = 0
    SET = 1

UNSET = ValueStatus.UNSET
'Specific representation of an unset value.'

SET = ValueStatus.SET
'Specific representation of a value that has been set.'

class pdprop(object):

    def __set_name__(self, owner, name):
        self._status_name = '_status_' + name

    def __init__(self, func):
        self.fget = func

[docs] class pSimple(pdprop): 'Simple property. No type checking. Must be set before getting.' def __get__(self, instance:baseParamDict, owner): value = instance._cont.get(self.fget.__name__, UNSET) if value is UNSET: raise AttributeError(_('Property %s not set.') % outYellow('\''+self.fget.__name__+'\'')) return value def __set__(self, instance:baseParamDict, value): aType:type = get_type_hints(self.fget)['return'] instance._cont[self.fget.__name__] = aType(value)
[docs] class pSimpleOpt(pdprop): 'Simple property. No type checking. Optional.' def __get__(self, instance:baseParamDict, owner): return instance._cont.get(self.fget.__name__, UNSET) def __set__(self, instance:baseParamDict, value): aType:type = get_type_hints(self.fget)['return'] instance._cont[self.fget.__name__] = aType(value) def __delete__(self, instance:baseParamDict): instance._cont.pop(self.fget.__name__, None)
# def pSimple(opt=False): # if opt: # return _pSimpleOpt # else: # return _pSimple
[docs] class pStrict(pdprop): 'Strict property. Type checking enforced. Must be set before getting.' def __get__(self, instance:baseParamDict, owner): value = instance._cont.get(self.fget.__name__, UNSET) if value is UNSET: raise AttributeError(_('Property %s not set.') % outYellow('\''+self.fget.__name__+'\'')) return value def __set__(self, instance:baseParamDict, value): aType:type = get_type_hints(self.fget)['return'] if not isinstance(value, aType): raise TypeError(_('Property %s must be of type %s.') % (outYellow('\''+self.fget.__name__+'\''), outGreen(aType))) instance._cont[self.fget.__name__] = value
[docs] class pStrictOpt(pdprop): 'Strict property. Type checking enforced. Optional.' def __get__(self, instance:baseParamDict, owner): return instance._cont.get(self.fget.__name__, UNSET) def __set__(self, instance:baseParamDict, value): aType:type = get_type_hints(self.fget)['return'] if not isinstance(value, aType): raise TypeError(_('Property %s must be of type %s.') % (outYellow('\''+self.fget.__name__+'\''), outGreen(aType))) instance._cont[self.fget.__name__] = value def __delete__(self, instance:baseParamDict): instance._cont.pop(self.fget.__name__, None)
[docs] class pList(pdprop): 'List property. Type checking enforced. Must be set before getting.' def __get__(self, instance:baseParamDict, owner): value = instance._cont.get(self.fget.__name__, UNSET) if value is UNSET: raise AttributeError(_('Property %s not set.') % outYellow('\''+self.fget.__name__+'\'')) return value def __set__(self, instance:baseParamDict, value): aType:type = get_type_hints(self.fget)['return'].__args__[0] if not isinstance(value, list): raise TypeError(_('Property %s must be of type %s.') % (outYellow('\''+self.fget.__name__+'\''), outGreen(List[aType]))) for item in value: if not isinstance(item, aType): raise TypeError(_('Property %s must be of type %s.') % (outYellow('\''+self.fget.__name__+'\''), outGreen(List[aType]))) instance._cont[self.fget.__name__] = value
[docs] class pListOpt(pdprop): 'List property. Type checking enforced. Optional.' def __get__(self, instance:baseParamDict, owner): return instance._cont.get(self.fget.__name__, UNSET) def __set__(self, instance:baseParamDict, value): aType:type = get_type_hints(self.fget)['return'].__args__[0] if not isinstance(value, list): raise TypeError(_('Property %s must be of type %s.') % (outYellow('\''+self.fget.__name__+'\''), outGreen(List[aType]))) for item in value: if not isinstance(item, aType): raise TypeError(_('Property %s must be of type %s.') % (outYellow('\''+self.fget.__name__+'\''), outGreen(List[aType]))) instance._cont[self.fget.__name__] = value def __delete__(self, instance:baseParamDict): instance._cont.pop(self.fget.__name__, None)
[docs] class pPd(pdprop): 'ParamDict property. Type checking enforced. Must be set before getting.' def __get__(self, instance:baseParamDict, owner): value = instance._cont.get(self.fget.__name__, UNSET) if value is UNSET: raise AttributeError(_('Property %s not set.') % outYellow('\''+self.fget.__name__+'\'')) aType:type = get_type_hints(self.fget)['return'] return aType(source=instance._cont[self.fget.__name__]) def __set__(self, instance:baseParamDict, value:baseParamDict): aType:type = get_type_hints(self.fget)['return'] if not isinstance(value, aType): raise TypeError(_('Property %s must be of type %s.') % (outYellow('\''+self.fget.__name__+'\''), outGreen(aType))) instance._cont[self.fget.__name__] = value.content
[docs] class pPdOpt(pdprop): 'ParamDict property. Type checking enforced. Optional.' def __get__(self, instance:baseParamDict, owner): value = instance._cont.get(self.fget.__name__, UNSET) if value is UNSET: return UNSET aType:type = get_type_hints(self.fget)['return'] return aType(source=value) def __set__(self, instance:baseParamDict, value:baseParamDict): aType:type = get_type_hints(self.fget)['return'] if not isinstance(value, aType): raise TypeError(_('Property %s must be of type %s.') % (outYellow('\''+self.fget.__name__+'\''), outGreen(aType))) instance._cont[self.fget.__name__] = value.content def __delete__(self, instance:baseParamDict): instance._cont.pop(self.fget.__name__, None)
[docs] class pPdList(pdprop): 'ParamDict List property. Type checking enforced. Must be set before getting.' def __get__(self, instance:baseParamDict, owner): value = instance._cont.get(self.fget.__name__, UNSET) if value is UNSET: raise AttributeError(_('Property %s not set.') % outYellow('\''+self.fget.__name__+'\'')) aType:type = get_type_hints(self.fget)['return'].__args__[0] return [aType(source=item) for item in value] def __set__(self, instance:baseParamDict, value:'list[baseParamDict]'): aType:type = get_type_hints(self.fget)['return'].__args__[0] for item in value: if not isinstance(item, aType): raise TypeError(_('Property %s must be of type %s.') % (outYellow('\''+self.fget.__name__+'\''), outGreen(List[aType]))) instance._cont[self.fget.__name__] = [item.content for item in value]
[docs] class pPdListOpt(pdprop): 'ParamDict List property. Type checking enforced. Optional.' def __get__(self, instance:baseParamDict, owner): value = instance._cont.get(self.fget.__name__, UNSET) if value is UNSET: return UNSET aType:type = get_type_hints(self.fget)['return'].__args__[0] return [aType(source=item) for item in value] def __set__(self, instance:baseParamDict, value:'list[baseParamDict]'): aType:type = get_type_hints(self.fget)['return'].__args__[0] for item in value: if not isinstance(item, aType): raise TypeError(_('Property %s must be of type %s.') % (outYellow('\''+self.fget.__name__+'\''), outGreen(List[aType]))) instance._cont[self.fget.__name__] = [item.content for item in value] def __delete__(self, instance:baseParamDict): instance._cont.pop(self.fget.__name__, None)
[docs] class pEnm(pdprop): 'Enum property. Type checking enforced. Must be set before getting.' def __get__(self, instance:baseParamDict, owner): value = instance._cont.get(self.fget.__name__, UNSET) if value is UNSET: raise AttributeError(_('Property %s not set.') % outYellow('\''+self.fget.__name__+'\'')) aType:type = get_type_hints(self.fget)['return'] return aType(value) def __set__(self, instance:baseParamDict, value:Enum): aType:type = get_type_hints(self.fget)['return'] if not isinstance(value, aType): raise TypeError(_('Property %s must be of type %s.') % (outYellow('\''+self.fget.__name__+'\''), outGreen(aType))) instance._cont[self.fget.__name__] = value.value
[docs] class pEnmOpt(pdprop): 'Enum property. Type checking enforced. Optional.' def __get__(self, instance:baseParamDict, owner): value = instance._cont.get(self.fget.__name__, UNSET) if value is UNSET: return UNSET aType:type = get_type_hints(self.fget)['return'] return aType(value) def __set__(self, instance:baseParamDict, value:Enum): aType:type = get_type_hints(self.fget)['return'] if not isinstance(value, aType): raise TypeError(_('Property %s must be of type %s.') % (outYellow('\''+self.fget.__name__+'\''), outGreen(aType))) instance._cont[self.fget.__name__] = value.value def __delete__(self, instance:baseParamDict): instance._cont.pop(self.fget.__name__, None)
[docs] class pEnmList(pdprop): 'Enum List property. Type checking enforced. Must be set before getting.' def __get__(self, instance:baseParamDict, owner): value = instance._cont.get(self.fget.__name__, UNSET) if value is UNSET: raise AttributeError(_('Property %s not set.') % outYellow('\''+self.fget.__name__+'\'')) aType:type = get_type_hints(self.fget)['return'].__args__[0] return [aType(item) for item in value] def __set__(self, instance:baseParamDict, value:'list[Enum]'): aType:type = get_type_hints(self.fget)['return'].__args__[0] for item in value: if not isinstance(item, aType): raise TypeError(_('Property %s must be of type %s.') % (outYellow('\''+self.fget.__name__+'\''), outGreen(List[aType]))) instance._cont[self.fget.__name__] = [item.value for item in value]
[docs] class pEnmListOpt(pdprop): 'Enum List property. Type checking enforced. Optional.' def __get__(self, instance:baseParamDict, owner): value = instance._cont.get(self.fget.__name__, UNSET) if value is UNSET: return UNSET aType:type = get_type_hints(self.fget)['return'].__args__[0] return [aType(item) for item in value] def __set__(self, instance:baseParamDict, value:'list[Enum]'): aType:type = get_type_hints(self.fget)['return'].__args__[0] for item in value: if not isinstance(item, aType): raise TypeError(_('Property %s must be of type %s.') % (outYellow('\''+self.fget.__name__+'\''), outGreen(List[aType]))) instance._cont[self.fget.__name__] = [item.value for item in value] def __delete__(self, instance:baseParamDict): instance._cont.pop(self.fget.__name__, None)