Skip to content

SOURCE CODE diot.transforms DOCS

"""Key transforms for diot

@Attribute:
    TRANSFORMS: Builtin transforms
"""
from typing import Dict, Callable
import re
import keyword
import inflection


def safe_transform(item: str) -> str:DOCS
    """Transform an arbitrary key into a safe key for dot notation

    Examples:
        >>> safe_transform("a,b")   # a_b
        >>> safe_transform("a_,_b") # a__b
        >>> safe_transform("in")    # _in

    Args:
        item: The item to be transformed

    Returns:
        The safely-transformed item
    """
    # // support bytes transform to keys in bytes?
    if isinstance(item, bytes):
        item = item.decode("utf-8")
    item = str(item)
    item = re.sub(r'[^A-Za-z0-9_]+', '.', item)
    item = re.sub(r'_?\.+|\.+_?', '_', item)
    if not item:
        return ''
    return ('_' + item
            if item[0] in '0123456789' or item in keyword.kwlist
            else item)


def camel_case(item: str) -> str:DOCS
    """Transform item to camel case format

    The item will be first safely-transformed.

    Examples:
        >>> camel_case('one_two')   # oneTwo
        >>> camel_case('_one')      # _one
        >>> camel_case('o_one')     # oOne

    Args:
        item: The item to be transformed

    Returns:
        The camel_case-transformed item
    """
    item = safe_transform(item)
    return inflection.camelize(item, False)


def snake_case(item: str) -> str:DOCS
    """Transform item to snake case

    The item will be first safely-transformed.

    Examples:
        >>> snake_case('oneTwo')   # one_two
        >>> snake_case('One')      # one
        >>> snake_case('1One')     # _1_one

    Args:
        item: The item to be transformed

    Returns:
        The snake_case-transformed item
    """
    item = safe_transform(item)
    return inflection.underscore(item)


def upper_case(item: str) -> str:DOCS
    """Transform item to upper case

    The item will be first safely-transformed.

    Examples:
        >>> upper_case('oneTwo')   # ONETWO
        >>> upper_case('One')      # ONE
        >>> upper_case('1One')     # _1ONE

    Args:
        item: The item to be transformed

    Returns:
        The uppercase-transformed item
    """
    item = safe_transform(item)
    return item.upper()


def lower_case(item: str) -> str:DOCS
    """Transform item to lower case

    The item will be first safely-transformed.

    Examples:
        >>> lower_case('ONETWO')   # onetwo
        >>> lower_case('One')      # one
        >>> lower_case('1One')     # _1one

    Args:
        item: The item to be transformed

    Returns:
        The lowercase-transformed item
    """
    item = safe_transform(item)
    return item.lower()


TRANSFORMS: Dict[str, Callable[[str], str]] = dict(
    safe=safe_transform,
    safe_transform=safe_transform,
    camel_case=camel_case,
    camelCase=camel_case,
    snake_case=snake_case,
    upper=upper_case,
    lower=lower_case,
    upper_case=upper_case,
    lower_case=lower_case,
    uppercase=upper_case,
    lowercase=lower_case,
    UPPERCASE=upper_case,
    UPPER_CASE=upper_case,
)