Migrate Hosted and Sdk dependency to use generated fromJson Handle HostedDependency with explicit version field
diff --git a/pkgs/pubspec_parse/lib/src/dependency.dart b/pkgs/pubspec_parse/lib/src/dependency.dart index 5260239..8488fe1 100644 --- a/pkgs/pubspec_parse/lib/src/dependency.dart +++ b/pkgs/pubspec_parse/lib/src/dependency.dart
@@ -22,11 +22,14 @@ /// Returns `null` if the data could not be parsed. Dependency _fromJson(dynamic data) { - if (data == null) { - return new HostedDependency(VersionConstraint.any); - } else if (data is String) { - return new HostedDependency(new VersionConstraint.parse(data)); - } else if (data is Map) { + var value = + SdkDependency.tryFromData(data) ?? HostedDependency.tryFromData(data); + + if (value != null) { + return value; + } + + if (data is Map) { try { return _fromMap(data); } on ArgumentError catch (e) { @@ -45,10 +48,6 @@ data, null, 'Dependency', 'Must provide at least one key.'); } - if (data.containsKey('sdk')) { - return new SdkDependency.fromData(data); - } - if (data.entries.length > 1) { throw new CheckedFromJsonException(data, data.keys.skip(1).first as String, 'Dependency', 'Expected only one key.'); @@ -81,22 +80,23 @@ String toString() => '$runtimeType: $_info'; } +@JsonSerializable(createToJson: false) class SdkDependency extends Dependency { - final String name; + final String sdk; + @JsonKey(fromJson: _constraintFromString) final VersionConstraint version; - SdkDependency(this.name, {this.version}) : super._(); + SdkDependency(this.sdk, {this.version}) : super._(); - factory SdkDependency.fromData(Map data) { - VersionConstraint version; - if (data.containsKey('version')) { - version = new VersionConstraint.parse(data['version'] as String); + static SdkDependency tryFromData(Object data) { + if (data is Map && data.containsKey('sdk')) { + return _$SdkDependencyFromJson(data); } - return new SdkDependency(data['sdk'] as String, version: version); + return null; } @override - String get _info => name; + String get _info => sdk; } @JsonSerializable(createToJson: false) @@ -152,12 +152,32 @@ String get _info => 'path@$path'; } -// TODO: support explicit host? +@JsonSerializable(createToJson: false) class HostedDependency extends Dependency { - final VersionConstraint constraint; + // TODO: support explicit host - HostedDependency(this.constraint) : super._(); + @JsonKey(fromJson: _constraintFromString) + final VersionConstraint version; + + HostedDependency({VersionConstraint version}) + : this.version = version ?? VersionConstraint.any, + super._(); + + static HostedDependency tryFromData(Object data) { + if (data == null || data is String) { + data = {'version': data}; + } + + if (data is Map && data.containsKey('version')) { + return _$HostedDependencyFromJson(data); + } + + return null; + } @override - String get _info => constraint.toString(); + String get _info => version.toString(); } + +VersionConstraint _constraintFromString(String input) => + new VersionConstraint.parse(input);
diff --git a/pkgs/pubspec_parse/lib/src/dependency.g.dart b/pkgs/pubspec_parse/lib/src/dependency.g.dart index cdb06bb..7a7d427 100644 --- a/pkgs/pubspec_parse/lib/src/dependency.g.dart +++ b/pkgs/pubspec_parse/lib/src/dependency.g.dart
@@ -10,6 +10,13 @@ // Generator: JsonSerializableGenerator // ************************************************************************** +SdkDependency _$SdkDependencyFromJson(Map json) => $checkedNew( + 'SdkDependency', + json, + () => new SdkDependency($checkedConvert(json, 'sdk', (v) => v as String), + version: $checkedConvert(json, 'version', + (v) => v == null ? null : _constraintFromString(v as String)))); + GitDependency _$GitDependencyFromJson(Map json) => $checkedNew( 'GitDependency', json, @@ -18,3 +25,10 @@ json, 'url', (v) => v == null ? null : _parseUri(v as String)), $checkedConvert(json, 'ref', (v) => v as String), $checkedConvert(json, 'path', (v) => v as String))); + +HostedDependency _$HostedDependencyFromJson(Map json) => $checkedNew( + 'HostedDependency', + json, + () => new HostedDependency( + version: $checkedConvert(json, 'version', + (v) => v == null ? null : _constraintFromString(v as String))));
diff --git a/pkgs/pubspec_parse/lib/src/pubspec.dart b/pkgs/pubspec_parse/lib/src/pubspec.dart index 3c9c045..163f3f9 100644 --- a/pkgs/pubspec_parse/lib/src/pubspec.dart +++ b/pkgs/pubspec_parse/lib/src/pubspec.dart
@@ -12,6 +12,9 @@ @JsonSerializable(createToJson: false) class Pubspec { + // TODO: executables + // TODO: publish_to + final String name; @JsonKey(fromJson: _versionFromString)
diff --git a/pkgs/pubspec_parse/test/dependency_test.dart b/pkgs/pubspec_parse/test/dependency_test.dart index 8ede482..5c86721 100644 --- a/pkgs/pubspec_parse/test/dependency_test.dart +++ b/pkgs/pubspec_parse/test/dependency_test.dart
@@ -8,15 +8,27 @@ import 'test_utils.dart'; void main() { - test('HostedDepedency', () { + test('HostedDepedency - null', () { + var dep = _dependency<HostedDependency>(null); + expect(dep.version.toString(), 'any'); + expect(dep.toString(), 'HostedDependency: any'); + }); + + test('HostedDepedency - string', () { var dep = _dependency<HostedDependency>('^1.0.0'); - expect(dep.constraint.toString(), '^1.0.0'); + expect(dep.version.toString(), '^1.0.0'); + expect(dep.toString(), 'HostedDependency: ^1.0.0'); + }); + + test('HostedDepedency - map', () { + var dep = _dependency<HostedDependency>({'version': '^1.0.0'}); + expect(dep.version.toString(), '^1.0.0'); expect(dep.toString(), 'HostedDependency: ^1.0.0'); }); test('SdkDependency without version', () { var dep = _dependency<SdkDependency>({'sdk': 'flutter'}); - expect(dep.name, 'flutter'); + expect(dep.sdk, 'flutter'); expect(dep.version, isNull); expect(dep.toString(), 'SdkDependency: flutter'); }); @@ -24,7 +36,7 @@ test('SdkDependency with version', () { var dep = _dependency<SdkDependency>( {'sdk': 'flutter', 'version': '>=1.2.3 <2.0.0'}); - expect(dep.name, 'flutter'); + expect(dep.sdk, 'flutter'); expect(dep.version.toString(), '>=1.2.3 <2.0.0'); expect(dep.toString(), 'SdkDependency: flutter'); }); @@ -47,12 +59,6 @@ expect(dep.toString(), 'GitDependency: url@url'); }); - test('HostedDepedency', () { - var dep = _dependency<HostedDependency>('^1.0.0'); - expect(dep.constraint.toString(), '^1.0.0'); - expect(dep.toString(), 'HostedDependency: ^1.0.0'); - }); - test('PathDependency', () { var dep = _dependency<PathDependency>({'path': '../path'}); expect(dep.path, '../path');