Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package python-langgraph-cli for
openSUSE:Factory checked in at 2026-10-17 21:26:58
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-langgraph-cli (Old)
and /work/SRC/openSUSE:Factory/.python-langgraph-cli.new.3698736 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-langgraph-cli"
Sat Oct 17 21:26:58 2026 rev:6 rq:1385354 version:0.4.36
Changes:
--------
---
/work/SRC/openSUSE:Factory/python-langgraph-cli/python-langgraph-cli.changes
2026-10-15 12:25:41.844020444 +0200
+++
/work/SRC/openSUSE:Factory/.python-langgraph-cli.new.3698736/python-langgraph-cli.changes
2026-10-17 21:27:01.717951014 +0200
@@ -1,0 +2,7 @@
+Sat Oct 17 06:30:15 UTC 2026 - Martin Pluskal <[email protected]>
+
+- Update to 0.4.36:
+ * Deploy honors the active Docker context endpoint unless
+ DOCKER_HOST is set
+
+-------------------------------------------------------------------
Old:
----
langgraph_cli-0.4.35.tar.gz
New:
----
langgraph_cli-0.4.36.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-langgraph-cli.spec ++++++
--- /var/tmp/diff_new_pack.upgPoa/_old 2026-10-17 21:27:02.410979929 +0200
+++ /var/tmp/diff_new_pack.upgPoa/_new 2026-10-17 21:27:02.412980012 +0200
@@ -23,7 +23,7 @@
%endif
%{?sle15_python_module_pythons}
Name: python-langgraph-cli
-Version: 0.4.35
+Version: 0.4.36
Release: 0
Summary: CLI for interacting with the LangGraph API
License: MIT
++++++ langgraph_cli-0.4.35.tar.gz -> langgraph_cli-0.4.36.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/langgraph_cli-0.4.35/PKG-INFO
new/langgraph_cli-0.4.36/PKG-INFO
--- old/langgraph_cli-0.4.35/PKG-INFO 2020-02-02 01:00:00.000000000 +0100
+++ new/langgraph_cli-0.4.36/PKG-INFO 2020-02-02 01:00:00.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 2.5
Name: langgraph-cli
-Version: 0.4.35
+Version: 0.4.36
Summary: CLI for interacting with LangGraph API
Project-URL: Source,
https://github.com/langchain-ai/langgraph/tree/main/libs/cli
Project-URL: Twitter, https://x.com/langchain_oss
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/langgraph_cli-0.4.35/langgraph_cli/__init__.py
new/langgraph_cli-0.4.36/langgraph_cli/__init__.py
--- old/langgraph_cli-0.4.35/langgraph_cli/__init__.py 2020-02-02
01:00:00.000000000 +0100
+++ new/langgraph_cli-0.4.36/langgraph_cli/__init__.py 2020-02-02
01:00:00.000000000 +0100
@@ -1 +1 @@
-__version__ = "0.4.35"
+__version__ = "0.4.36"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/langgraph_cli-0.4.35/langgraph_cli/deploy.py
new/langgraph_cli-0.4.36/langgraph_cli/deploy.py
--- old/langgraph_cli-0.4.35/langgraph_cli/deploy.py 2020-02-02
01:00:00.000000000 +0100
+++ new/langgraph_cli-0.4.36/langgraph_cli/deploy.py 2020-02-02
01:00:00.000000000 +0100
@@ -1209,6 +1209,33 @@
return cls(("docker", "buildx", "build"), flags)
+def _active_docker_host(runner: CommandRunner) -> str | None:
+ """Return the daemon endpoint of the user's active Docker context.
+
+ None when `DOCKER_HOST` is set, which Docker honors with any config
+ directory. Also None when the lookup fails (for example, `DOCKER_CONTEXT`
+ names a context that doesn't exist) or the context has no Docker endpoint
+ (Docker prints `<no value>`); that keeps Docker's own default in place.
+ """
+ if os.environ.get("DOCKER_HOST"):
+ return None
+ try:
+ stdout, _ = runner.run(
+ subp_exec(
+ "docker",
+ "context",
+ "inspect",
+ "--format",
+ "{{.Endpoints.docker.Host}}",
+ collect=True,
+ )
+ )
+ except (click.exceptions.Exit, OSError):
+ return None
+ host = (stdout or "").strip()
+ return host if "://" in host else None
+
+
def _docker_argv(docker_config_dir: str | None) -> tuple[str, ...]:
if docker_config_dir is None:
return ("docker",)
@@ -1242,17 +1269,13 @@
runner: CommandRunner,
image: str,
*,
- docker_config_dir: str | None,
+ docker: tuple[str, ...],
verbose: bool,
) -> None:
for attempt in range(1, _PUSH_ATTEMPTS + 1):
try:
with Progress(message="Pushing...", elapsed=not verbose):
- runner.run(
- subp_exec(
- *_docker_argv(docker_config_dir), "push", image,
verbose=verbose
- )
- )
+ runner.run(subp_exec(*docker, "push", image, verbose=verbose))
return
except click.exceptions.Exit:
if attempt == _PUSH_ATTEMPTS:
@@ -1337,6 +1360,11 @@
registry_host = repository.split("/")[0]
with _docker_config_for_token(registry_host, deployment_token,
username) as cfg:
+ # A config directory has no current context, so Docker would fall
+ # back to /var/run/docker.sock; keep using the daemon the build
used.
+ docker_host = _active_docker_host(runner)
+ host_args = ("--host", docker_host) if docker_host else ()
+ docker = (*_docker_argv(cfg), *host_args)
_log_deploy_step(step, f"Logging into {registry_host}")
token_input = (
deployment_token
@@ -1345,7 +1373,7 @@
)
runner.run(
subp_exec(
- *_docker_argv(cfg),
+ *docker,
"login",
"-u",
username,
@@ -1361,7 +1389,7 @@
runner.run(
subp_exec("docker", "tag", image_to_push, remote_image,
verbose=verbose)
)
- _push_image(runner, remote_image, docker_config_dir=cfg,
verbose=verbose)
+ _push_image(runner, remote_image, docker=docker, verbose=verbose)
step += 1
resolved_image = _resolve_pushed_image_digest(
@@ -1826,7 +1854,7 @@
_build_image(runner, ctx.spec, image, verbose=ctx.verbose)
step += 1
_log_deploy_step(step, f"Pushing image {image}")
- _push_image(runner, image, docker_config_dir=None,
verbose=ctx.verbose)
+ _push_image(runner, image, docker=_docker_argv(None),
verbose=ctx.verbose)
step += 1
digest = _resolve_pushed_image_digest(
runner, remote_image=image, docker_config_dir=None,
verbose=ctx.verbose
@@ -2185,11 +2213,13 @@
),
click.option(
"--deployment-type",
- type=click.Choice(["dev", "prod"]),
+ type=click.Choice(["serverless", "dedicated", "dev", "prod"]),
default="dev",
show_default=True,
help=(
- "Deployment type (used when creating a new deployment). "
+ "Deployment type (used when creating a new deployment): "
+ "serverless (scale to zero) or dedicated (prod); "
+ "legacy dev and prod are also accepted. "
"Ignored with --push-to."
),
),
@@ -2480,7 +2510,9 @@
),
verbose=verbose,
selector=selector,
- deployment_type=deployment_type,
+ deployment_type={"serverless": "dev_zero", "dedicated":
"prod"}.get(
+ deployment_type, deployment_type
+ ),
secrets=secrets,
tracked_packages=tracked_packages,
)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/langgraph_cli-0.4.35/tests/unit_tests/cli/test_deploy_command.py
new/langgraph_cli-0.4.36/tests/unit_tests/cli/test_deploy_command.py
--- old/langgraph_cli-0.4.35/tests/unit_tests/cli/test_deploy_command.py
2020-02-02 01:00:00.000000000 +0100
+++ new/langgraph_cli-0.4.36/tests/unit_tests/cli/test_deploy_command.py
2020-02-02 01:00:00.000000000 +0100
@@ -52,6 +52,8 @@
OBJECT_PATH = "tarballs/src.tgz"
PLATFORM_FORMAT = "{{.Os}}/{{.Architecture}}"
DIGESTS_FORMAT = "{{json .RepoDigests}}"
+CONTEXT_HOST_FORMAT = "{{.Endpoints.docker.Host}}"
+CONTEXT_HOST = "unix:///Users/dev/.docker/run/docker.sock"
NOT_A_CLI_DEPLOYMENT = (
"push token is only available for 'internal_docker' source deployments"
)
@@ -192,6 +194,8 @@
class DockerDouble:
timeline: list[str]
failing_pushes: int = 0
+ context_lookup_fails: bool = False
+ context_host: str = CONTEXT_HOST
builds: list[dict] = field(default_factory=list)
commands: list[DockerCommand] = field(default_factory=list)
@@ -235,6 +239,10 @@
if "push" in args and self.failing_pushes > 0:
self.failing_pushes -= 1
raise click.exceptions.Exit(1)
+ if CONTEXT_HOST_FORMAT in args:
+ if self.context_lookup_fails:
+ raise click.exceptions.Exit(1)
+ return f"{self.context_host}\n", None
if PLATFORM_FORMAT in args:
return "linux/amd64\n", None
if DIGESTS_FORMAT in args:
@@ -244,6 +252,8 @@
@staticmethod
def _verb(args: tuple[str, ...]) -> str:
+ if CONTEXT_HOST_FORMAT in args:
+ return "inspect-context"
if PLATFORM_FORMAT in args:
return "inspect-platform"
if DIGESTS_FORMAT in args:
@@ -292,7 +302,12 @@
json.dumps({"graphs": {"agent": "agent.py:graph"}, "dependencies":
["."]})
)
monkeypatch.chdir(tmp_path)
- for name in ("LANGSMITH_TENANT_ID", "LANGSMITH_ENDPOINT",
"LANGGRAPH_HOST_URL"):
+ for name in (
+ "LANGSMITH_TENANT_ID",
+ "LANGSMITH_ENDPOINT",
+ "LANGGRAPH_HOST_URL",
+ "DOCKER_HOST",
+ ):
monkeypatch.delenv(name, raising=False)
timeline: list[str] = []
@@ -340,6 +355,7 @@
CREATE_DEPLOYMENT,
"docker build",
_push_token(CREATED_ID),
+ "docker inspect-context",
"docker login",
"docker tag",
"docker push",
@@ -349,6 +365,27 @@
assert "Deployment updated" in result.output
[email protected](
+ ("deployment_type", "wire_type"),
+ [
+ ("serverless", "dev_zero"),
+ ("dedicated", "prod"),
+ ("dev", "dev"),
+ ("prod", "prod"),
+ ],
+)
[email protected]("build_mode", ["--no-remote", "--remote"])
+def test_deployment_type_aliases(
+ deploy_project: DeployProject, deployment_type: str, wire_type: str,
build_mode: str
+) -> None:
+ result = deploy_project.run(build_mode, "--deployment-type",
deployment_type)
+
+ assert result.exit_code == 0, result.output
+ assert
deploy_project.control_plane.bodies[CREATE_DEPLOYMENT]["source_config"] == {
+ "deployment_type": wire_type
+ }
+
+
def test_first_local_deploy_creates_an_internal_docker_deployment(
deploy_project: DeployProject,
) -> None:
@@ -406,7 +443,7 @@
login = deploy_project.docker.command("login")
assert login.args[:2] == ("docker", "--config")
- assert login.args[3:] == (
+ assert login.args[-5:] == (
"login",
"-u",
"oauth2accesstoken",
@@ -416,6 +453,53 @@
assert login.kwargs["input"] == f"{PUSH_TOKEN}\n"
+def test_local_deploy_logs_in_and_pushes_through_the_active_docker_context(
+ deploy_project: DeployProject,
+) -> None:
+ """The temporary config has no current context, so without the active
+ context's endpoint Docker would push through /var/run/docker.sock."""
+ result = deploy_project.run("--no-remote")
+
+ assert result.exit_code == 0, result.output
+ for verb in ("login", "push"):
+ args = deploy_project.docker.command(verb).args
+ assert args[3:5] == ("--host", CONTEXT_HOST), verb
+
+
+def test_local_deploy_leaves_an_explicit_docker_host_to_docker(
+ deploy_project: DeployProject, monkeypatch: pytest.MonkeyPatch
+) -> None:
+ monkeypatch.setenv("DOCKER_HOST", "tcp://127.0.0.1:2375")
+
+ result = deploy_project.run("--no-remote")
+
+ assert result.exit_code == 0, result.output
+ for verb in ("login", "push"):
+ assert "--host" not in deploy_project.docker.command(verb).args, verb
+
+
+def test_local_deploy_keeps_dockers_default_when_the_context_lookup_fails(
+ deploy_project: DeployProject,
+) -> None:
+ deploy_project.docker.context_lookup_fails = True
+
+ result = deploy_project.run("--no-remote")
+
+ assert result.exit_code == 0, result.output
+ assert "--host" not in deploy_project.docker.command("push").args
+
+
+def test_local_deploy_ignores_a_context_without_a_docker_endpoint(
+ deploy_project: DeployProject,
+) -> None:
+ deploy_project.docker.context_host = "<no value>"
+
+ result = deploy_project.run("--no-remote")
+
+ assert result.exit_code == 0, result.output
+ assert "--host" not in deploy_project.docker.command("push").args
+
+
def test_local_deploy_tells_the_control_plane_it_honors_registry_usernames(
deploy_project: DeployProject,
) -> None:
@@ -438,7 +522,7 @@
deploy_project.run("--no-remote")
login = deploy_project.docker.command("login")
- assert login.args[3:] == (
+ assert login.args[-5:] == (
"login",
"-u",
"AWS",
@@ -506,6 +590,7 @@
assert deploy_project.docker.builds == []
assert deploy_project.docker.verbs() == [
"docker inspect-platform",
+ "docker inspect-context",
"docker login",
"docker tag",
"docker push",