urwid 2.6.15__py3-none-any.whl → 3.0.5__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.
Files changed (62) hide show
  1. urwid/__init__.py +30 -20
  2. urwid/canvas.py +34 -53
  3. urwid/command_map.py +6 -4
  4. urwid/container.py +1 -1
  5. urwid/decoration.py +1 -1
  6. urwid/display/__init__.py +53 -48
  7. urwid/display/_posix_raw_display.py +20 -8
  8. urwid/display/_raw_display_base.py +21 -16
  9. urwid/display/_win32_raw_display.py +16 -17
  10. urwid/display/common.py +45 -74
  11. urwid/display/curses.py +3 -5
  12. urwid/display/escape.py +28 -13
  13. urwid/display/lcd.py +8 -10
  14. urwid/display/web.py +11 -16
  15. urwid/event_loop/asyncio_loop.py +35 -15
  16. urwid/event_loop/main_loop.py +18 -23
  17. urwid/event_loop/tornado_loop.py +4 -5
  18. urwid/event_loop/trio_loop.py +1 -1
  19. urwid/font.py +19 -22
  20. urwid/numedit.py +65 -65
  21. urwid/signals.py +19 -27
  22. urwid/split_repr.py +9 -3
  23. urwid/str_util.py +105 -60
  24. urwid/text_layout.py +14 -13
  25. urwid/util.py +8 -19
  26. urwid/version.py +22 -4
  27. urwid/vterm.py +20 -47
  28. urwid/widget/__init__.py +0 -6
  29. urwid/widget/attr_map.py +10 -10
  30. urwid/widget/attr_wrap.py +11 -13
  31. urwid/widget/bar_graph.py +3 -8
  32. urwid/widget/big_text.py +8 -9
  33. urwid/widget/box_adapter.py +6 -6
  34. urwid/widget/columns.py +52 -83
  35. urwid/widget/container.py +29 -75
  36. urwid/widget/divider.py +6 -6
  37. urwid/widget/edit.py +50 -50
  38. urwid/widget/filler.py +14 -14
  39. urwid/widget/frame.py +31 -40
  40. urwid/widget/grid_flow.py +25 -110
  41. urwid/widget/line_box.py +31 -18
  42. urwid/widget/listbox.py +16 -51
  43. urwid/widget/monitored_list.py +75 -49
  44. urwid/widget/overlay.py +4 -37
  45. urwid/widget/padding.py +31 -68
  46. urwid/widget/pile.py +179 -158
  47. urwid/widget/popup.py +2 -2
  48. urwid/widget/progress_bar.py +17 -18
  49. urwid/widget/scrollable.py +26 -34
  50. urwid/widget/solid_fill.py +3 -3
  51. urwid/widget/text.py +44 -30
  52. urwid/widget/treetools.py +27 -48
  53. urwid/widget/widget.py +13 -130
  54. urwid/widget/widget_decoration.py +6 -35
  55. urwid/widget/wimp.py +61 -61
  56. urwid/wimp.py +1 -1
  57. {urwid-2.6.15.dist-info → urwid-3.0.5.dist-info}/METADATA +24 -24
  58. urwid-3.0.5.dist-info/RECORD +74 -0
  59. {urwid-2.6.15.dist-info → urwid-3.0.5.dist-info}/WHEEL +1 -1
  60. urwid-2.6.15.dist-info/RECORD +0 -74
  61. {urwid-2.6.15.dist-info → urwid-3.0.5.dist-info/licenses}/COPYING +0 -0
  62. {urwid-2.6.15.dist-info → urwid-3.0.5.dist-info}/top_level.txt +0 -0
@@ -37,7 +37,7 @@ class WidgetDecoration(Widget, typing.Generic[WrappedWidget]): # pylint: disabl
37
37
  Don't actually do this -- use a WidgetDecoration subclass instead, these are not real widgets:
38
38
 
39
39
  >>> from urwid import Text
40
- >>> WidgetDecoration(Text(u"hi"))
40
+ >>> WidgetDecoration(Text("hi"))
41
41
  <WidgetDecoration fixed/flow widget <Text fixed/flow widget 'hi'>>
42
42
 
43
43
  .. Warning:
@@ -71,32 +71,15 @@ 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
- >>> t = Text('hello')
82
+ >>> t = Text("hello")
100
83
  >>> wd1 = WidgetDecoration(t)
