Nivel 16: demo_level16.py

Este es el nivel 16 del tour de aprendizaje.

Código Fuente

"""
DEMO LEVEL 16: Secure Telemetry (Pydantic)
------------------------------------------
Adds: Validation of sensor data with Pydantic models.
Accumulates: Vehicle telemetry (L3).

DIAGRAM:
(read_sensors) -> [pressure: 2.2, fuel: 80]
      |
      v
(validate_telemetry @to_obj(Model)) -> Ensures real physical data!
"""

import random
from typing import Any, Dict

from pydantic import BaseModel, Field

from wpipe import Pipeline, step, to_obj

# NEW IN L16: The car only accepts data in logical physical ranges
class SensorData(BaseModel):
    """Pydantic model for sensor data validation."""
    tire_pressure: float = Field(..., ge=1.5, le=3.5)
    fuel_level: float = Field(..., ge=0, le=100)

@step(name="read_obd2")
def read_obd2(data: Any) -> Dict[str, Any]:
    """Read OBD2 data step.

    Args:
        data: Input data for the step.

    Returns:
        Dict[str, Any]: Sensor readings.
    """
    print("📡 Reading OBD2 data bus...")

    if random.random() < 0.5:
        # This will fail validation because fuel_level is missing
        return {"tire_pressure": 2.3, "brake_activated": True}

    return {"tire_pressure": 2.3, "fuel_level": 75.0}

@step(name="analyze_safety")
@to_obj(SensorData)  # <--- ACTIVE VALIDATION
def analyze_safety(ctx: SensorData) -> Dict[str, bool]:
    """Analyzes vehicle safety based on validated telemetry.

    Args:
        ctx: Validated sensor data context.

    Returns:
        Dict[str, bool]: Safety status.
    """
    print(
        f"📊 Validated Telemetry: Pressure={ctx.tire_pressure}bar, Fuel={ctx.fuel_level}%"
    )
    return {"safe_to_circulate": True}

if __name__ == "__main__":
    pipe = Pipeline(pipeline_name="trip_l16_securedata", verbose=True)
    pipe.set_steps([read_obd2, analyze_safety])

    try:
        pipe.run({})
    except Exception as e:
        print(f"Validation Error: {e}")

Resultado de Ejecución


📡 Reading OBD2 data bus… trip_l16_securedata ━━━━━━━━━━━━━━━━━━━━ 50% -:–:– Validation Error: [Error Code: 502] Pydantic validation failed: Missing required variable: ‘fuel_level’