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
|