Examples

Examples

Copy-paste ready examples, from a three-liner to a full multi-section RF validation report. All downloadable as HTML, Excel, and PDF.


Barebones — absolute minimum

flat API Three measurements, no header, no sections. One file output.

barebones.py
from instrumation_report import Report, Measurement

r = Report()
r.add(Measurement("3.3V Rail", 3.31, "V",  condition=(3.2,  3.4)))
r.add(Measurement("5V Rail",   5.02, "V",  condition=(4.9,  5.1)))
r.add(Measurement("Fan Speed", 2950, "rpm", condition=lambda v: v > 2500))
r.generate_html("report.html")

With UUT header

ReportHeader Adds engineer, serial, revision and custom metadata to the top of the report.

with_header.py
from instrumation_report import Report, ReportHeader, Measurement

report = Report(header=ReportHeader(
    title="Power Supply Acceptance Test",
    subtitle="Final QA — Line 3",
    engineer="Abduznik",
    uut_name="PSU-500W",
    uut_serial="SN-00042",
    revision="B",
    extra_fields={"Batch": "2024-Q4", "Station": "TS-01"},
))

report.add(Measurement("Output Voltage", 12.01, "V",  condition=(11.8,  12.2)))
report.add(Measurement("Ripple",         18.5,  "mV", condition=lambda v: v < 50))
report.add(Measurement("Efficiency",    88.4,  "%",  condition=85.0))
report.add(Measurement("Heatsink Temp", 42.3,  "°C"))  # informational — N/A

report.generate_html("report.html")
report.generate_excel("report.xlsx")

All condition types

range tuple lambda threshold N/A Shows every evaluation mode side by side.

conditions.py
from instrumation_report import Report, Measurement

r = Report()

# Range tuple — lo <= value <= hi
r.add(Measurement("Voltage",       4.7,  "V",   condition=(4.0, 5.0),       expected="4.0–5.0 V"))

# Lambda — any callable returning bool
r.add(Measurement("Frequency",     1002, "Hz",  condition=lambda v: v > 1000, expected="> 1000 Hz"))

# Lambda with compound logic
r.add(Measurement("Phase",         -2.1, "deg", condition=lambda v: -5 <= v <= 5, expected="±5°"))

# Threshold float — value >= threshold
r.add(Measurement("Return Loss",   18.5, "dB",  condition=15.0,            expected=">= 15 dB"))

# No condition — appears as N/A, never pass/fails
r.add(Measurement("Temperature",   24.3, "°C"))

r.generate_html("report.html")

Multi-section structured report

Section TestTable Mirrors a numbered test procedure: sections, sub-tables, test numbers.

examples/generate.py
from instrumation_report import Report, ReportHeader, Section, TestTable, Measurement

report = Report(header=ReportHeader(
    title="RF Subsystem Validation",
    subtitle="Production Test — Board Rev A",
    engineer="Abduznik",
    uut_name="Signal Analyzer Module",
    uut_serial="SN-2024-001",
    revision="A",
    extra_fields={"Batch": "LOT-88B", "Test Station": "TS-02"},
))

# Section 1 — Power
s1 = Section(number="1", title="Power Supply Checks", subtitle="DC rail validation")
t1 = TestTable(title="Voltage Rails", sub_number="1.1")
t1.add(Measurement("3.3V Rail", 3.31, "V", condition=(3.2, 3.4),   test_number="1.1.1", expected="3.2–3.4V"))
t1.add(Measurement("5V Rail",   5.02, "V", condition=(4.9, 5.1),   test_number="1.1.2", expected="4.9–5.1V"))
t1.add(Measurement("12V Rail",  11.0, "V", condition=(11.5, 12.5), test_number="1.1.3", expected="11.5–12.5V", notes="Under spec"))
s1.add_table(t1)
report.add_section(s1)

# Section 2 — RF
s2 = Section(number="2", title="RF Performance")
t2 = TestTable(title="Frequency Response", sub_number="2.1")
t2.add(Measurement("Center Freq", 2401.5, "MHz", condition=(2400, 2403), test_number="2.1.1"))
t2.add(Measurement("Insertion Loss", 2.1, "dB", condition=lambda v: v < 3, test_number="2.1.2"))
t2.add(Measurement("Return Loss",   18.5, "dB", condition=15.0,             test_number="2.1.3"))
s2.add_table(t2)
report.add_section(s2)

report.generate_html("report.html")
report.generate_excel("report.xlsx")
report.generate_pdf("report.pdf")

Loop over measurement data

programmatic Build a report from a list of dicts — typical when reading from a CSV or instrument API.

from_data.py
from instrumation_report import Report, ReportHeader, Measurement

# Could come from a CSV, a dict, instrument readings, etc.
data = [
    {"name": "Ch1 Voltage", "value": 3.29, "unit": "V", "lo": 3.2,  "hi": 3.4},
    {"name": "Ch2 Voltage", "value": 5.01, "unit": "V", "lo": 4.9,  "hi": 5.1},
    {"name": "Ch3 Voltage", "value": 11.8, "unit": "V", "lo": 11.5, "hi": 12.5},
    {"name": "Ch4 Voltage", "value": 24.1, "unit": "V", "lo": 23.5, "hi": 24.5},
]

report = Report(header=ReportHeader(title="Multi-Channel Voltage Sweep"))

for i, row in enumerate(data, 1):
    report.add(Measurement(
        name=row["name"],
        value=row["value"],
        unit=row["unit"],
        condition=(row["lo"], row["hi"]),
        test_number=str(i),
        expected=f"{row['lo']}–{row['hi']} V",
    ))

report.generate_html("sweep_report.html")

Mix flat and structured

flat + sections Use report.add() and add_section() together. Flat measurements appear after all sections.

mixed.py
from instrumation_report import Report, Section, TestTable, Measurement

r = Report()

# Structured section
s = Section(number="1", title="Core Tests")
t = TestTable(title="Voltages", sub_number="1.1")
t.add(Measurement("3.3V Rail", 3.31, "V", condition=(3.2, 3.4)))
s.add_table(t)
r.add_section(s)

# Flat measurements (quick additions, appended after sections)
r.add(Measurement("Board Temperature", 38.2, "°C"))
r.add(Measurement("Firmware Version",  3.0,  "",   condition=3.0, notes="Min required"))

r.generate_html("report.html")
Run any of these live → Full API reference