urwid 3.0.2__tar.gz → 3.0.3__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.

Potentially problematic release.


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

Files changed (318) hide show
  1. urwid-3.0.3/.devcontainer/dev.dockerfile +15 -0
  2. {urwid-3.0.2 → urwid-3.0.3}/.devcontainer/devcontainer.json +6 -1
  3. {urwid-3.0.2 → urwid-3.0.3}/.github/workflows/documentation.yml +2 -2
  4. {urwid-3.0.2 → urwid-3.0.3}/.github/workflows/isolated_static_check.yml +8 -8
  5. {urwid-3.0.2 → urwid-3.0.3}/.github/workflows/labels.yml +1 -1
  6. {urwid-3.0.2 → urwid-3.0.3}/.github/workflows/pythonpackage.yml +16 -16
  7. {urwid-3.0.2 → urwid-3.0.3}/.github/workflows/yamllint.yml +2 -2
  8. {urwid-3.0.2 → urwid-3.0.3}/.pre-commit-config.yaml +1 -1
  9. {urwid-3.0.2 → urwid-3.0.3}/PKG-INFO +3 -1
  10. {urwid-3.0.2 → urwid-3.0.3}/README.rst +2 -0
  11. {urwid-3.0.2 → urwid-3.0.3}/docs/changelog.rst +24 -0
  12. {urwid-3.0.2 → urwid-3.0.3/docs}/examples/palette_test.py +1 -1
  13. {urwid-3.0.2 → urwid-3.0.3}/docs/examples/real_edit.py +1 -1
  14. {urwid-3.0.2 → urwid-3.0.3}/docs/manual/wanat_multi.py +1 -1
  15. {urwid-3.0.2 → urwid-3.0.3}/examples/asyncio_socket_server.py +7 -7
  16. {urwid-3.0.2 → urwid-3.0.3}/examples/edit.py +1 -1
  17. {urwid-3.0.2 → urwid-3.0.3}/examples/lcd_cf635.py +1 -1
  18. {urwid-3.0.2/docs → urwid-3.0.3}/examples/palette_test.py +1 -1
  19. {urwid-3.0.2 → urwid-3.0.3}/examples/twisted_serve_ssh.py +1 -1
  20. urwid-3.0.3/pylint-requirements.txt +1 -0
  21. urwid-3.0.3/ruff-requirements.txt +1 -0
  22. {urwid-3.0.2 → urwid-3.0.3}/urwid/canvas.py +6 -6
  23. {urwid-3.0.2 → urwid-3.0.3}/urwid/display/_posix_raw_display.py +4 -4
  24. {urwid-3.0.2 → urwid-3.0.3}/urwid/display/_raw_display_base.py +11 -9
  25. {urwid-3.0.2 → urwid-3.0.3}/urwid/display/common.py +2 -2
  26. {urwid-3.0.2 → urwid-3.0.3}/urwid/display/curses.py +1 -1
  27. {urwid-3.0.2 → urwid-3.0.3}/urwid/display/escape.py +15 -3
  28. {urwid-3.0.2 → urwid-3.0.3}/urwid/display/lcd.py +4 -4
  29. {urwid-3.0.2 → urwid-3.0.3}/urwid/display/web.py +3 -3
  30. {urwid-3.0.2 → urwid-3.0.3}/urwid/version.py +16 -3
  31. {urwid-3.0.2 → urwid-3.0.3}/urwid/widget/listbox.py +3 -0
  32. {urwid-3.0.2 → urwid-3.0.3}/urwid.egg-info/PKG-INFO +3 -1
  33. urwid-3.0.2/.devcontainer/dev.dockerfile +0 -8
  34. urwid-3.0.2/pylint-requirements.txt +0 -1
  35. urwid-3.0.2/ruff-requirements.txt +0 -1
  36. {urwid-3.0.2 → urwid-3.0.3}/.coveralls.yml +0 -0
  37. {urwid-3.0.2 → urwid-3.0.3}/.dockerignore +0 -0
  38. {urwid-3.0.2 → urwid-3.0.3}/.editorconfig +0 -0
  39. {urwid-3.0.2 → urwid-3.0.3}/.github/CODE_OF_CONDUCT.md +0 -0
  40. {urwid-3.0.2 → urwid-3.0.3}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  41. {urwid-3.0.2 → urwid-3.0.3}/.github/ISSUE_TEMPLATE/docs.md +0 -0
  42. {urwid-3.0.2 → urwid-3.0.3}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  43. {urwid-3.0.2 → urwid-3.0.3}/.github/ISSUE_TEMPLATE/question.md +0 -0
  44. {urwid-3.0.2 → urwid-3.0.3}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  45. {urwid-3.0.2 → urwid-3.0.3}/.github/dependabot.yml +0 -0
  46. {urwid-3.0.2 → urwid-3.0.3}/.github/labeler.yml +0 -0
  47. {urwid-3.0.2 → urwid-3.0.3}/.github/release.yml +0 -0
  48. {urwid-3.0.2 → urwid-3.0.3}/.gitignore +0 -0
  49. {urwid-3.0.2 → urwid-3.0.3}/.yamllint.yml +0 -0
  50. {urwid-3.0.2 → urwid-3.0.3}/COPYING +0 -0
  51. {urwid-3.0.2 → urwid-3.0.3}/MANIFEST.in +0 -0
  52. {urwid-3.0.2 → urwid-3.0.3}/black-requirements.txt +0 -0
  53. {urwid-3.0.2 → urwid-3.0.3}/classifiers.txt +0 -0
  54. {urwid-3.0.2 → urwid-3.0.3}/docs/Makefile +0 -0
  55. {urwid-3.0.2 → urwid-3.0.3}/docs/conf.py +0 -0
  56. {urwid-3.0.2 → urwid-3.0.3}/docs/examples/bigtext.py +0 -0
  57. {urwid-3.0.2 → urwid-3.0.3}/docs/examples/bigtext.py.xdotool +0 -0
  58. {urwid-3.0.2 → urwid-3.0.3}/docs/examples/bigtext1.png +0 -0
  59. {urwid-3.0.2 → urwid-3.0.3}/docs/examples/bigtext2.png +0 -0
  60. {urwid-3.0.2 → urwid-3.0.3}/docs/examples/bigtext3.png +0 -0
  61. {urwid-3.0.2 → urwid-3.0.3}/docs/examples/browse.py +0 -0
  62. {urwid-3.0.2 → urwid-3.0.3}/docs/examples/browse.py.xdotool +0 -0
  63. {urwid-3.0.2 → urwid-3.0.3}/docs/examples/browse1.png +0 -0
  64. {urwid-3.0.2 → urwid-3.0.3}/docs/examples/browse2.png +0 -0
  65. {urwid-3.0.2 → urwid-3.0.3}/docs/examples/edit.py +0 -0
  66. {urwid-3.0.2 → urwid-3.0.3}/docs/examples/edit.py.xdotool +0 -0
  67. {urwid-3.0.2 → urwid-3.0.3}/docs/examples/edit1.png +0 -0
  68. {urwid-3.0.2 → urwid-3.0.3}/docs/examples/edit2.png +0 -0
  69. {urwid-3.0.2 → urwid-3.0.3}/docs/examples/edit_text.txt +0 -0
  70. {urwid-3.0.2 → urwid-3.0.3}/docs/examples/graph.py +0 -0
  71. {urwid-3.0.2 → urwid-3.0.3}/docs/examples/graph.py.xdotool +0 -0
  72. {urwid-3.0.2 → urwid-3.0.3}/docs/examples/graph1.png +0 -0
  73. {urwid-3.0.2 → urwid-3.0.3}/docs/examples/graph2.png +0 -0
  74. {urwid-3.0.2 → urwid-3.0.3}/docs/examples/index.rst +0 -0
  75. {urwid-3.0.2 → urwid-3.0.3}/docs/examples/palette_test.py.xdotool +0 -0
  76. {urwid-3.0.2 → urwid-3.0.3}/docs/examples/palette_test1.png +0 -0
  77. {urwid-3.0.2 → urwid-3.0.3}/docs/examples/palette_test2.png +0 -0
  78. {urwid-3.0.2 → urwid-3.0.3}/docs/examples/pop_up.py +0 -0
  79. {urwid-3.0.2 → urwid-3.0.3}/docs/examples/pop_up.py.xdotool +0 -0
  80. {urwid-3.0.2 → urwid-3.0.3}/docs/examples/pop_up1.png +0 -0
  81. {urwid-3.0.2 → urwid-3.0.3}/docs/examples/pop_up2.png +0 -0
  82. {urwid-3.0.2 → urwid-3.0.3}/docs/examples/real_browse.py +0 -0
  83. {urwid-3.0.2 → urwid-3.0.3}/docs/examples/subproc.py +0 -0
  84. {urwid-3.0.2 → urwid-3.0.3}/docs/examples/subproc.py.xdotool +0 -0
  85. {urwid-3.0.2 → urwid-3.0.3}/docs/examples/subproc1.png +0 -0
  86. {urwid-3.0.2 → urwid-3.0.3}/docs/examples/subproc2.png +0 -0
  87. {urwid-3.0.2 → urwid-3.0.3}/docs/examples/subproc2.py +0 -0
  88. {urwid-3.0.2 → urwid-3.0.3}/docs/examples/tour.py +0 -0
  89. {urwid-3.0.2 → urwid-3.0.3}/docs/examples/tour.py.xdotool +0 -0
  90. {urwid-3.0.2 → urwid-3.0.3}/docs/examples/tour1.png +0 -0
  91. {urwid-3.0.2 → urwid-3.0.3}/docs/examples/tour2.png +0 -0
  92. {urwid-3.0.2 → urwid-3.0.3}/docs/index.rst +0 -0
  93. {urwid-3.0.2 → urwid-3.0.3}/docs/manual/bright_combinations.py +0 -0
  94. {urwid-3.0.2 → urwid-3.0.3}/docs/manual/bright_combinations.py.xdotool +0 -0
  95. {urwid-3.0.2 → urwid-3.0.3}/docs/manual/bright_combinations1.png +0 -0
  96. {urwid-3.0.2 → urwid-3.0.3}/docs/manual/canvascache.rst +0 -0
  97. {urwid-3.0.2 → urwid-3.0.3}/docs/manual/displayattributes.rst +0 -0
  98. {urwid-3.0.2 → urwid-3.0.3}/docs/manual/displaymodules.rst +0 -0
  99. {urwid-3.0.2 → urwid-3.0.3}/docs/manual/encodings.rst +0 -0
  100. {urwid-3.0.2 → urwid-3.0.3}/docs/manual/images/display_modules.png +0 -0
  101. {urwid-3.0.2 → urwid-3.0.3}/docs/manual/images/introduction.png +0 -0
  102. {urwid-3.0.2 → urwid-3.0.3}/docs/manual/images/urwid_widgets.svgz +0 -0
  103. {urwid-3.0.2 → urwid-3.0.3}/docs/manual/images/urwid_widgets_1.png +0 -0
  104. {urwid-3.0.2 → urwid-3.0.3}/docs/manual/images/urwid_widgets_1.xcf +0 -0
  105. {urwid-3.0.2 → urwid-3.0.3}/docs/manual/images/urwid_widgets_2.png +0 -0
  106. {urwid-3.0.2 → urwid-3.0.3}/docs/manual/images/urwid_widgets_2.xcf +0 -0
  107. {urwid-3.0.2 → urwid-3.0.3}/docs/manual/images/widget_layout.png +0 -0
  108. {urwid-3.0.2 → urwid-3.0.3}/docs/manual/index.rst +0 -0
  109. {urwid-3.0.2 → urwid-3.0.3}/docs/manual/mainloop.rst +0 -0
  110. {urwid-3.0.2 → urwid-3.0.3}/docs/manual/overview.rst +0 -0
  111. {urwid-3.0.2 → urwid-3.0.3}/docs/manual/safe_combinations.py +0 -0
  112. {urwid-3.0.2 → urwid-3.0.3}/docs/manual/safe_combinations.py.xdotool +0 -0
  113. {urwid-3.0.2 → urwid-3.0.3}/docs/manual/safe_combinations1.png +0 -0
  114. {urwid-3.0.2 → urwid-3.0.3}/docs/manual/textlayout.rst +0 -0
  115. {urwid-3.0.2 → urwid-3.0.3}/docs/manual/userinput.rst +0 -0
  116. {urwid-3.0.2 → urwid-3.0.3}/docs/manual/wanat.py +0 -0
  117. {urwid-3.0.2 → urwid-3.0.3}/docs/manual/wcur1.py +0 -0
  118. {urwid-3.0.2 → urwid-3.0.3}/docs/manual/wcur2.py +0 -0
  119. {urwid-3.0.2 → urwid-3.0.3}/docs/manual/widgets.rst +0 -0
  120. {urwid-3.0.2 → urwid-3.0.3}/docs/manual/wmod.py +0 -0
  121. {urwid-3.0.2 → urwid-3.0.3}/docs/manual/wsel.py +0 -0
  122. {urwid-3.0.2 → urwid-3.0.3}/docs/reference/attrspec.rst +0 -0
  123. {urwid-3.0.2 → urwid-3.0.3}/docs/reference/canvas.rst +0 -0
  124. {urwid-3.0.2 → urwid-3.0.3}/docs/reference/command_map.rst +0 -0
  125. {urwid-3.0.2 → urwid-3.0.3}/docs/reference/constants.rst +0 -0
  126. {urwid-3.0.2 → urwid-3.0.3}/docs/reference/deprecated.rst +0 -0
  127. {urwid-3.0.2 → urwid-3.0.3}/docs/reference/display_modules.rst +0 -0
  128. {urwid-3.0.2 → urwid-3.0.3}/docs/reference/exceptions.rst +0 -0
  129. {urwid-3.0.2 → urwid-3.0.3}/docs/reference/global_settings.rst +0 -0
  130. {urwid-3.0.2 → urwid-3.0.3}/docs/reference/index.rst +0 -0
  131. {urwid-3.0.2 → urwid-3.0.3}/docs/reference/list_walkers.rst +0 -0
  132. {urwid-3.0.2 → urwid-3.0.3}/docs/reference/main_loop.rst +0 -0
  133. {urwid-3.0.2 → urwid-3.0.3}/docs/reference/meta.rst +0 -0
  134. {urwid-3.0.2 → urwid-3.0.3}/docs/reference/signals.rst +0 -0
  135. {urwid-3.0.2 → urwid-3.0.3}/docs/reference/text_layout.rst +0 -0
  136. {urwid-3.0.2 → urwid-3.0.3}/docs/reference/widget.rst +0 -0
  137. {urwid-3.0.2 → urwid-3.0.3}/docs/tools/compile_pngs.sh +0 -0
  138. {urwid-3.0.2 → urwid-3.0.3}/docs/tools/screenshots.sh +0 -0
  139. {urwid-3.0.2 → urwid-3.0.3}/docs/tools/static/.placeholder +0 -0
  140. {urwid-3.0.2 → urwid-3.0.3}/docs/tools/templates/indexcontent.html +0 -0
  141. {urwid-3.0.2 → urwid-3.0.3}/docs/tools/templates/indexsidebar.html +0 -0
  142. {urwid-3.0.2 → urwid-3.0.3}/docs/tools/templates/localtoc.html +0 -0
  143. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/adventure.py +0 -0
  144. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/adventure.py.xdotool +0 -0
  145. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/adventure1.png +0 -0
  146. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/adventure2.png +0 -0
  147. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/adventure3.png +0 -0
  148. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/adventure4.png +0 -0
  149. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/cmenu.py +0 -0
  150. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/cmenu.py.xdotool +0 -0
  151. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/cmenu1.png +0 -0
  152. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/cmenu2.png +0 -0
  153. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/cmenu3.png +0 -0
  154. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/cmenu4.png +0 -0
  155. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/highcolors.py +0 -0
  156. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/highcolors.py.xdotool +0 -0
  157. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/highcolors1.png +0 -0
  158. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/hmenu.py +0 -0
  159. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/hmenu.py.xdotool +0 -0
  160. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/hmenu1.png +0 -0
  161. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/hmenu2.png +0 -0
  162. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/hmenu3.png +0 -0
  163. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/hmenu4.png +0 -0
  164. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/index.rst +0 -0
  165. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/input.py +0 -0
  166. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/input.py.xdotool +0 -0
  167. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/input1.png +0 -0
  168. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/input2.png +0 -0
  169. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/input3.png +0 -0
  170. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/input4.png +0 -0
  171. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/input5.png +0 -0
  172. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/menu25.png +0 -0
  173. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/minimal.py +0 -0
  174. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/minimal.py.xdotool +0 -0
  175. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/minimal1.png +0 -0
  176. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/multiple.py +0 -0
  177. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/multiple.py.xdotool +0 -0
  178. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/multiple1.png +0 -0
  179. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/multiple2.png +0 -0
  180. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/multiple3.png +0 -0
  181. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/multiple4.png +0 -0
  182. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/qa.py +0 -0
  183. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/qa.py.xdotool +0 -0
  184. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/qa1.png +0 -0
  185. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/qa2.png +0 -0
  186. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/qa3.png +0 -0
  187. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/sig.py +0 -0
  188. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/sig.py.xdotool +0 -0
  189. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/sig1.png +0 -0
  190. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/sig2.png +0 -0
  191. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/sig3.png +0 -0
  192. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/sig4.png +0 -0
  193. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/smenu.py +0 -0
  194. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/smenu.py.xdotool +0 -0
  195. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/smenu1.png +0 -0
  196. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/smenu2.png +0 -0
  197. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/smenu3.png +0 -0
  198. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/urwid_attr.py +0 -0
  199. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/urwid_attr.py.xdotool +0 -0
  200. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/urwid_attr1.png +0 -0
  201. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/urwid_attr2.png +0 -0
  202. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/urwid_attr3.png +0 -0
  203. {urwid-3.0.2 → urwid-3.0.3}/docs/tutorial/urwid_attr4.png +0 -0
  204. {urwid-3.0.2 → urwid-3.0.3}/docs/urwid-logo.png +0 -0
  205. {urwid-3.0.2 → urwid-3.0.3}/examples/bigtext.py +0 -0
  206. {urwid-3.0.2 → urwid-3.0.3}/examples/browse.py +0 -0
  207. {urwid-3.0.2 → urwid-3.0.3}/examples/calc.py +0 -0
  208. {urwid-3.0.2 → urwid-3.0.3}/examples/dialog.py +0 -0
  209. {urwid-3.0.2 → urwid-3.0.3}/examples/fib.py +0 -0
  210. {urwid-3.0.2 → urwid-3.0.3}/examples/graph.py +0 -0
  211. {urwid-3.0.2 → urwid-3.0.3}/examples/input_test.py +0 -0
  212. {urwid-3.0.2 → urwid-3.0.3}/examples/pop_up.py +0 -0
  213. {urwid-3.0.2 → urwid-3.0.3}/examples/subproc.py +0 -0
  214. {urwid-3.0.2 → urwid-3.0.3}/examples/subproc2.py +0 -0
  215. {urwid-3.0.2 → urwid-3.0.3}/examples/terminal.py +0 -0
  216. {urwid-3.0.2 → urwid-3.0.3}/examples/tour.py +0 -0
  217. {urwid-3.0.2 → urwid-3.0.3}/examples/treesample.py +0 -0
  218. {urwid-3.0.2 → urwid-3.0.3}/examples/twisted_serve_ssh.tac +0 -0
  219. {urwid-3.0.2 → urwid-3.0.3}/isort-requirements.txt +0 -0
  220. {urwid-3.0.2 → urwid-3.0.3}/pyproject.toml +0 -0
  221. {urwid-3.0.2 → urwid-3.0.3}/requirements.txt +0 -0
  222. {urwid-3.0.2 → urwid-3.0.3}/setup.cfg +0 -0
  223. {urwid-3.0.2 → urwid-3.0.3}/test_requirements.txt +0 -0
  224. {urwid-3.0.2 → urwid-3.0.3}/tests/__init__.py +0 -0
  225. {urwid-3.0.2 → urwid-3.0.3}/tests/test_canvas.py +0 -0
  226. {urwid-3.0.2 → urwid-3.0.3}/tests/test_columns.py +0 -0
  227. {urwid-3.0.2 → urwid-3.0.3}/tests/test_container.py +0 -0
  228. {urwid-3.0.2 → urwid-3.0.3}/tests/test_doctests.py +0 -0
  229. {urwid-3.0.2 → urwid-3.0.3}/tests/test_escapes.py +0 -0
  230. {urwid-3.0.2 → urwid-3.0.3}/tests/test_event_loops.py +0 -0
  231. {urwid-3.0.2 → urwid-3.0.3}/tests/test_filler.py +0 -0
  232. {urwid-3.0.2 → urwid-3.0.3}/tests/test_floatedit.py +0 -0
  233. {urwid-3.0.2 → urwid-3.0.3}/tests/test_font.py +0 -0
  234. {urwid-3.0.2 → urwid-3.0.3}/tests/test_frame.py +0 -0
  235. {urwid-3.0.2 → urwid-3.0.3}/tests/test_graphics.py +0 -0
  236. {urwid-3.0.2 → urwid-3.0.3}/tests/test_grid_flow.py +0 -0
  237. {urwid-3.0.2 → urwid-3.0.3}/tests/test_line_box.py +0 -0
  238. {urwid-3.0.2 → urwid-3.0.3}/tests/test_listbox.py +0 -0
  239. {urwid-3.0.2 → urwid-3.0.3}/tests/test_main_loop.py +0 -0
  240. {urwid-3.0.2 → urwid-3.0.3}/tests/test_moved_imports.py +0 -0
  241. {urwid-3.0.2 → urwid-3.0.3}/tests/test_overlay.py +0 -0
  242. {urwid-3.0.2 → urwid-3.0.3}/tests/test_padding.py +0 -0
  243. {urwid-3.0.2 → urwid-3.0.3}/tests/test_pile.py +0 -0
  244. {urwid-3.0.2 → urwid-3.0.3}/tests/test_raw_display.py +0 -0
  245. {urwid-3.0.2 → urwid-3.0.3}/tests/test_scrollable.py +0 -0
  246. {urwid-3.0.2 → urwid-3.0.3}/tests/test_signals.py +0 -0
  247. {urwid-3.0.2 → urwid-3.0.3}/tests/test_str_util.py +0 -0
  248. {urwid-3.0.2 → urwid-3.0.3}/tests/test_text_layout.py +0 -0
  249. {urwid-3.0.2 → urwid-3.0.3}/tests/test_tree.py +0 -0
  250. {urwid-3.0.2 → urwid-3.0.3}/tests/test_util.py +0 -0
  251. {urwid-3.0.2 → urwid-3.0.3}/tests/test_vterm.py +0 -0
  252. {urwid-3.0.2 → urwid-3.0.3}/tests/test_widget.py +0 -0
  253. {urwid-3.0.2 → urwid-3.0.3}/tests/util.py +0 -0
  254. {urwid-3.0.2 → urwid-3.0.3}/tox.ini +0 -0
  255. {urwid-3.0.2 → urwid-3.0.3}/urwid/__init__.py +0 -0
  256. {urwid-3.0.2 → urwid-3.0.3}/urwid/command_map.py +0 -0
  257. {urwid-3.0.2 → urwid-3.0.3}/urwid/container.py +0 -0
  258. {urwid-3.0.2 → urwid-3.0.3}/urwid/decoration.py +0 -0
  259. {urwid-3.0.2 → urwid-3.0.3}/urwid/display/__init__.py +0 -0
  260. {urwid-3.0.2 → urwid-3.0.3}/urwid/display/_web.css +0 -0
  261. {urwid-3.0.2 → urwid-3.0.3}/urwid/display/_web.js +0 -0
  262. {urwid-3.0.2 → urwid-3.0.3}/urwid/display/_win32.py +0 -0
  263. {urwid-3.0.2 → urwid-3.0.3}/urwid/display/_win32_raw_display.py +0 -0
  264. {urwid-3.0.2 → urwid-3.0.3}/urwid/display/html_fragment.py +0 -0
  265. {urwid-3.0.2 → urwid-3.0.3}/urwid/display/raw.py +0 -0
  266. {urwid-3.0.2 → urwid-3.0.3}/urwid/event_loop/__init__.py +0 -0
  267. {urwid-3.0.2 → urwid-3.0.3}/urwid/event_loop/abstract_loop.py +0 -0
  268. {urwid-3.0.2 → urwid-3.0.3}/urwid/event_loop/asyncio_loop.py +0 -0
  269. {urwid-3.0.2 → urwid-3.0.3}/urwid/event_loop/glib_loop.py +0 -0
  270. {urwid-3.0.2 → urwid-3.0.3}/urwid/event_loop/main_loop.py +0 -0
  271. {urwid-3.0.2 → urwid-3.0.3}/urwid/event_loop/select_loop.py +0 -0
  272. {urwid-3.0.2 → urwid-3.0.3}/urwid/event_loop/tornado_loop.py +0 -0
  273. {urwid-3.0.2 → urwid-3.0.3}/urwid/event_loop/trio_loop.py +0 -0
  274. {urwid-3.0.2 → urwid-3.0.3}/urwid/event_loop/twisted_loop.py +0 -0
  275. {urwid-3.0.2 → urwid-3.0.3}/urwid/event_loop/zmq_loop.py +0 -0
  276. {urwid-3.0.2 → urwid-3.0.3}/urwid/font.py +0 -0
  277. {urwid-3.0.2 → urwid-3.0.3}/urwid/graphics.py +0 -0
  278. {urwid-3.0.2 → urwid-3.0.3}/urwid/numedit.py +0 -0
  279. {urwid-3.0.2 → urwid-3.0.3}/urwid/signals.py +0 -0
  280. {urwid-3.0.2 → urwid-3.0.3}/urwid/split_repr.py +0 -0
  281. {urwid-3.0.2 → urwid-3.0.3}/urwid/str_util.py +0 -0
  282. {urwid-3.0.2 → urwid-3.0.3}/urwid/text_layout.py +0 -0
  283. {urwid-3.0.2 → urwid-3.0.3}/urwid/util.py +0 -0
  284. {urwid-3.0.2 → urwid-3.0.3}/urwid/vterm.py +0 -0
  285. {urwid-3.0.2 → urwid-3.0.3}/urwid/widget/__init__.py +0 -0
  286. {urwid-3.0.2 → urwid-3.0.3}/urwid/widget/attr_map.py +0 -0
  287. {urwid-3.0.2 → urwid-3.0.3}/urwid/widget/attr_wrap.py +0 -0
  288. {urwid-3.0.2 → urwid-3.0.3}/urwid/widget/bar_graph.py +0 -0
  289. {urwid-3.0.2 → urwid-3.0.3}/urwid/widget/big_text.py +0 -0
  290. {urwid-3.0.2 → urwid-3.0.3}/urwid/widget/box_adapter.py +0 -0
  291. {urwid-3.0.2 → urwid-3.0.3}/urwid/widget/columns.py +0 -0
  292. {urwid-3.0.2 → urwid-3.0.3}/urwid/widget/constants.py +0 -0
  293. {urwid-3.0.2 → urwid-3.0.3}/urwid/widget/container.py +0 -0
  294. {urwid-3.0.2 → urwid-3.0.3}/urwid/widget/divider.py +0 -0
  295. {urwid-3.0.2 → urwid-3.0.3}/urwid/widget/edit.py +0 -0
  296. {urwid-3.0.2 → urwid-3.0.3}/urwid/widget/filler.py +0 -0
  297. {urwid-3.0.2 → urwid-3.0.3}/urwid/widget/frame.py +0 -0
  298. {urwid-3.0.2 → urwid-3.0.3}/urwid/widget/grid_flow.py +0 -0
  299. {urwid-3.0.2 → urwid-3.0.3}/urwid/widget/line_box.py +0 -0
  300. {urwid-3.0.2 → urwid-3.0.3}/urwid/widget/monitored_list.py +0 -0
  301. {urwid-3.0.2 → urwid-3.0.3}/urwid/widget/overlay.py +0 -0
  302. {urwid-3.0.2 → urwid-3.0.3}/urwid/widget/padding.py +0 -0
  303. {urwid-3.0.2 → urwid-3.0.3}/urwid/widget/pile.py +0 -0
  304. {urwid-3.0.2 → urwid-3.0.3}/urwid/widget/popup.py +0 -0
  305. {urwid-3.0.2 → urwid-3.0.3}/urwid/widget/progress_bar.py +0 -0
  306. {urwid-3.0.2 → urwid-3.0.3}/urwid/widget/scrollable.py +0 -0
  307. {urwid-3.0.2 → urwid-3.0.3}/urwid/widget/solid_fill.py +0 -0
  308. {urwid-3.0.2 → urwid-3.0.3}/urwid/widget/text.py +0 -0
  309. {urwid-3.0.2 → urwid-3.0.3}/urwid/widget/treetools.py +0 -0
  310. {urwid-3.0.2 → urwid-3.0.3}/urwid/widget/widget.py +0 -0
  311. {urwid-3.0.2 → urwid-3.0.3}/urwid/widget/widget_decoration.py +0 -0
  312. {urwid-3.0.2 → urwid-3.0.3}/urwid/widget/wimp.py +0 -0
  313. {urwid-3.0.2 → urwid-3.0.3}/urwid/wimp.py +0 -0
  314. {urwid-3.0.2 → urwid-3.0.3}/urwid.egg-info/SOURCES.txt +0 -0
  315. {urwid-3.0.2 → urwid-3.0.3}/urwid.egg-info/dependency_links.txt +0 -0
  316. {urwid-3.0.2 → urwid-3.0.3}/urwid.egg-info/not-zip-safe +0 -0
  317. {urwid-3.0.2 → urwid-3.0.3}/urwid.egg-info/requires.txt +0 -0
  318. {urwid-3.0.2 → urwid-3.0.3}/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@v5
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'
@@ -16,9 +16,9 @@ jobs:
16
16
  name: Validate import sorting
