urwid 3.0.3__tar.gz → 3.0.4__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 (317) hide show
  1. {urwid-3.0.3 → urwid-3.0.4}/.github/workflows/documentation.yml +2 -2
  2. {urwid-3.0.3 → urwid-3.0.4}/.github/workflows/isolated_static_check.yml +8 -28
  3. {urwid-3.0.3 → urwid-3.0.4}/.github/workflows/pythonpackage.yml +21 -36
  4. {urwid-3.0.3 → urwid-3.0.4}/.github/workflows/yamllint.yml +1 -1
  5. {urwid-3.0.3 → urwid-3.0.4}/.pre-commit-config.yaml +7 -21
  6. {urwid-3.0.3 → urwid-3.0.4}/PKG-INFO +5 -4
  7. {urwid-3.0.3 → urwid-3.0.4}/README.rst +2 -1
  8. {urwid-3.0.3 → urwid-3.0.4}/classifiers.txt +1 -1
  9. {urwid-3.0.3 → urwid-3.0.4}/docs/changelog.rst +17 -0
  10. {urwid-3.0.3 → urwid-3.0.4}/examples/twisted_serve_ssh.py +2 -2
  11. urwid-3.0.4/pylint-requirements.txt +1 -0
  12. {urwid-3.0.3 → urwid-3.0.4}/pyproject.toml +11 -3
  13. urwid-3.0.4/ruff-requirements.txt +1 -0
  14. {urwid-3.0.3 → urwid-3.0.4}/tox.ini +7 -20
  15. {urwid-3.0.3 → urwid-3.0.4}/urwid/__init__.py +29 -16
  16. {urwid-3.0.3 → urwid-3.0.4}/urwid/display/__init__.py +53 -48
  17. {urwid-3.0.3 → urwid-3.0.4}/urwid/display/_raw_display_base.py +2 -2
  18. {urwid-3.0.3 → urwid-3.0.4}/urwid/display/common.py +17 -17
  19. {urwid-3.0.3 → urwid-3.0.4}/urwid/display/curses.py +1 -3
  20. {urwid-3.0.3 → urwid-3.0.4}/urwid/display/web.py +1 -1
  21. {urwid-3.0.3 → urwid-3.0.4}/urwid/event_loop/asyncio_loop.py +3 -1
  22. {urwid-3.0.3 → urwid-3.0.4}/urwid/event_loop/main_loop.py +5 -5
  23. {urwid-3.0.3 → urwid-3.0.4}/urwid/font.py +1 -1
  24. {urwid-3.0.3 → urwid-3.0.4}/urwid/numedit.py +65 -65
  25. {urwid-3.0.3 → urwid-3.0.4}/urwid/signals.py +8 -8
  26. {urwid-3.0.3 → urwid-3.0.4}/urwid/split_repr.py +9 -3
  27. {urwid-3.0.3 → urwid-3.0.4}/urwid/util.py +1 -1
  28. {urwid-3.0.3 → urwid-3.0.4}/urwid/version.py +3 -3
  29. {urwid-3.0.3 → urwid-3.0.4}/urwid/widget/attr_map.py +10 -10
  30. {urwid-3.0.3 → urwid-3.0.4}/urwid/widget/attr_wrap.py +3 -3
  31. {urwid-3.0.3 → urwid-3.0.4}/urwid/widget/big_text.py +0 -3
  32. {urwid-3.0.3 → urwid-3.0.4}/urwid/widget/box_adapter.py +2 -2
  33. {urwid-3.0.3 → urwid-3.0.4}/urwid/widget/divider.py +6 -6
  34. {urwid-3.0.3 → urwid-3.0.4}/urwid/widget/edit.py +42 -42
  35. {urwid-3.0.3 → urwid-3.0.4}/urwid/widget/filler.py +8 -8
  36. {urwid-3.0.3 → urwid-3.0.4}/urwid/widget/frame.py +3 -3
  37. {urwid-3.0.3 → urwid-3.0.4}/urwid/widget/line_box.py +19 -19
  38. {urwid-3.0.3 → urwid-3.0.4}/urwid/widget/listbox.py +1 -1
  39. {urwid-3.0.3 → urwid-3.0.4}/urwid/widget/monitored_list.py +69 -45
  40. {urwid-3.0.3 → urwid-3.0.4}/urwid/widget/padding.py +20 -20
  41. {urwid-3.0.3 → urwid-3.0.4}/urwid/widget/progress_bar.py +7 -7
  42. {urwid-3.0.3 → urwid-3.0.4}/urwid/widget/solid_fill.py +3 -3
  43. {urwid-3.0.3 → urwid-3.0.4}/urwid/widget/text.py +28 -28
  44. {urwid-3.0.3 → urwid-3.0.4}/urwid/widget/widget.py +6 -6
  45. {urwid-3.0.3 → urwid-3.0.4}/urwid/widget/widget_decoration.py +2 -2
  46. {urwid-3.0.3 → urwid-3.0.4}/urwid/widget/wimp.py +56 -53
  47. {urwid-3.0.3 → urwid-3.0.4}/urwid.egg-info/PKG-INFO +5 -4
  48. {urwid-3.0.3 → urwid-3.0.4}/urwid.egg-info/SOURCES.txt +0 -2
  49. urwid-3.0.3/black-requirements.txt +0 -1
  50. urwid-3.0.3/isort-requirements.txt +0 -1
  51. urwid-3.0.3/pylint-requirements.txt +0 -1
  52. urwid-3.0.3/ruff-requirements.txt +0 -1
  53. {urwid-3.0.3 → urwid-3.0.4}/.coveralls.yml +0 -0
  54. {urwid-3.0.3 → urwid-3.0.4}/.devcontainer/dev.dockerfile +0 -0
  55. {urwid-3.0.3 → urwid-3.0.4}/.devcontainer/devcontainer.json +0 -0
  56. {urwid-3.0.3 → urwid-3.0.4}/.dockerignore +0 -0
  57. {urwid-3.0.3 → urwid-3.0.4}/.editorconfig +0 -0
  58. {urwid-3.0.3 → urwid-3.0.4}/.github/CODE_OF_CONDUCT.md +0 -0
  59. {urwid-3.0.3 → urwid-3.0.4}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  60. {urwid-3.0.3 → urwid-3.0.4}/.github/ISSUE_TEMPLATE/docs.md +0 -0
  61. {urwid-3.0.3 → urwid-3.0.4}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  62. {urwid-3.0.3 → urwid-3.0.4}/.github/ISSUE_TEMPLATE/question.md +0 -0
  63. {urwid-3.0.3 → urwid-3.0.4}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  64. {urwid-3.0.3 → urwid-3.0.4}/.github/dependabot.yml +0 -0
  65. {urwid-3.0.3 → urwid-3.0.4}/.github/labeler.yml +0 -0
  66. {urwid-3.0.3 → urwid-3.0.4}/.github/release.yml +0 -0
  67. {urwid-3.0.3 → urwid-3.0.4}/.github/workflows/labels.yml +0 -0
  68. {urwid-3.0.3 → urwid-3.0.4}/.gitignore +0 -0
  69. {urwid-3.0.3 → urwid-3.0.4}/.yamllint.yml +0 -0
  70. {urwid-3.0.3 → urwid-3.0.4}/COPYING +0 -0
  71. {urwid-3.0.3 → urwid-3.0.4}/MANIFEST.in +0 -0
  72. {urwid-3.0.3 → urwid-3.0.4}/docs/Makefile +0 -0
  73. {urwid-3.0.3 → urwid-3.0.4}/docs/conf.py +0 -0
  74. {urwid-3.0.3 → urwid-3.0.4}/docs/examples/bigtext.py +0 -0
  75. {urwid-3.0.3 → urwid-3.0.4}/docs/examples/bigtext.py.xdotool +0 -0
  76. {urwid-3.0.3 → urwid-3.0.4}/docs/examples/bigtext1.png +0 -0
  77. {urwid-3.0.3 → urwid-3.0.4}/docs/examples/bigtext2.png +0 -0
  78. {urwid-3.0.3 → urwid-3.0.4}/docs/examples/bigtext3.png +0 -0
  79. {urwid-3.0.3 → urwid-3.0.4}/docs/examples/browse.py +0 -0
  80. {urwid-3.0.3 → urwid-3.0.4}/docs/examples/browse.py.xdotool +0 -0
  81. {urwid-3.0.3 → urwid-3.0.4}/docs/examples/browse1.png +0 -0
  82. {urwid-3.0.3 → urwid-3.0.4}/docs/examples/browse2.png +0 -0
  83. {urwid-3.0.3 → urwid-3.0.4}/docs/examples/edit.py +0 -0
  84. {urwid-3.0.3 → urwid-3.0.4}/docs/examples/edit.py.xdotool +0 -0
  85. {urwid-3.0.3 → urwid-3.0.4}/docs/examples/edit1.png +0 -0
  86. {urwid-3.0.3 → urwid-3.0.4}/docs/examples/edit2.png +0 -0
  87. {urwid-3.0.3 → urwid-3.0.4}/docs/examples/edit_text.txt +0 -0
  88. {urwid-3.0.3 → urwid-3.0.4}/docs/examples/graph.py +0 -0
  89. {urwid-3.0.3 → urwid-3.0.4}/docs/examples/graph.py.xdotool +0 -0
  90. {urwid-3.0.3 → urwid-3.0.4}/docs/examples/graph1.png +0 -0
  91. {urwid-3.0.3 → urwid-3.0.4}/docs/examples/graph2.png +0 -0
  92. {urwid-3.0.3 → urwid-3.0.4}/docs/examples/index.rst +0 -0
  93. {urwid-3.0.3 → urwid-3.0.4}/docs/examples/palette_test.py +0 -0
  94. {urwid-3.0.3 → urwid-3.0.4}/docs/examples/palette_test.py.xdotool +0 -0
  95. {urwid-3.0.3 → urwid-3.0.4}/docs/examples/palette_test1.png +0 -0
  96. {urwid-3.0.3 → urwid-3.0.4}/docs/examples/palette_test2.png +0 -0
  97. {urwid-3.0.3 → urwid-3.0.4}/docs/examples/pop_up.py +0 -0
  98. {urwid-3.0.3 → urwid-3.0.4}/docs/examples/pop_up.py.xdotool +0 -0
  99. {urwid-3.0.3 → urwid-3.0.4}/docs/examples/pop_up1.png +0 -0
  100. {urwid-3.0.3 → urwid-3.0.4}/docs/examples/pop_up2.png +0 -0
  101. {urwid-3.0.3 → urwid-3.0.4}/docs/examples/real_browse.py +0 -0
  102. {urwid-3.0.3 → urwid-3.0.4}/docs/examples/real_edit.py +0 -0
  103. {urwid-3.0.3 → urwid-3.0.4}/docs/examples/subproc.py +0 -0
  104. {urwid-3.0.3 → urwid-3.0.4}/docs/examples/subproc.py.xdotool +0 -0
  105. {urwid-3.0.3 → urwid-3.0.4}/docs/examples/subproc1.png +0 -0
  106. {urwid-3.0.3 → urwid-3.0.4}/docs/examples/subproc2.png +0 -0
  107. {urwid-3.0.3 → urwid-3.0.4}/docs/examples/subproc2.py +0 -0
  108. {urwid-3.0.3 → urwid-3.0.4}/docs/examples/tour.py +0 -0
  109. {urwid-3.0.3 → urwid-3.0.4}/docs/examples/tour.py.xdotool +0 -0
  110. {urwid-3.0.3 → urwid-3.0.4}/docs/examples/tour1.png +0 -0
  111. {urwid-3.0.3 → urwid-3.0.4}/docs/examples/tour2.png +0 -0
  112. {urwid-3.0.3 → urwid-3.0.4}/docs/index.rst +0 -0
  113. {urwid-3.0.3 → urwid-3.0.4}/docs/manual/bright_combinations.py +0 -0
  114. {urwid-3.0.3 → urwid-3.0.4}/docs/manual/bright_combinations.py.xdotool +0 -0
  115. {urwid-3.0.3 → urwid-3.0.4}/docs/manual/bright_combinations1.png +0 -0
  116. {urwid-3.0.3 → urwid-3.0.4}/docs/manual/canvascache.rst +0 -0
  117. {urwid-3.0.3 → urwid-3.0.4}/docs/manual/displayattributes.rst +0 -0
  118. {urwid-3.0.3 → urwid-3.0.4}/docs/manual/displaymodules.rst +0 -0
  119. {urwid-3.0.3 → urwid-3.0.4}/docs/manual/encodings.rst +0 -0
  120. {urwid-3.0.3 → urwid-3.0.4}/docs/manual/images/display_modules.png +0 -0
  121. {urwid-3.0.3 → urwid-3.0.4}/docs/manual/images/introduction.png +0 -0
  122. {urwid-3.0.3 → urwid-3.0.4}/docs/manual/images/urwid_widgets.svgz +0 -0
  123. {urwid-3.0.3 → urwid-3.0.4}/docs/manual/images/urwid_widgets_1.png +0 -0
  124. {urwid-3.0.3 → urwid-3.0.4}/docs/manual/images/urwid_widgets_1.xcf +0 -0
  125. {urwid-3.0.3 → urwid-3.0.4}/docs/manual/images/urwid_widgets_2.png +0 -0
  126. {urwid-3.0.3 → urwid-3.0.4}/docs/manual/images/urwid_widgets_2.xcf +0 -0
  127. {urwid-3.0.3 → urwid-3.0.4}/docs/manual/images/widget_layout.png +0 -0
  128. {urwid-3.0.3 → urwid-3.0.4}/docs/manual/index.rst +0 -0
  129. {urwid-3.0.3 → urwid-3.0.4}/docs/manual/mainloop.rst +0 -0
  130. {urwid-3.0.3 → urwid-3.0.4}/docs/manual/overview.rst +0 -0
  131. {urwid-3.0.3 → urwid-3.0.4}/docs/manual/safe_combinations.py +0 -0
  132. {urwid-3.0.3 → urwid-3.0.4}/docs/manual/safe_combinations.py.xdotool +0 -0
  133. {urwid-3.0.3 → urwid-3.0.4}/docs/manual/safe_combinations1.png +0 -0
  134. {urwid-3.0.3 → urwid-3.0.4}/docs/manual/textlayout.rst +0 -0
  135. {urwid-3.0.3 → urwid-3.0.4}/docs/manual/userinput.rst +0 -0
  136. {urwid-3.0.3 → urwid-3.0.4}/docs/manual/wanat.py +0 -0
  137. {urwid-3.0.3 → urwid-3.0.4}/docs/manual/wanat_multi.py +0 -0
  138. {urwid-3.0.3 → urwid-3.0.4}/docs/manual/wcur1.py +0 -0
  139. {urwid-3.0.3 → urwid-3.0.4}/docs/manual/wcur2.py +0 -0
  140. {urwid-3.0.3 → urwid-3.0.4}/docs/manual/widgets.rst +0 -0
  141. {urwid-3.0.3 → urwid-3.0.4}/docs/manual/wmod.py +0 -0
  142. {urwid-3.0.3 → urwid-3.0.4}/docs/manual/wsel.py +0 -0
  143. {urwid-3.0.3 → urwid-3.0.4}/docs/reference/attrspec.rst +0 -0
  144. {urwid-3.0.3 → urwid-3.0.4}/docs/reference/canvas.rst +0 -0
  145. {urwid-3.0.3 → urwid-3.0.4}/docs/reference/command_map.rst +0 -0
  146. {urwid-3.0.3 → urwid-3.0.4}/docs/reference/constants.rst +0 -0
  147. {urwid-3.0.3 → urwid-3.0.4}/docs/reference/deprecated.rst +0 -0
  148. {urwid-3.0.3 → urwid-3.0.4}/docs/reference/display_modules.rst +0 -0
  149. {urwid-3.0.3 → urwid-3.0.4}/docs/reference/exceptions.rst +0 -0
  150. {urwid-3.0.3 → urwid-3.0.4}/docs/reference/global_settings.rst +0 -0
  151. {urwid-3.0.3 → urwid-3.0.4}/docs/reference/index.rst +0 -0
  152. {urwid-3.0.3 → urwid-3.0.4}/docs/reference/list_walkers.rst +0 -0
  153. {urwid-3.0.3 → urwid-3.0.4}/docs/reference/main_loop.rst +0 -0
  154. {urwid-3.0.3 → urwid-3.0.4}/docs/reference/meta.rst +0 -0
  155. {urwid-3.0.3 → urwid-3.0.4}/docs/reference/signals.rst +0 -0
  156. {urwid-3.0.3 → urwid-3.0.4}/docs/reference/text_layout.rst +0 -0
  157. {urwid-3.0.3 → urwid-3.0.4}/docs/reference/widget.rst +0 -0
  158. {urwid-3.0.3 → urwid-3.0.4}/docs/tools/compile_pngs.sh +0 -0
  159. {urwid-3.0.3 → urwid-3.0.4}/docs/tools/screenshots.sh +0 -0
  160. {urwid-3.0.3 → urwid-3.0.4}/docs/tools/static/.placeholder +0 -0
  161. {urwid-3.0.3 → urwid-3.0.4}/docs/tools/templates/indexcontent.html +0 -0
  162. {urwid-3.0.3 → urwid-3.0.4}/docs/tools/templates/indexsidebar.html +0 -0
  163. {urwid-3.0.3 → urwid-3.0.4}/docs/tools/templates/localtoc.html +0 -0
  164. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/adventure.py +0 -0
  165. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/adventure.py.xdotool +0 -0
  166. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/adventure1.png +0 -0
  167. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/adventure2.png +0 -0
  168. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/adventure3.png +0 -0
  169. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/adventure4.png +0 -0
  170. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/cmenu.py +0 -0
  171. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/cmenu.py.xdotool +0 -0
  172. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/cmenu1.png +0 -0
  173. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/cmenu2.png +0 -0
  174. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/cmenu3.png +0 -0
  175. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/cmenu4.png +0 -0
  176. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/highcolors.py +0 -0
  177. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/highcolors.py.xdotool +0 -0
  178. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/highcolors1.png +0 -0
  179. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/hmenu.py +0 -0
  180. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/hmenu.py.xdotool +0 -0
  181. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/hmenu1.png +0 -0
  182. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/hmenu2.png +0 -0
  183. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/hmenu3.png +0 -0
  184. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/hmenu4.png +0 -0
  185. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/index.rst +0 -0
  186. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/input.py +0 -0
  187. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/input.py.xdotool +0 -0
  188. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/input1.png +0 -0
  189. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/input2.png +0 -0
  190. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/input3.png +0 -0
  191. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/input4.png +0 -0
  192. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/input5.png +0 -0
  193. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/menu25.png +0 -0
  194. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/minimal.py +0 -0
  195. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/minimal.py.xdotool +0 -0
  196. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/minimal1.png +0 -0
  197. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/multiple.py +0 -0
  198. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/multiple.py.xdotool +0 -0
  199. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/multiple1.png +0 -0
  200. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/multiple2.png +0 -0
  201. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/multiple3.png +0 -0
  202. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/multiple4.png +0 -0
  203. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/qa.py +0 -0
  204. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/qa.py.xdotool +0 -0
  205. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/qa1.png +0 -0
  206. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/qa2.png +0 -0
  207. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/qa3.png +0 -0
  208. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/sig.py +0 -0
  209. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/sig.py.xdotool +0 -0
  210. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/sig1.png +0 -0
  211. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/sig2.png +0 -0
  212. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/sig3.png +0 -0
  213. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/sig4.png +0 -0
  214. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/smenu.py +0 -0
  215. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/smenu.py.xdotool +0 -0
  216. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/smenu1.png +0 -0
  217. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/smenu2.png +0 -0
  218. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/smenu3.png +0 -0
  219. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/urwid_attr.py +0 -0
  220. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/urwid_attr.py.xdotool +0 -0
  221. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/urwid_attr1.png +0 -0
  222. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/urwid_attr2.png +0 -0
  223. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/urwid_attr3.png +0 -0
  224. {urwid-3.0.3 → urwid-3.0.4}/docs/tutorial/urwid_attr4.png +0 -0
  225. {urwid-3.0.3 → urwid-3.0.4}/docs/urwid-logo.png +0 -0
  226. {urwid-3.0.3 → urwid-3.0.4}/examples/asyncio_socket_server.py +0 -0
  227. {urwid-3.0.3 → urwid-3.0.4}/examples/bigtext.py +0 -0
  228. {urwid-3.0.3 → urwid-3.0.4}/examples/browse.py +0 -0
  229. {urwid-3.0.3 → urwid-3.0.4}/examples/calc.py +0 -0
  230. {urwid-3.0.3 → urwid-3.0.4}/examples/dialog.py +0 -0
  231. {urwid-3.0.3 → urwid-3.0.4}/examples/edit.py +0 -0
  232. {urwid-3.0.3 → urwid-3.0.4}/examples/fib.py +0 -0
  233. {urwid-3.0.3 → urwid-3.0.4}/examples/graph.py +0 -0
  234. {urwid-3.0.3 → urwid-3.0.4}/examples/input_test.py +0 -0
  235. {urwid-3.0.3 → urwid-3.0.4}/examples/lcd_cf635.py +0 -0
  236. {urwid-3.0.3 → urwid-3.0.4}/examples/palette_test.py +0 -0
  237. {urwid-3.0.3 → urwid-3.0.4}/examples/pop_up.py +0 -0
  238. {urwid-3.0.3 → urwid-3.0.4}/examples/subproc.py +0 -0
  239. {urwid-3.0.3 → urwid-3.0.4}/examples/subproc2.py +0 -0
  240. {urwid-3.0.3 → urwid-3.0.4}/examples/terminal.py +0 -0
  241. {urwid-3.0.3 → urwid-3.0.4}/examples/tour.py +0 -0
  242. {urwid-3.0.3 → urwid-3.0.4}/examples/treesample.py +0 -0
  243. {urwid-3.0.3 → urwid-3.0.4}/examples/twisted_serve_ssh.tac +0 -0
  244. {urwid-3.0.3 → urwid-3.0.4}/requirements.txt +0 -0
  245. {urwid-3.0.3 → urwid-3.0.4}/setup.cfg +0 -0
  246. {urwid-3.0.3 → urwid-3.0.4}/test_requirements.txt +0 -0
  247. {urwid-3.0.3 → urwid-3.0.4}/tests/__init__.py +0 -0
  248. {urwid-3.0.3 → urwid-3.0.4}/tests/test_canvas.py +0 -0
  249. {urwid-3.0.3 → urwid-3.0.4}/tests/test_columns.py +0 -0
  250. {urwid-3.0.3 → urwid-3.0.4}/tests/test_container.py +0 -0
  251. {urwid-3.0.3 → urwid-3.0.4}/tests/test_doctests.py +0 -0
  252. {urwid-3.0.3 → urwid-3.0.4}/tests/test_escapes.py +0 -0
  253. {urwid-3.0.3 → urwid-3.0.4}/tests/test_event_loops.py +0 -0
  254. {urwid-3.0.3 → urwid-3.0.4}/tests/test_filler.py +0 -0
  255. {urwid-3.0.3 → urwid-3.0.4}/tests/test_floatedit.py +0 -0
  256. {urwid-3.0.3 → urwid-3.0.4}/tests/test_font.py +0 -0
  257. {urwid-3.0.3 → urwid-3.0.4}/tests/test_frame.py +0 -0
  258. {urwid-3.0.3 → urwid-3.0.4}/tests/test_graphics.py +0 -0
  259. {urwid-3.0.3 → urwid-3.0.4}/tests/test_grid_flow.py +0 -0
  260. {urwid-3.0.3 → urwid-3.0.4}/tests/test_line_box.py +0 -0
  261. {urwid-3.0.3 → urwid-3.0.4}/tests/test_listbox.py +0 -0
  262. {urwid-3.0.3 → urwid-3.0.4}/tests/test_main_loop.py +0 -0
  263. {urwid-3.0.3 → urwid-3.0.4}/tests/test_moved_imports.py +0 -0
  264. {urwid-3.0.3 → urwid-3.0.4}/tests/test_overlay.py +0 -0
  265. {urwid-3.0.3 → urwid-3.0.4}/tests/test_padding.py +0 -0
  266. {urwid-3.0.3 → urwid-3.0.4}/tests/test_pile.py +0 -0
  267. {urwid-3.0.3 → urwid-3.0.4}/tests/test_raw_display.py +0 -0
  268. {urwid-3.0.3 → urwid-3.0.4}/tests/test_scrollable.py +0 -0
  269. {urwid-3.0.3 → urwid-3.0.4}/tests/test_signals.py +0 -0
  270. {urwid-3.0.3 → urwid-3.0.4}/tests/test_str_util.py +0 -0
  271. {urwid-3.0.3 → urwid-3.0.4}/tests/test_text_layout.py +0 -0
  272. {urwid-3.0.3 → urwid-3.0.4}/tests/test_tree.py +0 -0
  273. {urwid-3.0.3 → urwid-3.0.4}/tests/test_util.py +0 -0
  274. {urwid-3.0.3 → urwid-3.0.4}/tests/test_vterm.py +0 -0
  275. {urwid-3.0.3 → urwid-3.0.4}/tests/test_widget.py +0 -0
  276. {urwid-3.0.3 → urwid-3.0.4}/tests/util.py +0 -0
  277. {urwid-3.0.3 → urwid-3.0.4}/urwid/canvas.py +0 -0
  278. {urwid-3.0.3 → urwid-3.0.4}/urwid/command_map.py +0 -0
  279. {urwid-3.0.3 → urwid-3.0.4}/urwid/container.py +0 -0
  280. {urwid-3.0.3 → urwid-3.0.4}/urwid/decoration.py +0 -0
  281. {urwid-3.0.3 → urwid-3.0.4}/urwid/display/_posix_raw_display.py +0 -0
  282. {urwid-3.0.3 → urwid-3.0.4}/urwid/display/_web.css +0 -0
  283. {urwid-3.0.3 → urwid-3.0.4}/urwid/display/_web.js +0 -0
  284. {urwid-3.0.3 → urwid-3.0.4}/urwid/display/_win32.py +0 -0
  285. {urwid-3.0.3 → urwid-3.0.4}/urwid/display/_win32_raw_display.py +0 -0
  286. {urwid-3.0.3 → urwid-3.0.4}/urwid/display/escape.py +0 -0
  287. {urwid-3.0.3 → urwid-3.0.4}/urwid/display/html_fragment.py +0 -0
  288. {urwid-3.0.3 → urwid-3.0.4}/urwid/display/lcd.py +0 -0
  289. {urwid-3.0.3 → urwid-3.0.4}/urwid/display/raw.py +0 -0
  290. {urwid-3.0.3 → urwid-3.0.4}/urwid/event_loop/__init__.py +0 -0
  291. {urwid-3.0.3 → urwid-3.0.4}/urwid/event_loop/abstract_loop.py +0 -0
  292. {urwid-3.0.3 → urwid-3.0.4}/urwid/event_loop/glib_loop.py +0 -0
  293. {urwid-3.0.3 → urwid-3.0.4}/urwid/event_loop/select_loop.py +0 -0
  294. {urwid-3.0.3 → urwid-3.0.4}/urwid/event_loop/tornado_loop.py +0 -0
  295. {urwid-3.0.3 → urwid-3.0.4}/urwid/event_loop/trio_loop.py +0 -0
  296. {urwid-3.0.3 → urwid-3.0.4}/urwid/event_loop/twisted_loop.py +0 -0
  297. {urwid-3.0.3 → urwid-3.0.4}/urwid/event_loop/zmq_loop.py +0 -0
  298. {urwid-3.0.3 → urwid-3.0.4}/urwid/graphics.py +0 -0
  299. {urwid-3.0.3 → urwid-3.0.4}/urwid/str_util.py +0 -0
  300. {urwid-3.0.3 → urwid-3.0.4}/urwid/text_layout.py +0 -0
  301. {urwid-3.0.3 → urwid-3.0.4}/urwid/vterm.py +0 -0
  302. {urwid-3.0.3 → urwid-3.0.4}/urwid/widget/__init__.py +0 -0
  303. {urwid-3.0.3 → urwid-3.0.4}/urwid/widget/bar_graph.py +0 -0
  304. {urwid-3.0.3 → urwid-3.0.4}/urwid/widget/columns.py +0 -0
  305. {urwid-3.0.3 → urwid-3.0.4}/urwid/widget/constants.py +0 -0
  306. {urwid-3.0.3 → urwid-3.0.4}/urwid/widget/container.py +0 -0
  307. {urwid-3.0.3 → urwid-3.0.4}/urwid/widget/grid_flow.py +0 -0
  308. {urwid-3.0.3 → urwid-3.0.4}/urwid/widget/overlay.py +0 -0
  309. {urwid-3.0.3 → urwid-3.0.4}/urwid/widget/pile.py +0 -0
  310. {urwid-3.0.3 → urwid-3.0.4}/urwid/widget/popup.py +0 -0
  311. {urwid-3.0.3 → urwid-3.0.4}/urwid/widget/scrollable.py +0 -0
  312. {urwid-3.0.3 → urwid-3.0.4}/urwid/widget/treetools.py +0 -0
  313. {urwid-3.0.3 → urwid-3.0.4}/urwid/wimp.py +0 -0
  314. {urwid-3.0.3 → urwid-3.0.4}/urwid.egg-info/dependency_links.txt +0 -0
  315. {urwid-3.0.3 → urwid-3.0.4}/urwid.egg-info/not-zip-safe +0 -0
  316. {urwid-3.0.3 → urwid-3.0.4}/urwid.egg-info/requires.txt +0 -0
  317. {urwid-3.0.3 → urwid-3.0.4}/urwid.egg-info/top_level.txt +0 -0
