X7ROOT File Manager
Current Path:
/opt/alt/python38/lib/python3.8/site-packages/pip/_vendor/rich
opt
/
alt
/
python38
/
lib
/
python3.8
/
site-packages
/
pip
/
_vendor
/
rich
/
??
..
??
__init__.py
(5.8 KB)
??
__main__.py
(8.6 KB)
??
__pycache__
??
_cell_widths.py
(9.86 KB)
??
_emoji_codes.py
(136.95 KB)
??
_emoji_replace.py
(1.04 KB)
??
_export_format.py
(2.06 KB)
??
_extension.py
(265 B)
??
_inspect.py
(9.47 KB)
??
_log_render.py
(3.15 KB)
??
_loop.py
(1.21 KB)
??
_palettes.py
(6.9 KB)
??
_pick.py
(423 B)
??
_ratio.py
(5.34 KB)
??
_spinners.py
(19.45 KB)
??
_stack.py
(351 B)
??
_timer.py
(417 B)
??
_win32_console.py
(22.29 KB)
??
_windows.py
(1.88 KB)
??
_windows_renderer.py
(2.72 KB)
??
_wrap.py
(1.8 KB)
??
abc.py
(890 B)
??
align.py
(10.13 KB)
??
ansi.py
(6.66 KB)
??
bar.py
(3.19 KB)
??
box.py
(9.63 KB)
??
cells.py
(4.4 KB)
??
color.py
(17.54 KB)
??
color_triplet.py
(1.03 KB)
??
columns.py
(6.96 KB)
??
console.py
(93.64 KB)
??
constrain.py
(1.26 KB)
??
containers.py
(5.37 KB)
??
control.py
(6.47 KB)
??
default_styles.py
(7.77 KB)
??
diagnose.py
(972 B)
??
emoji.py
(2.44 KB)
??
errors.py
(642 B)
??
file_proxy.py
(1.58 KB)
??
filesize.py
(2.45 KB)
??
highlighter.py
(9.36 KB)
??
json.py
(4.93 KB)
??
jupyter.py
(3.18 KB)
??
layout.py
(13.74 KB)
??
live.py
(13.84 KB)
??
live_render.py
(3.58 KB)
??
logging.py
(11.2 KB)
??
markup.py
(8.01 KB)
??
measure.py
(5.18 KB)
??
padding.py
(4.85 KB)
??
pager.py
(828 B)
??
palette.py
(3.32 KB)
??
panel.py
(8.54 KB)
??
pretty.py
(35.72 KB)
??
progress.py
(58.35 KB)
??
progress_bar.py
(7.97 KB)
??
prompt.py
(11.04 KB)
??
protocol.py
(1.36 KB)
??
region.py
(166 B)
??
repr.py
(4.34 KB)
??
rule.py
(4.66 KB)
??
scope.py
(2.78 KB)
??
screen.py
(1.55 KB)
??
segment.py
(23.66 KB)
??
spinner.py
(4.27 KB)
??
status.py
(4.32 KB)
??
style.py
(25.63 KB)
??
styled.py
(1.23 KB)
??
syntax.py
(33.88 KB)
??
table.py
(38.59 KB)
??
terminal_theme.py
(3.29 KB)
??
text.py
(43.62 KB)
??
theme.py
(3.54 KB)
??
themes.py
(102 B)
??
traceback.py
(25.45 KB)
??
tree.py
(8.95 KB)
Editing: _ratio.py
import sys from fractions import Fraction from math import ceil from typing import cast, List, Optional, Sequence if sys.version_info >= (3, 8): from typing import Protocol else: from pip._vendor.typing_extensions import Protocol # pragma: no cover 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))
Upload File
Create Folder