1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
|
"""General utility functions."""
import re
import unicodedata
from functools import lru_cache
from typing import Optional
__all__ = (
"check_email",
"slugify",
)
def check_email(email: str) -> str:
"""Validate an email.
Very simple email validation.
Args:
email (str): The email to validate.
Raises:
ValueError: If the email is invalid.
Returns:
str: The validated email.
"""
if "@" not in email:
msg = "Invalid email!"
raise ValueError(msg)
return email.lower()
def slugify(value: str, allow_unicode: bool = False, separator: Optional[str] = None) -> str:
"""Slugify.
Convert to ASCII if ``allow_unicode`` is ``False``. Convert spaces or repeated
dashes to single dashes. Remove characters that aren't alphanumerics,
underscores, or hyphens. Convert to lowercase. Also strip leading and
trailing whitespace, dashes, and underscores.
Args:
value (str): the string to slugify
allow_unicode (bool, optional): allow unicode characters in slug. Defaults to False.
separator (str, optional): by default a `-` is used to delimit word boundaries.
Set this to configure something different.
Returns:
str: a slugified string of the value parameter
"""
if allow_unicode:
value = unicodedata.normalize("NFKC", value)
else:
value = unicodedata.normalize("NFKD", value).encode("ascii", "ignore").decode("ascii")
value = re.sub(r"[^\w\s-]", "", value.lower())
if separator is not None:
return re.sub(r"[-\s]+", "-", value).strip("-_").replace("-", separator)
return re.sub(r"[-\s]+", "-", value).strip("-_")
@lru_cache(maxsize=100)
def camelize(string: str) -> str:
"""Convert a string to camel case.
Args:
string (str): The string to convert.
Returns:
str: The converted string.
"""
return "".join(word if index == 0 else word.capitalize() for index, word in enumerate(string.split("_")))
|