# Source code for enaml.widgets.ipython_console

    #------------------------------------------------------------------------------
    # Copyright (c) 2014-2024,, Nucleic Development Team.
    #
    # Distributed under the terms of the Modified BSD License.
    #
    # The full license is in the file LICENSE, distributed with this software.
    #------------------------------------------------------------------------------
    from atom.api import Dict, Event, Typed, ForwardTyped, set_default

    from enaml.core.declarative import d_

    from .control import Control, ProxyControl

    class ProxyIPythonConsole(ProxyControl):
        """ The abstract definition of a proxy IPythonConsole object.

        """
        #: A reference to the IPythonConsole declaration.
        declaration = ForwardTyped(lambda: IPythonConsole)

        def get_var(self, name, default):
            raise NotImplementedError

        def update_ns(self, ns):
            raise NotImplementedError

    class IPythonConsole(Control):
        """ A widget which hosts an embedded IPython console.

        """
        #: The initial namespace to apply to the console. Runtime changes
        #: to this value will be ignored. Use 'update_ns' to add variables
        #: to the console at runtime.
        initial_ns = d_(Dict())

        #: An event fired when the user invokes a console exit command.
        exit_requested = d_(Event(), writable=False)

        #: The ipython console expands freely by default.
        hug_width = set_default('ignore')
        hug_height = set_default('ignore')

        #: A reference to the ProxyIPythonConsole object.
        proxy = Typed(ProxyIPythonConsole)

        def get_var(self, name, default=None):
            """ Get a variable from the console namespace.

            Parameters
            ----------
            name : basestring
                The name of the variable to retrieve.

            default : object, optional
                The value to return if the variable does not exist. The
                default is None.

            Returns
            -------
            result : object
                The variable in the namespace, or the provided default.

            """
            if self.proxy_is_active:
                return self.proxy.get_var(name, default)
            return default

        def update_ns(self, **kwargs):
            """ Update the variables in the console namespace.

            Parameters
            ----------
            **kwargs
                The variables to update in the console namespace.

            """
            if self.proxy_is_active:
                self.proxy.update_ns(kwargs)