17
17
  runs-on: ubuntu-latest
18
18
  steps:
19
- - uses: actions/checkout@v4
19
+ - uses: actions/checkout@v5
20
20
  - name: Set up Python
21
- uses: actions/setup-python@v5
21
+ uses: actions/setup-python@v6
22
22
  with:
23
23
  python-version: '3.x'
24
24
  cache: 'pip'
@@ -34,9 +34,9 @@ jobs:
34
34
  name: Validate black formatting
35
35
  runs-on: ubuntu-latest
36
36
  steps:
37
- - uses: actions/checkout@v4
37
+ - uses: actions/checkout@v5
38
38
  - name: Set up Python
39
- uses: actions/setup-python@v5
39
+ uses: actions/setup-python@v6
40
40
  with:
41
41
  python-version: '3.x'
42
42
  cache: 'pip'
@@ -52,9 +52,9 @@ jobs:
52
52
  name: Check with Ruff
53
53
  runs-on: ubuntu-latest
54
54
  steps:
55
- - uses: actions/checkout@v4
55
+ - uses: actions/checkout@v5
56
56
  - name: Set up Python
57
- uses: actions/setup-python@v5
57
+ uses: actions/setup-python@v6
58
58
  with:
59
59
  python-version: '3.x'
60
60
  cache: 'pip'
