Skip to content

Commit

Permalink
Merge b6a9c3f into 82ab6b3
Browse files Browse the repository at this point in the history
  • Loading branch information
cole committed Mar 13, 2019
2 parents 82ab6b3 + b6a9c3f commit 9b573c5
Show file tree
Hide file tree
Showing 5 changed files with 51 additions and 32 deletions.
3 changes: 3 additions & 0 deletions .travis.yml
@@ -1,4 +1,5 @@
sudo: false
dist: xenial
language: python

branches:
Expand All @@ -18,6 +19,8 @@ matrix:
env: TOXENV=py34
- python: 3.6
env: TOXENV=py36
- python: 3.7
env: TOXENV=py37

script:
- tox -e $TOXENV
Expand Down
46 changes: 16 additions & 30 deletions metsrw/mets.py
Expand Up @@ -489,56 +489,42 @@ def _parse_tree(self, tree=None):
def _validate(self):
raise NotImplementedError()

def _fromfile(self, path):
@classmethod
def fromfile(cls, path):
"""
Accept a filepath pointing to a valid METS document and parses it.
Creates a METS by parsing a file.
:param str path: Path to a METS document.
"""
parser = etree.XMLParser(remove_blank_text=True)
self.tree = etree.parse(path, parser=parser)
self._parse_tree(self.tree)

@classmethod
def fromfile(cls, path):
""" Creates a METS by parsing a file. """
i = cls()
i._fromfile(path)
return i
return cls.fromtree(etree.parse(path, parser=parser))

def _fromstring(self, string):
@classmethod
def fromstring(cls, string):
"""
Accept a string containing valid METS xml and parses it.
Create a METS by parsing a string.
:param str string: String containing a METS document.
"""
parser = etree.XMLParser(remove_blank_text=True)
root = etree.fromstring(string, parser)
self.tree = root.getroottree()
self._parse_tree(self.tree)
tree = root.getroottree()

@classmethod
def fromstring(cls, string):
""" Create a METS by parsing a string. """
i = cls()
i._fromstring(string)
return i
return cls.fromtree(tree)

def _fromtree(self, tree):
@classmethod
def fromtree(cls, tree):
"""
Accept an ElementTree or Element and parses it.
Create a METS from an ElementTree or Element.
:param ElementTree tree: ElementTree to build a METS document from.
"""
self.tree = tree
self._parse_tree(self.tree)
mets = cls()
mets.tree = tree
mets._parse_tree(tree)

@classmethod
def fromtree(cls, tree):
""" Create a METS from an ElementTree or Element. """
i = cls()
i._fromtree(tree)
return i
return mets


if __name__ == '__main__':
Expand Down
5 changes: 4 additions & 1 deletion metsrw/plugins/premisrw/premis.py
Expand Up @@ -298,7 +298,8 @@ def schema(self):
'inhibitors',
('inhibitor_type',),
('inhibitor_target',),
)
),
('object_characteristics_extension',)
),
(
'relationship',
Expand Down Expand Up @@ -490,6 +491,8 @@ def _data_to_lxml_el(data, ns, nsmap, element_maker=None, snake=True):
element, ns, nsmap, element_maker=element_maker, snake=snake))
elif isinstance(element, six.text_type):
args.append(element)
elif isinstance(element, etree._Element):
args.append(element)
else:
args.append(six.binary_type(element))
ret = func(*args)
Expand Down
27 changes: 27 additions & 0 deletions tests/plugins/premisrw/test_premis.py
Expand Up @@ -2,6 +2,7 @@
from unittest import TestCase

import pytest
from lxml import etree

import metsrw
import metsrw.plugins.premisrw as premisrw
Expand Down Expand Up @@ -364,3 +365,29 @@ def test_dynamic_class_generation(self):
assert pres_deriv_uuid
pres_deriv_fsentry = mets.get_file(file_uuid=pres_deriv_uuid)
assert pres_deriv_fsentry.path == orig_to_pres_deriv[fsentry.path]

def test_object_characteristics_extension(self):
"""
Test the object characteristics extension container element with embedded XML.
"""
embedded_xml = etree.Element('arbitrary-xml')
child_element = etree.Element('a-child-element')
child_element.text = "Hello world"
embedded_xml.append(child_element)

premis_element = premisrw.data_to_premis((
'object',
premisrw.PREMIS_META,
(
'object_identifier',
('object_identifier_type', 'UUID'),
('object_identifier_value', '8bce611a-fabc-4161-8108-ba041fb8e7b4'),
),
(
'object_characteristics',
('object_characteristics_extension', embedded_xml)
)
))

xpath_lookup = './/premis:objectCharacteristicsExtension/arbitrary-xml'
assert premis_element.xpath(xpath_lookup, namespaces=premis_element.nsmap)[0] == embedded_xml
2 changes: 1 addition & 1 deletion tox.ini
@@ -1,5 +1,5 @@
[tox]
envlist = py{27,34,36}, flake8
envlist = py{27,34,36,37}, flake8
skip_missing_interpreters = True
skipsdist = True

Expand Down

0 comments on commit 9b573c5

Please sign in to comment.