Source code for AutoArchive._mainf._core.mainf_engine
# mainf_engine.py
#
# Project: AutoArchive
# License: GNU GPLv3
#
# Copyright (C) 2003 - 2011 Róbert Čerňanský
""":class:`MainfEngine` class."""
__all__ = ["MainfEngine"]
# {{{ INCLUDES
from ..._utils import *
from .. import *
from ._interface_accessor import *
from ._mainf_context import *
# }}} INCLUDES
# {{{ CLASSES
[docs]class MainfEngine:
"""Manages components and starts the program.
Contains all components managed by the :term:`Mainf` framework. Typically, components are added after
instantiation of this class. Usage of the class should be followed by calling its :meth:`start()` method which
creates, initializes and runs components.
See also the description of _mainf package (:mod:`._mainf`)."""
def __init__(self):
# list of managed IComponent classes
self.__componentTypes = []
[docs] def start(self, appEnvironment = None):
"""Starts the program.
Creates and initializes components. This method is typically called by a class or function exposed to the
startup script.
See also: :mod:`._mainf`, :class:`MainfEngine`.
:param appEnvironment: An arbitrary object. It will be available to components.
:type appEnvironment: ``object``
:return: Exit code of the program.
:rtype: ``int``"""
mainfContext = _MainfContext(appEnvironment)
interfaceAccessor = _InterfaceAccessor()
interfaceAccessor.registerComponentInterface(IMainfContext, mainfContext)
try:
components = self.__createComponents(interfaceAccessor)
result = 0 if self.__runComponents(components) else 1
except KeyboardInterrupt:
print("\nAborted by user.")
result = 1
except Exception as ex:
import traceback
if _Constants.DEBUG:
print(traceback.print_exc())
else:
_Utils.printError(str.format("Exception occurred: {}.", traceback.format_exception_only(type(ex), ex)))
result = 1
return result
[docs] def addComponent(self, componentType):
"""Add a component to be managed by :term:`Mainf` framework.
:param componentType: A component class that will be added.
:type componentType: ``type{``:class:`.IComponent`\ ``}``
:raise TypeError: If ``componentType`` does not implement :class:`.IComponent`."""
if not issubclass(componentType, IComponent):
raise TypeError("componentType")
self.__componentTypes.append(componentType)
def __createComponents(self, interfaceAccessor):
components = []
for componentClass in self.__componentTypes:
components.append(componentClass(interfaceAccessor))
return components
def __runComponents(self, components):
result = True
for component in components:
result = component.run() and result
return result
# }}} CLASSES