From 7734059ff848dbe8fa9daf4341b613dfc1b4faab Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 23 Jun 2016 23:28:43 +0530 Subject: [PATCH] More tests for OPF 3 --- src/calibre/ebooks/metadata/opf3.py | 19 +++++++++++-------- src/calibre/ebooks/metadata/opf3_test.py | 18 ++++++++++++++++++ 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/src/calibre/ebooks/metadata/opf3.py b/src/calibre/ebooks/metadata/opf3.py index 75ccca9c03..7d3baf45ec 100644 --- a/src/calibre/ebooks/metadata/opf3.py +++ b/src/calibre/ebooks/metadata/opf3.py @@ -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] diff --git a/src/calibre/ebooks/metadata/opf3_test.py b/src/calibre/ebooks/metadata/opf3_test.py index 15acde0bac..244207ffad 100644 --- a/src/calibre/ebooks/metadata/opf3_test.py +++ b/src/calibre/ebooks/metadata/opf3_test.py @@ -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 = '''{metadata}''' % 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 {{{