More tests for OPF 3

This commit is contained in:
Kovid Goyal 2016-06-23 23:28:43 +05:30
parent f744c3790e
commit 7734059ff8
2 changed files with 29 additions and 8 deletions

View File

@ -360,6 +360,13 @@ def set_languages(root, prefixes, refines, languages):
Author = namedtuple('Author', 'name sort')
def is_relators_role(props, q):
role = props.get('role')
if role:
scheme_ns, scheme, role = role
return role.lower() == q and (scheme_ns is None or (scheme_ns, scheme) == (reserved_prefixes['marc'], 'relators'))
return False
def read_authors(root, prefixes, refines):
roled_authors, unroled_authors = [], []
@ -379,8 +386,7 @@ def read_authors(root, prefixes, refines):
role = props.get('role')
opf_role = item.get(OPF('role'))
if role:
scheme_ns, scheme, role = role
if role.lower() == 'aut' and (scheme_ns is None or (scheme_ns, scheme) == (reserved_prefixes['marc'], 'relators')):
if is_relators_role(props, 'aut'):
roled_authors.append(author(item, props, val))
elif opf_role:
if opf_role.lower() == 'aut':
@ -394,9 +400,8 @@ def set_authors(root, prefixes, refines, authors):
ensure_prefix(root, prefixes, 'marc')
for item in XPath('./opf:metadata/dc:creator')(root):
props = properties_for_id_with_scheme(item.get('id'), prefixes, refines)
role = props.get('role')
opf_role = item.get(OPF('role'))
if (role and role.lower() != 'aut') or (opf_role and opf_role.lower() != 'aut'):
if (is_relators_role(props, 'aut')) or (opf_role and opf_role.lower() != 'aut'):
continue
remove_element(item, refines)
metadata = XPath('./opf:metadata')(root)[0]
@ -422,8 +427,7 @@ def read_book_producers(root, prefixes, refines):
role = props.get('role')
opf_role = item.get(OPF('role'))
if role:
scheme_ns, scheme, role = role
if role.lower() == 'bkp' and (scheme_ns is None or (scheme_ns, scheme) == (reserved_prefixes['marc'], 'relators')):
if is_relators_role(props, 'bkp'):
ans.append(normalize_whitespace(val))
elif opf_role and opf_role.lower() == 'bkp':
ans.append(normalize_whitespace(val))
@ -432,9 +436,8 @@ def read_book_producers(root, prefixes, refines):
def set_book_producers(root, prefixes, refines, producers):
for item in XPath('./opf:metadata/dc:contributor')(root):
props = properties_for_id_with_scheme(item.get('id'), prefixes, refines)
role = props.get('role')
opf_role = item.get(OPF('role'))
if (role and role.lower() != 'bkp') or (opf_role and opf_role.lower() != 'bkp'):
if (is_relators_role(props, 'bkp')) or (opf_role and opf_role.lower() != 'bkp'):
continue
remove_element(item, refines)
metadata = XPath('./opf:metadata')(root)[0]

View File

@ -24,6 +24,9 @@ from calibre.ebooks.metadata.opf3 import (
read_author_link_map, read_user_categories, set_author_link_map, set_user_categories,
apply_metadata
)
# This import is needed to prevent a test from running slowly
from calibre.ebooks.oeb.polish.pretty import pretty_opf, pretty_xml_tree # noqa
read_author_link_map, read_user_categories, set_author_link_map, set_user_categories
TEMPLATE = '''<package xmlns="http://www.idpf.org/2007/opf" version="3.0" prefix="calibre: %s" unique-identifier="uid"><metadata xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:opf="http://www.idpf.org/2007/opf">{metadata}</metadata></package>''' % CALIBRE_PREFIX # noqa
@ -487,6 +490,21 @@ class TestOPF3(unittest.TestCase):
compare_metadata(mi2, mi3)
apply_metadata(root, mi3)
compare_metadata(mi3, read_metadata(root))
mi3.tags = []
mi3.set('#tags', [])
mi3.set('#number', 0)
mi3.set('#commetns', '')
apply_metadata(root, mi3)
nmi = read_metadata(root)
self.assertEqual(mi2.tags, nmi.tags)
self.assertEqual(mi2.get('#tags'), nmi.get('#tags'))
self.assertEqual(mi2.get('#commetns'), nmi.get('#commetns'))
self.assertEqual(0, nmi.get('#number'))
apply_metadata(root, mi3, apply_null=True)
nmi = read_metadata(root)
self.assertFalse(nmi.tags)
self.assertFalse(nmi.get('#tags'))
self.assertFalse(nmi.get('#commetns'))
# }}}
# Run tests {{{