Source code for fgen_runtime.formatting

"""
Formatting of fgen wrapped objects
"""
from __future__ import annotations

from collections.abc import Iterable
from typing import TYPE_CHECKING, Any

import fgen_runtime.exceptions as fgr_excs

if TYPE_CHECKING:
    from fgen_runtime.base import FinalizableWrapperBase


[docs]def get_attribute_str_value(instance: FinalizableWrapperBase, attribute: str) -> str: """ Get the string version of an attribute's value Parameters ---------- instance Instance from which to get the attribute attribute Attribute for which to get the value Returns ------- String version of the attribute's value, with graceful handling of errors. """ try: return f"{attribute}={getattr(instance, attribute)}" except fgr_excs.UnallocatedMemoryError: return f"{attribute} is unallocated"
[docs]def to_str(instance: FinalizableWrapperBase, exposed_attributes: Iterable[str]) -> str: """ Convert an instance to its string representation Parameters ---------- instance Instance to convert exposed_attributes Attributes from Fortran that the instance exposes Returns ------- String representation of the instance """ if not instance.initialized: return f"Uninitialised {instance!r}" if not exposed_attributes: return repr(instance) attribute_values = [ get_attribute_str_value(instance, v) for v in exposed_attributes ] return f"{repr(instance)[:-1]}, {', '.join(attribute_values)})"
[docs]def to_pretty( instance: FinalizableWrapperBase, exposed_attributes: Iterable[str], p: Any, cycle: bool, indent: int = 4, ) -> None: """ Pretty-print an instance Parameters ---------- instance Instance to convert exposed_attributes Attributes from Fortran that the instance exposes p Pretty printing object cycle Whether the pretty printer has detected a cycle or not. indent Indent to apply to the pretty printing group """ if not instance.initialized: p.text(str(instance)) return if not exposed_attributes: p.text(str(instance)) return with p.group(indent, f"{repr(instance)[:-1]}", ")"): for att in exposed_attributes: p.text(",") p.breakable() p.text(get_attribute_str_value(instance, att))
[docs]def add_attribute_row( attribute_name: str, attribute_value: str, attribute_rows: list[str] ) -> list[str]: """ Add a row for displaying an attribute's value to a list of rows Parameters ---------- attribute_name Attribute's name attribute_value Attribute's value attribute_rows Existing attribute rows Returns ------- Attribute rows, with the new row appended """ attribute_rows.append( f"<tr><th>{attribute_name}</th><td style='text-align:left;'>{attribute_value}</td></tr>" # noqa: E501 ) return attribute_rows
[docs]def to_html(instance: FinalizableWrapperBase, exposed_attributes: Iterable[str]) -> str: """ Convert an instance to its html representation Parameters ---------- instance Instance to convert exposed_attributes Attributes from Fortran that the instance exposes Returns ------- HTML representation of the instance """ if not instance.initialized: return str(instance) if not exposed_attributes: return str(instance) instance_class_name = repr(instance).split("(")[0] attribute_rows: list[str] = [] for att in exposed_attributes: try: att_val = getattr(instance, att) except fgr_excs.UnallocatedMemoryError: att_val = "Unallocated" attribute_rows = add_attribute_row(att, att_val, attribute_rows) continue try: att_val = att_val._repr_html_() except AttributeError: att_val = str(att_val) attribute_rows = add_attribute_row(att, att_val, attribute_rows) attribute_rows_for_table = "\n ".join(attribute_rows) css_style = """.fgen-wrap { /*font-family: monospace;*/ width: 540px; } .fgen-header { padding: 6px 0 6px 3px; border-bottom: solid 1px #777; color: #555;; } .fgen-header > div { display: inline; margin-top: 0; margin-bottom: 0; } .fgen-basefinalizable-cls, .fgen-basefinalizable-instance-index { margin-left: 2px; margin-right: 10px; } .fgen-basefinalizable-cls { font-weight: bold; color: #000000; }""" return "\n".join( [ "<div>", " <style>", f"{css_style}", " </style>", " <div class='fgen-wrap'>", " <div class='fgen-header'>", f" <div class='fgen-basefinalizable-cls'>{instance_class_name}</div>", f" <div class='fgen-basefinalizable-instance-index'>instance_index={instance.instance_index}</div>", # noqa: E501 " <table><tbody>", f" {attribute_rows_for_table}", " </tbody></table>", " </div>", " </div>", "</div>", ] )