From b97c629f9ade098236aa56d861a21706a9830f54 Mon Sep 17 00:00:00 2001 From: Christophe Bornet Date: Fri, 13 Feb 2026 01:34:02 +0100 Subject: [PATCH] style: bump ruff version to 0.15 (#35042) --- .../messages/block_translators/openai.py | 8 ++++---- libs/core/langchain_core/messages/utils.py | 4 ++-- libs/core/langchain_core/prompts/chat.py | 12 ++++++------ libs/core/langchain_core/prompts/loading.py | 6 +++--- libs/core/langchain_core/tools/base.py | 2 +- libs/core/langchain_core/vectorstores/in_memory.py | 4 ++-- libs/core/pyproject.toml | 2 +- libs/core/scripts/check_version.py | 4 ++-- .../tests/unit_tests/_api/test_beta_decorator.py | 14 +++++++++----- .../core/tests/unit_tests/_api/test_deprecation.py | 12 ++++++++---- .../chat_models/test_rate_limiting.py | 8 +++++--- libs/core/tests/unit_tests/test_tools.py | 1 + libs/core/uv.lock | 4 ++-- .../langchain_classic/chat_models/base.py | 5 ++++- libs/langchain/pyproject.toml | 2 +- libs/langchain/uv.lock | 8 ++++---- libs/langchain_v1/pyproject.toml | 2 +- libs/langchain_v1/scripts/check_version.py | 4 ++-- libs/langchain_v1/uv.lock | 8 ++++---- libs/model-profiles/pyproject.toml | 2 +- libs/model-profiles/uv.lock | 6 +++--- libs/standard-tests/pyproject.toml | 2 +- libs/standard-tests/uv.lock | 4 ++-- libs/text-splitters/pyproject.toml | 2 +- libs/text-splitters/uv.lock | 4 ++-- 25 files changed, 72 insertions(+), 58 deletions(-) diff --git a/libs/core/langchain_core/messages/block_translators/openai.py b/libs/core/langchain_core/messages/block_translators/openai.py index 32e10cb14ed..5bcb3a6bfd7 100644 --- a/libs/core/langchain_core/messages/block_translators/openai.py +++ b/libs/core/langchain_core/messages/block_translators/openai.py @@ -368,9 +368,9 @@ def _convert_from_v03_ai_message(message: AIMessage) -> AIMessage: "call_id": tool_call_chunk.get("id"), } if function_call_ids is not None and ( - _id := function_call_ids.get(tool_call_chunk.get("id")) + id_ := function_call_ids.get(tool_call_chunk.get("id")) ): - function_call["id"] = _id + function_call["id"] = id_ buckets["function_call"].append(function_call) else: for tool_call in message.tool_calls: @@ -381,9 +381,9 @@ def _convert_from_v03_ai_message(message: AIMessage) -> AIMessage: "call_id": tool_call["id"], } if function_call_ids is not None and ( - _id := function_call_ids.get(tool_call["id"]) + id_ := function_call_ids.get(tool_call["id"]) ): - function_call["id"] = _id + function_call["id"] = id_ buckets["function_call"].append(function_call) # Tool outputs diff --git a/libs/core/langchain_core/messages/utils.py b/libs/core/langchain_core/messages/utils.py index 4ad238de802..b60d57d844b 100644 --- a/libs/core/langchain_core/messages/utils.py +++ b/libs/core/langchain_core/messages/utils.py @@ -402,7 +402,7 @@ def get_buffer_string( # -> '' ``` """ - if format not in ("prefix", "xml"): + if format not in {"prefix", "xml"}: msg = ( f"Unrecognized format={format!r}. Supported formats are 'prefix' and 'xml'." ) @@ -2270,7 +2270,7 @@ def count_tokens_approximately( block_type = block.get("type", "") # Apply fixed penalty for image blocks - if block_type in ("image", "image_url"): + if block_type in {"image", "image_url"}: token_count += tokens_per_image # Count text blocks normally elif block_type == "text": diff --git a/libs/core/langchain_core/prompts/chat.py b/libs/core/langchain_core/prompts/chat.py index 95910367bcf..05c2bed9885 100644 --- a/libs/core/langchain_core/prompts/chat.py +++ b/libs/core/langchain_core/prompts/chat.py @@ -977,14 +977,14 @@ class ChatPromptTemplate(BaseChatPromptTemplate): input_vars: set[str] = set() optional_variables: set[str] = set() partial_vars: dict[str, Any] = {} - for _message in messages_: - if isinstance(_message, MessagesPlaceholder) and _message.optional: - partial_vars[_message.variable_name] = [] - optional_variables.add(_message.variable_name) + for message in messages_: + if isinstance(message, MessagesPlaceholder) and message.optional: + partial_vars[message.variable_name] = [] + optional_variables.add(message.variable_name) elif isinstance( - _message, (BaseChatPromptTemplate, BaseMessagePromptTemplate) + message, (BaseChatPromptTemplate, BaseMessagePromptTemplate) ): - input_vars.update(_message.input_variables) + input_vars.update(message.input_variables) kwargs = { "input_variables": sorted(input_vars), diff --git a/libs/core/langchain_core/prompts/loading.py b/libs/core/langchain_core/prompts/loading.py index 66dcba0abc9..2e7286dad88 100644 --- a/libs/core/langchain_core/prompts/loading.py +++ b/libs/core/langchain_core/prompts/loading.py @@ -84,11 +84,11 @@ def _load_examples(config: dict) -> dict: def _load_output_parser(config: dict) -> dict: """Load output parser.""" - if _config := config.get("output_parser"): - if output_parser_type := _config.get("_type") != "default": + if config_ := config.get("output_parser"): + if output_parser_type := config_.get("_type") != "default": msg = f"Unsupported output parser {output_parser_type}" raise ValueError(msg) - config["output_parser"] = StrOutputParser(**_config) + config["output_parser"] = StrOutputParser(**config_) return config diff --git a/libs/core/langchain_core/tools/base.py b/libs/core/langchain_core/tools/base.py index b2c7b34bca9..fa3df6d3970 100644 --- a/libs/core/langchain_core/tools/base.py +++ b/libs/core/langchain_core/tools/base.py @@ -741,7 +741,7 @@ class ChildTool(BaseTool): if k in tool_input: # Field was provided in input - include it (validated) validated_input[k] = getattr(result, k) - elif k in field_info and k not in ("args", "kwargs"): + elif k in field_info and k not in {"args", "kwargs"}: # Check if field has an explicit default defined in the schema. # Exclude "args"/"kwargs" as these are synthetic fields for variadic # parameters that should not be passed as keyword arguments. diff --git a/libs/core/langchain_core/vectorstores/in_memory.py b/libs/core/langchain_core/vectorstores/in_memory.py index 769715d116d..ef3c78ab603 100644 --- a/libs/core/langchain_core/vectorstores/in_memory.py +++ b/libs/core/langchain_core/vectorstores/in_memory.py @@ -177,8 +177,8 @@ class InMemoryVectorStore(VectorStore): @override def delete(self, ids: Sequence[str] | None = None, **kwargs: Any) -> None: if ids: - for _id in ids: - self.store.pop(_id, None) + for id_ in ids: + self.store.pop(id_, None) @override async def adelete(self, ids: Sequence[str] | None = None, **kwargs: Any) -> None: diff --git a/libs/core/pyproject.toml b/libs/core/pyproject.toml index b9ef34091ec..4f6e2b5fc8e 100644 --- a/libs/core/pyproject.toml +++ b/libs/core/pyproject.toml @@ -45,7 +45,7 @@ Slack = "https://www.langchain.com/join-community" Reddit = "https://www.reddit.com/r/LangChain/" [dependency-groups] -lint = ["ruff>=0.14.11,<0.16.0"] +lint = ["ruff>=0.15.0,<0.16.0"] typing = [ "mypy>=1.19.1,<1.20.0", "types-pyyaml>=6.0.12.2,<7.0.0.0", diff --git a/libs/core/scripts/check_version.py b/libs/core/scripts/check_version.py index d671f093d60..4e2fb695f4d 100644 --- a/libs/core/scripts/check_version.py +++ b/libs/core/scripts/check_version.py @@ -12,14 +12,14 @@ from pathlib import Path def get_pyproject_version(pyproject_path: Path) -> str | None: """Extract version from `pyproject.toml`.""" - content = pyproject_path.read_text() + content = pyproject_path.read_text(encoding="utf-8") match = re.search(r'^version\s*=\s*"([^"]+)"', content, re.MULTILINE) return match.group(1) if match else None def get_version_py_version(version_path: Path) -> str | None: """Extract `VERSION` from `version.py`.""" - content = version_path.read_text() + content = version_path.read_text(encoding="utf-8") match = re.search(r'^VERSION\s*=\s*"([^"]+)"', content, re.MULTILINE) return match.group(1) if match else None diff --git a/libs/core/tests/unit_tests/_api/test_beta_decorator.py b/libs/core/tests/unit_tests/_api/test_beta_decorator.py index 19d51295453..e9122c814ce 100644 --- a/libs/core/tests/unit_tests/_api/test_beta_decorator.py +++ b/libs/core/tests/unit_tests/_api/test_beta_decorator.py @@ -16,8 +16,10 @@ from langchain_core._api.beta_decorator import beta, warn_beta "name": "OldClass", "obj_type": "class", }, - "The class `OldClass` is in beta. It is actively being worked on, so the " - "API may change.", + ( + "The class `OldClass` is in beta. " + "It is actively being worked on, so the API may change." + ), ), ( { @@ -35,9 +37,11 @@ from langchain_core._api.beta_decorator import beta, warn_beta "obj_type": "", "addendum": "Please migrate your code.", }, - "`SomeFunction` is in beta. It is actively being worked on, " - "so the API may " - "change. Please migrate your code.", + ( + "`SomeFunction` is in beta. " + "It is actively being worked on, so the API may change. " + "Please migrate your code." + ), ), ], ) diff --git a/libs/core/tests/unit_tests/_api/test_deprecation.py b/libs/core/tests/unit_tests/_api/test_deprecation.py index 66895eeeae8..b1acff08a9a 100644 --- a/libs/core/tests/unit_tests/_api/test_deprecation.py +++ b/libs/core/tests/unit_tests/_api/test_deprecation.py @@ -23,8 +23,10 @@ from langchain_core._api.deprecation import ( "pending": True, "obj_type": "class", }, - "The class `OldClass` will be deprecated in a future version. Use NewClass " - "instead.", + ( + "The class `OldClass` will be deprecated in a future version. " + "Use NewClass instead." + ), ), ( { @@ -50,8 +52,10 @@ from langchain_core._api.deprecation import ( "addendum": "Please migrate your code.", "removal": "2.5.0", }, - "`SomeFunction` was deprecated in LangChain 1.5.0 and will be " - "removed in 2.5.0 Please migrate your code.", + ( + "`SomeFunction` was deprecated in LangChain 1.5.0 and will be " + "removed in 2.5.0 Please migrate your code." + ), ), ], ) diff --git a/libs/core/tests/unit_tests/language_models/chat_models/test_rate_limiting.py b/libs/core/tests/unit_tests/language_models/chat_models/test_rate_limiting.py index 580e6f5837e..52222829148 100644 --- a/libs/core/tests/unit_tests/language_models/chat_models/test_rate_limiting.py +++ b/libs/core/tests/unit_tests/language_models/chat_models/test_rate_limiting.py @@ -214,9 +214,11 @@ def test_rate_limit_skips_cache() -> None: # cache key assert list(cache._cache) == [ ( - '[{"lc": 1, "type": "constructor", "id": ["langchain", "schema", ' - '"messages", "HumanMessage"], "kwargs": {"content": "foo", ' - '"type": "human"}}]', + ( + '[{"lc": 1, "type": "constructor", "id": ["langchain", "schema", ' + '"messages", "HumanMessage"], "kwargs": {"content": "foo", ' + '"type": "human"}}]' + ), "[('_type', 'generic-fake-chat-model'), ('stop', None)]", ) ] diff --git a/libs/core/tests/unit_tests/test_tools.py b/libs/core/tests/unit_tests/test_tools.py index 76506ae2a45..5c1144ac221 100644 --- a/libs/core/tests/unit_tests/test_tools.py +++ b/libs/core/tests/unit_tests/test_tools.py @@ -2152,6 +2152,7 @@ def test__get_all_basemodel_annotations_v2(*, use_v1_namespace: bool) -> None: class EmptyModel(BaseModelV1, Generic[A], extra="allow"): pass + else: class ModelA(BaseModel, Generic[A]): # type: ignore[no-redef] diff --git a/libs/core/uv.lock b/libs/core/uv.lock index f51bdad992b..29e608deae7 100644 --- a/libs/core/uv.lock +++ b/libs/core/uv.lock @@ -1,5 +1,5 @@ version = 1 -revision = 2 +revision = 3 requires-python = ">=3.10.0, <4.0.0" resolution-markers = [ "python_full_version >= '3.14' and platform_python_implementation == 'PyPy'", @@ -1057,7 +1057,7 @@ dev = [ { name = "jupyter", specifier = ">=1.0.0,<2.0.0" }, { name = "setuptools", specifier = ">=67.6.1,<83.0.0" }, ] -lint = [{ name = "ruff", specifier = ">=0.14.11,<0.16.0" }] +lint = [{ name = "ruff", specifier = ">=0.15.0,<0.16.0" }] test = [ { name = "blockbuster", specifier = ">=1.5.18,<1.6.0" }, { name = "freezegun", specifier = ">=1.2.2,<2.0.0" }, diff --git a/libs/langchain/langchain_classic/chat_models/base.py b/libs/langchain/langchain_classic/chat_models/base.py index a32b7a073b6..5e46a953268 100644 --- a/libs/langchain/langchain_classic/chat_models/base.py +++ b/libs/langchain/langchain_classic/chat_models/base.py @@ -573,7 +573,10 @@ def _attempt_infer_model_provider(model_name: str) -> str | None: # AWS Bedrock models if model_name.startswith("amazon.") or model_lower.startswith( - ("anthropic.", "meta.") + ( + "anthropic.", + "meta.", + ) ): return "bedrock" diff --git a/libs/langchain/pyproject.toml b/libs/langchain/pyproject.toml index 579f43a4eee..df570bae90c 100644 --- a/libs/langchain/pyproject.toml +++ b/libs/langchain/pyproject.toml @@ -99,7 +99,7 @@ test_integration = [ "langchain-text-splitters", ] lint = [ - "ruff>=0.14.11,<0.16.0", + "ruff>=0.15.0,<0.16.0", "cffi<1.17.1; python_version < \"3.10\"", "cffi; python_version >= \"3.10\"", ] diff --git a/libs/langchain/uv.lock b/libs/langchain/uv.lock index cdc418e3ed6..3d2cb574cbd 100644 --- a/libs/langchain/uv.lock +++ b/libs/langchain/uv.lock @@ -2535,7 +2535,7 @@ dev = [ lint = [ { name = "cffi", marker = "python_full_version < '3.10'", specifier = "<1.17.1" }, { name = "cffi", marker = "python_full_version >= '3.10'" }, - { name = "ruff", specifier = ">=0.14.11,<0.16.0" }, + { name = "ruff", specifier = ">=0.15.0,<0.16.0" }, ] test = [ { name = "cffi", marker = "python_full_version < '3.10'", specifier = "<1.17.1" }, @@ -2621,7 +2621,7 @@ dev = [ { name = "jupyter", specifier = ">=1.0.0,<2.0.0" }, { name = "setuptools", specifier = ">=67.6.1,<83.0.0" }, ] -lint = [{ name = "ruff", specifier = ">=0.14.11,<0.16.0" }] +lint = [{ name = "ruff", specifier = ">=0.15.0,<0.16.0" }] test = [ { name = "blockbuster", specifier = ">=1.5.18,<1.6.0" }, { name = "freezegun", specifier = ">=1.2.2,<2.0.0" }, @@ -2869,7 +2869,7 @@ requires-dist = [ ] [package.metadata.requires-dev] -lint = [{ name = "ruff", specifier = ">=0.14.11,<0.16.0" }] +lint = [{ name = "ruff", specifier = ">=0.15.0,<0.16.0" }] test = [{ name = "langchain-core", editable = "../core" }] test-integration = [] typing = [ @@ -2896,7 +2896,7 @@ dev = [ ] lint = [ { name = "langchain-core", editable = "../core" }, - { name = "ruff", specifier = ">=0.14.11,<0.16.0" }, + { name = "ruff", specifier = ">=0.15.0,<0.16.0" }, ] test = [ { name = "freezegun", specifier = ">=1.2.2,<2.0.0" }, diff --git a/libs/langchain_v1/pyproject.toml b/libs/langchain_v1/pyproject.toml index f113ec2bfd0..cfccf4fbe50 100644 --- a/libs/langchain_v1/pyproject.toml +++ b/libs/langchain_v1/pyproject.toml @@ -74,7 +74,7 @@ test = [ "langchain-openai", ] lint = [ - "ruff>=0.14.11,<0.16.0", + "ruff>=0.15.0,<0.16.0", ] typing = [ "mypy>=1.19.1,<1.20.0", diff --git a/libs/langchain_v1/scripts/check_version.py b/libs/langchain_v1/scripts/check_version.py index 7c48652c1ef..35ab9789598 100644 --- a/libs/langchain_v1/scripts/check_version.py +++ b/libs/langchain_v1/scripts/check_version.py @@ -12,14 +12,14 @@ from pathlib import Path def get_pyproject_version(pyproject_path: Path) -> str | None: """Extract version from pyproject.toml.""" - content = pyproject_path.read_text() + content = pyproject_path.read_text(encoding="utf-8") match = re.search(r'^version\s*=\s*"([^"]+)"', content, re.MULTILINE) return match.group(1) if match else None def get_init_version(init_path: Path) -> str | None: """Extract __version__ from __init__.py.""" - content = init_path.read_text() + content = init_path.read_text(encoding="utf-8") match = re.search(r'^__version__\s*=\s*"([^"]+)"', content, re.MULTILINE) return match.group(1) if match else None diff --git a/libs/langchain_v1/uv.lock b/libs/langchain_v1/uv.lock index 467ca28c526..3efe2be29b8 100644 --- a/libs/langchain_v1/uv.lock +++ b/libs/langchain_v1/uv.lock @@ -1990,7 +1990,7 @@ requires-dist = [ provides-extras = ["community", "anthropic", "openai", "azure-ai", "google-vertexai", "google-genai", "fireworks", "ollama", "together", "mistralai", "huggingface", "groq", "aws", "deepseek", "xai", "perplexity"] [package.metadata.requires-dev] -lint = [{ name = "ruff", specifier = ">=0.14.11,<0.16.0" }] +lint = [{ name = "ruff", specifier = ">=0.15.0,<0.16.0" }] test = [ { name = "blockbuster", specifier = ">=1.5.26,<1.6.0" }, { name = "langchain-openai", editable = "../partners/openai" }, @@ -2183,7 +2183,7 @@ dev = [ { name = "jupyter", specifier = ">=1.0.0,<2.0.0" }, { name = "setuptools", specifier = ">=67.6.1,<83.0.0" }, ] -lint = [{ name = "ruff", specifier = ">=0.14.11,<0.16.0" }] +lint = [{ name = "ruff", specifier = ">=0.15.0,<0.16.0" }] test = [ { name = "blockbuster", specifier = ">=1.5.18,<1.6.0" }, { name = "freezegun", specifier = ">=1.2.2,<2.0.0" }, @@ -2432,7 +2432,7 @@ requires-dist = [ ] [package.metadata.requires-dev] -lint = [{ name = "ruff", specifier = ">=0.14.11,<0.16.0" }] +lint = [{ name = "ruff", specifier = ">=0.15.0,<0.16.0" }] test = [{ name = "langchain-core", editable = "../core" }] test-integration = [] typing = [ @@ -2459,7 +2459,7 @@ dev = [ ] lint = [ { name = "langchain-core", editable = "../core" }, - { name = "ruff", specifier = ">=0.14.11,<0.16.0" }, + { name = "ruff", specifier = ">=0.15.0,<0.16.0" }, ] test = [ { name = "freezegun", specifier = ">=1.2.2,<2.0.0" }, diff --git a/libs/model-profiles/pyproject.toml b/libs/model-profiles/pyproject.toml index bdf0533965a..fa5cc8e5553 100644 --- a/libs/model-profiles/pyproject.toml +++ b/libs/model-profiles/pyproject.toml @@ -61,7 +61,7 @@ test = [ test_integration = ["langchain-core"] lint = [ - "ruff>=0.12.2,<0.16.0", + "ruff>=0.15.0,<0.16.0", "langchain", ] typing = [ diff --git a/libs/model-profiles/uv.lock b/libs/model-profiles/uv.lock index e4302a5a6ca..14d2e68e149 100644 --- a/libs/model-profiles/uv.lock +++ b/libs/model-profiles/uv.lock @@ -497,7 +497,7 @@ requires-dist = [ provides-extras = ["community", "anthropic", "openai", "azure-ai", "google-vertexai", "google-genai", "fireworks", "ollama", "together", "mistralai", "huggingface", "groq", "aws", "deepseek", "xai", "perplexity"] [package.metadata.requires-dev] -lint = [{ name = "ruff", specifier = ">=0.14.11,<0.16.0" }] +lint = [{ name = "ruff", specifier = ">=0.15.0,<0.16.0" }] test = [ { name = "blockbuster", specifier = ">=1.5.26,<1.6.0" }, { name = "langchain-openai", editable = "../partners/openai" }, @@ -558,7 +558,7 @@ dev = [ { name = "jupyter", specifier = ">=1.0.0,<2.0.0" }, { name = "setuptools", specifier = ">=67.6.1,<83.0.0" }, ] -lint = [{ name = "ruff", specifier = ">=0.14.11,<0.16.0" }] +lint = [{ name = "ruff", specifier = ">=0.15.0,<0.16.0" }] test = [ { name = "blockbuster", specifier = ">=1.5.18,<1.6.0" }, { name = "freezegun", specifier = ">=1.2.2,<2.0.0" }, @@ -632,7 +632,7 @@ requires-dist = [ dev = [] lint = [ { name = "langchain", editable = "../langchain_v1" }, - { name = "ruff", specifier = ">=0.12.2,<0.16.0" }, + { name = "ruff", specifier = ">=0.15.0,<0.16.0" }, ] test = [ { name = "langchain", extras = ["openai"], editable = "../langchain_v1" }, diff --git a/libs/standard-tests/pyproject.toml b/libs/standard-tests/pyproject.toml index 848830a2234..0503db7a1ae 100644 --- a/libs/standard-tests/pyproject.toml +++ b/libs/standard-tests/pyproject.toml @@ -51,7 +51,7 @@ Reddit = "https://www.reddit.com/r/LangChain/" [dependency-groups] test = ["langchain-core"] test_integration = [] -lint = ["ruff>=0.14.11,<0.16.0"] +lint = ["ruff>=0.15.0,<0.16.0"] typing = [ "mypy>=1.19.1,<1.20.0", "types-pyyaml>=6.0.12.2,<7.0.0.0", diff --git a/libs/standard-tests/uv.lock b/libs/standard-tests/uv.lock index 84aec01ebc9..43d14ca57c8 100644 --- a/libs/standard-tests/uv.lock +++ b/libs/standard-tests/uv.lock @@ -352,7 +352,7 @@ dev = [ { name = "jupyter", specifier = ">=1.0.0,<2.0.0" }, { name = "setuptools", specifier = ">=67.6.1,<83.0.0" }, ] -lint = [{ name = "ruff", specifier = ">=0.14.11,<0.16.0" }] +lint = [{ name = "ruff", specifier = ">=0.15.0,<0.16.0" }] test = [ { name = "blockbuster", specifier = ">=1.5.18,<1.6.0" }, { name = "freezegun", specifier = ">=1.2.2,<2.0.0" }, @@ -428,7 +428,7 @@ requires-dist = [ ] [package.metadata.requires-dev] -lint = [{ name = "ruff", specifier = ">=0.14.11,<0.16.0" }] +lint = [{ name = "ruff", specifier = ">=0.15.0,<0.16.0" }] test = [{ name = "langchain-core", editable = "../core" }] test-integration = [] typing = [ diff --git a/libs/text-splitters/pyproject.toml b/libs/text-splitters/pyproject.toml index 8573c3f207c..5947f8218bb 100644 --- a/libs/text-splitters/pyproject.toml +++ b/libs/text-splitters/pyproject.toml @@ -40,7 +40,7 @@ Reddit = "https://www.reddit.com/r/LangChain/" [dependency-groups] lint = [ - "ruff>=0.14.11,<0.16.0", + "ruff>=0.15.0,<0.16.0", "langchain-core" ] typing = [ diff --git a/libs/text-splitters/uv.lock b/libs/text-splitters/uv.lock index bc4c7542576..f71a19ad60e 100644 --- a/libs/text-splitters/uv.lock +++ b/libs/text-splitters/uv.lock @@ -1206,7 +1206,7 @@ dev = [ { name = "jupyter", specifier = ">=1.0.0,<2.0.0" }, { name = "setuptools", specifier = ">=67.6.1,<83.0.0" }, ] -lint = [{ name = "ruff", specifier = ">=0.14.11,<0.16.0" }] +lint = [{ name = "ruff", specifier = ">=0.15.0,<0.16.0" }] test = [ { name = "blockbuster", specifier = ">=1.5.18,<1.6.0" }, { name = "freezegun", specifier = ">=1.2.2,<2.0.0" }, @@ -1288,7 +1288,7 @@ dev = [ ] lint = [ { name = "langchain-core", editable = "../core" }, - { name = "ruff", specifier = ">=0.14.11,<0.16.0" }, + { name = "ruff", specifier = ">=0.15.0,<0.16.0" }, ] test = [ { name = "freezegun", specifier = ">=1.2.2,<2.0.0" },