Skip to content

Commit

Permalink
Fix Regressions:
Browse files Browse the repository at this point in the history
* Broken children of `DelegateToWidgetMixin`
* broken moved imports: private fields were used
  • Loading branch information
penguinolog committed Jan 3, 2024
1 parent e085a21 commit a7dbb64
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 14 deletions.
19 changes: 19 additions & 0 deletions tests/test_moved_imports.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
from __future__ import annotations

import unittest


class TestMovedImports(unittest.TestCase):
def test_moved_imports_direct(self) -> None:
with self.assertWarns(DeprecationWarning):
from urwid import web_display

from urwid.display import web

self.assertIs(web, web_display)

def test_moved_imports_nested(self) -> None:
from urwid.display import html_fragment
from urwid.html_fragment import HtmlGenerator

self.assertIs(html_fragment.HtmlGenerator, HtmlGenerator)
12 changes: 6 additions & 6 deletions urwid/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -273,16 +273,16 @@ class _MovedModule(types.ModuleType):
like "from xxx.yyy import zzz"
"""

__slots__ = ("__moved_from", "__moved_to")
__slots__ = ("_moved_from", "_moved_to")

def __init__(self, moved_from: str, moved_to: str) -> None:
super().__init__(moved_from.join(".")[-1])
self.__moved_from = moved_from
self.__moved_to = moved_to
self._moved_from = moved_from
self._moved_to = moved_to

def __getattr__(self, name: str) -> typing.Any:
real_module = importlib.import_module(self.__moved_to)
sys.modules[self.__moved_from] = real_module
real_module = importlib.import_module(self._moved_to)
sys.modules[self._moved_from] = real_module
return getattr(real_module, name)


Expand All @@ -296,7 +296,7 @@ class _MovedModuleWarn(_MovedModule):

def __getattr__(self, name: str) -> typing.Any:
warnings.warn(
f"{self.__moved_from} is moved to {self.__moved_to}",
f"{self._moved_from} is moved to {self._moved_to}",
DeprecationWarning,
stacklevel=2,
)
Expand Down
20 changes: 12 additions & 8 deletions urwid/widget/widget.py
Original file line number Diff line number Diff line change
Expand Up @@ -780,8 +780,9 @@ def render(self, size, focus: bool = False) -> CompositeCanvas:
canv = get_delegate(self).render(size, focus=focus)
return CompositeCanvas(canv)

def selectable(self) -> bool:
return get_delegate(self).selectable()
@property
def selectable(self) -> Callable[[], bool]:
return get_delegate(self).selectable

@property
def get_cursor_coords(self) -> Callable[[tuple[()] | tuple[int] | tuple[int, int]], tuple[int, int] | None]:
Expand All @@ -801,8 +802,9 @@ def move_cursor_to_coords(self) -> Callable[[[tuple[()] | tuple[int] | tuple[int
# TODO(Aleksei): Get rid of property usage after getting rid of "if getattr"
return get_delegate(self).move_cursor_to_coords

def rows(self, size: tuple[int], focus: bool = False) -> int:
return get_delegate(self).rows(size, focus=focus)
@property
def rows(self) -> Callable[[tuple[int], bool], int]:
return get_delegate(self).rows

@property
def mouse_event(
Expand All @@ -811,11 +813,13 @@ def mouse_event(
# TODO(Aleksei): Get rid of property usage after getting rid of "if getattr"
return get_delegate(self).mouse_event

def sizing(self) -> frozenset[Sizing]:
return get_delegate(self).sizing()
@property
def sizing(self) -> Callable[[], frozenset[Sizing]]:
return get_delegate(self).sizing

def pack(self, size: tuple[()] | tuple[int] | tuple[int, int], focus: bool = False) -> tuple[int, int]:
return get_delegate(self).pack(size, focus)
@property
def pack(self) -> Callable[[tuple[()] | tuple[int] | tuple[int, int], bool], tuple[int, int]]:
return get_delegate(self).pack

return DelegateToWidgetMixin

Expand Down

0 comments on commit a7dbb64

Please sign in to comment.