comparison mercurial/utils/stringutil.py @ 40275:f2fbd32c7664

stringutil: make level parameter of pprintgen() 0-origin I think this makes more sense in that the level is incremented where nesting goes one more deep.
author Yuya Nishihara <yuya@tcha.org>
date Sun, 14 Oct 2018 07:18:19 +0200
parents 0f549da54379
children be57c7019c70
comparison
equal deleted inserted replaced
40274:a8b9174517c7 40275:f2fbd32c7664
45 45
46 def pprint(o, bprefix=False, indent=0): 46 def pprint(o, bprefix=False, indent=0):
47 """Pretty print an object.""" 47 """Pretty print an object."""
48 return b''.join(pprintgen(o, bprefix=bprefix, indent=indent)) 48 return b''.join(pprintgen(o, bprefix=bprefix, indent=indent))
49 49
50 def pprintgen(o, bprefix=False, indent=0, _level=1): 50 def pprintgen(o, bprefix=False, indent=0, _level=0):
51 """Pretty print an object to a generator of atoms. 51 """Pretty print an object to a generator of atoms.
52 52
53 ``bprefix`` is a flag influencing whether bytestrings are preferred with 53 ``bprefix`` is a flag influencing whether bytestrings are preferred with
54 a ``b''`` prefix. 54 a ``b''`` prefix.
55 55
73 return 73 return
74 74
75 yield '[' 75 yield '['
76 76
77 if indent: 77 if indent:
78 _level += 1
78 yield '\n' 79 yield '\n'
79 yield ' ' * (_level * indent) 80 yield ' ' * (_level * indent)
80 81
81 for i, a in enumerate(o): 82 for i, a in enumerate(o):
82 for chunk in pprintgen(a, bprefix=bprefix, indent=indent, 83 for chunk in pprintgen(a, bprefix=bprefix, indent=indent,
83 _level=_level + 1): 84 _level=_level):
84 yield chunk 85 yield chunk
85 86
86 if i + 1 < len(o): 87 if i + 1 < len(o):
87 if indent: 88 if indent:
88 yield ',\n' 89 yield ',\n'
89 yield ' ' * (_level * indent) 90 yield ' ' * (_level * indent)
90 else: 91 else:
91 yield ', ' 92 yield ', '
92 93
93 if indent: 94 if indent:
94 yield '\n' 95 _level -= 1
95 yield ' ' * ((_level - 1) * indent) 96 yield '\n'
97 yield ' ' * (_level * indent)
96 98
97 yield ']' 99 yield ']'
98 elif isinstance(o, dict): 100 elif isinstance(o, dict):
99 if not o: 101 if not o:
100 yield '{}' 102 yield '{}'
101 return 103 return
102 104
103 yield '{' 105 yield '{'
104 106
105 if indent: 107 if indent:
108 _level += 1
106 yield '\n' 109 yield '\n'
107 yield ' ' * (_level * indent) 110 yield ' ' * (_level * indent)
108 111
109 for i, (k, v) in enumerate(sorted(o.items())): 112 for i, (k, v) in enumerate(sorted(o.items())):
110 for chunk in pprintgen(k, bprefix=bprefix, indent=indent, 113 for chunk in pprintgen(k, bprefix=bprefix, indent=indent,
111 _level=_level + 1): 114 _level=_level):
112 yield chunk 115 yield chunk
113 116
114 yield ': ' 117 yield ': '
115 118
116 for chunk in pprintgen(v, bprefix=bprefix, indent=indent, 119 for chunk in pprintgen(v, bprefix=bprefix, indent=indent,
117 _level=_level + 1): 120 _level=_level):
118 yield chunk 121 yield chunk
119 122
120 if i + 1 < len(o): 123 if i + 1 < len(o):
121 if indent: 124 if indent:
122 yield ',\n' 125 yield ',\n'
123 yield ' ' * (_level * indent) 126 yield ' ' * (_level * indent)
124 else: 127 else:
125 yield ', ' 128 yield ', '
126 129
127 if indent: 130 if indent:
128 yield '\n' 131 _level -= 1
129 yield ' ' * ((_level - 1) * indent) 132 yield '\n'
133 yield ' ' * (_level * indent)
130 134
131 yield '}' 135 yield '}'
132 elif isinstance(o, set): 136 elif isinstance(o, set):
133 if not o: 137 if not o:
134 yield 'set([])' 138 yield 'set([])'
135 return 139 return
136 140
137 yield 'set([' 141 yield 'set(['
138 142
139 if indent: 143 if indent:
144 _level += 1
140 yield '\n' 145 yield '\n'
141 yield ' ' * (_level * indent) 146 yield ' ' * (_level * indent)
142 147
143 for i, k in enumerate(sorted(o)): 148 for i, k in enumerate(sorted(o)):
144 for chunk in pprintgen(k, bprefix=bprefix, indent=indent, 149 for chunk in pprintgen(k, bprefix=bprefix, indent=indent,
145 _level=_level + 1): 150 _level=_level):
146 yield chunk 151 yield chunk
147 152
148 if i + 1 < len(o): 153 if i + 1 < len(o):
149 if indent: 154 if indent:
150 yield ',\n' 155 yield ',\n'
151 yield ' ' * (_level * indent) 156 yield ' ' * (_level * indent)
152 else: 157 else:
153 yield ', ' 158 yield ', '
154 159
155 if indent: 160 if indent:
156 yield '\n' 161 _level -= 1
157 yield ' ' * ((_level - 1) * indent) 162 yield '\n'
163 yield ' ' * (_level * indent)
158 164
159 yield '])' 165 yield '])'
160 elif isinstance(o, tuple): 166 elif isinstance(o, tuple):
161 if not o: 167 if not o:
162 yield '()' 168 yield '()'
163 return 169 return
164 170
165 yield '(' 171 yield '('
166 172
167 if indent: 173 if indent:
174 _level += 1
168 yield '\n' 175 yield '\n'
169 yield ' ' * (_level * indent) 176 yield ' ' * (_level * indent)
170 177
171 for i, a in enumerate(o): 178 for i, a in enumerate(o):
172 for chunk in pprintgen(a, bprefix=bprefix, indent=indent, 179 for chunk in pprintgen(a, bprefix=bprefix, indent=indent,
173 _level=_level + 1): 180 _level=_level):
174 yield chunk 181 yield chunk
175 182
176 if i + 1 < len(o): 183 if i + 1 < len(o):
177 if indent: 184 if indent:
178 yield ',\n' 185 yield ',\n'
179 yield ' ' * (_level * indent) 186 yield ' ' * (_level * indent)
180 else: 187 else:
181 yield ', ' 188 yield ', '
182 189
183 if indent: 190 if indent:
184 yield '\n' 191 _level -= 1
185 yield ' ' * ((_level - 1) * indent) 192 yield '\n'
193 yield ' ' * (_level * indent)
186 194
187 yield ')' 195 yield ')'
188 elif isinstance(o, types.GeneratorType): 196 elif isinstance(o, types.GeneratorType):
189 # Special case of empty generator. 197 # Special case of empty generator.
190 try: 198 try:
194 return 202 return
195 203
196 yield 'gen[' 204 yield 'gen['
197 205
198 if indent: 206 if indent:
207 _level += 1
199 yield '\n' 208 yield '\n'
200 yield ' ' * (_level * indent) 209 yield ' ' * (_level * indent)
201 210
202 last = False 211 last = False
203 212
208 nextitem = next(o) 217 nextitem = next(o)
209 except StopIteration: 218 except StopIteration:
210 last = True 219 last = True
211 220
212 for chunk in pprintgen(current, bprefix=bprefix, indent=indent, 221 for chunk in pprintgen(current, bprefix=bprefix, indent=indent,
213 _level=_level + 1): 222 _level=_level):
214 yield chunk 223 yield chunk
215 224
216 if not last: 225 if not last:
217 if indent: 226 if indent:
218 yield ',\n' 227 yield ',\n'
219 yield ' ' * (_level * indent) 228 yield ' ' * (_level * indent)
220 else: 229 else:
221 yield ', ' 230 yield ', '
222 231
223 if indent: 232 if indent:
224 yield '\n' 233 _level -= 1
225 yield ' ' * ((_level -1) * indent) 234 yield '\n'
235 yield ' ' * (_level * indent)
226 236
227 yield ']' 237 yield ']'
228 else: 238 else:
229 yield pycompat.byterepr(o) 239 yield pycompat.byterepr(o)
230 240