mercurial/utils/stringutil.py
changeset 40275 f2fbd32c7664
parent 39378 0f549da54379
child 40276 be57c7019c70
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