Add package manager parsers (npm, pip, go, cargo)
Some checks failed
CI / test (push) Failing after 9s
Some checks failed
CI / test (push) Failing after 9s
This commit is contained in:
68
src/depcheck/parsers/cargo.py
Normal file
68
src/depcheck/parsers/cargo.py
Normal file
@@ -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
|
||||||
Reference in New Issue
Block a user