refactor(pipelock): split sidecar lifecycle into DockerPipelockProxy
test / run tests/run_tests.py (pull_request) Successful in 18s

PipelockProxy becomes an ABC with the platform-agnostic
prepare/_build_pipelock_yaml as concrete methods and start/stop as
abstract. Docker-specific sidecar lifecycle moves to a new sibling
file:

  claude_bottle/backend/docker/pipelock.py
    DockerPipelockProxy(PipelockProxy) — implements start (docker
    create/cp/network connect/start) and stop (docker inspect/rm -f).

DockerBottleBackend._proxy is now a DockerPipelockProxy instance.
Tests that previously instantiated PipelockProxy() directly switch to
DockerPipelockProxy() (the base is no longer constructable).
This commit is contained in:
2026-05-11 13:53:45 -04:00
parent 25e67137f2
commit edd8b444a6
6 changed files with 118 additions and 83 deletions
+3 -2
View File
@@ -13,7 +13,8 @@ from claude_bottle.backend.docker.network import (
network_create_internal,
network_remove,
)
from claude_bottle.pipelock import PipelockProxy, pipelock_container_name
from claude_bottle.backend.docker.pipelock import DockerPipelockProxy
from claude_bottle.pipelock import pipelock_container_name
from tests._docker import skip_unless_docker
@@ -69,7 +70,7 @@ class TestOrphanCleanup(unittest.TestCase):
def test_pipelock_stop_missing_sidecar(self):
# Should not raise.
PipelockProxy().stop(pipelock_container_name(f"missing-{self.slug}"))
DockerPipelockProxy().stop(pipelock_container_name(f"missing-{self.slug}"))
if __name__ == "__main__":
+3 -2
View File
@@ -12,7 +12,8 @@ import unittest
import urllib.request
from pathlib import Path
from claude_bottle.pipelock import PIPELOCK_IMAGE, PipelockProxy
from claude_bottle.backend.docker.pipelock import DockerPipelockProxy
from claude_bottle.pipelock import PIPELOCK_IMAGE
from tests._docker import skip_unless_docker
from tests.fixtures import fixture_minimal
@@ -38,7 +39,7 @@ class TestPipelockSidecarSmoke(unittest.TestCase):
)
def test_smoke(self):
yaml_path = self.work_dir / "pipelock.yaml"
PipelockProxy().prepare(fixture_minimal(), "dev", "demo", yaml_path)
DockerPipelockProxy().prepare(fixture_minimal(), "dev", "demo", yaml_path)
create = subprocess.run(
[
+2 -2
View File
@@ -7,15 +7,15 @@ import tempfile
import unittest
from pathlib import Path
from claude_bottle.backend.docker.pipelock import DockerPipelockProxy
from claude_bottle.manifest import Manifest
from claude_bottle.pipelock import PipelockProxy
from tests.fixtures import fixture_minimal, fixture_with_ssh
class TestPipelockProxyPrepare(unittest.TestCase):
def setUp(self):
self.out_dir = Path(tempfile.mkdtemp())
self.proxy = PipelockProxy()
self.proxy = DockerPipelockProxy()
def tearDown(self):
import shutil