#!/usr/bin/env python3
#
#   Copyright 2016 - The Android Open Source Project
#
#   Licensed under the Apache License, Version 2.0 (the "License");
#   you may not use this file except in compliance with the License.
#   You may obtain a copy of the License at
#
#       http://www.apache.org/licenses/LICENSE-2.0
#
#   Unless required by applicable law or agreed to in writing, software
#   distributed under the License is distributed on an "AS IS" BASIS,
#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#   See the License for the specific language governing permissions and
#   limitations under the License.


class DictObject(dict):
    """Optional convenient base type for creating simple objects that are
    naturally serializable.

    A DictObject provides object-oriented access semantics to a dictionary,
    allowing it to look like a class with defined members. By ensuring that
    all of the class members are serializable, the object can be serialized
    as a dictionary/de-serialized from a dictionary.
    """

    def __init__(self, *args, **kwargs):
        """Constructor for a dictionary-as-object representation of kwargs

        Args:
            args: Currently unused - included for completeness
            kwargs: keyword arguments used to construct the underlying dict

        Returns:
            Instance of DictObject
        """
        super(DictObject, self).update(**kwargs)

    def __getattr__(self, name):
        """Returns a key from the superclass dictionary as an attribute

        Args:
            name: name of the pseudo class attribute

        Returns:
            Dictionary item stored at "name"

        Raises:
            AttributeError if the item is not found
        """
        try:
            return self[name]
        except KeyError as ke:
            raise AttributeError(ke)

    def __setattr__(self, name, value):
        """Updates the value of a key=name to a given value

        Args:
            name: name of the pseudo class attribute
            value: value of the key

        Raises:
            AttributeError if the item is not found
        """
        if name in super(DictObject, self).keys():
            super(DictObject, self).__setitem__(name, value)
        else:
            raise AttributeError("Class does not have attribute {}"
                                 .format(value))

    @classmethod
    def from_dict(cls, dictionary):
        """Factory method for constructing a DictObject from a dictionary

        Args:
            dictionary: Dictionary used to construct the DictObject

        Returns:
            Instance of DictObject
        """
        c = cls()
        c.update(dictionary)
        return c
