xref: /aosp_15_r20/external/cronet/android/tools/license/metadata.py (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Workerfrom typing import Dict, List
2*6777b538SAndroid Build Coastguard Workerimport license_utils
3*6777b538SAndroid Build Coastguard Workerimport metadata_dictionary
4*6777b538SAndroid Build Coastguard Workerfrom license_type import LicenseType
5*6777b538SAndroid Build Coastguard Worker
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Workerclass Metadata:
8*6777b538SAndroid Build Coastguard Worker  def __init__(self, metadata_dict: Dict[str, str | List[str]]):
9*6777b538SAndroid Build Coastguard Worker    self.metadata = metadata_dict
10*6777b538SAndroid Build Coastguard Worker
11*6777b538SAndroid Build Coastguard Worker  def get_name(self) -> str:
12*6777b538SAndroid Build Coastguard Worker    return self.metadata["Name"]
13*6777b538SAndroid Build Coastguard Worker
14*6777b538SAndroid Build Coastguard Worker  def get_url(self) -> str:
15*6777b538SAndroid Build Coastguard Worker    return self.metadata["URL"]
16*6777b538SAndroid Build Coastguard Worker
17*6777b538SAndroid Build Coastguard Worker  def get_version(self):
18*6777b538SAndroid Build Coastguard Worker    if not self._get_version() or self._get_version() in ["0", "unknown",
19*6777b538SAndroid Build Coastguard Worker                                                          "N/A"]:
20*6777b538SAndroid Build Coastguard Worker      # This is a heuristic try to avoid putting a version when the version
21*6777b538SAndroid Build Coastguard Worker      # in the README.chromium does not make any sense.
22*6777b538SAndroid Build Coastguard Worker      return self._get_revision()
23*6777b538SAndroid Build Coastguard Worker    return self._get_version()
24*6777b538SAndroid Build Coastguard Worker
25*6777b538SAndroid Build Coastguard Worker  def _get_version_control(self):
26*6777b538SAndroid Build Coastguard Worker    """Returns the VCS of the URL provided if possible,
27*6777b538SAndroid Build Coastguard Worker    otherwise None is returned."""
28*6777b538SAndroid Build Coastguard Worker    if "git" in self.get_url() or "googlesource" in self.get_url():
29*6777b538SAndroid Build Coastguard Worker      return "Git"
30*6777b538SAndroid Build Coastguard Worker    elif "hg" in self.get_url():
31*6777b538SAndroid Build Coastguard Worker      return "Hg"
32*6777b538SAndroid Build Coastguard Worker    return None
33*6777b538SAndroid Build Coastguard Worker
34*6777b538SAndroid Build Coastguard Worker  def _create_identifier_block(self) -> metadata_dictionary.MetadataDictionary:
35*6777b538SAndroid Build Coastguard Worker    identifier_dictionary = metadata_dictionary.MetadataDictionary("identifier")
36*6777b538SAndroid Build Coastguard Worker    identifier_dictionary["value"] = f"\"{self.get_url()}\""
37*6777b538SAndroid Build Coastguard Worker    identifier_dictionary["type"] = f"\"{self._get_version_control()}\""
38*6777b538SAndroid Build Coastguard Worker    if self.get_version():
39*6777b538SAndroid Build Coastguard Worker      identifier_dictionary["version"] = f"\"{self.get_version()}\""
40*6777b538SAndroid Build Coastguard Worker    return identifier_dictionary
41*6777b538SAndroid Build Coastguard Worker
42*6777b538SAndroid Build Coastguard Worker  def _get_version(self) -> str:
43*6777b538SAndroid Build Coastguard Worker    return self.metadata.get("Version", None)
44*6777b538SAndroid Build Coastguard Worker
45*6777b538SAndroid Build Coastguard Worker  def _get_revision(self) -> str:
46*6777b538SAndroid Build Coastguard Worker    return self.metadata.get("Revision", None)
47*6777b538SAndroid Build Coastguard Worker
48*6777b538SAndroid Build Coastguard Worker  def get_licenses(self) -> List[str]:
49*6777b538SAndroid Build Coastguard Worker    return self.metadata["License"]
50*6777b538SAndroid Build Coastguard Worker
51*6777b538SAndroid Build Coastguard Worker  def get_license_file_path(self) -> str:
52*6777b538SAndroid Build Coastguard Worker    return self.metadata.get("License File", [None])[0]
53*6777b538SAndroid Build Coastguard Worker
54*6777b538SAndroid Build Coastguard Worker  def get_license_type(self) -> LicenseType:
55*6777b538SAndroid Build Coastguard Worker    return license_utils.get_most_restrictive_type(self.get_licenses())
56*6777b538SAndroid Build Coastguard Worker
57*6777b538SAndroid Build Coastguard Worker  def to_android_metadata(self):
58*6777b538SAndroid Build Coastguard Worker    third_party_dict = metadata_dictionary.MetadataDictionary("third_party")
59*6777b538SAndroid Build Coastguard Worker    third_party_dict["license_type"] = self.get_license_type().name
60*6777b538SAndroid Build Coastguard Worker    if self.get_version():
61*6777b538SAndroid Build Coastguard Worker      third_party_dict["version"] = f"\"{self.get_version()}\""
62*6777b538SAndroid Build Coastguard Worker
63*6777b538SAndroid Build Coastguard Worker    if self._get_version_control():
64*6777b538SAndroid Build Coastguard Worker      third_party_dict["identifier_primary"] = self._create_identifier_block()
65*6777b538SAndroid Build Coastguard Worker    else:
66*6777b538SAndroid Build Coastguard Worker      third_party_dict["homepage"] = f"\"{self.get_url()}\""
67*6777b538SAndroid Build Coastguard Worker
68*6777b538SAndroid Build Coastguard Worker    return "\n".join(
69*6777b538SAndroid Build Coastguard Worker        [f"name: \"{self.get_name()}\"", f"{third_party_dict}"])
70