Source code for tools.formatter
"""Module containing various formatting related utilities."""
#
# (C) Pywikibot team, 2015-2024
#
# Distributed under the terms of the MIT license.
#
from __future__ import annotations
import math
from pywikibot.logging import info
from pywikibot.tools import deprecated
[docs]
class SequenceOutputter:
"""A class formatting a list of items.
It is possible to customize the appearance by changing
``format_string`` which is used by ``str.format`` with ``index``,
``width`` and ``item``. Each line is joined by the separator and the
complete text is surrounded by the prefix and the suffix. All three
are by default a new line. The index starts at 1 and for the width
it's using the width of the sequence's length written as a decimal
number. So a length of 100 will result in a with of 3 and a length
of 99 in a width of 2.
It is iterating over ``self.sequence`` to generate the text. That
sequence can be any iterator but the result is better when it has
an order.
"""
format_string = ' {index:>{width}} - {item}'
separator = '\n'
prefix = '\n'
suffix = '\n'
def __init__(self, sequence) -> None:
"""Create a new instance with a reference to the sequence."""
super().__init__()
self.sequence = sequence
@property
def out(self):
"""Create the text with one item on each line."""
if self.sequence:
# Width is only defined when the length is greater 0
width = int(math.log10(len(self.sequence))) + 1
content = self.separator.join(
self.format_string.format(index=i, item=item, width=width)
for i, item in enumerate(self.sequence, start=1))
else:
content = ''
return self.prefix + content + self.suffix
[docs]
@deprecated('pywikibot.info(SequenceOutputter.out)', since='9.0.0')
def output(self) -> None:
"""Output the text of the current sequence.
.. deprecated:: 9.0
Use :func:`pywikibot.info()<pywikibot.logging.info>` with
:attr:`out` property.
"""
info(self.out)