Initial upload: Auto README Generator CLI v0.1.0
Some checks failed
CI / build (push) Has been cancelled
CI / release (push) Has been cancelled
CI / test (push) Has been cancelled

This commit is contained in:
2026-02-05 08:40:02 +00:00
parent 4b14411173
commit 3ce214496f

View File

@@ -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