mirror of
https://github.com/pese-git/cherrypick.git
synced 2026-01-23 21:13:35 +00:00
refactor(report): extract ReportGenerator abstraction for pretty/csv/json; simplify report rendering in main
This commit is contained in:
@@ -146,6 +146,52 @@ T parseEnum<T>(String value, List<T> values, T defaultValue) {
|
||||
);
|
||||
}
|
||||
|
||||
/// --- Report Generation ---
|
||||
abstract class ReportGenerator {
|
||||
String render(List<Map<String, dynamic>> results);
|
||||
List<String> get keys;
|
||||
}
|
||||
class PrettyReport extends ReportGenerator {
|
||||
@override
|
||||
final List<String> keys = [
|
||||
'benchmark','chainCount','nestingDepth','mean_us','median_us','stddev_us',
|
||||
'min_us','max_us','trials','memory_diff_kb','delta_peak_kb','peak_rss_kb'
|
||||
];
|
||||
@override
|
||||
String render(List<Map<String, dynamic>> rows) {
|
||||
final header = keys.join('\t');
|
||||
final lines = rows.map((r) => keys.map((k) => (r[k] ?? '').toString()).join('\t')).toList();
|
||||
return ([header] + lines).join('\n');
|
||||
}
|
||||
}
|
||||
class CsvReport extends ReportGenerator {
|
||||
@override
|
||||
final List<String> keys = [
|
||||
'benchmark','chainCount','nestingDepth','mean_us','median_us','stddev_us',
|
||||
'min_us','max_us','trials','timings_us','memory_diff_kb','delta_peak_kb','peak_rss_kb'
|
||||
];
|
||||
@override
|
||||
String render(List<Map<String, dynamic>> rows) {
|
||||
final header = keys.join(',');
|
||||
final lines = rows.map((r) =>
|
||||
keys.map((k) {
|
||||
final v = r[k];
|
||||
if (v is List) return '"${v.join(';')}"';
|
||||
return (v ?? '').toString();
|
||||
}).join(',')
|
||||
).toList();
|
||||
return ([header] + lines).join('\n');
|
||||
}
|
||||
}
|
||||
class JsonReport extends ReportGenerator {
|
||||
@override
|
||||
List<String> get keys => [];
|
||||
@override
|
||||
String render(List<Map<String, dynamic>> rows) {
|
||||
return '[\n${rows.map((r) => ' $r').join(',\n')}\n]';
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> main(List<String> args) async {
|
||||
final parser = ArgParser()
|
||||
..addOption('benchmark', abbr: 'b', defaultsTo: 'chainSingleton')
|
||||
@@ -235,42 +281,13 @@ Future<void> main(List<String> args) async {
|
||||
}
|
||||
}
|
||||
}
|
||||
if (format == 'json') {
|
||||
print(_toJson(results));
|
||||
} else if (format == 'csv') {
|
||||
print(_toCsv(results));
|
||||
} else {
|
||||
print(_toPretty(results));
|
||||
}
|
||||
|
||||
final reportGenerators = {
|
||||
'pretty': PrettyReport(),
|
||||
'csv': CsvReport(),
|
||||
'json': JsonReport(),
|
||||
};
|
||||
print(reportGenerators[format]?.render(results) ?? PrettyReport().render(results));
|
||||
}
|
||||
|
||||
// --- helpers ---
|
||||
List<int> _parseIntList(String s) => s.split(',').map((e) => int.tryParse(e.trim()) ?? 0).where((x) => x > 0).toList();
|
||||
String _toPretty(List<Map<String, dynamic>> rows) {
|
||||
final keys = [
|
||||
'benchmark','chainCount','nestingDepth','mean_us','median_us','stddev_us',
|
||||
'min_us','max_us','trials','memory_diff_kb','delta_peak_kb','peak_rss_kb'
|
||||
];
|
||||
final header = keys.join('\t');
|
||||
final lines = rows.map((r) => keys.map((k) => (r[k] ?? '').toString()).join('\t')).toList();
|
||||
return ([header] + lines).join('\n');
|
||||
}
|
||||
String _toCsv(List<Map<String, dynamic>> rows) {
|
||||
final keys = [
|
||||
'benchmark','chainCount','nestingDepth','mean_us','median_us','stddev_us',
|
||||
'min_us','max_us','trials','timings_us','memory_diff_kb','delta_peak_kb','peak_rss_kb'
|
||||
];
|
||||
final header = keys.join(',');
|
||||
final lines = rows.map((r) =>
|
||||
keys.map((k) {
|
||||
final v = r[k];
|
||||
if (v is List) return '"${v.join(';')}"';
|
||||
return (v ?? '').toString();
|
||||
}).join(',')
|
||||
).toList();
|
||||
return ([header] + lines).join('\n');
|
||||
}
|
||||
String _toJson(List<Map<String, dynamic>> rows) {
|
||||
return '[\n${rows.map((r) => ' $r').join(',\n')}\n]';
|
||||
}
|
||||
// --- end helpers ---
|
||||
|
||||
Reference in New Issue
Block a user