def flatten_metadata(metadata): """ Convert a `dict` representation of a ``METADATA`` file as returned by `inspect_wheel()` to a sequence of ``(fieldname, value)`` pairs in which both elements are ready for display in HTML. Known fields are listed in an opinionated order. Unknown fields are listed at the end in lexicographic order. The ``description`` field is omitted; the caller must render it separately. """ metadata = metadata.copy() for field in ''' metadata_version name version summary author author_email maintainer maintainer_email home_page download_url project_url license keywords classifier platform supported_platform requires_python requires_dist provides_extra description_content_type obsoletes obsoletes_dist provides provides_dist requires requires_external '''.split(): value = metadata.pop(field, None) if value is None: continue fieldname = field.replace('_', '-').title() if field == 'requires_dist': for req in value: s = Markup('<a href="{}">{}</a>'.format( url_for('.project', project=normalize(req["name"])), req["name"], )) if req["extras"]: s += f'[{",".join(req["extras"])}]' if req["url"] is not None: s += ' @ ' + extlink(req["url"]) if req["specifier"]: s += f' ({req["specifier"]})' if req["marker"] is not None: if req["url"] is not None and req["specifier"] is None: s += ' ' s += '; ' + req["marker"] yield (fieldname, s) elif field == 'project_url': for purl in value: if purl["label"] is None: yield (fieldname, extlink(purl["url"])) else: yield ( fieldname, purl["label"] + ', ' + extlink(purl["url"]), ) elif field in ('home_page', 'download_url'): yield (fieldname, extlink(value)) elif field in ('author_email', 'maintainer_email'): value = Markup('<span class="at">[at]</span>')\ .join(map(Markup.escape, value.split('@'))) yield (fieldname, value) elif isinstance(value, list): for v in value: yield (fieldname, v) else: yield (fieldname, value) metadata.pop("description", None) # Caller must handle this separately for field, value in sorted(metadata.items()): if value is None: continue fieldname = field.replace('_', '-').title() if isinstance(value, list): for v in value: yield (fieldname, v) else: yield (fieldname, value)