Skip to content

Commit bd0435d

Browse files
committed
Fix geometry handling in BaseDataPanel to use unified format and update tests for consistency
1 parent ba88a87 commit bd0435d

5 files changed

Lines changed: 65 additions & 83 deletions

File tree

datalab/adapters_plotpy/objects/base.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
TypeObj,
2626
)
2727

28+
from datalab.adapters_metadata import GeometryAdapter
2829
from datalab.adapters_plotpy.base import (
2930
config_annotated_shape,
3031
items_to_json,
@@ -134,9 +135,7 @@ def iterate_shape_items(self, editable: bool = False):
134135
self.obj, fmt=fmt, lbl=lbl, editable=False
135136
)
136137
# Process geometry results from metadata (using GeometryAdapter)
137-
elif key.startswith("Geometry_") and key.endswith("_array"):
138-
# pylint: disable=import-outside-toplevel
139-
from datalab.adapters_metadata import GeometryAdapter
138+
elif GeometryAdapter.match(key, _value):
140139
from datalab.adapters_plotpy.objects.scalar import GeometryPlotPyAdapter
141140

142141
try:

datalab/adapters_plotpy/objects/scalar.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ def iterate_plot_items(
187187
Yields:
188188
Plot item
189189
"""
190-
for coords in self.result_adapter.raw_data:
190+
for coords in self.result_adapter.result.coords:
191191
yield self.create_shape_item(coords, fmt, lbl, option)
192192

193193
def create_shape_item(

datalab/gui/panel/base.py

Lines changed: 47 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -745,85 +745,65 @@ def _rename_results_in_clipboard(self, prefix: str) -> None:
745745
Args:
746746
prefix: Prefix to add to result titles
747747
"""
748-
# Handle geometry results
748+
# Handle geometry results (new unified format)
749749
geometry_keys = [
750750
k
751-
for k in self.__metadata_clipboard.keys()
752-
if k.startswith("Geometry_") and k.endswith("_array")
751+
for k, v in self.__metadata_clipboard.items()
752+
if GeometryAdapter.match(k, v)
753753
]
754754

755-
for array_key in geometry_keys:
755+
for dict_key in geometry_keys:
756756
try:
757-
# Extract title from key: "Geometry_title_array" -> "title"
758-
title = array_key[9:-6] # Remove "Geometry_" and "_array"
757+
# Get the geometry data
758+
geometry_data = self.__metadata_clipboard[dict_key]
759+
760+
# Update the title in the geometry data
761+
if isinstance(geometry_data, dict) and "title" in geometry_data:
762+
new_title = prefix + geometry_data["title"]
763+
geometry_data = geometry_data.copy() # Don't modify original
764+
geometry_data["title"] = new_title
765+
766+
# Create new key with updated title
767+
new_dict_key = (
768+
f"{GeometryAdapter.META_PREFIX}{new_title}"
769+
f"{GeometryAdapter.SUFFIX}"
770+
)
759771

760-
# Find all related keys for this geometry result
761-
title_key = f"Geometry_{title}_title"
762-
shape_key = f"Geometry_{title}_shape"
772+
# Remove old entry and add new one
773+
del self.__metadata_clipboard[dict_key]
774+
self.__metadata_clipboard[new_dict_key] = geometry_data
763775

764-
if (
765-
title_key in self.__metadata_clipboard
766-
and shape_key in self.__metadata_clipboard
767-
):
768-
# Get the values
769-
array_val = self.__metadata_clipboard[array_key]
770-
title_val = self.__metadata_clipboard[title_key]
771-
shape_val = self.__metadata_clipboard[shape_key]
772-
773-
# Create new keys with prefix
774-
new_title = prefix + title_val
775-
new_array_key = f"Geometry_{new_title}_array"
776-
new_title_key = f"Geometry_{new_title}_title"
777-
new_shape_key = f"Geometry_{new_title}_shape"
778-
779-
# Remove old entries
780-
del self.__metadata_clipboard[array_key]
781-
del self.__metadata_clipboard[title_key]
782-
del self.__metadata_clipboard[shape_key]
783-
784-
# Add new entries
785-
self.__metadata_clipboard[new_array_key] = array_val
786-
self.__metadata_clipboard[new_title_key] = new_title
787-
self.__metadata_clipboard[new_shape_key] = shape_val
788-
789-
except (KeyError, ValueError, IndexError):
776+
except (KeyError, ValueError, IndexError, TypeError):
790777
# If we can't process this geometry result, leave it as is
791778
continue
779+
continue
792780

793-
# Handle table results (similar logic)
781+
# Handle table results (new unified format)
794782
table_keys = [
795-
k
796-
for k in self.__metadata_clipboard.keys()
797-
if k.startswith("Table_") and k.endswith("_array")
783+
k for k, v in self.__metadata_clipboard.items() if TableAdapter.match(k, v)
798784
]
799785

800-
for array_key in table_keys:
786+
for data_key in table_keys:
801787
try:
802-
# Extract title from key: "Table_title_array" -> "title"
803-
title = array_key[6:-6] # Remove "Table_" and "_array"
804-
805-
# Find all related keys for this table result
806-
title_key = f"Table_{title}_title"
807-
808-
if title_key in self.__metadata_clipboard:
809-
# Get the values
810-
array_val = self.__metadata_clipboard[array_key]
811-
title_val = self.__metadata_clipboard[title_key]
812-
813-
# Create new keys with prefix
814-
new_title = prefix + title_val
815-
new_array_key = f"Table_{new_title}_array"
816-
new_title_key = f"Table_{new_title}_title"
817-
818-
# Remove old entries
819-
del self.__metadata_clipboard[array_key]
820-
del self.__metadata_clipboard[title_key]
788+
# Get the table data
789+
table_data = self.__metadata_clipboard[data_key]
790+
791+
# Update the title in the table data
792+
if isinstance(table_data, dict) and "title" in table_data:
793+
new_title = prefix + table_data["title"]
794+
table_data = table_data.copy() # Don't modify original
795+
table_data["title"] = new_title
796+
797+
# Create new key with updated title
798+
new_data_key = (
799+
f"{TableAdapter.META_PREFIX}{new_title}{TableAdapter.SUFFIX}"
800+
)
821801

822-
# Add new entries
823-
self.__metadata_clipboard[new_array_key] = array_val
824-
self.__metadata_clipboard[new_title_key] = new_title
802+
# Remove old entry and add new one
803+
del self.__metadata_clipboard[data_key]
804+
self.__metadata_clipboard[new_data_key] = table_data
825805

826-
except (KeyError, ValueError, IndexError):
806+
except (KeyError, ValueError, IndexError, TypeError):
827807
# If we can't process this table result, leave it as is
828808
continue
829809

@@ -845,17 +825,17 @@ def paste_metadata(self, param: PasteMetadataParam | None = None) -> None:
845825
metadata[ROI_KEY] = self.__metadata_clipboard[ROI_KEY]
846826
if param.keep_geometry:
847827
for key, value in self.__metadata_clipboard.items():
848-
if key.startswith("Geometry_"):
828+
if GeometryAdapter.match(key, value):
849829
metadata[key] = value
850830
if param.keep_tables:
851831
for key, value in self.__metadata_clipboard.items():
852-
if key.startswith("Table_"):
832+
if TableAdapter.match(key, value):
853833
metadata[key] = value
854834
if param.keep_other:
855835
for key, value in self.__metadata_clipboard.items():
856836
if (
857-
not key.startswith("Geometry_")
858-
and not key.startswith("Table_")
837+
not GeometryAdapter.match(key, value)
838+
and not TableAdapter.match(key, value)
859839
and key not in (ROI_KEY,)
860840
):
861841
metadata[key] = value

datalab/tests/features/common/metadata_app_test.py

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import sigima.proc.signal as sigima_signal
1818
from sigima.tests.data import create_paracetamol_signal
1919

20+
from datalab.adapters_metadata.geometry_adapter import GeometryAdapter
2021
from datalab.env import execenv
2122
from datalab.gui.panel.base import BaseDataPanel, PasteMetadataParam
2223
from datalab.gui.panel.image import ImagePanel
@@ -57,7 +58,9 @@ def __test_metadata_features(panel: BaseDataPanel):
5758
source_metadata = source_obj.metadata.copy()
5859

5960
# Verify source object has geometry results
60-
geometry_keys = [k for k in source_metadata.keys() if k.startswith("Geometry_")]
61+
geometry_keys = [
62+
k for k, v in source_metadata.items() if GeometryAdapter.match(k, v)
63+
]
6164
execenv.print(f" Source object has {len(geometry_keys)} geometry metadata keys")
6265
assert len(geometry_keys) > 0, "Source object should have geometry results"
6366

@@ -70,7 +73,7 @@ def __test_metadata_features(panel: BaseDataPanel):
7073

7174
# Verify target has no geometry metadata before paste
7275
target_geo_keys_before = [
73-
k for k in target_obj.metadata.keys() if k.startswith("Geometry_")
76+
k for k, v in target_obj.metadata.items() if GeometryAdapter.match(k, v)
7477
]
7578
execenv.print(
7679
f" Target object has {len(target_geo_keys_before)} geometry keys before paste"
@@ -87,7 +90,7 @@ def __test_metadata_features(panel: BaseDataPanel):
8790
# Verify the paste worked
8891
target_metadata_after = target_obj.metadata.copy()
8992
target_geo_keys_after = [
90-
k for k in target_metadata_after.keys() if k.startswith("Geometry_")
93+
k for k, v in target_metadata_after.items() if GeometryAdapter.match(k, v)
9194
]
9295
execenv.print(
9396
f" Target object has {len(target_geo_keys_after)} geometry keys after paste"
@@ -98,16 +101,14 @@ def __test_metadata_features(panel: BaseDataPanel):
98101
"Target object should have geometry results after paste"
99102
)
100103

101-
# Verify that all geometry metadata types are present (array, title, shape)
104+
# Verify that all geometry metadata uses the new unified format (_dict)
102105
for key in target_geo_keys_after:
103-
if key.endswith("_array"):
104-
base_key = key[:-6] # Remove "_array"
105-
title_key = base_key + "_title"
106-
shape_key = base_key + "_shape"
107-
108-
assert title_key in target_metadata_after, f"Missing title key: {title_key}"
109-
assert shape_key in target_metadata_after, f"Missing shape key: {shape_key}"
110-
execenv.print(f" ✓ Complete geometry entry: {base_key}")
106+
# Verify the geometry data is valid
107+
geometry_data = target_metadata_after[key]
108+
assert isinstance(geometry_data, dict), f"Geometry data should be dict: {key}"
109+
assert "title" in geometry_data, f"Missing title in geometry data: {key}"
110+
assert "coords" in geometry_data, f"Missing coords in geometry data: {key}"
111+
execenv.print(f" ✓ Valid geometry entry: {key}")
111112

112113
execenv.print(" ✓ Metadata copy/paste verification passed")
113114

datalab/tests/features/image/blobs_app_test.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ def test_blobs():
3131
(sigima.params.BlobOpenCVParam, "blob_opencv", "BlobOpenCV"),
3232
):
3333
param = paramclass()
34+
param.min_sigma = 10.0
35+
param.max_sigma = 30.0
3436
image = create_image(name, data)
3537
create_adapter_from_object(image).add_label_with_title()
3638
panel.add_object(image)

0 commit comments

Comments
 (0)