Source code for ralph.language_detector.models

"""Data models for detected project language stacks."""

from __future__ import annotations

from dataclasses import dataclass, field

MAX_SECONDARY_LANGUAGES = 6


[docs] @dataclass class ProjectStack: """Detected project stack summary.""" primary_language: str = "Unknown" secondary_languages: list[str] = field(default_factory=list) frameworks: list[str] = field(default_factory=list) has_tests: bool = False test_framework: str | None = None package_manager: str | None = None def is_rust(self) -> bool: return self.primary_language == "Rust" or "Rust" in self.secondary_languages def is_python(self) -> bool: return self.primary_language == "Python" or "Python" in self.secondary_languages def is_javascript_or_typescript(self) -> bool: targets = {"JavaScript", "TypeScript"} return self.primary_language in targets or any( language in targets for language in self.secondary_languages ) def is_go(self) -> bool: return self.primary_language == "Go" or "Go" in self.secondary_languages def summary(self) -> str: parts = [self.primary_language] if self.secondary_languages: parts.append(f"(+{', '.join(self.secondary_languages)})") if self.frameworks: parts.append(f"[{', '.join(self.frameworks)}]") if self.has_tests: parts.append(f"tests:{self.test_framework}" if self.test_framework else "tests:yes") return " ".join(parts)