diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2a45d66..bb3c326 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,51 +10,42 @@ on: jobs: dart_format: - name: Dart format + name: Dart format check strategy: + fail-fast: false matrix: - dart: [3.3, 3.6] + dart: [3.3, 3.9] package: [cli_tools, config] runs-on: ubuntu-latest + defaults: + run: + working-directory: packages/${{ matrix.package }} steps: - uses: actions/checkout@v4 - uses: dart-lang/setup-dart@v1.7.1 with: sdk: ${{ matrix.dart }} - - name: Verify formatting ${{ matrix.package }} - run: dart format --output=none --set-exit-if-changed . - working-directory: packages/${{ matrix.package }} - dart_analyze: - name: Dart Analyze - strategy: - matrix: - dart: [3.3, 3.6] - package: [cli_tools, config] - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: dart-lang/setup-dart@v1.7.1 - with: - sdk: ${{ matrix.dart }} - - name: Dart get and analyze ${{ matrix.package }} - run: | - dart pub get - dart analyze --fatal-infos - working-directory: packages/${{ matrix.package }} + - run: dart pub get + - run: dart format --output=none --set-exit-if-changed . - dart_test: - name: Dart Test + dart_analyze_test: + name: Dart Analyze and Test strategy: + fail-fast: false matrix: - dart: [3.3, 3.6] + dart: [3.3, 3.9] package: [cli_tools, config] runs-on: ubuntu-latest + defaults: + run: + working-directory: packages/${{ matrix.package }} steps: - uses: actions/checkout@v4 - uses: dart-lang/setup-dart@v1.7.1 with: sdk: ${{ matrix.dart }} - - name: Dart test ${{ matrix.package }} - run: dart test - working-directory: packages/${{ matrix.package }} + + - run: dart pub get + - run: dart analyze --fatal-infos + - run: dart test diff --git a/.github/workflows/publish-cli_tools.yaml b/.github/workflows/publish-cli_tools.yaml index 97342f5..b0878fb 100644 --- a/.github/workflows/publish-cli_tools.yaml +++ b/.github/workflows/publish-cli_tools.yaml @@ -4,7 +4,8 @@ on: push: tags: # Matches tags like cli_tools-v1.2.3 and cli_tools-v1.2.3-pre.1 - - 'cli_tools-v[0-9]+.[0-9]+.[0-9]+*' + - 'cli_tools-v[0-9]+.[0-9]+.[0-9]+' + - 'cli_tools-v[0-9]+.[0-9]+.[0-9]+-*' jobs: publish: diff --git a/.github/workflows/publish-config.yaml b/.github/workflows/publish-config.yaml index 8e33bdd..31fedb3 100644 --- a/.github/workflows/publish-config.yaml +++ b/.github/workflows/publish-config.yaml @@ -4,7 +4,8 @@ on: push: tags: # Matches tags like config-v1.2.3 and config-v1.2.3-pre.1 - - 'config-v[0-9]+.[0-9]+.[0-9]+*' + - 'config-v[0-9]+.[0-9]+.[0-9]+' + - 'config-v[0-9]+.[0-9]+.[0-9]+-*' jobs: publish: diff --git a/README.md b/README.md index e4213b8..c1a18ab 100644 --- a/README.md +++ b/README.md @@ -8,11 +8,11 @@ They are actively maintained and used by the Serverpod team. ### cli_tools -The [cli_tools package](packages/cli_tools/README.md) offers several utilities for CLI development, for example: terminal logging, user-input prompting, and usage-analytics collection. +The [cli_tools package](packages/cli_tools/) offers several utilities for CLI development, for example: terminal logging, user-input prompting, and usage-analytics collection. ### config -The [config package](packages/config/README.md) provides comprehensive +The [config package](packages/config/) provides comprehensive configuration ingestion and validation, including typed command line options, environment variables, and configuration files as input, and better error reporting. diff --git a/packages/cli_tools/analysis_options.yaml b/packages/cli_tools/analysis_options.yaml index 3ce6aff..bcc9d5b 100644 --- a/packages/cli_tools/analysis_options.yaml +++ b/packages/cli_tools/analysis_options.yaml @@ -1,12 +1,5 @@ include: package:serverpod_lints/cli.yaml -analyzer: - language: - strict-raw-types: false - errors: - inference_failure_on_instance_creation: ignore - inference_failure_on_function_invocation: ignore - linter: rules: prefer_relative_imports: true diff --git a/packages/cli_tools/example/main.dart b/packages/cli_tools/example/main.dart index 7b44ac4..d91ba8b 100644 --- a/packages/cli_tools/example/main.dart +++ b/packages/cli_tools/example/main.dart @@ -2,7 +2,7 @@ import 'package:cli_tools/cli_tools.dart'; import 'package:config/config.dart'; Future main(final List args) async { - final commandRunner = BetterCommandRunner( + final commandRunner = BetterCommandRunner, void>( 'example', 'Example CLI command', globalOptions: [ @@ -47,7 +47,7 @@ Future main(final List args) async { /// /// The enum approach is more distinct and type safe. /// The list approach is more dynamic and permits non-const initialization. -enum TimeSeriesOption implements OptionDefinition { +enum TimeSeriesOption implements OptionDefinition { until(DateTimeOption( argName: 'until', envName: 'SERIES_UNTIL', // can also be specified as environment variable diff --git a/packages/cli_tools/example/simple_command_example.dart b/packages/cli_tools/example/simple_command_example.dart index 95b4fe2..2787cb8 100644 --- a/packages/cli_tools/example/simple_command_example.dart +++ b/packages/cli_tools/example/simple_command_example.dart @@ -14,7 +14,7 @@ import 'package:config/config.dart'; /// INTERVAL=1s dart run example/simple_command_example.dart show /// ``` Future main(final List args) async { - final commandRunner = BetterCommandRunner( + final commandRunner = BetterCommandRunner, void>( 'example', 'Example CLI command', ); @@ -29,7 +29,7 @@ Future main(final List args) async { return 0; } -enum ShowOption implements OptionDefinition { +enum ShowOption implements OptionDefinition { interval(DurationOption( argName: 'interval', argAbbrev: 'i', diff --git a/packages/cli_tools/lib/src/better_command_runner/better_command_runner.dart b/packages/cli_tools/lib/src/better_command_runner/better_command_runner.dart index 0397b3e..21f65b8 100644 --- a/packages/cli_tools/lib/src/better_command_runner/better_command_runner.dart +++ b/packages/cli_tools/lib/src/better_command_runner/better_command_runner.dart @@ -6,7 +6,8 @@ import 'package:args/command_runner.dart'; import 'package:config/config.dart'; /// A function type for executing code before running a command. -typedef OnBeforeRunCommand = Future Function(BetterCommandRunner runner); +typedef OnBeforeRunCommand, T> = Future + Function(BetterCommandRunner runner); /// A proxy for user-provided functions for passing specific log messages. /// @@ -54,7 +55,7 @@ typedef OnAnalyticsEvent = void Function(String event); /// The [BetterCommandRunner] class uses the config library to provide /// a more enhanced command line interface for running commands and handling /// command line arguments, environment variables, and configuration. -class BetterCommandRunner +class BetterCommandRunner, T> extends CommandRunner { /// Process exit code value for command not found - /// The specified command was not found or couldn't be located. @@ -62,7 +63,7 @@ class BetterCommandRunner final MessageOutput? _messageOutput; final SetLogLevel? _setLogLevel; - final OnBeforeRunCommand? _onBeforeRunCommand; + final OnBeforeRunCommand? _onBeforeRunCommand; OnAnalyticsEvent? _onAnalyticsEvent; /// The environment variables used for configuration resolution. @@ -143,7 +144,7 @@ class BetterCommandRunner final MessageOutput? messageOutput = const MessageOutput(usageLogger: print), final SetLogLevel? setLogLevel, - final OnBeforeRunCommand? onBeforeRunCommand, + final OnBeforeRunCommand? onBeforeRunCommand, final OnAnalyticsEvent? onAnalyticsEvent, final int? wrapTextColumn, final List? globalOptions, @@ -360,7 +361,7 @@ abstract class BetterCommandRunnerFlags { ); } -enum StandardGlobalOption implements OptionDefinition { +enum StandardGlobalOption implements OptionDefinition { quiet(BetterCommandRunnerFlags.quietOption), verbose(BetterCommandRunnerFlags.verboseOption), analytics(BetterCommandRunnerFlags.analyticsOption); diff --git a/packages/cli_tools/lib/src/documentation_generator/documentation_generator.dart b/packages/cli_tools/lib/src/documentation_generator/documentation_generator.dart index e0143ed..b9447c2 100644 --- a/packages/cli_tools/lib/src/documentation_generator/documentation_generator.dart +++ b/packages/cli_tools/lib/src/documentation_generator/documentation_generator.dart @@ -1,7 +1,9 @@ +import 'package:config/config.dart' show OptionDefinition; + import '../../better_command_runner.dart' show BetterCommandRunner; class CommandDocumentationGenerator { - final BetterCommandRunner commandRunner; + final BetterCommandRunner, void> commandRunner; CommandDocumentationGenerator(this.commandRunner); diff --git a/packages/cli_tools/pubspec.yaml b/packages/cli_tools/pubspec.yaml index 5153d0e..0576fbe 100644 --- a/packages/cli_tools/pubspec.yaml +++ b/packages/cli_tools/pubspec.yaml @@ -25,6 +25,6 @@ dependencies: super_string: ^1.0.3 dev_dependencies: - serverpod_lints: '>=1.2.6' - test: ^1.24.0 - test_descriptor: ^2.0.2 + serverpod_lints: '>=2.7.0' + test: ^1.25.0 + test_descriptor: ^2.0.0 diff --git a/packages/cli_tools/test/better_command_runner/analytics_test.dart b/packages/cli_tools/test/better_command_runner/analytics_test.dart index fc99d82..5a3f23c 100644 --- a/packages/cli_tools/test/better_command_runner/analytics_test.dart +++ b/packages/cli_tools/test/better_command_runner/analytics_test.dart @@ -2,11 +2,12 @@ import 'dart:async'; import 'package:args/command_runner.dart'; import 'package:cli_tools/better_command_runner.dart'; +import 'package:config/config.dart' show OptionDefinition; import 'package:test/test.dart'; import '../test_utils/test_utils.dart' show flushEventQueue; -class MockCommand extends Command { +class MockCommand extends Command { static String commandName = 'mock-command'; @override @@ -27,7 +28,7 @@ class MockCommand extends Command { } } -class CompletableMockCommand extends Command { +class CompletableMockCommand extends Command { static String commandName = 'completable-mock-command'; @override @@ -53,9 +54,9 @@ class CompletableMockCommand extends Command { } void main() { - late BetterCommandRunner runner; + late BetterCommandRunner, void> runner; group('Given runner with null onAnalyticsEvent callback', () { - final runner = BetterCommandRunner( + final runner = BetterCommandRunner, void>( 'test', 'this is a test cli', onAnalyticsEvent: null, @@ -75,7 +76,7 @@ void main() { }); group('Given runner with onAnalyticsEvent callback defined', () { - final runner = BetterCommandRunner( + final runner = BetterCommandRunner, void>( 'test', 'this is a test cli', onAnalyticsEvent: (final event) {}, @@ -94,7 +95,7 @@ void main() { group('Given runner with analytics enabled', () { List events = []; setUp(() { - runner = BetterCommandRunner( + runner = BetterCommandRunner, void>( 'test', 'this is a test cli', onAnalyticsEvent: (final event) => events.add(event), @@ -207,7 +208,7 @@ void main() { group('Given runner with registered command and analytics enabled', () { List events = []; setUp(() { - runner = BetterCommandRunner( + runner = BetterCommandRunner, void>( 'test', 'this is a test cli', onAnalyticsEvent: (final event) => events.add(event), @@ -272,7 +273,7 @@ void main() { late CompletableMockCommand command; setUp(() { command = CompletableMockCommand(); - runner = BetterCommandRunner( + runner = BetterCommandRunner, void>( 'test', 'this is a test cli', onAnalyticsEvent: (final event) => events.add(event), diff --git a/packages/cli_tools/test/better_command_runner/better_command_test.dart b/packages/cli_tools/test/better_command_runner/better_command_test.dart index 5dfb8fc..c4d8663 100644 --- a/packages/cli_tools/test/better_command_runner/better_command_test.dart +++ b/packages/cli_tools/test/better_command_runner/better_command_test.dart @@ -4,7 +4,7 @@ import 'package:cli_tools/better_command_runner.dart'; import 'package:config/config.dart'; import 'package:test/test.dart'; -enum BespokeGlobalOption implements OptionDefinition { +enum BespokeGlobalOption implements OptionDefinition { quiet(BetterCommandRunnerFlags.quietOption), verbose(BetterCommandRunnerFlags.verboseOption), analytics(BetterCommandRunnerFlags.analyticsOption), @@ -16,7 +16,7 @@ enum BespokeGlobalOption implements OptionDefinition { final ConfigOptionBase option; } -class MockCommand extends BetterCommand { +class MockCommand extends BetterCommand, void> { static String commandName = 'mock-command'; MockCommand({super.messageOutput}) @@ -38,7 +38,9 @@ class MockCommand extends BetterCommand { Future run() async {} @override - FutureOr? runWithConfig(final Configuration commandConfig) { + FutureOr? runWithConfig( + final Configuration> commandConfig, + ) { throw UnimplementedError(); } } @@ -56,7 +58,7 @@ void main() { final betterCommand = MockCommand( messageOutput: messageOutput, ); - final runner = BetterCommandRunner( + final runner = BetterCommandRunner, void>( 'test', 'test project', onAnalyticsEvent: (final e) => analyticsEvents.add(e), @@ -97,7 +99,7 @@ void main() { 'then help analytics is sent', () async { await runner.run(['--help']); - await Future.delayed(const Duration(milliseconds: 100)); + await Future.delayed(const Duration(milliseconds: 100)); expect(analyticsEvents, hasLength(1)); expect(analyticsEvents.single, 'help'); }); @@ -107,7 +109,7 @@ void main() { 'then help analytics is sent', () async { await runner.run(['help']); - await Future.delayed(const Duration(milliseconds: 100)); + await Future.delayed(const Duration(milliseconds: 100)); expect(analyticsEvents, hasLength(1)); expect(analyticsEvents.single, 'help'); }); @@ -117,7 +119,7 @@ void main() { 'then subcommand analytics is sent', () async { await runner.run([MockCommand.commandName]); - await Future.delayed(const Duration(milliseconds: 100)); + await Future.delayed(const Duration(milliseconds: 100)); expect(analyticsEvents, hasLength(1)); expect(analyticsEvents.single, 'mock-command'); }); @@ -127,7 +129,7 @@ void main() { 'then invalid command analytics is sent', () async { await runner.run(['no-such-command']).catchError((final _) {}); - await Future.delayed(const Duration(milliseconds: 100)); + await Future.delayed(const Duration(milliseconds: 100)); expect(analyticsEvents, hasLength(1)); expect(analyticsEvents.single, 'invalid'); }); @@ -138,7 +140,7 @@ void main() { 'then subcommand analytics is not sent', () async { await runner.run([MockCommand.commandName, '--no-analytics']); - await Future.delayed(const Duration(milliseconds: 100)); + await Future.delayed(const Duration(milliseconds: 100)); expect(analyticsEvents, isEmpty); }); }); @@ -155,7 +157,7 @@ void main() { final betterCommand = MockCommand( messageOutput: messageOutput, ); - final runner = BetterCommandRunner( + final runner = BetterCommandRunner, void>( 'test', 'test project', onAnalyticsEvent: (final e) => analyticsEvents.add(e), @@ -205,7 +207,7 @@ void main() { final betterCommand = MockCommand( messageOutput: messageOutput, ); - final runner = BetterCommandRunner( + final runner = BetterCommandRunner, void>( 'test', 'test project', messageOutput: messageOutput, @@ -254,7 +256,7 @@ void main() { final betterCommand = MockCommand( messageOutput: messageOutput, ); - final runner = BetterCommandRunner( + final runner = BetterCommandRunner, void>( 'test', 'test project', globalOptions: BespokeGlobalOption.values, diff --git a/packages/cli_tools/test/better_command_runner/command_test.dart b/packages/cli_tools/test/better_command_runner/command_test.dart index 49a9958..aa065ca 100644 --- a/packages/cli_tools/test/better_command_runner/command_test.dart +++ b/packages/cli_tools/test/better_command_runner/command_test.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'package:args/command_runner.dart'; import 'package:cli_tools/better_command_runner.dart'; +import 'package:config/config.dart' show OptionDefinition; import 'package:test/test.dart'; class MockCommand extends Command { @@ -33,7 +34,7 @@ class MockCommand extends Command { } void main() { - late BetterCommandRunner runner; + late BetterCommandRunner, void> runner; late MockCommand mockCommand; group('Given runner with registered command', () { setUp(() { diff --git a/packages/cli_tools/test/better_command_runner/default_flags_test.dart b/packages/cli_tools/test/better_command_runner/default_flags_test.dart index 6a8fbcd..471497d 100644 --- a/packages/cli_tools/test/better_command_runner/default_flags_test.dart +++ b/packages/cli_tools/test/better_command_runner/default_flags_test.dart @@ -1,9 +1,10 @@ import 'package:cli_tools/better_command_runner.dart'; +import 'package:config/config.dart' show OptionDefinition; import 'package:test/test.dart'; void main() { group('Given BetterCommandRunner runner with onAnalyticsEvent', () { - final runner = BetterCommandRunner( + final runner = BetterCommandRunner, void>( 'test', 'test description', onAnalyticsEvent: (final event) {}, diff --git a/packages/cli_tools/test/better_command_runner/exit_exceptions_test.dart b/packages/cli_tools/test/better_command_runner/exit_exceptions_test.dart index eecbe87..52b2276 100644 --- a/packages/cli_tools/test/better_command_runner/exit_exceptions_test.dart +++ b/packages/cli_tools/test/better_command_runner/exit_exceptions_test.dart @@ -1,8 +1,9 @@ import 'package:args/command_runner.dart'; import 'package:cli_tools/better_command_runner.dart'; +import 'package:config/config.dart' show OptionDefinition; import 'package:test/test.dart'; -class MockCommand extends Command { +class MockCommand extends Command { static String commandName = 'mock-command'; @override @@ -28,8 +29,10 @@ class MockCommand extends Command { void main() { group('Given runner with registered command', () { - final runner = BetterCommandRunner('test', 'this is a test cli') - ..addCommand(MockCommand()); + final runner = BetterCommandRunner, void>( + 'test', + 'this is a test cli', + )..addCommand(MockCommand()); test( 'when running with unknown command then UsageException is thrown.', diff --git a/packages/cli_tools/test/better_command_runner/logging_test.dart b/packages/cli_tools/test/better_command_runner/logging_test.dart index 7a08aaf..7a8b86a 100644 --- a/packages/cli_tools/test/better_command_runner/logging_test.dart +++ b/packages/cli_tools/test/better_command_runner/logging_test.dart @@ -1,8 +1,9 @@ import 'package:args/command_runner.dart'; import 'package:cli_tools/better_command_runner.dart'; +import 'package:config/config.dart' show OptionDefinition; import 'package:test/test.dart'; -class MockCommand extends Command { +class MockCommand extends Command { static String commandName = 'mock-command'; @override @@ -30,7 +31,7 @@ void main() { group('Given runner with registered command and logging monitor', () { final errors = []; final infos = []; - final runner = BetterCommandRunner( + final runner = BetterCommandRunner, void>( 'test', 'this is a test cli', messageOutput: MessageOutput( diff --git a/packages/cli_tools/test/better_command_runner/parse_log_level_test.dart b/packages/cli_tools/test/better_command_runner/parse_log_level_test.dart index dd133fc..53e9167 100644 --- a/packages/cli_tools/test/better_command_runner/parse_log_level_test.dart +++ b/packages/cli_tools/test/better_command_runner/parse_log_level_test.dart @@ -1,8 +1,9 @@ import 'package:args/command_runner.dart'; import 'package:cli_tools/better_command_runner.dart'; +import 'package:config/config.dart' show OptionDefinition; import 'package:test/test.dart'; -class MockCommand extends Command { +class MockCommand extends Command { static String commandName = 'mock-command'; @override @@ -24,7 +25,7 @@ void main() { logLevel = null; }); group('Given runner with setLogLevel callback', () { - final runner = BetterCommandRunner( + final runner = BetterCommandRunner, void>( 'test', 'this is a test cli', messageOutput: const MessageOutput(), @@ -92,7 +93,7 @@ void main() { }); group('Given runner with setLogLevel callback and registered command', () { - final runner = BetterCommandRunner( + final runner = BetterCommandRunner, void>( 'test', 'this is a test cli', setLogLevel: ({ diff --git a/packages/cli_tools/test/documentation_generator/generate_markdown_test.dart b/packages/cli_tools/test/documentation_generator/generate_markdown_test.dart index b2bd4df..c51c7f5 100644 --- a/packages/cli_tools/test/documentation_generator/generate_markdown_test.dart +++ b/packages/cli_tools/test/documentation_generator/generate_markdown_test.dart @@ -5,7 +5,7 @@ import 'package:cli_tools/cli_tools.dart'; import 'package:config/config.dart' show Configuration, OptionDefinition; import 'package:test/test.dart'; -class AddSpiceCommand extends Command { +class AddSpiceCommand extends Command { @override final String name = 'add'; @@ -21,7 +21,7 @@ class AddSpiceCommand extends Command { void run() {} } -class RemoveSpiceCommand extends Command { +class RemoveSpiceCommand extends Command { @override final String name = 'remove'; @@ -37,7 +37,7 @@ class RemoveSpiceCommand extends Command { void run() {} } -class AddVegetableCommand extends Command { +class AddVegetableCommand extends Command { @override final String name = 'add'; @@ -52,7 +52,7 @@ class AddVegetableCommand extends Command { void run() {} } -class SpiceCommand extends BetterCommand { +class SpiceCommand extends BetterCommand, void> { @override final String name = 'spice'; @@ -68,12 +68,14 @@ class SpiceCommand extends BetterCommand { void run() {} @override - FutureOr? runWithConfig(final Configuration commandConfig) { + FutureOr? runWithConfig( + final Configuration> commandConfig, + ) { throw UnimplementedError(); } } -class VegetableCommand extends BetterCommand { +class VegetableCommand extends BetterCommand, void> { @override final String name = 'vegetable'; @@ -88,7 +90,9 @@ class VegetableCommand extends BetterCommand { void run() {} @override - FutureOr? runWithConfig(final Configuration commandConfig) { + FutureOr? runWithConfig( + final Configuration> commandConfig, + ) { throw UnimplementedError(); } } @@ -98,10 +102,12 @@ void main() { late Map output; setUpAll(() async { - final commandRunner = - BetterCommandRunner('cookcli', 'A cli to create wonderful dishes.') - ..addCommand(SpiceCommand()) - ..addCommand(VegetableCommand()); + final commandRunner = BetterCommandRunner, void>( + 'cookcli', + 'A cli to create wonderful dishes.', + ) + ..addCommand(SpiceCommand()) + ..addCommand(VegetableCommand()); final generator = CommandDocumentationGenerator(commandRunner); output = generator.generateMarkdown(); }); diff --git a/packages/cli_tools/test/pub_api_client_test.dart b/packages/cli_tools/test/pub_api_client_test.dart index 315c7de..ec98897 100644 --- a/packages/cli_tools/test/pub_api_client_test.dart +++ b/packages/cli_tools/test/pub_api_client_test.dart @@ -14,7 +14,7 @@ MockClient createMockClient({ return MockClient((final request) { if (request.method != 'GET') throw NoSuchMethodError; return Future(() async { - await Future.delayed(responseDelay); + await Future.delayed(responseDelay); return http.Response(body, status); }); }); diff --git a/packages/cli_tools/test/test_utils/mock_stdin.dart b/packages/cli_tools/test/test_utils/mock_stdin.dart index 2561620..ee6f965 100644 --- a/packages/cli_tools/test/test_utils/mock_stdin.dart +++ b/packages/cli_tools/test/test_utils/mock_stdin.dart @@ -159,7 +159,7 @@ class MockStdin implements Stdin { } @override - Future pipe(final StreamConsumer> streamConsumer) { + Future pipe(final StreamConsumer> streamConsumer) { throw UnimplementedError(); } diff --git a/packages/cli_tools/test/test_utils/mock_stdout.dart b/packages/cli_tools/test/test_utils/mock_stdout.dart index 6bb4a94..aab6bdc 100644 --- a/packages/cli_tools/test/test_utils/mock_stdout.dart +++ b/packages/cli_tools/test/test_utils/mock_stdout.dart @@ -25,20 +25,20 @@ class MockStdout implements Stdout { } @override - Future addStream(final Stream> stream) { + Future addStream(final Stream> stream) { throw UnimplementedError(); } @override - Future close() { + Future close() { return Future.value(); } @override - Future get done => Future.value(); + Future get done => Future.value(); @override - Future flush() { + Future flush() { return Future.value(); } @@ -67,7 +67,7 @@ class MockStdout implements Stdout { } @override - void writeAll(final Iterable objects, [final String sep = '']) { + void writeAll(final Iterable objects, [final String sep = '']) { _buffer.writeAll(objects, sep); } diff --git a/packages/cli_tools/test/test_utils/prompts/option_matcher.dart b/packages/cli_tools/test/test_utils/prompts/option_matcher.dart index 7e31985..df4332f 100644 --- a/packages/cli_tools/test/test_utils/prompts/option_matcher.dart +++ b/packages/cli_tools/test/test_utils/prompts/option_matcher.dart @@ -12,7 +12,7 @@ class _EqualsAllOptionsMatcher extends Matcher { _EqualsAllOptionsMatcher(this._expected); @override - bool matches(final dynamic item, final Map matchState) { + bool matches(final dynamic item, final Map matchState) { if (item is! List