You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.
Dismiss alert
I want to push more on getting RustPython's XML capabilities on par with CPython's, so we can replace extratests/json-tests.py with a more robust solution involving CPython's own test harness (the --junit-xml flag on python -m test). A lot of this may involve making the xml crate "behave" more like the libexpat parser. The goal is not to get all of these boxes checked, but to get enough of them checked such that, e.g., rustpython -m test --junit-xml test.xml tests.xmltests will output valid XML. Here's the current state of play (as of 14 June 2026):
Lib/test/test_minidom.py
class MinidomTest:
testGetElementsByTagNameNS()
testWriteXML()
testAltNewline()
testProcessingInstruction()
testProcessingInstructionRepr()
testRemoveNamedItem()
testRemoveNamedItemNS()
testCloneElementShallow()
testCloneAttributeShallow()
testCloneAttributeDeep()
testClonePIShallow()
testClonePIDeep()
testCloneNodeEntity()
testSiblings()
testEncodings()
testRenameAttribute()
testSchemaType()
testSetIdAttribute()
testSetIdAttributeNS()
testSetIdAttributeNode()
testExceptionOnSpacesInXMLNSValue()
test_minidom_attribute_order()
test_toxml_with_attributes_ordered()
test_toprettyxml_with_attributes_ordered()
test_toprettyxml_with_cdata()
Lib/test/test_pyexpat.py
class ParseTest:
test_parse_bytes()
test_parse_str()
test_parse_file()
test_parse_again()
test_supported_encodings()
test_supported_encodings2()
test_unsupported_encodings() AssertionError: ValueError not raised
test_incompatible_encodings() AssertionError: ExpatError not raised
test_non_text_encodings() AssertionError: LookupError not raised
test_undefined_encoding() AssertionError: UnicodeError not raised
test_unknown_encoding() AssertionError: LookupError not raised
class NamespaceSeparatorTest:
test_illegal()
class InterningTest:
test()
test_issue9402()
class BufferTextTest:
test_buffering_enabled()
test1()
test2()
test7()
class sf1296433Test:
test_parse_only_xml_data() TypeError: Expected type 'str' but 'bytes' found.
class ChardataBufferTest:
test_1025_bytes()
test_1000_bytes()
test_wrong_size()
test_unchanged_size()
test_disabling_buffer()
test_change_size_1()
test_change_size_2()
class ElementDeclHandlerTest:
test_trigger_leak() AssertionError: TypeError not raised by Parse
test_deeply_nested_content_model() AssertionError: RecursionError not raised
class MalformedInputTest:
test1()
test2()
class ErrorMessageTest:
test_codes()
test_expaterror()
class ForeignDTDTest:
test_use_foreign_dtd()
test_ignore_use_foreign_dtd()
class ParentParserLifetimeTest:
test_parent_parser_outlives_its_subparsers__single() AttributeError: 'xmlparser' object has no attribute 'ExternalEntityParserCreate'
test_parent_parser_outlives_its_subparsers__multiple() AttributeError: 'xmlparser' object has no attribute 'ExternalEntityParserCreate'
test_parent_parser_outlives_its_subparsers__chain() AttributeError: 'xmlparser' object has no attribute 'ExternalEntityParserCreate'
class ReparseDeferralTest:
test_getter_setter_round_trip() AttributeError: 'xmlparser' object has no attribute 'GetReparseDeferralEnabled'
test_reparse_deferral_enabled() AttributeError: 'xmlparser' object has no attribute 'GetReparseDeferralEnabled'
test_reparse_deferral_disabled() AttributeError: 'xmlparser' object has no attribute 'SetReparseDeferralEnabled'
class ExpansionProtectionTest: [N.B. this gets appended at the end of the current list]
test_set_activation_threshold__threshold_reached() AttributeError: 'xmlparser' object has no attribute 'SetBillionLaughsAttackProtectionMaximumAmplification'
test_set_activation_threshold__threshold_not_reached() AttributeError: 'xmlparser' object has no attribute 'SetBillionLaughsAttackProtectionMaximumAmplification'
test_set_maximum_amplification__amplification_exceeded() AttributeError: 'xmlparser' object has no attribute 'SetBillionLaughsAttackProtectionMaximumAmplification'
test_set_maximum_amplification__amplification_not_exceeded() AttributeError: 'xmlparser' object has no attribute 'SetBillionLaughsAttackProtectionMaximumAmplification'
test_set_activation_threshold__fail_for_subparser() AttributeError: 'xmlparser' object has no attribute 'SetBillionLaughsAttackProtectionMaximumAmplification'
test_set_activation_threshold__invalid_threshold_type() AttributeError: 'xmlparser' object has no attribute 'SetBillionLaughsAttackProtectionMaximumAmplification'
test_set_maximum_amplification__fail_for_subparser() AttributeError: 'xmlparser' object has no attribute 'SetBillionLaughsAttackProtectionMaximumAmplification'
test_set_maximum_amplification__infinity() AttributeError: 'xmlparser' object has no attribute 'SetBillionLaughsAttackProtectionMaximumAmplification'
test_set_maximum_amplification__invalid_max_factor_range() AttributeError: 'xmlparser' object has no attribute 'SetBillionLaughsAttackProtectionMaximumAmplification'
test_set_maximum_amplification__invalid_max_factor_type() AttributeError: 'xmlparser' object has no attribute 'SetBillionLaughsAttackProtectionMaximumAmplification'
Lib/test/test_sax.py
class ParseTest:
test_parse_text() AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'
test_parse_bytes() AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'
test_parse_path_object() AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'
test_parse_InputSource() AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'
test_parse_close_source() AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'
check_parseString() AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'
N.B. erroneous?
test_parseString_text() AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'
test_parseString_bytes() AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'
class XmlGenTest:
test_5027_1() AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'
class ExpatReaderTest:
test_expat_binary_file() AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'
test_expat_text_file() AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'
test_expat_binary_file_nonascii() AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'
test_expat_binary_file_bytes_name() AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'
test_expat_binary_file_int_name() AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'
test_expat_dtdhandler_support() AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'
test_expat_external_dtd_enabled() AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'
test_expat_external_dtd_default() AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'
test_expat_entityresolver_enabled() AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'
test_expat_entityresolver_default() AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'
test_expat_attrs_empty() AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'
test_expat_attrs_wattr() AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'
test_expat_nsattrs_empty() AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'
test_expat_nsattrs_wattr() AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'
test_expat_inpsource_filename() AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'
test_expat_inpsource_sysid() AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'
test_expat_inpsource_sysid_nonascii() AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'
test_expat_inpsource_byte_stream() AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'
test_expat_inpsource_character_stream() AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'
test_expat_incremental() AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'
test_expat_incremental_reset() AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'
test_flush_reparse_deferral_enabled() AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'
test_flush_reparse_deferral_disabled() AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'
test_expat_locator_noinfo() AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'
test_expat_locator_withinfo() AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'
test_expat_locator_withinfo_nonascii() AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'
class ErrorReportingTest:
test_expat_inpsource_location() AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'
test_expat_incomplete() AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'
class LexicalHandlerTest:
test_handlers() AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'
class CDATAHandlerTest:
test_handlers() AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'
I want to push more on getting RustPython's XML capabilities on par with CPython's, so we can replace
extratests/json-tests.pywith a more robust solution involving CPython's own test harness (the--junit-xmlflag onpython -m test). A lot of this may involve making thexmlcrate "behave" more like thelibexpatparser. The goal is not to get all of these boxes checked, but to get enough of them checked such that, e.g.,rustpython -m test --junit-xml test.xml tests.xmltestswill output valid XML. Here's the current state of play (as of 14 June 2026):Lib/test/test_minidom.pyMinidomTest:testGetElementsByTagNameNS()testWriteXML()testAltNewline()testProcessingInstruction()testProcessingInstructionRepr()testRemoveNamedItem()testRemoveNamedItemNS()testCloneElementShallow()testCloneAttributeShallow()testCloneAttributeDeep()testClonePIShallow()testClonePIDeep()testCloneNodeEntity()testSiblings()testEncodings()testRenameAttribute()testSchemaType()testSetIdAttribute()testSetIdAttributeNS()testSetIdAttributeNode()testExceptionOnSpacesInXMLNSValue()test_minidom_attribute_order()test_toxml_with_attributes_ordered()test_toprettyxml_with_attributes_ordered()test_toprettyxml_with_cdata()Lib/test/test_pyexpat.pyParseTest:test_parse_bytes()test_parse_str()test_parse_file()test_parse_again()test_supported_encodings()test_supported_encodings2()test_unsupported_encodings()AssertionError: ValueError not raisedtest_incompatible_encodings()AssertionError: ExpatError not raisedtest_non_text_encodings()AssertionError: LookupError not raisedtest_undefined_encoding()AssertionError: UnicodeError not raisedtest_unknown_encoding()AssertionError: LookupError not raisedNamespaceSeparatorTest:test_illegal()InterningTest:test()test_issue9402()BufferTextTest:test_buffering_enabled()test1()test2()test7()sf1296433Test:test_parse_only_xml_data()TypeError: Expected type 'str' but 'bytes' found.ChardataBufferTest:test_1025_bytes()test_1000_bytes()test_wrong_size()test_unchanged_size()test_disabling_buffer()test_change_size_1()test_change_size_2()ElementDeclHandlerTest:test_trigger_leak()AssertionError: TypeError not raised by Parsetest_deeply_nested_content_model()AssertionError: RecursionError not raisedMalformedInputTest:test1()test2()ErrorMessageTest:test_codes()test_expaterror()ForeignDTDTest:test_use_foreign_dtd()test_ignore_use_foreign_dtd()ParentParserLifetimeTest:test_parent_parser_outlives_its_subparsers__single()AttributeError: 'xmlparser' object has no attribute 'ExternalEntityParserCreate'test_parent_parser_outlives_its_subparsers__multiple()AttributeError: 'xmlparser' object has no attribute 'ExternalEntityParserCreate'test_parent_parser_outlives_its_subparsers__chain()AttributeError: 'xmlparser' object has no attribute 'ExternalEntityParserCreate'ReparseDeferralTest:test_getter_setter_round_trip()AttributeError: 'xmlparser' object has no attribute 'GetReparseDeferralEnabled'test_reparse_deferral_enabled()AttributeError: 'xmlparser' object has no attribute 'GetReparseDeferralEnabled'test_reparse_deferral_disabled()AttributeError: 'xmlparser' object has no attribute 'SetReparseDeferralEnabled'ExpansionProtectionTest: [N.B. this gets appended at the end of the current list]test_set_activation_threshold__threshold_reached()AttributeError: 'xmlparser' object has no attribute 'SetBillionLaughsAttackProtectionMaximumAmplification'test_set_activation_threshold__threshold_not_reached()AttributeError: 'xmlparser' object has no attribute 'SetBillionLaughsAttackProtectionMaximumAmplification'test_set_maximum_amplification__amplification_exceeded()AttributeError: 'xmlparser' object has no attribute 'SetBillionLaughsAttackProtectionMaximumAmplification'test_set_maximum_amplification__amplification_not_exceeded()AttributeError: 'xmlparser' object has no attribute 'SetBillionLaughsAttackProtectionMaximumAmplification'test_set_activation_threshold__fail_for_subparser()AttributeError: 'xmlparser' object has no attribute 'SetBillionLaughsAttackProtectionMaximumAmplification'test_set_activation_threshold__invalid_threshold_type()AttributeError: 'xmlparser' object has no attribute 'SetBillionLaughsAttackProtectionMaximumAmplification'test_set_maximum_amplification__fail_for_subparser()AttributeError: 'xmlparser' object has no attribute 'SetBillionLaughsAttackProtectionMaximumAmplification'test_set_maximum_amplification__infinity()AttributeError: 'xmlparser' object has no attribute 'SetBillionLaughsAttackProtectionMaximumAmplification'test_set_maximum_amplification__invalid_max_factor_range()AttributeError: 'xmlparser' object has no attribute 'SetBillionLaughsAttackProtectionMaximumAmplification'test_set_maximum_amplification__invalid_max_factor_type()AttributeError: 'xmlparser' object has no attribute 'SetBillionLaughsAttackProtectionMaximumAmplification'Lib/test/test_sax.pyParseTest:test_parse_text()AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'test_parse_bytes()AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'test_parse_path_object()AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'test_parse_InputSource()AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'test_parse_close_source()AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'check_parseString()AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'N.B. erroneous?
test_parseString_text()AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'test_parseString_bytes()AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'XmlGenTest:test_5027_1()AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'ExpatReaderTest:test_expat_binary_file()AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'test_expat_text_file()AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'test_expat_binary_file_nonascii()AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'test_expat_binary_file_bytes_name()AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'test_expat_binary_file_int_name()AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'test_expat_dtdhandler_support()AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'test_expat_external_dtd_enabled()AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'test_expat_external_dtd_default()AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'test_expat_entityresolver_enabled()AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'test_expat_entityresolver_default()AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'test_expat_attrs_empty()AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'test_expat_attrs_wattr()AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'test_expat_nsattrs_empty()AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'test_expat_nsattrs_wattr()AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'test_expat_inpsource_filename()AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'test_expat_inpsource_sysid()AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'test_expat_inpsource_sysid_nonascii()AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'test_expat_inpsource_byte_stream()AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'test_expat_inpsource_character_stream()AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'test_expat_incremental()AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'test_expat_incremental_reset()AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'test_flush_reparse_deferral_enabled()AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'test_flush_reparse_deferral_disabled()AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'test_expat_locator_noinfo()AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'test_expat_locator_withinfo()AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'test_expat_locator_withinfo_nonascii()AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'ErrorReportingTest:test_expat_inpsource_location()AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'test_expat_incomplete()AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'LexicalHandlerTest:test_handlers()AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'CDATAHandlerTest:test_handlers()AttributeError: 'xmlparser' object has no attribute 'SetParamEntityParsing'Lib/test/test_xml_dom_minicompat.pyNo tests fail.
Lib/test/test_xml_dom_xmlbuilder.pyNo tests fail.
Lib/test/test_xml_etree.pyElementTreeTest:test_file_init()test_parsefile()test_parseliteral()test_custom_builder()test_custom_builder_only_end_ns()test_children()test_encoding()test_entity()test_namespace()test_attlist_default()IterparseTest:test_basic()test_external_file()test_events()test_namespace_events()test_non_utf8()test_parsing_error()test_resource_warnings_not_exhausted()test_resource_warnings_failed_iteration()test_close_not_exhausted()XMLPullParserTest:test_simple_xml()test_simple_xml_chunk_1()test_simple_xml_chunk_5()test_simple_xml_chunk_22()test_feed_while_iterating()test_simple_xml_with_ns()test_ns_events()test_ns_events_start()test_ns_events_start_end()test_events()test_events_comment()test_events_pi()test_flush_reparse_deferral_enabled()test_flush_reparse_deferral_disabled()test_xinclude_default()test_xinclude()test_xinclude_repeated()test_xinclude_failures()BugsTest:test_bug_xmltoolkit25()test_bug_xmltoolkit39()test_bug_xmltoolkit55()test_bug_xmltoolkit63()test_bug_200708_newline()test_issue6565()test_lost_elem()test_expat224_utf8_bug()test_expat224_utf8_bug_file()BadElementTest:test_deeply_nested_deepcopy()ElementFindTest:test_find_simple()test_find_xpath()test_findall()test_find_through_ElementTree()TreeBuilderTest:test_late_tail_mix_pi_comments()test_doctype()XMLParserTest:test_subclass_doctype()test_parse_string()ParseErrorTest:test_error_position()test_error_code()BoolTest:test_warning()C14NTest:test_simple_roundtrip()test_c14n_exclusion()test_xml_c14n2()Lib/test/test_xml_etree_c.pyNo tests fail.
Lib/test/test_xmlrpc.pyXMLRPCTestCase:test_dump_encoding()test_loads_unsupported()test_load_extension_types()SimpleServerTestCase:test_client_encoding()SimpleServerEncodingTestCase:test_server_encoding()