mirror of
https://github.com/DavidGailleton/42-Piscine_Python.git
synced 2026-03-14 05:06:55 +01:00
195 lines
5.9 KiB
Python
195 lines
5.9 KiB
Python
import datetime
|
|
from typing import Optional
|
|
from pydantic import BaseModel, Field, ValidationError
|
|
|
|
SPACE_STATIONS = [
|
|
{
|
|
"station_id": "LGW125",
|
|
"name": "Titan Mining Outpost",
|
|
"crew_size": 6,
|
|
"power_level": 76.4,
|
|
"oxygen_level": 95.5,
|
|
"last_maintenance": "2023-07-11T00:00:00",
|
|
"is_operational": True,
|
|
"notes": None,
|
|
},
|
|
{
|
|
"station_id": "QCH189",
|
|
"name": "Deep Space Observatory",
|
|
"crew_size": 3,
|
|
"power_level": 70.8,
|
|
"oxygen_level": 88.1,
|
|
"last_maintenance": "2023-08-24T00:00:00",
|
|
"is_operational": False,
|
|
"notes": "System diagnostics required",
|
|
},
|
|
{
|
|
"station_id": "ISS674",
|
|
"name": "Europa Research Station",
|
|
"crew_size": 11,
|
|
"power_level": 82.0,
|
|
"oxygen_level": 91.4,
|
|
"last_maintenance": "2023-10-21T00:00:00",
|
|
"is_operational": True,
|
|
"notes": None,
|
|
},
|
|
{
|
|
"station_id": "ISS877",
|
|
"name": "Mars Orbital Platform",
|
|
"crew_size": 9,
|
|
"power_level": 79.7,
|
|
"oxygen_level": 87.2,
|
|
"last_maintenance": "2023-10-06T00:00:00",
|
|
"is_operational": False,
|
|
"notes": "System diagnostics required",
|
|
},
|
|
{
|
|
"station_id": "LGW194",
|
|
"name": "Deep Space Observatory",
|
|
"crew_size": 4,
|
|
"power_level": 80.2,
|
|
"oxygen_level": 89.9,
|
|
"last_maintenance": "2023-10-25T00:00:00",
|
|
"is_operational": False,
|
|
"notes": "System diagnostics required",
|
|
},
|
|
{
|
|
"station_id": "ISS847",
|
|
"name": "Solar Wind Monitor",
|
|
"crew_size": 11,
|
|
"power_level": 73.6,
|
|
"oxygen_level": 98.1,
|
|
"last_maintenance": "2023-12-11T00:00:00",
|
|
"is_operational": False,
|
|
"notes": "System diagnostics required",
|
|
},
|
|
{
|
|
"station_id": "QCH400",
|
|
"name": "Asteroid Belt Relay",
|
|
"crew_size": 12,
|
|
"power_level": 75.5,
|
|
"oxygen_level": 86.0,
|
|
"last_maintenance": "2023-07-15T00:00:00",
|
|
"is_operational": False,
|
|
"notes": "System diagnostics required",
|
|
},
|
|
{
|
|
"station_id": "ERS891",
|
|
"name": "Titan Mining Outpost",
|
|
"crew_size": 4,
|
|
"power_level": 94.4,
|
|
"oxygen_level": 97.3,
|
|
"last_maintenance": "2023-09-25T00:00:00",
|
|
"is_operational": True,
|
|
"notes": "All systems nominal",
|
|
},
|
|
{
|
|
"station_id": "ABR266",
|
|
"name": "Asteroid Belt Relay",
|
|
"crew_size": 8,
|
|
"power_level": 76.0,
|
|
"oxygen_level": 88.8,
|
|
"last_maintenance": "2023-07-10T00:00:00",
|
|
"is_operational": False,
|
|
"notes": "System diagnostics required",
|
|
},
|
|
{
|
|
"station_id": "LGW723",
|
|
"name": "Mars Orbital Platform",
|
|
"crew_size": 11,
|
|
"power_level": 90.8,
|
|
"oxygen_level": 87.3,
|
|
"last_maintenance": "2023-09-25T00:00:00",
|
|
"is_operational": False,
|
|
"notes": "System diagnostics required",
|
|
},
|
|
]
|
|
|
|
|
|
class SpaceStation(BaseModel):
|
|
station_id: str = Field(max_length=10, min_length=3)
|
|
name: str = Field(min_length=1, max_length=50)
|
|
crew_size: int = Field(le=20, ge=1)
|
|
power_level: float = Field(ge=0.0, le=100.0)
|
|
oxygen_level: float = Field(ge=0.0, le=100.0)
|
|
last_maintenance: datetime.datetime
|
|
is_operational: bool = Field(default=True)
|
|
notes: str | None = Field(default=None, max_length=200)
|
|
|
|
|
|
def main() -> None:
|
|
try:
|
|
valid_station = {
|
|
"station_id": "ISS001",
|
|
"name": "International Space Station",
|
|
"crew_size": 6,
|
|
"power_level": 85.5,
|
|
"oxygen_level": 92.3,
|
|
"last_maintenance": "2023-09-25T00:00:00",
|
|
}
|
|
|
|
invalid_station = {
|
|
"station_id": "ISS001",
|
|
"name": "International Space Station",
|
|
"crew_size": 26,
|
|
"power_level": 85.5,
|
|
"oxygen_level": 92.3,
|
|
"last_maintenance": "2023-09-25T00:00:00",
|
|
}
|
|
|
|
try:
|
|
print("\nValid station:n\n")
|
|
ss = SpaceStation(**valid_station)
|
|
print("Valid station created")
|
|
print(
|
|
f"ID: {ss.station_id}\n"
|
|
f"Name {ss.name}\n"
|
|
f"Crew: {ss.crew_size} people\n"
|
|
f"Power: {ss.power_level}%\n"
|
|
f"Oxygen: {ss.oxygen_level}%\n"
|
|
f"Status: {'operational' if ss.is_operational else 'not operational'}\n"
|
|
f"Note: {ss.notes}\n"
|
|
)
|
|
except ValidationError as err:
|
|
print(err)
|
|
|
|
try:
|
|
print("\nInvalid station:\n")
|
|
ss = SpaceStation(**invalid_station)
|
|
print("Valid station created")
|
|
print(
|
|
f"ID: {ss.station_id}\n"
|
|
f"Name {ss.name}\n"
|
|
f"Crew: {ss.crew_size} people\n"
|
|
f"Power: {ss.power_level}%\n"
|
|
f"Oxygen: {ss.oxygen_level}%\n"
|
|
f"Status: {'operational' if ss.is_operational else 'not operational'}\n"
|
|
f"Note: {ss.notes}\n"
|
|
)
|
|
except ValidationError as err:
|
|
print(err)
|
|
|
|
print("\nBatch stations:\n")
|
|
for station in SPACE_STATIONS:
|
|
try:
|
|
ss = SpaceStation(**station)
|
|
print("========================================")
|
|
print("Valid station created")
|
|
print(
|
|
f"ID: {ss.station_id}\n"
|
|
f"Name {ss.name}\n"
|
|
f"Crew: {ss.crew_size} people\n"
|
|
f"Power: {ss.power_level}%\n"
|
|
f"Oxygen: {ss.oxygen_level}%\n"
|
|
f"Status: {'operational' if ss.is_operational else 'not operational'}\n"
|
|
f"Note: {ss.notes}\n"
|
|
)
|
|
except ValidationError as e:
|
|
print(e.errors())
|
|
except Exception as err:
|
|
print(err)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|