Source code for platypush.plugins.notes._model

from dataclasses import dataclass, field
from enum import Enum
from typing import Any, Dict, Iterable

from platypush.common.notes import Note, NoteCollection, Serializable, Storable


@dataclass
class NotesDelta:
    """
    Represents a delta of changes in notes.
    """

    added: Dict[Any, Note] = field(default_factory=dict)
    updated: Dict[Any, Note] = field(default_factory=dict)
    deleted: Dict[Any, Note] = field(default_factory=dict)

    def is_empty(self) -> bool:
        """
        Check if the delta is empty (no added, updated, or deleted notes).
        """
        return not (self.added or self.updated or self.deleted)

    def __str__(self):
        """
        String representation of the NotesDelta.
        """
        return (
            f'NotesDelta(added={len(self.added)}, '
            f'updated={len(self.updated)}, '
            f'deleted={len(self.deleted)})'
        )


@dataclass
class CollectionsDelta:
    """
    Represents a delta of changes in note collections.
    """

    added: Dict[Any, NoteCollection] = field(default_factory=dict)
    updated: Dict[Any, NoteCollection] = field(default_factory=dict)
    deleted: Dict[Any, NoteCollection] = field(default_factory=dict)

    def is_empty(self) -> bool:
        """
        Check if the delta is empty (no added, updated, or deleted collections).
        """
        return not (self.added or self.updated or self.deleted)

    def __str__(self):
        """
        String representation of the CollectionsDelta.
        """
        return (
            f'CollectionsDelta(added={len(self.added)}, '
            f'updated={len(self.updated)}, '
            f'deleted={len(self.deleted)})'
        )


@dataclass
class StateDelta:
    """
    Represents a delta of changes in the state of notes and collections.
    """

    notes: NotesDelta = field(default_factory=NotesDelta)
    collections: CollectionsDelta = field(default_factory=CollectionsDelta)
    latest_updated_at: float = 0

    def is_empty(self) -> bool:
        """
        Check if the state delta is empty (no changes in notes or collections).
        """
        return self.notes.is_empty() and self.collections.is_empty()

    def __str__(self):
        """
        String representation of the StateDelta.
        """
        return (
            f'StateDelta(notes={self.notes}, '
            f'collections={self.collections}, '
            f'latest_updated_at={self.latest_updated_at})'
        )


[docs] class ItemType(Enum): """ Enum representing the type of item. """ NOTE = 'note' COLLECTION = 'collection' TAG = 'tag'
[docs] @dataclass class Item(Serializable): """ Represents a generic note item. """ type: ItemType item: Storable def __post_init__(self): """ Validate the item type after initialization. """ if not isinstance(self.type, ItemType): raise ValueError(f'Invalid item type: {self.type}')
[docs] def to_dict(self) -> Dict[str, Any]: """ Convert the item to a dictionary representation. """ return { 'type': self.type.value, 'item': self.item.to_dict(), }
[docs] @dataclass class Results(Serializable): """ Represents a collection of results, which can include notes, collections, and tags. """ items: Iterable[Item] = field(default_factory=list) has_more: bool = False
[docs] def to_dict(self) -> Dict[str, Any]: """ Convert the results to a dictionary representation. """ return { 'results': [item.to_dict() for item in self.items], 'has_more': self.has_more, }
[docs] @dataclass class ApiSettings: """ Represents plugin-specific API settings. """ supports_notes_limit: bool = False supports_notes_offset: bool = False supports_collections_limit: bool = False supports_collections_offset: bool = False supports_search_limit: bool = False supports_search_offset: bool = False supports_search: bool = False
class ResultsType(Enum): """ Enum representing the type of results. """ NOTES = 'notes' COLLECTIONS = 'collections' SEARCH = 'search'