python (3.11.7)

(root)/
lib/
python3.11/
site-packages/
pip/
_vendor/
rich/
bar.py
       1  from typing import Optional, Union
       2  
       3  from .color import Color
       4  from .console import Console, ConsoleOptions, RenderResult
       5  from .jupyter import JupyterMixin
       6  from .measure import Measurement
       7  from .segment import Segment
       8  from .style import Style
       9  
      10  # There are left-aligned characters for 1/8 to 7/8, but
      11  # the right-aligned characters exist only for 1/8 and 4/8.
      12  BEGIN_BLOCK_ELEMENTS = ["", "", "", "", "", "", "", ""]
      13  END_BLOCK_ELEMENTS = [" ", "", "", "", "", "", "", ""]
      14  FULL_BLOCK = ""
      15  
      16  
      17  class ESC[4;38;5;81mBar(ESC[4;38;5;149mJupyterMixin):
      18      """Renders a solid block bar.
      19  
      20      Args:
      21          size (float): Value for the end of the bar.
      22          begin (float): Begin point (between 0 and size, inclusive).
      23          end (float): End point (between 0 and size, inclusive).
      24          width (int, optional): Width of the bar, or ``None`` for maximum width. Defaults to None.
      25          color (Union[Color, str], optional): Color of the bar. Defaults to "default".
      26          bgcolor (Union[Color, str], optional): Color of bar background. Defaults to "default".
      27      """
      28  
      29      def __init__(
      30          self,
      31          size: float,
      32          begin: float,
      33          end: float,
      34          *,
      35          width: Optional[int] = None,
      36          color: Union[Color, str] = "default",
      37          bgcolor: Union[Color, str] = "default",
      38      ):
      39          self.size = size
      40          self.begin = max(begin, 0)
      41          self.end = min(end, size)
      42          self.width = width
      43          self.style = Style(color=color, bgcolor=bgcolor)
      44  
      45      def __repr__(self) -> str:
      46          return f"Bar({self.size}, {self.begin}, {self.end})"
      47  
      48      def __rich_console__(
      49          self, console: Console, options: ConsoleOptions
      50      ) -> RenderResult:
      51  
      52          width = min(
      53              self.width if self.width is not None else options.max_width,
      54              options.max_width,
      55          )
      56  
      57          if self.begin >= self.end:
      58              yield Segment(" " * width, self.style)
      59              yield Segment.line()
      60              return
      61  
      62          prefix_complete_eights = int(width * 8 * self.begin / self.size)
      63          prefix_bar_count = prefix_complete_eights // 8
      64          prefix_eights_count = prefix_complete_eights % 8
      65  
      66          body_complete_eights = int(width * 8 * self.end / self.size)
      67          body_bar_count = body_complete_eights // 8
      68          body_eights_count = body_complete_eights % 8
      69  
      70          # When start and end fall into the same cell, we ideally should render
      71          # a symbol that's "center-aligned", but there is no good symbol in Unicode.
      72          # In this case, we fall back to right-aligned block symbol for simplicity.
      73  
      74          prefix = " " * prefix_bar_count
      75          if prefix_eights_count:
      76              prefix += BEGIN_BLOCK_ELEMENTS[prefix_eights_count]
      77  
      78          body = FULL_BLOCK * body_bar_count
      79          if body_eights_count:
      80              body += END_BLOCK_ELEMENTS[body_eights_count]
      81  
      82          suffix = " " * (width - len(body))
      83  
      84          yield Segment(prefix + body[len(prefix) :] + suffix, self.style)
      85          yield Segment.line()
      86  
      87      def __rich_measure__(
      88          self, console: Console, options: ConsoleOptions
      89      ) -> Measurement:
      90          return (
      91              Measurement(self.width, self.width)
      92              if self.width is not None
      93              else Measurement(4, options.max_width)
      94          )