urwid 2.5.0__cp312-cp312-win32.whl → 2.5.1__cp312-cp312-win32.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.

urwid/widget/grid_flow.py CHANGED
@@ -23,7 +23,7 @@ class GridFlowError(WidgetError):
23
23
  pass
24
24
 
25
25
 
26
- class GridFlow(WidgetWrap, WidgetContainerMixin, WidgetContainerListContentsMixin):
26
+ class GridFlow(WidgetWrap[Pile], WidgetContainerMixin, WidgetContainerListContentsMixin):
27
27
  """
28
28
  The GridFlow widget is a flow widget that renders all the widgets it
29
29
  contains the same width and it arranges them from left to right and top to
@@ -73,10 +73,8 @@ class GridFlow(WidgetWrap, WidgetContainerMixin, WidgetContainerListContentsMixi
73
73
  self.h_sep = h_sep
74
74
  self.v_sep = v_sep
75
75
  self.align = align
76
- self._cache_maxcol = None
77
- super().__init__(None)
78
- # set self._w to something other than None
79
- self.get_display_widget(((h_sep + cell_width) * len(self._contents),))
76
+ self._cache_maxcol = self._get_maxcol(())
77
+ super().__init__(self.generate_display_widget((self._cache_maxcol,)))
80
78
 
81
79
  def _invalidate(self) -> None:
82
80
  self._cache_maxcol = None
@@ -525,7 +523,7 @@ class GridFlow(WidgetWrap, WidgetContainerMixin, WidgetContainerListContentsMixi
525
523
  def mouse_event(
526
524
  self,
527
525
  size: tuple[int] | tuple[()],
528
- event,
526
+ event: str,
529
527
  button: int,
530
528
  col: int,
531
529
  row: int,
urwid/widget/line_box.py CHANGED
@@ -8,19 +8,22 @@ from .divider import Divider
8
8
  from .pile import Pile
9
9
  from .solid_fill import SolidFill
10
10
  from .text import Text
11
- from .widget import Widget, WidgetWrap
12
- from .widget_decoration import WidgetDecoration
11
+ from .widget_decoration import WidgetDecoration, delegate_to_widget_mixin
13
12
 
14
13
  if typing.TYPE_CHECKING:
15
14
  from typing_extensions import Literal
16
15
 
16
+ from .widget import Widget
17
17
 
18
- class LineBox(WidgetDecoration, WidgetWrap):
18
+ WrappedWidget = typing.TypeVar("WrappedWidget")
19
+
20
+
21
+ class LineBox(WidgetDecoration[WrappedWidget], delegate_to_widget_mixin("_wrapped_widget")):
19
22
  Symbols = BOX_SYMBOLS
20
23
 
21
24
  def __init__(
22
25
  self,
23
- original_widget: Widget,
26
+ original_widget: WrappedWidget,
24
27
  title: str = "",
25
28
  title_align: Literal["left", "center", "right"] | Align = Align.CENTER,
26
29
  title_attr=None,
@@ -155,15 +158,17 @@ class LineBox(WidgetDecoration, WidgetWrap):
155
158
 
156
159
  pile_widgets = []
157
160
  if top:
158
- pile_widgets.append(("flow", top))
161
+ pile_widgets.append((WHSettings.PACK, top))
159
162
  pile_widgets.append(middle)
160
- focus_pos = len(pile_widgets) - 1
161
163
  if bottom:
162
- pile_widgets.append(("flow", bottom))
163
- pile = Pile(pile_widgets, focus_item=focus_pos)
164
+ pile_widgets.append((WHSettings.PACK, bottom))
165
+
166
+ self._wrapped_widget = Pile(pile_widgets, focus_item=middle)
167
+
168
+ super().__init__(original_widget)
164
169
 
165
- WidgetDecoration.__init__(self, original_widget)
166
- WidgetWrap.__init__(self, pile)
170
+ def _w(self) -> Pile:
171
+ return self._wrapped_widget
167
172
 
168
173
  def format_title(self, text: str) -> str:
169
174
  if text:
urwid/widget/overlay.py CHANGED
@@ -801,7 +801,7 @@ class Overlay(Widget, WidgetContainerMixin, WidgetContainerListContentsMixin):
801
801
  def mouse_event(
802
802
  self,
803
803
  size: tuple[()] | tuple[int] | tuple[int, int],
804
- event,
804
+ event: str,
805
805
  button: int,
806
806
  col: int,
807
807
  row: int,
urwid/widget/padding.py CHANGED
@@ -22,7 +22,8 @@ from .widget_decoration import WidgetDecoration, WidgetError, WidgetWarning
22
22
  if typing.TYPE_CHECKING:
23
23
  from typing_extensions import Literal
24
24
 
25
- from .widget import Widget
25
+
26
+ WrappedWidget = typing.TypeVar("WrappedWidget")
26
27
 
27
28
 
28
29
  class PaddingError(WidgetError):
@@ -33,10 +34,10 @@ class PaddingWarning(WidgetWarning):
33
34
  """Padding related warnings."""
34
35
 
35
36
 
36
- class Padding(WidgetDecoration):
37
+ class Padding(WidgetDecoration[WrappedWidget]):
37
38
  def __init__(
38
39
  self,
39
- w: Widget,
40
+ w: WrappedWidget,
40
41
  align: (
41
42
  Literal["left", "center", "right"] | Align | tuple[Literal["relative", WHSettings.RELATIVE], int]
42
43
  ) = Align.LEFT,
@@ -48,7 +49,7 @@ class Padding(WidgetDecoration):
48
49
  min_width: int | None = None,
49
50
  left: int = 0,
50
51
  right: int = 0,
51
- ):
52
+ ) -> None:
52
53
  """
