urwid 3.0.1__tar.gz → 3.0.5__tar.gz

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 (321) hide show
  1. urwid-3.0.5/.devcontainer/dev.dockerfile +15 -0
  2. {urwid-3.0.1 → urwid-3.0.5}/.devcontainer/devcontainer.json +6 -1
  3. {urwid-3.0.1 → urwid-3.0.5}/.github/workflows/documentation.yml +3 -3
  4. {urwid-3.0.1 → urwid-3.0.5}/.github/workflows/isolated_static_check.yml +11 -31
  5. {urwid-3.0.1 → urwid-3.0.5}/.github/workflows/labels.yml +1 -1
  6. {urwid-3.0.1 → urwid-3.0.5}/.github/workflows/pythonpackage.yml +27 -42
  7. {urwid-3.0.1 → urwid-3.0.5}/.github/workflows/yamllint.yml +2 -2
  8. {urwid-3.0.1 → urwid-3.0.5}/.pre-commit-config.yaml +7 -21
  9. {urwid-3.0.1 → urwid-3.0.5}/PKG-INFO +8 -5
  10. {urwid-3.0.1 → urwid-3.0.5}/README.rst +4 -1
  11. {urwid-3.0.1 → urwid-3.0.5}/classifiers.txt +1 -1
  12. {urwid-3.0.1 → urwid-3.0.5}/docs/changelog.rst +71 -0
  13. urwid-3.0.5/docs/examples/edit_text.txt +0 -0
  14. {urwid-3.0.1 → urwid-3.0.5/docs}/examples/palette_test.py +1 -1
  15. {urwid-3.0.1 → urwid-3.0.5}/docs/examples/real_edit.py +3 -2
  16. {urwid-3.0.1 → urwid-3.0.5}/docs/manual/wanat_multi.py +1 -1
  17. {urwid-3.0.1 → urwid-3.0.5}/examples/asyncio_socket_server.py +7 -7
  18. {urwid-3.0.1 → urwid-3.0.5}/examples/edit.py +3 -2
  19. {urwid-3.0.1 → urwid-3.0.5}/examples/lcd_cf635.py +1 -1
  20. {urwid-3.0.1/docs → urwid-3.0.5}/examples/palette_test.py +1 -1
  21. {urwid-3.0.1 → urwid-3.0.5}/examples/twisted_serve_ssh.py +3 -3
  22. urwid-3.0.5/pylint-requirements.txt +1 -0
  23. {urwid-3.0.1 → urwid-3.0.5}/pyproject.toml +11 -3
  24. urwid-3.0.5/requirements.txt +1 -0
  25. urwid-3.0.5/ruff-requirements.txt +1 -0
  26. urwid-3.0.5/tests/test_grapheme_clusters.py +210 -0
  27. {urwid-3.0.1 → urwid-3.0.5}/tests/test_scrollable.py +20 -1
  28. {urwid-3.0.1 → urwid-3.0.5}/tests/test_text_layout.py +15 -3
  29. {urwid-3.0.1 → urwid-3.0.5}/tox.ini +7 -20
  30. {urwid-3.0.1 → urwid-3.0.5}/urwid/__init__.py +29 -16
  31. {urwid-3.0.1 → urwid-3.0.5}/urwid/canvas.py +6 -6
  32. {urwid-3.0.1 → urwid-3.0.5}/urwid/display/__init__.py +53 -48
  33. {urwid-3.0.1 → urwid-3.0.5}/urwid/display/_posix_raw_display.py +4 -4
  34. {urwid-3.0.1 → urwid-3.0.5}/urwid/display/_raw_display_base.py +13 -11
  35. {urwid-3.0.1 → urwid-3.0.5}/urwid/display/common.py +19 -19
  36. {urwid-3.0.1 → urwid-3.0.5}/urwid/display/curses.py +2 -4
  37. {urwid-3.0.1 → urwid-3.0.5}/urwid/display/escape.py +15 -3
  38. {urwid-3.0.1 → urwid-3.0.5}/urwid/display/lcd.py +4 -4
  39. {urwid-3.0.1 → urwid-3.0.5}/urwid/display/web.py +4 -4
  40. {urwid-3.0.1 → urwid-3.0.5}/urwid/event_loop/asyncio_loop.py +3 -1
  41. {urwid-3.0.1 → urwid-3.0.5}/urwid/event_loop/main_loop.py +5 -5
  42. {urwid-3.0.1 → urwid-3.0.5}/urwid/font.py +6 -4
  43. {urwid-3.0.1 → urwid-3.0.5}/urwid/numedit.py +65 -65
  44. {urwid-3.0.1 → urwid-3.0.5}/urwid/signals.py +17 -26
  45. {urwid-3.0.1 → urwid-3.0.5}/urwid/split_repr.py +9 -3
  46. {urwid-3.0.1 → urwid-3.0.5}/urwid/str_util.py +90 -42
  47. {urwid-3.0.1 → urwid-3.0.5}/urwid/text_layout.py +8 -6
  48. {urwid-3.0.1 → urwid-3.0.5}/urwid/util.py +1 -1
  49. {urwid-3.0.1 → urwid-3.0.5}/urwid/version.py +16 -3
  50. {urwid-3.0.1 → urwid-3.0.5}/urwid/vterm.py +2 -2
  51. {urwid-3.0.1 → urwid-3.0.5}/urwid/widget/attr_map.py +10 -10
  52. {urwid-3.0.1 → urwid-3.0.5}/urwid/widget/attr_wrap.py +3 -3
  53. {urwid-3.0.1 → urwid-3.0.5}/urwid/widget/big_text.py +0 -3
  54. {urwid-3.0.1 → urwid-3.0.5}/urwid/widget/box_adapter.py +2 -2
  55. {urwid-3.0.1 → urwid-3.0.5}/urwid/widget/divider.py +6 -6
  56. {urwid-3.0.1 → urwid-3.0.5}/urwid/widget/edit.py +42 -42
  57. {urwid-3.0.1 → urwid-3.0.5}/urwid/widget/filler.py +8 -8
  58. {urwid-3.0.1 → urwid-3.0.5}/urwid/widget/frame.py +3 -3
  59. {urwid-3.0.1 → urwid-3.0.5}/urwid/widget/line_box.py +19 -19
  60. {urwid-3.0.1 → urwid-3.0.5}/urwid/widget/listbox.py +4 -1
  61. {urwid-3.0.1 → urwid-3.0.5}/urwid/widget/monitored_list.py +69 -45
  62. {urwid-3.0.1 → urwid-3.0.5}/urwid/widget/padding.py +20 -20
  63. {urwid-3.0.1 → urwid-3.0.5}/urwid/widget/progress_bar.py +7 -7
  64. {urwid-3.0.1 → urwid-3.0.5}/urwid/widget/scrollable.py +1 -1
  65. {urwid-3.0.1 → urwid-3.0.5}/urwid/widget/solid_fill.py +3 -3
  66. {urwid-3.0.1 → urwid-3.0.5}/urwid/widget/text.py +44 -30
  67. {urwid-3.0.1 → urwid-3.0.5}/urwid/widget/widget.py +6 -6
  68. {urwid-3.0.1 → urwid-3.0.5}/urwid/widget/widget_decoration.py +2 -2
  69. {urwid-3.0.1 → urwid-3.0.5}/urwid/widget/wimp.py +61 -61
  70. {urwid-3.0.1 → urwid-3.0.5}/urwid.egg-info/PKG-INFO +8 -5
  71. {urwid-3.0.1 → urwid-3.0.5}/urwid.egg-info/SOURCES.txt +1 -2
  72. {urwid-3.0.1 → urwid-3.0.5}/urwid.egg-info/requires.txt +1 -1
  73. urwid-3.0.1/.devcontainer/dev.dockerfile +0 -8
  74. urwid-3.0.1/black-requirements.txt +0 -1
  75. urwid-3.0.1/docs/examples/edit_text.txt +0 -11
  76. urwid-3.0.1/isort-requirements.txt +0 -1
  77. urwid-3.0.1/pylint-requirements.txt +0 -1
  78. urwid-3.0.1/requirements.txt +0 -1
  79. urwid-3.0.1/ruff-requirements.txt +0 -1
  80. {urwid-3.0.1 → urwid-3.0.5}/.coveralls.yml +0 -0
  81. {urwid-3.0.1 → urwid-3.0.5}/.dockerignore +0 -0
  82. {urwid-3.0.1 → urwid-3.0.5}/.editorconfig +0 -0
  83. {urwid-3.0.1 → urwid-3.0.5}/.github/CODE_OF_CONDUCT.md +0 -0
  84. {urwid-3.0.1 → urwid-3.0.5}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  85. {urwid-3.0.1 → urwid-3.0.5}/.github/ISSUE_TEMPLATE/docs.md +0 -0
  86. {urwid-3.0.1 → urwid-3.0.5}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  87. {urwid-3.0.1 → urwid-3.0.5}/.github/ISSUE_TEMPLATE/question.md +0 -0
  88. {urwid-3.0.1 → urwid-3.0.5}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  89. {urwid-3.0.1 → urwid-3.0.5}/.github/dependabot.yml +0 -0
  90. {urwid-3.0.1 → urwid-3.0.5}/.github/labeler.yml +0 -0
  91. {urwid-3.0.1 → urwid-3.0.5}/.github/release.yml +0 -0
  92. {urwid-3.0.1 → urwid-3.0.5}/.gitignore +0 -0
  93. {urwid-3.0.1 → urwid-3.0.5}/.yamllint.yml +0 -0
  94. {urwid-3.0.1 → urwid-3.0.5}/COPYING +0 -0
  95. {urwid-3.0.1 → urwid-3.0.5}/MANIFEST.in +0 -0
  96. {urwid-3.0.1 → urwid-3.0.5}/docs/Makefile +0 -0
  97. {urwid-3.0.1 → urwid-3.0.5}/docs/conf.py +0 -0
  98. {urwid-3.0.1 → urwid-3.0.5}/docs/examples/bigtext.py +0 -0
  99. {urwid-3.0.1 → urwid-3.0.5}/docs/examples/bigtext.py.xdotool +0 -0
  100. {urwid-3.0.1 → urwid-3.0.5}/docs/examples/bigtext1.png +0 -0
  101. {urwid-3.0.1 → urwid-3.0.5}/docs/examples/bigtext2.png +0 -0
  102. {urwid-3.0.1 → urwid-3.0.5}/docs/examples/bigtext3.png +0 -0
  103. {urwid-3.0.1 → urwid-3.0.5}/docs/examples/browse.py +0 -0
  104. {urwid-3.0.1 → urwid-3.0.5}/docs/examples/browse.py.xdotool +0 -0
  105. {urwid-3.0.1 → urwid-3.0.5}/docs/examples/browse1.png +0 -0
  106. {urwid-3.0.1 → urwid-3.0.5}/docs/examples/browse2.png +0 -0
  107. {urwid-3.0.1 → urwid-3.0.5}/docs/examples/edit.py +0 -0
  108. {urwid-3.0.1 → urwid-3.0.5}/docs/examples/edit.py.xdotool +0 -0
  109. {urwid-3.0.1 → urwid-3.0.5}/docs/examples/edit1.png +0 -0
  110. {urwid-3.0.1 → urwid-3.0.5}/docs/examples/edit2.png +0 -0
  111. {urwid-3.0.1 → urwid-3.0.5}/docs/examples/graph.py +0 -0
  112. {urwid-3.0.1 → urwid-3.0.5}/docs/examples/graph.py.xdotool +0 -0
  113. {urwid-3.0.1 → urwid-3.0.5}/docs/examples/graph1.png +0 -0
  114. {urwid-3.0.1 → urwid-3.0.5}/docs/examples/graph2.png +0 -0
  115. {urwid-3.0.1 → urwid-3.0.5}/docs/examples/index.rst +0 -0
  116. {urwid-3.0.1 → urwid-3.0.5}/docs/examples/palette_test.py.xdotool +0 -0
  117. {urwid-3.0.1 → urwid-3.0.5}/docs/examples/palette_test1.png +0 -0
  118. {urwid-3.0.1 → urwid-3.0.5}/docs/examples/palette_test2.png +0 -0
  119. {urwid-3.0.1 → urwid-3.0.5}/docs/examples/pop_up.py +0 -0
  120. {urwid-3.0.1 → urwid-3.0.5}/docs/examples/pop_up.py.xdotool +0 -0
  121. {urwid-3.0.1 → urwid-3.0.5}/docs/examples/pop_up1.png +0 -0
  122. {urwid-3.0.1 → urwid-3.0.5}/docs/examples/pop_up2.png +0 -0
  123. {urwid-3.0.1 → urwid-3.0.5}/docs/examples/real_browse.py +0 -0
  124. {urwid-3.0.1 → urwid-3.0.5}/docs/examples/subproc.py +0 -0
  125. {urwid-3.0.1 → urwid-3.0.5}/docs/examples/subproc.py.xdotool +0 -0
  126. {urwid-3.0.1 → urwid-3.0.5}/docs/examples/subproc1.png +0 -0
  127. {urwid-3.0.1 → urwid-3.0.5}/docs/examples/subproc2.png +0 -0
  128. {urwid-3.0.1 → urwid-3.0.5}/docs/examples/subproc2.py +0 -0
  129. {urwid-3.0.1 → urwid-3.0.5}/docs/examples/tour.py +0 -0
  130. {urwid-3.0.1 → urwid-3.0.5}/docs/examples/tour.py.xdotool +0 -0
  131. {urwid-3.0.1 → urwid-3.0.5}/docs/examples/tour1.png +0 -0
  132. {urwid-3.0.1 → urwid-3.0.5}/docs/examples/tour2.png +0 -0
  133. {urwid-3.0.1 → urwid-3.0.5}/docs/index.rst +0 -0
  134. {urwid-3.0.1 → urwid-3.0.5}/docs/manual/bright_combinations.py +0 -0
  135. {urwid-3.0.1 → urwid-3.0.5}/docs/manual/bright_combinations.py.xdotool +0 -0
  136. {urwid-3.0.1 → urwid-3.0.5}/docs/manual/bright_combinations1.png +0 -0
  137. {urwid-3.0.1 → urwid-3.0.5}/docs/manual/canvascache.rst +0 -0
  138. {urwid-3.0.1 → urwid-3.0.5}/docs/manual/displayattributes.rst +0 -0
  139. {urwid-3.0.1 → urwid-3.0.5}/docs/manual/displaymodules.rst +0 -0
  140. {urwid-3.0.1 → urwid-3.0.5}/docs/manual/encodings.rst +0 -0
  141. {urwid-3.0.1 → urwid-3.0.5}/docs/manual/images/display_modules.png +0 -0
  142. {urwid-3.0.1 → urwid-3.0.5}/docs/manual/images/introduction.png +0 -0
  143. {urwid-3.0.1 → urwid-3.0.5}/docs/manual/images/urwid_widgets.svgz +0 -0
  144. {urwid-3.0.1 → urwid-3.0.5}/docs/manual/images/urwid_widgets_1.png +0 -0
  145. {urwid-3.0.1 → urwid-3.0.5}/docs/manual/images/urwid_widgets_1.xcf +0 -0
  146. {urwid-3.0.1 → urwid-3.0.5}/docs/manual/images/urwid_widgets_2.png +0 -0
  147. {urwid-3.0.1 → urwid-3.0.5}/docs/manual/images/urwid_widgets_2.xcf +0 -0
  148. {urwid-3.0.1 → urwid-3.0.5}/docs/manual/images/widget_layout.png +0 -0
  149. {urwid-3.0.1 → urwid-3.0.5}/docs/manual/index.rst +0 -0
  150. {urwid-3.0.1 → urwid-3.0.5}/docs/manual/mainloop.rst +0 -0
  151. {urwid-3.0.1 → urwid-3.0.5}/docs/manual/overview.rst +0 -0
  152. {urwid-3.0.1 → urwid-3.0.5}/docs/manual/safe_combinations.py +0 -0
  153. {urwid-3.0.1 → urwid-3.0.5}/docs/manual/safe_combinations.py.xdotool +0 -0
  154. {urwid-3.0.1 → urwid-3.0.5}/docs/manual/safe_combinations1.png +0 -0
  155. {urwid-3.0.1 → urwid-3.0.5}/docs/manual/textlayout.rst +0 -0
  156. {urwid-3.0.1 → urwid-3.0.5}/docs/manual/userinput.rst +0 -0
  157. {urwid-3.0.1 → urwid-3.0.5}/docs/manual/wanat.py +0 -0
  158. {urwid-3.0.1 → urwid-3.0.5}/docs/manual/wcur1.py +0 -0
  159. {urwid-3.0.1 → urwid-3.0.5}/docs/manual/wcur2.py +0 -0
  160. {urwid-3.0.1 → urwid-3.0.5}/docs/manual/widgets.rst +0 -0
  161. {urwid-3.0.1 → urwid-3.0.5}/docs/manual/wmod.py +0 -0
  162. {urwid-3.0.1 → urwid-3.0.5}/docs/manual/wsel.py +0 -0
  163. {urwid-3.0.1 → urwid-3.0.5}/docs/reference/attrspec.rst +0 -0
  164. {urwid-3.0.1 → urwid-3.0.5}/docs/reference/canvas.rst +0 -0
  165. {urwid-3.0.1 → urwid-3.0.5}/docs/reference/command_map.rst +0 -0
  166. {urwid-3.0.1 → urwid-3.0.5}/docs/reference/constants.rst +0 -0
  167. {urwid-3.0.1 → urwid-3.0.5}/docs/reference/deprecated.rst +0 -0
  168. {urwid-3.0.1 → urwid-3.0.5}/docs/reference/display_modules.rst +0 -0
  169. {urwid-3.0.1 → urwid-3.0.5}/docs/reference/exceptions.rst +0 -0
  170. {urwid-3.0.1 → urwid-3.0.5}/docs/reference/global_settings.rst +0 -0
  171. {urwid-3.0.1 → urwid-3.0.5}/docs/reference/index.rst +0 -0
  172. {urwid-3.0.1 → urwid-3.0.5}/docs/reference/list_walkers.rst +0 -0
  173. {urwid-3.0.1 → urwid-3.0.5}/docs/reference/main_loop.rst +0 -0
  174. {urwid-3.0.1 → urwid-3.0.5}/docs/reference/meta.rst +0 -0
  175. {urwid-3.0.1 → urwid-3.0.5}/docs/reference/signals.rst +0 -0
  176. {urwid-3.0.1 → urwid-3.0.5}/docs/reference/text_layout.rst +0 -0
  177. {urwid-3.0.1 → urwid-3.0.5}/docs/reference/widget.rst +0 -0
  178. {urwid-3.0.1 → urwid-3.0.5}/docs/tools/compile_pngs.sh +0 -0
  179. {urwid-3.0.1 → urwid-3.0.5}/docs/tools/screenshots.sh +0 -0
  180. {urwid-3.0.1 → urwid-3.0.5}/docs/tools/static/.placeholder +0 -0
  181. {urwid-3.0.1 → urwid-3.0.5}/docs/tools/templates/indexcontent.html +0 -0
  182. {urwid-3.0.1 → urwid-3.0.5}/docs/tools/templates/indexsidebar.html +0 -0
  183. {urwid-3.0.1 → urwid-3.0.5}/docs/tools/templates/localtoc.html +0 -0
  184. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/adventure.py +0 -0
  185. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/adventure.py.xdotool +0 -0
  186. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/adventure1.png +0 -0
  187. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/adventure2.png +0 -0
  188. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/adventure3.png +0 -0
  189. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/adventure4.png +0 -0
  190. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/cmenu.py +0 -0
  191. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/cmenu.py.xdotool +0 -0
  192. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/cmenu1.png +0 -0
  193. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/cmenu2.png +0 -0
  194. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/cmenu3.png +0 -0
  195. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/cmenu4.png +0 -0
  196. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/highcolors.py +0 -0
  197. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/highcolors.py.xdotool +0 -0
  198. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/highcolors1.png +0 -0
  199. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/hmenu.py +0 -0
  200. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/hmenu.py.xdotool +0 -0
  201. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/hmenu1.png +0 -0
  202. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/hmenu2.png +0 -0
  203. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/hmenu3.png +0 -0
  204. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/hmenu4.png +0 -0
  205. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/index.rst +0 -0
  206. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/input.py +0 -0
  207. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/input.py.xdotool +0 -0
  208. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/input1.png +0 -0
  209. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/input2.png +0 -0
  210. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/input3.png +0 -0
  211. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/input4.png +0 -0
  212. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/input5.png +0 -0
  213. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/menu25.png +0 -0
  214. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/minimal.py +0 -0
  215. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/minimal.py.xdotool +0 -0
  216. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/minimal1.png +0 -0
  217. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/multiple.py +0 -0
  218. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/multiple.py.xdotool +0 -0
  219. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/multiple1.png +0 -0
  220. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/multiple2.png +0 -0
  221. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/multiple3.png +0 -0
  222. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/multiple4.png +0 -0
  223. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/qa.py +0 -0
  224. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/qa.py.xdotool +0 -0
  225. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/qa1.png +0 -0
  226. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/qa2.png +0 -0
  227. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/qa3.png +0 -0
  228. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/sig.py +0 -0
  229. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/sig.py.xdotool +0 -0
  230. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/sig1.png +0 -0
  231. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/sig2.png +0 -0
  232. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/sig3.png +0 -0
  233. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/sig4.png +0 -0
  234. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/smenu.py +0 -0
  235. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/smenu.py.xdotool +0 -0
  236. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/smenu1.png +0 -0
  237. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/smenu2.png +0 -0
  238. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/smenu3.png +0 -0
  239. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/urwid_attr.py +0 -0
  240. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/urwid_attr.py.xdotool +0 -0
  241. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/urwid_attr1.png +0 -0
  242. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/urwid_attr2.png +0 -0
  243. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/urwid_attr3.png +0 -0
  244. {urwid-3.0.1 → urwid-3.0.5}/docs/tutorial/urwid_attr4.png +0 -0
  245. {urwid-3.0.1 → urwid-3.0.5}/docs/urwid-logo.png +0 -0
  246. {urwid-3.0.1 → urwid-3.0.5}/examples/bigtext.py +0 -0
  247. {urwid-3.0.1 → urwid-3.0.5}/examples/browse.py +0 -0
  248. {urwid-3.0.1 → urwid-3.0.5}/examples/calc.py +0 -0
  249. {urwid-3.0.1 → urwid-3.0.5}/examples/dialog.py +0 -0
  250. {urwid-3.0.1 → urwid-3.0.5}/examples/fib.py +0 -0
  251. {urwid-3.0.1 → urwid-3.0.5}/examples/graph.py +0 -0
  252. {urwid-3.0.1 → urwid-3.0.5}/examples/input_test.py +0 -0
  253. {urwid-3.0.1 → urwid-3.0.5}/examples/pop_up.py +0 -0
  254. {urwid-3.0.1 → urwid-3.0.5}/examples/subproc.py +0 -0
  255. {urwid-3.0.1 → urwid-3.0.5}/examples/subproc2.py +0 -0
  256. {urwid-3.0.1 → urwid-3.0.5}/examples/terminal.py +0 -0
  257. {urwid-3.0.1 → urwid-3.0.5}/examples/tour.py +0 -0
  258. {urwid-3.0.1 → urwid-3.0.5}/examples/treesample.py +0 -0
  259. {urwid-3.0.1 → urwid-3.0.5}/examples/twisted_serve_ssh.tac +0 -0
  260. {urwid-3.0.1 → urwid-3.0.5}/setup.cfg +0 -0
  261. {urwid-3.0.1 → urwid-3.0.5}/test_requirements.txt +0 -0
  262. {urwid-3.0.1 → urwid-3.0.5}/tests/__init__.py +0 -0
  263. {urwid-3.0.1 → urwid-3.0.5}/tests/test_canvas.py +0 -0
  264. {urwid-3.0.1 → urwid-3.0.5}/tests/test_columns.py +0 -0
  265. {urwid-3.0.1 → urwid-3.0.5}/tests/test_container.py +0 -0
  266. {urwid-3.0.1 → urwid-3.0.5}/tests/test_doctests.py +0 -0
  267. {urwid-3.0.1 → urwid-3.0.5}/tests/test_escapes.py +0 -0
  268. {urwid-3.0.1 → urwid-3.0.5}/tests/test_event_loops.py +0 -0
  269. {urwid-3.0.1 → urwid-3.0.5}/tests/test_filler.py +0 -0
  270. {urwid-3.0.1 → urwid-3.0.5}/tests/test_floatedit.py +0 -0
  271. {urwid-3.0.1 → urwid-3.0.5}/tests/test_font.py +0 -0
  272. {urwid-3.0.1 → urwid-3.0.5}/tests/test_frame.py +0 -0
  273. {urwid-3.0.1 → urwid-3.0.5}/tests/test_graphics.py +0 -0
  274. {urwid-3.0.1 → urwid-3.0.5}/tests/test_grid_flow.py +0 -0
  275. {urwid-3.0.1 → urwid-3.0.5}/tests/test_line_box.py +0 -0
  276. {urwid-3.0.1 → urwid-3.0.5}/tests/test_listbox.py +0 -0
  277. {urwid-3.0.1 → urwid-3.0.5}/tests/test_main_loop.py +0 -0
  278. {urwid-3.0.1 → urwid-3.0.5}/tests/test_moved_imports.py +0 -0
  279. {urwid-3.0.1 → urwid-3.0.5}/tests/test_overlay.py +0 -0
  280. {urwid-3.0.1 → urwid-3.0.5}/tests/test_padding.py +0 -0
  281. {urwid-3.0.1 → urwid-3.0.5}/tests/test_pile.py +0 -0
  282. {urwid-3.0.1 → urwid-3.0.5}/tests/test_raw_display.py +0 -0
  283. {urwid-3.0.1 → urwid-3.0.5}/tests/test_signals.py +0 -0
  284. {urwid-3.0.1 → urwid-3.0.5}/tests/test_str_util.py +0 -0
  285. {urwid-3.0.1 → urwid-3.0.5}/tests/test_tree.py +0 -0
  286. {urwid-3.0.1 → urwid-3.0.5}/tests/test_util.py +0 -0
  287. {urwid-3.0.1 → urwid-3.0.5}/tests/test_vterm.py +0 -0
  288. {urwid-3.0.1 → urwid-3.0.5}/tests/test_widget.py +0 -0
  289. {urwid-3.0.1 → urwid-3.0.5}/tests/util.py +0 -0
  290. {urwid-3.0.1 → urwid-3.0.5}/urwid/command_map.py +0 -0
  291. {urwid-3.0.1 → urwid-3.0.5}/urwid/container.py +0 -0
  292. {urwid-3.0.1 → urwid-3.0.5}/urwid/decoration.py +0 -0
  293. {urwid-3.0.1 → urwid-3.0.5}/urwid/display/_web.css +0 -0
  294. {urwid-3.0.1 → urwid-3.0.5}/urwid/display/_web.js +0 -0
  295. {urwid-3.0.1 → urwid-3.0.5}/urwid/display/_win32.py +0 -0
  296. {urwid-3.0.1 → urwid-3.0.5}/urwid/display/_win32_raw_display.py +0 -0
  297. {urwid-3.0.1 → urwid-3.0.5}/urwid/display/html_fragment.py +0 -0
  298. {urwid-3.0.1 → urwid-3.0.5}/urwid/display/raw.py +0 -0
  299. {urwid-3.0.1 → urwid-3.0.5}/urwid/event_loop/__init__.py +0 -0
  300. {urwid-3.0.1 → urwid-3.0.5}/urwid/event_loop/abstract_loop.py +0 -0
  301. {urwid-3.0.1 → urwid-3.0.5}/urwid/event_loop/glib_loop.py +0 -0
  302. {urwid-3.0.1 → urwid-3.0.5}/urwid/event_loop/select_loop.py +0 -0
  303. {urwid-3.0.1 → urwid-3.0.5}/urwid/event_loop/tornado_loop.py +0 -0
  304. {urwid-3.0.1 → urwid-3.0.5}/urwid/event_loop/trio_loop.py +0 -0
  305. {urwid-3.0.1 → urwid-3.0.5}/urwid/event_loop/twisted_loop.py +0 -0
  306. {urwid-3.0.1 → urwid-3.0.5}/urwid/event_loop/zmq_loop.py +0 -0
  307. {urwid-3.0.1 → urwid-3.0.5}/urwid/graphics.py +0 -0
  308. {urwid-3.0.1 → urwid-3.0.5}/urwid/widget/__init__.py +0 -0
  309. {urwid-3.0.1 → urwid-3.0.5}/urwid/widget/bar_graph.py +0 -0
  310. {urwid-3.0.1 → urwid-3.0.5}/urwid/widget/columns.py +0 -0
  311. {urwid-3.0.1 → urwid-3.0.5}/urwid/widget/constants.py +0 -0
  312. {urwid-3.0.1 → urwid-3.0.5}/urwid/widget/container.py +0 -0
  313. {urwid-3.0.1 → urwid-3.0.5}/urwid/widget/grid_flow.py +0 -0
  314. {urwid-3.0.1 → urwid-3.0.5}/urwid/widget/overlay.py +0 -0
  315. {urwid-3.0.1 → urwid-3.0.5}/urwid/widget/pile.py +0 -0
  316. {urwid-3.0.1 → urwid-3.0.5}/urwid/widget/popup.py +0 -0
  317. {urwid-3.0.1 → urwid-3.0.5}/urwid/widget/treetools.py +0 -0
  318. {urwid-3.0.1 → urwid-3.0.5}/urwid/wimp.py +0 -0
  319. {urwid-3.0.1 → urwid-3.0.5}/urwid.egg-info/dependency_links.txt +0 -0
  320. {urwid-3.0.1 → urwid-3.0.5}/urwid.egg-info/not-zip-safe +0 -0
  321. {urwid-3.0.1 → urwid-3.0.5}/urwid.egg-info/top_level.txt +0 -0
