Skip to content

numbers

Full documentation pages are generated for docstring reference only and may contain symbols imported from other modules. Imported symbols are not distinguished from locally defined symbols and will appear in any module that they are imported into. For better information on where symbols should be imported from, review the sourcecode on the github.

FoSpy.parsing.validators.numbers

_validator_rules

_validator_rules(*args, inherit_from=None)
Source code in FoSpy/_docs/properties/__init__.py
def _validator_rules(*args, inherit_from=None):
    from ..._docs.properties import val_rules
    def decorator(func, a=args, ih=inherit_from):
        inherited = val_rules.get(ih, [])
        a = list(a)
        a.extend(inherited)
        a = tuple(a)

        if len(a) > 0:
            val_rules[func] = a

        return func
    return decorator

any_decimal

any_decimal(label, value_key, require_unit=False)
Source code in FoSpy/parsing/validators/numbers.py
def any_decimal(label, value_key, require_unit=False):
    rules = ["Any decimal value (positive or negative)"]

    @_validator_rules(*rules)
    def func(val, sourceDict=None, **kwargs):
        try:
            value = Decimal(val)
        except Exception as e:
            raise ValueError(f"Unable to convert value: '{val}' into a decimal for '{label}'. Exception:\n{e}")
        return value

    if require_unit:
        rules.append(f"Requires that `{value_key}_unit` also be present")
        @_validator_rules(*rules)
        def unit_func(val, blk_cls=None, sourceDict=None, **kwargs):
            return attach_unit(func(val), value_key, blk_cls, sourceDict)
        return unit_func
    return func

attach_unit

attach_unit(
    value, value_key, blk_cls, sourceDict, **kwargs
)
Source code in FoSpy/parsing/validators/units.py
def attach_unit(value, value_key, blk_cls, sourceDict, **kwargs):
    unit_key = f"{value_key}_unit"
    if unit_key not in sourceDict:
        raise ValueError(f"Could not find required unit for: '{value_key}'")

    unit = sourceDict[unit_key]

    validators = blk_cls.build_validators()
    unit_validator = validators.get(unit_key, Unit)

    unit = unit_validator(unit)

    return FOSQuantity(value, unit)

decimal_range

decimal_range(
    label,
    value_key,
    lower=0,
    upper=1,
    include_lower=False,
    include_upper=True,
    require_unit=False,
)
Source code in FoSpy/parsing/validators/numbers.py
def decimal_range(label, value_key, lower=0, upper=1, include_lower=False, include_upper=True, require_unit=False):
    rules = [
        "Decimal value within range:",
        [f"{lower} <{'=' if include_lower else ''} val <{'=' if include_upper else ''} {upper}"]
    ]

    @_validator_rules(*rules)
    def func(val, sourceDict=None, **kwargs):
        try:
            value = Decimal(val)
        except Exception as e:
            raise ValueError(f"Unable to convert value: '{val}' into a decimal for '{label}'. Exception:\n{e}")
        if any((
            value < lower or value > upper,
            value == lower and not include_lower,
            value == upper and not include_upper
        )):
            raise ValueError(
                f"'{val}' not allowed for '{label}'. Value must be in range: "
                f"{lower}{'<=' if include_lower else '<'}"
                f"val{'<=' if include_upper else '<'}{upper}"
            )
        return value

    if require_unit:
        rules.append(f"Requires that `{value_key}_unit` also be present")
        @_validator_rules(*rules)
        def unit_func(val, blk_cls=None, sourceDict=None, **kwargs):
            return attach_unit(func(val), value_key, blk_cls, sourceDict)
        return unit_func
    return func

positive_decimal

positive_decimal(label, value_key, require_unit=False)
Source code in FoSpy/parsing/validators/numbers.py
def positive_decimal(label, value_key, require_unit=False):

    rules = ["Positive decimal value"]

    @_validator_rules("Positive decimal value")
    def func(val, **kwargs):
        try:
            decimal_val = Decimal(val)
        except Exception as e:
            raise ValueError(f"Unable to convert '{label}: {val}' into a decimal number. Exception:\n{e}")
        if not decimal_val > 0:
            raise ValueError(f"Value for '{label}' must be a positive number.")
        return decimal_val

    if require_unit:
        rules.append(f"Requires that `{value_key}_unit` also be present")
        @_validator_rules(*rules)
        def unit_func(val, blk_cls=None, sourceDict=None, **kwargs):
            return attach_unit(func(val), value_key, blk_cls, sourceDict)
        return unit_func

    func = _validator_rules(*rules)(func)
    return func