urwid 2.6.15__py3-none-any.whl → 3.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of urwid might be problematic. Click here for more details.

Files changed (54) hide show
  1. urwid/__init__.py +1 -4
  2. urwid/canvas.py +27 -46
  3. urwid/command_map.py +6 -4
  4. urwid/container.py +1 -1
  5. urwid/decoration.py +1 -1
  6. urwid/display/_posix_raw_display.py +16 -4
  7. urwid/display/_raw_display_base.py +8 -5
  8. urwid/display/_win32_raw_display.py +16 -17
  9. urwid/display/common.py +26 -55
  10. urwid/display/curses.py +1 -1
  11. urwid/display/escape.py +15 -12
  12. urwid/display/lcd.py +4 -6
  13. urwid/display/web.py +7 -12
  14. urwid/event_loop/asyncio_loop.py +1 -2
  15. urwid/event_loop/main_loop.py +13 -18
  16. urwid/event_loop/tornado_loop.py +4 -5
  17. urwid/event_loop/trio_loop.py +1 -1
  18. urwid/font.py +13 -18
  19. urwid/signals.py +2 -1
  20. urwid/str_util.py +15 -18
  21. urwid/text_layout.py +6 -7
  22. urwid/util.py +7 -18
  23. urwid/version.py +9 -4
  24. urwid/vterm.py +18 -45
  25. urwid/widget/__init__.py +0 -6
  26. urwid/widget/attr_wrap.py +8 -10
  27. urwid/widget/bar_graph.py +3 -8
  28. urwid/widget/big_text.py +9 -7
  29. urwid/widget/box_adapter.py +4 -4
  30. urwid/widget/columns.py +52 -83
  31. urwid/widget/container.py +29 -75
  32. urwid/widget/edit.py +8 -8
  33. urwid/widget/filler.py +6 -6
  34. urwid/widget/frame.py +28 -37
  35. urwid/widget/grid_flow.py +25 -110
  36. urwid/widget/line_box.py +13 -0
  37. urwid/widget/listbox.py +12 -50
  38. urwid/widget/monitored_list.py +6 -4
  39. urwid/widget/overlay.py +4 -37
  40. urwid/widget/padding.py +11 -48
  41. urwid/widget/pile.py +179 -158
  42. urwid/widget/popup.py +2 -2
  43. urwid/widget/progress_bar.py +10 -11
  44. urwid/widget/scrollable.py +25 -33
  45. urwid/widget/treetools.py +27 -48
  46. urwid/widget/widget.py +7 -124
  47. urwid/widget/widget_decoration.py +4 -33
  48. urwid/wimp.py +1 -1
  49. {urwid-2.6.15.dist-info → urwid-3.0.0.dist-info}/METADATA +18 -18
  50. urwid-3.0.0.dist-info/RECORD +74 -0
  51. {urwid-2.6.15.dist-info → urwid-3.0.0.dist-info}/WHEEL +1 -1
  52. urwid-2.6.15.dist-info/RECORD +0 -74
  53. {urwid-2.6.15.dist-info → urwid-3.0.0.dist-info/licenses}/COPYING +0 -0
  54. {urwid-2.6.15.dist-info → urwid-3.0.0.dist-info}/top_level.txt +0 -0
@@ -25,8 +25,6 @@ import contextlib
25
25
  import enum
26
26
  import typing
27
27
 
28
- from typing_extensions import Protocol, runtime_checkable
29
-
30
28
  from .constants import BOX_SYMBOLS, SHADE_SYMBOLS, Sizing
31
29
  from .widget_decoration import WidgetDecoration, WidgetError
32
30
 
@@ -84,8 +82,8 @@ class ScrollbarSymbols(str, enum.Enum):
84
82
  DRAWING_DOUBLE = BOX_SYMBOLS.DOUBLE.VERTICAL
85
83
 
86
84
 
