]> git.llucax.com Git - software/pymin.git/commitdiff
Merge or3st3s@azazel:/home/luca/repos/pymin
authorNicolas Emiliani <nemiliani@integratech.com.ar>
Wed, 10 Oct 2007 18:31:07 +0000 (15:31 -0300)
committerNicolas Emiliani <nemiliani@integratech.com.ar>
Wed, 10 Oct 2007 18:31:07 +0000 (15:31 -0300)
TODO
pymin/dispatcher.py
pymin/services/util.py

diff --git a/TODO b/TODO
index b8d9c03853380c9db7272a5ad4f9ff6513a309fd..40b489a5ea1e887738c9528ccccb3994aa90d120 100644 (file)
--- a/TODO
+++ b/TODO
@@ -1,6 +1,13 @@
 
 Ideas / TODO:
 
+* Agregar soporte de opciones de línea de comando/archivo de conf para:
+  * Dry run.
+  * Seleccionar servicios a usar.
+  * Puerto/bind addr.
+  * Logging.
+  * Paths.
+
 * Agregar logging.
 
 * Agregar validación con formencode.
index 10e7fb8fe74349bb94bc53b7960842a6a7d451bb..b5567a4747e47a854b232dc58a97e3559e65c629 100644 (file)
@@ -55,17 +55,18 @@ class CommandError(Error):
         return u'Error in command "%s".' % u' '.join(self.command)
 
 class WrongArgumentsError(CommandError):
-    r"""WrongArgumentsError() -> WrongArgumentsError instance.
+    r"""WrongArgumentsError(handler, message) -> WrongArgumentsError instance.
 
     This exception is raised when an empty command string is received.
     """
 
-    def __init__(self, message):
+    def __init__(self, handler, message):
         r"Initialize the object, see class documentation for more info."
+        self.handler = handler
         self.message = message
 
     def __unicode__(self):
-        return self.message
+        return u'Command "%s" %s.' % (self.handler.__name__, self.message)
 
 class CommandNotSpecifiedError(CommandError):
     r"""CommandNotSpecifiedError() -> CommandNotSpecifiedError instance.
@@ -384,6 +385,7 @@ def parse_command(command):
     return (seq, dic)
 
 args_re = re.compile(r'\w+\(\) takes (.+) (\d+) \w+ \((\d+) given\)')
+kw_re = re.compile(r'\w+\(\) got an unexpected keyword argument (.+)')
 
 class Dispatcher:
     r"""Dispatcher([root]) -> Dispatcher instance :: Command dispatcher.
@@ -459,9 +461,13 @@ class Dispatcher:
                 pl = ''
                 if n_ok > 1:
                     pl = 's'
-                raise WrongArgumentsError(
-                        u'Command "%s" takes %s %s argument%s, %s given.'
-                            % (handler.__name__, quant, n_ok, pl, n_bad))
+                raise WrongArgumentsError(handler, u'takes %s %s argument%s, '
+                            '%s given' % (quant, n_ok, pl, n_bad))
+            m = kw_re.match(unicode(e))
+            if m:
+                (kw,)  = m.groups()
+                raise WrongArgumentsError(handler,
+                        u'got an unexpected keyword argument %s' % kw)
             raise
 
 
index e5aa202281a63931a85c3caea44907305fbd7e18..c0371a1a5679f48345e4f222763fe42a37b00e7b 100644 (file)
@@ -11,11 +11,13 @@ except ImportError:
 
 from pymin.dispatcher import Handler, handler, HandlerError
 
-DEBUG = False
-#DEBUG = True
+#DEBUG = False
+DEBUG = True
 
-__ALL__ = ('ServiceHandler', 'InitdHandler', 'Persistent', 'ConfigWriter',
-            'Error', 'ReturnNot0Error', 'ExecutionError', 'call')
+__ALL__ = ('ServiceHandler', 'InitdHandler', 'SubHandler', 'DictSubHandler',
+            'ListSubHandler', 'Persistent', 'ConfigWriter', 'Error',
+            'ReturnNot0Error', 'ExecutionError', 'ItemError',
+            'ItemAlreadyExistsError', 'ItemNotFoundError', 'call')
 
 class Error(HandlerError):
     r"""
