# Path: toscaparser/common/exception.py
# class ToscaExtAttributeError(TOSCAException):
#     msg_fmt = _('Missing attribute in extension "%(ext_name)s". '
#                 'Check to see that it has required attributes '
#                 '"%(attrs)s" defined.')
# 
# Path: toscaparser/common/exception.py
# class ToscaExtImportError(TOSCAException):
#     msg_fmt = _('Unable to import extension "%(ext_name)s". '
#                 'Check to see that it exists and has no '
#                 'language definition errors.')


import collections
import importlib
import logging
import os
from stevedore import extension
from toscaparser.common.exception import ToscaExtAttributeError
from toscaparser.common.exception import ToscaExtImportError
REQUIRED_ATTRIBUTES = ['VERSION', 'DEFS_FILE']


class ExtTools(object):
    def __init__(self):
        self.EXTENSION_INFO = self._load_extensions()

    def _load_extensions(self):
        '''Dynamically load all the extensions .'''
        extensions = collections.OrderedDict()

        extns = extension.ExtensionManager(namespace='toscaparser.extensions',
                                           invoke_on_load=True).extensions

        for e in extns:
            try:
                extinfo = importlib.import_module(e.plugin.__module__)
                base_path = os.path.dirname(extinfo.__file__)
                version = e.plugin().VERSION
                defs_file = base_path + '/' + e.plugin().DEFS_FILE

                # Sections is an optional attribute
                sections = getattr(e.plugin(), 'SECTIONS', ())

                extensions[version] = {'sections': sections,
                                       'defs_file': defs_file}
            except ImportError:
                raise ToscaExtImportError(ext_name=e.name)
            except AttributeError:
                attrs = ', '.join(REQUIRED_ATTRIBUTES)

# Path: toscaparser/common/exception.py
# class ToscaExtAttributeError(TOSCAException):
#     msg_fmt = _('Missing attribute in extension "%(ext_name)s". '
#                 'Check to see that it has required attributes '
#                 '"%(attrs)s" defined.')
# 
# Path: toscaparser/common/exception.py
# class ToscaExtImportError(TOSCAException):
#     msg_fmt = _('Unable to import extension "%(ext_name)s". '
#                 'Check to see that it exists and has no '
#                 'language definition errors.')


# Path: toscaparser/extensions/exttools.py
import collections
import importlib
import logging
import os
from stevedore import extension
from toscaparser.common.exception import ToscaExtAttributeError
from toscaparser.common.exception import ToscaExtImportError

REQUIRED_ATTRIBUTES = ['VERSION', 'DEFS_FILE']


class ExtTools(object):
    def __init__(self):
        self.EXTENSION_INFO = self._load_extensions()

    def _load_extensions(self):
        '''Dynamically load all the extensions .'''
        extensions = collections.OrderedDict()

        extns = extension.ExtensionManager(namespace='toscaparser.extensions',
                                           invoke_on_load=True).extensions

        for e in extns:
            try:
                extinfo = importlib.import_module(e.plugin.__module__)
                base_path = os.path.dirname(extinfo.__file__)
                version = e.plugin().VERSION
                defs_file = base_path + '/' + e.plugin().DEFS_FILE

                # Sections is an optional attribute
                sections = getattr(e.plugin(), 'SECTIONS', ())

                extensions[version] = {'sections': sections,
                                       'defs_file': defs_file}
            except ImportError:
                raise ToscaExtImportError(ext_name=e.name)
            except AttributeError:
                attrs = ', '.join(REQUIRED_ATTRIBUTES)

                raise ToscaExtAttributeError(ext_name=e.name, attrs=attrs)