CI: add engine coverage & linting/style fixes

Add AI engine coverage reporting to CI (run tests with coverage, show in step summary, and upload artifact). Relax and align engine pre-commit package specifiers and update uv.lock. Increase ruff line-length and add per-file ignores; update Taskfile and pre-commit Taskfile to use engine ruff config. Add coverage entries to engine/.gitignore. Apply numerous non-functional Python style and formatting fixes across scripts and cucumber test steps (imports, f-strings, line breaks, noqa markers, single-line asserts) to satisfy linters—no behavioral changes intended.
This commit is contained in:
Ludy87
2026-08-12 10:41:42 +02:00
parent 34819ae502
commit 06c6bec7ce
24 changed files with 498 additions and 412 deletions
@@ -52,7 +52,7 @@ class AITranslationHelper:
"target_languages": languages,
"max_entries_per_language": max_entries_per_language,
"instructions": {
"format": "Translate each entry maintaining JSON structure and placeholder variables like {n}, {total}, {filename}",
"format": "Translate each entry maintaining JSON structure and placeholder variables like {n}, {total}, {filename}", # noqa: E501
"context": "This is for a PDF manipulation tool. Keep technical terms consistent.",
"placeholders": "Preserve all placeholders: {n}, {total}, {filename}, etc.",
"style": "Keep translations concise and user-friendly",
+4 -6
View File
@@ -10,9 +10,9 @@ import json
import os
import subprocess
import sys
from concurrent.futures import ThreadPoolExecutor
import time
import tomllib
from concurrent.futures import ThreadPoolExecutor
from pathlib import Path
@@ -152,7 +152,7 @@ def translate_batches(batch_files, language_code, api_key, timeout=600, model="g
print(f"\n[{i}/{total}] Translating {batch_file}...")
# Always pass API key since it's required
cmd = f'python3 scripts/translations/batch_translator.py "{batch_file}" --language {language_code} --api-key "{api_key}" --model {model}'
cmd = f'python3 scripts/translations/batch_translator.py "{batch_file}" --language {language_code} --api-key "{api_key}" --model {model}' # noqa: E501
try:
result = subprocess.run(cmd, shell=True, capture_output=True, text=True, timeout=timeout)
@@ -223,7 +223,7 @@ def apply_translations(merged_file, language_code):
"""Apply merged translations to the language file."""
print(f"\n📝 Applying translations to {language_code}...")
cmd = f"python3 scripts/translations/translation_merger.py {language_code} apply-translations --translations-file {merged_file}"
cmd = f"python3 scripts/translations/translation_merger.py {language_code} apply-translations --translations-file {merged_file}" # noqa: E501
if not run_command(cmd):
print("✗ Failed to apply translations")
@@ -352,9 +352,7 @@ Examples:
sys.exit(0)
# Step 2: Translate all batches
translated_files = translate_batches(
batch_files, args.language, api_key, args.timeout, args.model, args.parallel
)
translated_files = translate_batches(batch_files, args.language, api_key, args.timeout, args.model, args.parallel)
if translated_files is None:
sys.exit(1)
+1 -1
View File
@@ -98,7 +98,7 @@ CRITICAL RULES - MUST FOLLOW EXACTLY:
- Do not remove any part of the original meaning
- Keep the same level of detail
Return ONLY the translated JSON. No markdown, no explanations, just the JSON object."""
Return ONLY the translated JSON. No markdown, no explanations, just the JSON object.""" # noqa: E501
def _record_usage(self, response) -> None:
"""Accumulate token usage/cost and print a per-batch line."""
+2 -5
View File
@@ -46,10 +46,7 @@ class TranslationAnalyzer:
# Convert lists to sets for faster lookup
return {
lang: set(patterns)
for lang, data in ignore_data.items()
for patterns in [data.get("ignore", [])]
if patterns
lang: set(patterns) for lang, data in ignore_data.items() for patterns in [data.get("ignore", [])] if patterns
}
except Exception as e:
print(f"Warning: Could not load ignore file {self.ignore_file}: {e}")
@@ -282,7 +279,7 @@ def main():
print("\nBottom 5 Languages Needing Attention:")
for result in sorted_by_completion[-5:]:
print(
f" {result['language']}: {result['completion_rate']:.1f}% ({result['missing_count']} missing, {result['untranslated_count']} untranslated)"
f" {result['language']}: {result['completion_rate']:.1f}% ({result['missing_count']} missing, {result['untranslated_count']} untranslated)" # noqa: E501
)
+1 -3
View File
@@ -467,9 +467,7 @@ def main():
# Extract translations from template format or simple dict
if "translations" in translations_data:
translations = {
k: v["translated"] for k, v in translations_data["translations"].items() if v.get("translated")
}
translations = {k: v["translated"] for k, v in translations_data["translations"].items() if v.get("translated")}
else:
translations = translations_data