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
47 changes: 19 additions & 28 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
3 changes: 2 additions & 1 deletion .github/workflows/publish-cli_tools.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
3 changes: 2 additions & 1 deletion .github/workflows/publish-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
7 changes: 0 additions & 7 deletions packages/cli_tools/analysis_options.yaml
Original file line number Diff line number Diff line change
@@ -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
4 changes: 2 additions & 2 deletions 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(
final commandRunner = BetterCommandRunner<OptionDefinition<Object>, void>(
'example',
'Example CLI command',
globalOptions: [
Expand Down Expand Up @@ -47,7 +47,7 @@ Future<int> main(final List<String> args) async {
///
/// The enum approach is more distinct and type safe.
/// The list approach is more dynamic and permits non-const initialization.
enum TimeSeriesOption<V> implements OptionDefinition<V> {
enum TimeSeriesOption<V extends Object> implements OptionDefinition<V> {
until(DateTimeOption(
argName: 'until',
envName: 'SERIES_UNTIL', // can also be specified as environment variable
Expand Down
4 changes: 2 additions & 2 deletions 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(
final commandRunner = BetterCommandRunner<OptionDefinition<Object>, void>(
'example',
'Example CLI command',
);
Expand All @@ -29,7 +29,7 @@ Future<int> main(final List<String> args) async {
return 0;
}

enum ShowOption<V> implements OptionDefinition<V> {
enum ShowOption<V extends Object> implements OptionDefinition<V> {
interval(DurationOption(
argName: 'interval',
argAbbrev: 'i',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<void> Function(BetterCommandRunner runner);
typedef OnBeforeRunCommand<O extends OptionDefinition<Object>, T> = Future<void>
Function(BetterCommandRunner<O, T> runner);

/// A proxy for user-provided functions for passing specific log messages.
///
Expand Down Expand Up @@ -54,15 +55,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, T>
class BetterCommandRunner<O extends OptionDefinition<Object>, 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? _onBeforeRunCommand;
final OnBeforeRunCommand<O, T>? _onBeforeRunCommand;
OnAnalyticsEvent? _onAnalyticsEvent;

/// The environment variables used for configuration resolution.
Expand Down Expand Up @@ -143,7 +144,7 @@ class BetterCommandRunner<O extends OptionDefinition, T>
final MessageOutput? messageOutput =
const MessageOutput(usageLogger: print),
final SetLogLevel? setLogLevel,
final OnBeforeRunCommand? onBeforeRunCommand,
final OnBeforeRunCommand<O, T>? onBeforeRunCommand,
final OnAnalyticsEvent? onAnalyticsEvent,
final int? wrapTextColumn,
final List<O>? globalOptions,
Expand Down Expand Up @@ -360,7 +361,7 @@ abstract class BetterCommandRunnerFlags {
);
}

enum StandardGlobalOption<V> implements OptionDefinition<V> {
enum StandardGlobalOption<V extends Object> implements OptionDefinition<V> {
quiet(BetterCommandRunnerFlags.quietOption),
verbose(BetterCommandRunnerFlags.verboseOption),
analytics(BetterCommandRunnerFlags.analyticsOption);
Expand Down
Original file line number Diff line number Diff line change
@@ -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<OptionDefinition<Object>, void> commandRunner;

CommandDocumentationGenerator(this.commandRunner);

Expand Down
6 changes: 3 additions & 3 deletions packages/cli_tools/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Original file line number Diff line number Diff line change
Expand Up @@ -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<void> {
static String commandName = 'mock-command';

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

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

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

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

group('Given runner with onAnalyticsEvent callback defined', () {
final runner = BetterCommandRunner(
final runner = BetterCommandRunner<OptionDefinition<Object>, void>(
'test',
'this is a test cli',
onAnalyticsEvent: (final event) {},
Expand All @@ -94,7 +95,7 @@ void main() {
group('Given runner with analytics enabled', () {
List<String> events = [];
setUp(() {
runner = BetterCommandRunner(
runner = BetterCommandRunner<OptionDefinition<Object>, void>(
'test',
'this is a test cli',
onAnalyticsEvent: (final event) => events.add(event),
Expand Down Expand Up @@ -207,7 +208,7 @@ void main() {
group('Given runner with registered command and analytics enabled', () {
List<String> events = [];
setUp(() {
runner = BetterCommandRunner(
runner = BetterCommandRunner<OptionDefinition<Object>, void>(
'test',
'this is a test cli',
onAnalyticsEvent: (final event) => events.add(event),
Expand Down Expand Up @@ -272,7 +273,7 @@ void main() {
late CompletableMockCommand command;
setUp(() {
command = CompletableMockCommand();
runner = BetterCommandRunner(
runner = BetterCommandRunner<OptionDefinition<Object>, void>(
'test',
'this is a test cli',
onAnalyticsEvent: (final event) => events.add(event),
Expand Down
Loading