vehicles.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. # app/schemas/vehicles.py
  2. from typing import Literal, Optional
  3. from pydantic import BaseModel, Field
  4. # --- Vehicles ---
  5. class VehicleBase(BaseModel):
  6. id: str = Field(..., description="Unique vehicle identifier")
  7. name: str = Field(..., description="Vehicle display name")
  8. # --- Remote Information ---
  9. class RemoteInfo(BaseModel):
  10. """Git remote repository information."""
  11. name: str = Field(..., description="Remote name (e.g., 'ardupilot')")
  12. url: str = Field(..., description="Git repository URL")
  13. # --- Versions ---
  14. class VersionBase(BaseModel):
  15. id: str = Field(..., description="Unique version identifier")
  16. name: str = Field(..., description="Version display name")
  17. type: Literal["beta", "stable", "latest", "tag"] = Field(
  18. ..., description="Version type classification"
  19. )
  20. remote: RemoteInfo = Field(
  21. ..., description="Git remote repository information for the version"
  22. )
  23. commit_ref: Optional[str] = Field(
  24. None, description="Git reference (tag, branch name, or commit SHA)"
  25. )
  26. class VersionOut(VersionBase):
  27. vehicle_id: str = Field(
  28. ..., description="Vehicle identifier associated with this version"
  29. )
  30. # --- Boards ---
  31. class BoardBase(BaseModel):
  32. id: str = Field(..., description="Unique board identifier")
  33. name: str = Field(..., description="Board display name")
  34. class BoardOut(BoardBase):
  35. vehicle_id: str = Field(..., description="Associated vehicle identifier")
  36. version_id: str = Field(..., description="Associated version identifier")
  37. class StandardArtifactOut(BaseModel):
  38. name: str = Field(..., description="Artifact filename")
  39. url: str = Field(..., description="Download URL on firmware.ardupilot.org")
  40. format: str = Field(..., description="Artifact format (e.g. apj)")
  41. size: Optional[int] = Field(None, description="File size in bytes")
  42. # --- Features ---
  43. class CategoryBase(BaseModel):
  44. id: str = Field(..., description="Unique category identifier")
  45. name: str = Field(..., description="Category display name")
  46. description: Optional[str] = Field(
  47. None, description="Category description"
  48. )
  49. class FeatureDefault(BaseModel):
  50. enabled: bool = Field(
  51. ..., description="Whether feature is enabled by default"
  52. )
  53. source: Literal["firmware-server", "build-options-py"] = Field(
  54. ...,
  55. description=(
  56. "Source of the default value: 'firmware-server' from "
  57. "firmware.ardupilot.org, 'build-options-py' from git repository"
  58. )
  59. )
  60. class FeatureBase(BaseModel):
  61. id: str = Field(..., description="Unique feature identifier/flag name")
  62. name: str = Field(..., description="Feature display name")
  63. category: CategoryBase = Field(..., description="Feature category")
  64. description: Optional[str] = Field(
  65. None, description="Feature description"
  66. )
  67. class FeatureOut(FeatureBase):
  68. vehicle_id: str = Field(..., description="Associated vehicle identifier")
  69. version_id: str = Field(..., description="Associated version identifier")
  70. board_id: str = Field(..., description="Associated board identifier")
  71. default: FeatureDefault = Field(
  72. ..., description="Default state for this feature on this board"
  73. )
  74. dependencies: list[str] = Field(
  75. default_factory=list,
  76. description="List of feature IDs that this feature depends on"
  77. )