| """ |
| statistics.py |
| Project statistics |
| """ |
|
|
| from __future__ import annotations |
|
|
| from pathlib import Path |
|
|
| from utils import ( |
| estimate_tokens, |
| count_lines, |
| human_size, |
| language_from_extension, |
| ) |
|
|
|
|
| def build_statistics(files: list[Path], contents: list[tuple[Path, str]]) -> dict: |
| total_size = 0 |
| total_lines = 0 |
| total_tokens = 0 |
|
|
| languages = {} |
|
|
| largest = None |
| smallest = None |
|
|
| for path, text in contents: |
|
|
| try: |
| size = path.stat().st_size |
| except Exception: |
| size = len(text.encode()) |
|
|
| total_size += size |
| total_lines += count_lines(text) |
| total_tokens += estimate_tokens(text) |
|
|
| lang = language_from_extension(path.suffix) |
|
|
| languages[lang] = languages.get(lang, 0) + 1 |
|
|
| if largest is None or size > largest[1]: |
| largest = (path.name, size) |
|
|
| if smallest is None or size < smallest[1]: |
| smallest = (path.name, size) |
|
|
| return { |
| "files": len(files), |
| "lines": total_lines, |
| "tokens": total_tokens, |
| "size": total_size, |
| "size_human": human_size(total_size), |
| "languages": languages, |
| "largest": largest, |
| "smallest": smallest, |
| "average_size": total_size // max(len(files), 1), |
| } |
|
|
|
|
| def statistics_markdown(stats: dict) -> str: |
|
|
| langs = "\n".join( |
| f"- {k}: {v}" |
| for k, v in sorted(stats["languages"].items()) |
| ) |
|
|
| return f""" |
| ## Project Statistics |
| |
| Files: {stats["files"]} |
| |
| Lines: {stats["lines"]} |
| |
| Approx Tokens: {stats["tokens"]} |
| |
| Project Size: {stats["size_human"]} |
| |
| Average File Size: {human_size(stats["average_size"])} |
| |
| Largest File: |
| {stats["largest"]} |
| |
| Smallest File: |
| {stats["smallest"]} |
| |
| ### Languages |
| |
| {langs} |
| """.strip() |