diff --git a/faststack/app.py b/faststack/app.py index d18f96a..31e1502 100644 --- a/faststack/app.py +++ b/faststack/app.py @@ -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 @@ -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), @@ -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) @@ -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, } @@ -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) @@ -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: @@ -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): diff --git a/faststack/io/sidecar.py b/faststack/io/sidecar.py index 8137852..2491208 100644 --- a/faststack/io/sidecar.py +++ b/faststack/io/sidecar.py @@ -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