comparison hglib/util.py @ 193:32e8d51ec16c

util: make cmdbuilder() robust for faulty parsing of early options Also fixed handling of positional arguments.
author Yuya Nishihara <yuya@tcha.org>
date Sat, 11 Nov 2017 19:52:48 +0900
parents 0f81ed8e147b
children 2d0ec6097d78
comparison
equal deleted inserted replaced
192:7a84a8656679 193:32e8d51ec16c
92 92
93 >>> cmdbuilder(b('cmd'), a=True, b=False, c=None) == [b('cmd'), b('-a')] 93 >>> cmdbuilder(b('cmd'), a=True, b=False, c=None) == [b('cmd'), b('-a')]
94 True 94 True
95 >>> cmdbuilder(b('cmd'), long=True) == [b('cmd'), b('--long')] 95 >>> cmdbuilder(b('cmd'), long=True) == [b('cmd'), b('--long')]
96 True 96 True
97 >>> cmdbuilder(b('cmd'), str=b('s')) == [b('cmd'), b('--str'), b('s')] 97 >>> cmdbuilder(b('cmd'), s=b('hort')) == [b('cmd'), b('-short')]
98 True
99 >>> cmdbuilder(b('cmd'), str=b('s')) == [b('cmd'), b('--str=s')]
98 True 100 True
99 >>> cmdbuilder(b('cmd'), d_ash=True) == [b('cmd'), b('--d-ash')] 101 >>> cmdbuilder(b('cmd'), d_ash=True) == [b('cmd'), b('--d-ash')]
100 True 102 True
101 >>> cmdbuilder(b('cmd'), _=True) == [b('cmd'), b('-')] 103 >>> cmdbuilder(b('cmd'), _=True) == [b('cmd'), b('-')]
102 True 104 True
103 >>> expect = [b('cmd'), b('--list'), b('1'), b('--list'), b('2')] 105 >>> cmdbuilder(b('cmd'), l=[1, 2]) == [b('cmd'), b('-l1'), b('-l2')]
106 True
107 >>> expect = [b('cmd'), b('--list=1'), b('--list=2')]
104 >>> cmdbuilder(b('cmd'), list=[1, 2]) == expect 108 >>> cmdbuilder(b('cmd'), list=[1, 2]) == expect
105 True 109 True
106 >>> cmdbuilder(b('cmd'), None) == [b('cmd')] 110 >>> cmdbuilder(b('cmd'), None) == [b('cmd')]
111 True
112 >>> cmdbuilder(b('cmd'), b('-a')) == [b('cmd'), b('--'), b('-a')]
107 True 113 True
108 """ 114 """
109 cmd = [name] 115 cmd = [name]
110 for arg, val in kwargs.items(): 116 for arg, val in kwargs.items():
111 if val is None: 117 if val is None:
112 continue 118 continue
113 119
114 arg = arg.encode('latin-1').replace(b('_'), b('-')) 120 arg = pfx = arg.encode('latin-1').replace(b('_'), b('-'))
115 if arg != b('-'): 121 if arg != b('-'):
116 if len(arg) == 1: 122 if len(arg) == 1:
117 arg = b('-') + arg 123 arg = pfx = b('-') + arg
118 else: 124 else:
119 arg = b('--') + arg 125 arg = b('--') + arg
126 pfx = arg + b('=')
120 if isinstance(val, bool): 127 if isinstance(val, bool):
121 if val: 128 if val:
122 cmd.append(arg) 129 cmd.append(arg)
123 elif isinstance(val, list): 130 elif isinstance(val, list):
124 for v in val: 131 for v in val:
125 cmd.append(arg) 132 cmd.append(pfx + _cmdval(v))
126 cmd.append(_cmdval(v))
127 else: 133 else:
128 cmd.append(arg) 134 cmd.append(pfx + _cmdval(val))
129 cmd.append(_cmdval(val)) 135
130 136 args = [a for a in args if a is not None]
137 if args:
138 cmd.append(b('--'))
131 for a in args: 139 for a in args:
132 if a is not None: 140 cmd.append(a)
133 cmd.append(a)
134 141
135 return cmd 142 return cmd
136 143
137 class reterrorhandler(object): 144 class reterrorhandler(object):
138 """This class is meant to be used with rawcommand() error handler 145 """This class is meant to be used with rawcommand() error handler