# Path: django_sonic_screwdriver/iterables.py
# def get_iterable(data):
#     """
#     Returns iterable data.
#     """
#     if isinstance(data, QueryDict):
#         return data.lists()
#     else:
#         return data.items()
# 
# def is_iterable(obj):
#     """
#     Check if obj is iterable.
#     """
#     try:
#         iter(obj)
#     except TypeError:
#         return False
#     else:
#         return True


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()



# Path: django_sonic_screwdriver/iterables.py
# def get_iterable(data):
#     """
#     Returns iterable data.
#     """
#     if isinstance(data, QueryDict):
#         return data.lists()
#     else:
#         return data.items()
# 
# def is_iterable(obj):
#     """
#     Check if obj is iterable.
#     """
#     try:
#         iter(obj)
#     except TypeError:
#         return False
#     else:
#         return True


# Path: django_sonic_screwdriver/helper.py
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):