def attr_triple(value): """ Check that interprets the value as `urwid.AttrSpec` triple for the colour modes 1,16 and 256. It assumes a <6 tuple of attribute strings for mono foreground, mono background, 16c fg, 16c bg, 256 fg and 256 bg respectively. If any of these are missing, we downgrade to the next lower available pair, defaulting to 'default'. :raises: VdtValueTooLongError, VdtTypeError :rtype: triple of `urwid.AttrSpec` """ keys = ['dfg', 'dbg', '1fg', '1bg', '16fg', '16bg', '256fg', '256bg'] acc = {} if not isinstance(value, (list, tuple)): value = value, if len(value) > 6: raise VdtValueTooLongError(value) # ensure we have exactly 6 attribute strings attrstrings = (value + (6 - len(value)) * [None])[:6] # add fallbacks for the empty list attrstrings = (2 * ['default']) + attrstrings for i, value in enumerate(attrstrings): if value: acc[keys[i]] = value else: acc[keys[i]] = acc[keys[i - 2]] try: mono = AttrSpec(acc['1fg'], acc['1bg'], 1) normal = AttrSpec(acc['16fg'], acc['16bg'], 16) high = AttrSpec(acc['256fg'], acc['256bg'], 256) except AttrSpecError as e: raise ValidateError(str(e)) return mono, normal, high
def limit_option(value, min=0, max=None, warn_default=0, alert_default=0): valid_options = ['WARN', 'ALERT'] # Check min/max parameters if min is not None: try: min = int(min) except ValueError: raise VdtParamError('min', min) if max is not None: try: max = int(max) except ValueError: raise VdtParamError('max', max) # Check value is a list if not isinstance(value, list): raise VdtTypeError(value) # Check for too many or too few values if len(value) > len(valid_options): raise VdtValueTooLongError(value) # elif len(value) < 1: # raise VdtValueTooShortError(value) returnDict = {'WARN': warn_default, 'ALERT': alert_default} valueDict = {} for entry in value: # Check list value is a string try: entry = str(entry) except ValueError: raise VdtValueError(entry) optionParts = entry.split(':', 1) limitType = optionParts[0].strip().upper() limitVal = optionParts[1] if limitType not in valid_options: raise VdtValueError(limitType) try: limitVal = int(limitVal) except ValueError: raise VdtTypeError(limitVal) # Check limits values fall in range if max is not None and limitVal > max: raise VdtValueTooBigError(limitVal) elif min is not None and limitVal < min: raise VdtValueTooSmallError(limitVal) # Check duplicate if limitType in valueDict: raise VdtValueError(value) valueDict[limitType] = limitVal returnDict.update(valueDict) # print returnDict return ','.join( ['%s: %s' % (key, value) for (key, value) in returnDict.items()])
def _is_dict(self, value, min=None, max=None): """ Validation function for dict values. Reference: https://github.com/DiffSK/configobj/blob/master/src/configobj/validate.py """ # Get boundary values (min_val, max_val) = _is_num_param(('min', 'max'), (min, max)) # Check if value is string if isinstance(value, str): # Convert string value try: value = ast.literal_eval(value) except ValueError: if value == 'dict()' or value == 'dict': value = dict() else: raise ValidateError( 'A value "{}" could not be converted to a dict!'. format(value)) except Exception as e: raise e # Validate whether the value is a dict if not isinstance(value, dict): raise ValidateError( 'A value of type {} was passed when a dict was expected!'. format(type(value))) elif isinstance(value, dict): pass else: raise VdtTypeError(value) # Validate whether the value is within the boundaries if (min_val is not None) and (len(value) < min_val): raise VdtValueTooShortError(value) if (max_val is not None) and (len(value) > max_val): raise VdtValueTooLongError(value) return value
def option_list(value, options=None, min=None, max=None): if options and not isinstance(options, list): raise VdtParamError('options', options) if min is not None: try: min = int(min) except ValueError: raise VdtParamError('min', min) if max is not None: try: max = int(max) except ValueError: raise VdtParamError('max', max) if min < 0: raise VdtParamError('min', min) if max < min: raise VdtParamError('max', max) if isinstance(value, str): strVal = value.strip() value = [] if strVal: value = [strVal] if not isinstance(value, list): raise VdtTypeError(value) if max and len(value) > max: raise VdtValueTooLongError(value) elif min and len(value) < min: raise VdtValueTooShortError(value) if not options: return value for entry in value: if entry not in options: raise VdtValueError(value) return value
def sample_option(value, samples_default=1, interval_default=1): valid_options = ['SAMPLES', 'INTERVAL'] # Check samples_default and interval_default parameters try: samples_default = int(samples_default) except ValueError: raise VdtParamError('samples_default', samples_default) if samples_default < 1: raise VdtParamError('samples_default', samples_default) try: interval_default = int(interval_default) except ValueError: raise VdtParamError('interval_default', interval_default) if interval_default < 1: raise VdtParamError('interval_default', interval_default) returnDict = {'SAMPLES': samples_default, 'INTERVAL': interval_default} if value and not isinstance(value, list): raise VdtTypeError(value) if value is None or len(value) == 0: return returnDict if len(value) > len(valid_options): raise VdtValueTooLongError(value) updateDict = {} for entry in value: try: entry = str(entry) except ValueError: raise VdtValueError(entry) optionParts = entry.split(':', 1) if len(optionParts) != 2: raise VdtValueError(entry) limitType = optionParts[0].strip().upper() limitVal = optionParts[1] if limitType not in valid_options: raise VdtValueError(limitType) try: limitVal = int(limitVal) except ValueError: raise VdtTypeError(limitVal) if limitVal < 1: raise VdtValueTooSmallError(limitVal) if limitType in updateDict: raise VdtValueError(value) updateDict[limitType] = limitVal returnDict.update(updateDict) return ','.join( ['%s: %s' % (key, value) for (key, value) in returnDict.items()])