87
- @runtime_checkable
88
- class WidgetProto(Protocol):
85
+ @typing.runtime_checkable
86
+ class WidgetProto(typing.Protocol):
89
87
  """Protocol for widget.
90
88
 
91
89
  Due to protocol cannot inherit non-protocol bases, define several obligatory Widget methods.
@@ -117,8 +115,8 @@ class WidgetProto(Protocol):
117
115
  def render(self, size: tuple[int, int], focus: bool = False) -> Canvas: ...
118
116
 
119
117
 
120
- @runtime_checkable
121
- class SupportsScroll(WidgetProto, Protocol):
118
+ @typing.runtime_checkable
119
+ class SupportsScroll(WidgetProto, typing.Protocol):
122
120
  """Scroll specific methods."""
123
121
 
124
122
  def get_scrollpos(self, size: tuple[int, int], focus: bool = False) -> int: ...
@@ -126,8 +124,8 @@ class SupportsScroll(WidgetProto, Protocol):
126
124
  def rows_max(self, size: tuple[int, int] | None = None, focus: bool = False) -> int: ...
127
125
 
128
126
 
129
- @runtime_checkable
130
- class SupportsRelativeScroll(WidgetProto, Protocol):
127
+ @typing.runtime_checkable
128
+ class SupportsRelativeScroll(WidgetProto, typing.Protocol):
131
129
  """Relative scroll-specific methods."""
132
130
 
133
131
  def require_relative_scroll(self, size: tuple[int, int], focus: bool = False) -> bool: ...
@@ -140,10 +138,7 @@ class SupportsRelativeScroll(WidgetProto, Protocol):
140
138
  def orig_iter(w: Widget) -> Iterator[Widget]:
141
139
  visited = {w}
142
140
  yield w
143
- while hasattr(w, "original_widget"):
144
- w = w.original_widget
145
- if w in visited:
146
- break
141
+ while (w := getattr(w, "original_widget", w)) not in visited:
147
142
  visited.add(w)
148
143
  yield w
149
144
 
@@ -194,8 +189,8 @@ class Scrollable(WidgetDecoration[WrappedWidget]):
194
189
  first_visible = False
195
190
  for pwi, (w, _o) in enumerate(ow.contents):
196
191
  wcanv = w.render((maxcol,))
197
- wh = wcanv.rows()
198
- if wh:
192
+
193
+ if wh := wcanv.rows():
199
194
  ch += wh
200
195
 
201
196
  if not last_hidden and ch >= self._trim_top:
@@ -235,17 +230,13 @@ class Scrollable(WidgetDecoration[WrappedWidget]):
235
230
  canv = canvas.CompositeCanvas(canv_full)
236
231
  canv_cols, canv_rows = canv.cols(), canv.rows()
237
232
 
238
- if canv_cols <= maxcol:
239
- pad_width = maxcol - canv_cols
240
- if pad_width > 0:
241
- # Canvas is narrower than available horizontal space
242
- canv.pad_trim_left_right(0, pad_width)
233
+ if canv_cols <= maxcol and (pad_width := maxcol - canv_cols) > 0:
234
+ # Canvas is narrower than available horizontal space
235
+ canv.pad_trim_left_right(0, pad_width)
243
236
 
244
- if canv_rows <= maxrow:
245
- fill_height = maxrow - canv_rows
246
- if fill_height > 0:
247
- # Canvas is lower than available vertical space
248
- canv.pad_trim_top_bottom(0, fill_height)
237
+ if canv_rows <= maxrow and (fill_height := maxrow - canv_rows) > 0:
238
+ # Canvas is lower than available vertical space
239
+ canv.pad_trim_top_bottom(0, fill_height)
249
240
 
250
241
  if canv_cols <= maxcol and canv_rows <= maxrow:
251
242
  # Canvas is small enough to fit without trimming
@@ -537,7 +528,7 @@ class ScrollBar(WidgetDecoration[WrappedWidget]):
537
528
  if use_relative:
538
529
  # `operator.length_hint` is Protocol (Spec) over class based and can end false-negative on the instance
539
530
  # use length_hint-like approach with safe `AttributeError` handling
540
- ow_len = getattr(ow_base, "__len__", getattr(ow_base, "__length_hint__", lambda: 0))()
531
+ ow_len = getattr(ow_base, "__len__", getattr(ow_base, "__length_hint__", int))()
541
532
  ow_canv = render_for_scrollbar()
542
533
  visible_amount = ow_base.get_visible_amount(ow_size, focus)
543
534
  pos = ow_base.get_first_visible_pos(ow_size, focus)
@@ -552,17 +543,18 @@ class ScrollBar(WidgetDecoration[WrappedWidget]):
552
543
  use_relative = False
553
544
 
554
545
  if not use_relative:
555
- ow_rows_max = ow_base.rows_max(size, focus)
556
- if ow_rows_max <= maxrow:
546
+ if ow_base.rows_max(size, focus) > maxrow:
547
+ ow_canv = render_for_scrollbar()
548
+ # re-calculate using wrapped size
549
+ ow_rows_max = ow_base.rows_max(ow_size, focus)
550
+ pos = ow_base.get_scrollpos(ow_size, focus)
551
+ posmax = ow_rows_max - maxrow
552
+ thumb_weight = min(1.0, maxrow / max(1, ow_rows_max))
553
+
554
+ else:
557
555
  # Canvas fits without scrolling - no scrollbar needed
558
556
  return render_no_scrollbar()
559
557
 
560
- ow_canv = render_for_scrollbar()
561
- ow_rows_max = ow_base.rows_max(ow_size, focus)
562
- pos = ow_base.get_scrollpos(ow_size, focus)
563
- posmax = ow_rows_max - maxrow
564
- thumb_weight = min(1.0, maxrow / max(1, ow_rows_max))
565
-
566
558
  # Thumb shrinks/grows according to the ratio of <number of visible lines> / <number of total lines>
567
559
  thumb_height = max(1, round(thumb_weight * maxrow)) # pylint: disable=possibly-used-before-assignment
568
560
 
urwid/widget/treetools.py CHANGED
@@ -27,7 +27,6 @@ Features:
27
27
  - custom list walker for displaying widgets in a tree fashion
28
28
  """
29
29
 
