Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions packages/cli_tools/analysis_options.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
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
2 changes: 1 addition & 1 deletion packages/cli_tools/example/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import 'package:cli_tools/cli_tools.dart';
import 'package:config/config.dart';

Future<int> main(final List<String> args) async {
final commandRunner = BetterCommandRunner<OptionDefinition<Object>, void>(
final commandRunner = BetterCommandRunner(
'example',
'Example CLI command',
globalOptions: [
Expand Down
2 changes: 1 addition & 1 deletion packages/cli_tools/example/simple_command_example.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import 'package:config/config.dart';
/// INTERVAL=1s dart run example/simple_command_example.dart show
/// ```
Future<int> main(final List<String> args) async {
final commandRunner = BetterCommandRunner<OptionDefinition<Object>, void>(
final commandRunner = BetterCommandRunner(
'example',
'Example CLI command',
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,7 @@ import 'package:args/command_runner.dart';
import 'package:config/config.dart';

/// A function type for executing code before running a command.
typedef OnBeforeRunCommand<O extends OptionDefinition<Object>, T> = Future<void>
Function(BetterCommandRunner<O, T> runner);
typedef OnBeforeRunCommand = Future<void> Function(BetterCommandRunner runner);

/// A proxy for user-provided functions for passing specific log messages.
///
Expand Down Expand Up @@ -55,15 +54,15 @@ 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<O extends OptionDefinition<Object>, T>
class BetterCommandRunner<O extends OptionDefinition, T>
extends CommandRunner<T> {
/// Process exit code value for command not found -
/// The specified command was not found or couldn't be located.
static const int exitCodeCommandNotFound = 127;

final MessageOutput? _messageOutput;
final SetLogLevel? _setLogLevel;
final OnBeforeRunCommand<O, T>? _onBeforeRunCommand;
final OnBeforeRunCommand? _onBeforeRunCommand;
OnAnalyticsEvent? _onAnalyticsEvent;

/// The environment variables used for configuration resolution.
Expand Down Expand Up @@ -144,7 +143,7 @@ class BetterCommandRunner<O extends OptionDefinition<Object>, T>
final MessageOutput? messageOutput =
const MessageOutput(usageLogger: print),
final SetLogLevel? setLogLevel,
final OnBeforeRunCommand<O, T>? onBeforeRunCommand,
final OnBeforeRunCommand? onBeforeRunCommand,
final OnAnalyticsEvent? onAnalyticsEvent,
final int? wrapTextColumn,
final List<O>? globalOptions,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
import 'package:config/config.dart' show OptionDefinition;

import '../../better_command_runner.dart' show BetterCommandRunner;

class CommandDocumentationGenerator {
final BetterCommandRunner<OptionDefinition<Object>, void> commandRunner;
final BetterCommandRunner commandRunner;

CommandDocumentationGenerator(this.commandRunner);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,11 @@ 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<void> {
class MockCommand extends Command {
static String commandName = 'mock-command';

@override
Expand All @@ -28,7 +27,7 @@ class MockCommand extends Command<void> {
}
}

class CompletableMockCommand extends Command<void> {
class CompletableMockCommand extends Command {
static String commandName = 'completable-mock-command';

@override
Expand All @@ -54,9 +53,9 @@ class CompletableMockCommand extends Command<void> {
}

void main() {
late BetterCommandRunner<OptionDefinition<Object>, void> runner;
late BetterCommandRunner runner;
group('Given runner with null onAnalyticsEvent callback', () {
final runner = BetterCommandRunner<OptionDefinition<Object>, void>(
final runner = BetterCommandRunner(
'test',
'this is a test cli',
onAnalyticsEvent: null,
Expand All @@ -76,7 +75,7 @@ void main() {
});

group('Given runner with onAnalyticsEvent callback defined', () {
final runner = BetterCommandRunner<OptionDefinition<Object>, void>(
final runner = BetterCommandRunner(
'test',
'this is a test cli',
onAnalyticsEvent: (final event) {},
Expand All @@ -95,7 +94,7 @@ void main() {
group('Given runner with analytics enabled', () {
List<String> events = [];
setUp(() {
runner = BetterCommandRunner<OptionDefinition<Object>, void>(
runner = BetterCommandRunner(
'test',
'this is a test cli',
onAnalyticsEvent: (final event) => events.add(event),
Expand Down Expand Up @@ -208,7 +207,7 @@ void main() {
group('Given runner with registered command and analytics enabled', () {
List<String> events = [];
setUp(() {
runner = BetterCommandRunner<OptionDefinition<Object>, void>(
runner = BetterCommandRunner(
'test',
'this is a test cli',
onAnalyticsEvent: (final event) => events.add(event),
Expand Down Expand Up @@ -273,7 +272,7 @@ void main() {
late CompletableMockCommand command;
setUp(() {
command = CompletableMockCommand();
runner = BetterCommandRunner<OptionDefinition<Object>, void>(
runner = BetterCommandRunner(
'test',
'this is a test cli',
onAnalyticsEvent: (final event) => events.add(event),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ enum BespokeGlobalOption<V extends Object> implements OptionDefinition<V> {
final ConfigOptionBase<V> option;
}

class MockCommand extends BetterCommand<OptionDefinition<Object>, void> {
class MockCommand extends BetterCommand {
static String commandName = 'mock-command';

MockCommand({super.messageOutput})
Expand All @@ -38,9 +38,7 @@ class MockCommand extends BetterCommand<OptionDefinition<Object>, void> {
Future<void> run() async {}

@override
FutureOr<void>? runWithConfig(
final Configuration<OptionDefinition<Object>> commandConfig,
) {
FutureOr? runWithConfig(final Configuration<OptionDefinition> commandConfig) {
throw UnimplementedError();
}
}
Expand All @@ -58,7 +56,7 @@ void main() {
final betterCommand = MockCommand(
messageOutput: messageOutput,
);
final runner = BetterCommandRunner<OptionDefinition<Object>, void>(
final runner = BetterCommandRunner(
'test',
'test project',
onAnalyticsEvent: (final e) => analyticsEvents.add(e),
Expand Down Expand Up @@ -99,7 +97,7 @@ void main() {
'then help analytics is sent', () async {
await runner.run(['--help']);

await Future<void>.delayed(const Duration(milliseconds: 100));
await Future.delayed(const Duration(milliseconds: 100));
expect(analyticsEvents, hasLength(1));
expect(analyticsEvents.single, 'help');
});
Expand All @@ -109,7 +107,7 @@ void main() {
'then help analytics is sent', () async {
await runner.run(['help']);

await Future<void>.delayed(const Duration(milliseconds: 100));
await Future.delayed(const Duration(milliseconds: 100));
expect(analyticsEvents, hasLength(1));
expect(analyticsEvents.single, 'help');
});
Expand All @@ -119,7 +117,7 @@ void main() {
'then subcommand analytics is sent', () async {
await runner.run([MockCommand.commandName]);

await Future<void>.delayed(const Duration(milliseconds: 100));
await Future.delayed(const Duration(milliseconds: 100));
expect(analyticsEvents, hasLength(1));
expect(analyticsEvents.single, 'mock-command');
});
Expand All @@ -129,7 +127,7 @@ void main() {
'then invalid command analytics is sent', () async {
await runner.run(['no-such-command']).catchError((final _) {});

await Future<void>.delayed(const Duration(milliseconds: 100));
await Future.delayed(const Duration(milliseconds: 100));
expect(analyticsEvents, hasLength(1));
expect(analyticsEvents.single, 'invalid');
});
Expand All @@ -140,7 +138,7 @@ void main() {
'then subcommand analytics is not sent', () async {
await runner.run([MockCommand.commandName, '--no-analytics']);

await Future<void>.delayed(const Duration(milliseconds: 100));
await Future.delayed(const Duration(milliseconds: 100));
expect(analyticsEvents, isEmpty);
});
});
Expand All @@ -157,7 +155,7 @@ void main() {
final betterCommand = MockCommand(
messageOutput: messageOutput,
);
final runner = BetterCommandRunner<OptionDefinition<Object>, void>(
final runner = BetterCommandRunner(
'test',
'test project',
onAnalyticsEvent: (final e) => analyticsEvents.add(e),
Expand Down Expand Up @@ -207,7 +205,7 @@ void main() {
final betterCommand = MockCommand(
messageOutput: messageOutput,
);
final runner = BetterCommandRunner<OptionDefinition<Object>, void>(
final runner = BetterCommandRunner(
'test',
'test project',
messageOutput: messageOutput,
Expand Down Expand Up @@ -256,7 +254,7 @@ void main() {
final betterCommand = MockCommand(
messageOutput: messageOutput,
);
final runner = BetterCommandRunner<OptionDefinition<Object>, void>(
final runner = BetterCommandRunner(
'test',
'test project',
globalOptions: BespokeGlobalOption.values,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ 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<void> {
Expand Down Expand Up @@ -34,7 +33,7 @@ class MockCommand extends Command<void> {
}

void main() {
late BetterCommandRunner<OptionDefinition<Object>, void> runner;
late BetterCommandRunner runner;
late MockCommand mockCommand;
group('Given runner with registered command', () {
setUp(() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
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<OptionDefinition<Object>, void>(
final runner = BetterCommandRunner(
'test',
'test description',
onAnalyticsEvent: (final event) {},
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
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<void> {
class MockCommand extends Command {
static String commandName = 'mock-command';

@override
Expand All @@ -29,10 +28,8 @@ class MockCommand extends Command<void> {

void main() {
group('Given runner with registered command', () {
final runner = BetterCommandRunner<OptionDefinition<Object>, void>(
'test',
'this is a test cli',
)..addCommand(MockCommand());
final runner = BetterCommandRunner('test', 'this is a test cli')
..addCommand(MockCommand());

test(
'when running with unknown command then UsageException is thrown.',
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
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<void> {
class MockCommand extends Command {
static String commandName = 'mock-command';

@override
Expand Down Expand Up @@ -31,7 +30,7 @@ void main() {
group('Given runner with registered command and logging monitor', () {
final errors = <String>[];
final infos = <String>[];
final runner = BetterCommandRunner<OptionDefinition<Object>, void>(
final runner = BetterCommandRunner(
'test',
'this is a test cli',
messageOutput: MessageOutput(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
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<void> {
class MockCommand extends Command {
static String commandName = 'mock-command';

@override
Expand All @@ -25,7 +24,7 @@ void main() {
logLevel = null;
});
group('Given runner with setLogLevel callback', () {
final runner = BetterCommandRunner<OptionDefinition<Object>, void>(
final runner = BetterCommandRunner(
'test',
'this is a test cli',
messageOutput: const MessageOutput(),
Expand Down Expand Up @@ -93,7 +92,7 @@ void main() {
});

group('Given runner with setLogLevel callback and registered command', () {
final runner = BetterCommandRunner<OptionDefinition<Object>, void>(
final runner = BetterCommandRunner(
'test',
'this is a test cli',
setLogLevel: ({
Expand Down
Loading