Yield lists of RPM raw tags, one list for each RPM from an XML'ish ``text``. The XML'ish format is in fact multiple XML documents, one for each package wrapped in an root element. Therefore, we add a global root element to make this a valid XML document before parsing i
(text)
| 63 | |
| 64 | |
| 65 | def collect_rpms(text): |
| 66 | """ |
| 67 | Yield lists of RPM raw tags, one list for each RPM from an XML'ish ``text``. |
| 68 | |
| 69 | The XML'ish format is in fact multiple XML documents, one for each package |
| 70 | wrapped in an <rpmHeader> root element. Therefore, we add a global root |
| 71 | element to make this a valid XML document before parsing it. |
| 72 | |
| 73 | Each XML document represents one RPM package and has this overall shape: |
| 74 | <rpmHeader> |
| 75 | .... |
| 76 | <rpmTag name="Name"><string>perl-Errno</string></rpmTag> |
| 77 | <rpmTag name="Version"><string>1.30</string></rpmTag> |
| 78 | ...... |
| 79 | <rpmTag name="License"><string>GPL+ or Artistic</string></rpmTag> |
| 80 | .... |
| 81 | <rpmTag name="Filesizes"> |
| 82 | <integer>6863</integer> |
| 83 | <integer>2629</integer> |
| 84 | </rpmTag> |
| 85 | <rpmTag name="Filemodes"> |
| 86 | <integer>33188</integer> |
| 87 | <integer>33188</integer> |
| 88 | </rpmTag> |
| 89 | ... |
| 90 | </rpmHeader> |
| 91 | |
| 92 | After wrapping in a top level element we get this shape: |
| 93 | <rpms> |
| 94 | <rpmHeader/> |
| 95 | <rpmHeader/> |
| 96 | </rpms> |
| 97 | |
| 98 | When parsed with xmltodict we end up with this structure: |
| 99 | {'rpms': {'rpmHeader': [ |
| 100 | {'rpmTag': [ |
| 101 | {'@name': 'Name', 'string': 'boost-license1_71_0'}, |
| 102 | {'@name': 'Version', 'string': '1.71.0'}, |
| 103 | {'@name': 'Filesizes', 'integer': ['0', '1338']}, |
| 104 | {'@name': 'Filestates', 'integer': ['0', '0']}, |
| 105 | ]}, |
| 106 | {'rpmTag': [ |
| 107 | {'@name': 'Name', 'string': 'foobar'}, |
| 108 | {'@name': 'Version', 'string': '1.0'}, |
| 109 | ... |
| 110 | ]}, |
| 111 | }} |
| 112 | |
| 113 | Some of these structures are peculiar as there are parallel lists (for |
| 114 | instance for files) and each name comes with a type. |
| 115 | """ |
| 116 | text = f'<rpms>{text}</rpms>' |
| 117 | parsed = xmltodict.parse(text, dict_constructor=dict) |
| 118 | rpms = parsed['rpms']['rpmHeader'] |
| 119 | for rpm in rpms: |
| 120 | yield rpm['rpmTag'] |
| 121 | |
| 122 |
no test coverage detected