Skip to content

Commit 558524b

Browse files
committed
major updates
1 parent 038038b commit 558524b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+1112
-1124
lines changed

.dockerignore

-5
This file was deleted.

.dockerignore

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
./.gitignore

.gitignore

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
/.git/
12
/.venv/
23
__pycache__/
4+
.mypy_cache/
35
/.vars/
46
/temp/
5-
/.vscode/
7+
/.vscode/

.mypy.ini

+5-5
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,12 @@ no_implicit_optional = true
1919

2020
strict_concatenate = true
2121
strict_equality = true
22-
; strict = true
22+
# strict = true
2323

24-
; disallow_any_decorated = true
25-
; disallow_any_expr = true
26-
; disallow_any_generics = true
27-
; disallow_any_unimported = true
24+
# disallow_any_decorated = true
25+
# disallow_any_expr = true
26+
# disallow_any_generics = true
27+
disallow_any_unimported = true
2828
disallow_incomplete_defs = true
2929
disallow_subclassing_any = true
3030
disallow_untyped_calls = true

Dockerfile

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1-
FROM ubuntu:latest
1+
FROM ubuntu:focal
22

33
ENV TERM=xterm-256color
44
RUN apt-get update && \
55
DEBIAN_FRONTEND=noninteractive apt-get install --yes --no-install-recommends -- python3-venv neovim git ca-certificates && \
66
rm -rf -- /var/lib/apt/lists/*
77

88

9-
ADD https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim /root/.config/nvim/autoload/plug.vim
109
COPY ./docker /
11-
COPY . /root/.config/nvim/plugged/chadtree
10+
WORKDIR /root/.config/nvim/pack/modules/start/chadtree
11+
COPY . .
1212

13-
WORKDIR /root/.config/nvim/plugged/chadtree
13+
RUN python3 -m chadtree deps --xdg ~/.local/share/nvim

chadtree/__main__.py

+10-14
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from argparse import ArgumentParser, Namespace
2-
from concurrent.futures import ThreadPoolExecutor
2+
from asyncio import run as arun
33
from contextlib import nullcontext, redirect_stderr, redirect_stdout
44
from io import StringIO
55
from pathlib import Path
@@ -38,6 +38,7 @@ def parse_args() -> Namespace:
3838
sub_parsers = parser.add_subparsers(dest="command", required=True)
3939

4040
with nullcontext(sub_parsers.add_parser("run")) as p:
41+
p.add_argument("--ppid", type=int)
4142
p.add_argument("--socket", required=True)
4243
p.add_argument("--xdg")
4344

@@ -68,9 +69,6 @@ def parse_args() -> Namespace:
6869

6970

7071
if command == "deps":
71-
if not args.nvim:
72-
exit(0)
73-
7472
assert not _IN_VENV
7573

7674
io_out = StringIO()
@@ -112,7 +110,6 @@ def parse_args() -> Namespace:
112110
_LOCK_FILE.write_text(_REQ)
113111
msg = """
114112
---
115-
This is not an error:
116113
You can now use :CHADopen
117114
"""
118115
print(dedent(msg), file=stderr)
@@ -128,10 +125,11 @@ def parse_args() -> Namespace:
128125
elif lock != _REQ:
129126
raise ImportError()
130127
else:
131-
import pynvim
132128
import pynvim_pp
133-
import std2
134129
import yaml
130+
from std2.sys import suicide
131+
132+
from .client import init
135133
except ImportError:
136134
msg = """
137135
Please update dependencies using :CHADdeps
@@ -144,15 +142,13 @@ def parse_args() -> Namespace:
144142
print(msg, end="", file=stderr)
145143
exit(1)
146144
else:
147-
from pynvim import attach
148-
from pynvim_pp.client import run_client
149145

150-
from .client import ChadClient
146+
async def main() -> None:
147+
async with suicide(args.ppid):
148+
await init(args.socket)
149+
150+
arun(main())
151151

152-
nvim = attach("socket", path=args.socket)
153-
with ThreadPoolExecutor() as pool:
154-
code = run_client(nvim, pool=pool, client=ChadClient(pool=pool))
155-
exit(code)
156152

157153
else:
158154
assert False

chadtree/_registry.py

+24
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,28 @@
2323
version_ctl,
2424
)
2525

26+
assert autocmds
27+
assert click
28+
assert collapse
29+
assert copy_name
30+
assert cut_copy
31+
assert delete
32+
assert filter
33+
assert focus
34+
assert help
35+
assert new
36+
assert noop
37+
assert open_system
38+
assert quit
39+
assert refresh
40+
assert refresh
41+
assert rename
42+
assert resize
43+
assert schedule_update
44+
assert selection
45+
assert stat
46+
assert toggle_open
47+
assert toggles
48+
assert version_ctl
49+
2650
____ = None

chadtree/client.py

+98-107
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,41 @@
1-
from asyncio.events import AbstractEventLoop
2-
from concurrent.futures import Executor
1+
from asyncio import gather
2+
from functools import wraps
33
from multiprocessing import cpu_count
4-
from pathlib import Path
4+
from pathlib import Path, PurePath
55
from platform import uname
66
from string import Template
7-
from sys import executable
7+
from sys import executable, exit
88
from textwrap import dedent
99
from time import monotonic
10-
from typing import Any, MutableMapping, Optional, cast
10+
from typing import Any, MutableMapping, Optional, Sequence, Tuple, cast
1111

12-
from pynvim import Nvim
13-
from pynvim.api.common import NvimError
14-
from pynvim_pp.client import Client
1512
from pynvim_pp.highlight import highlight
16-
from pynvim_pp.lib import threadsafe_call, write
17-
from pynvim_pp.logging import log, with_suppress
18-
from pynvim_pp.rpc import RpcCallable, RpcMsg, nil_handler
13+
from pynvim_pp.logging import log, suppress_and_log
14+
from pynvim_pp.nvim import Nvim, conn
15+
from pynvim_pp.rpc import MsgType
16+
from pynvim_pp.types import Method, NoneType, NvimError, RPCallable
1917
from std2.pickle.types import DecodeError
20-
from std2.sched import ticker
21-
from std2.types import AnyFun
18+
from std2.sched import aticker
2219

2320
from ._registry import ____
2421
from .consts import RENDER_RETRIES
25-
from .registry import autocmd, enqueue_event, event_queue, rpc
22+
from .registry import autocmd, enqueue_event, queue, rpc
2623
from .settings.load import initial as initial_settings
2724
from .settings.localization import init as init_locale
2825
from .settings.types import Settings
2926
from .state.load import initial as initial_state
30-
from .state.types import State
3127
from .transitions.autocmds import save_session
3228
from .transitions.redraw import redraw
33-
from .transitions.schedule_update import schedule_update
29+
from .transitions.schedule_update import scheduled_update
3430
from .transitions.types import Stage
3531
from .transitions.version_ctl import vc_refresh
3632

33+
assert ____ or True
3734

38-
def _profile(nvim: Nvim, t1: float) -> None:
35+
_CB = RPCallable[Optional[Stage]]
36+
37+
38+
async def _profile(t1: float) -> None:
3939
t2 = monotonic()
4040
info = uname()
4141
msg = f"""
@@ -47,99 +47,90 @@ def _profile(nvim: Nvim, t1: float) -> None:
4747
Version {info.version}
4848
Python {Path(executable).resolve(strict=True)}
4949
"""
50-
write(nvim, dedent(msg))
51-
52-
53-
class ChadClient(Client):
54-
def __init__(self, pool: Executor) -> None:
55-
self._pool = pool
56-
self._handlers: MutableMapping[str, RpcCallable] = {}
57-
self._state: Optional[State] = None
58-
self._settings: Optional[Settings] = None
59-
60-
def on_msg(self, nvim: Nvim, msg: RpcMsg) -> Any:
61-
event_queue.put(msg)
62-
return None
63-
64-
def wait(self, nvim: Nvim) -> int:
65-
def cont() -> bool:
66-
assert isinstance(nvim.loop, AbstractEventLoop)
67-
nvim.loop.set_default_executor(self._pool)
68-
69-
atomic, specs = rpc.drain(nvim.channel_id)
70-
self._handlers.update(specs)
71-
try:
72-
self._settings = initial_settings(nvim, specs)
73-
except DecodeError as e:
74-
tpl = """
75-
Some options may have changed.
76-
See help doc on Github under [docs/CONFIGURATION.md]
77-
78-
79-
${e}
80-
"""
81-
ms = Template(dedent(tpl)).substitute(e=e)
82-
write(nvim, ms, error=True)
83-
return False
84-
else:
85-
hl = highlight(*self._settings.view.hl_context.groups)
86-
(atomic + autocmd.drain() + hl).commit(nvim)
87-
88-
self._state = initial_state(
89-
nvim, pool=self._pool, settings=self._settings
90-
)
91-
init_locale(self._settings.lang)
92-
return True
50+
await Nvim.write(dedent(msg))
51+
52+
53+
async def _sched(settings: Settings) -> None:
54+
await enqueue_event(vc_refresh.method)
55+
56+
async for _ in aticker(settings.polling_rate, immediately=False):
57+
await enqueue_event(scheduled_update.method)
58+
await enqueue_event(vc_refresh.method)
59+
await enqueue_event(save_session.method)
60+
61+
62+
def _trans(handler: _CB) -> _CB:
63+
@wraps(handler)
64+
async def f(*params: Any) -> None:
65+
await enqueue_event(handler.method, *params)
66+
67+
return cast(_CB, f)
68+
9369

70+
async def _default(_: MsgType, method: Method, params: Sequence[Any]) -> None:
71+
await enqueue_event(method, *params)
72+
73+
74+
async def init(socket: PurePath) -> None:
75+
async with conn(socket, default=_default) as client:
76+
atomic, handlers = rpc.drain()
9477
try:
95-
go = threadsafe_call(nvim, cont)
96-
except Exception as e:
97-
log.exception("%s", e)
98-
return 1
78+
settings = await initial_settings(handlers.values())
79+
except DecodeError as e:
80+
tpl = """
81+
Some options may have changed.
82+
See help doc on Github under [docs/CONFIGURATION.md]
83+
84+
85+
${e}
86+
"""
87+
ms = Template(dedent(tpl)).substitute(e=e)
88+
await Nvim.write(ms, error=True)
89+
exit(1)
9990
else:
100-
if not go:
101-
return 1
102-
else:
103-
settings = cast(Settings, self._settings)
91+
hl = highlight(*settings.view.hl_context.groups)
92+
await (atomic + autocmd.drain() + hl).commit(NoneType)
93+
state = await initial_state(settings)
94+
95+
init_locale(settings.lang)
96+
97+
transitions: MutableMapping[Method, _CB] = {}
98+
99+
for f in handlers.values():
100+
ff = _trans(f)
101+
client.register(ff)
102+
transitions[ff.method] = ff
103+
104+
async def cont() -> None:
105+
nonlocal state
104106
t1, has_drawn = monotonic(), False
105107

106-
def sched() -> None:
107-
enqueue_event(vc_refresh)
108-
for _ in ticker(settings.polling_rate, immediately=False):
109-
enqueue_event(schedule_update)
110-
enqueue_event(vc_refresh)
111-
enqueue_event(save_session)
112-
113-
self._pool.submit(sched)
114-
115-
while True:
116-
msg: RpcMsg = event_queue.get()
117-
name, args = msg
118-
handler = cast(
119-
AnyFun[Optional[Stage]], self._handlers.get(name, nil_handler(name))
120-
)
121-
122-
def cdraw() -> None:
123-
nonlocal has_drawn
124-
if stage := handler(nvim, self._state, settings, *args):
125-
self._state = stage.state
126-
127-
for _ in range(RENDER_RETRIES - 1):
128-
try:
129-
redraw(nvim, state=self._state, focus=stage.focus)
130-
except NvimError:
131-
pass
108+
while True:
109+
with suppress_and_log():
110+
msg: Tuple[Method, Sequence[Any]] = await queue().get()
111+
method, params = msg
112+
if handler := cast(Optional[_CB], handlers.get(method)):
113+
if stage := await handler(state, settings, *params):
114+
state = stage.state
115+
116+
for _ in range(RENDER_RETRIES - 1):
117+
try:
118+
await redraw(state, focus=stage.focus)
119+
except NvimError:
120+
pass
121+
else:
122+
break
123+
else:
124+
try:
125+
await redraw(state, focus=stage.focus)
126+
except NvimError as e:
127+
log.warn("%s", e)
128+
129+
if settings.profiling and not has_drawn:
130+
has_drawn = True
131+
await _profile(t1=t1)
132+
132133
else:
133-
break
134-
else:
135-
try:
136-
redraw(nvim, state=self._state, focus=stage.focus)
137-
except NvimError as e:
138-
log.warn("%s", e)
139-
140-
if settings.profiling and not has_drawn:
141-
has_drawn = True
142-
_profile(nvim, t1=t1)
143-
144-
with with_suppress():
145-
threadsafe_call(nvim, cdraw)
134+
assert False, msg
135+
136+
await gather(cont(), _sched(settings))

0 commit comments

Comments
 (0)