From 8f7f09d20b3b11c52c915b47848bce24a654f6b8 Mon Sep 17 00:00:00 2001 From: Gas Town Mayor Date: Fri, 28 Aug 2026 15:37:08 -0300 Subject: [PATCH 1/2] chore: finalize beads 1.2.2 projections --- .beads/config.yaml | 2 +- .mise.toml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.beads/config.yaml b/.beads/config.yaml index 6406405..6d5a954 100644 --- a/.beads/config.yaml +++ b/.beads/config.yaml @@ -9,7 +9,7 @@ # toolchain.beads.server (machine-wide shared Dolt server facts). # Owned ledger config: the workspace root owns this tracker; conform # initializes and verifies it against the pinned binary. -issue-prefix: "mro" +issue-prefix: "flext" # Dolt server connection (Gas Town town server on :3307). # The `flext` database lives there; a repository-local server is never used. diff --git a/.mise.toml b/.mise.toml index 242e730..677c0c1 100644 --- a/.mise.toml +++ b/.mise.toml @@ -31,8 +31,8 @@ tokei = "14.0" "github:qltysh/qlty" = "0.642" # Go runtime for the Go projects in this workspace. go = "1.26" -[tools."github:marlon-costa-dc/beads"] -version = "latest" +[tools."github:gastownhall/beads"] +version = "1.2.2" prerelease = true minimum_release_age = "0s" From e808891de9e176e5b3078b81820d9f1503dbcb34 Mon Sep 17 00:00:00 2001 From: Gas Town Mayor Date: Fri, 28 Aug 2026 15:46:11 -0300 Subject: [PATCH 2/2] fix: close failed docker client probes --- src/flext_tests/_constants/docker.py | 8 ++++++++ src/flext_tests/_fixtures/connectivity.py | 14 +++++++++++++- src/flext_tests/docker.py | 17 +++++++++++++++-- 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/src/flext_tests/_constants/docker.py b/src/flext_tests/_constants/docker.py index 124d088..b6d0a0e 100644 --- a/src/flext_tests/_constants/docker.py +++ b/src/flext_tests/_constants/docker.py @@ -23,6 +23,10 @@ class FlextTestsConstantsDocker: ENV_CI: Final[str] = "CI" CI_MAKE_VALUE: Final[str] = "Y" DOCKER_CI_SKIP_REASON: Final[str] = "docker disabled under CI=Y" + DOCKER_CONNECTIVITY_MARKER: Final[str] = "docker" + DOCKER_UNREACHABLE_SKIP_REASON: Final[str] = ( + "Docker daemon unreachable; start it to run Docker integration tests" + ) # Default probe ceiling for callers that omit max_wait. Under CI=Y the # Docker lifecycle skips before probing. Outside CI, shared-container # startup_timeout remains the SSOT for long boots (Oracle/kind). @@ -38,6 +42,10 @@ class FlextTestsConstantsDocker: "ldap": "flext-openldap-test", "kubernetes": "flext-kind-test", } + CONNECTIVITY_MARKERS: Final[tuple[str, ...]] = ( + DOCKER_CONNECTIVITY_MARKER, + *CONNECTIVITY_MARKER_CONTAINERS, + ) UNREACHABLE_SKIP_REASON: Final[str] = ( "{marker} service unreachable at {host}:{port}; start it to run these tests" ) diff --git a/src/flext_tests/_fixtures/connectivity.py b/src/flext_tests/_fixtures/connectivity.py index 60b7e98..4f2f9f2 100644 --- a/src/flext_tests/_fixtures/connectivity.py +++ b/src/flext_tests/_fixtures/connectivity.py @@ -45,6 +45,18 @@ def _unreachable_reason(marker: str) -> str | None: """Return a skip reason when the marker's service cannot be reached.""" if marker in _probe_cache: return _probe_cache[marker] + if marker == c.Tests.DOCKER_CONNECTIVITY_MARKER: + from flext_tests.docker import FlextTestsDocker + + manager = FlextTestsDocker() + client = manager.client + if client is None: + reason = c.Tests.DOCKER_UNREACHABLE_SKIP_REASON + else: + client.close() + reason = None + _probe_cache[marker] = reason + return reason reason: str | None = None container = c.Tests.CONNECTIVITY_MARKER_CONTAINERS.get(marker) endpoint = None if container is None else _endpoint(container) @@ -69,7 +81,7 @@ def pytest_collection_modifyitems( """Mark connectivity-bound tests as skipped when their service is down.""" del config for item in items: - for marker in c.Tests.CONNECTIVITY_MARKER_CONTAINERS: + for marker in c.Tests.CONNECTIVITY_MARKERS: if item.get_closest_marker(marker) is None: continue reason = _unreachable_reason(marker) diff --git a/src/flext_tests/docker.py b/src/flext_tests/docker.py index 9179261..f4a9cb8 100644 --- a/src/flext_tests/docker.py +++ b/src/flext_tests/docker.py @@ -12,7 +12,9 @@ import pytest from docker import DockerClient as DockerSDKClient, from_env as docker_from_env +from docker.constants import DEFAULT_DOCKER_API_VERSION from docker.errors import DockerException, NotFound +from docker.transport import UnixHTTPAdapter from python_on_whales import DockerClient as WhalesDockerClient from python_on_whales.exceptions import DockerException as WhalesDockerException @@ -130,11 +132,22 @@ def model_post_init(self, __context: t.JsonValue | None, /) -> None: @property def client(self) -> DockerSDKClient | None: """Docker client with lazy initialization.""" - if self.docker_client is None: + if self.docker_client is None and self.client_error is None: + client: DockerSDKClient | None = None try: - self.docker_client = docker_from_env() + client = docker_from_env(version=DEFAULT_DOCKER_API_VERSION) + adapter = client.api.get_adapter(client.api.base_url) + if ( + isinstance(adapter, UnixHTTPAdapter) + and not Path(adapter.socket_path).exists() + ): + raise FileNotFoundError(adapter.socket_path) + _ = client.ping() + self.docker_client = client self.client_error = None except (DockerException, OSError, TypeError, ValueError) as error: + if client is not None: + client.close() self.logger.exception( "Failed to initialize Docker client", error=str(error) )