def test_parse(input_, expected): with open(os.path.join(test_suite_dir, input_), 'rb') as f: xml = f.read() if IRON_PYTHON: xml = bytes(xml) parse = get_format(xml) assert callable(parse) uri_filename = input_.rstrip('.xml') + '.uri.txt' try: with open(os.path.join(test_suite_dir, uri_filename)) as f: base_uri = f.read().strip() except (IOError, OSError): base_uri = 'http://example.com/' parsed_feed, _ = parse(xml, feed_url=base_uri) parsed_tree = fromstringlist( write(parsed_feed, canonical_order=True, hints=False)) if IRON_PYTHON: open_ = functools.partial(io.open, encoding='utf-8') elif PY3 and sys.platform == 'win32': open_ = functools.partial(open, encoding='utf-8') else: open_ = open with open_(os.path.join(test_suite_dir, expected)) as f: expected_tree = fromstringlist(f.read() if IRON_PYTHON else f) compare_tree(expected_tree, parsed_tree)
def test_mutate_element_list(): doc = TestDoc() assert not doc.multi_attr assert len(doc.multi_attr) == 0 with raises(IndexError): doc.multi_attr[0] doc.multi_attr.append(TextElement(value='First element')) assert doc.multi_attr assert doc.multi_attr[0].value == 'First element' assert len(doc.multi_attr) == 1 doc.multi_attr.insert(1, TextElement(value='Second element')) assert doc.multi_attr[1].value == 'Second element' assert len(doc.multi_attr) == 2 tree = fromstringlist(write(doc, validate=False)) elements = tree.findall('multi') assert len(elements) == 2 assert elements[0].text == 'First element' assert elements[1].text == 'Second element' doc.multi_attr[0] = TextElement(value='Replacing element') assert doc.multi_attr[0].value == 'Replacing element' assert len(doc.multi_attr) == 2 tree = fromstringlist(write(doc, validate=False)) elements = tree.findall('multi') assert len(elements) == 2 assert elements[0].text == 'Replacing element' assert elements[1].text == 'Second element' del doc.multi_attr[0] assert doc.multi_attr[0].value == 'Second element' assert len(doc.multi_attr) == 1 tree = fromstringlist(write(doc, validate=False)) elements = tree.findall('multi') assert len(elements) == 1 assert elements[0].text == 'Second element'
def test_parse(input_, expected): with open(os.path.join(test_suite_dir, input_), 'rb') as f: xml = f.read() if IRON_PYTHON: xml = bytes(xml) parse = get_format(xml) assert callable(parse) uri_filename = input_.rstrip('.xml') + '.uri.txt' try: with open(os.path.join(test_suite_dir, uri_filename)) as f: base_uri = f.read().strip() except (IOError, OSError): base_uri = 'http://example.com/' parsed_feed, _ = parse(xml, feed_url=base_uri) parsed_tree = fromstringlist( write(parsed_feed, canonical_order=True, hints=False) ) if IRON_PYTHON: open_ = functools.partial(io.open, encoding='utf-8') elif PY3: open_ = functools.partial(open, encoding='utf-8') else: open_ = open with open_(os.path.join(test_suite_dir, expected)) as f: expected_tree = fromstringlist(f.read() if IRON_PYTHON else f) compare_tree(expected_tree, parsed_tree)
def test_element_initialize(): doc = TestDoc(title_attr=TextElement(value='Title test'), content_attr=TextElement(value=u('내용 테스트')), attr_attr='Attribute value', text_content_attr='Text content', multi_attr=(TextElement(value='a'), TextElement(value='b'))) assert doc.title_attr.value == 'Title test' assert doc.content_attr.value == u('내용 테스트') assert doc.attr_attr == 'Attribute value' assert doc.text_content_attr == 'Text content' assert len(doc.multi_attr) == 2 assert doc.multi_attr[0].value == 'a' assert doc.multi_attr[1].value == 'b' doc.multi_attr.append(TextElement(value='c')) assert doc.multi_attr[2].value == 'c' assert len(doc.multi_attr) == 3 tree = fromstringlist(write(doc)) assert tree.find('title').text == 'Title test' assert tree.find('content').text == u('내용 테스트') assert tree.attrib['attr'] == 'Attribute value' elements = tree.findall('multi') assert len(elements) == 3 assert elements[0].text == 'a' assert elements[1].text == 'b' assert elements[2].text == 'c'
def test_write_hints(fx_test_doc): doc, _ = fx_test_doc doc._hints.update({ TestDoc.ns_element_attr: { 'abc': '123', 'def': '456' }, TestDoc.title_attr: { 'ghi': '789', 'jkl': '012' } }) g = write(doc, canonical_order=True) tree = fromstringlist(g) hint_tag = '{' + SCHEMA_XMLNS + '}hint' assert tree[0].tag == hint_tag assert tree[0].attrib['tag'] == 'ns-element' assert tree[0].attrib['tag-xmlns'] == 'http://earthreader.github.io/' assert tree[0].attrib['id'] == 'abc' assert tree[0].attrib['value'] == '123' assert tree[1].tag == hint_tag assert tree[1].attrib['tag'] == 'ns-element' assert tree[1].attrib['tag-xmlns'] == 'http://earthreader.github.io/' assert tree[1].attrib['id'] == 'def' assert tree[1].attrib['value'] == '456' assert tree[2].tag == hint_tag assert tree[2].attrib['tag'] == 'title' assert 'tag-xmlns' not in tree[2].attrib assert tree[2].attrib['id'] == 'ghi' assert tree[2].attrib['value'] == '789' assert tree[3].tag == hint_tag assert tree[3].attrib['tag'] == 'title' assert 'tag-xmlns' not in tree[3].attrib assert tree[3].attrib['id'] == 'jkl' assert tree[3].attrib['value'] == '012'
def test_write_hints(fx_test_doc): doc, _ = fx_test_doc doc._hints.update({ TestDoc.ns_element_attr: {'abc': '123', 'def': '456'}, TestDoc.title_attr: {'ghi': '789', 'jkl': '012'} }) g = write(doc, canonical_order=True) tree = fromstringlist(g) hint_tag = '{' + SCHEMA_XMLNS + '}hint' assert tree[0].tag == hint_tag assert tree[0].attrib['tag'] == 'ns-element' assert tree[0].attrib['tag-xmlns'] == 'http://earthreader.github.io/' assert tree[0].attrib['id'] == 'abc' assert tree[0].attrib['value'] == '123' assert tree[1].tag == hint_tag assert tree[1].attrib['tag'] == 'ns-element' assert tree[1].attrib['tag-xmlns'] == 'http://earthreader.github.io/' assert tree[1].attrib['id'] == 'def' assert tree[1].attrib['value'] == '456' assert tree[2].tag == hint_tag assert tree[2].attrib['tag'] == 'title' assert 'tag-xmlns' not in tree[2].attrib assert tree[2].attrib['id'] == 'ghi' assert tree[2].attrib['value'] == '789' assert tree[3].tag == hint_tag assert tree[3].attrib['tag'] == 'title' assert 'tag-xmlns' not in tree[3].attrib assert tree[3].attrib['id'] == 'jkl' assert tree[3].attrib['value'] == '012'
def test_write_test_doc_tree(fx_test_doc): doc, _ = fx_test_doc g = write(doc, canonical_order=True) tree = fromstringlist(g) assert tree.tag == 'test' assert tree.attrib == { 'attr': u('속성 값'), 'attr-decoder': 'decoder test' } assert tree[0].tag == 'title' assert not tree[0].attrib assert tree[0].text == u('제목 test') assert tree[1].tag == 'content' assert tree[1].text == 'Content test' assert not tree[1].attrib assert tree[2].tag == tree[3].tag == tree[4].tag == 'multi' assert tree[2].attrib == tree[3].attrib == tree[4].attrib == {} assert tree[2].text == 'a' assert tree[3].text == 'b' assert tree[4].text == 'c' assert tree[5].tag == tree[6].tag == tree[7].tag == 's-multi' assert tree[5].attrib == tree[6].attrib == tree[7].attrib == {} assert tree[5].text == 'a' assert tree[6].text == 'b' assert tree[7].text == 'c' assert tree[8].tag == 'text-content' assert not tree[8].attrib assert tree[8].text == u('텍스트 내용') assert tree[9].tag == tree[10].tag == 'text-multi' assert tree[9].attrib == tree[10].attrib == {} assert tree[9].text == 'a' assert tree[10].text == 'b' assert tree[11].tag == tree[12].tag == tree[13].tag == 's-text-multi' assert tree[11].attrib == tree[12].attrib == tree[13].attrib == {} assert tree[11].text == 'c' assert tree[12].text == 'b' assert tree[13].text == 'a' assert tree[14].tag == 'text-decoder' assert not tree[14].attrib assert tree[14].text == '123.456' assert tree[15].tag == 'text-decoder-decorator' assert not tree[15].attrib assert tree[15].text == '123' assert tree[16].tag == 'text-combined-decoder' assert not tree[16].attrib assert tree[16].text == '1234' assert tree[17].tag == '{http://earthreader.github.io/}ns-element' assert tree[17].attrib == { '{http://earthreader.github.io/}ns-attr': 'namespace attribute value' } assert tree[17].text == 'Namespace test' assert tree[18].tag == '{http://earthreader.github.io/}ns-text' assert not tree[18].attrib assert tree[18].text == 'Namespace test' assert tree[19].tag == 'content-decoder' assert tree[19].text == 'CONTENT DECODER' assert not tree[19].attrib assert len(tree) == 20
def test_write_test_doc_tree(fx_test_doc): doc, _ = fx_test_doc g = write(doc, canonical_order=True) tree = fromstringlist(g) assert tree.tag == 'test' assert tree.attrib == { 'attr': u'속성 값', 'attr-decoder': 'decoder test' } assert tree[0].tag == 'title' assert not tree[0].attrib assert tree[0].text == u'제목 test' assert tree[1].tag == 'content' assert tree[1].text == 'Content test' assert not tree[1].attrib assert tree[2].tag == tree[3].tag == tree[4].tag == 'multi' assert tree[2].attrib == tree[3].attrib == tree[4].attrib == {} assert tree[2].text == 'a' assert tree[3].text == 'b' assert tree[4].text == 'c' assert tree[5].tag == tree[6].tag == tree[7].tag == 's-multi' assert tree[5].attrib == tree[6].attrib == tree[7].attrib == {} assert tree[5].text == 'a' assert tree[6].text == 'b' assert tree[7].text == 'c' assert tree[8].tag == 'text-content' assert not tree[8].attrib assert tree[8].text == u'텍스트 내용' assert tree[9].tag == tree[10].tag == 'text-multi' assert tree[9].attrib == tree[10].attrib == {} assert tree[9].text == 'a' assert tree[10].text == 'b' assert tree[11].tag == tree[12].tag == tree[13].tag == 's-text-multi' assert tree[11].attrib == tree[12].attrib == tree[13].attrib == {} assert tree[11].text == 'c' assert tree[12].text == 'b' assert tree[13].text == 'a' assert tree[14].tag == 'text-decoder' assert not tree[14].attrib assert tree[14].text == '123.456' assert tree[15].tag == 'text-decoder-decorator' assert not tree[15].attrib assert tree[15].text == '123' assert tree[16].tag == 'text-combined-decoder' assert not tree[16].attrib assert tree[16].text == '1234' assert tree[17].tag == '{http://earthreader.github.io/}ns-element' assert tree[17].attrib == { '{http://earthreader.github.io/}ns-attr': 'namespace attribute value' } assert tree[17].text == 'Namespace test' assert tree[18].tag == '{http://earthreader.github.io/}ns-text' assert not tree[18].attrib assert tree[18].text == 'Namespace test' assert tree[19].tag == 'content-decoder' assert tree[19].text == 'CONTENT DECODER' assert not tree[19].attrib assert len(tree) == 20
def test_mutate_read_element_list(fx_test_doc): doc, _ = fx_test_doc doc.multi_attr.insert(2, TextElement(value='inserted')) assert doc.multi_attr[0].value == 'a' assert doc.multi_attr[1].value == 'b' assert doc.multi_attr[2].value == 'inserted' assert doc.multi_attr[3].value == 'c' assert len(doc.multi_attr) == 4 tree = fromstringlist(write(doc)) elements = tree.findall('multi') assert len(elements) == 4 assert elements[0].text == 'a' assert elements[1].text == 'b' assert elements[2].text == 'inserted' assert elements[3].text == 'c'
def test_content_codec(): doc = ContentCodecTestDoc(c=(5, 6)) tree = fromstringlist(write(doc, as_bytes=True)) assert tree.text == '5,6' doc2 = read(ContentCodecTestDoc, etree_tobyteslist(tree)) assert doc2.c == (5, 6)
def test_text_codec(): doc = CodecTestDoc(text=(3, 4)) tree = fromstringlist(write(doc)) assert tree.find('text').text == '3,4' doc2 = read(CodecTestDoc, etree_tobyteslist(tree)) assert doc2.text == (3, 4)
def test_attribute_codec(): doc = CodecTestDoc(attr=(1, 2)) tree = fromstringlist(write(doc)) assert tree.attrib['attr'] == '1,2' doc2 = read(CodecTestDoc, etree_tobyteslist(tree)) assert doc2.attr == (1, 2)
def test_write_none_attribute(): doc = CodecTestDoc(attr=None, text=(1, 2)) tree = fromstringlist(write(doc)) assert tree.find('text').text == '1,2' assert 'attr' not in tree.attrib
def test_write_none_text(): doc = CodecTestDoc(attr=(1, 2), text=None) tree = fromstringlist(write(doc)) assert tree.find('text') is None assert tree.attrib['attr'] == '1,2'