Skip to content

Commit ff8cc1a

Browse files
authored
Merge pull request asdf-format#832 from eslavich/eslavich-flexible-extension-metadata
Prevent errors when extra properties are present in extension metadata
2 parents dc5263c + 3104877 commit ff8cc1a

File tree

5 files changed

+34
-18
lines changed

5 files changed

+34
-18
lines changed

CHANGES.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,9 @@
6666
- Add option to disable validation of schema default values
6767
in the pytest plugin. [#831]
6868

69+
- Prevent errors when extension metadata contains additional
70+
properties. [#832]
71+
6972
2.6.0 (2020-04-22)
7073
------------------
7174

asdf/asdf.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ def _update_extension_history(self):
252252
ext_meta = ExtensionMetadata(extension_class=ext_name)
253253
metadata = self._extension_metadata.get(ext_name)
254254
if metadata is not None:
255-
ext_meta.software = Software(name=metadata[0], version=metadata[1])
255+
ext_meta['software'] = Software(name=metadata[0], version=metadata[1])
256256

257257
for i, entry in enumerate(self.tree['history']['extensions']):
258258
# Update metadata about this extension if it already exists

asdf/tags/core/__init__.py

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -41,25 +41,17 @@ class HistoryEntry(dict, AsdfType):
4141
version = '1.0.0'
4242

4343

44-
class ExtensionMetadata(AsdfType):
44+
class ExtensionMetadata(dict, AsdfType):
4545
name = 'core/extension_metadata'
4646
version = '1.0.0'
4747

48-
def __init__(self, extension_class=None, software={}):
49-
self.extension_class = extension_class
50-
self.software = software
48+
@property
49+
def extension_class(self):
50+
return self['extension_class']
5151

52-
@classmethod
53-
def from_tree(cls, node, ctx):
54-
return cls(**node)
55-
56-
@classmethod
57-
def to_tree(cls, node, ctx):
58-
tree = {}
59-
tree['extension_class'] = node.extension_class
60-
tree['software'] = node.software
61-
62-
return tree
52+
@property
53+
def software(self):
54+
return self.get('software')
6355

6456

6557
class SubclassMetadata(dict, AsdfType):
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import asdf
2+
3+
from asdf.tests import helpers
4+
5+
def test_extra_properties():
6+
yaml = """
7+
metadata: !core/extension_metadata-1.0.0
8+
extension_class: foo.extension.FooExtension
9+
software: !core/software-1.0.0
10+
name: FooSoft
11+
version: "1.5"
12+
extension_uri: http://foo.biz/extensions/foo-1.0.0
13+
"""
14+
15+
buff = helpers.yaml_to_asdf(yaml)
16+
17+
with asdf.open(buff) as af:
18+
af["metadata"].extension_class == "foo.extension.FooExtension"
19+
af["metadata"].software["name"] == "FooSoft"
20+
af["metadata"].software["version"] == "1.5"
21+
af["metadata"]["extension_uri"] == "http://foo.biz/extensions/foo-1.0.0"

asdf/tests/test_api.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -308,8 +308,8 @@ def test_extension_version_check(installed, extension, warns):
308308
tree = {
309309
'history': {
310310
'extensions': [
311-
asdf.tags.core.ExtensionMetadata('foo.extension.FooExtension',
312-
asdf.tags.core.Software(name='foo', version=extension)),
311+
asdf.tags.core.ExtensionMetadata(extension_class='foo.extension.FooExtension',
312+
software=asdf.tags.core.Software(name='foo', version=extension)),
313313
]
314314
}
315315
}

0 commit comments

Comments
 (0)