Skip to content

Commit 3d5e078

Browse files
committed
Make Transferable simply a Union
1 parent 612e30f commit 3d5e078

File tree

3 files changed

+30
-39
lines changed

3 files changed

+30
-39
lines changed

core/testcontainers/core/container.py

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
from testcontainers.core.exceptions import ContainerConnectException, ContainerStartException
2121
from testcontainers.core.labels import LABEL_SESSION_ID, SESSION_ID
2222
from testcontainers.core.network import Network
23-
from testcontainers.core.transferable import Transferable
23+
from testcontainers.core.transferable import Transferable, TransferSpec
2424
from testcontainers.core.utils import is_arm, setup_logger
2525
from testcontainers.core.wait_strategies import LogMessageWaitStrategy
2626
from testcontainers.core.waiting_utils import WaitStrategy, wait_container_is_ready
@@ -75,7 +75,7 @@ def __init__(
7575
network: Optional[Network] = None,
7676
network_aliases: Optional[list[str]] = None,
7777
_wait_strategy: Optional[WaitStrategy] = None,
78-
transferables: Optional[list[Transferable]] = None,
78+
transferables: Optional[list[TransferSpec]] = None,
7979
**kwargs: Any,
8080
) -> None:
8181
self.env = env or {}
@@ -104,7 +104,11 @@ def __init__(
104104

105105
self._kwargs = kwargs
106106
self._wait_strategy: Optional[WaitStrategy] = _wait_strategy
107-
self._transferables: list[Transferable] = transferables or []
107+
108+
self._transferable_specs: list[TransferSpec] = []
109+
if transferables:
110+
for t in transferables:
111+
self.with_copy_into_container(*t)
108112

109113
def with_env(self, key: str, value: str) -> Self:
110114
self.env[key] = value
@@ -214,8 +218,8 @@ def start(self) -> Self:
214218

215219
logger.info("Container started: %s", self._container.short_id)
216220

217-
for t in self._transferables:
218-
self._transfer_into_container(t.source, t.destination_in_container, t.mode)
221+
for t in self._transferable_specs:
222+
self._transfer_into_container(*t)
219223

220224
return self
221225

@@ -309,24 +313,20 @@ def _configure(self) -> None:
309313
pass
310314

311315
def with_copy_into_container(
312-
self, file_content: Union[bytes, pathlib.Path], destination_in_container: str, mode: int = 0o644
316+
self, transferable: Transferable, destination_in_container: str, mode: int = 0o644
313317
) -> Self:
314-
self._transferables.append(Transferable(file_content, destination_in_container, mode))
318+
self._transferable_specs.append((transferable, destination_in_container, mode))
315319
return self
316320

317-
def copy_into_container(
318-
self, file_content: Union[bytes, pathlib.Path], destination_in_container: str, mode: int = 0o644
319-
) -> None:
320-
return self._transfer_into_container(file_content, destination_in_container, mode)
321+
def copy_into_container(self, transferable: Transferable, destination_in_container: str, mode: int = 0o644) -> None:
322+
return self._transfer_into_container(transferable, destination_in_container, mode)
321323

322-
def _transfer_into_container(
323-
self, source: Union[bytes, pathlib.Path], destination_in_container: str, mode: int
324-
) -> None:
325-
if isinstance(source, bytes):
326-
file_content = source
327-
elif isinstance(source, pathlib.Path):
328-
assert source.is_file() # Temporary, only copying file supported
329-
file_content = source.read_bytes()
324+
def _transfer_into_container(self, transferable: Transferable, destination_in_container: str, mode: int) -> None:
325+
if isinstance(transferable, bytes):
326+
file_content = transferable
327+
elif isinstance(transferable, pathlib.Path):
328+
assert transferable.is_file() # Temporary, only copying file supported
329+
file_content = transferable.read_bytes()
330330
else:
331331
raise TypeError("source must be bytes or PathLike")
332332

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,6 @@
1-
import dataclasses
21
import pathlib
32
from typing import Union
43

4+
Transferable = Union[bytes, pathlib.Path]
55

6-
@dataclasses.dataclass
7-
class Transferable:
8-
"""
9-
Wrapper class enabling copying files into a container
10-
"""
11-
12-
source: Union[bytes, pathlib.Path]
13-
destination_in_container: str
14-
mode: int = 0o644
6+
TransferSpec = Union[tuple[Transferable, str], tuple[Transferable, str, int]]

core/tests/test_core.py

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
import tempfile
22
from pathlib import Path
3-
from typing import Union
43

54
import pytest
65
from testcontainers.core.container import DockerContainer
7-
from testcontainers.core.transferable import Transferable
6+
from testcontainers.core.transferable import Transferable, TransferSpec
87

98

109
def test_garbage_collection_is_defensive():
@@ -51,8 +50,8 @@ def test_docker_container_with_env_file():
5150
print(output)
5251

5352

54-
@pytest.fixture(name="copy_source", params=(bytes, Path))
55-
def copy_source_fixture(request, tmp_path: Path):
53+
@pytest.fixture(name="transferable", params=(bytes, Path))
54+
def copy_sources_fixture(request, tmp_path: Path):
5655
"""
5756
Provide source argument for tests of copy_into_container
5857
"""
@@ -66,26 +65,26 @@ def copy_source_fixture(request, tmp_path: Path):
6665
pytest.fail("Invalid type")
6766

6867

69-
def test_copy_into_container_at_runtime(copy_source: Union[bytes, Path]):
68+
def test_copy_into_container_at_runtime(transferable: Transferable):
7069
# Given
7170
destination_in_container = "/tmp/my_file"
7271

7372
with DockerContainer("bash", command="sleep infinity") as container:
7473
# When
75-
container.copy_into_container(copy_source, destination_in_container)
74+
container.copy_into_container(transferable, destination_in_container)
7675
result = container.exec(f"cat {destination_in_container}")
7776

7877
# Then
7978
assert result.exit_code == 0
8079
assert result.output == b"hello world"
8180

8281

83-
def test_copy_into_container_at_startup(copy_source: Union[bytes, Path]):
82+
def test_copy_into_container_at_startup(transferable: Transferable):
8483
# Given
8584
destination_in_container = "/tmp/my_file"
8685

8786
container = DockerContainer("bash", command="sleep infinity")
88-
container.with_copy_into_container(copy_source, destination_in_container)
87+
container.with_copy_into_container(transferable, destination_in_container)
8988

9089
with container:
9190
# When
@@ -96,10 +95,10 @@ def test_copy_into_container_at_startup(copy_source: Union[bytes, Path]):
9695
assert result.output == b"hello world"
9796

9897

99-
def test_copy_into_container_via_initializer(copy_source: Union[bytes, Path]):
98+
def test_copy_into_container_via_initializer(transferable: Transferable):
10099
# Given
101100
destination_in_container = "/tmp/my_file"
102-
transferables = [Transferable(copy_source, destination_in_container)]
101+
transferables: list[TransferSpec] = [(transferable, destination_in_container, 0o644)]
103102

104103
with DockerContainer("bash", command="sleep infinity", transferables=transferables) as container:
105104
# When

0 commit comments

Comments
 (0)