@@ -0,0 +1,15 @@
1
+ FROM ubuntu:24.04
2
+ RUN apt-get update -y \
3
+ && apt-get upgrade -y \
4
+ && apt-get install -y \
5
+ python3-dev \
6
+ python3-pip \
7
+ python3-virtualenv \
8
+ python3-gi \
9
+ python3-gi-cairo \
10
+ gobject-introspection \
11
+ libgirepository-2.0-dev \
12
+ libcairo2-dev \
13
+ && apt-get clean
14
+ RUN mkdir -p ~/.virtualenvs \
15
+ && virtualenv --download ~/.virtualenvs/urwid
@@ -6,6 +6,11 @@
6
6
  "ghcr.io/devcontainers/features/github-cli": {}
7
7
  },
8
8
  "customizations": {
9
+ "jetbrains": {
10
+ "settings": {
11
+ "com.intellij:app:Vcs-Log-App-Settings.show_changes_from_parents": true
12
+ }
13
+ },
9
14
  // Configure properties specific to VS Code.
10
15
  "vscode": {
11
16
  // Set *default* container specific settings.json values on container create.
@@ -32,4 +37,4 @@
32
37
  "init": true,
33
38
  "postCreateCommand": "~/.virtualenvs/urwid/bin/pip3 install isort black ruff pylint refurb mypy",
34
39
  "postStartCommand": "~/.virtualenvs/urwid/bin/pip3 install -r test_requirements.txt PyGObject && ~/.virtualenvs/urwid/bin/pip3 install -U -e ."
35
- }
40
+ }
@@ -23,11 +23,11 @@ jobs:
23
23
  Build:
24
24
  runs-on: ubuntu-latest
25
25
  steps:
26
- - uses: actions/checkout@v4
26
+ - uses: actions/checkout@v6
27
27
  with:
28
28
  fetch-depth: 0 # need for setuptools_scm
29
29
  - name: Set up Python
30
- uses: actions/setup-python@v5
30
+ uses: actions/setup-python@v6
31
31
  with:
32
32
  python-version: '3.x'
33
33
  cache: 'pip'
@@ -44,7 +44,7 @@ jobs:
44
44
  run: pip install -e .
45
45
  - name: Build documentation
46
46
  run: sphinx-build docs build/documentation
47
- - uses: actions/upload-artifact@v4
47
+ - uses: actions/upload-artifact@v6
48
48
  with:
49
49
  path: build/documentation
50
50
  name: documentation
@@ -4,57 +4,37 @@ on:
4
4
  pull_request:
5
5
  paths:
6
6
  - "ruff-requirements.txt"
7
- - "black-requirements.txt"
8
- - "isort-requirements.txt"
9
7
 
10
8
  concurrency:
11
9
  group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
12
10
  cancel-in-progress: true
13
11
 
14
12
  jobs:
15
- Isort:
16
- name: Validate import sorting
13
+ Ruff-format:
14
+ name: Validate formatting
17
15
  runs-on: ubuntu-latest