101
84
  >>> wd2 = WidgetDecoration(wd1)
102
85
  >>> wd3 = WidgetDecoration(wd2)
@@ -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/widget/wimp.py CHANGED
@@ -84,7 +84,7 @@ class SelectableIcon(Text):
84
84
  Render the text content of this widget with a cursor when
85
85
  in focus.
86
86
 
87
- >>> si = SelectableIcon(u"[!]")
87
+ >>> si = SelectableIcon("[!]")
88
88
  >>> si
89
89
  <SelectableIcon selectable fixed/flow widget '[!]'>
90
90
  >>> si.render((4,), focus=True).cursor
@@ -170,10 +170,10 @@ class CheckBox(WidgetWrap[Columns]):
170
170
  def __init__(
171
171
  self,
172
172
  label: str | tuple[Hashable, str] | list[str | tuple[Hashable, str]],
173
- state: bool = False,
174
- has_mixed: typing.Literal[False] = False,
175
- on_state_change: Callable[[Self, bool], typing.Any] | None = None,
176
- user_data: None = None,
173
+ state: typing.Literal["mixed"] | bool = False,
174
+ has_mixed: typing.Literal[True] = True,
175
+ on_state_change: Callable[[Self, bool | typing.Literal["mixed"], _T], typing.Any] | None = None,
176
+ user_data: _T = ...,
177
177
  checked_symbol: str | None = ...,
178
178
  ) -> None: ...
179
179
 
@@ -181,10 +181,10 @@ class CheckBox(WidgetWrap[Columns]):
181
181
  def __init__(
182
182
  self,
183
183
  label: str | tuple[Hashable, str] | list[str | tuple[Hashable, str]],
184
- state: typing.Literal["mixed"] | bool = False,
185
- has_mixed: typing.Literal[True] = True,
186
- on_state_change: Callable[[Self, bool | typing.Literal["mixed"], _T], typing.Any] | None = None,
187
- user_data: _T = ...,
184
+ state: bool = False,
185
+ has_mixed: typing.Literal[False] = False,
186
+ on_state_change: Callable[[Self, bool], typing.Any] | None = None,
187
+ user_data: None = None,
188
188
  checked_symbol: str | None = ...,
189
189
  ) -> None: ...
190
190
 
@@ -206,8 +206,8 @@ class CheckBox(WidgetWrap[Columns]):
206
206
  has_mixed: typing.Literal[False, True] = False, # MyPy issue: Literal[True, False] is not equal `bool`
207
207
  on_state_change: (
208
208
  Callable[[Self, bool, _T], typing.Any]
209
- | Callable[[Self, bool], typing.Any]
210
209
  | Callable[[Self, bool | typing.Literal["mixed"], _T], typing.Any]
210
+ | Callable[[Self, bool], typing.Any]
211
211
  | Callable[[Self, bool | typing.Literal["mixed"]], typing.Any]
212
212
  | None
213
213
  ) = None,
@@ -228,12 +228,12 @@ class CheckBox(WidgetWrap[Columns]):
228
228
 
229
229
  Register signal handler with::
230
230
 
231
- urwid.connect_signal(check_box, 'change', callback, user_data)
231
+ urwid.connect_signal(check_box, "change", callback, user_data)
232
232
 
233
233
  where callback is callback(check_box, new_state [,user_data])
234
234
  Unregister signal handlers with::
235
235
 
236
- urwid.disconnect_signal(check_box, 'change', callback, user_data)
236
+ urwid.disconnect_signal(check_box, "change", callback, user_data)
237
237
 
238
238
  >>> CheckBox("Confirm")
239
239
  <CheckBox selectable fixed/flow widget 'Confirm' state=False>
@@ -303,10 +303,10 @@ class CheckBox(WidgetWrap[Columns]):
303
303
  label -- markup for label. See Text widget for description
304
304
  of text markup.
305
305
 
306
- >>> cb = CheckBox(u"foo")
306
+ >>> cb = CheckBox("foo")
307
307
  >>> cb
308
308
  <CheckBox selectable fixed/flow widget 'foo' state=False>
309
- >>> cb.set_label(('bright_attr', u"bar"))
309
+ >>> cb.set_label(("bright_attr", "bar"))
310
310
  >>> cb
311
311
  <CheckBox selectable fixed/flow widget 'bar' state=False>
