Skip to content

Commit

Permalink
metadata types and ext
Browse files Browse the repository at this point in the history
  • Loading branch information
philipbaileynar committed Jul 5, 2023
1 parent ce7aefd commit c44e112
Show file tree
Hide file tree
Showing 2 changed files with 92 additions and 2 deletions.
62 changes: 60 additions & 2 deletions python/packages/rsxml/rsxml/project_xml/MetaData.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,35 @@
import xml.etree.cElementTree as ET
MetaValue = str or float or int

# These types are taken from the XSD definition
# https://github.com/Riverscapes/RiverscapesXML/blob/e5b7a967d1c17224d6ef001acf37e7df8c129391/Projects/XSD/V2/RiverscapesProject.xsd#L501-L521
# These must be updated here if the XSD changes
META_TYPES = [
'guid',
'url',
'filepath',
'image',
'video',
'isodate',
'timestamp',
'float',
'boolean',
'int',
'richtext',
'markdown',
'json',
'hidden'
]

# These types are taken from the XSD definition
# https://github.com/Riverscapes/RiverscapesXML/blob/e5b7a967d1c17224d6ef001acf37e7df8c129391/Projects/XSD/V2/RiverscapesProject.xsd#L531-L537
# These must be updated here if the XSD changes
EXT_TYPES = [
'warehouse',
'project',
'dataset'
]


class Meta(NamedTuple):
"""
Expand All @@ -16,6 +45,7 @@ class Meta(NamedTuple):
name: str
value: MetaValue
type: str = None # optional
ext: str = None # optional


class MetaData():
Expand Down Expand Up @@ -55,11 +85,32 @@ def __init__(self, values: List[Meta] = None, container_tag: str = 'MetaData', i
if values and not isinstance(values, List):
raise ValueError('values must be a list of Meta')

for meta in values:
if meta.type is not None:
self._validate_meta_type(meta.type)

if meta.ext is not None:
self._validate_ext_type(meta.ext)

self._values = values if values else []
self.container_tag = container_tag
self.inner_tag = inner_tag

def add_meta(self, name: str, value, meta_type: str = None) -> None:
def _validate_meta_type(self, meta_type: str) -> None:
"""
Validates the meta type.
"""
if meta_type not in META_TYPES:
raise ValueError(f'Invalid meta type {meta_type}. Valid types are {META_TYPES}')

def _validate_ext_type(self, ext: str) -> None:
"""
Validates the ext type.
"""
if ext not in EXT_TYPES:
raise ValueError(f'Invalid ext type {ext}. Valid types are {EXT_TYPES}')

def add_meta(self, name: str, value, meta_type: str = None, ext: str = None) -> None:
"""
Add a metadata item to the collection.
The name must be unique and cannot be empty.
Expand All @@ -71,7 +122,13 @@ def add_meta(self, name: str, value, meta_type: str = None) -> None:
if name in [s.name for s in self._values]:
raise ValueError(f'{name} already exists')

self._values.append(Meta(name, value, meta_type))
if meta_type is not None:
self._validate_meta_type(meta_type)

if ext is not None:
self._validate_ext_type(ext)

self._values.append(Meta(name, value, meta_type, ext))

def find_meta(self, name: str) -> Meta:
"""
Expand Down Expand Up @@ -122,6 +179,7 @@ def to_xml(self) -> ET.Element:
meta_node = ET.Element(self.inner_tag, {
'name': meta.name,
'type': meta.type,
'ext': meta.ext
})

meta_node.text = str(meta.value)
Expand Down
32 changes: 32 additions & 0 deletions python/packages/rsxml/tests/test_project_xml.py
Original file line number Diff line number Diff line change
Expand Up @@ -173,3 +173,35 @@ def test_dataset(self):
self.assertEqual(xml.find('Summary').text, summary)
self.assertEqual(xml.find('Path').text, ds_path)
self.assertEqual(xml.find('Citation').text, citation)

def test_metadata(self):

# Test the metadata types
test_meta = MetaData(values=[
project_xml.Meta(name='test_key', value='test_no_type'),
project_xml.Meta(name='test_key2', value='test_valid_type', type='filepath')
])

try:
test_meta2 = MetaData(values=[
project_xml.Meta(name='test_key2', value='test_invalid_type', type='invalid_type')
])
# Should not be able to get here with invalid metadata
self.fail('Expected ValueError')
except ValueError:
pass

# Test the ext types
test_meta3 = MetaData(values=[
project_xml.Meta(name='test_key', value='test_no_type'),
project_xml.Meta(name='test_key2', value='test_valid_ext', ext='project')
])

try:
test_meta4 = MetaData(values=[
project_xml.Meta(name='test_key2', value='test_invalid_ext', ext='invalid_ext')
])
# Should not be able to get here with invalid metadata
self.fail('Expected ValueError')
except ValueError:
pass

0 comments on commit c44e112

Please sign in to comment.