Skip to main content

Official Python client for TofuPilot with OpenHTF integration, real-time streaming and file attachment support

Project description

TofuPilot Python SDK

PyPI version License: MIT Tests

The official Python SDK for TofuPilot. Integrate your hardware test runs into one app with just a few lines of Python.

Installation

pip install tofupilot

Quick Start

import os
from tofupilot.v2 import TofuPilot

with TofuPilot(api_key=os.getenv("TOFUPILOT_API_KEY")) as client:
    run = client.runs.create(
        procedure_id="your-procedure-id",
        serial_number="SN001",
        part_number="PN001",
        outcome="PASS",
    )
    print(f"Run created: {run.id}")

Authentication

Set your API key as an environment variable:

export TOFUPILOT_API_KEY="your-api-key"

Or pass it directly:

client = TofuPilot(api_key="your-api-key")

To point to a different server (e.g. self-hosted):

client = TofuPilot(api_key="your-api-key", server_url="https://your-instance.com/api")

Available Resources

Resource Operations
client.runs list, create, get, delete, update
client.runs.attachments upload, download
client.units list, create, get, delete, update, add_child, remove_child
client.units.attachments upload, download, delete
client.parts list, create, get, delete, update
client.parts.revisions create, get, delete, update
client.procedures list, create, get, delete, update
client.procedures.versions create, get, delete
client.batches list, create, get, delete, update
client.stations list, create, get, get_current, remove, update
client.user list

Usage Examples

Create a run with measurements

from datetime import datetime, timedelta, timezone

run = client.runs.create(
    procedure_id=procedure_id,
    serial_number="SN-001",
    part_number="PCB-V1",
    outcome="PASS",
    started_at=datetime.now(timezone.utc) - timedelta(minutes=5),
    ended_at=datetime.now(timezone.utc),
    phases=[{
        "name": "Voltage Test",
        "outcome": "PASS",
        "started_at": datetime.now(timezone.utc) - timedelta(minutes=5),
        "ended_at": datetime.now(timezone.utc),
        "measurements": [{
            "name": "Output Voltage",
            "outcome": "PASS",
            "measured_value": 3.3,
            "units": "V",
            "validators": [
                {"operator": ">=", "expected_value": 3.0},
                {"operator": "<=", "expected_value": 3.6},
            ],
        }],
    }],
)

List and filter runs

result = client.runs.list(
    part_numbers=["PCB-V1"],
    outcomes=["PASS"],
    limit=10,
)

for run in result.data:
    print(f"{run.id}{run.unit.serial_number}")

Manage units and sub-units

# Create part and revision
client.parts.create(number="PCB-V1", name="Main Board")
client.parts.revisions.create(part_number="PCB-V1", number="REV-A")

# Create units
client.units.create(serial_number="PARENT-001", part_number="PCB-V1", revision_number="REV-A")
client.units.create(serial_number="CHILD-001", part_number="PCB-V1", revision_number="REV-A")

# Link parent-child
client.units.add_child(serial_number="PARENT-001", child_serial_number="CHILD-001")

Attach files to runs and units

# Upload a file to a run
client.runs.attachments.upload(id=run_id, file="report.pdf")

# Upload a file to a unit
client.units.attachments.upload(serial_number="SN-0001", file="calibration.pdf")

# Download an attachment
run = client.runs.get(id=run_id)
client.runs.attachments.download(run.attachments[0], dest="local-copy.pdf")

# Delete a unit attachment
client.units.attachments.delete(serial_number="SN-0001", ids=[attachment_id])

Error Handling

from tofupilot.v2.models.errors import ErrorNOTFOUND, ErrorBADREQUEST

try:
    client.runs.get(id="nonexistent-id")
except ErrorNOTFOUND as e:
    print(f"Not found: {e.message}")
except ErrorBADREQUEST as e:
    print(f"Bad request: {e.message}")
Exception Status Code
ErrorBADREQUEST 400
ErrorUNAUTHORIZED 401
ErrorFORBIDDEN 403
ErrorNOTFOUND 404
ErrorCONFLICT 409
ErrorUNPROCESSABLECONTENT 422
ErrorINTERNALSERVERERROR 500

Running Tests

cd clients/python-speakeasy
cp tests/.env.local.example tests/.env.local  # Set your API key and URL
python -m pytest tests/v2/

Documentation

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

tofupilot-2.13.2.tar.gz (135.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

tofupilot-2.13.2-py3-none-any.whl (219.4 kB view details)

Uploaded Python 3

File details

Details for the file tofupilot-2.13.2.tar.gz.

File metadata

  • Download URL: tofupilot-2.13.2.tar.gz
  • Upload date:
  • Size: 135.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for tofupilot-2.13.2.tar.gz
Algorithm Hash digest
SHA256 99545dbc7e3f529fae7cae2ad1cbd1941d9e57315b7bd3322d9b0e37ad630a35
MD5 5b7091e58c1d2ffd7237aa4ffca1dc0b
BLAKE2b-256 9b12a641867d451d6ae504b960658c9c7dc2891d0364fc5705c5b5345bcf697e

See more details on using hashes here.

Provenance

The following attestation bundles were made for tofupilot-2.13.2.tar.gz:

Publisher: release-python-client.yml on tofupilot/tofupilot

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file tofupilot-2.13.2-py3-none-any.whl.

File metadata

  • Download URL: tofupilot-2.13.2-py3-none-any.whl
  • Upload date:
  • Size: 219.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for tofupilot-2.13.2-py3-none-any.whl
Algorithm Hash digest
SHA256 7e6f9a203d3b04cce4e132ed879bbd45b84de098a9113cc5f07323344c43c600
MD5 e8ccab6a2a44ad3e187f28902dcc04fe
BLAKE2b-256 8c947ed1f1b80e2de42c7563baaf634b1472d3cba87f06b245aeb31f952b297e

See more details on using hashes here.

Provenance

The following attestation bundles were made for tofupilot-2.13.2-py3-none-any.whl:

Publisher: release-python-client.yml on tofupilot/tofupilot

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page