rhazdon/django-sonic-screwdriver

View on GitHub
django_sonic_screwdriver/helper.py

Summary

Maintainability
A
3 hrs
Test Coverage
import collections
import re

from django.core.files import File
from django.http import QueryDict
from django.utils.encoding import force_text
from django.utils.functional import Promise

from .iterables import get_iterable, is_iterable

camelize_re = re.compile(r"[a-z0-9]?_[a-z0-9]")


def camel_to_underscore(name):
    underscore_re = re.compile(r"([a-z]|[0-9]+[a-z]?|[A-Z]?)([A-Z])")
    return underscore_re.sub(r"\1_\2", name).lower()


def underscore_to_camel(match):
    """
    Cast sample_data to sampleData.
    """
    group = match.group()
    if len(group) == 3:
        return group[0] + group[2].upper()
    else:
        return group[1].upper()


def camelize(data):
    # Handle lazy translated strings.
    if isinstance(data, Promise):
        data = force_text(data)
    if isinstance(data, dict):
        new_dict = collections.OrderedDict()
        for key, value in data.items():
            if isinstance(key, Promise):
                key = force_text(key)
            if isinstance(key, str) and "_" in key and key[0] != "_":
                new_key = re.sub(camelize_re, underscore_to_camel, key)
            else:
                new_key = key
            new_dict[new_key] = camelize(value)
        return new_dict
    if is_iterable(data) and not isinstance(data, str):
        return [camelize(item) for item in data]
    return data


def underscoreize(data):
    """
    Underscoring data.
    """
    if isinstance(data, dict):
        new_dict = {}
        for key, value in get_iterable(data):
            if isinstance(key, str):
                new_key = camel_to_underscore(key)
            else:
                new_key = key
            new_dict[new_key] = underscoreize(value)

        if isinstance(data, QueryDict):
            new_query = QueryDict(mutable=True)
            for key, value in new_dict.items():
                new_query.setlist(key, value)
            return new_query
        return new_dict
    if is_iterable(data) and not isinstance(data, (str, File)):
        return [underscoreize(item) for item in data]

    return data


def cast_ordered_dict_to_dict(ordered_dict):
    """
    This helper functions casts an OrderedDict recursively into a dict.

    :param ordered_dict:
    :return:
    """
    if not isinstance(ordered_dict, collections.OrderedDict):
        raise ValueError("Parameter `ordered_dict` is not an instance of OrderedDict.")

    for key, value in ordered_dict.items():
        if isinstance(value, collections.OrderedDict):
            ordered_dict[key] = cast_ordered_dict_to_dict(value)
    return dict(ordered_dict)


def parse_secret_from_authentication_url(url):
    """
    This helper will parse the secret part of a totp url like
    otpauth://totp/alice%07c%40apothekia.de?secret=M3FAFWGD2QA5JJPCPWEOKALPBROHXOL3&algorithm=SHA1&digits=6&period=30
    """
    return url.split("secret")[1][1:33]