Skip to content

Commit

Permalink
feat: migrate to null safety (#128)
Browse files Browse the repository at this point in the history
  • Loading branch information
felangel committed May 24, 2021
1 parent 3ea68aa commit 3e76061
Show file tree
Hide file tree
Showing 8 changed files with 1,483 additions and 98 deletions.
11 changes: 5 additions & 6 deletions .github/workflows/very_good_cli.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -19,24 +19,23 @@ on:
jobs:
build:
runs-on: ubuntu-latest
container:
image: google/dart:2.10.0
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v2.3.4
- uses: dart-lang/setup-dart@v1

- name: Install Dependencies
run: pub get
run: dart pub get

- name: Format
run: find . -name "*.dart" ! -path '*/templates/*' | xargs dart format --set-exit-if-changed
run: dart format --set-exit-if-changed .

- name: Analyze
run: |
dart analyze --fatal-infos --fatal-warnings lib
dart analyze --fatal-infos --fatal-warnings test
- name: Verify Build
run: pub run test --run-skipped -t pull-request-only
run: dart test --run-skipped -t pull-request-only

- name: Run Tests
run: dart test -x pull-request-only --coverage=coverage && pub run coverage:format_coverage --lcov --in=coverage --out=coverage/lcov.info --packages=.packages --report-on=lib
Expand Down
2 changes: 1 addition & 1 deletion bin/very_good.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import 'dart:io';
import 'package:universal_io/io.dart';
import 'package:very_good_cli/src/command_runner.dart';

void main(List<String> args) async {
Expand Down
4 changes: 2 additions & 2 deletions lib/src/command_runner.dart
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ const _gaAppName = 'very-good-cli';
/// {@endtemplate}
class VeryGoodCommandRunner extends CommandRunner<int> {
/// {@macro very_good_command_runner}
VeryGoodCommandRunner({Analytics analytics, Logger logger})
VeryGoodCommandRunner({Analytics? analytics, Logger? logger})
: _logger = logger ?? Logger(),
_analytics =
analytics ?? AnalyticsIO(_gaTrackingId, _gaAppName, packageVersion),
Expand Down Expand Up @@ -84,7 +84,7 @@ class VeryGoodCommandRunner extends CommandRunner<int> {
}

@override
Future<int> runCommand(ArgResults topLevelResults) async {
Future<int?> runCommand(ArgResults topLevelResults) async {
if (topLevelResults['version'] == true) {
_logger.info('very_good version: $packageVersion');
return ExitCode.success.code;
Expand Down
16 changes: 7 additions & 9 deletions lib/src/commands/create.dart
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
import 'dart:io';

import 'package:args/args.dart';
import 'package:args/command_runner.dart';
import 'package:io/ansi.dart';
import 'package:io/io.dart';
import 'package:mason/mason.dart';
import 'package:meta/meta.dart';
import 'package:path/path.dart' as path;
import 'package:universal_io/io.dart';
import 'package:usage/usage_io.dart';
import 'package:very_good_analysis/very_good_analysis.dart';
import 'package:very_good_cli/src/command_runner.dart';
Expand All @@ -26,11 +25,10 @@ typedef GeneratorBuilder = Future<MasonGenerator> Function(MasonBundle);
class CreateCommand extends Command<int> {
/// {@macro create_command}
CreateCommand({
@required Analytics analytics,
Logger logger,
GeneratorBuilder generator,
}) : assert(analytics != null),
_analytics = analytics,
required Analytics analytics,
Logger? logger,
GeneratorBuilder? generator,
}) : _analytics = analytics,
_logger = logger ?? Logger(),
_generator = generator ?? MasonGenerator.fromBundle {
argParser.addOption(
Expand Down Expand Up @@ -60,9 +58,9 @@ class CreateCommand extends Command<int> {

/// [ArgResults] which can be overridden for testing.
@visibleForTesting
ArgResults argResultOverrides;
ArgResults? argResultOverrides;

ArgResults get _argResults => argResultOverrides ?? argResults;
ArgResults get _argResults => argResultOverrides ?? argResults!;

@override
Future<int> run() async {
Expand Down
1,384 changes: 1,383 additions & 1 deletion lib/src/templates/very_good_core_bundle.dart

Large diffs are not rendered by default.

29 changes: 15 additions & 14 deletions pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,24 +4,25 @@ version: 0.1.8
homepage: https://github.com/VeryGoodOpenSource/very_good_cli

environment:
sdk: ">=2.10.0 <3.0.0"
sdk: ">=2.12.0 <3.0.0"

dependencies:
args: ^1.6.0
io: ^0.3.4
mason: ^0.0.1-dev.26
meta: ^1.2.4
path: ^1.7.0
usage: ^3.4.2
very_good_analysis: ^1.0.4
args: ^2.1.0
io: ^1.0.0
mason: ^0.0.1-dev.29
meta: ^1.3.0
path: ^1.8.0
universal_io: ^2.0.4
usage: ^4.0.2
very_good_analysis: ^2.0.3

dev_dependencies:
coverage: ^0.13.4
build_runner: ^1.10.0
build_verify: ^1.1.1
build_version: ^2.0.1
mockito: ^4.0.0
test: ^1.14.3
build_runner: ^2.0.0
build_verify: ^2.0.0
build_version: ^2.0.0
coverage: ^1.0.2
mocktail: ^0.1.1
test: ^1.17.0

executables:
very_good:
54 changes: 28 additions & 26 deletions test/src/command_runner_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import 'dart:async';
import 'package:args/command_runner.dart';
import 'package:io/io.dart';
import 'package:mason/mason.dart';
import 'package:mockito/mockito.dart';
import 'package:mocktail/mocktail.dart';
import 'package:test/test.dart';
import 'package:usage/usage_io.dart';
import 'package:very_good_cli/src/command_runner.dart';
Expand Down Expand Up @@ -36,10 +36,10 @@ const expectedUsage = [

void main() {
group('VeryGoodCommandRunner', () {
List<String> printLogs;
Analytics analytics;
Logger logger;
VeryGoodCommandRunner commandRunner;
late List<String> printLogs;
late Analytics analytics;
late Logger logger;
late VeryGoodCommandRunner commandRunner;

void Function() overridePrint(void Function() fn) {
return () {
Expand All @@ -54,8 +54,8 @@ void main() {
printLogs = [];

analytics = MockAnalytics();
when(analytics.firstRun).thenReturn(false);
when(analytics.enabled).thenReturn(false);
when(() => analytics.firstRun).thenReturn(false);
when(() => analytics.enabled).thenReturn(false);

logger = MockLogger();
commandRunner = VeryGoodCommandRunner(
Expand All @@ -72,49 +72,49 @@ void main() {

group('run', () {
test('prompts for analytics collection on first run (y)', () async {
when(analytics.firstRun).thenReturn(true);
when(logger.prompt(any)).thenReturn('y');
when(() => analytics.firstRun).thenReturn(true);
when(() => logger.prompt(any())).thenReturn('y');
final result = await commandRunner.run(['--version']);
expect(result, equals(ExitCode.success.code));
verify(analytics.enabled = true);
verify(() => analytics.enabled = true);
});

test('prompts for analytics collection on first run (n)', () async {
when(analytics.firstRun).thenReturn(true);
when(logger.prompt(any)).thenReturn('n');
when(() => analytics.firstRun).thenReturn(true);
when(() => logger.prompt(any())).thenReturn('n');
final result = await commandRunner.run(['--version']);
expect(result, equals(ExitCode.success.code));
verify(analytics.enabled = false);
verify(() => analytics.enabled = false);
});

test('handles FormatException', () async {
const exception = FormatException('oops!');
var isFirstInvocation = true;
when(logger.info(any)).thenAnswer((_) {
when(() => logger.info(any())).thenAnswer((_) {
if (isFirstInvocation) {
isFirstInvocation = false;
throw exception;
}
});
final result = await commandRunner.run(['--version']);
expect(result, equals(ExitCode.usage.code));
verify(logger.err(exception.message)).called(1);
verify(logger.info(commandRunner.usage)).called(1);
verify(() => logger.err(exception.message)).called(1);
verify(() => logger.info(commandRunner.usage)).called(1);
});

test('handles UsageException', () async {
final exception = UsageException('oops!', commandRunner.usage);
var isFirstInvocation = true;
when(logger.info(any)).thenAnswer((_) {
when(() => logger.info(any())).thenAnswer((_) {
if (isFirstInvocation) {
isFirstInvocation = false;
throw exception;
}
});
final result = await commandRunner.run(['--version']);
expect(result, equals(ExitCode.usage.code));
verify(logger.err(exception.message)).called(1);
verify(logger.info(commandRunner.usage)).called(1);
verify(() => logger.err(exception.message)).called(1);
verify(() => logger.info(commandRunner.usage)).called(1);
});

test('handles no command', overridePrint(() async {
Expand All @@ -141,22 +141,24 @@ void main() {
test('sets analytics.enabled to true', () async {
final result = await commandRunner.run(['--analytics', 'true']);
expect(result, equals(ExitCode.success.code));
verify(analytics.enabled = true);
verify(() => analytics.enabled = true);
});

test('sets analytics.enabled to false', () async {
final result = await commandRunner.run(['--analytics', 'false']);
expect(result, equals(ExitCode.success.code));
verify(analytics.enabled = false);
verify(() => analytics.enabled = false);
});

test('does not accept erroneous input', () async {
final result = await commandRunner.run(['--analytics', 'garbage']);
expect(result, equals(ExitCode.usage.code));
verifyNever(analytics.enabled);
verify(logger.err(
'"garbage" is not an allowed value for option "analytics".',
)).called(1);
verifyNever(() => analytics.enabled);
verify(
() => logger.err(
'"garbage" is not an allowed value for option "analytics".',
),
).called(1);
});

test('exits with bad usage when missing value', () async {
Expand All @@ -169,7 +171,7 @@ void main() {
test('outputs current version', () async {
final result = await commandRunner.run(['--version']);
expect(result, equals(ExitCode.success.code));
verify(logger.info('very_good version: $packageVersion'));
verify(() => logger.info('very_good version: $packageVersion'));
});
});
});
Expand Down
Loading

0 comments on commit 3e76061

Please sign in to comment.