30
-
31
30
  from __future__ import annotations
32
31
 
33
32
  import typing
@@ -107,8 +106,8 @@ class TreeWidget(WidgetWrap[Padding[typing.Union[Text, Columns]]]):
107
106
  def next_inorder(self) -> TreeWidget | None:
108
107
  """Return the next TreeWidget depth first from this one."""
109
108
  # first check if there's a child widget
110
- first_child = self.first_child()
111
- if first_child is not None:
109
+
110
+ if (first_child := self.first_child()) is not None:
112
111
  return first_child
113
112
 
114
113
  # now we need to hunt for the next sibling
@@ -131,24 +130,21 @@ class TreeWidget(WidgetWrap[Padding[typing.Union[Text, Columns]]]):
131
130
  def prev_inorder(self) -> TreeWidget | None:
132
131
  """Return the previous TreeWidget depth first from this one."""
133
132
  this_node = self._node
134
- prev_node = this_node.prev_sibling()
135
- if prev_node is not None:
133
+
134
+ if (prev_node := this_node.prev_sibling()) is not None:
136
135
  # we need to find the last child of the previous widget if its
137
136
  # expanded
138
137
  prev_widget = prev_node.get_widget()
139
- last_child = prev_widget.last_child()
140
- if last_child is None:
141
- return prev_widget
138
+ if (last_child := prev_widget.last_child()) is not None:
139
+ return last_child
142
140
 
143
- return last_child
141
+ return prev_widget
144
142
 
145
143
  # need to hunt for the parent
146
- depth = this_node.get_depth()
147
- if prev_node is None and depth == 0:
144
+ if this_node.get_depth() == 0:
148
145
  return None
149
- if prev_node is None:
150
- prev_node = this_node.get_parent()
151
- return prev_node.get_widget()
146
+
147
+ return this_node.get_parent().get_widget()
152
148
 
