X-Git-Url: http://git.tremily.us/?p=hooke.git;a=blobdiff_plain;f=hooke%2Fcommand.py;h=974e3b5e7f121b65d153c517de027f164c74ac11;hp=0a6abc3a1df0aca56239436b5096d1f2d87af22c;hb=565f9d7b69d2e4a9ea447d7a50f8f835c3e08642;hpb=5c8249fb37212edf6d7eb9f75549f4f00bdfbe94 diff --git a/hooke/command.py b/hooke/command.py index 0a6abc3..974e3b5 100644 --- a/hooke/command.py +++ b/hooke/command.py @@ -1,5 +1,28 @@ +# Copyright (C) 2010 W. Trevor King +# +# 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 +# . + """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: """ - 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 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