Source code for PyR3.factory.fields.Number

# -*- coding: utf-8 -*-
from __future__ import annotations

from typing import Any

from .Field import Field


[docs]class Boolean(Field): _true_values = { "true", "yes", "y", "t", "1", } _false_values = ["false", "no", "n", "f", "0"]
[docs] def clean_value(self, value: Any = None) -> Any: if isinstance(value, str): value = value.lower() if value in self._true_values: return True elif value in self._false_values: return False else: raise ValueError( f"Can't determine logical value of '{value}'." ) if isinstance(value, (bool, int, float)): return value != 0 else: return bool(value)
[docs]class Integer(Field): def __init__( self, *, default: int = None, value_range: range = None, not_null: bool = False, ) -> None: self.value_range = value_range self.not_null = not_null if default is not None: self.default = self.clean_value(default)
[docs] def clean_value(self, value): parsed_int = int(value) self.check_if_in_range(parsed_int) return parsed_int
[docs] def check_if_in_range(self, parsed_int): if self.value_range is not None: if parsed_int not in self.value_range: raise ValueError( f"Value {parsed_int} out of desired value range in {self._trace_location()}." ) if self.not_null: if parsed_int == 0: raise ValueError("Value can't be null.")
[docs]class Float(Field): def __init__( self, *, default: float = None, min: float = None, max: float = None, not_null: bool = False, ) -> None: self.min = min self.max = max self.not_null = not_null if default is not None: self.default = self.clean_value(default)
[docs] def clean_value(self, value): parsed_float = float(value) self.check_if_in_range(parsed_float) return parsed_float
[docs] def check_if_in_range(self, parsed_float): if self.min is not None: if not (self.min <= parsed_float): raise ValueError( f"Value {parsed_float} below expected range. (min: {self.min}) in {self._trace_location()}" ) if self.max is not None: if not (parsed_float <= self.max): raise ValueError( f"Value {parsed_float} above expected range. (max: {self.max}) in {self._trace_location()}" ) if self.not_null: if parsed_float == 0: raise ValueError("Value can't be null.")