Clean up
This commit is contained in:
parent
68595dcb7a
commit
11bd7778cf
14 changed files with 58 additions and 68 deletions
|
|
@ -15,7 +15,6 @@ from .utils import *
|
|||
|
||||
__all__: List[str] = []
|
||||
|
||||
|
||||
__all__ += attributed_lines.__all__
|
||||
__all__ += attributed_lines_widget.__all__
|
||||
__all__ += attributed_text_widget.__all__
|
||||
|
|
|
|||
|
|
@ -5,11 +5,11 @@
|
|||
import collections
|
||||
from typing import Any, Deque, Iterator, List, Optional, Set, Tuple
|
||||
|
||||
from .markup import AT, AttributedText, Attributes
|
||||
from .markup import AT, Attributes
|
||||
|
||||
__all__ = ["Line", "AttributedLines"]
|
||||
|
||||
Line = Tuple[Attributes, AttributedText]
|
||||
Line = Tuple[Attributes, AT]
|
||||
|
||||
class AttributedLines:
|
||||
"""
|
||||
|
|
@ -49,7 +49,8 @@ class AttributedLines:
|
|||
|
||||
def append_above(self,
|
||||
attributes: Attributes,
|
||||
text: AttributedText) -> None:
|
||||
text: AT,
|
||||
) -> None:
|
||||
"""
|
||||
Append a line above all already existing lines. The existing lines'
|
||||
offsets do not change.
|
||||
|
|
@ -60,7 +61,8 @@ class AttributedLines:
|
|||
|
||||
def append_below(self,
|
||||
attributes: Attributes,
|
||||
text: AttributedText) -> None:
|
||||
text: AT,
|
||||
) -> None:
|
||||
"""
|
||||
Append a line below all already existing lines. The existing lines'
|
||||
offsets do not change.
|
||||
|
|
@ -133,7 +135,7 @@ class AttributedLines:
|
|||
horizontal_offset: int,
|
||||
offset_char: str = " ",
|
||||
overlap_char: str = "…",
|
||||
) -> AttributedText:
|
||||
) -> AT:
|
||||
"""
|
||||
Renders a single line to a specified width with a specified horizontal
|
||||
offset, applying all line-wide attributes to the result. The length of
|
||||
|
|
@ -152,7 +154,7 @@ class AttributedLines:
|
|||
start_offset = horizontal_offset
|
||||
end_offset = start_offset + text_width
|
||||
|
||||
result: AttributedText = AT()
|
||||
result: AT = AT()
|
||||
|
||||
if start_offset < 0:
|
||||
pad_length = min(text_width, -start_offset)
|
||||
|
|
@ -189,7 +191,7 @@ class AttributedLines:
|
|||
width: int,
|
||||
height: int,
|
||||
horizontal_offset: int,
|
||||
) -> List[AttributedText]:
|
||||
) -> List[AT]:
|
||||
"""
|
||||
Renders all lines individually.
|
||||
"""
|
||||
|
|
@ -205,7 +207,7 @@ class AttributedLines:
|
|||
width: int,
|
||||
height: int,
|
||||
horizontal_offset: int,
|
||||
) -> AttributedText:
|
||||
) -> AT:
|
||||
"""
|
||||
Renders all lines and combines them into a single AttributedText by
|
||||
joining them with a newline.
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ from typing import Optional, Tuple
|
|||
import urwid
|
||||
|
||||
from .attributed_lines import AttributedLines
|
||||
from .attributed_text_widget import AttributedTextWidget
|
||||
from .attributed_text_widget import ATWidget
|
||||
from .markup import AT
|
||||
|
||||
__all__ = ["AttributedLinesWidget"]
|
||||
|
|
@ -17,7 +17,7 @@ class AttributedLinesWidget(urwid.WidgetWrap):
|
|||
"""
|
||||
|
||||
def __init__(self, lines: Optional[AttributedLines] = None) -> None:
|
||||
self._text = AttributedTextWidget(AT())
|
||||
self._text = ATWidget(AT())
|
||||
self._filler = urwid.Filler(self._text, valign=urwid.TOP)
|
||||
super().__init__(self._filler)
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ from typing import Any, List, Tuple, Union
|
|||
|
||||
import urwid
|
||||
|
||||
from .markup import AttributedText
|
||||
from .markup import AT
|
||||
|
||||
__all__ = ["AttributedTextWidget", "ATWidget"]
|
||||
|
||||
|
|
@ -15,9 +15,9 @@ class AttributedTextWidget(urwid.Text):
|
|||
"""
|
||||
|
||||
def __init__(self,
|
||||
text: AttributedText,
|
||||
text: AT,
|
||||
*args: Any,
|
||||
**kwargs: Any
|
||||
**kwargs: Any,
|
||||
) -> None:
|
||||
"""
|
||||
text - an AttributedText object
|
||||
|
|
@ -30,9 +30,7 @@ class AttributedTextWidget(urwid.Text):
|
|||
super().__init__(self._convert_to_markup(text), *args, **kwargs)
|
||||
|
||||
@staticmethod
|
||||
def _convert_to_markup(text: AttributedText
|
||||
) -> List[Union[str, Tuple[str, str]]]:
|
||||
|
||||
def _convert_to_markup(text: AT) -> List[Union[str, Tuple[str, str]]]:
|
||||
# Wonder why mypy can't figure out the type signature of markup on its
|
||||
# own... :P
|
||||
markup: List[Union[str, Tuple[str, str]]]
|
||||
|
|
@ -43,7 +41,7 @@ class AttributedTextWidget(urwid.Text):
|
|||
|
||||
return markup or [""]
|
||||
|
||||
def set_attributed_text(self, text: AttributedText) -> None:
|
||||
def set_attributed_text(self, text: AT) -> None:
|
||||
"""
|
||||
Set the content of the AttributedTextWidget.
|
||||
"""
|
||||
|
|
@ -51,7 +49,7 @@ class AttributedTextWidget(urwid.Text):
|
|||
self._attributed_text = text
|
||||
super().set_text(self._convert_to_markup(text))
|
||||
|
||||
def get_attributed_text(self) -> AttributedText:
|
||||
def get_attributed_text(self) -> AT:
|
||||
"""
|
||||
Returns the currently used AttributedText.
|
||||
|
||||
|
|
@ -63,7 +61,7 @@ class AttributedTextWidget(urwid.Text):
|
|||
return self._attributed_text
|
||||
|
||||
@property
|
||||
def attributed_text(self) -> AttributedText:
|
||||
def attributed_text(self) -> AT:
|
||||
return self.get_attributed_text()
|
||||
|
||||
ATWidget = AttributedTextWidget
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
from dataclasses import dataclass, field
|
||||
from enum import Enum, auto
|
||||
from typing import (Any, Callable, Dict, Iterable, List, Optional, Tuple,
|
||||
TypeVar)
|
||||
from typing import Any, Callable, Dict, Iterable, List, Optional, Tuple
|
||||
|
||||
__all__ = ["ConfigException", "ConfigValueException", "TransparentConfig",
|
||||
"Kind", "Condition", "Option", "TreeLoader"]
|
||||
|
|
@ -43,6 +42,7 @@ class TransparentConfig:
|
|||
# Special config reading and writing classes
|
||||
|
||||
class Kind(Enum):
|
||||
|
||||
BOOL = auto()
|
||||
DICT = auto()
|
||||
FLOAT = auto()
|
||||
|
|
@ -64,13 +64,15 @@ Condition = Callable[[Any], bool]
|
|||
|
||||
@dataclass
|
||||
class Option:
|
||||
|
||||
kind: Kind
|
||||
default: Any
|
||||
conditions: Iterable[Tuple[Condition, str]] = field(default_factory=list)
|
||||
|
||||
def check_valid(self, value: Any) -> None:
|
||||
if not self.kind.matches(value):
|
||||
raise ConfigValueException(f"value {value!r} does not match {self.kind}")
|
||||
raise ConfigValueException(
|
||||
f"value {value!r} does not match {self.kind}")
|
||||
|
||||
self.apply_conditions(value)
|
||||
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ from .attributed_lines import AttributedLines
|
|||
from .element import Element, Id, Message, RenderedElement, RenderedMessage
|
||||
from .element_supply import ElementSupply
|
||||
from .exceptions import ShouldNeverHappen
|
||||
from .markup import AT, AttributedText, Attributes
|
||||
from .markup import AT, Attributes
|
||||
from .rendered_element_cache import RenderedElementCache
|
||||
|
||||
__all__ = ["CursorRenderer", "CursorTreeRenderer", "BasicCursorRenderer"]
|
||||
|
|
@ -28,7 +28,7 @@ class CursorRenderer(ABC, Generic[E, R]):
|
|||
pass
|
||||
|
||||
@abstractmethod
|
||||
def render_cursor(self, width: int) -> AttributedText:
|
||||
def render_cursor(self, width: int) -> AT:
|
||||
pass
|
||||
|
||||
class CursorTreeRenderer(Generic[E]):
|
||||
|
|
@ -157,7 +157,7 @@ class CursorTreeRenderer(Generic[E]):
|
|||
|
||||
def _render_message(self,
|
||||
message_id: Id,
|
||||
indent: AttributedText,
|
||||
indent: AT,
|
||||
) -> AttributedLines:
|
||||
|
||||
width = self._width - len(indent) - self._renderer.meta_width - 1
|
||||
|
|
@ -175,9 +175,7 @@ class CursorTreeRenderer(Generic[E]):
|
|||
|
||||
return lines
|
||||
|
||||
def _render_cursor(self,
|
||||
indent: AttributedText = AT(),
|
||||
) -> AttributedLines:
|
||||
def _render_cursor(self, indent: AT = AT(),) -> AttributedLines:
|
||||
lines = AttributedLines()
|
||||
width = self._width - len(indent) - self._renderer.meta_width - 1
|
||||
meta_spaces = AT(" " * self._renderer.meta_width)
|
||||
|
|
@ -189,7 +187,7 @@ class CursorTreeRenderer(Generic[E]):
|
|||
def _render_indent(self,
|
||||
cursor: bool = False,
|
||||
cursor_line: bool = False,
|
||||
) -> AttributedText:
|
||||
) -> AT:
|
||||
|
||||
if self._indent_width < 1:
|
||||
return AT()
|
||||
|
|
@ -215,7 +213,7 @@ class CursorTreeRenderer(Generic[E]):
|
|||
def _render_subtree(self,
|
||||
lines: AttributedLines,
|
||||
root_id: Id,
|
||||
indent: AttributedText = AT(),
|
||||
indent: AT = AT(),
|
||||
) -> None:
|
||||
|
||||
if self._anchor_id == root_id:
|
||||
|
|
@ -635,5 +633,5 @@ class BasicCursorRenderer(CursorRenderer):
|
|||
|
||||
return RenderedMessage(message.id, lines, meta)
|
||||
|
||||
def render_cursor(self, width: int) -> AttributedText:
|
||||
def render_cursor(self, width: int) -> AT:
|
||||
return AT("<cursor>")
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
import datetime
|
||||
from typing import Hashable, List, Optional
|
||||
|
||||
from .markup import AttributedText
|
||||
from .markup import AT
|
||||
|
||||
__all__ = ["Id", "Element", "RenderedElement", "Message", "RenderedMessage"]
|
||||
|
||||
|
|
@ -26,10 +26,8 @@ class Element:
|
|||
return self._parent_id
|
||||
|
||||
class RenderedElement:
|
||||
def __init__(self,
|
||||
id: Id,
|
||||
lines: List[AttributedText],
|
||||
) -> None:
|
||||
|
||||
def __init__(self, id: Id, lines: List[AT]) -> None:
|
||||
|
||||
self._id = id
|
||||
self._lines = lines
|
||||
|
|
@ -39,7 +37,7 @@ class RenderedElement:
|
|||
return self._id
|
||||
|
||||
@property
|
||||
def lines(self) -> List[AttributedText]:
|
||||
def lines(self) -> List[AT]:
|
||||
return self._lines
|
||||
|
||||
class Message(Element):
|
||||
|
|
@ -71,15 +69,10 @@ class Message(Element):
|
|||
|
||||
class RenderedMessage(RenderedElement):
|
||||
|
||||
def __init__(self,
|
||||
id: Id,
|
||||
lines: List[AttributedText],
|
||||
meta: AttributedText,
|
||||
) -> None:
|
||||
|
||||
def __init__(self, id: Id, lines: List[AT], meta: AT) -> None:
|
||||
super().__init__(id, lines)
|
||||
self._meta = meta
|
||||
|
||||
@property
|
||||
def meta(self) -> AttributedText:
|
||||
def meta(self) -> AT:
|
||||
return self._meta
|
||||
|
|
|
|||
|
|
@ -6,7 +6,6 @@ from .euph_renderer import *
|
|||
from .launch_application import *
|
||||
from .room_widget import *
|
||||
from .single_room_application import *
|
||||
from .user_list_widget import *
|
||||
|
||||
__all__: List[str] = []
|
||||
|
||||
|
|
@ -16,4 +15,3 @@ __all__ += euph_renderer.__all__
|
|||
__all__ += launch_application.__all__
|
||||
__all__ += room_widget.__all__
|
||||
__all__ += single_room_application.__all__
|
||||
__all__ += user_list_widget.__all__
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
from typing import Any, Dict, List, Optional, Set, TypeVar
|
||||
from typing import Any, Dict, List, Optional, Set
|
||||
|
||||
from ..config import (ConfigValueException, Kind, Option, TransparentConfig,
|
||||
TreeLoader)
|
||||
from ..config import ConfigValueException, Kind, TransparentConfig, TreeLoader
|
||||
|
||||
__all__ = ["EuphConfig", "EuphLoader"]
|
||||
|
||||
|
|
|
|||
|
|
@ -57,8 +57,8 @@ def load_config(args: Any) -> EuphConfig:
|
|||
|
||||
return config
|
||||
|
||||
def export_defaults(path: str) -> None:
|
||||
path = pathlib.Path(path).expanduser()
|
||||
def export_defaults(path_str: str) -> None:
|
||||
path = pathlib.Path(path_str).expanduser()
|
||||
print(f"Exporting default config to {path}")
|
||||
|
||||
loader = EuphLoader()
|
||||
|
|
|
|||
|
|
@ -1,16 +1,12 @@
|
|||
import asyncio
|
||||
import logging
|
||||
from pathlib import Path
|
||||
from typing import Any, Optional
|
||||
|
||||
import urwid
|
||||
import yaml
|
||||
|
||||
from ..attributed_text_widget import ATWidget
|
||||
from ..markup import AT, Attributes
|
||||
from ..markup import AT
|
||||
from .edit_widgets import EditWidget
|
||||
from .euph_config import EuphConfig
|
||||
from .launch_application import launch
|
||||
from .euph_config import EuphConfig, EuphLoader
|
||||
from .room_widget import RoomWidget
|
||||
|
||||
__all__ = ["SingleRoomApplication", "launch_single_room_application"]
|
||||
|
|
@ -67,7 +63,7 @@ class ChooseRoomWidget(urwid.WidgetWrap):
|
|||
self.set_error(ATWidget(text, align=urwid.CENTER))
|
||||
|
||||
class SingleRoomApplication(urwid.WidgetWrap):
|
||||
#
|
||||
|
||||
# The characters in the ALPHABET make up the characters that are allowed in
|
||||
# room names.
|
||||
ALPHABET = "abcdefghijklmnopqrstuvwxyz0123456789"
|
||||
|
|
@ -130,5 +126,5 @@ class SingleRoomApplication(urwid.WidgetWrap):
|
|||
|
||||
return key
|
||||
|
||||
def launch_single_room_application():
|
||||
def launch_single_room_application() -> None:
|
||||
launch(SingleRoomApplication)
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ class MessageSupplyException(Exception):
|
|||
pass
|
||||
|
||||
class ShouldNeverHappen(Exception):
|
||||
|
||||
def __init__(self, number: int) -> None:
|
||||
message = (f"SNV{number:05} - please contact @Garmy with the code on"
|
||||
" the left if you see this")
|
||||
|
|
|
|||
|
|
@ -32,10 +32,7 @@ class Chunk:
|
|||
|
||||
# Common special methods
|
||||
|
||||
def __init__(self,
|
||||
text: str,
|
||||
attributes: Attributes = {},
|
||||
) -> None:
|
||||
def __init__(self, text: str, attributes: Attributes = {}) -> None:
|
||||
self._text = text
|
||||
self._attributes = dict(attributes)
|
||||
|
||||
|
|
@ -51,7 +48,8 @@ class Chunk:
|
|||
if not isinstance(other, Chunk):
|
||||
return NotImplemented
|
||||
|
||||
return self._text == other._text and self._attributes == other._attributes
|
||||
return (self._text == other._text and
|
||||
self._attributes == other._attributes)
|
||||
|
||||
def __getitem__(self, key: Union[int, slice]) -> "Chunk":
|
||||
return Chunk(self.text[key], self._attributes)
|
||||
|
|
@ -247,9 +245,13 @@ class AttributedText:
|
|||
name: str,
|
||||
default: Any = None,
|
||||
) -> Any:
|
||||
|
||||
return self._at(pos).get(name, default)
|
||||
|
||||
def split_by(self, attribute_name: str) -> List[Tuple["AttributedText", Any]]:
|
||||
def split_by(self,
|
||||
attribute_name: str,
|
||||
) -> List[Tuple["AttributedText", Any]]:
|
||||
|
||||
blocks = []
|
||||
|
||||
chunks: List[Chunk] = []
|
||||
|
|
@ -297,6 +299,7 @@ class AttributedText:
|
|||
start: Optional[int] = None,
|
||||
stop: Optional[int] = None,
|
||||
) -> "AttributedText":
|
||||
|
||||
if start is None and stop is None:
|
||||
chunks = (chunk.set(name, value) for chunk in self._chunks)
|
||||
return AttributedText.from_chunks(chunks)
|
||||
|
|
@ -319,6 +322,7 @@ class AttributedText:
|
|||
start: Optional[int] = None,
|
||||
stop: Optional[int] = None,
|
||||
) -> "AttributedText":
|
||||
|
||||
if start is None and stop is None:
|
||||
chunks = (chunk.remove(name) for chunk in self._chunks)
|
||||
return AttributedText.from_chunks(chunks)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue