From a476c6eac4dccfb6cd63ba808691bc0f28f1fbfd Mon Sep 17 00:00:00 2001 From: Jon Michael Aanes Date: Wed, 2 Oct 2024 17:17:14 +0200 Subject: [PATCH] [FUSE]: Collection directories WIP --- favro_sync/favro_client.py | 13 +++++------ favro_sync/favro_fuse.py | 45 +++++++++++++++++++++++++++++--------- 2 files changed, 41 insertions(+), 17 deletions(-) diff --git a/favro_sync/favro_client.py b/favro_sync/favro_client.py index 9da0946..37e227a 100644 --- a/favro_sync/favro_client.py +++ b/favro_sync/favro_client.py @@ -16,6 +16,7 @@ from .favro_data_model import ( CustomFieldId, CustomFieldInfo, OrganizationId, + CollectionId, SeqId, TagId, TagInfo, @@ -115,9 +116,10 @@ class FavroClient: self, *, seq_id: SeqId | None = None, + collection_id: CollectionId | None = None, todo_list=False, ) -> Iterator[Card]: - request = self._get_cards_request(seq_id=seq_id,todo_list=todo_list) + request = self._get_cards_request(seq_id=seq_id,todo_list=todo_list,collection_id=collection_id) yield from self._get_paginated(request, Card.from_json) def get_collections(self) -> Iterator[Collection]: @@ -134,18 +136,15 @@ class FavroClient: self, seq_id: SeqId | None = None, todo_list: bool = False, - request_id: None | str = None, - page: None | int = None, + collection_id: CollectionId | None = None, ) -> requests.Request: params = {'descriptionFormat': 'markdown'} if seq_id is not None: params['cardSequentialId'] = str(seq_id.raw_id) if todo_list is True: params['todoList'] = 'true' - if request_id: - params['requestId'] = request_id - if page: - params['page'] = page + if collection_id is not None: + params['collectionId'] = str(collection_id.raw_id) return requests.Request('GET', URL_GET_CARDS, params=params) diff --git a/favro_sync/favro_fuse.py b/favro_sync/favro_fuse.py index d92124f..c257a47 100644 --- a/favro_sync/favro_fuse.py +++ b/favro_sync/favro_fuse.py @@ -104,14 +104,19 @@ class RootFileSystemItem(FileSystemItem): def from_path_segment(segment: str) -> 'RootFileSystemItem': return RootFileSystemItem() + def __str__(self): + return '/' + @dataclasses.dataclass(frozen=True) -class OrganizationFileSystemItem(FileSystemItem): - name: str +class CollectionFileSystemItem(FileSystemItem): + collection_name: str @staticmethod - def from_path_segment(segment: str) -> 'OrganizationFileSystemItem': - return OrganizationFileSystemItem(segment) + def from_path_segment(segment: str) -> 'CollectionFileSystemItem': + return CollectionFileSystemItem(segment) + def __str__(self): + return self.collection_name @dataclasses.dataclass(frozen=True) class CardFileSystemItem(FileSystemItem): @@ -123,6 +128,9 @@ class CardFileSystemItem(FileSystemItem): return CardFileSystemItem(SeqId(int(m.group(1)))) return None + def __str__(self): + return CARD_FILENAME_FORMAT.format(seq_id=self.seq_id.raw_id) + def path_to_file_system_item(path_str: str, path_components: list[type[FileSystemItem]]) -> FileSystemItem | None: path = re.findall(r'[^/]+', path_str) @@ -142,15 +150,15 @@ class FavroFuse(fuse.Fuse): self.favro_client = favro_client self.formatter = formatter self.wiped_cards = set() - #self.path_components = [RootFileSystemItem, OrganizationFileSystemItem, CardFileSystemItem] - self.path_components = [RootFileSystemItem, CardFileSystemItem] + self.path_components = [RootFileSystemItem, CollectionFileSystemItem, CardFileSystemItem] super().__init__(**kwargs) def getattr(self, path: str) -> FavroStat | int: file_system_item = path_to_file_system_item(path, self.path_components) + print(file_system_item ) st = FavroStat() - if isinstance(file_system_item, RootFileSystemItem): + if isinstance(file_system_item, RootFileSystemItem | CollectionFileSystemItem): st.st_mode = stat.S_IFDIR | 0o755 st.st_nlink = 2 elif isinstance(file_system_item, CardFileSystemItem): @@ -166,12 +174,29 @@ class FavroFuse(fuse.Fuse): return st def readdir(self, path: str, offset: int) -> Iterator[fuse.Direntry]: - logger.warning('readdir(path=%s, offset=%s)', path, offset) + file_system_item = path_to_file_system_item(path, self.path_components) + yield fuse.Direntry('.') yield fuse.Direntry('..') - for card in self.favro_client.get_todo_list_cards(): - yield fuse.Direntry(CARD_FILENAME_FORMAT.format(seq_id=card.seq_id.raw_id)) + if isinstance(file_system_item, RootFileSystemItem): + for collection in self.favro_client.get_collections(): + print(collection) + yield fuse.Direntry(str(CollectionFileSystemItem(collection.name))) + del collection + elif isinstance(file_system_item, CollectionFileSystemItem): + + # TODO: move into own function + for collection in self.favro_client.get_collections(): + if collection.name == file_system_item.collection_name: + collection_id = collection.collection_id + del collection + + print('Collection', collection_id) + + for card in self.favro_client.get_cards(collection_id=collection_id): + yield fuse.Direntry(str(CardFileSystemItem(card.seq_id))) + del card def open(self, path: str, flags: int) -> int | None: file_system_item = path_to_file_system_item(path, self.path_components)