Skip to content

Commit fbce09c

Browse files
authored
refactor: better type hints for vault (#20)
1 parent 3eefc0a commit fbce09c

5 files changed

Lines changed: 18 additions & 13 deletions

File tree

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ license = "Apache-2.0"
3434
license-files = ["LICENSE"]
3535
readme = "README.md"
3636
requires-python = ">=3.11"
37-
version = "2.3.0"
37+
version = "2.3.1"
3838

3939
[project.optional-dependencies]
4040
cli = [

src/mega/data_structures.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929

3030
NodeKey = tuple[int, int, int, int]
3131
ComposedFileKey = tuple[int, int, int, int, int, int, int, int]
32-
ComposedFolderKey = tuple[int, int, int, int]
3332

3433

3534
class ByteSize(int):
@@ -182,7 +181,7 @@ class Crypto(_DictDumper):
182181
iv: tuple[int, int]
183182
meta_mac: tuple[int, int]
184183

185-
full_key: ComposedFileKey | ComposedFolderKey
184+
full_key: ComposedFileKey | NodeKey
186185
share_key: NodeKey | None
187186

188187
@classmethod
@@ -206,19 +205,18 @@ def compose(
206205
raise RuntimeError(f"Invalid key, expected key len for files is 8, got {len(composed_key) = }")
207206

208207
else:
209-
if len(key) != 4:
210-
raise RuntimeError(f"Invalid key, expected key len for folders is 4, got {len(key) = }")
211-
212208
iv = ()
213209
meta_mac = ()
214210
composed_key = key
211+
if len(composed_key) != 4:
212+
raise RuntimeError(f"Invalid key, expected key len for folders is 4, got {len(composed_key) = }")
215213

216214
return Crypto(key, iv, meta_mac, composed_key, None) # pyright: ignore[reportArgumentType]
217215

218216
@classmethod
219217
def decompose(
220218
cls,
221-
composed_key: ComposedFileKey | ComposedFolderKey,
219+
composed_key: ComposedFileKey | NodeKey,
222220
node_type: NodeType = NodeType.FILE,
223221
share_key: NodeKey | None = None,
224222
) -> Crypto:

src/mega/vault.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
from __future__ import annotations
22

33
import dataclasses
4-
from typing import TYPE_CHECKING, Final, cast
4+
from typing import TYPE_CHECKING, Final, NamedTuple, cast
55

66
from mega.crypto import b64_to_a32, decrypt_key
77

88
if TYPE_CHECKING:
99
from mega.data_structures import (
1010
ComposedFileKey,
11-
ComposedFolderKey,
1211
GetNodesResponse,
1312
Node,
1413
NodeID,
14+
NodeKey,
1515
SharedKeys,
1616
UserID,
1717
)
@@ -21,6 +21,11 @@
2121
# An special owner used for exported (AKA public) file/folders
2222

2323

24+
class KeyLookup(NamedTuple):
25+
full_key: ComposedFileKey | NodeKey
26+
share_key: NodeKey | None
27+
28+
2429
@dataclasses.dataclass(slots=True, frozen=True)
2530
class MegaVault:
2631
master_key: tuple[int, ...] = ()
@@ -43,7 +48,7 @@ def update(self, api_resp: GetNodesResponse) -> None:
4348
if key := new_keys.get(node_id):
4449
self._shared_keys.setdefault(owner, {})[node_id] = key
4550

46-
def __getitem__(self, node: Node) -> tuple[ComposedFileKey | ComposedFolderKey, tuple[int, ...] | None]:
51+
def __getitem__(self, node: Node) -> KeyLookup:
4752
share_key: tuple[int, ...] | None = None
4853

4954
# my files/folders
@@ -74,7 +79,7 @@ def __getitem__(self, node: Node) -> tuple[ComposedFileKey | ComposedFolderKey,
7479
if len(full_key) not in (4, 8):
7580
raise RuntimeError(f"Invalid key len found for node {node.id} ({len(full_key)})")
7681

77-
return cast("ComposedFileKey | ComposedFolderKey", full_key), share_key
82+
return KeyLookup(cast("ComposedFileKey | NodeKey", full_key), share_key)
7883

7984
def save_public_key(self, node_id: NodeID, share_key: tuple[int, ...]) -> None:
8085
self._shared_keys[_EXPORTED][node_id] = share_key

tests/test_deserialization.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,9 @@ def test_attributes_serialization(attrs: AttributesSerialized, extras: tuple[str
9191

9292
def test_storage_metrics() -> None:
9393
metrics = StorageMetrics.parse([35342640609, 2088, 33, 0, 0])
94-
assert metrics
94+
assert metrics.bytes_used == 35342640609
95+
assert metrics.files == 2088
96+
assert metrics.folders == 33
9597

9698

9799
def test_storage_quota() -> None:

uv.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)