Source code for typedpy.fields.strings

import re

from typedpy.commons import wrap_val
from typedpy.structures import TypedField, ImmutableField
from .sized import Sized


[docs]class String(TypedField): """ A string value. Accepts input of `str` Arguments: minLength(int): optional minimal length maxLength(int): optional maximal lengthr pattern(str): optional string of a regular expression """ _ty = str def __init__(self, *args, minLength=None, maxLength=None, pattern=None, **kwargs): self.minLength = minLength self.maxLength = maxLength self.pattern = pattern if self.pattern is not None: self._compiled_pattern = re.compile(self.pattern) super().__init__(*args, **kwargs) def _validate(self, value): String._validate_static(self, value) def _validate_static(self, value): def err_prefix(): return f"{self._name}: Got {wrap_val(value)}; " if self._name else "" if not isinstance(value, str): raise TypeError(f"{err_prefix()}Expected a string") if self.maxLength is not None and len(value) > self.maxLength: raise ValueError( f"{err_prefix()}Expected a maximum length of {self.maxLength}" ) if self.minLength is not None and len(value) < self.minLength: raise ValueError( f"{err_prefix()}Expected a minimum length of {self.minLength}" ) if self.pattern is not None and not self._compiled_pattern.match(value): raise ValueError( f"{err_prefix()}Does not match regular expression: {wrap_val(self.pattern)}" ) def __set__(self, instance, value): if getattr(instance, "_trust_supplied_values", False): super().__set__(instance, value) return self._validate(value) super().__set__(instance, value)
class SizedString(String, Sized): pass class ImmutableString(ImmutableField, String): """ An immutable version of :class:`String` """ pass