18
16
  steps:
19
- - uses: actions/checkout@v4
17
+ - uses: actions/checkout@v6
20
18
  - name: Set up Python
21
- uses: actions/setup-python@v5
19
+ uses: actions/setup-python@v6
22
20
  with:
23
21
  python-version: '3.x'
24
22
  cache: 'pip'
25
23
  - name: Install dependencies
26
24
  run: |
27
25
  python -m pip install --upgrade pip
28
- pip install --upgrade -r isort-requirements.txt
29
- - name: Check imports with isort
30
- run: |
31
- isort --check --diff .
32
-
33
- Black:
34
- name: Validate black formatting
35
- runs-on: ubuntu-latest
36
- steps:
37
- - uses: actions/checkout@v4
38
- - name: Set up Python
39
- uses: actions/setup-python@v5
40
- with:
41
- python-version: '3.x'
42
- cache: 'pip'
43
- - name: Install dependencies
44
- run: |
45
- python -m pip install --upgrade pip
46
- pip install --upgrade -r black-requirements.txt
47
- - name: Check code style with black
26
+ pip install --upgrade -r ruff-requirements.txt
27
+ - name: Check code style with ruff
48
28
  run: |
49
- black --check .
29
+ ruff format --check .
50
30
 
51
31
  Ruff:
