Skip to content

Commit baa43ee

Browse files
committed
Add a read only dictionary for the containers that always fetches anew
This is related to pytest-docker-compose#8, basically dynamic ports are not recognized by the current code. Refetching the containers everytime they are used solves this.
1 parent 1c0f9a5 commit baa43ee

File tree

1 file changed

+25
-4
lines changed

1 file changed

+25
-4
lines changed

src/pytest_docker_compose/__init__.py

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ def create_network_info_for_container(container):
4848
hostname=port_config["HostIp"] or "localhost",
4949
host_port=port_config["HostPort"],)
5050
for container_port, port_configs in
51-
container.get("HostConfig.PortBindings").items()
51+
container.ports.items()
5252
for port_config in port_configs]
5353

5454

@@ -164,9 +164,7 @@ def scoped_containers_fixture(docker_project: Project, request):
164164
if not containers:
165165
raise ValueError("`docker-compose` didn't launch any containers!")
166166

167-
for container in containers:
168-
container.network_info = create_network_info_for_container(container)
169-
yield {container.name: container for container in containers}
167+
yield ContainerDict(docker_project)
170168

171169
for container in sorted(containers, key=lambda c: c.name):
172170
header = "Logs from {name}:".format(name=container.name)
@@ -186,4 +184,27 @@ def scoped_containers_fixture(docker_project: Project, request):
186184
return scoped_containers_fixture
187185

188186

187+
class ContainerDict(dict):
188+
"""A read-only dictionary that re-fetches containers from a docker-compose
189+
project dynamically every time they are accessed."""
190+
191+
def __init__(self, docker_project: Project) -> None:
192+
super().__init__()
193+
self.docker_project = docker_project
194+
for container in docker_project.containers():
195+
super().__setitem__(container.name, container)
196+
197+
def __getitem__(self, key):
198+
container = [container for container in self.docker_project.containers()
199+
if container.name == key][0]
200+
container.network_info = create_network_info_for_container(container)
201+
return container
202+
203+
def __setitem__(self, k, v) -> None:
204+
raise TypeError('ContainerDict does not allow item assignment')
205+
206+
def __delitem__(self, v) -> None:
207+
raise TypeError('ContainerDict does not allow item deletion')
208+
209+
189210
plugin = DockerComposePlugin()

0 commit comments

Comments
 (0)