Skip to content

Commit efde67d

Browse files
authored
#317: Implemented reuse of workspace directory (#325)
fixes #317
1 parent b572a55 commit efde67d

File tree

5 files changed

+84
-6
lines changed

5 files changed

+84
-6
lines changed

doc/changes/unreleased.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,5 @@
1414
## Features
1515

1616
* #319: Add restore_package_file method to class ScriptLanguagesContainer
17-
* #318: Added method to generate and store language_definition
17+
* #318: Added method to generate and store language_definition
18+
* #317: Implemented reuse of workspace directory

exasol/nb_connector/slc/constants.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,3 +28,8 @@
2828
"""
2929
GitHub URL which is used as base for the Script-Languages-Container.
3030
"""
31+
32+
SLC_WORKSPACE_KEY_PREFIX = "slc_workspace_"
33+
"""
34+
Key prefix of the key in secret store to save the workspace directory.
35+
"""

exasol/nb_connector/slc/script_language_container.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ def __init__(
7878
_verify_name(name)
7979
self.flavor = SlcFlavor(name).verify(secrets)
8080
self.compression_strategy = SlcCompressionStrategy(name).verify(secrets)
81-
self.workspace = Workspace.for_slc(name)
81+
self.workspace = Workspace.for_slc(name, secrets)
8282
if not self.checkout_dir.is_dir():
8383
raise SlcError(
8484
f"SLC Git repository not checked out to {self.checkout_dir}."
@@ -113,7 +113,7 @@ def create(
113113
)
114114
slc_flavor.save(secrets, flavor)
115115
slc_compression_strategy.save(secrets, compression_strategy)
116-
workspace = Workspace.for_slc(name)
116+
workspace = Workspace.for_slc(name, secrets)
117117
workspace.clone_slc_repo()
118118
return cls(secrets=secrets, name=name)
119119

@@ -144,7 +144,7 @@ def create_or_open(
144144
)
145145
else:
146146
slc_compression_strategy.save(secrets, compression_strategy)
147-
workspace = Workspace.for_slc(name)
147+
workspace = Workspace.for_slc(name, secrets)
148148
workspace.clone_slc_repo()
149149
return cls(secrets=secrets, name=name)
150150

exasol/nb_connector/slc/workspace.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import shutil
77
from pathlib import Path
88

9+
from exasol.nb_connector.secret_store import Secrets
910
from exasol.nb_connector.slc import constants
1011
from exasol.nb_connector.slc.git_access import GitAccess
1112

@@ -32,8 +33,14 @@ def __init__(self, root_dir: Path):
3233
self.root_dir = root_dir
3334

3435
@classmethod
35-
def for_slc(cls, name: str) -> Workspace:
36-
return cls(Path.cwd() / constants.WORKSPACE_DIR / name)
36+
def for_slc(cls, name: str, secrets: Secrets) -> Workspace:
37+
workspace_key = constants.SLC_WORKSPACE_KEY_PREFIX + name
38+
path = Path.cwd()
39+
if path_from_secret_store := secrets.get(workspace_key):
40+
path = Path(path_from_secret_store)
41+
else:
42+
secrets.save(workspace_key, str(path))
43+
return cls(path / constants.WORKSPACE_DIR / name)
3744

3845
def clone_slc_repo(self):
3946
"""

test/unit/slc/utest_workspace.py

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import contextlib
2+
import logging
3+
import textwrap
4+
from collections.abc import Generator
5+
from pathlib import Path
6+
from test.unit.slc.util import (
7+
SlcSecretsMock,
8+
not_raises,
9+
)
10+
from typing import (
11+
Callable,
12+
)
13+
from unittest import mock
14+
from unittest.mock import (
15+
Mock,
16+
create_autospec,
17+
)
18+
19+
import pytest
20+
import requests
21+
from _pytest.monkeypatch import MonkeyPatch
22+
from exasol.slc.models.compression_strategy import CompressionStrategy
23+
24+
from exasol.nb_connector.ai_lab_config import AILabConfig as CKey
25+
from exasol.nb_connector.slc import (
26+
constants,
27+
script_language_container,
28+
workspace,
29+
)
30+
from exasol.nb_connector.slc.git_access import GitAccess
31+
from exasol.nb_connector.slc.script_language_container import (
32+
PipPackageDefinition,
33+
ScriptLanguageContainer,
34+
)
35+
from exasol.nb_connector.slc.slc_flavor import (
36+
SlcError,
37+
SlcFlavor,
38+
)
39+
from exasol.nb_connector.slc.workspace import (
40+
Workspace,
41+
current_directory,
42+
)
43+
44+
45+
@pytest.fixture
46+
def sample_slc_name() -> str:
47+
return "CUDA"
48+
49+
50+
def test_workspace_reuses_directory(sample_slc_name, tmp_path):
51+
secrets = SlcSecretsMock(sample_slc_name)
52+
workspace_dir1 = tmp_path / "ws1"
53+
workspace_dir2 = tmp_path / "ws2"
54+
55+
workspace_dir1.mkdir()
56+
workspace_dir2.mkdir()
57+
58+
with current_directory(workspace_dir1) as _:
59+
ws1 = Workspace.for_slc(sample_slc_name, secrets)
60+
61+
with current_directory(workspace_dir2) as _:
62+
ws2 = Workspace.for_slc(sample_slc_name, secrets)
63+
assert (
64+
ws2.root_dir == workspace_dir1 / constants.WORKSPACE_DIR / sample_slc_name
65+
)

0 commit comments

Comments
 (0)