@@ -70,14 +70,14 @@ jobs:
70
70
  name: Check with pylint
71
71
  runs-on: ubuntu-latest
72
72
  steps:
73
- - uses: actions/checkout@v4
73
+ - uses: actions/checkout@v5
74
74
  - name: Install Ubuntu dependencies
75
75
  run: |
76
76
  sudo apt-get -qq update
77
77
  sudo apt-get install -y python3-dev python3-gi python3-gi-cairo
78
78
  sudo apt-get install -y gobject-introspection libgirepository-2.0-dev libcairo2-dev
79
79
  - name: Set up Python
80
- uses: actions/setup-python@v5
80
+ uses: actions/setup-python@v6
81
81
  with:
82
82
  python-version: '3.x'
83
83
  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
@@ -30,9 +30,9 @@ jobs:
30
30
  name: Validate import sorting
31
31
  runs-on: ubuntu-latest
32
32
  steps:
33
- - uses: actions/checkout@v4
33
+ - uses: actions/checkout@v5
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'
@@ -48,9 +48,9 @@ jobs:
48
48
  name: Validate black formatting
49
49
  runs-on: ubuntu-latest
50
50
  steps:
51
- - uses: actions/checkout@v4
51
+ - uses: actions/checkout@v5
52
52
  - name: Set up Python
