golden hour
/opt/imunify360/venv/lib/python3.11/site-packages/pip/_vendor/rich
⬆️ Go Up
Upload
File/Folder
Size
Actions
LICENSE
1.03 KB
Del
OK
__init__.py
5.95 KB
Del
OK
__main__.py
7.71 KB
Del
OK
__pycache__
-
Del
OK
_cell_widths.py
9.97 KB
Del
OK
_emoji_codes.py
136.95 KB
Del
OK
_emoji_replace.py
1.04 KB
Del
OK
_export_format.py
2.08 KB
Del
OK
_extension.py
265 B
Del
OK
_fileno.py
799 B
Del
OK
_inspect.py
9.43 KB
Del
OK
_log_render.py
3.15 KB
Del
OK
_loop.py
1.21 KB
Del
OK
_null_file.py
1.36 KB
Del
OK
_palettes.py
6.9 KB
Del
OK
_pick.py
423 B
Del
OK
_ratio.py
5.2 KB
Del
OK
_spinners.py
19.45 KB
Del
OK
_stack.py
351 B
Del
OK
_timer.py
417 B
Del
OK
_win32_console.py
22.22 KB
Del
OK
_windows.py
1.88 KB
Del
OK
_windows_renderer.py
2.72 KB
Del
OK
_wrap.py
3.32 KB
Del
OK
abc.py
890 B
Del
OK
align.py
10.08 KB
Del
OK
ansi.py
6.76 KB
Del
OK
bar.py
3.19 KB
Del
OK
box.py
10.44 KB
Del
OK
cells.py
5.01 KB
Del
OK
color.py
17.78 KB
Del
OK
color_triplet.py
1.03 KB
Del
OK
columns.py
6.96 KB
Del
OK
console.py
98.49 KB
Del
OK
constrain.py
1.26 KB
Del
OK
containers.py
5.37 KB
Del
OK
control.py
6.33 KB
Del
OK
default_styles.py
8.06 KB
Del
OK
diagnose.py
1 KB
Del
OK
emoji.py
2.31 KB
Del
OK
errors.py
642 B
Del
OK
file_proxy.py
1.64 KB
Del
OK
filesize.py
2.43 KB
Del
OK
highlighter.py
9.36 KB
Del
OK
json.py
4.91 KB
Del
OK
jupyter.py
3.18 KB
Del
OK
layout.py
13.68 KB
Del
OK
live.py
14.82 KB
Del
OK
live_render.py
3.44 KB
Del
OK
logging.py
12.18 KB
Del
OK
markup.py
8.25 KB
Del
OK
measure.py
5.18 KB
Del
OK
padding.py
4.79 KB
Del
OK
pager.py
828 B
Del
OK
palette.py
3.32 KB
Del
OK
panel.py
10.9 KB
Del
OK
pretty.py
35.54 KB
Del
OK
progress.py
58.99 KB
Del
OK
progress_bar.py
7.97 KB
Del
OK
prompt.py
12.16 KB
Del
OK
protocol.py
1.36 KB
Del
OK
py.typed
0 B
Del
OK
region.py
166 B
Del
OK
repr.py
4.33 KB
Del
OK
rule.py
4.49 KB
Del
OK
scope.py
2.78 KB
Del
OK
screen.py
1.55 KB
Del
OK
segment.py
24.16 KB
Del
OK
spinner.py
4.12 KB
Del
OK
status.py
4.32 KB
Del
OK
style.py
26.36 KB
Del
OK
styled.py
1.23 KB
Del
OK
syntax.py
35.52 KB
Del
OK
table.py
39.11 KB
Del
OK
terminal_theme.py
3.29 KB
Del
OK
text.py
46.44 KB
Del
OK
theme.py
3.68 KB
Del
OK
themes.py
102 B
Del
OK
traceback.py
35.02 KB
Del
OK
tree.py
9.23 KB
Del
OK
Edit: _ratio.py
from fractions import Fraction from math import ceil from typing import cast, List, Optional, Sequence, Protocol class Edge(Protocol): """Any object that defines an edge (such as Layout).""" size: Optional[int] = None ratio: int = 1 minimum_size: int = 1 def ratio_resolve(total: int, edges: Sequence[Edge]) -> List[int]: """Divide total space to satisfy size, ratio, and minimum_size, constraints. The returned list of integers should add up to total in most cases, unless it is impossible to satisfy all the constraints. For instance, if there are two edges with a minimum size of 20 each and `total` is 30 then the returned list will be greater than total. In practice, this would mean that a Layout object would clip the rows that would overflow the screen height. Args: total (int): Total number of characters. edges (List[Edge]): Edges within total space. Returns: List[int]: Number of characters for each edge. """ # Size of edge or None for yet to be determined sizes = [(edge.size or None) for edge in edges] _Fraction = Fraction # While any edges haven't been calculated while None in sizes: # Get flexible edges and index to map these back on to sizes list flexible_edges = [ (index, edge) for index, (size, edge) in enumerate(zip(sizes, edges)) if size is None ] # Remaining space in total remaining = total - sum(size or 0 for size in sizes) if remaining <= 0: # No room for flexible edges return [ ((edge.minimum_size or 1) if size is None else size) for size, edge in zip(sizes, edges) ] # Calculate number of characters in a ratio portion portion = _Fraction( remaining, sum((edge.ratio or 1) for _, edge in flexible_edges) ) # If any edges will be less than their minimum, replace size with the minimum for index, edge in flexible_edges: if portion * edge.ratio <= edge.minimum_size: sizes[index] = edge.minimum_size # New fixed size will invalidate calculations, so we need to repeat the process break else: # Distribute flexible space and compensate for rounding error # Since edge sizes can only be integers we need to add the remainder # to the following line remainder = _Fraction(0) for index, edge in flexible_edges: size, remainder = divmod(portion * edge.ratio + remainder, 1) sizes[index] = size break # Sizes now contains integers only return cast(List[int], sizes) def ratio_reduce( total: int, ratios: List[int], maximums: List[int], values: List[int] ) -> List[int]: """Divide an integer total in to parts based on ratios. Args: total (int): The total to divide. ratios (List[int]): A list of integer ratios. maximums (List[int]): List of maximums values for each slot. values (List[int]): List of values Returns: List[int]: A list of integers guaranteed to sum to total. """ ratios = [ratio if _max else 0 for ratio, _max in zip(ratios, maximums)] total_ratio = sum(ratios) if not total_ratio: return values[:] total_remaining = total result: List[int] = [] append = result.append for ratio, maximum, value in zip(ratios, maximums, values): if ratio and total_ratio > 0: distributed = min(maximum, round(ratio * total_remaining / total_ratio)) append(value - distributed) total_remaining -= distributed total_ratio -= ratio else: append(value) return result def ratio_distribute( total: int, ratios: List[int], minimums: Optional[List[int]] = None ) -> List[int]: """Distribute an integer total in to parts based on ratios. Args: total (int): The total to divide. ratios (List[int]): A list of integer ratios. minimums (List[int]): List of minimum values for each slot. Returns: List[int]: A list of integers guaranteed to sum to total. """ if minimums: ratios = [ratio if _min else 0 for ratio, _min in zip(ratios, minimums)] total_ratio = sum(ratios) assert total_ratio > 0, "Sum of ratios must be > 0" total_remaining = total distributed_total: List[int] = [] append = distributed_total.append if minimums is None: _minimums = [0] * len(ratios) else: _minimums = minimums for ratio, minimum in zip(ratios, _minimums): if total_ratio > 0: distributed = max(minimum, ceil(ratio * total_remaining / total_ratio)) else: distributed = total_remaining append(distributed) total_ratio -= ratio total_remaining -= distributed return distributed_total if __name__ == "__main__": from dataclasses import dataclass @dataclass class E: size: Optional[int] = None ratio: int = 1 minimum_size: int = 1 resolved = ratio_resolve(110, [E(None, 1, 1), E(None, 1, 1), E(None, 1, 1)]) print(sum(resolved))
Save