@@ -23,7 +23,7 @@ jobs:
23
23
  Build:
24
24
  runs-on: ubuntu-latest
25
25
  steps:
26
- - uses: actions/checkout@v5
26
+ - uses: actions/checkout@v6
27
27
  with:
28
28
  fetch-depth: 0 # need for setuptools_scm
29
29
  - name: Set up Python
@@ -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@v5
48
48
  with:
49
49
  path: build/documentation
50
50
  name: documentation
@@ -4,19 +4,17 @@ 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@v5
17
+ - uses: actions/checkout@v6
20
18
  - name: Set up Python
21
19
  uses: actions/setup-python@v6
22
20
  with:
@@ -25,34 +23,16 @@ jobs:
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@v5
38
- - name: Set up Python
39
- uses: actions/setup-python@v6
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@v5
35
+ - uses: actions/checkout@v6
56
36
  - name: Set up Python
57
37
  uses: actions/setup-python@v6
58
38
  with:
@@ -70,7 +50,7 @@ jobs:
70
50
  name: Check with pylint
71
51
  runs-on: ubuntu-latest
72
52
  steps:
73
- - uses: actions/checkout@v5
53
+ - uses: actions/checkout@v6
74
54
  - name: Install Ubuntu dependencies
75
55
  run: |
76
56
  sudo apt-get -qq update
