1from flex.exceptions import ValidationError 2from flex.error_messages import MESSAGES 3from flex.constants import ( 4 INTEGER, 5 NUMBER, 6 EMPTY, 7 BOOLEAN 8) 9from flex.utils import ( 10 pluralize, 11) 12from flex.validation.common import ( 13 generate_object_validator, 14) 15from flex.decorators import ( 16 pull_keys_from_obj, 17 suffix_reserved_words, 18 skip_if_any_kwargs_empty, 19) 20 21 22@pull_keys_from_obj('minimum', 'maximum') 23def validate_maximum_is_gte_minimum(minimum, maximum, **kwargs): 24 if minimum is EMPTY or maximum is EMPTY: 25 return 26 if not maximum >= minimum: 27 raise ValidationError(MESSAGES['maximum']['must_be_greater_than_minimum']) 28 29 30@pull_keys_from_obj('maximum', 'exclusiveMaximum') 31def validate_maximum_required_if_exclusive_maximum_set(maximum, exclusiveMaximum, **kwargs): 32 if exclusiveMaximum is EMPTY: 33 return 34 if exclusiveMaximum is True and maximum is EMPTY: 35 raise ValidationError( 36 MESSAGES['maximum']['exclusive_maximum_required_maximum'], 37 ) 38 39 40@pull_keys_from_obj('type', 'maximum') 41@suffix_reserved_words 42@skip_if_any_kwargs_empty('type_', 'maximum') 43def validate_type_for_maximum(type_, maximum, **kwargs): 44 types = pluralize(type_) 45 46 if not set(types).intersection((INTEGER, NUMBER)): 47 raise ValidationError( 48 MESSAGES['type']['invalid_type_for_maximum'], 49 ) 50 51 52maximum_schema = { 53 'type': NUMBER, 54} 55maximum_validator = generate_object_validator( 56 schema=maximum_schema, 57) 58 59exclusive_maximum_schema = { 60 'type': BOOLEAN, 61} 62exclusive_maximum_validator = generate_object_validator( 63 schema=exclusive_maximum_schema, 64) 65