Source code for jsonschema_extras.formats.numbers_range
from collections.abc import Sequence
from typing import cast
from jsonschema_extras._util import SEQUENCE_PRIMITIVE_TYPES_DEFAULT
from ._common import FormatCheckingFuncInfo
[docs]
def is_numbers_range(instance: object) -> bool:
"""Tests if an object is a numbers range (a sequence of 2 numbers
in non-descending order).
A numbers range is defined as a sequence containing exactly 2 comparable
numeric elements where the first element is less than or equal
to the second element, forming a valid range [min, max].
Returns:
bool: Whether `instance` is a numbers range: ascending sequence
of 2 numbers.
Examples:
Valid ranges::
>>> is_numbers_range([1, 5])
True
>>> is_numbers_range([3.14, 3.14])
True
>>> is_numbers_range((0, 10))
True
Invalid ranges::
>>> is_numbers_range([5, 1])
False
>>> is_numbers_range([1, 2, 3])
False
>>> is_numbers_range([1])
False
>>> is_numbers_range(5)
False
"""
if not (
isinstance(instance, Sequence)
and (not isinstance(instance, tuple(SEQUENCE_PRIMITIVE_TYPES_DEFAULT)))
and (len(instance) == 2)
):
return False
try:
return cast(bool, (instance[0] <= instance[1]))
except TypeError:
return False
#: Format ``numbers-range`` checked by :func:`is_numbers_range`
is_numbers_range_info = FormatCheckingFuncInfo(
'numbers-range', is_numbers_range, (TypeError,),
)