Skip to content

Commit 722d9db

Browse files
committed
(py): fix build script to create correct structure for maturin
1 parent d1c6d7d commit 722d9db

6 files changed

Lines changed: 209 additions & 27 deletions

File tree

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ test-coverage = ["dep:syn", "dep:regex"]
8686
# ffi
8787
java = ["dep:jni", "dep:tracing-subscriber", "dep:jni-toolbox", "codemp-proto/java"]
8888
js = ["dep:napi-build", "dep:tracing-subscriber", "dep:napi", "dep:napi-derive", "codemp-proto/js"]
89-
py = ["dep:pyo3", "dep:tracing-subscriber", "dep:pyo3-build-config", "codemp-proto/py"]
89+
py = ["dep:pyo3", "dep:tracing-subscriber", "dep:pyo3-build-config", "dep:pyo3-introspection", "codemp-proto/py"]
9090
lua = ["serialize", "dep:mlua", "dep:mlua-serde-derive", "dep:tracing-subscriber", "codemp-proto/lua"]
9191
# ffi variants
9292
lua-jit = ["mlua?/luajit"]

build.rs

Lines changed: 14 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -65,26 +65,20 @@ fn main() {
6565
.join("src")
6666
.join("autocodemp");
6767

68-
let _: Vec<_> = output
69-
.into_iter()
70-
.map(|(p, content)| {
71-
let outpath = pydist.join(p);
72-
if let Some(parent) = outpath.parent() {
73-
std::fs::create_dir_all(parent).unwrap_or_else(|_| {
74-
panic!(
75-
"failed to create dir {:?}",
76-
parent.to_str().expect("invalid path.")
77-
)
78-
});
79-
}
80-
std::fs::write(&outpath, content).unwrap_or_else(|_| {
81-
panic!(
82-
"failed to create file {:?}",
83-
outpath.to_str().expect("invalid path.")
84-
)
85-
});
86-
})
87-
.collect();
68+
let pyicontent = output
69+
.get_key_value(std::path::Path::new("__init__.pyi"))
70+
.unwrap()
71+
.1;
72+
73+
let pyinit = "\
74+
from .codemplib import *
75+
76+
__doc__ = codemplib.__doc__
77+
if hasattr(codemplib, '__all__'):
78+
__all__ = codemplib.__all__";
79+
80+
let _ = std::fs::write(pydist.join("__init__.py"), pyinit);
81+
let _ = std::fs::write(pydist.join("codemplib.pyi"), pyicontent);
8882
}
8983

9084
#[cfg(feature = "lua")]

