Copy-paste ready examples, from a three-liner to a full multi-section RF validation report. All downloadable as HTML, Excel, and PDF.
flat API Three measurements, no header, no sections. One file output.
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")
ReportHeader Adds engineer, serial, revision and custom metadata to the top of the report.
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")
range tuple lambda threshold N/A Shows every evaluation mode side by side.
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")
Section TestTable Mirrors a numbered test procedure: sections, sub-tables, test numbers.
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")
programmatic Build a report from a list of dicts — typical when reading from a CSV or instrument API.
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")
flat + sections Use report.add() and add_section() together. Flat measurements appear after all sections.
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")