312
312
  """
@@ -318,12 +318,12 @@ class CheckBox(WidgetWrap[Columns]):
318
318
  """
319
319
  Return label text.
320
320
 
321
- >>> cb = CheckBox(u"Seriously")
321
+ >>> cb = CheckBox("Seriously")
322
322
  >>> print(cb.get_label())
323
323
  Seriously
324
324
  >>> print(cb.label)
325
325
  Seriously
326
- >>> cb.set_label([('bright_attr', u"flashy"), u" normal"])
326
+ >>> cb.set_label([("bright_attr", "flashy"), " normal"])
327
327
  >>> print(cb.label) # only text is returned
328
328
  flashy normal
329
329
  """
@@ -348,20 +348,20 @@ class CheckBox(WidgetWrap[Columns]):
348
348
  ... changes.append("A %r %r" % (state, user_data))
349
349
  >>> def callback_b(cb, state):
350
350
  ... changes.append("B %r" % state)
351
- >>> cb = CheckBox('test', False, False)
352
- >>> key1 = connect_signal(cb, 'change', callback_a, user_args=("user_a",))
353
- >>> key2 = connect_signal(cb, 'change', callback_b)
354
- >>> cb.set_state(True) # both callbacks will be triggered
351
+ >>> cb = CheckBox("test", False, False)
352
+ >>> key1 = connect_signal(cb, "change", callback_a, user_args=("user_a",))
353
+ >>> key2 = connect_signal(cb, "change", callback_b)
354
+ >>> cb.set_state(True) # both callbacks will be triggered
355
355
  >>> cb.state
356
356
  True
357
- >>> disconnect_signal(cb, 'change', callback_a, user_args=("user_a",))
357
+ >>> disconnect_signal(cb, "change", callback_a, user_args=("user_a",))
358
358
  >>> cb.state = False
359
359
  >>> cb.state
360
360
  False
361
361
  >>> cb.set_state(True)
362
362
  >>> cb.state
363
363
  True
364
- >>> cb.set_state(False, False) # don't send signal
364
+ >>> cb.set_state(False, False) # don't send signal
365
365
  >>> changes
366
366
  ["A True 'user_a'", 'B True', 'B False', 'B True']
367
367
  """
@@ -392,16 +392,16 @@ class CheckBox(WidgetWrap[Columns]):
392
392
  """
393
393
  Toggle state on 'activate' command.
394
394
 
395
- >>> assert CheckBox._command_map[' '] == 'activate'
396
- >>> assert CheckBox._command_map['enter'] == 'activate'
395
+ >>> assert CheckBox._command_map[" "] == "activate"
396
+ >>> assert CheckBox._command_map["enter"] == "activate"
397
397
  >>> size = (10,)
398
- >>> cb = CheckBox('press me')
398
+ >>> cb = CheckBox("press me")
399
399
  >>> cb.state
400
400
  False
401
- >>> cb.keypress(size, ' ')
401
+ >>> cb.keypress(size, " ")
402
402
  >>> cb.state
403
403
  True
404
- >>> cb.keypress(size, ' ')
404
+ >>> cb.keypress(size, " ")
405
405
  >>> cb.state
406
406
  False
407
407
  """
@@ -446,7 +446,7 @@ class CheckBox(WidgetWrap[Columns]):
446
446
  >>> cb = CheckBox("clickme")
447
447
  >>> cb.state
448
448
  False
449
- >>> cb.mouse_event(size, 'mouse press', 1, 2, 0, True)
449
+ >>> cb.mouse_event(size, "mouse press", 1, 2, 0, True)
450
450
  True
451
451
  >>> cb.state
452
452
  True
@@ -510,23 +510,23 @@ class RadioButton(CheckBox):
510
510
 
511
511
  Register signal handler with::
512
512
 
513
- urwid.connect_signal(radio_button, 'change', callback, user_data)
513
+ urwid.connect_signal(radio_button, "change", callback, user_data)
514
514
 
515
515
  where callback is callback(radio_button, new_state [,user_data])
516
516
  Unregister signal handlers with::
517
517
 
518
- urwid.disconnect_signal(radio_button, 'change', callback, user_data)
518
+ urwid.disconnect_signal(radio_button, "change", callback, user_data)
519
519
 
