# Path: marvin_python_toolbox/_compatibility.py

# 
# Path: marvin_python_toolbox/_logging.py
# def get_logger(name, namespace='marvin_python_toolbox',
#                log_level=DEFAULT_LOG_LEVEL, log_dir=DEFAULT_LOG_DIR):
#     """Build a logger that outputs to a file and to the console,"""
# 
#     log_level = (os.getenv('{}_LOG_LEVEL'.format(namespace.upper())) or
#                  os.getenv('LOG_LEVEL', log_level))
#     log_dir = (os.getenv('{}_LOG_DIR'.format(namespace.upper())) or
#                os.getenv('LOG_DIR', log_dir))
# 
#     logger = logging.getLogger('{}.{}'.format(namespace, name))
#     logger.setLevel(log_level)
# 
#     formatter = logging.Formatter(
#         '%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# 
#     # Create a console stream handler
#     console_handler = logging.StreamHandler()
#     console_handler.setLevel(log_level)
#     console_handler.setFormatter(formatter)
#     logger.addHandler(console_handler)
# 
#     try:
#         log_path = os.path.abspath(log_dir)
#         log_filename = '{name}.{pid}.log'.format(
#             name=namespace, pid=os.getpid())
# 
#         file_path = str(os.path.join(log_path, log_filename))
# 
#         if not os.path.exists(log_path):  # pragma: no cover
#             os.makedirs(log_path, mode=774)
# 
#         # Create a file handler
#         file_handler = logging.FileHandler(file_path)
#         file_handler.setLevel(log_level)
#         file_handler.setFormatter(formatter)
#         logger.addHandler(file_handler)
#     except OSError as e:
#         logger.error('Could not create log file {file}: {error}'.format(
#             file=file_path, error=e.strerror))
# 
#     return logger
# 
# Path: marvin_python_toolbox/common/exceptions.py
# class InvalidConfigException(ConfigException):
#     """
#     Invalid Marvin Config Base Exception
#     """
# 
# Path: marvin_python_toolbox/common/utils.py
# def from_json(json_str):
#     return simplejson.loads(json_str, object_hook=_from_json_object_hook)


import os
from configparser import ConfigParser, NoSectionError
from configobj import ConfigObj
from .._compatibility import six
from .._logging import get_logger
from .exceptions import InvalidConfigException
from .utils import from_json
    @classmethod
    def _load(cls, section=None):
        section = section or cls._default_sect
        cls._conf[section] = load_conf_from_file(section=section)

    @classmethod
    def get(cls, key, section=None, **kwargs):
        """
        Retrieves a config value from dict.
        If not found twrows an InvalidScanbooconfigException.
        """
        section = section or cls._default_sect
        if section not in cls._conf:
            cls._load(section=section)

        value = cls._conf[section].get(key)

        # if not found in context read default
        if not value and section != cls._default_sect:
            value = cls._conf[cls._default_sect].get(key) if cls._default_sect in cls._conf else None

        if value is None:
            if 'default' in kwargs:  # behave as {}.get(x, default='fallback')
                _def_value = kwargs['default']
                logger.warn("Static configuration [{}] was not found. Using the default value [{}].".format(key, _def_value))
                return _def_value
            else:
                raise InvalidConfigException(u'Not found entry: {}'.format(key))

        try:

# Path: marvin_python_toolbox/_compatibility.py

# 
# Path: marvin_python_toolbox/_logging.py
# def get_logger(name, namespace='marvin_python_toolbox',
#                log_level=DEFAULT_LOG_LEVEL, log_dir=DEFAULT_LOG_DIR):
#     """Build a logger that outputs to a file and to the console,"""
# 
#     log_level = (os.getenv('{}_LOG_LEVEL'.format(namespace.upper())) or
#                  os.getenv('LOG_LEVEL', log_level))
#     log_dir = (os.getenv('{}_LOG_DIR'.format(namespace.upper())) or
#                os.getenv('LOG_DIR', log_dir))
# 
#     logger = logging.getLogger('{}.{}'.format(namespace, name))
#     logger.setLevel(log_level)
# 
#     formatter = logging.Formatter(
#         '%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# 
#     # Create a console stream handler
#     console_handler = logging.StreamHandler()
#     console_handler.setLevel(log_level)
#     console_handler.setFormatter(formatter)
#     logger.addHandler(console_handler)
# 
#     try:
#         log_path = os.path.abspath(log_dir)
#         log_filename = '{name}.{pid}.log'.format(
#             name=namespace, pid=os.getpid())
# 
#         file_path = str(os.path.join(log_path, log_filename))
# 
#         if not os.path.exists(log_path):  # pragma: no cover
#             os.makedirs(log_path, mode=774)
# 
#         # Create a file handler
#         file_handler = logging.FileHandler(file_path)
#         file_handler.setLevel(log_level)
#         file_handler.setFormatter(formatter)
#         logger.addHandler(file_handler)
#     except OSError as e:
#         logger.error('Could not create log file {file}: {error}'.format(
#             file=file_path, error=e.strerror))
# 
#     return logger
# 
# Path: marvin_python_toolbox/common/exceptions.py
# class InvalidConfigException(ConfigException):
#     """
#     Invalid Marvin Config Base Exception
#     """
# 
# Path: marvin_python_toolbox/common/utils.py
# def from_json(json_str):
#     return simplejson.loads(json_str, object_hook=_from_json_object_hook)


# Path: marvin_python_toolbox/common/config.py
import os
from configparser import ConfigParser, NoSectionError
from configobj import ConfigObj
from .._compatibility import six
from .._logging import get_logger
from .exceptions import InvalidConfigException
from .utils import from_json

    @classmethod
    def _load(cls, section=None):
        section = section or cls._default_sect
        cls._conf[section] = load_conf_from_file(section=section)

    @classmethod
    def get(cls, key, section=None, **kwargs):
        """
        Retrieves a config value from dict.
        If not found twrows an InvalidScanbooconfigException.
        """
        section = section or cls._default_sect
        if section not in cls._conf:
            cls._load(section=section)

        value = cls._conf[section].get(key)

        # if not found in context read default
        if not value and section != cls._default_sect:
            value = cls._conf[cls._default_sect].get(key) if cls._default_sect in cls._conf else None

        if value is None:
            if 'default' in kwargs:  # behave as {}.get(x, default='fallback')
                _def_value = kwargs['default']
                logger.warn("Static configuration [{}] was not found. Using the default value [{}].".format(key, _def_value))
                return _def_value
            else:
                raise InvalidConfigException(u'Not found entry: {}'.format(key))

        try:

            value = from_json(value)  # parse value