Formatters factory

This commit is contained in:
Артём Кокос
2026-01-25 11:01:34 +07:00
parent f858618a13
commit 8278864b01
11 changed files with 342 additions and 231 deletions

View File

@@ -1,3 +1,4 @@
import os
import sys
import argparse
from typing import List, Optional
@@ -6,10 +7,7 @@ from redminelib.resources import Issue
from .config import Config
from .client import fetch_issues_with_spent_time
from .report_builder import build_grouped_report
from .formatter import format_compact, format_table
from .formatter_odt import format_odt
from .formatter_csv import format_csv
from .formatter_md import format_md
from .formatters.factory import get_formatter_by_extension, get_console_formatter
def parse_date_range(date_arg: str) -> tuple[str, str]:
@@ -80,45 +78,44 @@ def main(argv: Optional[List[str]] = None) -> int:
rows = build_grouped_report(issue_hours, fill_time=not args.no_time)
if args.output:
if not (args.output.endswith(".odt") or args.output.endswith(".csv") or args.output.endswith(".md")):
print("❌ Output file must end with .odt, .csv or .md", file=sys.stderr)
output_ext = os.path.splitext(args.output)[1].lower()
formatter = get_formatter_by_extension(output_ext,
author=Config.get_author(args.author),
from_date=from_date,
to_date=to_date
)
if not formatter:
print(f"❌ Неизвестный формат файла: {output_ext}", file=sys.stderr)
return 1
try:
if args.output.endswith(".odt"):
doc = format_odt(
rows,
author=Config.get_author(args.author),
from_date=from_date,
to_date=to_date,
)
doc.save(args.output)
elif args.output.endswith(".csv"):
content = format_csv(rows)
with open(args.output, "w", encoding="utf-8", newline="") as f:
f.write(content)
elif args.output.endswith(".md"):
content = format_md(rows)
with open(args.output, "w", encoding="utf-8") as f:
f.write(content)
formatter.save(rows, args.output)
print(f"✅ Report saved to {args.output}")
except ImportError as e:
if args.output.endswith(".odt"):
if output_ext == ".odt":
print("❌ odfpy is not installed. Install with: pip install odfpy", file=sys.stderr)
else:
print(f"❌ Import error: {e}", file=sys.stderr)
return 1
except Exception as e:
fmt = "ODT" if args.output.endswith(".odt") else ("CSV" if args.output.endswith(".csv") else "Markdown")
fmt = "ODT" if output_ext == ".odt" else ("CSV" if output_ext == ".csv" else "Markdown")
print(f"{fmt} export error: {e}", file=sys.stderr)
return 1
else:
if args.compact:
formatter = get_console_formatter("compact")
else:
formatter = get_console_formatter("table")
if not formatter:
print("❌ Неизвестный тип консольного форматтера.", file=sys.stderr)
return 1
try:
if args.compact:
output = format_compact(rows)
else:
output = format_table(rows)
output = formatter.format(rows)
print(output)
except Exception as e:
print(f"❌ Formatting error: {e}", file=sys.stderr)