52
32
  name: Check with Ruff
53
33
  runs-on: ubuntu-latest
54
34
  steps:
55
- - uses: actions/checkout@v4
35
+ - uses: actions/checkout@v6
56
36
  - name: Set up Python
57
- uses: actions/setup-python@v5
37
+ uses: actions/setup-python@v6
58
38
  with:
59
39
  python-version: '3.x'
60
40
  cache: 'pip'
@@ -70,14 +50,14 @@ jobs:
70
50
  name: Check with pylint
71
51
  runs-on: ubuntu-latest
72
52
  steps:
73
- - uses: actions/checkout@v4
53
+ - uses: actions/checkout@v6
74
54
  - name: Install Ubuntu dependencies
75
55
  run: |
76
56
  sudo apt-get -qq update
77
57
  sudo apt-get install -y python3-dev python3-gi python3-gi-cairo
78
58
  sudo apt-get install -y gobject-introspection libgirepository-2.0-dev libcairo2-dev
79
59
  - name: Set up Python
80
- uses: actions/setup-python@v5
60
+ uses: actions/setup-python@v6
81
61
  with:
82
62
  python-version: '3.x'
83
63
  cache: 'pip'
@@ -10,6 +10,6 @@ jobs:
10
10
  pull-requests: write
11
11
  runs-on: ubuntu-latest
12
12
  steps:
13
- - uses: actions/labeler@v5
13
+ - uses: actions/labeler@v6
14
14
  with:
15
15
  dot: true
@@ -26,49 +26,31 @@ concurrency:
26
26
  cancel-in-progress: true
27
27
 
28
28
  jobs:
29
- Isort:
30
- name: Validate import sorting
29
+ Ruff-format:
30
+ name: Validate formatting
31
31
  runs-on: ubuntu-latest
