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');