Source code for dash_evals.runner.scorers.flutter_output_parser
"""Parsers for Flutter command outputs."""
from dataclasses import dataclass
[docs]
@dataclass
class AnalyzerResult:
"""Parsed flutter analyze output."""
error_count: int
warning_count: int
info_count: int
raw_output: str
[docs]
@dataclass
class TestResult:
"""Parsed flutter test output."""
passed: bool
raw_output: str
passed_count: int = 0
failed_count: int = 0
[docs]
def parse_analyzer_output(output: str) -> AnalyzerResult:
"""
Parse flutter analyze output to count errors, warnings, and info messages.
Args:
output: Combined stdout and stderr from flutter analyze
Returns:
AnalyzerResult with counts and raw output
Examples:
>>> result = parse_analyzer_output("error • Something wrong\\nwarning • Be careful")
>>> result.error_count
1
>>> result.warning_count
1
"""
output_lower = output.lower()
error_count = output_lower.count("error •")
warning_count = output_lower.count("warning •")
info_count = output_lower.count("info •")
return AnalyzerResult(
error_count=error_count,
warning_count=warning_count,
info_count=info_count,
raw_output=output,
)
[docs]
def parse_test_output(output: str, success: bool) -> TestResult:
"""
Parse flutter test output to determine test results.
Args:
output: Combined stdout and stderr from flutter test
success: Whether the test command succeeded
Returns:
TestResult with pass/fail status and raw output
Examples:
>>> result = parse_test_output("All tests passed!", success=True)
>>> result.passed
True
"""
if success:
return TestResult(passed=True, raw_output=output)
# Parse test output to count passed/failed
if "All tests passed" in output or "all tests passed" in output:
return TestResult(passed=True, raw_output=output)
elif "+0" in output or "No tests" in output:
return TestResult(passed=False, passed_count=0, raw_output=output)
else:
# Partial credit for some passing tests
# Try to extract counts from output like "+3 -2"
passed_count = 0
failed_count = 0
# Look for patterns like "+3" and "-2"
import re
passed_match = re.search(r"\+(\d+)", output)
failed_match = re.search(r"-(\d+)", output)
if passed_match:
passed_count = int(passed_match.group(1))
if failed_match:
failed_count = int(failed_match.group(1))
return TestResult(
passed=False,
passed_count=passed_count,
failed_count=failed_count,
raw_output=output,
)