models.py 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import hashlib
  2. from dataclasses import dataclass
  3. from metadata_manager.firmware_server.models import ReleaseRecord
  4. @dataclass(frozen=True)
  5. class ForkRemoteSpec:
  6. """GitHub owner and repo for a whitelisted fork."""
  7. owner: str
  8. repo: str
  9. @property
  10. def github_repo(self) -> str:
  11. return f"{self.owner}/{self.repo}"
  12. @property
  13. def url(self) -> str:
  14. return f"https://github.com/{self.github_repo}.git"
  15. @dataclass(frozen=True)
  16. class RemoteInfo:
  17. name: str
  18. url: str
  19. def to_dict(self):
  20. return {
  21. "name": self.name,
  22. "url": self.url,
  23. }
  24. class VersionInfo:
  25. """Version metadata exposed to the rest of the application."""
  26. def __init__(
  27. self,
  28. remote_info: RemoteInfo,
  29. commit_ref: str,
  30. release_type: str,
  31. version_number: str,
  32. ) -> None:
  33. self.remote_info = remote_info
  34. self.commit_ref = commit_ref
  35. self.release_type = release_type
  36. self.version_number = version_number
  37. commit_ref_sanitized = commit_ref.replace("/", "-")
  38. commit_ref_hash = hashlib.md5(commit_ref.encode()).hexdigest()[:8]
  39. self.version_id = (
  40. f"{remote_info.name}-{commit_ref_sanitized}-{commit_ref_hash}"
  41. )
  42. @classmethod
  43. def from_release_record(
  44. cls,
  45. remote_info: RemoteInfo,
  46. release: ReleaseRecord,
  47. ) -> "VersionInfo":
  48. return cls(
  49. remote_info=remote_info,
  50. commit_ref=release.commit_reference,
  51. release_type=release.release_type,
  52. version_number=release.version_number,
  53. )