urwid 3.0.1__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.
- urwid-3.0.3/.devcontainer/dev.dockerfile +15 -0
- {urwid-3.0.1 → urwid-3.0.3}/.devcontainer/devcontainer.json +6 -1
- {urwid-3.0.1 → urwid-3.0.3}/.github/workflows/documentation.yml +2 -2
- {urwid-3.0.1 → urwid-3.0.3}/.github/workflows/isolated_static_check.yml +8 -8
- {urwid-3.0.1 → urwid-3.0.3}/.github/workflows/labels.yml +1 -1
- {urwid-3.0.1 → urwid-3.0.3}/.github/workflows/pythonpackage.yml +16 -16
- {urwid-3.0.1 → urwid-3.0.3}/.github/workflows/yamllint.yml +2 -2
- {urwid-3.0.1 → urwid-3.0.3}/.pre-commit-config.yaml +1 -1
- {urwid-3.0.1 → urwid-3.0.3}/PKG-INFO +3 -1
- {urwid-3.0.1 → urwid-3.0.3}/README.rst +2 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/changelog.rst +33 -0
- {urwid-3.0.1 → urwid-3.0.3/docs}/examples/palette_test.py +1 -1
- {urwid-3.0.1 → urwid-3.0.3}/docs/examples/real_edit.py +1 -1
- {urwid-3.0.1 → urwid-3.0.3}/docs/manual/wanat_multi.py +1 -1
- {urwid-3.0.1 → urwid-3.0.3}/examples/asyncio_socket_server.py +7 -7
- {urwid-3.0.1 → urwid-3.0.3}/examples/edit.py +1 -1
- {urwid-3.0.1 → urwid-3.0.3}/examples/lcd_cf635.py +1 -1
- {urwid-3.0.1/docs → urwid-3.0.3}/examples/palette_test.py +1 -1
- {urwid-3.0.1 → urwid-3.0.3}/examples/twisted_serve_ssh.py +1 -1
- urwid-3.0.3/pylint-requirements.txt +1 -0
- urwid-3.0.3/ruff-requirements.txt +1 -0
- {urwid-3.0.1 → urwid-3.0.3}/tests/test_scrollable.py +18 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/canvas.py +6 -6
- {urwid-3.0.1 → urwid-3.0.3}/urwid/display/_posix_raw_display.py +4 -4
- {urwid-3.0.1 → urwid-3.0.3}/urwid/display/_raw_display_base.py +11 -9
- {urwid-3.0.1 → urwid-3.0.3}/urwid/display/common.py +2 -2
- {urwid-3.0.1 → urwid-3.0.3}/urwid/display/curses.py +1 -1
- {urwid-3.0.1 → urwid-3.0.3}/urwid/display/escape.py +15 -3
- {urwid-3.0.1 → urwid-3.0.3}/urwid/display/lcd.py +4 -4
- {urwid-3.0.1 → urwid-3.0.3}/urwid/display/web.py +3 -3
- {urwid-3.0.1 → urwid-3.0.3}/urwid/version.py +16 -3
- {urwid-3.0.1 → urwid-3.0.3}/urwid/widget/listbox.py +3 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/widget/scrollable.py +1 -1
- {urwid-3.0.1 → urwid-3.0.3}/urwid.egg-info/PKG-INFO +3 -1
- urwid-3.0.1/.devcontainer/dev.dockerfile +0 -8
- urwid-3.0.1/pylint-requirements.txt +0 -1
- urwid-3.0.1/ruff-requirements.txt +0 -1
- {urwid-3.0.1 → urwid-3.0.3}/.coveralls.yml +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/.dockerignore +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/.editorconfig +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/.github/CODE_OF_CONDUCT.md +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/.github/ISSUE_TEMPLATE/docs.md +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/.github/ISSUE_TEMPLATE/question.md +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/.github/dependabot.yml +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/.github/labeler.yml +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/.github/release.yml +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/.gitignore +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/.yamllint.yml +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/COPYING +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/MANIFEST.in +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/black-requirements.txt +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/classifiers.txt +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/Makefile +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/conf.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/examples/bigtext.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/examples/bigtext.py.xdotool +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/examples/bigtext1.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/examples/bigtext2.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/examples/bigtext3.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/examples/browse.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/examples/browse.py.xdotool +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/examples/browse1.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/examples/browse2.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/examples/edit.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/examples/edit.py.xdotool +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/examples/edit1.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/examples/edit2.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/examples/edit_text.txt +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/examples/graph.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/examples/graph.py.xdotool +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/examples/graph1.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/examples/graph2.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/examples/index.rst +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/examples/palette_test.py.xdotool +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/examples/palette_test1.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/examples/palette_test2.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/examples/pop_up.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/examples/pop_up.py.xdotool +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/examples/pop_up1.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/examples/pop_up2.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/examples/real_browse.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/examples/subproc.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/examples/subproc.py.xdotool +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/examples/subproc1.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/examples/subproc2.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/examples/subproc2.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/examples/tour.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/examples/tour.py.xdotool +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/examples/tour1.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/examples/tour2.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/index.rst +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/manual/bright_combinations.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/manual/bright_combinations.py.xdotool +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/manual/bright_combinations1.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/manual/canvascache.rst +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/manual/displayattributes.rst +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/manual/displaymodules.rst +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/manual/encodings.rst +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/manual/images/display_modules.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/manual/images/introduction.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/manual/images/urwid_widgets.svgz +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/manual/images/urwid_widgets_1.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/manual/images/urwid_widgets_1.xcf +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/manual/images/urwid_widgets_2.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/manual/images/urwid_widgets_2.xcf +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/manual/images/widget_layout.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/manual/index.rst +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/manual/mainloop.rst +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/manual/overview.rst +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/manual/safe_combinations.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/manual/safe_combinations.py.xdotool +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/manual/safe_combinations1.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/manual/textlayout.rst +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/manual/userinput.rst +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/manual/wanat.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/manual/wcur1.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/manual/wcur2.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/manual/widgets.rst +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/manual/wmod.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/manual/wsel.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/reference/attrspec.rst +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/reference/canvas.rst +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/reference/command_map.rst +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/reference/constants.rst +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/reference/deprecated.rst +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/reference/display_modules.rst +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/reference/exceptions.rst +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/reference/global_settings.rst +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/reference/index.rst +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/reference/list_walkers.rst +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/reference/main_loop.rst +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/reference/meta.rst +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/reference/signals.rst +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/reference/text_layout.rst +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/reference/widget.rst +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tools/compile_pngs.sh +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tools/screenshots.sh +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tools/static/.placeholder +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tools/templates/indexcontent.html +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tools/templates/indexsidebar.html +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tools/templates/localtoc.html +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/adventure.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/adventure.py.xdotool +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/adventure1.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/adventure2.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/adventure3.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/adventure4.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/cmenu.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/cmenu.py.xdotool +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/cmenu1.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/cmenu2.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/cmenu3.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/cmenu4.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/highcolors.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/highcolors.py.xdotool +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/highcolors1.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/hmenu.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/hmenu.py.xdotool +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/hmenu1.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/hmenu2.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/hmenu3.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/hmenu4.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/index.rst +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/input.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/input.py.xdotool +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/input1.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/input2.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/input3.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/input4.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/input5.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/menu25.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/minimal.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/minimal.py.xdotool +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/minimal1.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/multiple.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/multiple.py.xdotool +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/multiple1.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/multiple2.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/multiple3.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/multiple4.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/qa.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/qa.py.xdotool +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/qa1.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/qa2.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/qa3.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/sig.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/sig.py.xdotool +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/sig1.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/sig2.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/sig3.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/sig4.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/smenu.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/smenu.py.xdotool +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/smenu1.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/smenu2.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/smenu3.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/urwid_attr.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/urwid_attr.py.xdotool +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/urwid_attr1.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/urwid_attr2.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/urwid_attr3.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/tutorial/urwid_attr4.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/docs/urwid-logo.png +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/examples/bigtext.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/examples/browse.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/examples/calc.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/examples/dialog.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/examples/fib.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/examples/graph.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/examples/input_test.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/examples/pop_up.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/examples/subproc.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/examples/subproc2.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/examples/terminal.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/examples/tour.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/examples/treesample.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/examples/twisted_serve_ssh.tac +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/isort-requirements.txt +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/pyproject.toml +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/requirements.txt +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/setup.cfg +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/test_requirements.txt +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/tests/__init__.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/tests/test_canvas.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/tests/test_columns.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/tests/test_container.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/tests/test_doctests.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/tests/test_escapes.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/tests/test_event_loops.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/tests/test_filler.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/tests/test_floatedit.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/tests/test_font.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/tests/test_frame.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/tests/test_graphics.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/tests/test_grid_flow.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/tests/test_line_box.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/tests/test_listbox.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/tests/test_main_loop.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/tests/test_moved_imports.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/tests/test_overlay.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/tests/test_padding.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/tests/test_pile.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/tests/test_raw_display.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/tests/test_signals.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/tests/test_str_util.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/tests/test_text_layout.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/tests/test_tree.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/tests/test_util.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/tests/test_vterm.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/tests/test_widget.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/tests/util.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/tox.ini +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/__init__.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/command_map.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/container.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/decoration.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/display/__init__.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/display/_web.css +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/display/_web.js +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/display/_win32.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/display/_win32_raw_display.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/display/html_fragment.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/display/raw.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/event_loop/__init__.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/event_loop/abstract_loop.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/event_loop/asyncio_loop.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/event_loop/glib_loop.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/event_loop/main_loop.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/event_loop/select_loop.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/event_loop/tornado_loop.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/event_loop/trio_loop.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/event_loop/twisted_loop.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/event_loop/zmq_loop.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/font.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/graphics.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/numedit.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/signals.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/split_repr.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/str_util.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/text_layout.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/util.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/vterm.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/widget/__init__.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/widget/attr_map.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/widget/attr_wrap.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/widget/bar_graph.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/widget/big_text.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/widget/box_adapter.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/widget/columns.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/widget/constants.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/widget/container.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/widget/divider.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/widget/edit.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/widget/filler.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/widget/frame.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/widget/grid_flow.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/widget/line_box.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/widget/monitored_list.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/widget/overlay.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/widget/padding.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/widget/pile.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/widget/popup.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/widget/progress_bar.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/widget/solid_fill.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/widget/text.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/widget/treetools.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/widget/widget.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/widget/widget_decoration.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/widget/wimp.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid/wimp.py +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid.egg-info/SOURCES.txt +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid.egg-info/dependency_links.txt +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid.egg-info/not-zip-safe +0 -0
- {urwid-3.0.1 → urwid-3.0.3}/urwid.egg-info/requires.txt +0 -0
- {urwid-3.0.1 → 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@
|
|
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@
|
|
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@
|
|
19
|
+
- uses: actions/checkout@v5
|
|
20
20
|
- name: Set up Python
|
|
21
|
-
uses: actions/setup-python@
|
|
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@
|
|
37
|
+
- uses: actions/checkout@v5
|
|
38
38
|
- name: Set up Python
|
|
39
|
-
uses: actions/setup-python@
|
|
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@
|
|
55
|
+
- uses: actions/checkout@v5
|
|
56
56
|
- name: Set up Python
|
|
57
|
-
uses: actions/setup-python@
|
|
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@
|
|
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@
|
|
80
|
+
uses: actions/setup-python@v6
|
|
81
81
|
with:
|
|
82
82
|
python-version: '3.x'
|
|
83
83
|
cache: 'pip'
|
|
@@ -30,9 +30,9 @@ jobs:
|
|
|
30
30
|
name: Validate import sorting
|
|
31
31
|
runs-on: ubuntu-latest
|
|
32
32
|
steps:
|
|
33
|
-
- uses: actions/checkout@
|
|
33
|
+
- uses: actions/checkout@v5
|
|
34
34
|
- name: Set up Python
|
|
35
|
-
uses: actions/setup-python@
|
|
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@
|
|
51
|
+
- uses: actions/checkout@v5
|
|
52
52
|
- name: Set up Python
|
|
53
|
-
uses: actions/setup-python@
|
|
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@
|
|
69
|
+
- uses: actions/checkout@v5
|
|
70
70
|
- name: Set up Python
|
|
71
|
-
uses: actions/setup-python@
|
|
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@
|
|
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@
|
|
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@
|
|
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@
|
|
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@
|
|
176
|
+
- uses: actions/checkout@v5
|
|
177
177
|
with:
|
|
178
178
|
fetch-depth: 0 # need for setuptools_scm
|
|
179
179
|
|
|
180
|
-
- uses: actions/setup-python@
|
|
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@
|
|
207
|
+
- uses: actions/checkout@v5
|
|
208
208
|
- name: Set up Python
|
|
209
|
-
uses: actions/setup-python@
|
|
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@
|
|
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@
|
|
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@
|
|
13
|
+
- uses: actions/checkout@v5
|
|
14
14
|
- name: Set up Python
|
|
15
|
-
uses: actions/setup-python@
|
|
15
|
+
uses: actions/setup-python@v6
|
|
16
16
|
with:
|
|
17
17
|
python-version: '3.x'
|
|
18
18
|
cache: 'pip'
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: urwid
|
|
3
|
-
Version: 3.0.
|
|
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,39 @@
|
|
|
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
|
+
|
|
29
|
+
Urwid 3.0.2
|
|
30
|
+
===========
|
|
31
|
+
|
|
32
|
+
2025-05-07
|
|
33
|
+
|
|
34
|
+
Bug fixes 🕷
|
|
35
|
+
++++++++++++
|
|
36
|
+
* Bugfix: Corner case: Scrollbar render for only 1 row height by @penguinolog in https://github.com/urwid/urwid/pull/1021
|
|
37
|
+
|
|
5
38
|
Urwid 3.0.1
|
|
6
39
|
===========
|
|
7
40
|
|
|
@@ -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
|
|
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
|
|
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
|
|
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.
|
|
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
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
pylint==3.3.8
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
ruff==0.13.0
|
|
@@ -306,6 +306,24 @@ class TestScrollBarListBox(unittest.TestCase):
|
|
|
306
306
|
widget.render(reduced_size).decoded_text,
|
|
307
307
|
)
|
|
308
308
|
|
|
309
|
+
def test_minimal_height(self):
|
|
310
|
+
"""If we have only 1 line render height and thumb position in the middle - do not render top."""
|
|
311
|
+
widget = urwid.ScrollBar(
|
|
312
|
+
urwid.ListBox(
|
|
313
|
+
(
|
|
314
|
+
urwid.CheckBox("A"),
|
|
315
|
+
urwid.CheckBox("B"),
|
|
316
|
+
urwid.CheckBox("C"),
|
|
317
|
+
)
|
|
318
|
+
)
|
|
319
|
+
)
|
|
320
|
+
reduced_size = (7, 1)
|
|
321
|
+
self.assertEqual(("[ ] A █",), widget.render(reduced_size).decoded_text)
|
|
322
|
+
widget.keypress(reduced_size, "down")
|
|
323
|
+
self.assertEqual(("[ ] B █",), widget.render(reduced_size).decoded_text)
|
|
324
|
+
widget.keypress(reduced_size, "down")
|
|
325
|
+
self.assertEqual(("[ ] C █",), widget.render(reduced_size).decoded_text)
|
|
326
|
+
|
|
309
327
|
|
|
310
328
|
def trivial_AttrMap(widget):
|
|
311
329
|
return urwid.AttrMap(widget, {})
|
|
@@ -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( #
|
|
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" " *
|
|
407
|
-
y, x = struct.unpack("
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|