32
32
  steps:
33
- - uses: actions/checkout@v4
33
+ - uses: actions/checkout@v6
34
34
  - name: Set up Python
35
- uses: actions/setup-python@v5
35
+ uses: actions/setup-python@v6
36
36
  with:
37
37
  python-version: '3.x'
38
38
  cache: 'pip'
39
39
  - name: Install dependencies
40
40
  run: |
41
41
  python -m pip install --upgrade pip
42
- pip install --upgrade -r isort-requirements.txt
43
- - name: Check imports with isort
44
- run: |
45
- isort --check --diff .
46
-
47
- Black:
48
- name: Validate black formatting
49
- runs-on: ubuntu-latest
50
- steps:
51
- - uses: actions/checkout@v4
52
- - name: Set up Python
53
- uses: actions/setup-python@v5
54
- with:
55
- python-version: '3.x'
56
- cache: 'pip'
57
- - name: Install dependencies
58
- run: |
59
- python -m pip install --upgrade pip
60
- pip install --upgrade -r black-requirements.txt
61
- - name: Check code style with black
42
+ pip install --upgrade -r ruff-requirements.txt
43
+ - name: Check code style with ruff
62
44
  run: |
63
- black --check .
45
+ ruff format --check .
64
46
 
65
47
  Ruff:
66
48
  name: Check with Ruff
67
49
  runs-on: ubuntu-latest
68
50
  steps:
69
- - uses: actions/checkout@v4
51
+ - uses: actions/checkout@v6
70
52
  - name: Set up Python
71
- uses: actions/setup-python@v5
53
+ uses: actions/setup-python@v6
72
54
  with:
73
55
  python-version: '3.x'
74
56
  cache: 'pip'
@@ -84,14 +66,14 @@ jobs:
84
66
  name: Check with pylint
85
67
  runs-on: ubuntu-latest
86
68
  steps:
87
- - uses: actions/checkout@v4
69
+ - uses: actions/checkout@v6
88
70
  - name: Install Ubuntu dependencies
89
71
  run: |
90
72
  sudo apt-get -qq update
91
73
  sudo apt-get install -y python3-dev python3-gi python3-gi-cairo
92
74
  sudo apt-get install -y gobject-introspection libgirepository-2.0-dev libcairo2-dev
93
75
  - name: Set up Python
94
- uses: actions/setup-python@v5
76
+ uses: actions/setup-python@v6
95
77
  with:
96
78
  python-version: '3.x'
97
79
  cache: 'pip'
@@ -106,7 +88,7 @@ jobs:
106
88
  run: pylint --output-format=github urwid
107
89
 
108
90
  Test:
109
- needs: [ Isort, Black, Ruff, PyLint ]
91
+ needs: [ Ruff-format, Ruff, PyLint ]
110
92
  runs-on: ${{ matrix.os }}
111
93
  strategy:
112
94
  max-parallel: 6
@@ -114,14 +96,17 @@ jobs:
114
96
  os: [ "ubuntu-latest", "windows-latest" ]
115
97
  # , "macos-latest"
116
98
  # enable macOS only if OS specific branch will be added
117
- python-version: [ "3.9", "3.10", "3.11", "3.12", "3.13" ]
99
+ python-version: [ "3.9", "3.10", "3.11", "3.12", "3.13", "3.14" ]
100
+ exclude:
101
+ - os: "windows-latest"
102
+ python-version: "3.14"
118
103
 
119
104
  steps:
120
- - uses: actions/checkout@v4
105
+ - uses: actions/checkout@v6
121
106
  with:
122
107
  fetch-depth: 0 # need for setuptools_scm
123
108
  - name: Set up Python ${{ matrix.python-version }}
124
- uses: actions/setup-python@v5
109
+ uses: actions/setup-python@v6
125
110
  with:
126
111
  python-version: ${{ matrix.python-version }}
127
112
  allow-prereleases: true
@@ -170,14 +155,14 @@ jobs:
170
155
 
171
156
  build:
172
157
  name: Build distribution
173
- needs: [ Test, Isort, Black, Ruff, PyLint ]
158
+ needs: [ Test, Ruff-format, Ruff, PyLint ]
174
159
  runs-on: ubuntu-latest
175
160
  steps:
176
- - uses: actions/checkout@v4
161
+ - uses: actions/checkout@v6
177
162
  with:
178
163
  fetch-depth: 0 # need for setuptools_scm
179
164
 
180
- - uses: actions/setup-python@v5
165
+ - uses: actions/setup-python@v6
181
166
  with:
182
167
  python-version: "3.x"
183
168
 
@@ -187,13 +172,13 @@ jobs:
187
172
  - name: Build dist
188
173
  run: python -m build
189
174
 
190
- - uses: actions/upload-artifact@v4
175
+ - uses: actions/upload-artifact@v6
191
176
  with:
