from typing import Callable, Generator, Iterator, Optional
from ircplom.events import Event, Loop, QueueMixin
from ircplom.client import IrcConnection, IrcConnSetup
-from ircplom.client_tui import ClientKnowingTui, ClientTui
+from ircplom.client_tui import ClientKnowingTui, ClientTui, LOG_PREFIX_IN
from ircplom.irc_conn import IrcConnAbortException, IrcMessage
from ircplom.tui_base import TerminalInterface, TuiEvent
_cls_conn = _FakeIrcConnection
+_CHAR_ANCHOR = '|'
+_CHAR_COMMENT = '#'
+_CHAR_CONTEXT_SEP = ' '
+_CHAR_ID_TYPE_SEP = ':'
+_CHAR_PROMPT = '>'
+_CHAR_RANGE = ':'
+_CHAR_RANGE_DATA_SEP = ' '
+_CHAR_WIN_ID_SEP = ','
+
+
class _Playbook:
put_keypress: Optional[Callable] = None
inserts: list[str] = []
anchors: dict[str, int] = {}
for idx, line in enumerate(self._lines):
- if line[:1] == '|':
+ if line[:1] == _CHAR_ANCHOR:
anchors[line[1:]] = idx
for idx, line in enumerate(self._lines):
split = self._split_active_line(line)
if (not split) or split[0] != 'repeat':
continue
- range_data = split[1].split(' ', maxsplit=2)
+ range_data = split[1].split(_CHAR_RANGE_DATA_SEP, maxsplit=2)
start_key, end_key = range_data[:2]
start = anchors[start_key] + 1
end = anchors[end_key]
def next_log(self) -> tuple[int, tuple[int, ...], str]:
'Return index, win IDs, and context of next expected log line.'
- context, msg = self._current_line.split(maxsplit=1)
- if ':' in context:
- _, context = context.split(':')
- expected_win_ids = tuple(int(idx) for idx in context.split(',') if idx)
+ context, msg = self._current_line.split(_CHAR_CONTEXT_SEP, maxsplit=1)
+ if _CHAR_RANGE in context:
+ _, context = context.split(_CHAR_RANGE)
+ expected_win_ids = tuple(
+ int(idx) for idx in context.split(_CHAR_WIN_ID_SEP) if idx)
used_idx = self._idx
self._play_till_next_log()
return used_idx, expected_win_ids, msg
self._idx += 1
if (result := self._split_active_line(self._current_line)):
context, msg = result
- if context == '>':
+ if context == _CHAR_PROMPT:
assert self.put_keypress is not None
for c in msg:
self.put_keypress(c)
self.put_keypress('KEY_ENTER')
continue
- if ':' in context and msg.startswith('< '):
- client_id, win_ids = context.split(':')
+ if _CHAR_ID_TYPE_SEP in context\
+ and msg.startswith(LOG_PREFIX_IN):
+ client_id, win_ids = context.split(_CHAR_ID_TYPE_SEP)
client = self._get_client(int(client_id))
assert isinstance(client.conn, _FakeIrcConnection)
client.conn.put_server_msg(msg[2:])
@staticmethod
def _split_active_line(line: str) -> Optional[tuple[str, ...]]:
'Return two-items tuple of split line, or None if inactive one.'
- if line[:1] in '#|' or ' ' not in line:
+ if line[:1] in {_CHAR_COMMENT, _CHAR_ANCHOR}\
+ or _CHAR_CONTEXT_SEP not in line:
return None
- return tuple(line.split(' ', maxsplit=1))
+ return tuple(line.split(_CHAR_CONTEXT_SEP, maxsplit=1))
class TestingClientTui(ClientTui):
_path_test: Path
def __init__(self, **kwargs) -> None:
- fname_config = self._path_test.stem + '.toml'
- path_config = PATH_TESTS.joinpath(fname_config)
+ path_config = PATH_TESTS.joinpath(self._path_test.stem + '.toml')
if path_config.exists():
assert path_config.is_file()
self._path_config = path_config