53
- uses: actions/setup-python@v5
53
+ uses: actions/setup-python@v6
54
54
  with:
55
55
  python-version: '3.x'
56
56
  cache: 'pip'
@@ -66,9 +66,9 @@ jobs:
66
66
  name: Check with Ruff
67
67
  runs-on: ubuntu-latest
68
68
  steps:
69
- - uses: actions/checkout@v4
69
+ - uses: actions/checkout@v5
70
70
  - name: Set up Python
71
- uses: actions/setup-python@v5
71
+ uses: actions/setup-python@v6
72
72
  with:
73
73
  python-version: '3.x'
74
74
  cache: 'pip'
@@ -84,14 +84,14 @@ jobs:
84
84
  name: Check with pylint
85
85
  runs-on: ubuntu-latest
86
86
  steps:
87
- - uses: actions/checkout@v4
87
+ - uses: actions/checkout@v5
88
88
  - name: Install Ubuntu dependencies
89
89
  run: |
90
90
  sudo apt-get -qq update
91
91
  sudo apt-get install -y python3-dev python3-gi python3-gi-cairo
92
92
  sudo apt-get install -y gobject-introspection libgirepository-2.0-dev libcairo2-dev
93
93
  - name: Set up Python
94
- uses: actions/setup-python@v5
94
+ uses: actions/setup-python@v6
95
95
  with:
