Skip to content

Commit b308e30

Browse files
committed
feat: add type annotations and method signatures to storage and typesf modules
1 parent 6749444 commit b308e30

3 files changed

Lines changed: 206 additions & 20 deletions

File tree

src/appier/storage.py

Lines changed: 43 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -53,19 +53,19 @@ def read(cls, file, *args, **kwargs):
5353
raise exceptions.NotImplementedError()
5454

5555
@classmethod
56-
def seek(self, file, *args, **kwargs):
56+
def seek(cls, file, *args, **kwargs):
5757
raise exceptions.NotImplementedError()
5858

5959
@classmethod
60-
def cleanup(self, file, *args, **kwargs):
60+
def cleanup(cls, file, *args, **kwargs):
6161
raise exceptions.NotImplementedError()
6262

6363
@classmethod
64-
def is_seekable(self):
64+
def is_seekable(cls):
6565
return False
6666

6767
@classmethod
68-
def is_stored(self):
68+
def is_stored(cls):
6969
return False
7070

7171
@classmethod
@@ -75,7 +75,9 @@ def _compute(cls, file, *args, **kwargs):
7575

7676
class BaseEngine(StorageEngine):
7777
@classmethod
78-
def load(cls, file, *args, **kwargs):
78+
def load( # pyright: ignore[reportIncompatibleMethodOverride]
79+
cls, file, *args, **kwargs
80+
):
7981
force = kwargs.get("force", False)
8082
if not file.file_name:
8183
return
@@ -92,18 +94,24 @@ def load(cls, file, *args, **kwargs):
9294
finally:
9395
handle.close()
9496

95-
cls._compute()
97+
cls._compute(file)
9698

9799
@classmethod
98-
def store(cls, file, *args, **kwargs):
100+
def store( # pyright: ignore[reportIncompatibleMethodOverride]
101+
cls, file, *args, **kwargs
102+
):
99103
pass
100104

101105
@classmethod
102-
def delete(cls, file, *args, **kwargs):
106+
def delete( # pyright: ignore[reportIncompatibleMethodOverride]
107+
cls, file, *args, **kwargs
108+
):
103109
pass
104110

105111
@classmethod
106-
def read(cls, file, *args, **kwargs):
112+
def read( # pyright: ignore[reportIncompatibleMethodOverride]
113+
cls, file, *args, **kwargs
114+
):
107115
# tries to determine the requested size for# the file
108116
# reading in case none is defined the handled flag
109117
# handling is ignored and the data returned immediately
@@ -125,19 +133,23 @@ def read(cls, file, *args, **kwargs):
125133
return None
126134

127135
@classmethod
128-
def cleanup(cls, file, *args, **kwargs):
136+
def cleanup( # pyright: ignore[reportIncompatibleMethodOverride]
137+
cls, file, *args, **kwargs
138+
):
129139
if not hasattr(file, "handled"):
130140
return
131141
del file._handled
132142

133143
@classmethod
134-
def is_stored(self):
144+
def is_stored(cls): # pyright: ignore[reportIncompatibleMethodOverride]
135145
return True
136146

137147

138148
class FsEngine(StorageEngine):
139149
@classmethod
140-
def store(cls, file, *args, **kwargs):
150+
def store( # pyright: ignore[reportIncompatibleMethodOverride]
151+
cls, file, *args, **kwargs
152+
):
141153
file_path = cls._file_path(file)
142154
file_data = file.data or b""
143155
handle = open(file_path, "wb")
@@ -147,43 +159,54 @@ def store(cls, file, *args, **kwargs):
147159
handle.close()
148160

149161
@classmethod
150-
def load(cls, file, *args, **kwargs):
162+
def load( # pyright: ignore[reportIncompatibleMethodOverride]
163+
cls, file, *args, **kwargs
164+
):
151165
cls._compute(file)
152166

153167
@classmethod
154-
def delete(cls, file, *args, **kwargs):
168+
def delete( # pyright: ignore[reportIncompatibleMethodOverride]
169+
cls, file, *args, **kwargs
170+
):
155171
file_path = cls._file_path(file, ensure=False)
156172
os.remove(file_path)
157173

158174
@classmethod
159-
def read(cls, file, *args, **kwargs):
175+
def read( # pyright: ignore[reportIncompatibleMethodOverride]
176+
cls, file, *args, **kwargs
177+
):
160178
data = None
161179
size = kwargs.get("size", None)
162180
handle = cls._handle(file)
163181
try:
164182
data = handle.read(size or -1)
165183
finally:
166184
is_final = True if not size or not data else False
167-
is_final and cls.cleanup(file)
185+
if is_final:
186+
cls.cleanup(file)
168187
return data
169188

