-
-
Notifications
You must be signed in to change notification settings - Fork 3
/
adoptium.py
135 lines (104 loc) · 3.52 KB
/
adoptium.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
from typing import Optional
from jdk.enums import Architecture
from jdk.enums import BaseDetectableEnum
from jdk.enums import BaseEnum
from jdk.enums import Environment
from jdk.enums import ImageType
from jdk.enums import JvmImpl
from jdk.enums import OperatingSystem
from jdk.enums import Vendor
from jdk.extension import extends
from .client import Client
from .client import vendor_client
@extends(Architecture)
class AdoptiumArchitecture(BaseDetectableEnum):
@classmethod
def detect(cls) -> Optional["AdoptiumArchitecture"]:
return Architecture.detect()
@classmethod
def transform(cls, other: Architecture) -> Optional["AdoptiumArchitecture"]:
return AdoptiumArchitecture(other.value)
X32 = "x32"
PPC64LE = "ppc64le"
S390X = "s390x"
SPARCV9 = "sparcv9"
RISCV64 = "riscv64"
class CLib(BaseEnum):
MUSL = "musl"
GLIBC = "glibc"
class HeapSize(BaseEnum):
NORMAL = "normal"
LARGE = "large"
class ReleaseType(BaseEnum):
GA = "ga"
EA = "ea"
class Project(BaseEnum):
JDK = "jdk"
VALHALLA = "valhalla"
METROPOLIS = "metropolis"
JFR = "jfr"
SHENANDOAH = "shenandoah"
@extends(ImageType)
class AdoptiumImageType(BaseEnum):
TEST_IMAGE = "testimage"
DEBUG_IMAGE = "debugimage"
STATIC_LIBS = "staticlibs"
SOURCES = "sources"
SBOM = "sbom"
@extends(Vendor)
class AdoptiumVendor(BaseEnum):
ADOPTIUM = "Adoptium"
TEMURIN = "Temurin"
ADOPTOPENJDK = "AdoptOpenJDK"
ECLIPSE = "eclipse"
@extends(Environment)
class AdoptiumEnvironment(BaseEnum):
PRODUCTION = "https://api.adoptium.net"
STAGE = "https://staging-api.adoptium.net"
@vendor_client(AdoptiumVendor)
class AdoptiumClient(Client):
def __init__(
self, environment: Environment = AdoptiumEnvironment.PRODUCTION
) -> None:
if environment == Environment.DEFAULT:
base_url = AdoptiumEnvironment.PRODUCTION.value
else:
base_url = environment.value
super().__init__(base_url)
def get_download_url(
self,
version: str,
operating_system: Optional[OperatingSystem] = None,
arch: Optional[Architecture] = None,
impl: JvmImpl = JvmImpl.HOTSPOT,
jre: bool = False,
*,
heap_size: HeapSize = HeapSize.NORMAL,
image_type: ImageType = ImageType.JDK,
release_type: ReleaseType = ReleaseType.GA,
vendor: Vendor = AdoptiumVendor.ECLIPSE,
c_lib: Optional[CLib] = None,
project: Optional[Project] = None,
) -> str:
version = Client.normalize_version(version)
if operating_system is None:
operating_system = OperatingSystem.detect()
if arch is None:
arch = Architecture.detect()
arch = AdoptiumArchitecture.transform(arch)
# Handle edge case for MacOS w/Apple M1 or M2
if operating_system is OperatingSystem.MAC and arch == AdoptiumArchitecture.ARM:
arch = AdoptiumArchitecture.AARCH64
if jre:
image_type = ImageType.JRE
if c_lib:
image_type = AdoptiumImageType.STATIC_LIBS
base_url = self._base_url
download_url = f"{base_url}/v3/binary/latest/{version}/{release_type}/{operating_system}/{arch}/{image_type}/{impl}/{heap_size}/{vendor}" # noqa: B950
if c_lib:
download_url = f"{download_url}?c_lib={c_lib}"
if project:
download_url = (
f"{download_url}{'&' if '?' in download_url else '?'}{project}"
)
return download_url