Skip to content

Commit

Permalink
feat: improve new update prompt (#206)
Browse files Browse the repository at this point in the history
  • Loading branch information
felangel committed Oct 12, 2021
1 parent 52d7243 commit 4ecfc8a
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 30 deletions.
13 changes: 5 additions & 8 deletions lib/src/command_runner.dart
Original file line number Diff line number Diff line change
Expand Up @@ -111,20 +111,17 @@ class VeryGoodCommandRunner extends CommandRunner<int> {

Future<void> _checkForUpdates() async {
try {
final isUpToDate = await _pubUpdater.isUpToDate(
packageName: packageName,
currentVersion: packageVersion,
);

final latestVersion = await _pubUpdater.getLatestVersion(packageName);
final isUpToDate = packageVersion == latestVersion;
if (!isUpToDate) {
_logger.info(
lightYellow.wrap('A new release of $packageName is available.'),
'''${lightYellow.wrap('A new version of $packageName is available:')} ${lightCyan.wrap(packageVersion)} -> ${lightCyan.wrap(latestVersion)}''',
);
final response = _logger.prompt('Would you like to update? (y/n) ');
if (response.isYes()) {
final done = _logger.progress('Updating');
final done = _logger.progress('Updating to $latestVersion');
await _pubUpdater.update(packageName: packageName);
done('Updated!');
done('Updated to $latestVersion');
}
}
} catch (_) {}
Expand Down
2 changes: 1 addition & 1 deletion pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ dependencies:
mason: ^0.0.1-dev.51
meta: ^1.3.0
path: ^1.8.0
pub_updater: ^0.1.0
pub_updater: ^0.2.0
universal_io: ^2.0.4
usage: ^4.0.2
very_good_analysis: ^2.3.0
Expand Down
34 changes: 13 additions & 21 deletions test/src/command_runner_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@ const expectedUsage = [
const responseBody =
'{"name": "very_good_cli", "versions": ["0.4.0", "0.3.3"]}';

const latestVersion = '9999.0.0';

void main() {
group('VeryGoodCommandRunner', () {
late List<String> printLogs;
Expand All @@ -70,14 +72,9 @@ void main() {

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

when(
() => pubUpdater.isUpToDate(
packageName: any(named: 'packageName'),
currentVersion: any(named: 'currentVersion'),
),
).thenAnswer((_) => Future.value(true));

() => pubUpdater.getLatestVersion(any()),
).thenAnswer((_) async => packageVersion);
when(
() => pubUpdater.update(
packageName: any(named: 'packageName'),
Expand All @@ -101,18 +98,17 @@ void main() {

group('run', () {
test('prompts for update when newer version exists', () async {
when(() => pubUpdater.isUpToDate(
packageName: any(named: 'packageName'),
currentVersion: any(named: 'currentVersion'),
)).thenAnswer((_) => Future.value(false));
when(
() => pubUpdater.getLatestVersion(any()),
).thenAnswer((_) async => latestVersion);

when(() => logger.prompt(any())).thenReturn('n');

final result = await commandRunner.run(['--version']);
expect(result, equals(ExitCode.success.code));
verify(
() => logger.info(
lightYellow.wrap('A new release of $packageName is available.'),
'''${lightYellow.wrap('A new version of $packageName is available:')} ${lightCyan.wrap(packageVersion)} -> ${lightCyan.wrap(latestVersion)}''',
),
).called(1);
verify(
Expand All @@ -122,10 +118,7 @@ void main() {

test('handles pub update errors gracefully', () async {
when(
() => pubUpdater.isUpToDate(
packageName: any(named: 'packageName'),
currentVersion: any(named: 'currentVersion'),
),
() => pubUpdater.getLatestVersion(any()),
).thenThrow(Exception('oops'));

final result = await commandRunner.run(['--version']);
Expand All @@ -138,17 +131,16 @@ void main() {
});

test('updates on "y" response when newer version exists', () async {
when(() => pubUpdater.isUpToDate(
packageName: any(named: 'packageName'),
currentVersion: any(named: 'currentVersion'),
)).thenAnswer((_) => Future.value(false));
when(
() => pubUpdater.getLatestVersion(any()),
).thenAnswer((_) async => latestVersion);

when(() => logger.prompt(any())).thenReturn('y');
when(() => logger.progress(any())).thenReturn(([String? message]) {});

final result = await commandRunner.run(['--version']);
expect(result, equals(ExitCode.success.code));
verify(() => logger.progress('Updating')).called(1);
verify(() => logger.progress('Updating to $latestVersion')).called(1);
});

test('prompts for analytics collection on first run (y)', () async {
Expand Down

0 comments on commit 4ecfc8a

Please sign in to comment.