96
96
  python-version: '3.x'
97
97
  cache: 'pip'
@@ -117,11 +117,11 @@ jobs:
117
117
  python-version: [ "3.9", "3.10", "3.11", "3.12", "3.13" ]
118
118
 
119
119
  steps:
120
- - uses: actions/checkout@v4
120
+ - uses: actions/checkout@v5
121
121
  with:
122
122
  fetch-depth: 0 # need for setuptools_scm
123
123
  - name: Set up Python ${{ matrix.python-version }}
124
- uses: actions/setup-python@v5
124
+ uses: actions/setup-python@v6
125
125
  with:
126
126
  python-version: ${{ matrix.python-version }}
127
127
  allow-prereleases: true
@@ -173,11 +173,11 @@ jobs:
173
173
  needs: [ Test, Isort, Black, Ruff, PyLint ]
174
174
  runs-on: ubuntu-latest
175
175
  steps:
176
- - uses: actions/checkout@v4
176
+ - uses: actions/checkout@v5
177
177
  with:
178
178
  fetch-depth: 0 # need for setuptools_scm
179
179
 
180
- - uses: actions/setup-python@v5
180
+ - uses: actions/setup-python@v6
181
181
  with:
182
182
  python-version: "3.x"
183
183
 
@@ -204,9 +204,9 @@ jobs:
204
204
  runs-on: ubuntu-latest
