From a1c1421bf4ffa5d90136a90fd1501087eeb42587 Mon Sep 17 00:00:00 2001 From: Michael Li Date: Wed, 9 Jul 2025 01:58:33 +1000 Subject: [PATCH] cli: ensure the connection always get closed in github.py (#31914) Thank you for contributing to LangChain! - [x] **PR title**: "package: description" - Where "package" is whichever of langchain, core, etc. is being modified. Use "docs: ..." for purely docs changes, "infra: ..." for CI changes. - Example: "core: add foobar LLM" - [x] **PR message**: ***Delete this entire checklist*** and replace with - **Description:** a description of the change - **Issue:** the issue # it fixes, if applicable - **Dependencies:** any dependencies required for this change - **Twitter handle:** if your PR gets announced, and you'd like a mention, we'll gladly shout you out! - [x] **Add tests and docs**: If you're adding a new integration, please include 1. a test for the integration, preferably unit tests that do not rely on network access, 2. an example notebook showing its use. It lives in `docs/docs/integrations` directory. - [x] **Lint and test**: Run `make format`, `make lint` and `make test` from the root of the package(s) you've modified. See contribution guidelines for more: https://python.langchain.com/docs/contributing/ Additional guidelines: - Make sure optional dependencies are imported within a function. - Please do not add dependencies to pyproject.toml files (even optional ones) unless they are required for unit tests. - Most PRs should not touch more than one package. - Changes should be backwards compatible. If no one reviews your PR within a few days, please @-mention one of baskaryan, eyurtsev, ccurme, vbarda, hwchase17. --- libs/cli/langchain_cli/utils/github.py | 42 ++++++++++++++------------ 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/libs/cli/langchain_cli/utils/github.py b/libs/cli/langchain_cli/utils/github.py index 0c3ef3118d2..335de0062d2 100644 --- a/libs/cli/langchain_cli/utils/github.py +++ b/libs/cli/langchain_cli/utils/github.py @@ -3,26 +3,30 @@ import json from typing import Optional -def list_packages(*, contains: Optional[str] = None): +def list_packages(*, contains: Optional[str] = None) -> list[str]: conn = http.client.HTTPSConnection("api.github.com") + try: + headers = { + "Accept": "application/vnd.github+json", + "X-GitHub-Api-Version": "2022-11-28", + "User-Agent": "langchain-cli", + } - headers = { - "Accept": "application/vnd.github+json", - "X-GitHub-Api-Version": "2022-11-28", - "User-Agent": "langchain-cli", - } + conn.request( + "GET", + "/repos/langchain-ai/langchain/contents/templates", + headers=headers, + ) + res = conn.getresponse() - conn.request( - "GET", - "/repos/langchain-ai/langchain/contents/templates", - headers=headers, - ) - res = conn.getresponse() + res_str = res.read() - res_str = res.read() - - data = json.loads(res_str) - package_names = [ - p["name"] for p in data if p["type"] == "dir" and p["name"] != "docs" - ] - return [p for p in package_names if contains in p] if contains else package_names + data = json.loads(res_str) + package_names = [ + p["name"] for p in data if p["type"] == "dir" and p["name"] != "docs" + ] + return ( + [p for p in package_names if contains in p] if contains else package_names + ) + finally: + conn.close()