520
- >>> bgroup = [] # button group
521
- >>> b1 = RadioButton(bgroup, u"Agree")
522
- >>> b2 = RadioButton(bgroup, u"Disagree")
520
+ >>> bgroup = [] # button group
521
+ >>> b1 = RadioButton(bgroup, "Agree")
522
+ >>> b2 = RadioButton(bgroup, "Disagree")
523
523
  >>> len(bgroup)
524
524
  2
525
525
  >>> b1
526
526
  <RadioButton selectable fixed/flow widget 'Agree' state=True>
527
527
  >>> b2
528
528
  <RadioButton selectable fixed/flow widget 'Disagree' state=False>
529
- >>> b2.render((15,), focus=True).text # ... = b in Python 3
529
+ >>> b2.render((15,), focus=True).text # ... = b in Python 3
530
530
  [...'( ) Disagree ']
531
531
  """
532
532
  if state == "first True":
@@ -547,21 +547,21 @@ class RadioButton(CheckBox):
547
547
  If state is True all other radio buttons in the same button
548
548
  group will be set to False.
549
549
 
550
- >>> bgroup = [] # button group
551
- >>> b1 = RadioButton(bgroup, u"Agree")
552
- >>> b2 = RadioButton(bgroup, u"Disagree")
553
- >>> b3 = RadioButton(bgroup, u"Unsure")
550
+ >>> bgroup = [] # button group
551
+ >>> b1 = RadioButton(bgroup, "Agree")
552
+ >>> b2 = RadioButton(bgroup, "Disagree")
553
+ >>> b3 = RadioButton(bgroup, "Unsure")
554
554
  >>> b1.state, b2.state, b3.state
555
555
  (True, False, False)
556
556
  >>> b2.set_state(True)
557
557
  >>> b1.state, b2.state, b3.state
558
558
  (False, True, False)
559
559
  >>> def relabel_button(radio_button, new_state):
560
- ... radio_button.set_label(u"Think Harder!")
561
- >>> key = connect_signal(b3, 'change', relabel_button)
560
+ ... radio_button.set_label("Think Harder!")
561
+ >>> key = connect_signal(b3, "change", relabel_button)
562
562
  >>> b3
563
563
  <RadioButton selectable fixed/flow widget 'Unsure' state=False>
564
- >>> b3.set_state(True) # this will trigger the callback
564
+ >>> b3.set_state(True) # this will trigger the callback
565
565
  >>> b3
566
566
  <RadioButton selectable fixed/flow widget 'Think Harder!' state=True>
567
567
  """
@@ -586,7 +586,7 @@ class RadioButton(CheckBox):
586
586
  """
587
587
  Set state to True.
588
588
 
589
- >>> bgroup = [] # button group
589
+ >>> bgroup = [] # button group
590
590
  >>> b1 = RadioButton(bgroup, "Agree")
591
591
  >>> b2 = RadioButton(bgroup, "Disagree")
592
592
  >>> b1.state, b2.state
@@ -659,25 +659,25 @@ class Button(WidgetWrap[Columns]):
659
659
 
660
660
  Register signal handler with::
661
661
 
662
- urwid.connect_signal(button, 'click', callback, user_data)
662
+ urwid.connect_signal(button, "click", callback, user_data)
663
663
 
664
664
  where callback is callback(button [,user_data])
665
665
  Unregister signal handlers with::
666
666
 
667
- urwid.disconnect_signal(button, 'click', callback, user_data)
667
+ urwid.disconnect_signal(button, "click", callback, user_data)
668
668
 
669
669
  >>> from urwid.util import set_temporary_encoding
670
- >>> Button(u"Ok")
670
+ >>> Button("Ok")
671
671
  <Button selectable fixed/flow widget 'Ok'>
672
672
  >>> b = Button("Cancel")
673
- >>> b.render((15,), focus=True).text # ... = b in Python 3
673
+ >>> b.render((15,), focus=True).text # ... = b in Python 3
674
674
  [b'< Cancel >']
675
675
  >>> aligned_button = Button("Test", align=Align.CENTER)
676
676
  >>> aligned_button.render((10,), focus=True).text
677
677
  [b'< Test >']
678
678
  >>> wrapped_button = Button("Long label", wrap=WrapMode.ELLIPSIS)
679
679
  >>> with set_temporary_encoding("utf-8"):
680
- ... wrapped_button.render((7,), focus=False).text[0].decode('utf-8')
680
+ ... wrapped_button.render((7,), focus=False).text[0].decode("utf-8")
681
681
  '< Lo… >'
682
682
  """
