Initial upload: Auto README Generator CLI v0.1.0
This commit is contained in:
185
src/auto_readme/models/__init__.py
Normal file
185
src/auto_readme/models/__init__.py
Normal 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
|
||||||
Reference in New Issue
Block a user