diff --git a/libs/cli/langchain_cli/__init__.py b/libs/cli/langchain_cli/__init__.py index b2228ec5584..63340339789 100644 --- a/libs/cli/langchain_cli/__init__.py +++ b/libs/cli/langchain_cli/__init__.py @@ -1,3 +1,5 @@ +"""LangChain CLI.""" + from langchain_cli._version import __version__ __all__ = [ diff --git a/libs/cli/langchain_cli/cli.py b/libs/cli/langchain_cli/cli.py index 15c5641e964..3080b6fc367 100644 --- a/libs/cli/langchain_cli/cli.py +++ b/libs/cli/langchain_cli/cli.py @@ -1,3 +1,5 @@ +"""LangChain CLI.""" + from typing import Annotated, Optional import typer @@ -34,20 +36,21 @@ app.command( ) -def version_callback(show_version: bool) -> None: # noqa: FBT001 +def _version_callback(*, show_version: bool) -> None: if show_version: typer.echo(f"langchain-cli {__version__}") raise typer.Exit @app.callback() -def main( - version: bool = typer.Option( # noqa: FBT001 +def _main( + *, + version: bool = typer.Option( False, # noqa: FBT003 "--version", "-v", help="Print the current CLI version.", - callback=version_callback, + callback=_version_callback, is_eager=True, ), ) -> None: diff --git a/libs/cli/langchain_cli/constants.py b/libs/cli/langchain_cli/constants.py index 7a1f7593929..dc017cc03be 100644 --- a/libs/cli/langchain_cli/constants.py +++ b/libs/cli/langchain_cli/constants.py @@ -1,3 +1,5 @@ +"""LangChain CLI constants.""" + DEFAULT_GIT_REPO = "https://github.com/langchain-ai/langchain.git" DEFAULT_GIT_SUBDIRECTORY = "templates" DEFAULT_GIT_REF = "master" diff --git a/libs/cli/langchain_cli/dev_scripts.py b/libs/cli/langchain_cli/dev_scripts.py index 605ea949f92..b4fab46377a 100644 --- a/libs/cli/langchain_cli/dev_scripts.py +++ b/libs/cli/langchain_cli/dev_scripts.py @@ -41,8 +41,10 @@ def create_demo_server( def create_demo_server_configurable(): + """Create a configurable demo server.""" return create_demo_server(config_keys=["configurable"]) def create_demo_server_chat(): + """Create a chat demo server.""" return create_demo_server(playground_type="chat") diff --git a/libs/cli/langchain_cli/namespaces/__init__.py b/libs/cli/langchain_cli/namespaces/__init__.py index e69de29bb2d..2f025105fe7 100644 --- a/libs/cli/langchain_cli/namespaces/__init__.py +++ b/libs/cli/langchain_cli/namespaces/__init__.py @@ -0,0 +1 @@ +"""Namespaces.""" diff --git a/libs/cli/langchain_cli/namespaces/integration.py b/libs/cli/langchain_cli/namespaces/integration.py index 87ce9a11caa..b577c8a65d3 100644 --- a/libs/cli/langchain_cli/namespaces/integration.py +++ b/libs/cli/langchain_cli/namespaces/integration.py @@ -15,6 +15,8 @@ integration_cli = typer.Typer(no_args_is_help=True, add_completion=False) class Replacements(TypedDict): + """Replacements.""" + __package_name__: str __module_name__: str __ModuleName__: str diff --git a/libs/cli/langchain_cli/namespaces/migrate/__init__.py b/libs/cli/langchain_cli/namespaces/migrate/__init__.py index e69de29bb2d..56c445feb74 100644 --- a/libs/cli/langchain_cli/namespaces/migrate/__init__.py +++ b/libs/cli/langchain_cli/namespaces/migrate/__init__.py @@ -0,0 +1 @@ +"""Migrations.""" diff --git a/libs/cli/langchain_cli/namespaces/migrate/generate/__init__.py b/libs/cli/langchain_cli/namespaces/migrate/generate/__init__.py index e69de29bb2d..3c21aaf8165 100644 --- a/libs/cli/langchain_cli/namespaces/migrate/generate/__init__.py +++ b/libs/cli/langchain_cli/namespaces/migrate/generate/__init__.py @@ -0,0 +1 @@ +"""Generate migrations.""" diff --git a/libs/cli/langchain_cli/namespaces/migrate/generate/grit.py b/libs/cli/langchain_cli/namespaces/migrate/generate/grit.py index 501b9f74426..14944ec459d 100644 --- a/libs/cli/langchain_cli/namespaces/migrate/generate/grit.py +++ b/libs/cli/langchain_cli/namespaces/migrate/generate/grit.py @@ -1,3 +1,6 @@ +"""Migration as Grit file.""" + + def split_package(package: str) -> tuple[str, str]: """Split a package name into the containing package and the final name.""" parts = package.split(".") diff --git a/libs/cli/langchain_cli/namespaces/migrate/generate/utils.py b/libs/cli/langchain_cli/namespaces/migrate/generate/utils.py index 3ea55f015c3..de923256c11 100644 --- a/libs/cli/langchain_cli/namespaces/migrate/generate/utils.py +++ b/libs/cli/langchain_cli/namespaces/migrate/generate/utils.py @@ -1,3 +1,5 @@ +"""Generate migrations utilities.""" + import ast import inspect import os @@ -5,6 +7,8 @@ import pathlib from pathlib import Path from typing import Any, Optional +from typing_extensions import override + HERE = Path(__file__).parent # Should bring us to [root]/src PKGS_ROOT = HERE.parent.parent.parent.parent.parent @@ -15,12 +19,15 @@ PARTNER_PKGS = PKGS_ROOT / "partners" class ImportExtractor(ast.NodeVisitor): + """Import extractor""" + def __init__(self, *, from_package: Optional[str] = None) -> None: """Extract all imports from the given code, optionally filtering by package.""" self.imports: list = [] self.package = from_package - def visit_ImportFrom(self, node) -> None: # noqa: N802 + @override + def visit_ImportFrom(self, node) -> None: if node.module and ( self.package is None or str(node.module).startswith(self.package) ): @@ -143,6 +150,7 @@ def find_imports_from_package( *, from_package: Optional[str] = None, ) -> list[tuple[str, str]]: + """Find imports in code.""" # Parse the code into an AST tree = ast.parse(code) # Create an instance of the visitor diff --git a/libs/cli/langchain_cli/utils/__init__.py b/libs/cli/langchain_cli/utils/__init__.py index e69de29bb2d..dc51750efa0 100644 --- a/libs/cli/langchain_cli/utils/__init__.py +++ b/libs/cli/langchain_cli/utils/__init__.py @@ -0,0 +1 @@ +"""Utilities.""" diff --git a/libs/cli/langchain_cli/utils/events.py b/libs/cli/langchain_cli/utils/events.py index f7200b352ca..b3b6edaef52 100644 --- a/libs/cli/langchain_cli/utils/events.py +++ b/libs/cli/langchain_cli/utils/events.py @@ -1,3 +1,5 @@ +"""Events utilities.""" + import http.client import json from typing import Any, Optional, TypedDict @@ -8,11 +10,18 @@ WRITE_KEY = "310apTK0HUFl4AOv" class EventDict(TypedDict): + """Event data structure for analytics tracking. + + Attributes: + event: The name of the event. + properties: Optional dictionary of event properties. + """ event: str properties: Optional[dict[str, Any]] def create_events(events: list[EventDict]) -> Optional[Any]: + """Create events.""" try: data = { "events": [ diff --git a/libs/cli/langchain_cli/utils/find_replace.py b/libs/cli/langchain_cli/utils/find_replace.py index b1528ef4f54..2cfacf70b37 100644 --- a/libs/cli/langchain_cli/utils/find_replace.py +++ b/libs/cli/langchain_cli/utils/find_replace.py @@ -1,7 +1,10 @@ +"""Find and replace text in files.""" + from pathlib import Path def find_and_replace(source: str, replacements: dict[str, str]) -> str: + """Find and replace text in a string.""" rtn = source # replace keys in deterministic alphabetical order @@ -13,6 +16,7 @@ def find_and_replace(source: str, replacements: dict[str, str]) -> str: def replace_file(source: Path, replacements: dict[str, str]) -> None: + """Replace text in a file.""" try: content = source.read_text() except UnicodeDecodeError: @@ -24,6 +28,7 @@ def replace_file(source: Path, replacements: dict[str, str]) -> None: def replace_glob(parent: Path, glob: str, replacements: dict[str, str]) -> None: + """Replace text in files matching a glob pattern.""" for file in parent.glob(glob): if not file.is_file(): continue diff --git a/libs/cli/langchain_cli/utils/git.py b/libs/cli/langchain_cli/utils/git.py index 68155d417c1..7ca46815224 100644 --- a/libs/cli/langchain_cli/utils/git.py +++ b/libs/cli/langchain_cli/utils/git.py @@ -1,3 +1,5 @@ +"""Git utilities.""" + import hashlib import re import shutil @@ -15,6 +17,8 @@ from langchain_cli.constants import ( class DependencySource(TypedDict): + """Dependency source information.""" + git: str ref: Optional[str] subdirectory: Optional[str] @@ -29,6 +33,7 @@ def parse_dependency_string( branch: Optional[str], api_path: Optional[str], ) -> DependencySource: + """Parse a dependency string into a DependencySource.""" if dep is not None and dep.startswith("git+"): if repo is not None or branch is not None: msg = ( @@ -121,6 +126,7 @@ def parse_dependencies( branch: list[str], api_path: list[str], ) -> list[DependencySource]: + """Parse dependencies.""" num_deps = max( len(dependencies) if dependencies is not None else 0, len(repo), @@ -168,6 +174,7 @@ def _get_repo_path(gitstring: str, ref: Optional[str], repo_dir: Path) -> Path: def update_repo(gitstring: str, ref: Optional[str], repo_dir: Path) -> Path: + """Update a git repository to the specified ref.""" # see if path already saved repo_path = _get_repo_path(gitstring, ref, repo_dir) if repo_path.exists(): diff --git a/libs/cli/langchain_cli/utils/github.py b/libs/cli/langchain_cli/utils/github.py index 335de0062d2..2feabea7ef9 100644 --- a/libs/cli/langchain_cli/utils/github.py +++ b/libs/cli/langchain_cli/utils/github.py @@ -1,9 +1,12 @@ +"""GitHub utilities.""" + import http.client import json from typing import Optional def list_packages(*, contains: Optional[str] = None) -> list[str]: + """List all packages in the langchain repository templates directory.""" conn = http.client.HTTPSConnection("api.github.com") try: headers = { diff --git a/libs/cli/langchain_cli/utils/packages.py b/libs/cli/langchain_cli/utils/packages.py index f45caec1ff2..4d634e47792 100644 --- a/libs/cli/langchain_cli/utils/packages.py +++ b/libs/cli/langchain_cli/utils/packages.py @@ -1,3 +1,5 @@ +"""Packages utilities.""" + from pathlib import Path from typing import Any, Optional, TypedDict @@ -5,6 +7,7 @@ from tomlkit import load def get_package_root(cwd: Optional[Path] = None) -> Path: + """Get package root directory.""" # traverse path for routes to host (any directory holding a pyproject.toml file) package_root = Path.cwd() if cwd is None else cwd visited: set[Path] = set() @@ -35,6 +38,7 @@ class LangServeExport(TypedDict): def get_langserve_export(filepath: Path) -> LangServeExport: + """Get LangServe export information from a pyproject.toml file.""" with open(filepath) as f: data: dict[str, Any] = load(f) try: diff --git a/libs/cli/langchain_cli/utils/pyproject.py b/libs/cli/langchain_cli/utils/pyproject.py index 237676d636f..732abd0ec76 100644 --- a/libs/cli/langchain_cli/utils/pyproject.py +++ b/libs/cli/langchain_cli/utils/pyproject.py @@ -1,3 +1,5 @@ +"""Pyproject.toml utilities.""" + import contextlib from collections.abc import Iterable from pathlib import Path diff --git a/libs/cli/pyproject.toml b/libs/cli/pyproject.toml index 4ce72a12f2d..8b0c1494973 100644 --- a/libs/cli/pyproject.toml +++ b/libs/cli/pyproject.toml @@ -55,7 +55,7 @@ select = [ "ASYNC", # flake8-async "C4", # flake8-comprehensions "COM", # flake8-commas - "D", # pydocstyle + "D1", # pydocstyle "E", # pycodestyle error "EM", # flake8-errmsg "F", # pyflakes @@ -88,18 +88,14 @@ select = [ "YTT", # flake8-2020 ] ignore = [ - "D100", # pydocstyle: Missing docstring in public module - "D101", # pydocstyle: Missing docstring in public class - "D102", # pydocstyle: Missing docstring in public method - "D103", # pydocstyle: Missing docstring in public function - "D104", # pydocstyle: Missing docstring in public package - "D105", # pydocstyle: Missing docstring in magic method - "D107", # pydocstyle: Missing docstring in __init__ "D407", # pydocstyle: Missing-dashed-underline-after-section "COM812", # Messes with the formatter ] pyupgrade.keep-runtime-typing = true +[tool.ruff.lint.per-file-ignores] +"tests/**" = [ "D1"] + [tool.mypy] exclude = [ "langchain_cli/integration_template", diff --git a/libs/cli/scripts/__init__.py b/libs/cli/scripts/__init__.py index e69de29bb2d..a9a18d78f25 100644 --- a/libs/cli/scripts/__init__.py +++ b/libs/cli/scripts/__init__.py @@ -0,0 +1 @@ +"""Scripts.""" diff --git a/libs/cli/scripts/generate_migrations.py b/libs/cli/scripts/generate_migrations.py index f5f915dafbc..01dc652a633 100644 --- a/libs/cli/scripts/generate_migrations.py +++ b/libs/cli/scripts/generate_migrations.py @@ -78,6 +78,7 @@ def generic( def handle_partner(pkg: str, output: Optional[str] = None) -> None: + """Handle partner package migrations.""" migrations = get_migrations_for_partner_package(pkg) # Run with python 3.9+ name = pkg.removeprefix("langchain_")