dist/py/src/autocodemp/__init__.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
2+
from .codemplib import *
3+
4+
__doc__ = codemplib.__doc__
5+
if hasattr(codemplib, '__all__'):
6+
__all__ = codemplib.__all__
Lines changed: 182 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,182 @@
1+
from collections.abc import Sequence
2+
from typing import Any, final
3+
4+
@final
5+
class BufferController:
6+
def ack(self, /, v: Sequence[int]) -> None: ...
7+
def callback(self, /, cb: Any) -> None: ...
8+
def clear_callback(self, /) -> None: ...
9+
def content(self, /) -> Promise: ...
10+
def path(self, /) -> str: ...
11+
def poll(self, /) -> Promise: ...
12+
def recv(self, /) -> Promise: ...
13+
def send(self, /, op: TextChange) -> None: ...
14+
def try_recv(self, /) -> Promise: ...
15+
def workspace_id(self, /) -> WorkspaceIdentifier: ...
16+
17+
@final
18+
class BufferUpdate:
19+
@property
20+
def change(self, /) -> TextChange: ...
21+
@property
22+
def hash(self, /) -> int |None: ...
23+
@property
24+
def version(self, /) -> list[int]: ...
25+
26+
@final
27+
class Client:
28+
def accept_invite(self, /, user: str, workspace: str) -> Promise: ...
29+
def active_workspaces(self, /) -> list[WorkspaceIdentifier]: ...
30+
def attach_workspace(self, /, user: str, workspace: str) -> Promise: ...
31+
def create_workspace(self, /, workspace: str) -> Promise: ...
32+
def current_user(self, /) -> UserInfo: ...
33+
def delete_workspace(self, /, workspace: str) -> Promise: ...
34+
def fetch_joined_workspaces(self, /) -> Promise: ...
35+
def fetch_owned_workspaces(self, /) -> Promise: ...
36+
def get_user_info(self, /, user: str) -> Promise: ...
37+
def get_workspace(self, /, user: str, workspace: str) -> Workspace |None: ...
38+
def invite_to_workspace(self, /, workspace: str, user: str) -> Promise: ...
39+
def leave_workspace(self, /, user: str, workspace: str) -> bool: ...
40+
def quit_workspace(self, /, user: str, workspace: str) -> Promise: ...
41+
def refresh(self, /) -> Promise: ...
42+
def reject_invite(self, /, user: str, workspace: str) -> Promise: ...
43+
44+
@final
45+
class Config:
46+
def __new__(cls, /, *, username: str, password: str, **kwds) -> Config: ...
47+
def __str__(self, /) -> str: ...
48+
@property
49+
def host(self, /) -> str |None: ...
50+
@host.setter
51+
def host(self, /, value: str |None) -> None: ...
52+
@property
53+
def password(self, /) -> str: ...
54+
@password.setter
55+
def password(self, /, value: str) -> None: ...
56+
@property
57+
def port(self, /) -> int |None: ...
58+
@port.setter
59+
def port(self, /, value: int |None) -> None: ...
60+
@property
61+
def tls(self, /) -> bool |None: ...
62+
@tls.setter
63+
def tls(self, /, value: bool |None) -> None: ...
64+
@property
65+
def username(self, /) -> str: ...
66+
@username.setter
67+
def username(self, /, value: str) -> None: ...
68+
69+
@final
70+
class CursorController:
71+
def callback(self, /, cb: Any) -> None: ...
72+
def clear_callback(self, /) -> None: ...
73+
def poll(self, /) -> Promise: ...
74+
def recv(self, /) -> Promise: ...
75+
def send(self, /, pos: CursorUpdate) -> None: ...
76+
def try_recv(self, /) -> Promise: ...
77+
def workspace_id(self, /) -> WorkspaceIdentifier: ...
78+
79+
@final
80+
class CursorPosition:
81+
@property
82+
def finish(self, /) -> Any: ...
83+
@property
84+
def start(self, /) -> Any: ...
85+
86+
@final
87+
class CursorUpdate:
88+
@property
89+
def buffer(self, /) -> str: ...
90+
@property
91+
def cursors(self, /) -> list[CursorPosition]: ...
92+
93+
@final
94+
class Driver:
95+
def stop(self, /) -> None: ...
96+
97+
@final
98+
class Promise:
99+
def done(self, /) -> bool: ...
100+
def wait(self, /) -> Any: ...
101+
102+
@final
103+
class SessionEvent:
104+
@property
105+
def kind(self, /) -> int: ...
106+
@property
107+
def user(self, /) -> str: ...
108+
@property
109+
def workspace(self, /) -> WorkspaceIdentifier: ...
110+
111+
@final
112+
class TextChange:
113+
def apply(self, /, txt: str) -> str: ...
114+
@property
115+
def content(self, /) -> str: ...
116+
@property
117+
def end_idx(self, /) -> int: ...
118+
def is_delete(self, /) -> bool: ...
119+
def is_empty(self, /) -> bool: ...
120+
def is_insert(self, /) -> bool: ...
121+
@property
122+
def start_idx(self, /) -> int: ...
123+
124+
@final
125+
class UserInfo:
126+
@property
127+
def avatar(self, /) -> bytes |None: ...
128+
@property
129+
def description(self, /) -> str |None: ...
130+
@property
131+
def display_name(self, /) -> str |None: ...
132+
@property
133+
def name(self, /) -> str: ...
134+
135+
@final
136+
class Workspace:
137+
def active_buffers(self, /) -> list[str]: ...
138+
def attach_buffer(self, /, path: str) -> Promise: ...
139+
def buffer_user_list(self, /, path: str) -> list[UserInfo]: ...
140+
def callback(self, /, cb: Any) -> None: ...
141+
def clear_callback(self, /) -> None: ...
142+
def create_buffer(self, /, path: str, attrs: Any |None) -> Promise: ...
143+
def cursor(self, /) -> CursorController: ...
144+
def delete_buffer(self, /, path: str) -> Promise: ...
145+
def detach_buffer(self, /, path: str) -> bool: ...
146+
def fetch_buffer_users(self, /, path: str) -> Promise: ...
147+
def fetch_buffers(self, /) -> Promise: ...
148+
def fetch_users(self, /) -> Promise: ...
149+
def get_buffer(self, /, path: str) -> BufferController |None: ...
150+
def id(self, /) -> WorkspaceIdentifier: ...
151+
def pin_buffer(self, /, path: str) -> Promise: ...
152+
def poll(self, /) -> Promise: ...
153+
def recv(self, /) -> Promise: ...
154+
def search_buffers(self, /, filter: str |None = None) -> list[Any]: ...
155+
def try_recv(self, /) -> Promise: ...
156+
def un_pin_buffer(self, /, path: str) -> Promise: ...
157+
def user_list(self, /) -> list[UserInfo]: ...
158+
159+
@final
160+
class WorkspaceEvent:
161+
@property
162+
def after(self, /) -> str |None: ...
163+
@property
164+
def attributes(self, /) -> Any |None: ...
165+
@property
166+
def kind(self, /) -> int: ...
167+
@property
168+
def path(self, /) -> str |None: ...
169+
@property
170+
def user(self, /) -> str |None: ...
171+
172+
@final
173+
class WorkspaceIdentifier:
174+
@property
175+
def user(self, /) -> str: ...
176+
@property
177+
def workspace(self, /) -> str: ...
178+
179+
def connect(config: Config) -> Promise: ...
180+
def init() -> Driver: ...
181+
def set_logger(logging_cb: Any, debug: bool) -> bool: ...
182+
def version() -> str: ...

dist/py/src/codemp/__init__.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
from .codemp import *
1+
from .codemplib import *
22

3-
__doc__ = codemp.__doc__
4-
if hasattr(codemp, "__all__"):
5-
__all__ = codemp.__all__
3+
__doc__ = codemplib.__doc__
4+
if hasattr(codemplib, "__all__"):
5+
__all__ = codemplib.__all__

src/ffi/python/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ pub fn tokio() -> &'static tokio::runtime::Runtime {
4545

4646
/// Implements a simple future like object between python and rust to allow for async operations
4747
/// between the two runtimes.
48-
#[pyclass]
48+
#[pyclass] // once we go past pytho 3.8 we can use pyclass(generic)
4949
pub struct Promise(Option<tokio::task::JoinHandle<PyResult<Py<PyAny>>>>);
5050

5151
#[pymethods]
@@ -447,7 +447,7 @@ mod pycodemp {
447447
use super::CodempWorkspace;
448448

449449
#[pymodule_export]
450-
use super::WorkspaceIdentifier;
450+
use super::CodempWorkspaceIdentifier;
451451

452452
#[pymodule_export]
453453
use super::CodempWorkspaceEvent;

0 commit comments

Comments
 (0)