205
205
  needs: [ build ]
206
206
  steps:
207
- - uses: actions/checkout@v4
207
+ - uses: actions/checkout@v5
208
208
  - name: Set up Python
209
- uses: actions/setup-python@v5
209
+ uses: actions/setup-python@v6
210
210
  with:
211
211
  python-version: '3.x'
212
212
  cache: 'pip'
@@ -214,7 +214,7 @@ jobs:
214
214
  run: |
215
215
  python -m pip install --upgrade pip
216
216
  pip install --upgrade twine
217
- - uses: actions/download-artifact@v4
217
+ - uses: actions/download-artifact@v5
218
218
  with:
219
219
  # unpacks default artifact into dist/
220
220
  # if `name: wheels` is omitted, the action will create extra parent dir
@@ -239,7 +239,7 @@ jobs:
239
239
  permissions:
240
240
  id-token: write # IMPORTANT: this permission is mandatory for trusted publishing
241
241
  steps:
242
- - uses: actions/download-artifact@v4
242
+ - uses: actions/download-artifact@v5
243
243
  with:
244
244
  pattern: built-*
245
245
  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@v5
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'
@@ -26,7 +26,7 @@ repos:
26
26
 
27
27
  - repo: https://github.com/astral-sh/ruff-pre-commit
28
28
  # Ruff version.
29
- rev: v0.11.8
29
+ rev: v0.12.0
30
30
  hooks:
31
31
  - id: ruff
32
32
  args: [ --fix, --exit-non-zero-on-fix ]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: urwid
3
- Version: 3.0.2
3
+ Version: 3.0.3
4
4
  Summary: A full-featured console (xterm et al.) user interface library
5
5
  Author-email: Ian Ward <ian@excess.org>
6
6
  License: LGPL-2.1-only
@@ -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)
@@ -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)
@@ -2,6 +2,30 @@
2
2
  Changelog
3
3
  ---------
4
4
 
5
+ Urwid 3.0.3
6
+ ===========
7
+
8
+ 2025-09-15
9
+
10
+ Bug fixes 🕷
11
+ ++++++++++++
12
+ * Python 3.14: fix buffer overflow on terminal size request by @meeuw in https://github.com/urwid/urwid/pull/1027
13
+ * Add guard against empty list on focus complete. by @gryf in https://github.com/urwid/urwid/pull/1047
14
+
15
+ Documentation 🕮
16
+ ++++++++++++++++
17
+ * Add extra code type annotations by @penguinolog in https://github.com/urwid/urwid/pull/1037
18
+ * Mark Windows support limitation: win10+ only by @penguinolog in https://github.com/urwid/urwid/pull/1038
19
+
20
+ Other Changes
21
+ +++++++++++++
22
+ * Maintenance: fix devcontainer to support actual requirements without pinning by @penguinolog in https://github.com/urwid/urwid/pull/1035
23
+
24
+ New Contributors
25
+ ++++++++++++++++
26
+ * @meeuw made their first contribution in https://github.com/urwid/urwid/pull/1027
27
+ * @gryf made their first contribution in https://github.com/urwid/urwid/pull/1047
28
+
5
29
  Urwid 3.0.2