@@ -79,7 +81,7 @@ class ParameterError(Error, KeyError):
 
 class ParameterNotFoundError(ParameterError):
     r"""
-    ParameterNotFoundError(hostname) -> ParameterNotFoundError instance
+    ParameterNotFoundError(paramname) -> ParameterNotFoundError instance
 
     This exception is raised when trying to operate on a parameter that doesn't
     exists.
@@ -89,6 +91,40 @@ class ParameterNotFoundError(ParameterError):
         r"Initialize the object. See class documentation for more info."
         self.message = 'Parameter not found: "%s"' % paramname
 
+class ItemError(Error, KeyError):
+    r"""
+    ItemError(key) -> ItemError instance.
+
+    This is the base exception for all item related errors.
+    """
+
+    def __init__(self, key):
+        r"Initialize the object. See class documentation for more info."
+        self.message = u'Item error: "%s"' % key
+
+class ItemAlreadyExistsError(ItemError):
+    r"""
+    ItemAlreadyExistsError(key) -> ItemAlreadyExistsError instance.
+
+    This exception is raised when trying to add an item that already exists.
+    """
+
+    def __init__(self, key):
+        r"Initialize the object. See class documentation for more info."
+        self.message = u'Item already exists: "%s"' % key
+
+class ItemNotFoundError(ItemError):
+    r"""
+    ItemNotFoundError(key) -> ItemNotFoundError instance
+
+    This exception is raised when trying to operate on an item that doesn't
+    exists.
+    """
+
+    def __init__(self, key):
+        r"Initialize the object. See class documentation for more info."
+        self.message = u'Item not found: "%s"' % key
+
 
 def call(command, stdin=subprocess.PIPE, stdout=subprocess.PIPE,
             stderr=subprocess.PIPE, close_fds=True, universal_newlines=True,
@@ -527,6 +563,91 @@ class ParametersHandler(Handler):
         r"show() -> (key, value) tuples :: List all the parameters."
         return self.params.items()
 
+class SubHandler(Handler):
+    r"""SubHandler(parent) -> SubHandler instance :: Handles subcommands.
+
+    This is a helper class to build sub handlers that needs to reference the
+    parent handler.
+
+    parent - Parent Handler object.
+    """
+
+    def __init__(self, parent):
+        r"Initialize the object, see the class documentation for details."
+        self.parent = parent
+
+class DictSubHandler(SubHandler):
+    r"""DictSubHandler(parent) -> DictSubHandler instance.
+
+    This is a helper class to inherit from to automatically handle subcommands
+    that operates over a dict parent attribute.
+
+    The dict attribute to handle and the class of objects that it contains can
+    be defined by calling the constructor or in a more declarative way as
+    class attributes, like:
+
+    class TestHandler(DictSubHandler):
+        _dict_subhandler_attr = 'some_dict'
+        _dict_subhandler_class = SomeClass
+
+    This way, the parent's some_dict attribute (self.parent.some_dict) will be
+    managed automatically, providing the commands: add, update, delete, get,
+    list and show.
+    """
+
+    def __init__(self, parent, attr=None, key=None, cls=None):
+        r"Initialize the object, see the class documentation for details."
+        self.parent = parent
+        if attr is not None:
+            self._dict_subhandler_attr = attr
+        if key is not None:
+            self._dict_subhandler_key = key
+        if cls is not None:
+            self._dict_subhandler_class = cls
+
+    def _dict(self):
+        return getattr(self.parent, self._dict_subhandler_attr)
+
+    @handler(u'Add a new item')
+    def add(self, key, *args, **kwargs):
+        r"add(key, ...) -> None :: Add an item to the dict."
+        item = self._dict_subhandler_class(key, *args, **kwargs)
+        if key in self._dict():
+            raise ItemAlreadyExistsError(key)
+        self._dict()[key] = item
+
+    @handler(u'Update an item')
+    def update(self, key, *args, **kwargs):
+        r"update(key, ...) -> None :: Update an item of the dict."
+        if not key in self._dict():
+            raise ItemNotFoundError(key)
+        self._dict()[key].update(*args, **kwargs)
+
+    @handler(u'Delete an item')
+    def delete(self, key):
+        r"delete(key) -> None :: Delete an item of the dict."
+        if not key in self._dict():
+            raise ItemNotFoundError(key)
+        del self._dict()[key]
+
+    @handler(u'Get information about an item')
+    def get(self, key):
+        r"get(key) -> Host :: List all the information of an item."
+        if not key in self._dict():
+            raise ItemNotFoundError(key)
+        return self._dict()[key]
+
+    @handler(u'List all the items by key')
+    def list(self):
+        r"list() -> tuple :: List all the item keys."
+        return self._dict().keys()
+
+    @handler(u'Get information about all items')
+    def show(self):
+        r"show() -> list of Hosts :: List all the complete items information."
+        return self._dict().values()
+
+
 
 if __name__ == '__main__':