Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 9 additions & 22 deletions faststack/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -1793,15 +1793,9 @@ def jump_to_last_uploaded(self):
for idx in range(len(self.image_files) - 1, -1, -1):
img = self.image_files[idx]
# Dynamic look-up of self.sidecar as requested (important for mocks in tests)
meta = self.sidecar.get_metadata(img.path.stem)
meta = self.sidecar.get_metadata(img.path.stem, create=False)

# Robust extraction of 'uploaded' flag: handle both object and dict formats.
# Mock-safety: must evaluate False if it's a MagicMock (test requirement).
# We explicitly check for boolean True.
if isinstance(meta, dict):
uploaded = meta.get("uploaded")
else:
uploaded = getattr(meta, "uploaded", None)
uploaded = meta.uploaded

if uploaded is True:
last_uploaded_index = idx
Expand Down Expand Up @@ -2120,7 +2114,7 @@ def _on_thumbnail_ready_gui(self, thumbnail_id: str):
def _get_metadata_dict(self, stem: str) -> dict:
"""Get metadata for a file stem as a dict for thumbnail model."""
try:
meta = self.sidecar.get_metadata(stem)
meta = self.sidecar.get_metadata(stem, create=False)
return {
"stacked": getattr(meta, "stacked", False),
"uploaded": getattr(meta, "uploaded", False),
Expand Down Expand Up @@ -2351,7 +2345,7 @@ def get_current_metadata(self) -> Dict:

# Compute and cache
stem = self.image_files[self.current_index].path.stem
meta = self.sidecar.get_metadata(stem)
meta = self.sidecar.get_metadata(stem, create=False)
stack_info = self._get_stack_info(self.current_index)
batch_info = self._get_batch_info(self.current_index)

Expand Down Expand Up @@ -2388,7 +2382,7 @@ def get_current_metadata(self) -> Dict:
"restacked_date": meta.restacked_date or "",
"favorite": meta.favorite,
"todo": getattr(meta, "todo", False),
"todo_date": getattr(meta, "todo_date", None) or "",
"todo_date": getattr(meta, "todo_date", "") or "",
"stack_info_text": stack_info,
"batch_info_text": batch_info,
}
Expand Down Expand Up @@ -2612,7 +2606,7 @@ def add_favorites_to_batch(self):
# Find indices of all favorited images
indices_to_add = []
for i, img in enumerate(self.image_files):
meta = self.sidecar.get_metadata(img.path.stem)
meta = self.sidecar.get_metadata(img.path.stem, create=False)
if meta.favorite:
indices_to_add.append(i)

Expand Down Expand Up @@ -2667,15 +2661,8 @@ def add_uploaded_to_batch(self):
# Find indices of all uploaded images
indices_to_add = []
for i, img in enumerate(self.image_files):
meta = self.sidecar.get_metadata(img.path.stem)
if not meta:
continue
uploaded = (
meta.get("uploaded", False)
if isinstance(meta, dict)
else getattr(meta, "uploaded", False)
)
if uploaded:
meta = self.sidecar.get_metadata(img.path.stem, create=False)
if meta.uploaded:
indices_to_add.append(i)

if not indices_to_add:
Expand Down Expand Up @@ -7374,7 +7361,7 @@ def is_stacked(self) -> bool:
if not self.image_files or self.current_index >= len(self.image_files):
return False
stem = self.image_files[self.current_index].path.stem
meta = self.sidecar.get_metadata(stem)
meta = self.sidecar.get_metadata(stem, create=False)
return meta.stacked

def _update_cache_stats(self):
Expand Down
10 changes: 7 additions & 3 deletions faststack/io/sidecar.py
Original file line number Diff line number Diff line change
Expand Up @@ -118,9 +118,13 @@ def save(self):
if was_watcher_running:
self.start_watcher()

def get_metadata(self, image_stem: str) -> EntryMetadata:
"""Gets metadata for an image, creating it if it doesn't exist."""
return self.data.entries.setdefault(image_stem, EntryMetadata())
def get_metadata(self, image_stem: str, *, create: bool = True) -> EntryMetadata:
"""Get metadata for an image, optionally creating a persistent entry."""
meta = self.data.entries.get(image_stem)
if meta is None and create:
meta = EntryMetadata()
self.data.entries[image_stem] = meta
return meta if meta is not None else EntryMetadata()

def set_last_index(self, index: int):
self.data.last_index = index