From 3ce214496fd2a72676b1119aa00aaf74c5a7b44c Mon Sep 17 00:00:00 2001 From: 7000pctAUTO Date: Thu, 5 Feb 2026 08:40:02 +0000 Subject: [PATCH] Initial upload: Auto README Generator CLI v0.1.0 --- src/auto_readme/models/__init__.py | 185 +++++++++++++++++++++++++++++ 1 file changed, 185 insertions(+) create mode 100644 src/auto_readme/models/__init__.py diff --git a/src/auto_readme/models/__init__.py b/src/auto_readme/models/__init__.py new file mode 100644 index 0000000..eaa5404 --- /dev/null +++ b/src/auto_readme/models/__init__.py @@ -0,0 +1,185 @@ +"""Data models for the Auto README Generator.""" + +from dataclasses import dataclass, field +from datetime import datetime +from enum import Enum +from pathlib import Path +from typing import Optional + + +class ProjectType(Enum): + """Enumeration of supported project types.""" + + PYTHON = "python" + JAVASCRIPT = "javascript" + TYPESCRIPT = "typescript" + GO = "go" + RUST = "rust" + UNKNOWN = "unknown" + + +class FileType(Enum): + """Enumeration of file types.""" + + SOURCE = "source" + TEST = "test" + CONFIG = "config" + DOCUMENTATION = "documentation" + RESOURCE = "resource" + UNKNOWN = "unknown" + + +@dataclass +class Dependency: + """Represents a project dependency.""" + + name: str + version: Optional[str] = None + is_dev: bool = False + is_optional: bool = False + source_file: Optional[Path] = None + + def __hash__(self): + return hash(self.name) + + def __eq__(self, other): + if isinstance(other, Dependency): + return self.name == other.name + return False + + +@dataclass +class ImportStatement: + """Represents an import statement in source code.""" + + module: str + alias: Optional[str] = None + items: list[str] = field(default_factory=list) + line_number: int = 0 + is_from: bool = False + + +@dataclass +class Function: + """Represents a function extracted from source code.""" + + name: str + docstring: Optional[str] = None + parameters: list[str] = field(default_factory=list) + return_type: Optional[str] = None + line_number: int = 0 + file_path: Optional[Path] = None + visibility: str = "public" + + def signature(self) -> str: + """Generate a function signature string.""" + params = ", ".join(self.parameters) + return f"{self.name}({params})" + + +@dataclass +class Class: + """Represents a class extracted from source code.""" + + name: str + docstring: Optional[str] = None + base_classes: list[str] = field(default_factory=list) + methods: list[Function] = field(default_factory=list) + attributes: list[str] = field(default_factory=list) + line_number: int = 0 + file_path: Optional[Path] = None + visibility: str = "public" + + def public_methods(self) -> list[Function]: + """Return only public methods.""" + return [m for m in self.methods if m.visibility == "public"] + + +@dataclass +class SourceFile: + """Represents a source file in the project.""" + + path: Path + file_type: FileType + language: Optional[ProjectType] = None + functions: list[Function] = field(default_factory=list) + classes: list[Class] = field(default_factory=list) + imports: list[ImportStatement] = field(default_factory=list) + raw_content: Optional[str] = None + line_count: int = 0 + + @property + def extension(self) -> str: + """Get the file extension.""" + return self.path.suffix.lower() + + +@dataclass +class ProjectConfig: + """Represents project configuration metadata.""" + + name: str + version: Optional[str] = None + description: Optional[str] = None + author: Optional[str] = None + email: Optional[str] = None + license: Optional[str] = None + homepage: Optional[str] = None + repository: Optional[str] = None + python_requires: Optional[str] = None + + +@dataclass +class GitInfo: + """Represents git repository information.""" + + remote_url: Optional[str] = None + branch: Optional[str] = None + commit_sha: Optional[str] = None + is_repo: bool = False + + +@dataclass +class Project: + """Represents a complete project analysis result.""" + + root_path: Path + project_type: ProjectType + config: Optional[ProjectConfig] = None + git_info: Optional[GitInfo] = None + files: list[SourceFile] = field(default_factory=list) + dependencies: list[Dependency] = field(default_factory=list) + dev_dependencies: list[Dependency] = field(default_factory=list) + features: list[str] = field(default_factory=list) + installation_steps: list[str] = field(default_factory=list) + usage_examples: list[str] = field(default_factory=list) + generated_at: datetime = field(default_factory=datetime.now) + custom_sections: dict = field(default_factory=dict) + + def source_files(self) -> list[SourceFile]: + """Return only source files (not tests or config).""" + return [f for f in self.files if f.file_type == FileType.SOURCE] + + def test_files(self) -> list[SourceFile]: + """Return only test files.""" + return [f for f in self.files if f.file_type == FileType.TEST] + + def all_functions(self) -> list[Function]: + """Return all functions from all source files.""" + return [f for source in self.source_files() for f in source.functions] + + def all_classes(self) -> list[Class]: + """Return all classes from all source files.""" + return [c for source in self.source_files() for c in source.classes] + + def total_line_count(self) -> int: + """Calculate total line count of source files.""" + return sum(f.line_count for f in self.files) + + def language_count(self) -> dict[ProjectType, int]: + """Count files by programming language.""" + counts: dict[ProjectType, int] = {} + for f in self.files: + if f.language: + counts[f.language] = counts.get(f.language, 0) + 1 + return counts \ No newline at end of file