fabiommendes/django-bricks

View on GitHub
src/bricks/json/decoders.py

Summary

Maintainability
A
35 mins
Test Coverage
#
# JSON decode: convert JSON structures to Python objects.
#
import datetime

from bricks.json.util import normalize_class_name
from .exceptions import JSONDecodeError

NoneType = type(None)
CLASSNAME_TO_DECODER = {}


#
# Registration and basic APIs
#
def decode(data):
    """
    Decode a JSON-like structure into the corresponding Python data.
    """

    if isinstance(data, dict):
        if '@' in data:
            data_type = data['@']
            try:
                decoder = CLASSNAME_TO_DECODER[data_type]
            except KeyError:
                msg = 'invalid type: {"@": "%s", ...}' % data_type
                raise JSONDecodeError(msg)
            return decoder({k: v for (k, v) in data.items() if k != '@'})
        return {k: decode(v) for k, v in data.items()}
    return data


def register(cls, name=None, func=None):
    """
    Decorator that register decoding functions.
    """

    name = normalize_class_name(cls, name)
    CLASSNAME_TO_DECODER[name] = func


decode.register = register