683
683
  self._label = SelectableIcon(label, 0, align=align, wrap=wrap, layout=layout)
@@ -719,7 +719,7 @@ class Button(WidgetWrap[Columns]):
719
719
  label -- markup for button label
720
720
 
721
721
  >>> b = Button("Ok")
722
- >>> b.set_label(u"Yup yup")
722
+ >>> b.set_label("Yup yup")
723
723
  >>> b
724
724
  <Button selectable fixed/flow widget 'Yup yup'>
725
725
  """
@@ -729,7 +729,7 @@ class Button(WidgetWrap[Columns]):
729
729
  """
730
730
  Return label text.
731
731
 
732
- >>> b = Button(u"Ok")
732
+ >>> b = Button("Ok")
733
733
  >>> print(b.get_label())
734
734
  Ok
735
735
  >>> print(b.label)
@@ -743,17 +743,17 @@ class Button(WidgetWrap[Columns]):
743
743
  """
744
744
  Send 'click' signal on 'activate' command.
745
745
 
746
- >>> assert Button._command_map[' '] == 'activate'
747
- >>> assert Button._command_map['enter'] == 'activate'
746
+ >>> assert Button._command_map[" "] == "activate"
747
+ >>> assert Button._command_map["enter"] == "activate"
748
748
  >>> size = (15,)
749
- >>> b = Button(u"Cancel")
749
+ >>> b = Button("Cancel")
750
750
  >>> clicked_buttons = []
751
751
  >>> def handle_click(button):
752
752
  ... clicked_buttons.append(button.label)
753
- >>> key = connect_signal(b, 'click', handle_click)
754
- >>> b.keypress(size, 'enter')
755
- >>> b.keypress(size, ' ')
756
- >>> clicked_buttons # ... = u in Python 2
753
+ >>> key = connect_signal(b, "click", handle_click)
754
+ >>> b.keypress(size, "enter")
755
+ >>> b.keypress(size, " ")
756
+ >>> clicked_buttons # ... = u in Python 2
757
757
  [...'Cancel', ...'Cancel']
758
758
  """
759
759
  if self._command_map[key] != Command.ACTIVATE:
@@ -767,16 +767,16 @@ class Button(WidgetWrap[Columns]):
767
767
  Send 'click' signal on button 1 press.
768
768
 
769
769
  >>> size = (15,)
770
- >>> b = Button(u"Ok")
770
+ >>> b = Button("Ok")
771
771
  >>> clicked_buttons = []
772
772
  >>> def handle_click(button):
773
773
  ... clicked_buttons.append(button.label)
774
- >>> key = connect_signal(b, 'click', handle_click)
775
- >>> b.mouse_event(size, 'mouse press', 1, 4, 0, True)
774
+ >>> key = connect_signal(b, "click", handle_click)
775
+ >>> b.mouse_event(size, "mouse press", 1, 4, 0, True)
776
776
  True
777
- >>> b.mouse_event(size, 'mouse press', 2, 4, 0, True) # ignored
777
+ >>> b.mouse_event(size, "mouse press", 2, 4, 0, True) # ignored
778
778
  False
779
- >>> clicked_buttons # ... = u in Python 2
779
+ >>> clicked_buttons # ... = u in Python 2
780
780
  [...'Ok']