@@ -26,11 +26,11 @@ 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@v5
33
+ - uses: actions/checkout@v6
34
34
  - name: Set up Python
35
35
  uses: actions/setup-python@v6
36
36
  with:
@@ -39,34 +39,16 @@ jobs:
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@v5
52
- - name: Set up Python
53
- uses: actions/setup-python@v6
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@v5
51
+ - uses: actions/checkout@v6
70
52
  - name: Set up Python
71
53
  uses: actions/setup-python@v6
72
54
  with:
@@ -84,7 +66,7 @@ jobs:
84
66
  name: Check with pylint
85
67
  runs-on: ubuntu-latest
86
68
  steps:
87
- - uses: actions/checkout@v5
69
+ - uses: actions/checkout@v6
88
70
  - name: Install Ubuntu dependencies
89
71
  run: |
90
72
  sudo apt-get -qq update
@@ -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,10 +96,13 @@ 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@v5
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 }}
@@ -170,10 +155,10 @@ 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@v5
161
+ - uses: actions/checkout@v6
177
162
  with:
178
163
  fetch-depth: 0 # need for setuptools_scm
179
164
 
@@ -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@v5
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@v5
197
182
  with:
198
183
  path: dist/*.whl
199
184
  name: built-bdist
@@ -204,7 +189,7 @@ jobs:
204
189
  runs-on: ubuntu-latest
205
190
  needs: [ build ]
206
191
  steps:
207
- - uses: actions/checkout@v5
192
+ - uses: actions/checkout@v6
208
193
  - name: Set up Python
209
194
  uses: actions/setup-python@v6
210
195
  with:
@@ -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@v5
202
+ - uses: actions/download-artifact@v6
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@v5
227
+ - uses: actions/download-artifact@v6
243
228
  with:
244
229
  pattern: built-*
245
230
  merge-multiple: true
@@ -10,7 +10,7 @@ jobs:
10
10
  check:
11
11
  runs-on: ubuntu-latest
12
12
  steps:
13
- - uses: actions/checkout@v5
13
+ - uses: actions/checkout@v6
14
14
  - name: Set up Python
15
15
  uses: actions/setup-python@v6
16
16
  with:
@@ -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.12.0
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.3
3
+ Version: 3.0.4
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,6 +26,7 @@ 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
@@ -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/
@@ -147,6 +147,7 @@ Supported Python versions
147
147
  - 3.11
148
148
  - 3.12
149
149
  - 3.13
150
+ - 3.14
150
151
  - pypy3
151
152
 
152
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/
@@ -92,6 +92,7 @@ Supported Python versions
92
92
  - 3.11
93
93
  - 3.12
94
94
  - 3.13
95
+ - 3.14
95
96
  - pypy3
96
97
 
97
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,23 @@
2
2
  Changelog
3
3
  ---------
4
4
 
5
+ Urwid 3.0.4
6
+ ===========
7
+
8
+ 2025-12-01
9
+
10
+ Deprecations ⚡
11
+ ++++++++++++++
12
+ * Fix CheckBox DeprecationWarning: Use user_args instead of user_arg by @sawdmn in https://github.com/urwid/urwid/pull/1079
13
+ Other Changes
14
+ +++++++++++++
15
+ * Refactoring: use official python way for lazy imports by @penguinolog in https://github.com/urwid/urwid/pull/1077
16
+
17
+ ## New Contributors
18
+ * @sawdmn made their first contribution in https://github.com/urwid/urwid/pull/1079
19
+
20
+ **Full Changelog**: https://github.com/urwid/urwid/compare/3.0.3...3.0.4
21
+
5
22
  Urwid 3.0.3
6
23
  ===========
7
24
 
@@ -289,9 +289,9 @@ class TwistedScreen(Screen):
289
289
  >>> s = Screen()
290
290
  >>> s.set_terminal_properties(colors=256)
291
291
  >>> a2e = s._attrspec_to_escape
292
- >>> a2e(s.AttrSpec('brown', 'dark green'))
292
+ >>> a2e(s.AttrSpec("brown", "dark green"))
293
293
  '\\x1b[0;33;42m'
294
- >>> a2e(s.AttrSpec('#fea,underline', '#d0d'))
294
+ >>> a2e(s.AttrSpec("#fea,underline", "#d0d"))
295
295
  '\\x1b[0;38;5;229;4;48;5;164m'
296
296
  """
297
297
  if a.foreground_high:
@@ -0,0 +1 @@
1
+ pylint==4.0.3
@@ -2,9 +2,9 @@
2
2
  # Minimum requirements for the build system to execute.
3
3
  # PEP 508 specifications for PEP 518.
4
4
  requires = [
5
- "setuptools >= 61.0.0",
6
- "setuptools_scm[toml]>=7.0",
5
+ "setuptools >= 80.8.0",
7
6
  "wheel",
7
+ "setuptools_scm[toml]>=8.1.0",
8
8
  ]
9
9
  build-backend="setuptools.build_meta"
10
10
 
@@ -13,7 +13,8 @@ name = "urwid"
13
13
  description = "A full-featured console (xterm et al.) user interface library"
14
14
  requires-python = ">=3.9.0"
15
15
  keywords = ["curses", "ui", "widget", "scroll", "listbox", "user interface", "text layout", "console", "ncurses"]
16
- license={text="LGPL-2.1-only"} # Use SPDX classifier
16
+ license = "LGPL-2.1-only" # Use SPDX classifier
17
+ license-files=["COPYING"]
17
18
  readme = {file = "README.rst", content-type = "text/x-rst"}
18
19
  authors=[{name="Ian Ward", email="ian@excess.org"}]
19
20
  dynamic = ["classifiers", "version", "dependencies"]
@@ -161,6 +162,7 @@ extend-exclude = ["tests"]
161
162
  extend-select = [
162
163
  "E",
163
164
  "W", # also pycodestyle warnings
165
+ "F", # pyflakes
164
166
  "PYI", # flake8-pyi
165
167
  "ASYNC", # flake8-async
166
168
  "FA", # from __future__ import annotations
@@ -174,9 +176,12 @@ extend-select = [
174
176
  "ICN", "PGH", # flake8-import-conventions, pygrep-hooks
175
177
  "Q", # quotes
176
178
  "FLY", # Flynt
179
+ "FURB", # Refurb
180
+ "PIE", # flake8-pie,
177
181
  "TRY", "UP", "I", "PL", "PERF", "RUF", # tryceratops, pyupgrade, isort, pylint + perflint, Ruff-specific
178
182
  ]
179
183
  extend-ignore = [
184
+ "E221", "E222", # handled by formatter
180
185
  "PLR6301", "E203",
181
186
  # refactor rules (too many statements/arguments/branches)
182
187
  "PLR0904", "PLR0911", "PLR0912", "PLR0913", "PLR0914", "PLR0915", "PLR0917", "PLR2004",
@@ -207,6 +212,9 @@ allow-dunder-method-names = [
207
212
  "_contents__delitem__",
208
213
  ]
209
214
 
215
+ [tool.ruff.format]
216
+ docstring-code-format = true
217
+
210
218
  [tool.pylint]
211
219
  extension-pkg-whitelist = []
212
220
  ignore = ["CVS", "version.py"]
@@ -0,0 +1 @@
1
+ ruff==0.14.7
@@ -1,5 +1,5 @@
1
1
  [tox]
2
- envlist = py3{9,10,11,12,13},pypy3,isort,black,ruff,pylint,refurb
2
+ envlist = py3{9,10,11,12,13,14},pypy3,ruff,pylint,refurb
3
3
  skip_missing_interpreters = True
4
4
 
5
5
  [testenv]
@@ -18,26 +18,13 @@ commands =
18
18
  python -m build
19
19
  twine check {toxinidir}/dist/*
20
20
 
21
- [testenv:isort]
22
- skip_install = true
23
- deps =
24
- isort
25
- commands =
26
- isort .
27
-
28
- [testenv:black]
29
- skip_install = true
30
- depends = isort
31
- deps =
32
- black
33
- commands =
34
- black .
35
-
36
21
  [testenv:ruff]
37
22
  skip_install = true
38
- depends = black,isort
23
+ depends =
39
24
  deps = ruff
40
- commands = ruff check .
25
+ commands =
26
+ ruff format --check .
27
+ ruff check .
41
28
 
42
29
  [testenv:docs]
43
30
  deps =
@@ -47,7 +34,7 @@ deps =
47
34
  commands = sphinx-build docs/ build/documentation
48
35
 
49
36
  [testenv:pylint]
50
- depends = black,isort
37
+ depends = ruff
51
38
  deps =
52
39
  -r {toxinidir}/test_requirements.txt
53
40
  PyGObject
@@ -55,6 +42,6 @@ deps =
55
42
  commands = pylint urwid
56
43
 
57
44
  [testenv:refurb]
58
- depends = black,isort
45
+ depends = ruff
59
46
  deps = refurb
60
47
  commands = refurb urwid examples
@@ -21,7 +21,7 @@
21
21
 
22
22
  from __future__ import annotations
23
23
 
24
- import importlib
24
+ import importlib.util
25
25
  import sys
26
26
  import types
27
27
  import typing
@@ -265,12 +265,28 @@ _moved_warn: dict[str, str] = {
265
265
  }
266
266
  # Backward compatible lazy load without any warnings
267
267
  # Before DeprecationWarning need to start PendingDeprecationWarning process.
268
- _moved_no_warn: dict[str, str] = {
269
- "display_common": "urwid.display.common",
270
- "raw_display": "urwid.display.raw",
271
- "curses_display": "urwid.display.curses",
272
- "escape": "urwid.display.escape",
273
- }
268
+
269
+
270
+ def lazy_import(name: str, package: str | None = None) -> types.ModuleType:
271
+ """Lazy import implementation from Python documentation.
272
+
273
+ Useful for cases where no warnings expected for moved modules.
274
+ """
275
+ spec = importlib.util.find_spec(name, package)
276
+ if not spec:
277
+ raise ImportError(f"No module named {name!r}")
278
+ if not spec.loader:
279
+ raise ImportError(f"Module named {name!r} is invalid")
280
+
281
+ loader = importlib.util.LazyLoader(spec.loader)
282
+ spec.loader = loader
283
+ module = importlib.util.module_from_spec(spec)
284
+ if not package:
285
+ sys.modules[name] = module
286
+ else:
287
+ sys.modules[f"{package.rstrip('.')}.{name.lstrip('.')}"] = module
288
+ loader.exec_module(module)
289
+ return module
274
290
 
275
291
 
276
292
  class _MovedModule(types.ModuleType):
@@ -293,6 +309,12 @@ class _MovedModule(types.ModuleType):
293
309
  return getattr(real_module, name)
294
310
 
295
311
 
312
+ display_common = lazy_import("urwid.display.common")
313
+ raw_display = lazy_import("urwid.display.raw")
314
+ curses_display = lazy_import("urwid.display.curses")
315
+ escape = lazy_import("urwid.display.escape")
316
+
317
+
296
318
  class _MovedModuleWarn(_MovedModule):
297
319
  """Special class to handle moved modules.
298
320
 
@@ -310,10 +332,6 @@ class _MovedModuleWarn(_MovedModule):
310
332
  return super().__getattr__(name)
311
333
 
312
334
 
313
- for _name, _module in _moved_no_warn.items():
314
- _module_path = f"{__name__}.{_name}"
315
- sys.modules[_module_path] = _MovedModule(_module_path, _module)
316
-
317
335
  for _name, _module in _moved_warn.items():
318
336
  _module_path = f"{__name__}.{_name}"
319
337
  sys.modules[_module_path] = _MovedModuleWarn(_module_path, _module)
@@ -325,11 +343,6 @@ def __getattr__(name: str) -> typing.Any:
325
343
  :return: attribute by name
326
344
  :raises AttributeError: attribute is not defined for lazy load
327
345
  """
328
- if name in _moved_no_warn:
329
- mod = importlib.import_module(_moved_no_warn[name])
330
- __locals[name] = mod
331
- return mod
332
-
333
346
  if name in _moved_warn:
334
347
  warnings.warn(
335
348
  f"{name} is moved to {_moved_warn[name]}",