108 lines
2.6 KiB
Python
108 lines
2.6 KiB
Python
from typing import Protocol, runtime_checkable, Optional, Dict, List, Self, NamedTuple, Iterable, MappingView
|
|
from uuid import UUID
|
|
from pathlib import PurePosixPath
|
|
|
|
|
|
type ObjectId = int
|
|
|
|
NODE_ROOT_ID: ObjectId = 1
|
|
|
|
class BadNoteType(TypeError):
|
|
"""Raised when an invalid note type is encountered."""
|
|
|
|
class TreeExists(TypeError):
|
|
"""Raised when a label already exists."""
|
|
|
|
class NoteNotFound(KeyError):
|
|
"""Raised when a note is not found."""
|
|
|
|
@runtime_checkable
|
|
class Note(Protocol):
|
|
"""
|
|
Protocol for a Note item.
|
|
Represents access to an individual note's content and metadata.
|
|
"""
|
|
@property
|
|
def object_id(self) -> ObjectId:
|
|
"""The unique identifier for this note."""
|
|
...
|
|
|
|
def get_raw_metadata(self, key: str) -> Optional[bytes]:
|
|
"""Retrieve metadata value for the given key."""
|
|
...
|
|
|
|
def set_raw_metadata(self, key: str, value: bytes) -> None:
|
|
"""Set metadata value for the given key."""
|
|
...
|
|
|
|
@runtime_checkable
|
|
class Blob(Protocol):
|
|
def read(self) -> bytes:
|
|
"""Read the raw content of the note."""
|
|
...
|
|
|
|
def write(self, data: bytes) -> None:
|
|
"""Write new content to the note."""
|
|
...
|
|
|
|
|
|
class TreeEntry(NamedTuple):
|
|
name: str
|
|
object_id: ObjectId
|
|
|
|
@runtime_checkable
|
|
class Tree(Protocol):
|
|
def link(self, name: str, note: Note):
|
|
"""Link name to a given note."""
|
|
...
|
|
|
|
def unlink(self, name: str):
|
|
"""Remove name from the tree."""
|
|
...
|
|
|
|
def mkdir(self, name: str) -> Self:
|
|
"""Create a new Tree with the given name."""
|
|
...
|
|
|
|
def rmdir(self, name: str) -> None:
|
|
"""Remove a directory from the tree."""
|
|
...
|
|
|
|
def child(self, name: str) -> Note:
|
|
"""Retrieve a child note by name."""
|
|
...
|
|
|
|
def entries(self) -> Iterable[TreeEntry]:
|
|
"""Return all entries in the directory"""
|
|
...
|
|
|
|
def list(self) -> dict[str, int]:
|
|
"""Return all entries as {name: object_id}."""
|
|
...
|
|
|
|
class BlobNote(Note, Blob):
|
|
"""Blob Note"""
|
|
|
|
class TreeNote(Note, Tree):
|
|
"""Tree Note"""
|
|
|
|
|
|
|
|
@runtime_checkable
|
|
class Trove(Protocol):
|
|
"""
|
|
Protocol for the Trove database API.
|
|
Provides high-level access to notes and trees.
|
|
"""
|
|
|
|
def get_raw_note(self, note: ObjectId) -> Note:
|
|
"""Retrieve a note by a object id"""
|
|
...
|
|
|
|
def create_blob(self, data: bytes | None = None) -> BlobNote:
|
|
"""Create a new blob node at the given path with content"""
|
|
...
|
|
|
|
def get_root(self) -> TreeNote:
|
|
"""Get Tree Node at the given path"""
|
|
...
|