781
781
  """
782
782
  if button != 1 or not is_mouse_press(event):
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,10 +1,9 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: urwid
3
- Version: 2.6.15
3
+ Version: 3.0.5
4
4
  Summary: A full-featured console (xterm et al.) user interface library
5
- Home-page: https://urwid.org/
6
5
  Author-email: Ian Ward <ian@excess.org>
7
- License: LGPL-2.1-only
6
+ License-Expression: LGPL-2.1-only
8
7
  Project-URL: Homepage, https://urwid.org/
9
8
  Project-URL: Documentation, https://urwid.org/manual/index.html
10
9
  Project-URL: Repository, https://github.com/urwid/urwid
@@ -15,7 +14,6 @@ Classifier: Development Status :: 5 - Production/Stable
15
14
  Classifier: Environment :: Console
16
15
  Classifier: Environment :: Console :: Curses
17
16
  Classifier: Intended Audience :: Developers
18
- Classifier: License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)
19
17
  Classifier: Operating System :: POSIX
20
18
  Classifier: Operating System :: Unix
21
19
  Classifier: Operating System :: MacOS :: MacOS X
@@ -23,37 +21,37 @@ Classifier: Operating System :: Microsoft :: Windows
23
21
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
24
22
  Classifier: Topic :: Software Development :: Widget Sets
25
23
  Classifier: Programming Language :: Python :: 3
26
- Classifier: Programming Language :: Python :: 3.7
27
- Classifier: Programming Language :: Python :: 3.8
28
24
  Classifier: Programming Language :: Python :: 3.9
29
25
  Classifier: Programming Language :: Python :: 3.10
30
26
  Classifier: Programming Language :: Python :: 3.11
31
27
  Classifier: Programming Language :: Python :: 3.12
28
+ Classifier: Programming Language :: Python :: 3.13
29
+ Classifier: Programming Language :: Python :: 3.14
32
30
  Classifier: Programming Language :: Python :: 3 :: Only
33
31
  Classifier: Programming Language :: Python :: Implementation :: CPython
34
32
  Classifier: Programming Language :: Python :: Implementation :: PyPy
35
- Requires-Python: >3.7
33
+ Requires-Python: >=3.9.0
36
34
  Description-Content-Type: text/x-rst
37
35
  License-File: COPYING
38
- Requires-Dist: typing-extensions
39
- Requires-Dist: wcwidth
36
+ Requires-Dist: wcwidth>=0.4
40
37
  Provides-Extra: curses
41
- Requires-Dist: windows-curses ; (sys_platform == "win32") and extra == 'curses'
38
+ Requires-Dist: windows-curses; sys_platform == "win32" and extra == "curses"
42
39
  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'
40
+ Requires-Dist: PyGObject; extra == "glib"
48
41
  Provides-Extra: tornado
49
- Requires-Dist: tornado >=5.0 ; extra == 'tornado'
42
+ Requires-Dist: tornado>=5.0; extra == "tornado"
50
43
  Provides-Extra: trio
51
- Requires-Dist: trio >=0.22.0 ; extra == 'trio'
52
- Requires-Dist: exceptiongroup ; extra == 'trio'
44
+ Requires-Dist: trio>=0.24.0; extra == "trio"
45
+ Requires-Dist: exceptiongroup; python_version < "3.11" and extra == "trio"
53
46
  Provides-Extra: twisted
54
- Requires-Dist: twisted ; extra == 'twisted'
47
+ Requires-Dist: twisted; extra == "twisted"
55
48
  Provides-Extra: zmq
56
- Requires-Dist: zmq ; extra == 'zmq'
49
+ Requires-Dist: zmq; extra == "zmq"
50
+ Provides-Extra: serial
51
+ Requires-Dist: pyserial; extra == "serial"
52
+ Provides-Extra: lcd
53
+ Requires-Dist: pyserial; extra == "lcd"
54
+ Dynamic: license-file
57
55
 
58
56
  Urwid
59
57
  =====
@@ -76,7 +74,7 @@ It includes many features useful for text console application developers includi
76
74
  - Display modules include raw, curses, and experimental LCD and web displays
77
75
  - Support for UTF-8, simple 8-bit and CJK encodings
78
76
  - 24-bit (true color), 256 color, and 88 color mode support
79
- - Compatible with Python 3.7+ and PyPy
77
+ - Compatible with Python 3.9+ and PyPy
80
78
 
81
79
  Home Page:
82
80
  http://urwid.org/
@@ -106,6 +104,8 @@ Alternatively if you are on Debian or Ubuntu
106
104
  Windows support notes
107
105
  =====================
108
106
 
107
+ Windows support is limited to the Windows 10+ due to ANSI support requirement.
108
+
109
109
  * Not supported:
110
110
 
111
111
  1. Terminal widget and all related render API (TermCanvas, TermCharset, TermModes, TermScroller)
@@ -142,12 +142,12 @@ To test code in all Python versions:
142
142
  Supported Python versions
143
143
  =========================
144
144
 
145
- - 3.7
146
- - 3.8
147
145
  - 3.9
148
146
  - 3.10
149
147
  - 3.11
150
148
  - 3.12
149
+ - 3.13
150
+ - 3.14
151
151
  - pypy3
152
152
 
153
153
  Authors
@@ -0,0 +1,74 @@
1
+ urwid/__init__.py,sha256=hpJEP1iuzHRRIdSpxS_dT-QeZtmTi_Wsy_7ptDfGhrQ,8423
2
+ urwid/canvas.py,sha256=W6gVxeuC2PiLo8U5suNPZ7BpamfC_Y_-1HU2_PKWGA0,46316
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=8u3ntQ6ijnfxhMF7kwM5LKAAmgQYqE-pM9bsWmv7y2w,31882
7
+ urwid/graphics.py,sha256=pVGGU5kOWV56iXawDROgQWQwIbgaoh32JHE2COcGesQ,2481
8
+ urwid/numedit.py,sha256=wF5U2c_hOhD2Css-7-WBVvKtp3TpXwucOfvL_IPoLe0,13363
9
+ urwid/signals.py,sha256=GvpWeYkNK_xWvAJxUkddc5R9eCU9LtFNXO7jPZ8soeg,12925
10
+ urwid/split_repr.py,sha256=gtL1QBbQRY5rAfkLHfGznF0mu5Bx5QAQ5ncTZAqxYsk,3954
11
+ urwid/str_util.py,sha256=hIgc6vWGR4ucs1msZGI6hXjb28voC0ZSoUkowVa10go,13015
12
+ urwid/text_layout.py,sha256=d3Qx1XBl01Be0GEGoI6O9FQ5JSlskKFN8X3mZwkUT44,22795
13
+ urwid/util.py,sha256=bmBEblNfXwlklGesxhuLywe-FLGXZ8Azr9YZnrmTXG4,15337
14
+ urwid/version.py,sha256=_gKIfMQTTMv5Ihot0rROuF4g7Ko3dtcxxIbmQxKrBug,704
15
+ urwid/vterm.py,sha256=4LqmO0qf1YlEuReSRiWCc2qIdDZMBDu-s4kwUWAhsk8,57775
16
+ urwid/wimp.py,sha256=CRpUWYsrCSrnTX1AH7FnBI_8EvLHHy6eypg8-zno5MI,572
17
+ urwid/display/__init__.py,sha256=NX2D_wZ9YgtCcJ1HV_H-Q-tf01R3Fu4jBfwmUS0qn9o,2048
18
+ urwid/display/_posix_raw_display.py,sha256=PcrTvzCsOkxnNJaNPBCn9ETjETPCIv3SWHLDauyVyb0,15050
19
+ urwid/display/_raw_display_base.py,sha256=_TOwGxWNt-3XCfwh13_KJI5kP5XMFRxWMvk-3B7gzcI,33705
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=LrgrgAHJxqizO9M0bjRcTQf4wF-lx5s5N8wzcGHtdzw,38607
25
+ urwid/display/curses.py,sha256=XNmIl8ah0zFHiXIo9daFpwGBxkvYz4DoyR9FokWTcNY,22728
26
+ urwid/display/escape.py,sha256=G8oImGhqW_Ye-woR8rxSMfqmX1D2nP2RugKKGLTbSHM,18190
27
+ urwid/display/html_fragment.py,sha256=lQRqr-hTrknQyZTtzPDp9zr-TWOT4NcuSsusS-LXIOU,8547
28
+ urwid/display/lcd.py,sha256=XwBmdtzegbSTk68VoaYloo4T5vgrs-vZBFOFjObp6oE,17604
29
+ urwid/display/raw.py,sha256=TSkIEM6KnQHPmmpBkWKdirZOwVXhSV67k7hWmuuR2OY,1125
30
+ urwid/display/web.py,sha256=13uzZm049YfmnNJtcWKuE-3jQNOU3wPoDc2G94QPRtg,19148
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=RS9OZjWaoMUEbNzoce8dGmyllkujNQi7GvVpIZAWv_M,9204
34
+ urwid/event_loop/glib_loop.py,sha256=GFoLAenoWKm-13rTBKzCF2JdCEryJKpMo25aidZ7BWs,9351
35
+ urwid/event_loop/main_loop.py,sha256=LCasuuzdBc0d7KE4qOvq8L4BZKJaiaJ5eVjFa05VI1k,25982
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=EZRLqhGeeyNysrjoiIh7W3lJItL-xm8JJCAEJhOzSWM,6205
43
+ urwid/widget/attr_wrap.py,sha256=v0Jern2jnmQUupnxf6GYflqabNGSA0S-n77pEBQixVA,4918
44
+ urwid/widget/bar_graph.py,sha256=uXC1_yBln7OvZ6Njaker_dNU6837cV0UMONcxOkkeoI,21518
45
+ urwid/widget/big_text.py,sha256=Xi30p2wgx76Ajb-_6dR3Rc5oIqJePiaNV22_R5AJVc4,2325
46
+ urwid/widget/box_adapter.py,sha256=IfNtjSoVGiNhtdsXHdLKY_uKBqPKA1NGasduREGnlRE,4335
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=onvR2AWr9Zp1xUNxn66fU9NKm7dmH3orHZY45eLk4Tw,3247
51
+ urwid/widget/edit.py,sha256=EEB9uYXOdsuNlh3xNt6FtAslk1OBB48o9OlC86WIilc,23553
52
+ urwid/widget/filler.py,sha256=F_Pwjne0P5A2uvAX2-SL6pBnoqIqAK_P-fss23HYhqs,14799
53
+ urwid/widget/frame.py,sha256=L2jPpc5Sey7xZ3h_m9sgMYgmQ53Q6rmT4HmkpfO84Hs,21494
54
+ urwid/widget/grid_flow.py,sha256=sAKZv9l-a9B-9vjjqq5Z8iuoCRC1MFyRrZzUOXqzA_o,18549
55
+ urwid/widget/line_box.py,sha256=eN0HztGZSSG9Gf29Lyn2fiByKkrmkG39JM7Wsgr-_xE,7551
56
+ urwid/widget/listbox.py,sha256=FMM8rGIa3w8PDYijiAwGatqEnVE5XeMZ4lZ4npIm1tk,73269
57
+ urwid/widget/monitored_list.py,sha256=UpoMpWqXw_NIryeNAGk_yF5t1k9p1lClbOR-NcrM2oU,19678
58
+ urwid/widget/overlay.py,sha256=A0ypqnCtOSR_axmE0zHiUZfonY1-aRMbTiymYulYQNc,33319
59
+ urwid/widget/padding.py,sha256=k9zoUOa6kVohxEzhbSAo8JLT7rx9V63kxpJ1jYJ0niA,19848
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=YT3qiV9pUENLQSJC3HzsDdjNQ1QzYgGyT3WaWz42pMQ,4613
63
+ urwid/widget/scrollable.py,sha256=U7DoOIwr5CE4B-U0kM-9Pg0xpXawOahwJrdiTYQRilw,24451
64
+ urwid/widget/solid_fill.py,sha256=_mNy135irEnyPdghjbyt1cm3ial6u49zuGeDZN5GO2o,1262
65
+ urwid/widget/text.py,sha256=wW7Go7uEJTOvp5kpZeT9UsmNg9jrSCc5PQfAJ-vFvWQ,12789
66
+ urwid/widget/treetools.py,sha256=NehR7ELL2vvBHIlwtRCGyTfPLdx0Uis5opufC3xNkcE,17031
67
+ urwid/widget/widget.py,sha256=lpZFuEMz4yGWAsyc859qeU6_BPmQWGe4XmDV5lTPToo,26438
68
+ urwid/widget/widget_decoration.py,sha256=pfefCD2Cyyu9u2vuYs22Ph45dt0v_oYjQji2csfiyUI,4620
69
+ urwid/widget/wimp.py,sha256=_-gTLInG60SoeJn5FePJmIsv5Rm0HgURE5ryfXYD1Kc,27299
70
+ urwid-3.0.5.dist-info/licenses/COPYING,sha256=NrbT-keRaUP9X-wxPFhHhJRgR-wTN6eLRA5ZkstZX4k,26434
71
+ urwid-3.0.5.dist-info/METADATA,sha256=lRPKYW-3lPFW8stcEHSzz9LPdpBQCjvre12sy2JxJj0,11028
72
+ urwid-3.0.5.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
73
+ urwid-3.0.5.dist-info/top_level.txt,sha256=AwxQA43kNkjHbhYELXHBKrQ01X5CR2KnDzU07cVqilY,6
74
+ urwid-3.0.5.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (70.2.0)
2
+ Generator: setuptools (80.10.2)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5