Replace .config rather than reconstructing plugins, drivers, and UIs.
[hooke.git] / hooke / command.py
index 0a6abc3a1df0aca56239436b5096d1f2d87af22c..c694bff28c0d7b2ea8625672017fb186074c1ba5 100644 (file)
@@ -1,5 +1,28 @@
+# Copyright (C) 2010 W. Trevor King <wking@drexel.edu>
+#
+# This file is part of Hooke.
+#
+# Hooke is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# Hooke is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+# or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General
+# Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with Hooke.  If not, see
+# <http://www.gnu.org/licenses/>.
+
 """The `command` module provides :class:`Command`\s and
 :class:`Argument`\s for defining commands.
+
+It also provides :class:`CommandExit` and subclasses for communicating
+command completion information between
+:class:`hooke.engine.CommandEngine`\s and
+:class:`hooke.ui.UserInterface`\s.
 """
 
 import Queue as queue
@@ -57,100 +80,6 @@ class UncaughtException (Failure):
             setattr(self, key, value)
         self.args = (self.traceback + str(self.exception),)
 
-class InList (list):
-    """:class:`Request` validator class.
-
-    Examples
-    --------
-
-    >>> i = InList(['abc', 'def', 5, True])
-    >>> i('abc')
-    >>> i(5)
-    >>> i(False)
-    Traceback (most recent call last):
-      ...
-    ValueError: False
-    """
-    def __init__(self, *args, **kwargs):
-        list.__init__(self, *args, **kwargs)
-
-    def __call__(self, value):
-        """Raises ValueError if a given `value` is not in our internal
-        list.
-        """
-        if value not in self:
-            raise ValueError(value)
-
-class Interaction (object):
-    """Mid-command inter-process interaction.
-
-    Stores :attr:`type`, a string representing the interaction type
-    ('boolean', 'string', ...).
-    """
-    def __init__(self, type):
-        self.type = type
-
-class Request (Interaction):
-    """Command engine requests for information from the UI.
-    """
-    def __init__(self, type, response_class,
-                 msg, default=None, validator=None):
-        super(Request, self).__init__(type)
-        self.response_class = response_class
-        self.msg = msg
-        self.default = default
-        self.validator = validator
-
-    def response(self, value):
-        if self.validator != None:
-            self.validator(value)
-        return self.response_class(value)
-
-class Response (Interaction):
-    """UI response to a :class:`Request`.
-    """
-    def __init__(self, type, value):
-        super(Response, self).__init__(type)
-        self.value = value
-
-class BooleanRequest (Request):
-    def __init__(self, msg, default=None):
-        super(BooleanRequest, self).__init__(
-            'boolean', BooleanResponse, msg, default,
-            validator = InList([True, False, default]))
-
-class BooleanResponse (Response):
-    def __init__(self, value):
-        super(BooleanResponse, self).__init__('boolean', value)
-
-class StringRequest (Request):
-    def __init__(self, msg, default=None):
-        super(StringRequest, self).__init__(
-            'string', StringResponse, msg, default)
-
-class StringResponse (Response):
-    def __init__(self, value):
-        super(StringResponse, self).__init__('string', value)
-
-class FloatRequest (Request):
-    def __init__(self, msg, default=None):
-        super(FloatRequest, self).__init__(
-            'float', FloatResponse, msg, default)
-
-class FloatResponse (Response):
-    def __init__(self, value):
-        super(FloatResponse, self).__init__('float', value)
-
-class SelectionRequest (Request):
-    def __init__(self, msg, default=None, options=[]):
-        super(SelectionRequest, self).__init__(
-            'selection', SelectionResponse, msg, default)
-        self.options = options
-
-class SelectionResponse (Response):
-    def __init__(self, value):
-        super(SelectionResponse, self).__init__('selection', value)
-
 
 class Command (object):
     """One-line command description here.
@@ -170,16 +99,19 @@ class Command (object):
     ITEM:
     <BLANKLINE>
     """
-    def __init__(self, name, aliases=None, arguments=[], help=''):
+    def __init__(self, name, aliases=None, arguments=[], help='',
+                 plugin=None):
+        # TODO: see_also=[other,command,instances,...]
         self.name = name
         if aliases == None:
             aliases = []
         self.aliases = aliases
         self.arguments = [
             Argument(name='help', type='bool', default=False, count=1,
-                     callback=StoreValue(True), help='Print a help message.'),
+                     help='Print a help message.'),
             ] + arguments
         self._help = help
+        self.plugin = plugin
 
     def run(self, hooke, inqueue=None, outqueue=None, **kwargs):
         """`Normalize inputs and handle <Argument help> before punting
@@ -209,7 +141,7 @@ class Command (object):
         outqueue.put(e)
         return 0
 
-    def _run(self, inqueue, outqueue, params):
+    def _run(self, hooke, inqueue, outqueue, params):
         """This is where the command-specific magic will happen.
         """
         pass
@@ -239,9 +171,9 @@ class Command (object):
                 if name != argument.name:
                     params.remove(name)
                     params[argument.name] = value
-                if argument.callback != None:
-                    value = argument.callback(hooke, self, argument, value)
-                    params[argument.name] = value
+            if argument.callback != None:
+                value = argument.callback(hooke, self, argument, value)
+                params[argument.name] = value
             argument.validate(value)
         return params
 
@@ -318,9 +250,6 @@ class Argument (object):
         """
         pass # TODO: validation
 
-    # TODO: type conversion
-
-# TODO: type extensions?
 
 # Useful callbacks