153
149
  def keypress(
154
150
  self,
@@ -212,11 +208,10 @@ class TreeWidget(WidgetWrap[Padding[typing.Union[Text, Columns]]]):
212
208
  else:
213
209
  return None
214
210
  # recursively search down for the last descendant
215
- last_descendant = last_child.last_child()
216
- if last_descendant is None:
217
- return last_child
211
+ if (last_descendant := last_child.last_child()) is not None:
212
+ return last_descendant
218
213
 
219
- return last_descendant
214
+ return last_child
220
215
 
221
216
 
222
217
  class TreeNode:
@@ -372,32 +367,18 @@ class ParentNode(TreeNode):
372
367
 
373
368
  def next_child(self, key: Hashable) -> TreeNode | None:
374
369
  """Return the next child node in index order from the given key."""
375
-
376
- index = self.get_child_index(key)
377
- # the given node may have just been deleted
378
- if index is None:
379
- return None
380
- index += 1
381
-
382
- child_keys = self.get_child_keys()
383
- if index < len(child_keys):
370
+ if (index := self.get_child_index(key)) is not None and (index + 1) < len(child_keys := self.get_child_keys()):
384
371
  # get the next item at same level
385
- return self.get_child_node(child_keys[index])
372
+ return self.get_child_node(child_keys[index + 1])
386
373
 
374
+ # the given node may have just been deleted
387
375
  return None
388
376
 
389
377
  def prev_child(self, key: Hashable) -> TreeNode | None:
390
378
  """Return the previous child node in index order from the given key."""
391
- index = self.get_child_index(key)
392
- if index is None:
393
- return None
394
-
395
- child_keys = self.get_child_keys()
396
- index -= 1
397
-
398
- if index >= 0:
399
- # get the previous item at same level
400
- return self.get_child_node(child_keys[index])
379
+ if (index := self.get_child_index(key)) is not None and index >= 1:
380
+ # get the previous item at the same level
381
+ return self.get_child_node(self.get_child_keys()[index - 1])
401
382
 
402
383
  return None
403
384
 
@@ -435,18 +416,16 @@ class TreeWalker(ListWalker):
435
416
 
436
417
  # pylint: disable=arguments-renamed # its bad, but we should not change API
437
418
  def get_next(self, start_from) -> tuple[TreeWidget, TreeNode] | tuple[None, None]:
438
- target = start_from.get_widget().next_inorder()
439
- if target is None:
440
- return None, None
419
+ if (target := start_from.get_widget().next_inorder()) is not None:
420
+ return target, target.get_node()
441
421
 
442
- return target, target.get_node()
422
+ return None, None
443
423
 
444
424
  def get_prev(self, start_from) -> tuple[TreeWidget, TreeNode] | tuple[None, None]:
445
- target = start_from.get_widget().prev_inorder()
446
- if target is None:
447
- return None, None
425
+ if (target := start_from.get_widget().prev_inorder()) is not None:
426
+ return target, target.get_node()
448
427
 
449
- return target, target.get_node()
428
+ return None, None
450
429
 
451
430
  # pylint: enable=arguments-renamed
452
431
 
@@ -525,8 +504,8 @@ class TreeListBox(ListBox):
525
504
 
526
505
  maxrow, _maxcol = size
527
506
  _widget, pos = self.body.get_focus()
528
- lastwidget = pos.get_root().get_widget().last_child()
529
- if lastwidget:
507
+
508
+ if lastwidget := pos.get_root().get_widget().last_child():
530
509
  lastnode = lastwidget.get_node()
531
510
 
532
511
  self.change_focus(size, lastnode, maxrow - 1)
urwid/widget/widget.py CHANGED
@@ -41,7 +41,7 @@ WrappedWidget = typing.TypeVar("WrappedWidget")
41
41
  LOGGER = logging.getLogger(__name__)
42
42
 
43
43
 
44
- class WidgetMeta(MetaSuper, signals.MetaSignals):
44
+ class WidgetMeta(signals.MetaSignals, MetaSuper):
45
45
  """
46
46
  Bases: :class:`MetaSuper`, :class:`MetaSignals`
47
47
 
@@ -105,8 +105,8 @@ def cache_widget_render(cls):
105
105
  @functools.wraps(fn)
106
106
  def cached_render(self, size, focus=False):
107
107
  focus = focus and not ignore_focus
108
- canv = CanvasCache.fetch(self, cls, size, focus)
109
- if canv:
108
+
109
+ if canv := CanvasCache.fetch(self, cls, size, focus):
110
110
  return canv
111
111
 
112
112
  canv = fn(self, size, focus=focus)
@@ -174,8 +174,8 @@ def cache_widget_rows(cls):
174
174
  @functools.wraps(fn)
175
175
  def cached_rows(self, size: tuple[int], focus: bool = False) -> int:
176
176
  focus = focus and not ignore_focus
177
- canv = CanvasCache.fetch(self, cls, size, focus)
178
- if canv:
177
+
178
+ if canv := CanvasCache.fetch(self, cls, size, focus):
179
179
  return canv.rows()
180
180
 
181
181
  return fn(self, size, focus)
@@ -565,133 +565,16 @@ class Widget(metaclass=WidgetMeta):
565
565
  raise NotImplementedError
566
566
 
567
567
 
568
- class FlowWidget(Widget):
569
- """
570
- Deprecated. Inherit from Widget and add:
571
-
572
- _sizing = frozenset(['flow'])
573
-
574
- at the top of your class definition instead.
575
-
576
- Base class of widgets that determine their rows from the number of
577
- columns available.
578
- """
579
-
580
- _sizing = frozenset([Sizing.FLOW])
581
-
582
- def __init__(self, *args, **kwargs):
583
- warnings.warn(
584
- """
585
- FlowWidget is deprecated. Inherit from Widget and add:
586
-
587
- _sizing = frozenset(['flow'])
588
-
589
- at the top of your class definition instead.""",
590
- DeprecationWarning,
591
- stacklevel=3,
592
- )
593
- super().__init__()
594
-
595
- def rows(self, size: tuple[int], focus: bool = False) -> int:
596
- """
597
- All flow widgets must implement this function.
598
- """
599
- raise NotImplementedError()
600
-
601
- def render(self, size: tuple[int], focus: bool = False) -> Canvas: # type: ignore[override]
602
- """
603
- All widgets must implement this function.
604
- """
605
- raise NotImplementedError()
606
-
607
-
608
- class BoxWidget(Widget):
609
- """
610
- Deprecated. Inherit from Widget and add:
611
-
612
- _sizing = frozenset(['box'])
613
- _selectable = True
614
-
615
- at the top of your class definition instead.
616
-
617
- Base class of width and height constrained widgets such as
618
- the top level widget attached to the display object
619
- """
620
-
621
- _selectable = True
622
- _sizing = frozenset([Sizing.BOX])
623
-
624
- def __init__(self, *args, **kwargs):
625
- warnings.warn(
626
- """
627
- BoxWidget is deprecated. Inherit from Widget and add:
628
-
629
- _sizing = frozenset(['box'])
630
- _selectable = True
631
-
632
- at the top of your class definition instead.""",
633
- DeprecationWarning,
634
- stacklevel=3,
635
- )
636
- super().__init__()
637
-
638
- def render(self, size: tuple[int, int], focus: bool = False) -> Canvas: # type: ignore[override]
639
- """
640
- All widgets must implement this function.
641
- """
642
- raise NotImplementedError()
643
-
644
-
645
568
  def fixed_size(size: tuple[()]) -> None:
646
569
  """
647
570
  raise ValueError if size != ().
648
571
 
649
572
  Used by FixedWidgets to test size parameter.
650
573
  """
651
- if size != ():
574
+ if size:
652
575
  raise ValueError(f"FixedWidget takes only () for size.passed: {size!r}")
653
576
 
654
577
 
655
- class FixedWidget(Widget):
656
- """
657
- Deprecated. Inherit from Widget and add:
658
-
659
- _sizing = frozenset(['fixed'])
660
-
661
- at the top of your class definition instead.
662
-
663
- Base class of widgets that know their width and height and
664
- cannot be resized
665
- """
666
-
667
- _sizing = frozenset([Sizing.FIXED])
668
-
669
- def __init__(self, *args, **kwargs):
670
- warnings.warn(
671
- """
672
- FixedWidget is deprecated. Inherit from Widget and add:
673
-
674
- _sizing = frozenset(['fixed'])
675
-
676
- at the top of your class definition instead.""",
677
- DeprecationWarning,
678
- stacklevel=3,
679
- )
680
- super().__init__()
681
-
682
- def render(self, size: tuple[()], focus: bool = False) -> Canvas: # type: ignore[override]
683
- """
684
- All widgets must implement this function.
685
- """
686
- raise NotImplementedError()
687
-
688
- def pack(self, size: tuple[()] = (), focus: bool = False) -> tuple[int, int]: # type: ignore[override]
689
- """
690
- All fixed widgets must implement this function.
691
- """
692
- raise NotImplementedError()
693
-
694
-
695
578
  def delegate_to_widget_mixin(attribute_name: str) -> type[Widget]:
696
579
  """
697
580
  Return a mixin class that delegates all standard widget methods
@@ -827,7 +710,7 @@ class WidgetWrap(delegate_to_widget_mixin("_wrapped_widget"), typing.Generic[Wra
827
710
  False
828
711
  """
829
712
  warnings.warn(
830
- "_set_w is deprecated. Please use 'WidgetWrap._w' property directly",
713
+ "_set_w is deprecated. Please use 'WidgetWrap._w' property directly. API will be removed in version 5.0.",
831
714
  DeprecationWarning,
832
715
  stacklevel=2,
833
716
  )
@@ -71,29 +71,12 @@ class WidgetDecoration(Widget, typing.Generic[WrappedWidget]): # pylint: disabl
71
71
  self._original_widget = original_widget
72
72
  self._invalidate()
73
73
 
74
- def _get_original_widget(self) -> WrappedWidget:
75
- warnings.warn(
76
- f"Method `{self.__class__.__name__}._get_original_widget` is deprecated, "
77
- f"please use property `{self.__class__.__name__}.original_widget`",
78
- DeprecationWarning,
79
- stacklevel=2,
80
- )
81
- return self.original_widget
82
-
83
- def _set_original_widget(self, original_widget: WrappedWidget) -> None:
84
- warnings.warn(
85
- f"Method `{self.__class__.__name__}._set_original_widget` is deprecated, "
86
- f"please use property `{self.__class__.__name__}.original_widget`",
87
- DeprecationWarning,
88
- stacklevel=2,
89
- )
90
- self.original_widget = original_widget
91
-
92
74
  @property
93
75
  def base_widget(self) -> Widget:
94
76
  """
95
- Return the widget without decorations. If there is only one
96
- Decoration then this is the same as original_widget.
77
+ Return the widget without decorations.
78
+
79
+ If there is only one Decoration, then this is the same as original_widget.
97
80
 
98
81
  >>> from urwid import Text
99
82
  >>> t = Text('hello')
@@ -107,22 +90,10 @@ class WidgetDecoration(Widget, typing.Generic[WrappedWidget]): # pylint: disabl
107
90
  """
108
91
  visited = {self}
109
92
  w = self
110
- while hasattr(w, "_original_widget"):
111
- w = w._original_widget
112
- if w in visited:
113
- break
93
+ while (w := getattr(w, "_original_widget", w)) not in visited:
114
94
  visited.add(w)
115
95
  return w
116
96
 
117
- def _get_base_widget(self) -> Widget:
118
- warnings.warn(
119
- f"Method `{self.__class__.__name__}._get_base_widget` is deprecated, "
120
- f"please use property `{self.__class__.__name__}.base_widget`",
121
- DeprecationWarning,
122
- stacklevel=2,
123
- )
124
- return self.base_widget
125
-
126
97
  def selectable(self) -> bool:
127
98
  return self._original_widget.selectable()
128
99
 
urwid/wimp.py CHANGED
@@ -17,7 +17,7 @@ __all__ = (
17
17
  warnings.warn(
18
18
  f"{__name__!r} is not expected to be imported directly. "
19
19
  'Please use public access from "urwid" package. '
20
- f"Module {__name__!r} is deprecated and will be removed in the future.",
20
+ f"Module {__name__!r} is deprecated and will be removed in the version 4.0.",
21
21
  DeprecationWarning,
22
22
  stacklevel=3,
23
23
  )
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: urwid
3
- Version: 2.6.15
3
+ Version: 3.0.0
4
4
  Summary: A full-featured console (xterm et al.) user interface library
5
5
  Home-page: https://urwid.org/
6
6
  Author-email: Ian Ward <ian@excess.org>
@@ -23,37 +23,38 @@ Classifier: Operating System :: Microsoft :: Windows
23
23
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
24
24
  Classifier: Topic :: Software Development :: Widget Sets
25
25
  Classifier: Programming Language :: Python :: 3
26
- Classifier: Programming Language :: Python :: 3.7
27
- Classifier: Programming Language :: Python :: 3.8
28
26
  Classifier: Programming Language :: Python :: 3.9
29
27
  Classifier: Programming Language :: Python :: 3.10
30
28
  Classifier: Programming Language :: Python :: 3.11
31
29
  Classifier: Programming Language :: Python :: 3.12
30
+ Classifier: Programming Language :: Python :: 3.13
32
31
  Classifier: Programming Language :: Python :: 3 :: Only
33
32
  Classifier: Programming Language :: Python :: Implementation :: CPython
34
33
  Classifier: Programming Language :: Python :: Implementation :: PyPy
35
34
  Requires-Python: >3.7
36
35
  Description-Content-Type: text/x-rst
37
36
  License-File: COPYING
38
- Requires-Dist: typing-extensions
39
37
  Requires-Dist: wcwidth
40
38
  Provides-Extra: curses
41
- Requires-Dist: windows-curses ; (sys_platform == "win32") and extra == 'curses'
39
+ Requires-Dist: windows-curses; sys_platform == "win32" and extra == "curses"
42
40
  Provides-Extra: glib
43
- Requires-Dist: PyGObject ; extra == 'glib'
44
- Provides-Extra: lcd
45
- Requires-Dist: pyserial ; extra == 'lcd'
46
- Provides-Extra: serial
47
- Requires-Dist: pyserial ; extra == 'serial'
41
+ Requires-Dist: PyGObject; extra == "glib"
48
42
  Provides-Extra: tornado
49
- Requires-Dist: tornado >=5.0 ; extra == 'tornado'
43
+ Requires-Dist: tornado>=5.0; extra == "tornado"
50
44
  Provides-Extra: trio
51
- Requires-Dist: trio >=0.22.0 ; extra == 'trio'
52
- Requires-Dist: exceptiongroup ; extra == 'trio'
45
+ Requires-Dist: trio>=0.22.0; extra == "trio"
46
+ Requires-Dist: exceptiongroup; extra == "trio"
53
47
  Provides-Extra: twisted
54
- Requires-Dist: twisted ; extra == 'twisted'
48
+ Requires-Dist: twisted; extra == "twisted"
55
49
  Provides-Extra: zmq
56
- Requires-Dist: zmq ; extra == 'zmq'
50
+ Requires-Dist: zmq; extra == "zmq"
51
+ Provides-Extra: serial
52
+ Requires-Dist: pyserial; extra == "serial"
53
+ Provides-Extra: lcd
54
+ Requires-Dist: pyserial; extra == "lcd"
55
+ Dynamic: home-page
56
+ Dynamic: license-file
57
+ Dynamic: requires-python
57
58
 
58
59
  Urwid
59
60
  =====
@@ -142,12 +143,11 @@ To test code in all Python versions:
142
143
  Supported Python versions
143
144
  =========================
144
145
 
145
- - 3.7
146
- - 3.8
147
146
  - 3.9
148
147
  - 3.10
149
148
  - 3.11
150
149
  - 3.12
150
+ - 3.13
151
151
  - pypy3
152
152
 
153
153
  Authors
@@ -0,0 +1,74 @@
1
+ urwid/__init__.py,sha256=t5n8QWni3FbasOyKIulm_7-Go3A0puBKiie_79rxifU,7979
2
+ urwid/canvas.py,sha256=025TShiKhFG09i-iLztlnekXunqdVkNBHG6tCV_BMPY,46092
3
+ urwid/command_map.py,sha256=UUOC11O0SlNhMiBoYqNaSAfGcg0RmjjGEgz6Xt96iA4,4369
4
+ urwid/container.py,sha256=WOodISzyS4NSs3arijXuXLsDvF1GVIn4ufcPzfxSkdA,1594
5
+ urwid/decoration.py,sha256=dwoYY0tiZS4toGgrxEAALKeVvnoDV9W-LadkV9G4CZg,1777
6
+ urwid/font.py,sha256=3xyQrJ_TA5UK176KLJGMuLZhQqCx-aIFTJhyfI3nlHg,31848
7
+ urwid/graphics.py,sha256=pVGGU5kOWV56iXawDROgQWQwIbgaoh32JHE2COcGesQ,2481
8
+ urwid/numedit.py,sha256=8z1j-JHovBGFV3yZoP1XAsedpsYjnxqR2EuK-m87hso,13374
9
+ urwid/signals.py,sha256=jxXkvZJYNxzABe99Ww_G-lVSXq_P5YB_V1ljnt3rYu4,13192
10
+ urwid/split_repr.py,sha256=pXzuddzQ4RnfIl537Gvoe8PVaBRHCPnxgdYvKK0qm8k,3899
11
+ urwid/str_util.py,sha256=oQVTyDWAIRuCsNl_jeAxX1zbldWgU58MMU3YPWKlFbA,10823
12
+ urwid/text_layout.py,sha256=EqsT64CUfP_QPTnhyVy4erEhXaCShxGqynBm6xS5qpI,22792
13
+ urwid/util.py,sha256=cZ2qtutEThZSq4FGu3DMX2Tds0CXXRghn8b8QQasR7w,15337
14
+ urwid/version.py,sha256=feOY2rjYM8_-oXmp5ErPlMe-6zWTpyiw538tUrvFyEA,511
15
+ urwid/vterm.py,sha256=vzzgf1P8M5j6uEePSEMVhQVMzqGeVnJc1L6DZCH9kRg,57744
16
+ urwid/wimp.py,sha256=CRpUWYsrCSrnTX1AH7FnBI_8EvLHHy6eypg8-zno5MI,572
17
+ urwid/display/__init__.py,sha256=y90WbHPNRHlimPrXhzsSfFsBbBHy8QErmB1y4Xza-xo,1732
18
+ urwid/display/_posix_raw_display.py,sha256=ExZHAzuJg34VNrWWVKXPZGFSApLJvJxrNh4detTEdCY,15053
19
+ urwid/display/_raw_display_base.py,sha256=IVkgFhooYFZxuzXoP4OK1J_Uo3R9rxj7pUscrtz8UJM,33586
20
+ urwid/display/_web.css,sha256=6HarEsIspH2egt51HSrgI8Yl2lGi-DbziWOdS4RHNlk,359
21
+ urwid/display/_web.js,sha256=aWEOQ4EsADsiNgdw-zHEUMCRD2bnfR8M1mu4dOc2Tqk,12947
22
+ urwid/display/_win32.py,sha256=hD4hytElpfIv5qxGNTMSa2QeBNByqJDNVpmiiQSj6CM,5401
23
+ urwid/display/_win32_raw_display.py,sha256=VL6TiUId1bI5jszxAyqrso2XBnyVIWM_GWMKvV5kbOw,9176
24
+ urwid/display/common.py,sha256=w3w5qrxMV-2pBC1_SinluMWlmRzxm82GfDf_hrz0AF4,38564
25
+ urwid/display/curses.py,sha256=Ba-CC-qC-K81ZHWyNhMm_2P4fJVbFI0kQFs0gp-SCc4,22748
26
+ urwid/display/escape.py,sha256=DRFKs9rzfzk3aGsc8S3j_BJvNdETpQZyJN8cItetoaE,17913
27
+ urwid/display/html_fragment.py,sha256=lQRqr-hTrknQyZTtzPDp9zr-TWOT4NcuSsusS-LXIOU,8547
28
+ urwid/display/lcd.py,sha256=CB-CXS6clkbNCNTwSKSnssbSK794TL59nsRA82WbR4w,17601
29
+ urwid/display/raw.py,sha256=TSkIEM6KnQHPmmpBkWKdirZOwVXhSV67k7hWmuuR2OY,1125
30
+ urwid/display/web.py,sha256=pd8PjKskTomdSSuYFRxvJo_9oefdXuN0R2UA3UpIwpg,19129
31
+ urwid/event_loop/__init__.py,sha256=6di4AYD6HbCf6v5p0rZOoteKnM9U5tfk4NKcWMH4FV4,1199
32
+ urwid/event_loop/abstract_loop.py,sha256=6Kkw3KCJ4ndiI2I1P8fPdtHzjuekRxUuvzFOiR0Myok,5494
33
+ urwid/event_loop/asyncio_loop.py,sha256=beOtalT3jwJ8klyxUxNyllqXAgst8ShBiS-8-Raq1xc,8460
34
+ urwid/event_loop/glib_loop.py,sha256=GFoLAenoWKm-13rTBKzCF2JdCEryJKpMo25aidZ7BWs,9351
35
+ urwid/event_loop/main_loop.py,sha256=KlCPzvwsrqLe289Gmznyt02rQC52xvKf70fC-rcUEHk,25989
36
+ urwid/event_loop/select_loop.py,sha256=5ZkIPqyIVJdWRTC89Ca5h8ub_-jpqXjFZaKqiWhdkDg,7534
37
+ urwid/event_loop/tornado_loop.py,sha256=WBtDVy704GeVNtyvKSJa9SMWTwbZ-SOU4QB4MBGZOXo,7100
38
+ urwid/event_loop/trio_loop.py,sha256=bizthoPnwA7KUtB0jEWWJBma5p6vKlQ-eBZcuVjx5ag,10594
39
+ urwid/event_loop/twisted_loop.py,sha256=CtpWBzxNp_y7LHejnXIS67B-iboM3irb_MuI_FtXzc0,9219
40
+ urwid/event_loop/zmq_loop.py,sha256=YK_AkfLf8tayWrpCgQtKwWYuj-F1uMBluUJxPQLagNs,9114
41
+ urwid/widget/__init__.py,sha256=CbZjvN9hrE36hmSMo5URMEm2Da75kLv_q1X7N_NKOWM,4581
42
+ urwid/widget/attr_map.py,sha256=L6svBcabtXeSaU2cNrgDv4Nne6QYk-nvVbr88sA4WnY,6205
43
+ urwid/widget/attr_wrap.py,sha256=G2LbiNGuh8NEydR7HTV1FyfOSXIfkFa9ttTeiYzPKO0,4920
44
+ urwid/widget/bar_graph.py,sha256=uXC1_yBln7OvZ6Njaker_dNU6837cV0UMONcxOkkeoI,21518
45
+ urwid/widget/big_text.py,sha256=wtRyXKwf7G8vzwCptiHYCpWZjE9jN-6e8ZwvG5Wzh6o,2412
46
+ urwid/widget/box_adapter.py,sha256=ZtL77-jg9wI7TPYbDi-AeFS0jnlTYo5eeNYri58fgKM,4336
47
+ urwid/widget/columns.py,sha256=PZF6yg5fpvVvjSfOTmfsfSTEn3TMDFNjjsfMmk7W148,45375
48
+ urwid/widget/constants.py,sha256=bNvw1OoT6jFWzDc_NDJRcle1uIX-ENswhvy2S6mIUEk,15313
49
+ urwid/widget/container.py,sha256=Cs1VycRfLfmPrvqO0xTdf4bxjJldvqXiWgGdAle2e3s,5841
50
+ urwid/widget/divider.py,sha256=cM0gWHAqBz7E8l52CGEWWDMSVQkPNDjwy-t3ptbmh2s,3251
51
+ urwid/widget/edit.py,sha256=1tZLymcilI6krofzI3EgjhQgZIohu_O4KxlLor7kYlk,23695
52
+ urwid/widget/filler.py,sha256=l8FzT6gitp7xK9cPN0f1fW1NxxAo43L_GEx1abh-LHc,14799
53
+ urwid/widget/frame.py,sha256=yVwsImuPhOuL99-9q5tTU7_x3kZ5YyRtqBOgUOyAjAw,21492
54
+ urwid/widget/grid_flow.py,sha256=sAKZv9l-a9B-9vjjqq5Z8iuoCRC1MFyRrZzUOXqzA_o,18549
55
+ urwid/widget/line_box.py,sha256=oefB0GRfDafZAOUn1t193gBYdzc6Pz2T8whYfeq5TYA,7458
56
+ urwid/widget/listbox.py,sha256=Sfp1Y6HZGDziknE-wn7eZ3GsGIgINKft8E_MINLnHuQ,73220
57
+ urwid/widget/monitored_list.py,sha256=pMhWGqt0Du97wQwuOydN-tfoba3rvnTi56BDRskUD6M,19360
58
+ urwid/widget/overlay.py,sha256=A0ypqnCtOSR_axmE0zHiUZfonY1-aRMbTiymYulYQNc,33319
59
+ urwid/widget/padding.py,sha256=zz1fy4b0hWTpEjR4uDlJnzAbm-TuiUcDWM9IusubvN0,19853
60
+ urwid/widget/pile.py,sha256=RubgdaaGcShT-w8tiXVpTTJY_xK8p83uyijv44BgejY,39705
61
+ urwid/widget/popup.py,sha256=waiQ9y7Ted2YWF5yT2Hz2I_KutvuFbeobemrdCsFdXA,5961
62
+ urwid/widget/progress_bar.py,sha256=zwiQboBvo16p18j_5u6Sd8pVmsYnjragE8Yk6cq_qfc,4616
63
+ urwid/widget/scrollable.py,sha256=K_-Ys2JagMM_wpohpbCJ4BVnSwXSUINnxD_pWjgX-MM,24423
64
+ urwid/widget/solid_fill.py,sha256=NZRDSRK0lP4r7gXcKDgVaKEoeOcWvtrY5k2aueQEEL4,1260
65
+ urwid/widget/text.py,sha256=jy15hL6rCBoJdZviq2jJ-i9eO6vEcxvzCIVAZs12AUw,12187
66
+ urwid/widget/treetools.py,sha256=NehR7ELL2vvBHIlwtRCGyTfPLdx0Uis5opufC3xNkcE,17031
67
+ urwid/widget/widget.py,sha256=uWHGpOueiDa8wJykFhR38wHV9Wg59E2lENDrWZZm9xI,26432
68
+ urwid/widget/widget_decoration.py,sha256=zqB41ytmZo8-kSp4iurx06ax-t_IEI9GLbEzn7ZdqsU,4621
69
+ urwid/widget/wimp.py,sha256=4wfzTQBLMbhicSlL64hBPb-1W5FAFrIKfb43i10MKSY,27305
70
+ urwid-3.0.0.dist-info/licenses/COPYING,sha256=NrbT-keRaUP9X-wxPFhHhJRgR-wTN6eLRA5ZkstZX4k,26434
71
+ urwid-3.0.0.dist-info/METADATA,sha256=zXgee1SlCUydSez2za1FRQgCumDaw10nOHyU6ayrbqQ,11008
72
+ urwid-3.0.0.dist-info/WHEEL,sha256=0CuiUZ_p9E4cD6NyLD6UG80LBXYyiSYZOKDm5lp32xk,91
73
+ urwid-3.0.0.dist-info/top_level.txt,sha256=AwxQA43kNkjHbhYELXHBKrQ01X5CR2KnDzU07cVqilY,6
74
+ urwid-3.0.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (70.2.0)
2
+ Generator: setuptools (80.3.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5