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