1
0
This commit is contained in:
Jon Michael Aanes 2024-11-28 23:27:15 +01:00
parent fb7c53b3ae
commit 81dd0d19df
Signed by: Jmaa
SSH Key Fingerprint: SHA256:Ab0GfHGCblESJx7JRE4fj4bFy/KRpeLhi41y4pF3sNA
5 changed files with 56 additions and 31 deletions

View File

@ -125,7 +125,8 @@ class FavroClient:
yield from self._get_paginated(request, Collection.from_json) yield from self._get_paginated(request, Collection.from_json)
def _get_cards_prepared_request( def _get_cards_prepared_request(
self, **kwargs, self,
**kwargs,
) -> requests.PreparedRequest: ) -> requests.PreparedRequest:
request = self._get_cards_request(**kwargs) request = self._get_cards_request(**kwargs)
return self.session.prepare_request(request) return self.session.prepare_request(request)
@ -228,7 +229,9 @@ class FavroClient:
self._invalidate_cache(card_id) self._invalidate_cache(card_id)
return self.update_card_contents_locally(card_id, card_contents) return self.update_card_contents_locally(card_id, card_contents)
def _get_paginated(self, base_request: requests.Request, entity_from_json) -> Iterator: def _get_paginated(
self, base_request: requests.Request, entity_from_json,
) -> Iterator:
page = 0 page = 0
request_id = None request_id = None
num_pages = 1 num_pages = 1

View File

@ -163,7 +163,9 @@ class CustomFieldInfo:
enabled: bool enabled: bool
custom_field_items: list[CustomFieldItem] custom_field_items: list[CustomFieldItem]
def get_field_item(self, field_item_id: CustomFieldItemId) -> CustomFieldItem | None: def get_field_item(
self, field_item_id: CustomFieldItemId,
) -> CustomFieldItem | None:
for item in self.custom_field_items: for item in self.custom_field_items:
if item.custom_field_item_id == field_item_id: if item.custom_field_item_id == field_item_id:
return item return item
@ -178,7 +180,9 @@ class CustomFieldInfo:
type=json['type'], type=json['type'],
name=json['name'], name=json['name'],
enabled=json['enabled'], enabled=json['enabled'],
custom_field_items=[CustomFieldItem.from_json(f) for f in json.get('customFieldItems', [])], custom_field_items=[
CustomFieldItem.from_json(f) for f in json.get('customFieldItems', [])
],
) )
@ -243,6 +247,7 @@ class Task:
position=json['position'], position=json['position'],
) )
@dataclasses.dataclass(frozen=True) @dataclasses.dataclass(frozen=True)
class Collection: class Collection:
collection_id: CollectionId collection_id: CollectionId
@ -267,6 +272,7 @@ class Collection:
widget_common_id=map_opt(WidgetCommonId, json.get('widgetCommonId')), widget_common_id=map_opt(WidgetCommonId, json.get('widgetCommonId')),
) )
@dataclasses.dataclass(frozen=True) @dataclasses.dataclass(frozen=True)
class Card: class Card:
card_id: CardId card_id: CardId

View File

