From 156950f9c8c3a064ac31a4d5ecdc60176a6821e4 Mon Sep 17 00:00:00 2001 From: mvdbeek Date: Fri, 12 Feb 2021 09:20:00 +0100 Subject: [PATCH 1/3] Small unittest --- test/unit/data/test_galaxy_mapping.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test/unit/data/test_galaxy_mapping.py b/test/unit/data/test_galaxy_mapping.py index 2b0b5ecc301..59841b71c6d 100644 --- a/test/unit/data/test_galaxy_mapping.py +++ b/test/unit/data/test_galaxy_mapping.py @@ -379,6 +379,12 @@ class MappingTests(BaseModelTestCase): assert hist1.name == "History 2b" # gvk TODO need to ad test for GalaxySessions, but not yet sure what they should look like. + def test_metadata_spec(self): + metadata = dict(chromCol=1, startCol=2, endCol=3) + d = self.model.HistoryDatasetAssociation(extension="interval", metadata=metadata, sa_session=self.model.session) + assert d.metadata.chromCol == 1 + assert d.metadata.anyAttribute is None + def test_jobs(self): model = self.model u = model.User(email="jobtest@foo.bar.baz", password="password") From 8af54811c58b3363af8f8d5749d8d32215e0008a Mon Sep 17 00:00:00 2001 From: mvdbeek Date: Fri, 12 Feb 2021 09:22:04 +0100 Subject: [PATCH 2/3] Return None on unknown metadata attribute access Fixes https://sentry.galaxyproject.org/sentry/main/issues/1325196/ ``` AttributeError: null File "galaxy/web/framework/middleware/sentry.py", line 43, in __call__ iterable = self.application(environ, start_response) File "/cvmfs/main.galaxyproject.org/venv/lib/python3.6/site-packages/paste/recursive.py", line 85, in __call__ return self.application(environ, start_response) File "galaxy/web/framework/middleware/statsd.py", line 33, in __call__ req = self.application(environ, start_response) File "/cvmfs/main.galaxyproject.org/venv/lib/python3.6/site-packages/paste/httpexceptions.py", line 640, in __call__ return self.application(environ, start_response) File "galaxy/web/framework/base.py", line 136, in __call__ return self.handle_request(environ, start_response) File "galaxy/web/framework/base.py", line 215, in handle_request body = method(trans, **kwargs) File "galaxy/webapps/galaxy/controllers/visualization.py", line 488, in display_by_username_and_slug visualization_config = self.get_visualization_config(trans, visualization) File "galaxy/webapps/base/controller.py", line 1035, in get_visualization_config tracks.append(pack_track(drawable_dict)) File "galaxy/webapps/base/controller.py", line 996, in pack_track "filters": track_dict.get('filters', {'filters' : track_data_provider.get_filters()}), File "galaxy/visualization/data_providers/genome.py", line 249, in get_filters if self.original_dataset.metadata.viz_filter_cols: File "galaxy/model/metadata.py", line 116, in __getattr__ raise AttributeError ``` --- lib/galaxy/model/metadata.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/galaxy/model/metadata.py b/lib/galaxy/model/metadata.py index a3f40dd11be..bff4109560f 100644 --- a/lib/galaxy/model/metadata.py +++ b/lib/galaxy/model/metadata.py @@ -113,7 +113,7 @@ class MetadataCollection(Mapping): return self.spec[name].wrap(self.spec[name].default, object_session(self.parent)) if name in self.parent._metadata: return self.parent._metadata[name] - raise AttributeError + return None def __setattr__(self, name, value): if name == "parent": From 1b98e2ca12158bae104ff8475adc58335ad90e31 Mon Sep 17 00:00:00 2001 From: Marius van den Beek Date: Fri, 12 Feb 2021 14:45:24 +0100 Subject: [PATCH 3/3] Calrify why we don't raise Attribute error here Co-authored-by: Nicola Soranzo --- lib/galaxy/model/metadata.py | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/galaxy/model/metadata.py b/lib/galaxy/model/metadata.py index bff4109560f..97fe0df49be 100644 --- a/lib/galaxy/model/metadata.py +++ b/lib/galaxy/model/metadata.py @@ -113,6 +113,7 @@ class MetadataCollection(Mapping): return self.spec[name].wrap(self.spec[name].default, object_session(self.parent)) if name in self.parent._metadata: return self.parent._metadata[name] + # Instead of raising an AttributeError for non-existing metadata, we return None return None def __setattr__(self, name, value):