diff hglib/util.py @ 3:d7903b923217

util: add cmdbuilder, a helper function to generate the command to run
author Idan Kamara <idankk86@gmail.com>
date Tue, 09 Aug 2011 00:39:25 +0300
parents 79f88b4db15f
children 3ac38d500d68
line wrap: on
line diff
--- a/hglib/util.py	Sat Jul 23 22:55:36 2011 +0300
+++ b/hglib/util.py	Tue Aug 09 00:39:25 2011 +0300
@@ -4,3 +4,57 @@
     ''' list(grouper(2, range(4))) -> [(0, 1), (2, 3)] '''
     args = [iter(iterable)] * n
     return itertools.izip(*args)
+
+def cmdbuilder(name, *args, **kwargs):
+    """
+    A helper for building the command arguments
+
+    args are the positional arguments
+
+    kwargs are the options
+    keys that are single lettered are prepended with '-', others with '--',
+    underscores are replaced with dashes
+
+    keys with False boolean values are ignored, lists add the key multiple times
+
+    None arguments are skipped
+
+    >>> cmdbuilder('cmd', a=True, b=False, c=None)
+    ['cmd', '-a']
+    >>> cmdbuilder('cmd', long=True)
+    ['cmd', '--long']
+    >>> cmdbuilder('cmd', str='s')
+    ['cmd', '--str', 's']
+    >>> cmdbuilder('cmd', d_ash=True)
+    ['cmd', '--d-ash']
+    >>> cmdbuilder('cmd', _=True)
+    ['cmd', '-']
+    >>> cmdbuilder('cmd', list=[1, 2])
+    ['cmd', '--list', '1', '--list', '2']
+    >>> cmdbuilder('cmd', None)
+    ['cmd']
+    """
+    cmd = [name]
+    for arg, val in kwargs.items():
+        if val is None:
+            continue
+
+        arg = arg.replace('_', '-')
+        if arg != '-':
+            arg = '-' + arg if len(arg) == 1 else '--' + arg
+        if isinstance(val, bool):
+            if val:
+                cmd.append(arg)
+        elif isinstance(val, list):
+            for v in val:
+                cmd.append(arg)
+                cmd.append(str(v))
+        else:
+            cmd.append(arg)
+            cmd.append(str(val))
+
+    for a in args:
+        if a is not None:
+            cmd.append(a)
+
+    return cmd