@ -8,7 +8,13 @@ from logging import getLogger
import fuse import fuse
from .favro_client import FavroClient from .favro_client import FavroClient
from .favro_data_model import Card, SeqId, CustomFieldInfo, CustomFieldItemId, CustomField from .favro_data_model import (
Card,
CustomField,
CustomFieldInfo,
CustomFieldItemId,
SeqId,
)
from .favro_markdown import CardContents, CardFileFormatter from .favro_markdown import CardContents, CardFileFormatter
################################################################################ ################################################################################
@ -26,6 +32,7 @@ CARD_FILENAME_REGEX = r'^PAR\-(\d+)\.md$'
################################################################################ ################################################################################
# Formatting # Formatting
def to_custom_field_value(custom_field: CustomField, field_def: CustomFieldInfo) -> str: def to_custom_field_value(custom_field: CustomField, field_def: CustomFieldInfo) -> str:
value: CustomFieldItemId | list[CustomFieldItemId] = custom_field.value value: CustomFieldItemId | list[CustomFieldItemId] = custom_field.value
if field_def.type in {'Single select', 'Multiple select'}: if field_def.type in {'Single select', 'Multiple select'}:
@ -36,14 +43,18 @@ def to_custom_field_value(custom_field: CustomField, field_def: CustomFieldInfo)
return custom_field.color return custom_field.color
assert False, 'Unknown type: ' + field_def.type assert False, 'Unknown type: ' + field_def.type
def to_custom_fields(card: Card, favro_client: FavroClient) -> dict[str, str]: def to_custom_fields(card: Card, favro_client: FavroClient) -> dict[str, str]:
custom_fields = {} custom_fields = {}
for field_assignment in card.custom_fields: for field_assignment in card.custom_fields:
field_def = favro_client.get_custom_field(field_assignment.custom_field_id) field_def = favro_client.get_custom_field(field_assignment.custom_field_id)
custom_fields[field_def.name] = to_custom_field_value(field_assignment, field_def) custom_fields[field_def.name] = to_custom_field_value(
field_assignment, field_def,
)
del field_assignment del field_assignment
return custom_fields return custom_fields
def to_card_contents(card: Card, favro_client: FavroClient) -> str: def to_card_contents(card: Card, favro_client: FavroClient) -> str:
tags = [favro_client.get_tag(tag_id).name for tag_id in card.tags] tags = [favro_client.get_tag(tag_id).name for tag_id in card.tags]
assignments = [ assignments = [
@ -78,6 +89,7 @@ def to_card_contents(card: Card, favro_client: FavroClient) -> str:
################################################################################ ################################################################################
# FUSE # FUSE
class FavroStat(fuse.Stat): class FavroStat(fuse.Stat):
def __init__(self): def __init__(self):
self.st_mode = 0 self.st_mode = 0
@ -99,11 +111,11 @@ class FileSystemItem:
@dataclasses.dataclass(frozen=True) @dataclasses.dataclass(frozen=True)
class RootFileSystemItem(FileSystemItem): class RootFileSystemItem(FileSystemItem):
@staticmethod @staticmethod
def from_path_segment(segment: str) -> 'RootFileSystemItem': def from_path_segment(segment: str) -> 'RootFileSystemItem':
return RootFileSystemItem() return RootFileSystemItem()
@dataclasses.dataclass(frozen=True) @dataclasses.dataclass(frozen=True)
class OrganizationFileSystemItem(FileSystemItem): class OrganizationFileSystemItem(FileSystemItem):
name: str name: str
@ -124,7 +136,9 @@ class CardFileSystemItem(FileSystemItem):
return None return None
def path_to_file_system_item(path_str: str, path_components: list[type[FileSystemItem]]) -> FileSystemItem | None: def path_to_file_system_item(
path_str: str, path_components: list[type[FileSystemItem]],
) -> FileSystemItem | None:
path = re.findall(r'[^/]+', path_str) path = re.findall(r'[^/]+', path_str)
component = path_components[len(path)] component = path_components[len(path)]
return component.from_path_segment(path[-1] if path else None) return component.from_path_segment(path[-1] if path else None)

View File

@ -1,6 +1,6 @@
import pytest import pytest
import requests_cache import requests_cache
from favro_sync import secrets from favro_sync import secrets
from favro_sync.favro_client import FavroClient, OrganizationId, SeqId from favro_sync.favro_client import FavroClient, OrganizationId, SeqId
@ -50,6 +50,7 @@ def test_get_cards():
for card in client.get_cards(todo_list=True): for card in client.get_cards(todo_list=True):
assert_valid_card(card) assert_valid_card(card)
@needs_secrets @needs_secrets
def test_get_collections(): def test_get_collections():
client = create_client() client = create_client()
@ -62,6 +63,7 @@ def test_get_collections():
assert collection.is_archived is not None assert collection.is_archived is not None
assert collection.widget_common_id is None assert collection.widget_common_id is None
def create_client(): def create_client():
session = requests_cache.CachedSession('output/test-http-cache.sqlite') session = requests_cache.CachedSession('output/test-http-cache.sqlite')
return FavroClient( return FavroClient(