Skip to content

Commit

Permalink
Upgrade message
Browse files Browse the repository at this point in the history
  • Loading branch information
leoafarias committed Jul 17, 2020
1 parent 28622fa commit 465af7b
Show file tree
Hide file tree
Showing 8 changed files with 109 additions and 21 deletions.
4 changes: 2 additions & 2 deletions lib/commands/install.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import 'package:fvm/exceptions.dart';
import 'package:fvm/utils/guards.dart';
import 'package:fvm/utils/helpers.dart';
import 'package:fvm/utils/project_config.dart';
import 'package:fvm/utils/version_installer.dart';
import 'package:fvm/utils/release_installer.dart';

/// Installs Flutter SDK
class InstallCommand extends Command {
Expand Down Expand Up @@ -46,7 +46,7 @@ class InstallCommand extends Command {

final flutterVersion = await inferFlutterVersion(version);

await installFlutterVersion(flutterVersion, skipSetup: skipSetup);
await installFlutterRelease(flutterVersion, skipSetup: skipSetup);
if (hasConfig) {
setAsProjectVersion(version);
}
Expand Down
3 changes: 3 additions & 0 deletions lib/commands/use.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import 'package:fvm/utils/flutter_tools.dart';
import 'package:fvm/utils/guards.dart';
import 'package:fvm/utils/helpers.dart';
import 'package:fvm/utils/project_config.dart';
import 'package:fvm/utils/pubdev.dart';

/// Use an installed SDK version
class UseCommand extends Command {
Expand Down Expand Up @@ -55,5 +56,7 @@ class UseCommand extends Command {
// Updates the project config with version
setAsProjectVersion(flutterVersion);
}

await checkIfLatestVersion();
}
}
4 changes: 2 additions & 2 deletions lib/utils/helpers.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import 'package:fvm/utils/confirm.dart';
import 'package:fvm/utils/print.dart';
import 'package:fvm/utils/project_config.dart';
import 'package:fvm/utils/releases_helper.dart';
import 'package:fvm/utils/version_installer.dart';
import 'package:fvm/utils/release_installer.dart';
import 'package:path/path.dart' as path;
import 'package:fvm/utils/flutter_tools.dart';

Expand Down Expand Up @@ -51,7 +51,7 @@ Future<void> checkAndInstallVersion(String version) async {

// Install if input is confirmed
if (await confirm('Would you like to install it?')) {
await installFlutterVersion(version);
await installFlutterRelease(version);
} else {
// If do not install exist
exit(0);
Expand Down
75 changes: 75 additions & 0 deletions lib/utils/pubdev.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
import 'dart:convert';
import 'package:fvm/src/version.dart';
import 'package:http/http.dart' as http;
import 'package:io/ansi.dart';
import 'package:version/version.dart';

PubPackage pubPackageFromMap(String str) =>
PubPackage.fromMap(json.decode(str) as Map<String, dynamic>);

String pubPackageToMap(PubPackage data) => json.encode(data.toMap());

/// Pub.dev FVM info
const kPubDevUrl = 'https://pub.dev/packages/fvm.json';

class PubPackage {
PubPackage({
this.name,
this.uploaders,
this.versions,
});

final String name;
final List<String> uploaders;
final List<String> versions;

factory PubPackage.fromMap(Map<String, dynamic> json) {
// final uploaders = json['uploaders'] as List<String>;
return PubPackage(
name: json['name'] as String,
uploaders: List<String>.from(json['uploaders'] as List<dynamic>),
versions: List<String>.from(json['versions'] as List<dynamic>),
);
}

Map<String, dynamic> toMap() => {
'name': name,
'uploaders': List<dynamic>.from(uploaders.map((x) => x)),
'versions': List<dynamic>.from(versions.map((x) => x)),
};
}

Future<PubPackage> _fetchPubPackageInfo() async {
final response = await http.get(kPubDevUrl);
return pubPackageFromMap(response.body);
}

Future<bool> checkIfLatestVersion({String currentVersion}) async {
try {
// option to pass currentVersion for testing
currentVersion ??= packageVersion;
final pubPackage = await _fetchPubPackageInfo();

final latestVersion = pubPackage.versions.last;

if (Version.parse(currentVersion) < Version.parse(latestVersion)) {
final updateCmd = cyan.wrap('(flutter) pub global activate fvm');

print(divider);
print(
'FVM Update Available $packageVersion → ${green.wrap(latestVersion)} ');
print('Run $updateCmd to update');
print(divider);
return false;
}
return true;
} on Exception {
// Don't do anything fail silently
return true;
}
}

String get divider {
return yellow
.wrap('\n___________________________________________________\n\n');
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import 'package:fvm/utils/flutter_tools.dart';
import 'package:fvm/utils/helpers.dart';
import 'package:fvm/utils/print.dart';

Future<void> installFlutterVersion(String version,
Future<void> installFlutterRelease(String version,
{bool skipSetup = false}) async {
if (version == null) {
throw ExceptionMissingChannelVersion();
Expand Down
30 changes: 15 additions & 15 deletions lib/utils/releases_helper.dart
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ Future<Releases> getReleases() async {
}

// Returns Version based on semver
Future<Version> getVersion(String version) async {
Future<Release> getVersion(String version) async {
final releases = await getReleases();
return releases.getVersion(version);
}
Expand Down Expand Up @@ -59,21 +59,21 @@ class Releases {

final String baseUrl;
final Channels channels;
final List<Version> versions;
final List<Release> versions;

factory Releases.fromMap(Map<String, dynamic> json) {
final currentRelease = parseCurrentReleases(json);
return Releases(
baseUrl: json['base_url'] as String,
channels: Channels.fromMap(currentRelease),
versions: List<Version>.from(json['releases']
.map((x) => Version.fromMap(x as Map<String, dynamic>))
versions: List<Release>.from(json['releases']
.map((x) => Release.fromMap(x as Map<String, dynamic>))
as Iterable<dynamic>),
);
}

/// Retrieves version information
Version getVersion(String version) {
Release getVersion(String version) {
return versions.firstWhere((v) => v.version == version);
}

Expand Down Expand Up @@ -101,17 +101,17 @@ class Channels {
this.stable,
});

final Version beta;
final Version dev;
final Version stable;
final Release beta;
final Release dev;
final Release stable;

factory Channels.fromMap(Map<String, dynamic> json) => Channels(
beta: Version.fromMap(json['beta'] as Map<String, dynamic>),
dev: Version.fromMap(json['dev'] as Map<String, dynamic>),
stable: Version.fromMap(json['stable'] as Map<String, dynamic>),
beta: Release.fromMap(json['beta'] as Map<String, dynamic>),
dev: Release.fromMap(json['dev'] as Map<String, dynamic>),
stable: Release.fromMap(json['stable'] as Map<String, dynamic>),
);

Version operator [](String key) {
Release operator [](String key) {
if (key == 'beta') return beta;
if (key == 'dev') return dev;
if (key == 'stable') return stable;
Expand All @@ -131,8 +131,8 @@ class Channels {
};
}

class Version {
Version({
class Release {
Release({
this.hash,
this.channel,
this.version,
Expand All @@ -148,7 +148,7 @@ class Version {
final String archive;
final String sha256;

factory Version.fromMap(Map<String, dynamic> json) => Version(
factory Release.fromMap(Map<String, dynamic> json) => Release(
hash: json['hash'] as String,
channel: channelValues.map[json['channel']],
version: json['version'] as String,
Expand Down
3 changes: 2 additions & 1 deletion pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name: fvm
description: A simple cli to manage Flutter SDK versions per project. Support channels, releases, and local cache for fast switching between versions.
version: 1.1.0
version: 1.1.1
homepage: https://github.com/leoafarias/fvm

environment:
Expand All @@ -18,6 +18,7 @@ dependencies:
process_run: ^0.10.10+1
http: ^0.12.1
date_format: ^1.0.8
version: ^1.2.0

dev_dependencies:
pedantic: ^1.8.0
Expand Down
9 changes: 9 additions & 0 deletions test/utils/helpers_test.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import 'package:fvm/utils/pubdev.dart';
import 'package:test/test.dart';
import 'package:fvm/utils/helpers.dart';

Expand All @@ -22,4 +23,12 @@ void main() {
expect(inferFlutterVersion('1.8.0.2'), throwsA(anything));
expect(inferFlutterVersion('v1.17.0-dev.3.1'), throwsA(anything));
});

test('Check if FVM latest version', () async {
var isLatest = await checkIfLatestVersion(currentVersion: '1.0.0');
expect(isLatest, false);

isLatest = await checkIfLatestVersion(currentVersion: '5.0.0');
expect(isLatest, true);
});
}

0 comments on commit 465af7b

Please sign in to comment.