From c69f585f5631faf8e2db2028e67aff87ffb553f1 Mon Sep 17 00:00:00 2001 From: 7000pctAUTO Date: Wed, 4 Feb 2026 14:56:31 +0000 Subject: [PATCH] Add package manager parsers (npm, pip, go, cargo) --- src/depcheck/parsers/cargo.py | 68 +++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 src/depcheck/parsers/cargo.py diff --git a/src/depcheck/parsers/cargo.py b/src/depcheck/parsers/cargo.py new file mode 100644 index 0000000..88eec67 --- /dev/null +++ b/src/depcheck/parsers/cargo.py @@ -0,0 +1,68 @@ +"""Cargo Cargo.toml parser.""" + +from pathlib import Path + +import toml + +from depcheck.models import Dependency, PackageManager +from depcheck.parsers import Parser +from depcheck.utils import parse_version_string + + +class CargoParser(Parser): + """Parser for Rust Cargo.toml files.""" + + package_manager = PackageManager.CARGO + + def supports_file(self, file_path: Path) -> bool: + return file_path.name == "Cargo.toml" + + def get_file_patterns(self) -> list[str]: + return ["Cargo.toml"] + + def parse(self, file_path: Path) -> list[Dependency]: + dependencies: list[Dependency] = [] + + try: + content = file_path.read_text() + data = toml.loads(content) + except (toml.TomlDecodeError, OSError): + return dependencies + + sections = [ + ("dependencies", "dependencies"), + ("dev-dependencies", "devDependencies"), + ("build-dependencies", "buildDependencies"), + ] + + for section_key, category in sections: + section = data.get(section_key, {}) + if isinstance(section, dict): + for name, version_info in section.items(): + if isinstance(version_info, str): + version = parse_version_string(version_info) + if version: + dependencies.append( + Dependency( + name=name, + current_version=version, + package_manager=self.package_manager, + category=category, + source_file=str(file_path), + ) + ) + elif isinstance(version_info, dict): + version = version_info.get("version", "") + version = parse_version_string(str(version)) + if version: + dependencies.append( + Dependency( + name=name, + current_version=version, + package_manager=self.package_manager, + category=category, + source_file=str(file_path), + ) + ) + + return dependencies