170189
@classmethod
171-
def seek(cls, file, *args, **kwargs):
190+
def seek( # pyright: ignore[reportIncompatibleMethodOverride]
191+
cls, file, *args, **kwargs
192+
):
172193
offset = kwargs.get("offset", None)
173194
if offset == None:
174195
return
175196
handle = cls._handle(file)
176197
handle.seek(offset)
177198

178199
@classmethod
179-
def cleanup(cls, file, *args, **kwargs):
200+
def cleanup( # pyright: ignore[reportIncompatibleMethodOverride]
201+
cls, file, *args, **kwargs
202+
):
180203
if not hasattr(file, "_handle"):
181204
return
182205
file._handle.close()
183206
del file._handle
184207

185208
@classmethod
186-
def is_seekable(self):
209+
def is_seekable(cls): # pyright: ignore[reportIncompatibleMethodOverride]
187210
return True
188211

189212
@classmethod
@@ -207,7 +230,7 @@ def _handle(cls, file):
207230
@classmethod
208231
def _file_path(cls, file, ensure=True, base=None):
209232
# verifies that the standard params value is defined and
210-
# if that's no the case defaults the value, then tries to
233+
# if that's not the case defaults the value, then tries to
211234
# retrieve a series of parameters for file path discovery
212235
params = file.params or {}
213236
file_path = params.get("file_path", None)

src/appier/storage.pyi

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
from typing import Any
2+
3+
from .typesf import File
4+
5+
class StorageEngine:
6+
@classmethod
7+
def load(cls, file: File, *args, **kwargs) -> None: ...
8+
@classmethod
9+
def store(cls, file: File, *args, **kwargs) -> None: ...
10+
@classmethod
11+
def delete(cls, file: File, *args, **kwargs) -> None: ...
12+
@classmethod
13+
def read(cls, file: File, *args, **kwargs) -> bytes | None: ...
14+
@classmethod
15+
def seek(cls, file: File, *args, **kwargs) -> None: ...
16+
@classmethod
17+
def cleanup(cls, file: File, *args, **kwargs) -> None: ...
18+
@classmethod
19+
def is_seekable(cls) -> bool: ...
20+
@classmethod
21+
def is_stored(cls) -> bool: ...
22+
@classmethod
23+
def _compute(cls, file: File, *args, **kwargs) -> None: ...
24+
25+
class BaseEngine(StorageEngine):
26+
@classmethod
27+
def load(cls, file: File, *args, **kwargs) -> None: ...
28+
@classmethod
29+
def store(cls, file: File, *args, **kwargs) -> None: ...
30+
@classmethod
31+
def delete(cls, file: File, *args, **kwargs) -> None: ...
32+
@classmethod
33+
def read(cls, file: File, *args, **kwargs) -> bytes | None: ...
34+
@classmethod
35+
def cleanup(cls, file: File, *args, **kwargs) -> None: ...
36+
@classmethod
37+
def is_stored(cls) -> bool: ...
38+
39+
class FsEngine(StorageEngine):
40+
@classmethod
41+
def store(cls, file: File, *args, **kwargs) -> None: ...
42+
@classmethod
43+
def load(cls, file: File, *args, **kwargs) -> None: ...
44+
@classmethod
45+
def delete(cls, file: File, *args, **kwargs) -> None: ...
46+
@classmethod
47+
def read(cls, file: File, *args, **kwargs) -> bytes | None: ...
48+
@classmethod
49+
def seek(cls, file: File, *args, **kwargs) -> None: ...
50+
@classmethod
51+
def cleanup(cls, file: File, *args, **kwargs) -> None: ...
52+
@classmethod
53+
def is_seekable(cls) -> bool: ...
54+
@classmethod
55+
def _compute(cls, file: File) -> None: ...
56+
@classmethod
57+
def _handle(cls, file: File) -> Any: ...
58+
@classmethod
59+
def _file_path(
60+
cls, file: File, ensure: bool = ..., base: str | None = ...
61+
) -> str: ...