192
177
  path: dist/*.tar.gz
193
178
  name: built-sdist
194
179
  retention-days: 3
195
180
 
196
- - uses: actions/upload-artifact@v4
181
+ - uses: actions/upload-artifact@v6
197
182
  with:
198
183
  path: dist/*.whl
199
184
  name: built-bdist
@@ -204,9 +189,9 @@ jobs:
204
189
  runs-on: ubuntu-latest
205
190
  needs: [ build ]
206
191
  steps:
207
- - uses: actions/checkout@v4
192
+ - uses: actions/checkout@v6
208
193
  - name: Set up Python
209
- uses: actions/setup-python@v5
194
+ uses: actions/setup-python@v6
210
195
  with:
211
196
  python-version: '3.x'
212
197
  cache: 'pip'
@@ -214,7 +199,7 @@ jobs:
214
199
  run: |
215
200
  python -m pip install --upgrade pip
216
201
  pip install --upgrade twine
217
- - uses: actions/download-artifact@v4
202
+ - uses: actions/download-artifact@v7
218
203
  with:
219
204
  # unpacks default artifact into dist/
220
205
  # if `name: wheels` is omitted, the action will create extra parent dir
@@ -239,7 +224,7 @@ jobs:
239
224
  permissions:
240
225
  id-token: write # IMPORTANT: this permission is mandatory for trusted publishing
241
226
  steps:
242
- - uses: actions/download-artifact@v4
227
+ - uses: actions/download-artifact@v7
243
228
  with:
244
229
  pattern: built-*
245
230
  merge-multiple: true
@@ -10,9 +10,9 @@ jobs:
10
10
  check:
11
11
  runs-on: ubuntu-latest
12
12
  steps:
13
- - uses: actions/checkout@v4
13
+ - uses: actions/checkout@v6
14
14
  - name: Set up Python
15
- uses: actions/setup-python@v5
15
+ uses: actions/setup-python@v6
16
16
  with:
17
17
  python-version: '3.x'
18
18
  cache: 'pip'
@@ -1,35 +1,21 @@
1
1
  repos:
2
2
  - repo: https://github.com/pre-commit/pre-commit-hooks
3
- rev: v5.0.0
3
+ rev: v6.0.0
4
4
  hooks:
5
5
  - id: check-yaml
6
6
  - id: end-of-file-fixer
7
7
  - id: trailing-whitespace
8
8
  - id: mixed-line-ending
9
9
 
10
- - repo: https://github.com/pycqa/isort
11
- rev: 6.0.1
12
- hooks:
13
- - id: isort
14
- name: isort (python)
15
- - id: isort
16
- name: isort (cython)
17
- types: [cython]
18
- - id: isort
19
- name: isort (pyi)
20
- types: [pyi]
21
-
22
- - repo: https://github.com/psf/black
23
- rev: 25.1.0
24
- hooks:
25
- - id: black
26
-
27
10
  - repo: https://github.com/astral-sh/ruff-pre-commit
28
11
  # Ruff version.
29
- rev: v0.11.8
12
+ rev: v0.14.5
30
13
  hooks:
31
- - id: ruff
32
- args: [ --fix, --exit-non-zero-on-fix ]
14
+ # Run the linter.
15
+ - id: ruff-check
16
+ args: [ --fix ]
17
+ # Run the formatter.
18
+ - id: ruff-format
33
19
 
34
20
  - repo: https://github.com/adrienverge/yamllint.git
35
21
  rev: v1.37.1
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: urwid
3
- Version: 3.0.1
3
+ Version: 3.0.5
4
4
  Summary: A full-featured console (xterm et al.) user interface library
5
5
  Author-email: Ian Ward <ian@excess.org>
6
- License: LGPL-2.1-only
6
+ License-Expression: LGPL-2.1-only
7
7
  Project-URL: Homepage, https://urwid.org/
8
8
  Project-URL: Documentation, https://urwid.org/manual/index.html
9
9
  Project-URL: Repository, https://github.com/urwid/urwid
@@ -14,7 +14,6 @@ Classifier: Development Status :: 5 - Production/Stable
14
14
  Classifier: Environment :: Console
15
15
  Classifier: Environment :: Console :: Curses
16
16
  Classifier: Intended Audience :: Developers
17
- Classifier: License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)
18
17
  Classifier: Operating System :: POSIX
19
18
  Classifier: Operating System :: Unix
20
19
  Classifier: Operating System :: MacOS :: MacOS X
@@ -27,13 +26,14 @@ Classifier: Programming Language :: Python :: 3.10
27
26
  Classifier: Programming Language :: Python :: 3.11
28
27
  Classifier: Programming Language :: Python :: 3.12
29
28
  Classifier: Programming Language :: Python :: 3.13
29
+ Classifier: Programming Language :: Python :: 3.14
30
30
  Classifier: Programming Language :: Python :: 3 :: Only
31
31
  Classifier: Programming Language :: Python :: Implementation :: CPython
32
32
  Classifier: Programming Language :: Python :: Implementation :: PyPy
33
33
  Requires-Python: >=3.9.0
34
34
  Description-Content-Type: text/x-rst
35
35
  License-File: COPYING
36
- Requires-Dist: wcwidth
36
+ Requires-Dist: wcwidth>=0.4
37
37
  Provides-Extra: curses
38
38
  Requires-Dist: windows-curses; sys_platform == "win32" and extra == "curses"
39
39
  Provides-Extra: glib
@@ -74,7 +74,7 @@ It includes many features useful for text console application developers includi
74
74
  - Display modules include raw, curses, and experimental LCD and web displays
75
75
  - Support for UTF-8, simple 8-bit and CJK encodings
76
76
  - 24-bit (true color), 256 color, and 88 color mode support
77
- - Compatible with Python 3.7+ and PyPy
77
+ - Compatible with Python 3.9+ and PyPy
78
78
 
79
79
  Home Page:
80
80
  http://urwid.org/
@@ -104,6 +104,8 @@ Alternatively if you are on Debian or Ubuntu
104
104
  Windows support notes
105
105
  =====================
106
106
 
107
+ Windows support is limited to the Windows 10+ due to ANSI support requirement.
108
+
107
109
  * Not supported:
108
110
 
109
111
  1. Terminal widget and all related render API (TermCanvas, TermCharset, TermModes, TermScroller)
@@ -145,6 +147,7 @@ Supported Python versions
145
147
  - 3.11
146
148
  - 3.12
147
149
  - 3.13
150
+ - 3.14
148
151
  - pypy3
149
152
 
150
153
  Authors
@@ -19,7 +19,7 @@ It includes many features useful for text console application developers includi
19
19
  - Display modules include raw, curses, and experimental LCD and web displays
20
20
  - Support for UTF-8, simple 8-bit and CJK encodings
21
21
  - 24-bit (true color), 256 color, and 88 color mode support
22
- - Compatible with Python 3.7+ and PyPy
22
+ - Compatible with Python 3.9+ and PyPy
23
23
 
24
24
  Home Page:
25
25
  http://urwid.org/
@@ -49,6 +49,8 @@ Alternatively if you are on Debian or Ubuntu
49
49
  Windows support notes
50
50
  =====================
51
51
 
52
+ Windows support is limited to the Windows 10+ due to ANSI support requirement.
53
+
52
54
  * Not supported:
53
55
 
54
56
  1. Terminal widget and all related render API (TermCanvas, TermCharset, TermModes, TermScroller)
@@ -90,6 +92,7 @@ Supported Python versions
90
92
  - 3.11
91
93
  - 3.12
92
94
  - 3.13
95
+ - 3.14
93
96
  - pypy3
94
97
 
95
98
  Authors
@@ -2,7 +2,6 @@ Development Status :: 5 - Production/Stable
2
2
  Environment :: Console
3
3
  Environment :: Console :: Curses
4
4
  Intended Audience :: Developers
5
- License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)
6
5
  Operating System :: POSIX
7
6
  Operating System :: Unix
8
7
  Operating System :: MacOS :: MacOS X
@@ -15,6 +14,7 @@ Programming Language :: Python :: 3.10
15
14
  Programming Language :: Python :: 3.11
16
15
  Programming Language :: Python :: 3.12
17
16
  Programming Language :: Python :: 3.13
17
+ Programming Language :: Python :: 3.14
18
18
  Programming Language :: Python :: 3 :: Only
19
19
  Programming Language :: Python :: Implementation :: CPython
20
20
  Programming Language :: Python :: Implementation :: PyPy
@@ -2,6 +2,77 @@
2
2
  Changelog
3
3
  ---------
4
4
 
5
+ Urwid 3.0.5
6
+ ===========
7
+
8
+ 2026-02-02
9
+
10
+ Deprecations ⚡
11
+ ++++++++++++++
12
+ * Un-deprecate `user_arg` for signals by @penguinolog in https://github.com/urwid/urwid/pull/1092
13
+ Bug fixes 🕷
14
+ ++++++++++++
15
+ * Fix terminal scroll TypeError by @penguinolog in https://github.com/urwid/urwid/pull/1098
16
+ * Bugfix some kinds of emojis with grapheme boundry support by @jquast in https://github.com/urwid/urwid/pull/1100
17
+ * Fix: Text.pack line splitting not match Text.render by @penguinolog in https://github.com/urwid/urwid/pull/1099
18
+
19
+ New Contributors
20
+ ++++++++++++++++
21
+ * @jquast made their first contribution in https://github.com/urwid/urwid/pull/1100
22
+
23
+ **Full Changelog**: https://github.com/urwid/urwid/compare/3.0.4...3.0.5
24
+
25
+ Urwid 3.0.4
26
+ ===========
27
+
28
+ 2025-12-01
29
+
30
+ Deprecations ⚡
31
+ ++++++++++++++
32
+ * Fix CheckBox DeprecationWarning: Use user_args instead of user_arg by @sawdmn in https://github.com/urwid/urwid/pull/1079
33
+ Other Changes
34
+ +++++++++++++
35
+ * Refactoring: use official python way for lazy imports by @penguinolog in https://github.com/urwid/urwid/pull/1077
36
+
37
+ New Contributors
38
+ ++++++++++++++++
39
+ * @sawdmn made their first contribution in https://github.com/urwid/urwid/pull/1079
40
+
41
+ **Full Changelog**: https://github.com/urwid/urwid/compare/3.0.3...3.0.4
42
+
43
+ Urwid 3.0.3
44
+ ===========
45
+
46
+ 2025-09-15
47
+
48
+ Bug fixes 🕷
49
+ ++++++++++++
50
+ * Python 3.14: fix buffer overflow on terminal size request by @meeuw in https://github.com/urwid/urwid/pull/1027
51
+ * Add guard against empty list on focus complete. by @gryf in https://github.com/urwid/urwid/pull/1047
52
+
53
+ Documentation 🕮
54
+ ++++++++++++++++
55
+ * Add extra code type annotations by @penguinolog in https://github.com/urwid/urwid/pull/1037
56
+ * Mark Windows support limitation: win10+ only by @penguinolog in https://github.com/urwid/urwid/pull/1038
57
+
58
+ Other Changes
59
+ +++++++++++++
60
+ * Maintenance: fix devcontainer to support actual requirements without pinning by @penguinolog in https://github.com/urwid/urwid/pull/1035
61
+
62
+ New Contributors
63
+ ++++++++++++++++
64
+ * @meeuw made their first contribution in https://github.com/urwid/urwid/pull/1027
65
+ * @gryf made their first contribution in https://github.com/urwid/urwid/pull/1047
66
+
67
+ Urwid 3.0.2
68
+ ===========
69
+
70
+ 2025-05-07
71
+
72
+ Bug fixes 🕷
73
+ ++++++++++++
74
+ * Bugfix: Corner case: Scrollbar render for only 1 row height by @penguinolog in https://github.com/urwid/urwid/pull/1021
75
+
5
76
  Urwid 3.0.1
6
77
  ===========
7
78
 
Binary file
@@ -283,7 +283,7 @@ def parse_chart(chart: str, convert):
283
283
  entry = entry[elen:].strip()
284
284
  else: # try the whole thing
285
285
  attrtext = convert(entry.strip())
286
- assert attrtext, f"Invalid palette entry: {entry!r}" # noqa: S101 # "assert" is ok for examples
286
+ assert attrtext, f"Invalid palette entry: {entry!r}" # noqa: S101 # "assert" is OK for examples
287
287
  elen = len(entry)
288
288
  entry = ""
289
289
  attr, text = attrtext
@@ -48,7 +48,8 @@ class LineWalker(urwid.ListWalker):
48
48
  self.focus = 0
49
49
 
50
50
  def __del__(self) -> None:
51
- self.file.close()
51
+ if self.file is not None:
52
+ self.file.close()
52
53
 
53
54
  def get_focus(self):
54
55
  return self._get_at_pos(self.focus)
@@ -99,7 +100,7 @@ class LineWalker(urwid.ListWalker):
99
100
  # file is closed, so there are no more lines
100
101
  return None, None
101
102
 
102
- assert pos == len(self.lines), "out of order request?" # noqa: S101 # "assert" is ok in examples
103
+ assert pos == len(self.lines), "out of order request?" # noqa: S101 # "assert" is OK in examples
103
104
 
104
105
  self.read_next_line()
105
106
 
@@ -9,7 +9,7 @@ class MultiPudding(urwid.Widget):
9
9
  def rows(self, size: tuple[int], focus: bool = False) -> int:
10
10
  return 1
11
11
 
12
- def render(self, size: tuple[int], focus: bool = False) -> urwid.TextCanvas:
12
+ def render(self, size: tuple[int] | tuple[int, int], focus: bool = False) -> urwid.TextCanvas:
13
13
  if len(size) == 1:
14
14
  (maxcol,) = size
15
15
  maxrow = 1
@@ -91,13 +91,13 @@ class AsyncScreen(Screen):
91
91
 
92
92
  _pending_task = None
93
93
 
94
- def write(self, data):
94
+ def write(self, data: str) -> None:
95
95
  self.writer.write(data.encode(self.encoding))
96
96
 
97
- def flush(self):
97
+ def flush(self) -> None:
98
98
  pass
99
99
 
100
- def hook_event_loop(self, event_loop, callback):
100
+ def hook_event_loop(self, event_loop: urwid.AsyncioEventLoop, callback) -> None:
101
101
  # Wait on the reader's read coro, and when there's data to read, call
102
102
  # the callback and then wait again
103
103
  def pump_reader(fut=None):
@@ -126,14 +126,14 @@ class AsyncScreen(Screen):
126
126
 
127
127
  pump_reader()
128
128
 
129
- def unhook_event_loop(self, event_loop):
129
+ def unhook_event_loop(self, event_loop) -> None:
130
130
  if self._pending_task:
131
131
  self._pending_task.cancel()
132
132
  del self._pending_task
133
133
 
134
134
 
135
135
  class UrwidProtocol(asyncio.Protocol):
136
- def connection_made(self, transport):
136
+ def connection_made(self, transport) -> None:
137
137
  print("Got a client!")
138
138
  self.transport = transport
139
139
 
@@ -155,10 +155,10 @@ class UrwidProtocol(asyncio.Protocol):
155
155
 
156
156
  self.urwid_loop.start()
157
157
 
158
- def data_received(self, data):
158
+ def data_received(self, data: bytes) -> None:
159
159
  self.reader.feed_data(data)
160
160
 
161
- def connection_lost(self, exc):
161
+ def connection_lost(self, exc: Exception | None) -> None:
162
162
  print("Lost a client...")
163
163
  self.reader.feed_eof()
164
164
  self.urwid_loop.stop()
@@ -48,7 +48,8 @@ class LineWalker(urwid.ListWalker):
48
48
  self.focus = 0
49
49
 
50
50
  def __del__(self) -> None:
51
- self.file.close()
51
+ if self.file is not None:
52
+ self.file.close()
52
53
 
53
54
  def get_focus(self):
54
55
  return self._get_at_pos(self.focus)
@@ -99,7 +100,7 @@ class LineWalker(urwid.ListWalker):
99
100
  # file is closed, so there are no more lines
100
101
  return None, None
101
102
 
102
- assert pos == len(self.lines), "out of order request?" # noqa: S101 # "assert" is ok in examples
103
+ assert pos == len(self.lines), "out of order request?" # noqa: S101 # "assert" is OK in examples
103
104
 
104
105
  self.read_next_line()
105
106
 
@@ -168,7 +168,7 @@ class LCDHorizontalSlider(urwid.WidgetWrap[urwid.Columns]):
168
168
  # move the slider based on which arrow is focused
169
169
  if key == "enter":
170
170
  # use the correct size for adjusting the bar
171
- self.bar.move_position((self._w.column_widths(size)[1],), self._w.get_focus_column() != 0)
171
+ self.bar.move_position((self._w.column_widths(size)[1],), self._w.focus_position != 0)
172
172
  self.callback(self.bar.value)
173
173
  return None
174
174