Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Tojson pubspec parser #2011

Open
wants to merge 4 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions pkgs/pubspec_parse/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
## 1.5.1
Dhruv-Maradiya marked this conversation as resolved.
Show resolved Hide resolved

- Added `toJson` method to `Pubspec` to serialize the object back to a `Map`.

## 1.5.0

- Added fields to `Pubspec`: `executables`, `resolution`, `workspace`.
Expand Down
36 changes: 35 additions & 1 deletion pkgs/pubspec_parse/lib/src/dependency.dart
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,9 @@ Dependency? _fromJson(Object? data, String name) {
return null;
}

sealed class Dependency {}
sealed class Dependency {
Map<String, dynamic> toJson();
}

@JsonSerializable()
class SdkDependency extends Dependency {
Expand All @@ -110,6 +112,12 @@ class SdkDependency extends Dependency {

@override
String toString() => 'SdkDependency: $sdk';

@override
Map<String, dynamic> toJson() => {
'sdk': sdk,
'version': version.toString(),
};
}

@JsonSerializable()
Expand Down Expand Up @@ -145,6 +153,15 @@ class GitDependency extends Dependency {

@override
String toString() => 'GitDependency: url@$url';

@override
Map<String, dynamic> toJson() => {
'git': {
'url': url.toString(),
if (ref != null) 'ref': ref,
if (path != null) 'path': path,
},
};
}

Uri? parseGitUriOrNull(String? value) =>
Expand Down Expand Up @@ -204,6 +221,9 @@ class PathDependency extends Dependency {

@override
String toString() => 'PathDependency: path@$path';

@override
Map<String, dynamic> toJson() => {'path': path};
}

@JsonSerializable(disallowUnrecognizedKeys: true)
Expand All @@ -228,6 +248,12 @@ class HostedDependency extends Dependency {

@override
String toString() => 'HostedDependency: $version';

@override
Map<String, dynamic> toJson() => {
'version': version.toString(),
if (hosted != null) 'hosted': hosted!.toJson(),
};
}

@JsonSerializable(disallowUnrecognizedKeys: true)
Expand Down Expand Up @@ -271,7 +297,15 @@ class HostedDetails {

@override
int get hashCode => Object.hash(name, url);

Map<String, dynamic> toJson() => {
if (declaredName != null) 'name': declaredName,
'url': url.toString(),
};
}

VersionConstraint _constraintFromString(String? input) =>
input == null ? VersionConstraint.any : VersionConstraint.parse(input);

Map<String, dynamic> serializeDeps(Map<String, Dependency> input) =>
input.map((k, v) => MapEntry(k, v.toJson()));
31 changes: 23 additions & 8 deletions pkgs/pubspec_parse/lib/src/pubspec.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,13 @@ import 'screenshot.dart';

part 'pubspec.g.dart';

@JsonSerializable()
@JsonSerializable(createToJson: true)
class Pubspec {
// TODO: executables

final String name;

@JsonKey(fromJson: _versionFromString)
@JsonKey(fromJson: _versionFromString, toJson: _versionToString)
final Version? version;

final String? description;
Expand Down Expand Up @@ -51,7 +51,7 @@ class Pubspec {
final List<String>? ignoredAdvisories;

/// Optional field for specifying included screenshot files.
@JsonKey(fromJson: parseScreenshots)
@JsonKey(fromJson: parseScreenshots, toJson: serializeScreenshots)
final List<Screenshot>? screenshots;

/// If there is exactly 1 value in [authors], returns it.
Expand All @@ -73,16 +73,16 @@ class Pubspec {
final List<String> authors;
final String? documentation;

@JsonKey(fromJson: _environmentMap)
@JsonKey(fromJson: _environmentMap, toJson: _serializeEnvironment)
final Map<String, VersionConstraint?> environment;

@JsonKey(fromJson: parseDeps)
@JsonKey(fromJson: parseDeps, toJson: serializeDeps)
final Map<String, Dependency> dependencies;

@JsonKey(fromJson: parseDeps)
@JsonKey(fromJson: parseDeps, toJson: serializeDeps)
final Map<String, Dependency> devDependencies;

@JsonKey(fromJson: parseDeps)
@JsonKey(fromJson: parseDeps, toJson: serializeDeps)
final Map<String, Dependency> dependencyOverrides;

/// Optional configuration specific to [Flutter](https://flutter.io/)
Expand All @@ -94,7 +94,7 @@ class Pubspec {
final Map<String, dynamic>? flutter;

/// Optional field to specify executables
@JsonKey(fromJson: _executablesMap)
@JsonKey(fromJson: _executablesMap, toJson: _serializeExecutables)
final Map<String, String?> executables;

/// If this package is a Pub Workspace, this field lists the sub-packages.
Expand Down Expand Up @@ -177,6 +177,9 @@ class Pubspec {
return _$PubspecFromJson(json);
}

// Returns a JSON-serializable map for this instance.
Map<String, dynamic> toJson() => _$PubspecToJson(this);

/// Parses source [yaml] into [Pubspec].
///
/// When [lenient] is set, top-level property-parsing or type cast errors are
Expand Down Expand Up @@ -256,3 +259,15 @@ Map<String, String?> _executablesMap(Map? source) =>
}
}) ??
{};

Map<String, String?> _serializeEnvironment(
Map<String, VersionConstraint?> map,
) =>
map.map(
(key, value) => MapEntry(key, value?.toString()),
);

String? _versionToString(Version? version) => version?.toString();

Map<String, String?> _serializeExecutables(Map<String, String?>? map) =>
map?.map(MapEntry.new) ?? {};
25 changes: 25 additions & 0 deletions pkgs/pubspec_parse/lib/src/pubspec.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions pkgs/pubspec_parse/lib/src/screenshot.dart
Original file line number Diff line number Diff line change
Expand Up @@ -63,3 +63,11 @@ List<Screenshot> parseScreenshots(List? input) {
}
return res;
}

List<Map<String, String>> serializeScreenshots(List<Screenshot>? input) =>
input
?.map(
(e) => <String, String>{'description': e.description, 'path': e.path},
)
.toList() ??
[];
2 changes: 1 addition & 1 deletion pkgs/pubspec_parse/pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
name: pubspec_parse
version: 1.5.0
version: 1.5.1
description: >-
Simple package for parsing pubspec.yaml files with a type-safe API and rich
error reporting.
Expand Down
Loading