]>
jfr.im git - dlqueue.git/blob - venv/lib/python3.11/site-packages/pip/_vendor/rich/measure.py
1 from operator
import itemgetter
2 from typing
import TYPE_CHECKING
, Callable
, NamedTuple
, Optional
, Sequence
5 from .protocol
import is_renderable
, rich_cast
8 from .console
import Console
, ConsoleOptions
, RenderableType
11 class Measurement(NamedTuple
):
12 """Stores the minimum and maximum widths (in characters) required to render an object."""
15 """Minimum number of cells required to render."""
17 """Maximum number of cells required to render."""
20 def span(self
) -> int:
21 """Get difference between maximum and minimum."""
22 return self
.maximum
- self
.minimum
24 def normalize(self
) -> "Measurement":
25 """Get measurement that ensures that minimum <= maximum and minimum >= 0
28 Measurement: A normalized measurement.
30 minimum
, maximum
= self
31 minimum
= min(max(0, minimum
), maximum
)
32 return Measurement(max(0, minimum
), max(0, max(minimum
, maximum
)))
34 def with_maximum(self
, width
: int) -> "Measurement":
35 """Get a RenderableWith where the widths are <= width.
38 width (int): Maximum desired width.
41 Measurement: New Measurement object.
43 minimum
, maximum
= self
44 return Measurement(min(minimum
, width
), min(maximum
, width
))
46 def with_minimum(self
, width
: int) -> "Measurement":
47 """Get a RenderableWith where the widths are >= width.
50 width (int): Minimum desired width.
53 Measurement: New Measurement object.
55 minimum
, maximum
= self
57 return Measurement(max(minimum
, width
), max(maximum
, width
))
60 self
, min_width
: Optional
[int] = None, max_width
: Optional
[int] = None
62 """Clamp a measurement within the specified range.
65 min_width (int): Minimum desired width, or ``None`` for no minimum. Defaults to None.
66 max_width (int): Maximum desired width, or ``None`` for no maximum. Defaults to None.
69 Measurement: New Measurement object.
72 if min_width
is not None:
73 measurement
= measurement
.with_minimum(min_width
)
74 if max_width
is not None:
75 measurement
= measurement
.with_maximum(max_width
)
80 cls
, console
: "Console", options
: "ConsoleOptions", renderable
: "RenderableType"
82 """Get a measurement for a renderable.
85 console (~rich.console.Console): Console instance.
86 options (~rich.console.ConsoleOptions): Console options.
87 renderable (RenderableType): An object that may be rendered with Rich.
90 errors.NotRenderableError: If the object is not renderable.
93 Measurement: Measurement object containing range of character widths required to render the object.
95 _max_width
= options
.max_width
97 return Measurement(0, 0)
98 if isinstance(renderable
, str):
99 renderable
= console
.render_str(
100 renderable
, markup
=options
.markup
, highlight
=False
102 renderable
= rich_cast(renderable
)
103 if is_renderable(renderable
):
104 get_console_width
: Optional
[
105 Callable
[["Console", "ConsoleOptions"], "Measurement"]
106 ] = getattr(renderable
, "__rich_measure__", None)
107 if get_console_width
is not None:
109 get_console_width(console
, options
)
111 .with_maximum(_max_width
)
113 if render_width
.maximum
< 1:
114 return Measurement(0, 0)
115 return render_width
.normalize()
117 return Measurement(0, _max_width
)
119 raise errors
.NotRenderableError(
120 f
"Unable to get render width for {renderable!r}; "
121 "a str, Segment, or object with __rich_console__ method is required"
125 def measure_renderables(
127 options
: "ConsoleOptions",
128 renderables
: Sequence
["RenderableType"],
130 """Get a measurement that would fit a number of renderables.
133 console (~rich.console.Console): Console instance.
134 options (~rich.console.ConsoleOptions): Console options.
135 renderables (Iterable[RenderableType]): One or more renderable objects.
138 Measurement: Measurement object containing range of character widths required to
139 contain all given renderables.
142 return Measurement(0, 0)
143 get_measurement
= Measurement
.get
145 get_measurement(console
, options
, renderable
) for renderable
in renderables
147 measured_width
= Measurement(
148 max(measurements
, key
=itemgetter(0)).minimum
,
149 max(measurements
, key
=itemgetter(1)).maximum
,
151 return measured_width