Skip to content

Commit 5cc5c1d

Browse files
authored
#263: Extended language_definitions.json with deprecation fields (#264)
fixes #263 fixes #243
1 parent df45589 commit 5cc5c1d

File tree

7 files changed

+103
-5
lines changed

7 files changed

+103
-5
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,3 +145,5 @@ TAGS
145145

146146
.lint.json
147147
.lint.txt
148+
149+
*.dot

doc/changes/changes_1.1.0.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ t.b.d.
99
## Features
1010

1111
- #245: Implemented support for Json for language definition
12+
- #263: Extended language_definitions.json with deprecation fields
1213

1314
## Refactoring
1415

@@ -17,3 +18,7 @@ t.b.d.
1718
- #256: Fixed type hints
1819
- #358: Minimize disk space during export
1920
- #253: Fixed help text for exaslct
21+
22+
## Documentation
23+
24+
- #243: Removed incomplete title in user guide

doc/user_guide/user_guide.md

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,3 @@ exaslct clean-all-images
159159

160160
**Please note that this script does not delete the Linux image that is used as basis for the images that were build in the previous steps.
161161
Furthermore, this command doesn't delete cached files in the output directory. The default path for the output directory is .build-output.**
162-
163-
164-
## Use

exasol/slc/models/language_definition_common.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from dataclasses import dataclass
1+
import datetime
22
from enum import Enum
33
from pathlib import PurePosixPath
44
from typing import List
@@ -31,3 +31,14 @@ class UdfClientRelativePath(BaseModel):
3131

3232
def __str__(self) -> str:
3333
return str(self.executable)
34+
35+
36+
class DeprecationInfo(BaseModel):
37+
"""
38+
Deprecation info for the language.
39+
For example: deprecation_date="2024-10-31" default_changed_to="Java 17"
40+
"""
41+
42+
deprecation_date: datetime.date
43+
44+
default_changed_to: str

exasol/slc/models/language_definition_model.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
from dataclasses import dataclass
2-
from typing import List
2+
from typing import List, Optional
33

44
from pydantic import BaseModel
55

66
from exasol.slc.models.language_definition_common import (
7+
DeprecationInfo,
78
SLCLanguage,
89
SLCParameter,
910
UdfClientRelativePath,
@@ -22,6 +23,7 @@ class LanguageDefinition(BaseModel):
2223
language: SLCLanguage
2324
parameters: List[SLCParameter]
2425
udf_client_path: UdfClientRelativePath
26+
deprecation: Optional[DeprecationInfo]
2527

2628

2729
class LanguageDefinitionsModel(BaseModel):

test/resources/flavors/real-test-flavor/real_flavor_base/language_definitions.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@
88
"parameters": [],
99
"udf_client_path": {
1010
"executable": "/exaudf/exaudfclient"
11+
},
12+
"deprecation": {
13+
"deprecation_date": "2024-10-31",
14+
"default_changed_to": "Java 17"
1115
}
1216
}
1317
]

test/test_docker_api_language_def_json.py

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import datetime
12
import json
23
import shutil
34
import tarfile
@@ -16,6 +17,7 @@
1617
from exasol.slc.api import build
1718
from exasol.slc.internal.utils.docker_utils import find_images_by_tag
1819
from exasol.slc.models.language_definition_common import (
20+
DeprecationInfo,
1921
SLCLanguage,
2022
UdfClientRelativePath,
2123
)
@@ -121,6 +123,8 @@ def test_docker_build(self) -> None:
121123
images[0].id, "build_info/language_definitions.json"
122124
)
123125
model = LanguageDefinitionsModel.model_validate_json(lang_def_json)
126+
print(model)
127+
124128
self.assertEqual(
125129
model,
126130
LanguageDefinitionsModel(
@@ -134,6 +138,10 @@ def test_docker_build(self) -> None:
134138
executable=PurePosixPath("/exaudf/exaudfclient")
135139
),
136140
parameters=[],
141+
deprecation=DeprecationInfo(
142+
deprecation_date=datetime.datetime(2024, 10, 31),
143+
default_changed_to="Java 17",
144+
),
137145
)
138146
],
139147
),
@@ -162,6 +170,75 @@ def test_docker_build_invalid_lang_def_json(self):
162170
target_docker_repository_name=self.test_environment.docker_repository_name,
163171
)
164172

173+
def test_docker_build_without_deprecation_info(self):
174+
flavor_path = exaslct_utils.get_test_flavor()
175+
with TemporaryDirectory() as d:
176+
temp_flavor_path = Path(d) / "test_flavor"
177+
shutil.copytree(flavor_path, temp_flavor_path)
178+
179+
lang_def_json_path = (
180+
temp_flavor_path / "flavor_base" / "language_definitions.json"
181+
)
182+
orig_lang_def_json = lang_def_json_path.read_text()
183+
lang_def_invalid = json.loads(orig_lang_def_json)
184+
lang_def_invalid["language_definitions"][0].update({"deprecation": None})
185+
with open(lang_def_json_path, "w") as f:
186+
f.write(json.dumps(lang_def_invalid))
187+
188+
image_infos = build(
189+
flavor_path=(str(temp_flavor_path),),
190+
source_docker_repository_name=self.test_environment.docker_repository_name,
191+
target_docker_repository_name=self.test_environment.docker_repository_name,
192+
)
193+
194+
assert len(image_infos) == 1
195+
images = find_images_by_tag(
196+
self.docker_client,
197+
lambda tag: tag.startswith(self.test_environment.docker_repository_name),
198+
)
199+
self.assertTrue(
200+
len(images) > 0,
201+
f"Did not found images for repository "
202+
f"{self.test_environment.docker_repository_name} in list {images}",
203+
)
204+
print("image_infos", image_infos.keys())
205+
image_infos_for_test_flavor = image_infos[str(temp_flavor_path)]
206+
image_info: ImageInfo = image_infos_for_test_flavor["release"]
207+
208+
expected_prefix = f"{image_info.target_repository_name}:{image_info.target_tag}"
209+
images = find_images_by_tag(
210+
self.docker_client, lambda tag: tag.startswith(expected_prefix)
211+
)
212+
self.assertTrue(
213+
len(images) == 1,
214+
f"Did not found image for goal 'release' with prefix {expected_prefix} in list {images}",
215+
)
216+
217+
lang_def_json = self.read_file_from_docker_image(
218+
images[0].id, "build_info/language_definitions.json"
219+
)
220+
model = LanguageDefinitionsModel.model_validate_json(lang_def_json)
221+
print(model)
222+
223+
self.assertEqual(
224+
model,
225+
LanguageDefinitionsModel(
226+
schema_version=1,
227+
language_definitions=[
228+
LanguageDefinition(
229+
protocol="localzmq+protobuf",
230+
aliases=["JAVA"],
231+
language=SLCLanguage.Java,
232+
udf_client_path=UdfClientRelativePath(
233+
executable=PurePosixPath("/exaudf/exaudfclient")
234+
),
235+
parameters=[],
236+
deprecation=None,
237+
)
238+
],
239+
),
240+
)
241+
165242

166243
if __name__ == "__main__":
167244
unittest.main()

0 commit comments

Comments
 (0)