6
30
  ===========
7
31
 
@@ -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
@@ -99,7 +99,7 @@ class LineWalker(urwid.ListWalker):
99
99
  # file is closed, so there are no more lines
100
100
  return None, None
101
101
 
102
- assert pos == len(self.lines), "out of order request?" # noqa: S101 # "assert" is ok in examples
102
+ assert pos == len(self.lines), "out of order request?" # noqa: S101 # "assert" is OK in examples
103
103
 
104
104
  self.read_next_line()
105
105
 
@@ -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()
@@ -99,7 +99,7 @@ class LineWalker(urwid.ListWalker):
99
99
  # file is closed, so there are no more lines
100
100
  return None, None
101
101
 
102
- assert pos == len(self.lines), "out of order request?" # noqa: S101 # "assert" is ok in examples
102
+ assert pos == len(self.lines), "out of order request?" # noqa: S101 # "assert" is OK in examples
103
103
 
104
104
  self.read_next_line()
105
105
 
@@ -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
 
@@ -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
@@ -265,7 +265,7 @@ class TwistedScreen(Screen):
265
265
  self.loop.draw_screen()
266
266
 
267
267
  # Convenience
268
- def write(self, data):
268
+ def write(self, data: str) -> None:
269
269
  self.terminal.write(data)
270
270
 
271
271
  # Private
@@ -0,0 +1 @@
1
+ pylint==3.3.8
@@ -0,0 +1 @@
1
+ ruff==0.13.0
@@ -84,7 +84,7 @@ class CanvasCache:
84
84
  cleanups = 0
85
85
 
86
86
  @classmethod
87
- def store(cls, wcls, canvas: Canvas) -> None:
87
+ def store(cls, wcls: type[Widget], canvas: Canvas) -> None:
88
88
  """
89
89
  Store a weakref to canvas in the cache.
90
90
 
@@ -98,7 +98,7 @@ class CanvasCache:
98
98
  raise TypeError("Can't store canvas without widget_info")
99
99
  widget, size, focus = canvas.widget_info
100
100
 
101
- def walk_depends(canv):
101
+ def walk_depends(canv: Canvas) -> list[Widget]:
102
102
  """
103
103
  Collect all child widgets for determining who we
104
104
  depend on.
@@ -128,7 +128,7 @@ class CanvasCache:
128
128
  cls._widgets.setdefault(widget, {})[wcls, size, focus] = ref
129
129
 
130
130
  @classmethod
131
- def fetch(cls, widget, wcls, size, focus) -> Canvas | None:
131
+ def fetch(cls, widget: Widget, wcls: type[Widget], size, focus: bool) -> Canvas | None:
132
132
  """
133
133
  Return the cached canvas or None.
134
134
 
@@ -150,7 +150,7 @@ class CanvasCache:
150
150
  return canv
151
151
 
152
152
  @classmethod
153
- def invalidate(cls, widget):
153
+ def invalidate(cls, widget: Widget) -> None:
154
154
  """
155
155
  Remove all canvases cached for widget.
156
156
  """
@@ -214,7 +214,7 @@ class Canvas:
214
214
 
215
215
  def __init__(self) -> None:
216
216
  """Base Canvas class"""
217
- self._widget_info = None
217
+ self._widget_info: tuple[Widget, tuple[[]] | tuple[int] | tuple[int, int], bool] | None = None
218
218
  self.coords: dict[str, tuple[int, int, tuple[Widget, int, int]] | tuple[int, int, None]] = {}
219
219
  self.shortcuts: dict[str, str] = {}
220
220
 
@@ -240,7 +240,7 @@ class Canvas:
240
240
  self._widget_info = widget, size, focus
241
241
 
242
242
  @property
243
- def widget_info(self):
243
+ def widget_info(self) -> tuple[Widget, tuple[[]] | tuple[int] | tuple[int, int], bool] | None:
244
244
  return self._widget_info
245
245
 
246
246
  @property
@@ -154,7 +154,7 @@ class Screen(_raw_display_base.Screen):
154
154
  if not os.environ.get("TERM", "").lower().startswith("linux"):
155
155
  return
156
156
 
157
- m = Popen( # noqa: S603 # pylint: disable=consider-using-with
157
+ m = Popen( # pylint: disable=consider-using-with
158
158
  ["/usr/bin/mev", "-e", "158"],
159
159
  stdin=PIPE,
160
160
  stdout=PIPE,
@@ -175,7 +175,7 @@ class Screen(_raw_display_base.Screen):
175
175
  """
176
176
  Initialize the screen and input mode.
177
177
 
178
- alternate_buffer -- use alternate screen buffer
178
+ alternate_buffer -- use an alternate screen buffer
179
179
  """
180
180
  if alternate_buffer:
181
181
  self.write(escape.SWITCH_TO_ALTERNATE_BUFFER)
@@ -403,8 +403,8 @@ class Screen(_raw_display_base.Screen):
403
403
  y, x = super().get_cols_rows()
404
404
  with contextlib.suppress(OSError): # Term size could not be determined
405
405
  if hasattr(self._term_output_file, "fileno"):
406
- buf = fcntl.ioctl(self._term_output_file.fileno(), termios.TIOCGWINSZ, b" " * 4)
407
- y, x = struct.unpack("hh", buf)
406
+ buf = fcntl.ioctl(self._term_output_file.fileno(), termios.TIOCGWINSZ, b" " * 8)
407
+ y, x, _, _ = struct.unpack("hhhh", buf)
408
408
 
409
409
  # Provide some lightweight fallbacks in case the TIOCWINSZ doesn't
410
410
  # give sane answers
@@ -211,7 +211,7 @@ class Screen(BaseScreen, RealTerminal):
211
211
  Restore the screen.
212
212
  """
213
213
 
214
- def write(self, data):
214
+ def write(self, data: str) -> None:
215
215
  """Write some data to the terminal.
216
216
 
217
217
  You may wish to override this if you're using something other than
@@ -219,7 +219,7 @@ class Screen(BaseScreen, RealTerminal):
219
219
  """
220
220
  self._term_output_file.write(data)
221
221
 
