urwid 2.5.3__tar.gz → 2.6.0.post0__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 (321) hide show
  1. {urwid-2.5.3 → urwid-2.6.0.post0}/.github/workflows/isolated_static_check.yml +3 -3
  2. {urwid-2.5.3 → urwid-2.6.0.post0}/.github/workflows/pythonpackage.yml +16 -55
  3. urwid-2.6.0.post0/.pre-commit-config.yaml +45 -0
  4. {urwid-2.5.3/urwid.egg-info → urwid-2.6.0.post0}/PKG-INFO +8 -4
  5. {urwid-2.5.3 → urwid-2.6.0.post0}/README.rst +6 -2
  6. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/conf.py +23 -6
  7. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/examples/browse.py +1 -1
  8. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/examples/subproc2.py +4 -2
  9. urwid-2.6.0.post0/docs/manual/bright_combinations.py +84 -0
  10. urwid-2.6.0.post0/docs/manual/safe_combinations.py +87 -0
  11. urwid-2.6.0.post0/docs/manual/wanat.py +24 -0
  12. urwid-2.6.0.post0/docs/manual/wanat_multi.py +19 -0
  13. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/manual/wcur1.py +7 -6
  14. urwid-2.6.0.post0/docs/manual/wcur2.py +13 -0
  15. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/manual/wmod.py +6 -8
  16. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/manual/wsel.py +11 -10
  17. urwid-2.6.0.post0/docs/tutorial/adventure.py +109 -0
  18. urwid-2.6.0.post0/docs/tutorial/cmenu.py +113 -0
  19. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tutorial/highcolors.py +1 -1
  20. urwid-2.6.0.post0/docs/tutorial/hmenu.py +125 -0
  21. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tutorial/input.py +1 -1
  22. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tutorial/multiple.py +3 -2
  23. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tutorial/qa.py +6 -3
  24. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tutorial/sig.py +7 -5
  25. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tutorial/smenu.py +21 -9
  26. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tutorial/urwid_attr.py +1 -1
  27. {urwid-2.5.3 → urwid-2.6.0.post0}/examples/calc.py +1 -3
  28. {urwid-2.5.3 → urwid-2.6.0.post0}/examples/dialog.py +5 -5
  29. {urwid-2.5.3 → urwid-2.6.0.post0}/pyproject.toml +17 -0
  30. {urwid-2.5.3 → urwid-2.6.0.post0}/setup.py +11 -23
  31. urwid-2.6.0.post0/tests/test_text_layout.py +404 -0
  32. {urwid-2.5.3 → urwid-2.6.0.post0}/tests/test_util.py +4 -4
  33. {urwid-2.5.3 → urwid-2.6.0.post0}/tox.ini +8 -4
  34. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/__init__.py +1 -6
  35. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/canvas.py +41 -46
  36. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/display/_raw_display_base.py +9 -9
  37. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/display/curses.py +1 -1
  38. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/display/escape.py +3 -7
  39. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/display/html_fragment.py +6 -8
  40. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/display/web.py +5 -6
  41. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/event_loop/main_loop.py +1 -2
  42. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/font.py +2 -2
  43. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/listbox.py +2 -4
  44. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/monitored_list.py +3 -3
  45. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/signals.py +3 -6
  46. urwid-2.5.3/urwid/old_str_util.py → urwid-2.6.0.post0/urwid/str_util.py +61 -69
  47. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/text_layout.py +41 -29
  48. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/treetools.py +7 -14
  49. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/util.py +19 -28
  50. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/version.py +2 -2
  51. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/widget/attr_map.py +1 -1
  52. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/widget/attr_wrap.py +1 -1
  53. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/widget/box_adapter.py +1 -1
  54. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/widget/edit.py +4 -3
  55. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/widget/filler.py +9 -10
  56. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/widget/grid_flow.py +1 -1
  57. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/widget/line_box.py +1 -0
  58. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/widget/padding.py +9 -10
  59. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/widget/progress_bar.py +1 -2
  60. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/widget/text.py +16 -17
  61. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/widget/wimp.py +2 -2
  62. {urwid-2.5.3 → urwid-2.6.0.post0/urwid.egg-info}/PKG-INFO +8 -4
  63. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid.egg-info/SOURCES.txt +2 -3
  64. urwid-2.5.3/.DS_Store +0 -0
  65. urwid-2.5.3/docs/manual/bright_combinations.py +0 -42
  66. urwid-2.5.3/docs/manual/safe_combinations.py +0 -45
  67. urwid-2.5.3/docs/manual/wanat.py +0 -24
  68. urwid-2.5.3/docs/manual/wanat_multi.py +0 -19
  69. urwid-2.5.3/docs/manual/wcur2.py +0 -13
  70. urwid-2.5.3/docs/tutorial/adventure.py +0 -86
  71. urwid-2.5.3/docs/tutorial/cmenu.py +0 -73
  72. urwid-2.5.3/docs/tutorial/hmenu.py +0 -84
  73. urwid-2.5.3/source/str_util.c +0 -1683
  74. urwid-2.5.3/tests/test_text_layout.py +0 -389
  75. {urwid-2.5.3 → urwid-2.6.0.post0}/.coveralls.yml +0 -0
  76. {urwid-2.5.3 → urwid-2.6.0.post0}/.github/CODE_OF_CONDUCT.md +0 -0
  77. {urwid-2.5.3 → urwid-2.6.0.post0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  78. {urwid-2.5.3 → urwid-2.6.0.post0}/.github/ISSUE_TEMPLATE/docs.md +0 -0
  79. {urwid-2.5.3 → urwid-2.6.0.post0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  80. {urwid-2.5.3 → urwid-2.6.0.post0}/.github/ISSUE_TEMPLATE/question.md +0 -0
  81. {urwid-2.5.3 → urwid-2.6.0.post0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  82. {urwid-2.5.3 → urwid-2.6.0.post0}/.github/dependabot.yml +0 -0
  83. {urwid-2.5.3 → urwid-2.6.0.post0}/.github/labeler.yml +0 -0
  84. {urwid-2.5.3 → urwid-2.6.0.post0}/.github/release.yml +0 -0
  85. {urwid-2.5.3 → urwid-2.6.0.post0}/.github/workflows/documentation.yml +0 -0
  86. {urwid-2.5.3 → urwid-2.6.0.post0}/.github/workflows/labels.yml +0 -0
  87. {urwid-2.5.3 → urwid-2.6.0.post0}/.github/workflows/yamllint.yml +0 -0
  88. {urwid-2.5.3 → urwid-2.6.0.post0}/.gitignore +0 -0
  89. {urwid-2.5.3 → urwid-2.6.0.post0}/.yamllint.yml +0 -0
  90. {urwid-2.5.3 → urwid-2.6.0.post0}/COPYING +0 -0
  91. {urwid-2.5.3 → urwid-2.6.0.post0}/MANIFEST.in +0 -0
  92. {urwid-2.5.3 → urwid-2.6.0.post0}/black-requirements.txt +0 -0
  93. {urwid-2.5.3 → urwid-2.6.0.post0}/classifiers.txt +0 -0
  94. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/Makefile +0 -0
  95. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/changelog.rst +0 -0
  96. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/examples/bigtext.py +0 -0
  97. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/examples/bigtext.py.xdotool +0 -0
  98. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/examples/bigtext1.png +0 -0
  99. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/examples/bigtext2.png +0 -0
  100. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/examples/bigtext3.png +0 -0
  101. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/examples/browse.py.xdotool +0 -0
  102. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/examples/browse1.png +0 -0
  103. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/examples/browse2.png +0 -0
  104. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/examples/edit.py +0 -0
  105. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/examples/edit.py.xdotool +0 -0
  106. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/examples/edit1.png +0 -0
  107. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/examples/edit2.png +0 -0
  108. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/examples/edit_text.txt +0 -0
  109. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/examples/graph.py +0 -0
  110. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/examples/graph.py.xdotool +0 -0
  111. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/examples/graph1.png +0 -0
  112. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/examples/graph2.png +0 -0
  113. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/examples/index.rst +0 -0
  114. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/examples/palette_test.py +0 -0
  115. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/examples/palette_test.py.xdotool +0 -0
  116. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/examples/palette_test1.png +0 -0
  117. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/examples/palette_test2.png +0 -0
  118. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/examples/pop_up.py +0 -0
  119. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/examples/pop_up.py.xdotool +0 -0
  120. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/examples/pop_up1.png +0 -0
  121. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/examples/pop_up2.png +0 -0
  122. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/examples/real_browse.py +0 -0
  123. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/examples/real_edit.py +0 -0
  124. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/examples/subproc.py +0 -0
  125. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/examples/subproc.py.xdotool +0 -0
  126. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/examples/subproc1.png +0 -0
  127. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/examples/subproc2.png +0 -0
  128. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/examples/tour.py +0 -0
  129. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/examples/tour.py.xdotool +0 -0
  130. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/examples/tour1.png +0 -0
  131. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/examples/tour2.png +0 -0
  132. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/index.rst +0 -0
  133. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/manual/bright_combinations.py.xdotool +0 -0
  134. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/manual/bright_combinations1.png +0 -0
  135. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/manual/canvascache.rst +0 -0
  136. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/manual/displayattributes.rst +0 -0
  137. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/manual/displaymodules.rst +0 -0
  138. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/manual/encodings.rst +0 -0
  139. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/manual/images/display_modules.png +0 -0
  140. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/manual/images/introduction.png +0 -0
  141. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/manual/images/urwid_widgets.svgz +0 -0
  142. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/manual/images/urwid_widgets_1.png +0 -0
  143. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/manual/images/urwid_widgets_1.xcf +0 -0
  144. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/manual/images/urwid_widgets_2.png +0 -0
  145. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/manual/images/urwid_widgets_2.xcf +0 -0
  146. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/manual/images/widget_layout.png +0 -0
  147. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/manual/index.rst +0 -0
  148. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/manual/mainloop.rst +0 -0
  149. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/manual/overview.rst +0 -0
  150. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/manual/safe_combinations.py.xdotool +0 -0
  151. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/manual/safe_combinations1.png +0 -0
  152. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/manual/textlayout.rst +0 -0
  153. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/manual/userinput.rst +0 -0
  154. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/manual/widgets.rst +0 -0
  155. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/reference/attrspec.rst +0 -0
  156. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/reference/canvas.rst +0 -0
  157. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/reference/command_map.rst +0 -0
  158. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/reference/constants.rst +0 -0
  159. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/reference/deprecated.rst +0 -0
  160. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/reference/display_modules.rst +0 -0
  161. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/reference/exceptions.rst +0 -0
  162. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/reference/global_settings.rst +0 -0
  163. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/reference/index.rst +0 -0
  164. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/reference/list_walkers.rst +0 -0
  165. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/reference/main_loop.rst +0 -0
  166. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/reference/meta.rst +0 -0
  167. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/reference/signals.rst +0 -0
  168. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/reference/text_layout.rst +0 -0
  169. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/reference/widget.rst +0 -0
  170. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tools/compile_pngs.sh +0 -0
  171. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tools/screenshots.sh +0 -0
  172. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tools/static/.placeholder +0 -0
  173. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tools/templates/indexcontent.html +0 -0
  174. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tools/templates/indexsidebar.html +0 -0
  175. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tools/templates/localtoc.html +0 -0
  176. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tutorial/adventure.py.xdotool +0 -0
  177. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tutorial/adventure1.png +0 -0
  178. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tutorial/adventure2.png +0 -0
  179. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tutorial/adventure3.png +0 -0
  180. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tutorial/adventure4.png +0 -0
  181. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tutorial/cmenu.py.xdotool +0 -0
  182. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tutorial/cmenu1.png +0 -0
  183. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tutorial/cmenu2.png +0 -0
  184. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tutorial/cmenu3.png +0 -0
  185. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tutorial/cmenu4.png +0 -0
  186. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tutorial/highcolors.py.xdotool +0 -0
  187. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tutorial/highcolors1.png +0 -0
  188. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tutorial/hmenu.py.xdotool +0 -0
  189. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tutorial/hmenu1.png +0 -0
  190. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tutorial/hmenu2.png +0 -0
  191. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tutorial/hmenu3.png +0 -0
  192. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tutorial/hmenu4.png +0 -0
  193. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tutorial/index.rst +0 -0
  194. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tutorial/input.py.xdotool +0 -0
  195. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tutorial/input1.png +0 -0
  196. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tutorial/input2.png +0 -0
  197. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tutorial/input3.png +0 -0
  198. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tutorial/input4.png +0 -0
  199. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tutorial/input5.png +0 -0
  200. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tutorial/menu25.png +0 -0
  201. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tutorial/minimal.py +0 -0
  202. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tutorial/minimal.py.xdotool +0 -0
  203. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tutorial/minimal1.png +0 -0
  204. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tutorial/multiple.py.xdotool +0 -0
  205. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tutorial/multiple1.png +0 -0
  206. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tutorial/multiple2.png +0 -0
  207. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tutorial/multiple3.png +0 -0
  208. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tutorial/multiple4.png +0 -0
  209. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tutorial/qa.py.xdotool +0 -0
  210. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tutorial/qa1.png +0 -0
  211. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tutorial/qa2.png +0 -0
  212. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tutorial/qa3.png +0 -0
  213. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tutorial/sig.py.xdotool +0 -0
  214. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tutorial/sig1.png +0 -0
  215. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tutorial/sig2.png +0 -0
  216. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tutorial/sig3.png +0 -0
  217. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tutorial/sig4.png +0 -0
  218. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tutorial/smenu.py.xdotool +0 -0
  219. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tutorial/smenu1.png +0 -0
  220. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tutorial/smenu2.png +0 -0
  221. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tutorial/smenu3.png +0 -0
  222. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tutorial/urwid_attr.py.xdotool +0 -0
  223. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tutorial/urwid_attr1.png +0 -0
  224. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tutorial/urwid_attr2.png +0 -0
  225. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tutorial/urwid_attr3.png +0 -0
  226. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/tutorial/urwid_attr4.png +0 -0
  227. {urwid-2.5.3 → urwid-2.6.0.post0}/docs/urwid-logo.png +0 -0
  228. {urwid-2.5.3 → urwid-2.6.0.post0}/examples/asyncio_socket_server.py +0 -0
  229. {urwid-2.5.3 → urwid-2.6.0.post0}/examples/bigtext.py +0 -0
  230. {urwid-2.5.3 → urwid-2.6.0.post0}/examples/browse.py +0 -0
  231. {urwid-2.5.3 → urwid-2.6.0.post0}/examples/edit.py +0 -0
  232. {urwid-2.5.3 → urwid-2.6.0.post0}/examples/fib.py +0 -0
  233. {urwid-2.5.3 → urwid-2.6.0.post0}/examples/graph.py +0 -0
  234. {urwid-2.5.3 → urwid-2.6.0.post0}/examples/input_test.py +0 -0
  235. {urwid-2.5.3 → urwid-2.6.0.post0}/examples/lcd_cf635.py +0 -0
  236. {urwid-2.5.3 → urwid-2.6.0.post0}/examples/palette_test.py +0 -0
  237. {urwid-2.5.3 → urwid-2.6.0.post0}/examples/pop_up.py +0 -0
  238. {urwid-2.5.3 → urwid-2.6.0.post0}/examples/subproc.py +0 -0
  239. {urwid-2.5.3 → urwid-2.6.0.post0}/examples/subproc2.py +0 -0
  240. {urwid-2.5.3 → urwid-2.6.0.post0}/examples/terminal.py +0 -0
  241. {urwid-2.5.3 → urwid-2.6.0.post0}/examples/tour.py +0 -0
  242. {urwid-2.5.3 → urwid-2.6.0.post0}/examples/treesample.py +0 -0
  243. {urwid-2.5.3 → urwid-2.6.0.post0}/examples/twisted_serve_ssh.py +0 -0
  244. {urwid-2.5.3 → urwid-2.6.0.post0}/examples/twisted_serve_ssh.tac +0 -0
  245. {urwid-2.5.3 → urwid-2.6.0.post0}/isort-requirements.txt +0 -0
  246. {urwid-2.5.3 → urwid-2.6.0.post0}/pylint-requirements.txt +0 -0
  247. {urwid-2.5.3 → urwid-2.6.0.post0}/requirements.txt +0 -0
  248. {urwid-2.5.3 → urwid-2.6.0.post0}/ruff-requirements.txt +0 -0
  249. {urwid-2.5.3 → urwid-2.6.0.post0}/setup.cfg +0 -0
  250. {urwid-2.5.3 → urwid-2.6.0.post0}/test_requirements.txt +0 -0
  251. {urwid-2.5.3 → urwid-2.6.0.post0}/tests/__init__.py +0 -0
  252. {urwid-2.5.3 → urwid-2.6.0.post0}/tests/test_canvas.py +0 -0
  253. {urwid-2.5.3 → urwid-2.6.0.post0}/tests/test_columns.py +0 -0
  254. {urwid-2.5.3 → urwid-2.6.0.post0}/tests/test_container.py +0 -0
  255. {urwid-2.5.3 → urwid-2.6.0.post0}/tests/test_doctests.py +0 -0
  256. {urwid-2.5.3 → urwid-2.6.0.post0}/tests/test_escapes.py +0 -0
  257. {urwid-2.5.3 → urwid-2.6.0.post0}/tests/test_event_loops.py +0 -0
  258. {urwid-2.5.3 → urwid-2.6.0.post0}/tests/test_filler.py +0 -0
  259. {urwid-2.5.3 → urwid-2.6.0.post0}/tests/test_floatedit.py +0 -0
  260. {urwid-2.5.3 → urwid-2.6.0.post0}/tests/test_font.py +0 -0
  261. {urwid-2.5.3 → urwid-2.6.0.post0}/tests/test_graphics.py +0 -0
  262. {urwid-2.5.3 → urwid-2.6.0.post0}/tests/test_grid_flow.py +0 -0
  263. {urwid-2.5.3 → urwid-2.6.0.post0}/tests/test_line_box.py +0 -0
  264. {urwid-2.5.3 → urwid-2.6.0.post0}/tests/test_listbox.py +0 -0
  265. {urwid-2.5.3 → urwid-2.6.0.post0}/tests/test_moved_imports.py +0 -0
  266. {urwid-2.5.3 → urwid-2.6.0.post0}/tests/test_overlay.py +0 -0
  267. {urwid-2.5.3 → urwid-2.6.0.post0}/tests/test_padding.py +0 -0
  268. {urwid-2.5.3 → urwid-2.6.0.post0}/tests/test_pile.py +0 -0
  269. {urwid-2.5.3 → urwid-2.6.0.post0}/tests/test_raw_display.py +0 -0
  270. {urwid-2.5.3 → urwid-2.6.0.post0}/tests/test_scrollable.py +0 -0
  271. {urwid-2.5.3 → urwid-2.6.0.post0}/tests/test_signals.py +0 -0
  272. {urwid-2.5.3 → urwid-2.6.0.post0}/tests/test_str_util.py +0 -0
  273. {urwid-2.5.3 → urwid-2.6.0.post0}/tests/test_vterm.py +0 -0
  274. {urwid-2.5.3 → urwid-2.6.0.post0}/tests/test_widget.py +0 -0
  275. {urwid-2.5.3 → urwid-2.6.0.post0}/tests/util.py +0 -0
  276. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/command_map.py +0 -0
  277. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/container.py +0 -0
  278. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/decoration.py +0 -0
  279. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/display/__init__.py +0 -0
  280. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/display/_posix_raw_display.py +0 -0
  281. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/display/_web.css +0 -0
  282. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/display/_web.js +0 -0
  283. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/display/_win32.py +0 -0
  284. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/display/_win32_raw_display.py +0 -0
  285. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/display/common.py +0 -0
  286. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/display/lcd.py +0 -0
  287. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/display/raw.py +0 -0
  288. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/event_loop/__init__.py +0 -0
  289. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/event_loop/abstract_loop.py +0 -0
  290. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/event_loop/asyncio_loop.py +0 -0
  291. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/event_loop/glib_loop.py +0 -0
  292. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/event_loop/select_loop.py +0 -0
  293. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/event_loop/tornado_loop.py +0 -0
  294. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/event_loop/trio_loop.py +0 -0
  295. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/event_loop/twisted_loop.py +0 -0
  296. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/event_loop/zmq_loop.py +0 -0
  297. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/graphics.py +0 -0
  298. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/highlight.css +0 -0
  299. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/numedit.py +0 -0
  300. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/split_repr.py +0 -0
  301. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/vterm.py +0 -0
  302. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/widget/__init__.py +0 -0
  303. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/widget/bar_graph.py +0 -0
  304. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/widget/big_text.py +0 -0
  305. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/widget/columns.py +0 -0
  306. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/widget/constants.py +0 -0
  307. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/widget/container.py +0 -0
  308. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/widget/divider.py +0 -0
  309. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/widget/frame.py +0 -0
  310. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/widget/overlay.py +0 -0
  311. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/widget/pile.py +0 -0
  312. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/widget/popup.py +0 -0
  313. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/widget/scrollable.py +0 -0
  314. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/widget/solid_fill.py +0 -0
  315. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/widget/widget.py +0 -0
  316. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/widget/widget_decoration.py +0 -0
  317. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid/wimp.py +0 -0
  318. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid.egg-info/dependency_links.txt +0 -0
  319. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid.egg-info/not-zip-safe +0 -0
  320. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid.egg-info/requires.txt +0 -0
  321. {urwid-2.5.3 → urwid-2.6.0.post0}/urwid.egg-info/top_level.txt +0 -0
@@ -28,7 +28,7 @@ jobs:
28
28
  pip install --upgrade -r isort-requirements.txt
29
29
  - name: Check imports with isort
30
30
  run: |
31
- isort --check --diff urwid tests examples
31
+ isort --check --diff .
32
32
 
33
33
  Black:
34
34
  name: Validate black formatting
@@ -46,7 +46,7 @@ jobs:
46
46
  pip install --upgrade -r black-requirements.txt
47
47
  - name: Check code style with black
48
48
  run: |
49
- black --check urwid examples
49
+ black --check .
50
50
 
51
51
  Ruff:
52
52
  name: Check with Ruff
@@ -64,7 +64,7 @@ jobs:
64
64
  pip install --upgrade -r ruff-requirements.txt
65
65
  - name: Lint with ruff
66
66
  run: |
67
- ruff check --output-format github urwid examples
67
+ ruff check --output-format github .
68
68
 
69
69
  PyLint:
70
70
  name: Check with pylint
@@ -43,7 +43,7 @@ jobs:
43
43
  pip install --upgrade -r isort-requirements.txt
44
44
  - name: Check imports with isort
45
45
  run: |
46
- isort --check --diff urwid tests examples
46
+ isort --check --diff .
47
47
 
48
48
  Black:
49
49
  name: Validate black formatting
@@ -61,7 +61,7 @@ jobs:
61
61
  pip install --upgrade -r black-requirements.txt
62
62
  - name: Check code style with black
63
63
  run: |
64
- black --check urwid examples
64
+ black --check .
65
65
 
66
66
  Ruff:
67
67
  name: Check with Ruff
@@ -79,7 +79,7 @@ jobs:
79
79
  pip install --upgrade -r ruff-requirements.txt
80
80
  - name: Lint with ruff
81
81
  run: |
82
- ruff check --output-format github urwid examples
82
+ ruff check --output-format github .
83
83
 
84
84
  PyLint:
85
85
  name: Check with pylint
@@ -167,53 +167,8 @@ jobs:
167
167
  with:
168
168
  parallel-finished: true
169
169
 
170
- build_wheels:
171
- name: Build wheels on ${{ matrix.os }}
172
- needs: [ Test, Isort, Black, Ruff, PyLint ]
173
- # build only on push: heavy job
174
- if: github.event_name == 'push' && github.repository == 'urwid/urwid'
175
- runs-on: ${{ matrix.os }}
176
- strategy:
177
- fail-fast: false
178
- matrix:
179
- os:
180
- - ubuntu-latest
181
- - macos-latest
182
- - windows-latest
183
-
184
- steps:
185
- - uses: actions/checkout@v4
186
- with:
187
- fetch-depth: 0 # need for setuptools_scm
188
-
189
- # Used to host cibuildwheel
190
- - uses: actions/setup-python@v5
191
- with:
192
- python-version: "3.11"
193
-
194
- - name: Set up QEMU
195
- if: runner.os == 'Linux'
196
- uses: docker/setup-qemu-action@v3
197
- with:
198
- platforms: all
199
-
200
- - name: Build wheels
201
- uses: pypa/cibuildwheel@v2.16.5
202
- env:
203
- # configure cibuildwheel to build native archs ('auto'), and some
204
- # emulated ones
205
- CIBW_ARCHS_LINUX: auto aarch64
206
- CIBW_ARCHS_MACOS: x86_64 universal2 arm64
207
- CIBW_ARCHS_WINDOWS: auto
208
-
209
- - uses: actions/upload-artifact@v4
210
- with:
211
- path: ./wheelhouse/*.whl
212
- name: built-${{ matrix.os }}
213
- retention-days: 3
214
-
215
- build_sdist:
216
- name: Build source distribution
170
+ build:
171
+ name: Build distribution
217
172
  needs: [ Test, Isort, Black, Ruff, PyLint ]
218
173
  runs-on: ubuntu-latest
219
174
  steps:
@@ -228,8 +183,8 @@ jobs:
228
183
  - name: Install dependencies
229
184
  run: pip install -U build
230
185
 
231
- - name: Build sdist
232
- run: python -m build -s
186
+ - name: Build dist
187
+ run: python -m build
233
188
 
234
189
  - uses: actions/upload-artifact@v4
235
190
  with:
@@ -237,10 +192,16 @@ jobs:
237
192
  name: built-sdist
238
193
  retention-days: 3
239
194
 
195
+ - uses: actions/upload-artifact@v4
196
+ with:
197
+ path: dist/*.whl
198
+ name: built-bdist
199
+ retention-days: 3
200
+
240
201
  Metadata:
241
202
  name: Validate metadata
242
203
  runs-on: ubuntu-latest
243
- needs: [ build_sdist ]
204
+ needs: [ build ]
244
205
  steps:
245
206
  - uses: actions/checkout@v4
246
207
  - name: Set up Python
@@ -265,7 +226,7 @@ jobs:
265
226
  twine check dist/*
266
227
 
267
228
  upload_pypi:
268
- needs: [ build_wheels, build_sdist, Metadata ]
229
+ needs: [ build, Metadata ]
269
230
  # upload to PyPI on every tag
270
231
  if: github.event_name == 'push' && github.ref_type == 'tag' && github.repository == 'urwid/urwid'
271
232
  # alternatively, to publish when a GitHub Release is created, use the following rule:
@@ -284,4 +245,4 @@ jobs:
284
245
  path: dist
285
246
 
286
247
  - name: Publish package distributions to PyPI
287
- uses: pypa/gh-action-pypi-publish@release/v1
248
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,45 @@
1
+ repos:
2
+ - repo: https://github.com/pre-commit/pre-commit-hooks
3
+ rev: v4.5.0
4
+ hooks:
5
+ - id: check-yaml
6
+ - id: end-of-file-fixer
7
+ - id: trailing-whitespace
8
+ - id: mixed-line-ending
9
+
10
+ - repo: https://github.com/pycqa/isort
11
+ rev: 5.13.2
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: 24.2.0
24
+ hooks:
25
+ - id: black
26
+
27
+ - repo: https://github.com/astral-sh/ruff-pre-commit
28
+ # Ruff version.
29
+ rev: v0.2.1
30
+ hooks:
31
+ - id: ruff
32
+ args: [ --fix, --exit-non-zero-on-fix ]
33
+
34
+ - repo: https://github.com/adrienverge/yamllint.git
35
+ rev: v1.35.0
36
+ hooks:
37
+ - id: yamllint
38
+
39
+ - repo: https://github.com/pre-commit/pygrep-hooks
40
+ rev: v1.10.0 # Use the ref you want to point at
41
+ hooks:
42
+ - id: python-check-blanket-noqa
43
+ - id: python-check-blanket-type-ignore
44
+ - id: rst-directive-colons
45
+ - id: rst-inline-touching-normal
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: urwid
3
- Version: 2.5.3
3
+ Version: 2.6.0.post0
4
4
  Summary: A full-featured console (xterm et al.) user interface library
5
5
  Home-page: https://urwid.org/
6
6
  Author-email: Ian Ward <ian@excess.org>
@@ -32,7 +32,7 @@ Classifier: Programming Language :: Python :: 3.12
32
32
  Classifier: Programming Language :: Python :: 3 :: Only
33
33
  Classifier: Programming Language :: Python :: Implementation :: CPython
34
34
  Classifier: Programming Language :: Python :: Implementation :: PyPy
35
- Requires-Python: >=3.7.0
35
+ Requires-Python: >3.7
36
36
  Description-Content-Type: text/x-rst
37
37
  License-File: COPYING
38
38
  Requires-Dist: typing-extensions
@@ -57,7 +57,7 @@ Requires-Dist: pyserial; extra == "lcd"
57
57
 
58
58
  Urwid
59
59
  =====
60
- |pypi| |docs| |gitter| |ci| |coveralls|
60
+ |pypi| |docs| |gitter| |ci| |pre-commit| |coveralls|
61
61
 
62
62
  About
63
63
  =====
@@ -87,7 +87,7 @@ Installation
87
87
  To install using pip
88
88
 
89
89
  .. code:: bash
90
-
90
+
91
91
  pip install urwid
92
92
 
93
93
  For advanced functionality extra requirements need to be installed.
@@ -323,6 +323,10 @@ Contributors
323
323
  :target: https://github.com/urwid/urwid/actions
324
324
  :alt: CI status
325
325
 
326
+ .. |pre-commit| image:: https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit
327
+ :target: https://github.com/pre-commit/pre-commit
328
+ :alt: pre-commit
329
+
326
330
  .. |coveralls| image:: https://coveralls.io/repos/github/urwid/urwid/badge.svg
327
331
  :alt: test coverage
328
332
  :target: https://coveralls.io/github/urwid/urwid
@@ -1,6 +1,6 @@
1
1
  Urwid
2
2
  =====
3
- |pypi| |docs| |gitter| |ci| |coveralls|
3
+ |pypi| |docs| |gitter| |ci| |pre-commit| |coveralls|
4
4
 
5
5
  About
6
6
  =====
@@ -30,7 +30,7 @@ Installation
30
30
  To install using pip
31
31
 
32
32
  .. code:: bash
33
-
33
+
34
34
  pip install urwid
35
35
 
36
36
  For advanced functionality extra requirements need to be installed.
@@ -266,6 +266,10 @@ Contributors
266
266
  :target: https://github.com/urwid/urwid/actions
267
267
  :alt: CI status
268
268
 
269
+ .. |pre-commit| image:: https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit
270
+ :target: https://github.com/pre-commit/pre-commit
271
+ :alt: pre-commit
272
+
269
273
  .. |coveralls| image:: https://coveralls.io/repos/github/urwid/urwid/badge.svg
270
274
  :alt: test coverage
271
275
  :target: https://coveralls.io/github/urwid/urwid
@@ -12,6 +12,7 @@
12
12
 
13
13
  from __future__ import annotations
14
14
 
15
+ import ast
15
16
  import os
16
17
 
17
18
  # If extensions (or modules to document with autodoc) are in another directory,
@@ -51,7 +52,7 @@ master_doc = "index"
51
52
 
52
53
  # General information about the project.
53
54
  project = "Urwid"
54
- copyright = "2014, Ian Ward et al"
55
+ copyright = "2014, Ian Ward et al" # noqa: A001 # sphinx magic
55
56
 
56
57
  # The version info for the project you're documenting, acts as replacement for
57
58
  # |version| and |release|, also used in various other places throughout the
@@ -61,13 +62,29 @@ VERSION_MODULE = os.path.abspath(os.path.join(FILE_PATH, "../urwid/version.py"))
61
62
  VERSION_VARS = {}
62
63
 
63
64
 
64
- def execfile(module, global_vars):
65
- with open(module) as f:
66
- code = compile(f.read(), "somefile.py", "exec")
67
- exec(code, global_vars)
65
+ with open(VERSION_MODULE, encoding="utf-8") as f:
66
+ parsed = ast.parse(f.read())
67
+ for node in parsed.body:
68
+ if not isinstance(node, (ast.Assign, ast.AnnAssign)):
69
+ # Not variable define
70
+ continue
68
71
 
72
+ if node.value is None:
73
+ # Not a proper assign
74
+ continue
75
+
76
+ try:
77
+ value = ast.literal_eval(node.value)
78
+ except ValueError:
79
+ continue
80
+
81
+ if isinstance(node, ast.Assign):
82
+ VERSION_VARS.update(
83
+ {tgt.id: value for tgt in node.targets if isinstance(tgt, ast.Name) and isinstance(tgt.ctx, ast.Store)}
84
+ )
85
+ else:
86
+ VERSION_VARS[node.target.id] = value
69
87
 
70
- execfile(VERSION_MODULE, VERSION_VARS)
71
88
  # The short X.Y version.
72
89
  version = ".".join(str(x) for x in VERSION_VARS["__version_tuple__"][:2])
73
90
  # The full version, including alpha/beta/rc tags.
@@ -6,5 +6,5 @@ import os
6
6
 
7
7
  import real_browse
8
8
 
9
- os.chdir('/usr/share/doc/python')
9
+ os.chdir("/usr/share/doc/python")
10
10
  real_browse.main()
@@ -4,9 +4,11 @@ import time
4
4
 
5
5
  time.sleep(1)
6
6
 
7
- print("""factor: 1
7
+ print(
8
+ """factor: 1
8
9
  factor: 1000003
9
10
  factor: 2000029
10
11
  factor: 3000073
11
12
  factor: 4000159
12
- factor: 5000101""")
13
+ factor: 5000101"""
14
+ )
@@ -0,0 +1,84 @@
1
+ #!/usr/bin/env python
2
+
3
+ from __future__ import annotations
4
+
5
+ import sys
6
+
7
+ import urwid
8
+
9
+ RED_FGS = (
10
+ "black",
11
+ "light gray",
12
+ "white",
13
+ "light cyan",
14
+ "light red",
15
+ "light green",
16
+ "yellow",
17
+ "light magenta",
18
+ )
19
+ GREEN_FGS = (
20
+ "black",
21
+ "light gray",
22
+ "dark blue",
23
+ "white",
24
+ "light cyan",
25
+ "light red",
26
+ "light green",
27
+ "yellow",
28
+ )
29
+ BROWN_FGS = (
30
+ "black",
31
+ "dark blue",
32
+ "dark gray",
33
+ "white",
34
+ "light blue",
35
+ "light cyan",
36
+ "light red",
37
+ "light green",
38
+ "yellow",
39
+ )
40
+ MAGENTA_FGS = (
41
+ "black",
42
+ "light gray",
43
+ "dark blue",
44
+ "white",
45
+ "light cyan",
46
+ "light red",
47
+ "light green",
48
+ "yellow",
49
+ "light magenta",
50
+ )
51
+
52
+ BG_FGS = [
53
+ ("dark red", RED_FGS),
54
+ ("dark green", GREEN_FGS),
55
+ ("brown", BROWN_FGS),
56
+ ("dark magenta", MAGENTA_FGS),
57
+ ]
58
+
59
+ body = urwid.SimpleFocusListWalker([])
60
+
61
+ for bg, fgs in BG_FGS:
62
+ spec = urwid.AttrSpec(fgs[0], bg)
63
+
64
+ body.extend(
65
+ (
66
+ urwid.AttrMap(urwid.Divider(), spec),
67
+ urwid.AttrMap(
68
+ urwid.GridFlow(
69
+ (urwid.AttrMap(urwid.Text(f"'{fg}' on '{bg}'"), urwid.AttrSpec(fg, bg)) for fg in fgs),
70
+ 35,
71
+ 0,
72
+ 0,
73
+ urwid.LEFT,
74
+ ),
75
+ spec,
76
+ ),
77
+ urwid.AttrMap(urwid.Divider(), spec),
78
+ )
79
+ )
80
+
81
+ try:
82
+ urwid.MainLoop(urwid.ListBox(body)).run()
83
+ except KeyboardInterrupt:
84
+ sys.exit(0)
@@ -0,0 +1,87 @@
1
+ #!/usr/bin/env python
2
+
3
+ from __future__ import annotations
4
+
5
+ import sys
6
+
7
+ import urwid
8
+
9
+ BLACK_FGS = (
10
+ "light gray",
11
+ "dark cyan",
12
+ "dark red",
13
+ "dark green",
14
+ "dark magenta",
15
+ "white",
16
+ "light blue",
17
+ "light cyan",
18
+ "light red",
19
+ "light green",
20
+ "yellow",
21
+ "light magenta",
22
+ )
23
+ GRAY_FGS = (
24
+ "black",
25
+ "dark blue",
26
+ "dark cyan",
27
+ "dark red",
28
+ "dark green",
29
+ "dark magenta",
30
+ "white",
31
+ "light red",
32
+ "yellow",
33
+ "light magenta",
34
+ )
35
+ BLUE_FGS = (
36
+ "light gray",
37
+ "dark cyan",
38
+ "white",
39
+ "light cyan",
40
+ "light red",
41
+ "light green",
42
+ "yellow",
43
+ "light magenta",
44
+ )
45
+ CYAN_FGS = (
46
+ "black",
47
+ "light gray",
48
+ "dark blue",
49
+ "white",
50
+ "light cyan",
51
+ "light green",
52
+ "yellow",
53
+ )
54
+
55
+ BG_FGS = [
56
+ ("black", BLACK_FGS),
57
+ ("light gray", GRAY_FGS),
58
+ ("dark blue", BLUE_FGS),
59
+ ("dark cyan", CYAN_FGS),
60
+ ]
61
+
62
+ body = urwid.SimpleFocusListWalker([])
63
+
64
+ for bg, fgs in BG_FGS:
65
+ spec = urwid.AttrSpec(fgs[0], bg)
66
+
67
+ body.extend(
68
+ (
69
+ urwid.AttrMap(urwid.Divider(), spec),
70
+ urwid.AttrMap(
71
+ urwid.GridFlow(
72
+ (urwid.AttrMap(urwid.Text(f"'{fg}' on '{bg}'"), urwid.AttrSpec(fg, bg)) for fg in fgs),
73
+ 35,
74
+ 0,
75
+ 0,
76
+ urwid.LEFT,
77
+ ),
78
+ spec,
79
+ ),
80
+ urwid.AttrMap(urwid.Divider(), spec),
81
+ )
82
+ )
83
+
84
+ try:
85
+ urwid.MainLoop(urwid.ListBox(body)).run()
86
+ except KeyboardInterrupt:
87
+ sys.exit(0)
@@ -0,0 +1,24 @@
1
+ from __future__ import annotations
2
+
3
+ import urwid
4
+
5
+
6
+ class Pudding(urwid.Widget):
7
+ _sizing = frozenset((urwid.FLOW,))
8
+
9
+ def rows(self, size: tuple[int], focus: bool = False) -> int:
10
+ return 1
11
+
12
+ def render(self, size: tuple[int], focus: bool = False) -> urwid.TextCanvas:
13
+ (maxcol,) = size
14
+ num_pudding = maxcol // len("Pudding")
15
+ return urwid.TextCanvas([b"Pudding" * num_pudding], maxcol=maxcol)
16
+
17
+
18
+ class BoxPudding(urwid.Widget):
19
+ _sizing = frozenset((urwid.BOX,))
20
+
21
+ def render(self, size: tuple[int, int], focus: bool = False) -> urwid.TextCanvas:
22
+ (maxcol, maxrow) = size
23
+ num_pudding = maxcol // len("Pudding")
24
+ return urwid.TextCanvas([b"Pudding" * num_pudding] * maxrow, maxcol=maxcol)
@@ -0,0 +1,19 @@
1
+ from __future__ import annotations
2
+
3
+ import urwid
4
+
5
+
6
+ class MultiPudding(urwid.Widget):
7
+ _sizing = frozenset((urwid.FLOW, urwid.BOX))
8
+
9
+ def rows(self, size: tuple[int], focus: bool = False) -> int:
10
+ return 1
11
+
12
+ def render(self, size: tuple[int], focus: bool = False) -> urwid.TextCanvas:
13
+ if len(size) == 1:
14
+ (maxcol,) = size
15
+ maxrow = 1
16
+ else:
17
+ (maxcol, maxrow) = size
18
+ num_pudding = maxcol // len("Pudding")
19
+ return urwid.TextCanvas([b"Pudding" * num_pudding] * maxrow, maxcol=maxcol)
@@ -11,23 +11,23 @@ class CursorPudding(urwid.Widget):
11
11
  super().__init__()
12
12
  self.cursor_col = 0
13
13
 
14
- def rows(self, size, focus=False):
14
+ def rows(self, size: tuple[int], focus: bool = False) -> int:
15
15
  return 1
16
16
 
17
- def render(self, size, focus=False):
17
+ def render(self, size: tuple[int], focus: bool = False) -> urwid.TextCanvas:
18
18
  (maxcol,) = size
19
- num_pudding = maxcol / len("Pudding")
19
+ num_pudding = maxcol // len("Pudding")
20
20
  cursor = None
21
21
  if focus:
22
22
  cursor = self.get_cursor_coords(size)
23
- return urwid.TextCanvas(["Pudding" * num_pudding], [], cursor, maxcol)
23
+ return urwid.TextCanvas([b"Pudding" * num_pudding], [], cursor=cursor, maxcol=maxcol)
24
24
 
25
- def get_cursor_coords(self, size):
25
+ def get_cursor_coords(self, size: tuple[int]) -> tuple[int, int]:
26
26
  (maxcol,) = size
27
27
  col = min(self.cursor_col, maxcol - 1)
28
28
  return col, 0
29
29
 
30
- def keypress(self, size, key):
30
+ def keypress(self, size: tuple[int], key: str) -> str | None:
31
31
  (maxcol,) = size
32
32
  if key == "left":
33
33
  col = self.cursor_col - 1
@@ -37,3 +37,4 @@ class CursorPudding(urwid.Widget):
37
37
  return key
38
38
  self.cursor_x = max(0, min(maxcol - 1, col))
39
39
  self._invalidate()
40
+ return None
@@ -0,0 +1,13 @@
1
+ from __future__ import annotations
2
+
3
+ import urwid
4
+
5
+
6
+ class Widget(urwid.ListBox):
7
+ def get_pref_col(self, size: tuple[int, int]) -> int:
8
+ return self.cursor_x
9
+
10
+ def move_cursor_to_coords(self, size: tuple[int, int], col: int, row: int) -> bool:
11
+ assert row == 0 # noqa: S101 # in examples we can use `assert`
12
+ self.cursor_x = col
13
+ return True
@@ -3,16 +3,14 @@ from __future__ import annotations
3
3
  import urwid
4
4
 
5
5
 
6
- class QuestionnaireItem(urwid.WidgetWrap):
7
- def __init__(self):
8
- self.options = []
6
+ class QuestionnaireItem(urwid.WidgetWrap[urwid.GridFlow]):
7
+ def __init__(self) -> None:
8
+ self.options: list[urwid.RadioButton] = []
9
9
  unsure = urwid.RadioButton(self.options, "Unsure")
10
10
  yes = urwid.RadioButton(self.options, "Yes")
11
11
  no = urwid.RadioButton(self.options, "No")
12
12
  display_widget = urwid.GridFlow([unsure, yes, no], 15, 3, 1, "left")
13
- urwid.WidgetWrap.__init__(self, display_widget)
13
+ super().__init__(display_widget)
14
14
 
15
- def get_state(self):
16
- for o in self.options:
17
- if o.get_state() is True:
18
- return o.get_label()
15
+ def get_state(self) -> str:
16
+ return next(o.label for o in self.options if o.state is True)
@@ -4,28 +4,28 @@ import urwid
4
4
 
5
5
 
6
6
  class SelectablePudding(urwid.Widget):
7
- _sizing = frozenset(["flow"])
7
+ _sizing = frozenset((urwid.FLOW,))
8
8
  _selectable = True
9
9
 
10
- def __init__(self):
10
+ def __init__(self) -> None:
11
11
  super().__init__()
12
12
  self.pudding = "pudding"
13
13
 
14
- def rows(self, size, focus=False):
14
+ def rows(self, size: tuple[int], focus: bool = False) -> int:
15
15
  return 1
16
16
 
17
- def render(self, size, focus=False):
17
+ def render(self, size: tuple[int], focus: bool = False) -> urwid.TextCanvas:
18
18
  (maxcol,) = size
19
- num_pudding = maxcol / len(self.pudding)
19
+ num_pudding = maxcol // len(self.pudding)
20
20
  pudding = self.pudding
21
21
  if focus:
22
22
  pudding = pudding.upper()
23
- return urwid.TextCanvas([pudding * num_pudding], maxcol=maxcol)
23
+ return urwid.TextCanvas([pudding.encode("utf-8") * num_pudding], maxcol=maxcol)
24
24
 
25
- def keypress(self, size, key):
26
- (maxcol,) = size
25
+ def keypress(self, size: tuple[int], key: str) -> str | None:
27
26
  if len(key) > 1:
28
27
  return key
28
+
29
29
  if key.lower() in self.pudding:
30
30
  # remove letter from pudding
31
31
  n = self.pudding.index(key.lower())
@@ -33,5 +33,6 @@ class SelectablePudding(urwid.Widget):
33
33
  if not self.pudding:
34
34
  self.pudding = "pudding"
35
35
  self._invalidate()
36
- else:
37
- return key
36
+ return None
37
+
38
+ return key