Source code for tinychain.scalar.value

""":class:`Value` types such as :class:`Nil`, :class:`Number`, and :class:`String`."""

from ..interface import Compare, Order
from ..json import to_json
from ..scalar.ref import deref, is_literal
from ..uri import URI


from .base import Scalar
from .ref import form_of, Ref


# Scalar value types

[docs]class Value(Scalar, Compare, Order): """A scalar `Value` which supports equality and collation.""" __uri__ = URI(Scalar) + "/value"
[docs] def eq(self, other): if is_literal(self) and is_literal(other): return deref(self) == deref(other) return Scalar.eq(self, other)
[docs] def gt(self, other): from .number import Bool return self._get("gt", other, Bool)
[docs] def gte(self, other): from .number import Bool return self._get("ge", other, Bool)
[docs] def lt(self, other): from .number import Bool return self._get("lt", other, Bool)
[docs] def lte(self, other): from .number import Bool return self._get("le", other, Bool)
[docs]class Nil(Value): """A `Value` to represent `None`.""" __uri__ = URI(Value) + "/none" def __init__(self, form=None): if form is None: Value.__init__(self, {}) else: Value.__init__(self, form) def __json__(self): form = form_of(self) if isinstance(form, (Ref, URI)): return to_json(form) else: return None
[docs]class Bytes(Value): """A binary `Value`""" __uri__ = URI(Value) + "/bytes"
[docs]class EmailAddress(Value): """An email address""" __uri__ = URI(Value) + "/email"
[docs]class Id(Value): """An identifier""" __uri__ = URI(Value) + "/id" def __json__(self): from .ref.functions import form_of form = form_of(self) if isinstance(form, Ref): return to_json(form) else: return {str(self): []} def __str__(self): from .ref.functions import form_of return str(form_of(self))
[docs]class String(Value): """A string.""" __uri__ = URI(Value) + "/string" def render(self, params=None, **kwargs): if kwargs and params is not None: raise ValueError("String.render accepts a Map or kwargs, not both:", params, kwargs) if params: return self._post("render", params, String) else: return self._post("render", kwargs, String)
[docs]class Version(Value): """ A semantic version of the form <major>.<minor>.<rev>, e.g. 1.2.34 See https://semver.org for the full specification. """ __uri__ = URI(Value) + "/version" def __str__(self): if is_literal(self): version = deref(self) if isinstance(version, tuple): return '.'.join(version) else: return str(version) else: return Value.__str__(self)