src/appier/typesf.pyi

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
from typing import Any, Callable, IO, Iterator
2+
3+
class AbstractType:
4+
def json_v(self, *args, **kwargs) -> Any: ...
5+
def map_v(self, *args, **kwargs) -> Any: ...
6+
7+
class Type(AbstractType):
8+
def __init__(self, value: Any): ...
9+
def json_v(self, *args, **kwargs) -> Any: ...
10+
def loads(self, value: Any) -> None: ...
11+
def dumps(self) -> Any: ...
12+
13+
class File(AbstractType):
14+
data: bytes | None
15+
data_b64: str | None
16+
file: Any | None
17+
hash: str | None
18+
size: int
19+
file_name: str
20+
mime: str | None
21+
etag: str | None
22+
guid: str
23+
params: dict[str, Any] | None
24+
engine: str | None
25+
def __init__(self, file: Any): ...
26+
def __len__(self) -> int: ...
27+
@classmethod
28+
def open(cls, path: str) -> File: ...
29+
def build_d(self, file_d: bytes, name: str = ...) -> None: ...
30+
def build_b64(self, file_m: dict[str, Any]) -> None: ...
31+
def build_t(self, file_t: tuple[str, str | None, bytes | None]) -> None: ...
32+
def build_i(self, file: File) -> None: ...
33+
def build_f(self, file: Any) -> None: ...
34+
def read(self, size: int | None = ...) -> bytes | None: ...
35+
def seek(self, offset: int | None = ...) -> None: ...
36+
def delete(self) -> None: ...
37+
def cleanup(self) -> None: ...
38+
def save(self, path: str | None = ...) -> None: ...
39+
def json_v(self, *args, **kwargs) -> dict[str, Any] | None: ...
40+
def is_seekable(self) -> bool: ...
41+
def is_stored(self) -> bool: ...
42+
def is_valid(self) -> bool: ...
43+
def is_empty(self) -> bool: ...
44+
def _hash(self, data: bytes | None) -> str | None: ...
45+
def _etag(self, data: bytes | None) -> str | None: ...
46+
def _guid(self) -> str: ...
47+
def _load(self, force: bool = ...) -> None: ...
48+
def _store(self, force: bool = ...) -> None: ...
49+
def _compute(self) -> None: ...
50+
def _engine(self) -> Any: ...
51+
52+
class Files(AbstractType):
53+
_files: list[File]
54+
def __init__(self, files: Any): ...
55+
def __len__(self) -> int: ...
56+
def __iter__(self) -> Iterator[File]: ...
57+
def __getitem__(self, key: int) -> File: ...
58+
def base(self) -> type[File]: ...
59+
def build_i(self, files: Files) -> None: ...
60+
def build_f(self, files: Any) -> None: ...
61+
def json_v(self, *args, **kwargs) -> list[dict[str, Any]]: ...
62+
def is_empty(self) -> bool: ...
63+
def _load(self) -> None: ...
64+
65+
class ImageFile(File):
66+
width: int
67+
height: int
68+
format: str | None
69+
kwargs: dict[str, Any]
70+
def build_b64(self, file_m: dict[str, Any]) -> None: ...
71+
def build_t(self, file_t: tuple[str, str | None, bytes | None]) -> None: ...
72+
def build_i(self, file: File) -> None: ...
73+
def build_f(self, file: Any) -> None: ...
74+
def json_v(self, *args, **kwargs) -> dict[str, Any] | None: ...
75+
def _ensure_all(self) -> None: ...
76+
def _ensure_size(self) -> None: ...
77+
def _ensure_mime(self) -> None: ...
78+
def _ensure_kwargs(self) -> None: ...
79+
def _size(self) -> tuple[int, int]: ...
80+
def _size_image(self) -> tuple[int, int]: ...
81+
def _size_pil(self) -> tuple[int, int]: ...
82+
def _size_default(self) -> tuple[int, int]: ...
83+
def _mime(self) -> tuple[str | None, str]: ...
84+
def _mime_image(self) -> tuple[str | None, str]: ...
85+
def _mime_pil(self) -> tuple[str | None, str]: ...
86+
def _mime_default(self) -> tuple[str | None, str]: ...
87+
88+
class ImageFiles(Files):
89+
def base(self) -> type[ImageFile]: ...
90+
91+
def image(
92+
width: int | None = ..., height: int | None = ..., format: str = ..., **kwargs
93+
) -> type[ImageFile]: ...
94+
def images(
95+
width: int | None = ..., height: int | None = ..., format: str = ..., **kwargs
96+
) -> type[ImageFiles]: ...
97+
98+
class Reference(AbstractType): ...
99+
100+
def reference(
101+
target: Any, name: str | None = ..., dumpall: bool = ...
102+
) -> type[Reference]: ...

0 commit comments

Comments
 (0)