+# 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
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.
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
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
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