""" The Envisage version of the old chestnut. """


# Standard library imports.
import logging

# Enthought library imports.
from envisage.api import Application, ExtensionPoint, Plugin
from traits.api import List, Str


# Create a log file.
logger = logging.getLogger()
logger.addHandler(logging.StreamHandler(file('hello_world.log', 'w')))
logger.setLevel(logging.DEBUG)


class HelloWorld(Plugin):
    """ The 'Hello World' plugin.

    This plugin offers a single extension point 'greetings' which is a list of
    greetings, one of which is used to produce the '<greeting> World' message
    when the plugin is started.

    """

    # This tells us that the plugin offers the 'greetings' extension point,
    # and that plugins that want to contribute to it must each provide a list
    # of strings (Str).
    greetings = ExtensionPoint(
        List(Str), id='greetings', desc='Greetings for "Hello World"'
    )

    # Plugin's have two important lifecyle methods, 'start' and 'stop'. These
    # methods are called automatically by Envisage when the application is
    # started and stopped respectively.
    def start(self):
        """ Start the plugin. """

        # Standard library imports.
        #
        # We put this import here just to emphasize that it is only used in
        # this specific plugin.
        import random

        print random.choice(self.greetings), 'World!'

        return


class Greetings(Plugin):
    """ A plugin that contributes to the 'greetings' extension point. """

    # This tells us that the plugin contributes the value of this trait to the
    # 'greetings' extension point.
    greetings = List(["Hello", "G'day"], contributes_to='greetings')


class MoreGreetings(Plugin):
    """ Another plugin that contributes to the 'greetings' extension point. """

    # This tells us that the plugin contributes the value of this trait to the
    # 'greetings' extension point.
    greetings = List(contributes_to='greetings')

    # This shows how you can use a standard trait initializer to populate the
    # list dynamically.
    def _greetings_default(self):
        """ Trait initializer. """

        extensions = [
            'The %s application says %s' % (self.application.id, greeting)

            for greeting in ['Bonjour', 'Hola']
        ]

        return extensions


# Application entry point.
if __name__ == '__main__':

    # Create the application.
    #
    # An application is simply a collection of plugins. In this case we
    # specify the plugins explicitly, but the mechanism for finding plugins
    # is configurable by setting the application's 'plugin_manager' trait.
    application = Application(
        id='hello.world', plugins=[HelloWorld(), Greetings(), MoreGreetings()]
    )

    # Run it!
    application.run()

#### EOF ######################################################################