222
- def flush(self):
222
+ def flush(self) -> None:
223
223
  """Flush the output buffer.
224
224
 
225
225
  You may wish to override this if you're using something other than
@@ -352,7 +352,11 @@ class Screen(BaseScreen, RealTerminal):
352
352
 
353
353
  _input_timeout = None
354
354
 
355
- def _make_legacy_input_wrapper(self, event_loop, callback):
355
+ def _make_legacy_input_wrapper(
356
+ self,
357
+ event_loop: EventLoop,
358
+ callback: Callable[[list[str], list[int]], typing.Any],
359
+ ) -> Callable[[], None]:
356
360
  """
357
361
  Support old Screen classes that still have a get_input_nonblocking and expect it to work.
358
362
  """
@@ -873,9 +877,8 @@ class Screen(BaseScreen, RealTerminal):
873
877
 
874
878
  def reset_default_terminal_palette(self) -> None:
875
879
  """
876
- Attempt to set the terminal palette to default values as taken
877
- from xterm. Uses number of colors from current
878
- set_terminal_properties() screen setting.
880
+ Attempt to set the terminal palette to default values as taken from xterm.
881
+ Uses a number of colors from the current set_terminal_properties() screen setting.
879
882
  """
880
883
  if self.colors == 1:
881
884
  return
@@ -898,9 +901,8 @@ class Screen(BaseScreen, RealTerminal):
898
901
  """
899
902
  entries - list of (index, red, green, blue) tuples.
900
903
 
901
- Attempt to set part of the terminal palette (this does not work
902
- on all terminals.) The changes are sent as a single escape
903
- sequence so they should all take effect at the same time.
904
+ Attempt to set part of the terminal palette (this does not work on all terminals.)
905
+ The changes are sent as a single escape sequence so they should all take effect at the same time.
904
906
 
905
907
  0 <= index < 256 (some terminals will only have 16 or 88 colors)
906
908
  0 <= red, green, blue < 256
@@ -768,7 +768,7 @@ class AttrSpec:
768
768
  else:
769
769
  scolor = _parse_color_256(_true_to_256(part) or part)
770
770
  flags |= _FG_HIGH_COLOR
771
- # _parse_color_*() return None for unrecognised colors
771
+ # _parse_color_*() return None for unrecognized colors
772
772
  if scolor is None:
773
773
  raise AttrSpecError(f"Unrecognised color specification {part!r} in foreground ({foreground!r})")
774
774
  if color is not None:
@@ -1011,7 +1011,7 @@ class BaseScreen(abc.ABC, metaclass=signals.MetaSignals):
1011
1011
  def _stop(self) -> None:
1012
1012
  pass
1013
1013
 
1014
- def run_wrapper(self, fn, *args, **kwargs):
1014
+ def run_wrapper(self, fn, *args, **kwargs) -> None:
1015
1015
  """Start the screen, call a function, then stop the screen. Extra
1016
1016
  arguments are passed to `start`.
1017
1017
 
@@ -596,7 +596,7 @@ class Screen(BaseScreen, RealTerminal):
596
596
  raise TypeError(seg)
597
597
  self.s.addstr(seg.decode(util.get_encoding()))
598
598
  except curses.error:
599
- # it's ok to get out of the
599
+ # it's OK to get out of the
600
600
  # screen on the lower right
601
601
  if y != rows - 1 or nr != len(row) - 1:
602
602
  # perhaps screen size changed
@@ -247,7 +247,11 @@ class KeyqueueTrie:
247
247
  return None
248
248
  return self.get_recurse(root[keys[0]], keys[1:], more_available)
249
249
 
250
- def read_mouse_info(self, keys: Sequence[int], more_available: bool):
250
+ def read_mouse_info(
251
+ self,
252
+ keys: Sequence[int],
253
+ more_available: bool,
254
+ ) -> tuple[tuple[str, int, int, int], Sequence[int]] | None:
251
255
  if len(keys) < 3:
252
256
  if more_available:
253
257
  raise MoreInputRequired()
@@ -286,7 +290,11 @@ class KeyqueueTrie:
286
290
 
287
291
  return ((f"{prefix}mouse {action}", button, x, y), keys[3:])
288
292
 
289
- def read_sgrmouse_info(self, keys: Sequence[int], more_available: bool):
293
+ def read_sgrmouse_info(
294
+ self,
295
+ keys: Sequence[int],
296
+ more_available: bool,
297
+ ) -> tuple[tuple[str, int, int, int], Sequence[int]] | None:
290
298
  # Helpful links:
291
299
  # https://stackoverflow.com/questions/5966903/how-to-get-mousemove-and-mouseclick-in-bash
292
300
  # http://invisible-island.net/xterm/ctlseqs/ctlseqs.pdf
@@ -345,7 +353,11 @@ class KeyqueueTrie:
345
353
 
346
354
  return ((f"{prefix}mouse {action}", button, x, y), keys[pos_m + 1 :])
347
355
 
348
- def read_cursor_position(self, keys, more_available: bool):
356
+ def read_cursor_position(
357
+ self,
358
+ keys: Sequence[int],
359
+ more_available: bool,
360
+ ) -> tuple[tuple[str, int, int], Sequence[int]] | None:
349
361
  """
350
362
  Interpret cursor position information being sent by the
351
363
  user's terminal. Returned as ('cursor position', x, y)
@@ -125,8 +125,8 @@ class CFLCDScreen(LCDScreen, abc.ABC):
125
125
 
126
126
  @classmethod
127
127
  def get_crc(cls, buf: Iterable[int]) -> bytes:
128
- # This seed makes the output of this shift based algorithm match
129
- # the table based algorithm. The center 16 bits of the 32-bit
128
+ # This seed makes the output of this shift-based algorithm match
129
+ # the table-based algorithm. The center 16 bits of the 32-bit
130
130
  # "newCRC" are used for the CRC. The MSB of the lower byte is used
131
131
  # to see what bit was shifted out of the center 16 bit CRC
132
132
  # accumulator ("carry flag analog");
@@ -229,7 +229,7 @@ class KeyRepeatSimulator:
229
229
  Provide simulated repeat key events when given press and
230
230
  release events.
231
231
 
232
- If two or more keys are pressed disable repeating until all
232
+ If two or more keys are pressed, disable repeating until all
233
233
  keys are released.
234
234
  """
235
235
 
@@ -286,7 +286,7 @@ class CF635Screen(CFLCDScreen):
286
286
  20x4 character display + cursor
287
287
  no foreground/background colors or settings supported
288
288
 
289
- see CGROM for list of close unicode matches to characters available
289
+ see CGROM for a list of close Unicode matches to characters available
290
290
 
291
291
  6 button input
292
292
  up, down, left, right, enter (check mark), exit (cross)