53
54
  :param w: a box, flow or fixed widget to pad on the left and/or right
54
55
  this widget is stored as self.original_widget
@@ -473,7 +474,7 @@ class Padding(WidgetDecoration):
473
474
  def mouse_event(
474
475
  self,
475
476
  size: tuple[()] | tuple[int] | tuple[int, int],
476
- event,
477
+ event: str,
477
478
  button: int,
478
479
  x: int,
479
480
  y: int,
urwid/widget/pile.py CHANGED
@@ -5,6 +5,7 @@ import warnings
5
5
  from itertools import chain, repeat
6
6
 
7
7
  from urwid.canvas import CanvasCombine, CompositeCanvas, SolidCanvas
8
+ from urwid.command_map import Command
8
9
  from urwid.monitored_list import MonitoredFocusList, MonitoredList
9
10
  from urwid.util import is_mouse_press
10
11
 
@@ -852,7 +853,9 @@ class Pile(Widget, WidgetContainerMixin, WidgetContainerListContentsMixin):
852
853
 
853
854
  def keypress(self, size: tuple[()] | tuple[int] | tuple[int, int], key: str) -> str | None:
854
855
  """Pass the keypress to the widget in focus.
855
- Unhandled 'up' and 'down' keys may cause a focus change."""
856
+
857
+ Unhandled 'up' and 'down' keys may cause a focus change.
858
+ """
856
859
  if not self.contents:
857
860
  return key
858
861
 
@@ -860,10 +863,10 @@ class Pile(Widget, WidgetContainerMixin, WidgetContainerListContentsMixin):
860
863
  _widths, heights, size_args = self.get_rows_sizes(size, focus=self.selectable())
861
864
  if self.selectable():
862
865
  key = self.focus.keypress(size_args[i], key)
863
- if self._command_map[key] not in {"cursor up", "cursor down"}:
866
+ if self._command_map[key] not in {Command.UP, Command.DOWN}:
864
867
  return key
865
868
 
866
- if self._command_map[key] == "cursor up":
869
+ if self._command_map[key] == Command.UP:
867
870
  candidates = tuple(range(i - 1, -1, -1)) # count backwards to 0
868
871
  else: # self._command_map[key] == 'cursor down'
869
872
  candidates = tuple(range(i + 1, len(self.contents)))
@@ -878,7 +881,7 @@ class Pile(Widget, WidgetContainerMixin, WidgetContainerListContentsMixin):
878
881
  return None
879
882
 
880
883
  rows = heights[j]
881
- if self._command_map[key] == "cursor up":
884
+ if self._command_map[key] == Command.UP:
882
885
  rowlist = tuple(range(rows - 1, -1, -1))
883
886
  else: # self._command_map[key] == 'cursor down'
884
887
  rowlist = tuple(range(rows))
@@ -934,14 +937,14 @@ class Pile(Widget, WidgetContainerMixin, WidgetContainerListContentsMixin):
934
937
  def mouse_event(
935
938
  self,
936
939
  size: tuple[()] | tuple[int] | tuple[int, int],
937
- event,
940
+ event: str,
938
941
  button: int,
939
942
  col: int,
940
943
  row: int,
941
944
  focus: bool,
942
945
  ) -> bool | None:
943
- """
944
- Pass the event to the contained widget.
946
+ """Pass the event to the contained widget.
947
+
945
948
  May change focus on button 1 press.
946
949
  """
947
950
  wrow = 0
urwid/widget/popup.py CHANGED
@@ -34,13 +34,15 @@ if typing.TYPE_CHECKING:
34
34
 
35
35
  from .widget import Widget
36
36
 
37
+ WrappedWidget = typing.TypeVar("WrappedWidget")
37
38
 
38
- class PopUpLauncher(delegate_to_widget_mixin("_original_widget"), WidgetDecoration):
39
- def __init__(self, original_widget: Widget) -> None:
39
+
40
+ class PopUpLauncher(delegate_to_widget_mixin("_original_widget"), WidgetDecoration[WrappedWidget]):
41
+ def __init__(self, original_widget: [WrappedWidget]) -> None:
40
42
  super().__init__(original_widget)
41
43
  self._pop_up_widget = None
42
44
 
43
- def create_pop_up(self):
45
+ def create_pop_up(self) -> Widget:
44
46
  """
45
47
  Subclass must override this method and return a widget
46
48
  to be used for the pop-up. This method is called once each time
@@ -74,13 +76,13 @@ class PopUpLauncher(delegate_to_widget_mixin("_original_widget"), WidgetDecorati
74
76
  return canv
75
77
 
76
78
 
77
- class PopUpTarget(WidgetDecoration):
79
+ class PopUpTarget(WidgetDecoration[WrappedWidget]):
78
80
  # FIXME: this whole class is a terrible hack and must be fixed
79
81
  # when layout and rendering are separated
80
82
  _sizing = frozenset((Sizing.BOX,))
81
83
  _selectable = True
82
84
 
83
- def __init__(self, original_widget: Widget) -> None:
85
+ def __init__(self, original_widget: WrappedWidget) -> None:
84
86
  super().__init__(original_widget)
85
87
  self._pop_up = None
86
88
  self._current_widget = self._original_widget
@@ -132,7 +134,15 @@ class PopUpTarget(WidgetDecoration):
132
134
  self._update_overlay(size, True)
133
135
  return self._current_widget.move_cursor_to_coords(size, x, y)
134
136
 
135
- def mouse_event(self, size: tuple[int, int], event, button: int, x: int, y: int, focus: bool) -> bool | None:
137
+ def mouse_event(
138
+ self,
139
+ size: tuple[int, int],
140
+ event: str,
141
+ button: int,
142
+ x: int,
143
+ y: int,
144
+ focus: bool,
145
+ ) -> bool | None:
136
146
  self._update_overlay(size, focus)
137
147
  return self._current_widget.mouse_event(size, event, button, x, y, focus)
138
148
 
@@ -95,7 +95,7 @@ class ProgressBar(Widget):
95
95
  )
96
96
  self.done = done
97
97
 
98
- def rows(self, size, focus: bool = False) -> int:
98
+ def rows(self, size: tuple[int], focus: bool = False) -> int:
99
99
  return 1
100
100
 
101
101
  def get_text(self) -> str:
@@ -43,6 +43,9 @@ if typing.TYPE_CHECKING:
43
43
  __all__ = ("ScrollbarSymbols", "ScrollBar", "Scrollable", "ScrollableError")
44
44
 
45
45
 
46
+ WrappedWidget = typing.TypeVar("WrappedWidget")
47
+
48
+
46
49
  class ScrollableError(WidgetError):
47
50
  """Scrollable specific widget errors."""
48
51
 
@@ -119,14 +122,14 @@ class SupportsScroll(Protocol):
119
122
  def rows_max(self, size: tuple[int, int] | None = None, focus: bool = False) -> int: ...
120
123
 
121
124
 
122
- class Scrollable(WidgetDecoration):
125
+ class Scrollable(WidgetDecoration[WrappedWidget]):
123
126
  def sizing(self) -> frozenset[Sizing]:
124
127
  return frozenset((Sizing.BOX,))
125
128
 
126
129
  def selectable(self) -> bool:
127
130
  return True
128
131
 
129
- def __init__(self, widget: Widget, force_forward_keypress: bool = False) -> None:
132
+ def __init__(self, widget: WrappedWidget, force_forward_keypress: bool = False) -> None:
130
133
  """Box widget that makes a fixed or flow widget vertically scrollable
131
134
 
132
135
  .. note::
@@ -420,7 +423,7 @@ class Scrollable(WidgetDecoration):
420
423
  return self._rows_max_cached
421
424
 
422
425
 
423
- class ScrollBar(WidgetDecoration):
426
+ class ScrollBar(WidgetDecoration[WrappedWidget]):
424
427
  Symbols = ScrollbarSymbols
425
428
 
426
429
  def sizing(self):
@@ -431,7 +434,7 @@ class ScrollBar(WidgetDecoration):
431
434
 
432
435
  def __init__(
433
436
  self,
434
- widget: SupportsScroll,
437
+ widget: WrappedWidget,
435
438
  thumb_char: str = ScrollbarSymbols.FULL_BLOCK,
436
439
  trough_char: str = " ",
437
440
  side: Literal["left", "right"] = SCROLLBAR_RIGHT,
@@ -2,7 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  from urwid.canvas import SolidCanvas
4
4
 
5
- from .constants import Sizing
5
+ from .constants import SHADE_SYMBOLS, Sizing
6
6
  from .widget import Widget
7
7
 
8
8
 
@@ -15,6 +15,8 @@ class SolidFill(Widget):
15
15
  ignore_focus = True
16
16
  _sizing = frozenset([Sizing.BOX])
17
17
 
18
+ Symbols = SHADE_SYMBOLS
19
+
18
20
  def __init__(self, fill_char: str = " ") -> None:
19
21
  """
20
22
  :param fill_char: character to fill area with
urwid/widget/text.py CHANGED
@@ -294,7 +294,7 @@ class Text(Widget):
294
294
  self._update_cache_translation(maxcol, ta)
295
295
  return self._cache_translation
296
296
 
297
- def _update_cache_translation(self, maxcol: int, ta):
297
+ def _update_cache_translation(self, maxcol: int, ta) -> None:
298
298
  if ta:
299
299
  text, _attr = ta
300
300
  else:
urwid/widget/widget.py CHANGED
@@ -37,7 +37,7 @@ from .constants import Sizing
37
37
  if typing.TYPE_CHECKING:
38
38
  from collections.abc import Callable, Hashable
39
39
 
40
-
40
+ WrappedWidget = typing.TypeVar("WrappedWidget")
41
41
  LOGGER = logging.getLogger(__name__)
42
42
 
43
43
 
@@ -172,7 +172,7 @@ def cache_widget_rows(cls):
172
172
  fn = cls.rows
173
173
 
174
174
  @functools.wraps(fn)
175
- def cached_rows(self, size, focus=False):
175
+ def cached_rows(self, size: tuple[int], focus: bool = False) -> int:
176
176
  focus = focus and not ignore_focus
177
177
  canv = CanvasCache.fetch(self, cls, size, focus)
178
178
  if canv:
@@ -455,7 +455,7 @@ class Widget(metaclass=WidgetMeta):
455
455
  """
456
456
  return split_repr(self)
457
457
 
458
- def _repr_words(self):
458
+ def _repr_words(self) -> list[str]:
459
459
  words = []
460
460
  if self.selectable():
461
461
  words = ["selectable", *words]
@@ -766,8 +766,8 @@ class WidgetWrapError(Exception):
766
766
  pass
767
767
 
768
768
 
769
- class WidgetWrap(delegate_to_widget_mixin("_wrapped_widget")):
770
- def __init__(self, w: Widget):
769
+ class WidgetWrap(delegate_to_widget_mixin("_wrapped_widget"), typing.Generic[WrappedWidget]):
770
+ def __init__(self, w: WrappedWidget) -> None:
771
771
  """
772
772
  w -- widget to wrap, stored as self._w
773
773
 
@@ -792,11 +792,11 @@ class WidgetWrap(delegate_to_widget_mixin("_wrapped_widget")):
792
792
  self._wrapped_widget = w
793
793
 
794
794
  @property
795
- def _w(self) -> Widget:
795
+ def _w(self) -> WrappedWidget:
796
796
  return self._wrapped_widget
797
797
 
798
798
  @_w.setter
799
- def _w(self, new_widget: Widget) -> None:
799
+ def _w(self, new_widget: WrappedWidget) -> None:
800
800
  """
801
801
  Change the wrapped widget. This is meant to be called
802
802
  only by subclasses.
@@ -816,7 +816,7 @@ class WidgetWrap(delegate_to_widget_mixin("_wrapped_widget")):
816
816
  self._wrapped_widget = new_widget
817
817
  self._invalidate()
818
818
 
819
- def _set_w(self, w):
819
+ def _set_w(self, w: WrappedWidget) -> None:
820
820
  """
821
821
  Change the wrapped widget. This is meant to be called
822
822
  only by subclasses.
@@ -13,10 +13,19 @@ if typing.TYPE_CHECKING:
13
13
  from .constants import Sizing
14
14
 
15
15
 
16
- __all__ = ("WidgetDecoration", "WidgetDisable", "WidgetError", "WidgetPlaceholder", "WidgetWarning")
16
+ __all__ = (
17
+ "WidgetDecoration",
18
+ "WidgetDisable",
19
+ "WidgetError",
20
+ "WidgetPlaceholder",
21
+ "WidgetWarning",
22
+ "delegate_to_widget_mixin",
23
+ )
17
24
 
25
+ WrappedWidget = typing.TypeVar("WrappedWidget")
18
26
 
19
- class WidgetDecoration(Widget): # "decorator" was already taken
27
+
28
+ class WidgetDecoration(Widget, typing.Generic[WrappedWidget]): # "decorator" was already taken
20
29
  """
21
30
  original_widget -- the widget being decorated
22
31
 
@@ -34,7 +43,7 @@ class WidgetDecoration(Widget): # "decorator" was already taken
34
43
  <WidgetDecoration fixed/flow widget <Text fixed/flow widget 'hi'>>
35
44
  """
36
45
 
37
- def __init__(self, original_widget: Widget) -> None:
46
+ def __init__(self, original_widget: WrappedWidget) -> None:
38
47
  # TODO(Aleksei): reduce amount of multiple inheritance usage
39
48
  # Special case: subclasses with multiple inheritance causes `super` call wrong way
40
49
  # Call parent __init__ explicit
@@ -48,19 +57,19 @@ class WidgetDecoration(Widget): # "decorator" was already taken
48
57
  )
49
58
  self._original_widget = original_widget
50
59
 
51
- def _repr_words(self):
60
+ def _repr_words(self) -> list[str]:
52
61
  return [*super()._repr_words(), repr(self._original_widget)]
53
62
 
54
63
  @property
55
- def original_widget(self) -> Widget:
64
+ def original_widget(self) -> WrappedWidget:
56
65
  return self._original_widget
57
66
 
58
67
  @original_widget.setter
59
- def original_widget(self, original_widget: Widget) -> None:
68
+ def original_widget(self, original_widget: WrappedWidget) -> None:
60
69
  self._original_widget = original_widget
61
70
  self._invalidate()
62
71
 
63
- def _get_original_widget(self) -> Widget:
72
+ def _get_original_widget(self) -> WrappedWidget:
64
73
  warnings.warn(
65
74
  f"Method `{self.__class__.__name__}._get_original_widget` is deprecated, "
66
75
  f"please use property `{self.__class__.__name__}.original_widget`",
@@ -69,7 +78,7 @@ class WidgetDecoration(Widget): # "decorator" was already taken
69
78
  )
70
79
  return self.original_widget
71
80
 
72
- def _set_original_widget(self, original_widget):
81
+ def _set_original_widget(self, original_widget: WrappedWidget) -> None:
73
82
  warnings.warn(
74
83
  f"Method `{self.__class__.__name__}._set_original_widget` is deprecated, "
75
84
  f"please use property `{self.__class__.__name__}.original_widget`",
@@ -99,7 +108,7 @@ class WidgetDecoration(Widget): # "decorator" was already taken
99
108
  w = w._original_widget
100
109
  return w
101
110
 
102
- def _get_base_widget(self):
111
+ def _get_base_widget(self) -> Widget:
103
112
  warnings.warn(
104
113
  f"Method `{self.__class__.__name__}._get_base_widget` is deprecated, "
105
114
  f"please use property `{self.__class__.__name__}.base_widget`",
@@ -115,7 +124,7 @@ class WidgetDecoration(Widget): # "decorator" was already taken
115
124
  return self._original_widget.sizing()
116
125
 
117
126
 
118
- class WidgetPlaceholder(delegate_to_widget_mixin("_original_widget"), WidgetDecoration):
127
+ class WidgetPlaceholder(delegate_to_widget_mixin("_original_widget"), WidgetDecoration[WrappedWidget]):
119
128
  """
120
129
  This is a do-nothing decoration widget that can be used for swapping
121
130
  between widgets without modifying the container of this widget.
@@ -130,7 +139,7 @@ class WidgetPlaceholder(delegate_to_widget_mixin("_original_widget"), WidgetDeco
130
139
  pass
131
140
 
132
141
 
133
- class WidgetDisable(WidgetDecoration):
142
+ class WidgetDisable(WidgetDecoration[WrappedWidget]):
134
143
  """
135
144
  A decoration widget that disables interaction with the widget it
136
145
  wraps. This widget always passes focus=False to the wrapped widget,
@@ -143,7 +152,7 @@ class WidgetDisable(WidgetDecoration):
143
152
  def selectable(self) -> Literal[False]:
144
153
  return False
145
154
 
146
- def rows(self, size, focus: bool = False) -> int:
155
+ def rows(self, size: tuple[int], focus: bool = False) -> int:
147
156
  return self._original_widget.rows(size, False)
148
157
 
149
158
  def sizing(self) -> frozenset[Sizing]:
urwid/widget/wimp.py CHANGED
@@ -134,7 +134,7 @@ class CheckBoxError(WidgetError):
134
134
  pass
135
135
 
136
136
 
137
- class CheckBox(WidgetWrap):
137
+ class CheckBox(WidgetWrap[Columns]):
138
138
  states: typing.ClassVar[dict[bool | Literal["mixed"], SelectableIcon]] = {
139
139
  True: SelectableIcon("[X]", 1),
140
140
  False: SelectableIcon("[ ]", 1),
@@ -430,7 +430,7 @@ class CheckBox(WidgetWrap):
430
430
  elif self.state == "mixed":
431
431
  self.set_state(False)
432
432
 
433
- def mouse_event(self, size: tuple[int], event, button: int, x: int, y: int, focus: bool) -> bool:
433
+ def mouse_event(self, size: tuple[int], event: str, button: int, x: int, y: int, focus: bool) -> bool:
434
434
  """
435
435
  Toggle state on button 1 press.
436
436
 
@@ -593,7 +593,7 @@ class RadioButton(CheckBox):
593
593
  self.set_state(True)
594
594
 
595
595
 
596
- class Button(WidgetWrap):
596
+ class Button(WidgetWrap[Columns]):
597
597
  button_left = Text("<")
598
598
  button_right = Text(">")
599
599
 
@@ -754,7 +754,7 @@ class Button(WidgetWrap):
754
754
  self._emit("click")
755
755
  return None
756
756
 
757
- def mouse_event(self, size: tuple[int], event, button: int, x: int, y: int, focus: bool) -> bool:
757
+ def mouse_event(self, size: tuple[int], event: str, button: int, x: int, y: int, focus: bool) -> bool:
758
758
  """
759
759
  Send 'click' signal on button 1 press.
760
760
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: urwid
3
- Version: 2.5.0
3
+ Version: 2.5.1
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>
@@ -56,7 +56,7 @@ Requires-Dist: zmq ; extra == 'zmq'
56
56
 
57
57
  Urwid
58
58
  =====
59
- |pypi| |docs| |ci| |coveralls|
59
+ |pypi| |docs| |gitter| |ci| |coveralls|
60
60
 
61
61
  About
62
62
  =====
@@ -314,6 +314,10 @@ Contributors
314
314
  :alt: Documentation Status
315
315
  :target: https://urwid.org
316
316
 
317
+ .. |gitter| image:: https://img.shields.io/gitter/room/urwid/community
318
+ :alt: Gitter
319
+ :target: https://gitter.im/urwid/community
320
+
317
321
  .. |ci| image:: https://github.com/urwid/urwid/actions/workflows/pythonpackage.yml/badge.svg?branch=master
318
322
  :target: https://github.com/urwid/urwid/actions
319
323
  :alt: CI status
@@ -1,6 +1,6 @@
1
1
  urwid/__init__.py,sha256=TPZoQfunkUROBnDjzoY7Tmhj5k1v0rL74IgK7IbJcNc,8331
2
- urwid/canvas.py,sha256=_2jfQduZFWcsZcRhfI5T81ePL1E5vKcfz0m17mAeUYg,47530
3
- urwid/command_map.py,sha256=UaJCUbrUW57eQY-De4tft3jqtYNeii5vXUYe04fr_Ds,4317
2
+ urwid/canvas.py,sha256=6JHe2v6xJFvyMVvSMBBTrqxaUzDY9RmB_coWavd7M74,47938
3
+ urwid/command_map.py,sha256=7IUTnSGS6Pi5WV3uJh_SJj-0kSOQznssqS027H7ZjkA,4411
4
4
  urwid/container.py,sha256=PrgT28jXiuT8xmjnNeQ2ZsX0SUui-NMoNXutXGUWjZU,1648
5
5
  urwid/decoration.py,sha256=FSn-is91LbdbN6zE3D8Q8OS1JYRpyB1VpmBbyEn32Us,1837
6
6
  urwid/font.py,sha256=itOZrpaWCFKP5TherpuzkepbH7879LxNtFOYVAYZ0EI,32631
@@ -12,20 +12,20 @@ urwid/numedit.py,sha256=OyWjdTZQBJhAEiGd0iE9OBGbOuHuuhkEeQQo0HyaDBU,13693
12
12
  urwid/old_str_util.py,sha256=3XSLH6ZtG2A6Arsd2uGtKvHaK7u6xYzuWqpjPQTo1XA,11873
13
13
  urwid/signals.py,sha256=a3PMBTZZroFL1N_it9Ww6JdeCt1fuoKPp53O9cBxDfA,13512
14
14
  urwid/split_repr.py,sha256=O9fIlyQ_o-JF8JS_rWfs1v5_IWk_zUL4YhcqjIodqf8,4029
15
- urwid/str_util.pyd,sha256=4AKNqQvyn1onjwFIIftf99_ORToZyCzHKGASjYjnZ1E,15872
15
+ urwid/str_util.pyd,sha256=9YS1-BxKJioa1e7LrHa1rOsB5wSGTkmUc5XRNvGDRBE,15872
16
16
  urwid/text_layout.py,sha256=UVrWI4MUQZFh1CdtIMuombplKcpvkP__pkjVFtek-tM,19749
17
17
  urwid/treetools.py,sha256=n3NhKhNXeUpK-Cx0UIORU9oPKle0vbd8wRZKASbvBj0,16021
18
18
  urwid/util.py,sha256=fqbVa1sQQU36rdJxFjQ5mpGwHP3qtl2200QZ7EL3Fn0,16249
19
- urwid/version.py,sha256=ePeM2lATfB4GaSyIKvBj7or99dTdlpmnbXcELZ9r-U8,427
20
- urwid/vterm.py,sha256=UwXxXbD-4soamDu8_tmt9BLZF0q4PuV5ZIUMUL7wLEw,59780
19
+ urwid/version.py,sha256=VmH1ygdsGBfrRYSzC_oT5UH9icFjENCi7HUxJD1lGOU,427
20
+ urwid/vterm.py,sha256=qd7iV2sv8n46G2jKF8yUPQ-KsCQ8wR4fKgb6M0t-oYA,59840
21
21
  urwid/wimp.py,sha256=NUT61M_tJJFwX2REUa1SyIj91BIdGDseyYNQwbRyhwI,590
22
22
  urwid/display/__init__.py,sha256=Zzc-g4vAwjCA5rtv4cI2oheX_AvTtZm1ETNkpYAko5A,1829
23
- urwid/display/_posix_raw_display.py,sha256=hVYFicWm_5NEL71iuK4J9JtbKofP_iPxpPhMameC5tw,14515
24
- urwid/display/_raw_display_base.py,sha256=RPC9b0sg8upl4Xlxaoqpo5ST-Vudz_Yl3Or0ZuuJiUw,33180
23
+ urwid/display/_posix_raw_display.py,sha256=DriDtgxa-xa5byySzAIbHwSSBwo7iZy8J4opbvJaNZ8,14864
24
+ urwid/display/_raw_display_base.py,sha256=swB4LQermtlVc8RNPSLgK4cFt7M5AtZTxg8mHptZ3jY,33347
25
25
  urwid/display/_web.css,sha256=Bu_r90b-HqcS8lV_LTa08F3cJuUvTW_vP7OR6LgNJhQ,371
26
26
  urwid/display/_web.js,sha256=ZFTx-WYBGII2JHvc4WcRocgvhg217i3JC7FndAyBJE4,13409
27
27
  urwid/display/_win32.py,sha256=ZbzMi_JcpAf2NKPD7JyhFPILbEEJWsmXc9cUjRoh2D8,5572
28
- urwid/display/_win32_raw_display.py,sha256=WG9g1OhcYo5rfJA8eKkDRit8Rwx3qxpibqbAmJkRYEs,9145
28
+ urwid/display/_win32_raw_display.py,sha256=7g3lTSAgXt6GOwm6U8kTstbe7zk_tUGUc-O31TWNEcw,9494
29
29
  urwid/display/common.py,sha256=KwH9b7Scey8YTEU-SMYcV96QrsLuhUgTnM3umvUX5TU,40669
30
30
  urwid/display/curses.py,sha256=Uew0_5OACPmLs4okfs1w7zBRM92wtMitTJHslOspJnE,23164
31
31
  urwid/display/escape.py,sha256=QzUWFKCX4WOJ_NdLJmF6mCWqsu_Zvf0qlt0a_pVRBys,18639
@@ -44,33 +44,33 @@ urwid/event_loop/trio_loop.py,sha256=H_DxlPmH73WBukCP20Pux0rIuMYsLnpkaBvSw6rMILA
44
44
  urwid/event_loop/twisted_loop.py,sha256=4tuJBbhaZw3uBg6EK7WfzQRzcVXSE5ysDiE3YqJnFEY,9150
45
45
  urwid/event_loop/zmq_loop.py,sha256=dBZ3jLcs1TDh7DzbN8cVXIHMqywiK59nzT0yp2ohY6k,9133
46
46
  urwid/widget/__init__.py,sha256=-30CgnCmCHBGhQqFrWOsRGQaAhBcQf4tR2WYKCqpem8,4263
47
- urwid/widget/attr_map.py,sha256=IRLScRroQSVqZ_pKaLcwV_FA3aV6_hepKpbn8lRDOVs,6132
47
+ urwid/widget/attr_map.py,sha256=P1lm7Wp_1iSctuW-yYe9yrvyL4RcavqxTfSPOm0DUfU,6197
48
48
  urwid/widget/attr_wrap.py,sha256=w8svXy5pJIcOBi_YrvIu2J_jbYowF9R4ETsmrsDJFac,4860
49
- urwid/widget/bar_graph.py,sha256=5GOLtFspd7Pf50iODq_jUmZNih3liw1H3LmqdW8YT7w,21981
49
+ urwid/widget/bar_graph.py,sha256=OgGthQmNTRBB4b7cvOu_5U9RrpzvpB4EGoBg4mrL-BU,22105
50
50
  urwid/widget/big_text.py,sha256=_uEBamRAsyHAMihstsIEshquLW0MhxR9BGZshJIsrfU,2269
51
- urwid/widget/box_adapter.py,sha256=Deu2EkVbXhNFtGRIuqfcUBoLdSDjip30SgVeWnJoyCI,4200
52
- urwid/widget/columns.py,sha256=T-Gfnj_1OGVwx7_lNEqhh3bxCzkPvBGy9TivDRYidGk,44071
51
+ urwid/widget/box_adapter.py,sha256=FgBy0xPDcym8HW6rUoKZeQojPW-gsZ-wkSxZwcfiOAw,4261
52
+ urwid/widget/columns.py,sha256=3xqKGwZEPFsDCWAtUYifw-jsdlWssz-cKO_gbg6nUdY,44306
53
53
  urwid/widget/constants.py,sha256=k3pw6MOwrAeQ_WQ-dfN6eulS_7KEzfwk04rNPY36EB4,16212
54
54
  urwid/widget/container.py,sha256=-q058gyrcotVwt95GugT4uP9Uo5e3b7yKB_70n6mjak,7368
55
- urwid/widget/divider.py,sha256=5wvkvUbL1sL1Onc-NDu4AY7fdnK84BrNVi9t9JVIuFc,3272
56
- urwid/widget/edit.py,sha256=6U-I_ClZYKEDQialDib32p7uXdHoeccNRExs76ZSxYg,24034
57
- urwid/widget/filler.py,sha256=NF85X4MIWrGFQ7WwddZOCxzXeiygluM954I9n1IK17o,14842
58
- urwid/widget/frame.py,sha256=RmiFIcfVz5XwGv5GbMlyYelkR58zBkd_fzpAR_8Uvf8,19634
59
- urwid/widget/grid_flow.py,sha256=IIMADYkibXIMHfaXnlbOGnE-5wLuVO9rOcW7twqeMnM,20379
60
- urwid/widget/line_box.py,sha256=wTB5z_xlIMmtiQ_mpLqKgH7XTGyd_eJw7NvtmOjdAF8,6937
61
- urwid/widget/overlay.py,sha256=mY9ZL-K-0W2YO1mADxVHGvZrVMcoFp6ONTLYu-v4DfQ,31370
62
- urwid/widget/padding.py,sha256=Pncm1ukK-xP5kSjw48Q0MDeHl5Iw6KD1xduEdg0POE4,21052
63
- urwid/widget/pile.py,sha256=jIlEefdcdaVzssApB-Er0YRyiPLvITkUY70QwN-1HUs,36951
64
- urwid/widget/popup.py,sha256=WrIT5-pRD-mb9JnhDdPJldgcNDWBNlbETbZT2COHj_w,5580
65
- urwid/widget/progress_bar.py,sha256=CyuyWWzs2OGAwp3XDFfCgBiSMAfGY2sbv29dag4JGOY,4814
66
- urwid/widget/scrollable.py,sha256=J-3ToS2dugqA0ALu_y20PgDx-0dquTeL9V1tiZJ5mrQ,22293
67
- urwid/widget/solid_fill.py,sha256=-jqp3zyVWhX_ijvcputO8m81oihvKr5SpQytbD3-eG4,1201
68
- urwid/widget/text.py,sha256=pBMmuPsOBRmxzZ7p0Y1EbXAME_yDzMnFvoy32bsmNog,11801
69
- urwid/widget/widget.py,sha256=Mnkjjmhroo9nnzduaEd3xnFh7FKVaFO4gof0IRJ7MgQ,30067
70
- urwid/widget/widget_decoration.py,sha256=-7KHel1yLSeM1f94Oot1VQdh7gwFE7CgJ4d2ZAYLmko,5414
71
- urwid/widget/wimp.py,sha256=f1grRmWKT1Suq7LsjRZ5-3U2CpvVdy1dJhytFC0RceI,27004
72
- urwid-2.5.0.dist-info/COPYING,sha256=0u_In7t1M1cqRy004HlklRgQo6T40xWezC3KoUUsXCY,26938
73
- urwid-2.5.0.dist-info/METADATA,sha256=psulWcb8UN2etn4Z_3RF-qLBQJLqGjajRJ8HzOKgTLc,11017
74
- urwid-2.5.0.dist-info/WHEEL,sha256=Q5m5OU7k24Q9oJcD9pbryDsMdvQYL1N4fomXgd4i1qg,98
75
- urwid-2.5.0.dist-info/top_level.txt,sha256=AwxQA43kNkjHbhYELXHBKrQ01X5CR2KnDzU07cVqilY,6
76
- urwid-2.5.0.dist-info/RECORD,,
55
+ urwid/widget/divider.py,sha256=h_ithPFtHtnSkmXNkUyrvgAN6WuIRhwfBK9R_b2jB-4,3304
56
+ urwid/widget/edit.py,sha256=uZcwFB7-onONytOZQo8YIh-EDcnHgwy9V1Udq-5Zn5A,24039
57
+ urwid/widget/filler.py,sha256=BnKAQEjFDDwZRcDwF-IIQaf2LBhZB2XeStaQYHA_Uy8,14963
58
+ urwid/widget/frame.py,sha256=KRd3nd_bAUG4uuoIdVtC0XSgTsReTrC-kLlnHLswKN4,19710
59
+ urwid/widget/grid_flow.py,sha256=6kDjOImxoOo_89MEGtm6v3i30Qtls_bKbqsQIwdKQ80,20321
60
+ urwid/widget/line_box.py,sha256=KwE_VOZPS78g19I2pWtbrX5IIJGV992kJ1QufeII43w,7063
61
+ urwid/widget/overlay.py,sha256=JyCQAIvF6m3LZecMa3rZSWrRqp9T4nGV1aRV32BEqzE,31375
62
+ urwid/widget/padding.py,sha256=qN_JmzdlczzNXUS9AjLn3Lb2KEVK4G2BHzRKt_0fluE,21106
63
+ urwid/widget/pile.py,sha256=QvdbkJR6XoJpZRTYFiVidH3QUaVP98PShE0-KoOsvYA,36995
64
+ urwid/widget/popup.py,sha256=Ehs0g8VU_e1fzD-NqqViu0CXQ9kPxSRlbCCN4Gu0Ojo,5763
65
+ urwid/widget/progress_bar.py,sha256=oA8tOxnrI2daEWseJrFLUSvpYuS4aMbAaxPBg-g4pL0,4826
66
+ urwid/widget/scrollable.py,sha256=r7BXK1KDpq9js6yWP67WzyYQhGi1rrWEJHrpuzNQ3BQ,22382
67
+ urwid/widget/solid_fill.py,sha256=jjwTnjcxWli-3pAuCImPjXUzDIaCIPxn_La9QbKl6hQ,1247
68
+ urwid/widget/text.py,sha256=5Wdahn9ob9Fe3EF7wMymVWY5ruHFBL0Xtfc-WloHnWA,11809
69
+ urwid/widget/widget.py,sha256=GxVrvcrJpGk1mffGMf9vyK23prLVa3BRufxOKM-zZp4,30237
70
+ urwid/widget/widget_decoration.py,sha256=uYhbtwiOPsc9SEdzJ_I-mGOuzLYoqSUk5iP9tqoqaU8,5674
71
+ urwid/widget/wimp.py,sha256=4zseWfSus_Q5VFcD24m1QRcBLQA5B_8cns5AN6UJ_bc,27032
72
+ urwid-2.5.1.dist-info/COPYING,sha256=0u_In7t1M1cqRy004HlklRgQo6T40xWezC3KoUUsXCY,26938
73
+ urwid-2.5.1.dist-info/METADATA,sha256=-dWTkChlI3l8n7K1D87tXJYOftY2X2zcUmuvcemmIrM,11164
74
+ urwid-2.5.1.dist-info/WHEEL,sha256=Q5m5OU7k24Q9oJcD9pbryDsMdvQYL1N4fomXgd4i1qg,98
75
+ urwid-2.5.1.dist-info/top_level.txt,sha256=AwxQA43kNkjHbhYELXHBKrQ01X5CR2KnDzU07cVqilY,6
76
+ urwid-2.5.1.dist-info/RECORD,,
File without changes
File without changes