From 22b13b97203df66b28049e83059c45a74a5b5f37 Mon Sep 17 00:00:00 2001 From: Nate Anderson <nate.anderson@vasion.com> Date: Thu, 6 Feb 2025 17:36:53 -0700 Subject: [PATCH] touchups on the scripts --- backend/pubspec.yaml | 4 +- backend/scripts/run_build_runner.dart | 68 ++++++++++++++++++--------- backend/scripts/test_runner.dart | 39 +++++++++++---- frontend/pubspec.lock | 8 ---- 4 files changed, 79 insertions(+), 40 deletions(-) diff --git a/backend/pubspec.yaml b/backend/pubspec.yaml index ec2d7f4..feb38ed 100644 --- a/backend/pubspec.yaml +++ b/backend/pubspec.yaml @@ -28,8 +28,8 @@ dev_dependencies: very_good_analysis: ^5.1.0 scripts: - run_build: dart scripts/run_build_runner.dart - run_watch: dart scripts/run_build_runner.dart --watch + runner_build: dart scripts/run_build_runner.dart + runner_watch: dart scripts/run_build_runner.dart --watch build: dart_frog build dev: dart_frog dev e2e: dart scripts/test_runner.dart diff --git a/backend/scripts/run_build_runner.dart b/backend/scripts/run_build_runner.dart index 432c82c..f59abb6 100644 --- a/backend/scripts/run_build_runner.dart +++ b/backend/scripts/run_build_runner.dart @@ -54,20 +54,23 @@ void main(List<String> args) async { Future<void> runBuildRunner(String packagePath, {required bool watch}) async { final package = packagePath.split('/').last; print('📦 Starting build_runner for $package...'); - Future<(Process, bool)> buildRunnerFunc() => watch ? _runBuildRunnerWatch(packagePath) : _runBuildRunner(packagePath); + Future<(Process, bool, String)> buildRunnerFunc() => + watch ? _runBuildRunnerWatch(packagePath) : _runBuildRunner(packagePath); const maxAttempts = 5; Future<void> attemptRecover(Object? e, int i) async { try { - print('\n⚠️ Error in $package:\n$e\nAttempting recovery (${i + 1} / $maxAttempts)...\n'); + print('\n⚠️ Error in $package:\n$e🤞 Attempting recovery (${i + 1} / $maxAttempts)...'); print(' Waiting 10 seconds before retry...'); - await Future<void>.delayed(const Duration(seconds: 1)); + await Future<void>.delayed(const Duration(seconds: 10)); // Recovery attempt - print(' Running pub get...'); + final cmd = package == 'frontend' ? 'flutter' : 'dart'; + print('📥 Running $cmd pub get...'); + await Process.run( - package == 'frontend' ? 'flutter' : 'dart', + cmd, ['pub', 'get'], workingDirectory: packagePath, ); @@ -82,11 +85,11 @@ Future<void> runBuildRunner(String packagePath, {required bool watch}) async { Object? err; for (var i = 0; i < maxAttempts; i++) { try { - final (process, needsRestart) = await buildRunnerFunc(); + final (process, needsRestart, errLogs) = await buildRunnerFunc(); final removed = runnerWatchProcesses.remove(process.pid); assert(removed != null, true); if (needsRestart) { - await attemptRecover(process.stderr, i); + await attemptRecover(errLogs, i); } else { return; } @@ -98,12 +101,21 @@ Future<void> runBuildRunner(String packagePath, {required bool watch}) async { exitRunners(); } -Future<(Process, bool)> _runBuildRunner(String package) async { - final process = await Process.start( - 'dart', - ['run', 'build_runner', 'build', '--delete-conflicting-outputs'], - workingDirectory: package, - ); +Future<(Process, bool, String)> _runBuildRunner(String package) async { + late final Process process; + if (package == 'frontend') { + process = await Process.start( + 'flutter', + ['pub', 'run', 'build_runner', 'build', '--delete-conflicting-outputs'], + workingDirectory: package, + ); + } else { + process = await Process.start( + 'dart', + ['run', 'build_runner', 'build', '--delete-conflicting-outputs'], + workingDirectory: package, + ); + } runnerWatchProcesses.addAll({process.pid: process}); @@ -123,7 +135,7 @@ Future<(Process, bool)> _runBuildRunner(String package) async { .join('\n'); print('Build runner failed for $package:\n$relevantErrors'); - return (process, true); + return (process, true, ''); } // Print success with minimal output @@ -131,16 +143,26 @@ Future<(Process, bool)> _runBuildRunner(String package) async { outputLines.where((line) => line.contains('Succeeded') || line.contains('Generated')).join('\n').trim(); print(' ${successMessage.isEmpty ? "Completed successfully" : successMessage}'); - return (process, false); + return (process, false, ''); } -Future<(Process, bool)> _runBuildRunnerWatch(String packagePath) async { +Future<(Process, bool, String)> _runBuildRunnerWatch(String packagePath) async { final package = packagePath.split('/').last; - final process = await Process.start( - 'dart', - ['run', 'build_runner', 'watch', '--delete-conflicting-outputs'], - workingDirectory: packagePath, - ); + late final Process process; + if (package == 'frontend') { + process = await Process.start( + 'flutter', + ['pub', 'run', 'build_runner', 'watch', '--delete-conflicting-outputs'], + workingDirectory: packagePath, + ); + } else { + process = await Process.start( + 'dart', + ['run', 'build_runner', 'watch', '--delete-conflicting-outputs'], + workingDirectory: packagePath, + ); + } + final logs = <String>[]; runnerWatchProcesses.addAll({process.pid: process}); @@ -153,6 +175,7 @@ Future<(Process, bool)> _runBuildRunnerWatch(String packagePath) async { print('🚩 [${package.toUpperCase()}] - ${line.trim()}'); restart = true; } + logs.add(line); }); process.stderr.transform(const SystemEncoding().decoder).listen((line) { @@ -160,13 +183,14 @@ Future<(Process, bool)> _runBuildRunnerWatch(String packagePath) async { print('🎯 [${package.toUpperCase()}] - ${line.trim()}'); restart = true; } + logs.add(line); }); final code = await process.exitCode; if (!restart) { restart = code != 0; } - return (process, restart); + return (process, restart, logs.join('\n')); } void exitRunners() { diff --git a/backend/scripts/test_runner.dart b/backend/scripts/test_runner.dart index 09f2497..81ac548 100644 --- a/backend/scripts/test_runner.dart +++ b/backend/scripts/test_runner.dart @@ -9,24 +9,45 @@ void main() async { final backendPath = '$projectRootPath/backend'; // Start the server - print('Starting Dart Frog server...'); + print('🐸 Building Dart Frog server...'); final build = await Process.start( 'dart_frog', ['build'], workingDirectory: backendPath, - mode: ProcessStartMode.inheritStdio, ); - List<String> serverLogs = []; + if (await build.exitCode != 0) { + stdout.writeln('💀 Failed to build backend:'); + + for (final element in [build.stdout, build.stderr]) { + element + ..transform(const SystemEncoding().decoder) + ..listen((line) => stdout.write(line)); + } + stdout.writeln(); + exit(1); + } + + final serverLogs = <String>[]; final server = await Process.start('dart', ['build/bin/server.dart'], workingDirectory: backendPath); - server.stdout.transform(const SystemEncoding().decoder).listen((line) => serverLogs.add(line)); - server.stderr.transform(const SystemEncoding().decoder).listen((line) => serverLogs.add(line)); + server.stdout.transform(const SystemEncoding().decoder).listen(serverLogs.add); + server.stderr.transform(const SystemEncoding().decoder).listen(serverLogs.add); + unawaited( + server.exitCode.then((code) async { + if (code != 0) { + stdout + ..writeln('💀 Failed to run backend:\n') + ..write(serverLogs.join('\n')); + exit(1); + } + }), + ); // Wait for server to be ready - print('Waiting for server to be ready...'); + print('⏲️ Waiting for server to be ready...'); await _waitForServer(); - print('Running tests...'); + print('🤞 Running tests...'); try { // Run the tests final testResult = await Process.run('dart', ['test', '$backendPath/test_e2e/tests/']); @@ -39,12 +60,14 @@ void main() async { if (testResult.exitCode != 0) { final sub = serverLogs.length > 10 ? serverLogs.length - 10 : 0; stdout.write("Server logs:\n${serverLogs.sublist(sub).join('\n')}"); + } else { + stdout.writeln("💨 Passed like a light breeze 😮💨"); } // Exit with the same code as the test process exit(testResult.exitCode); } catch (e) { - print('Error running tests: $e'); + print('💩 Error running tests 💩: $e'); build.kill(); server.kill(); diff --git a/frontend/pubspec.lock b/frontend/pubspec.lock index ab1692c..18d0ab9 100644 --- a/frontend/pubspec.lock +++ b/frontend/pubspec.lock @@ -320,14 +320,6 @@ packages: url: "https://pub.dev" source: hosted version: "4.3.0" - http: - dependency: transitive - description: - name: http - sha256: fe7ab022b76f3034adc518fb6ea04a82387620e19977665ea18d30a1cf43442f - url: "https://pub.dev" - source: hosted - version: "1.3.0" http_multi_server: dependency: transitive description: