Index: sdk/lib/_internal/pub/test/test_pub.dart |
diff --git a/sdk/lib/_internal/pub/test/test_pub.dart b/sdk/lib/_internal/pub/test/test_pub.dart |
index 1a784e73c3145e403f02a65d5d041bda847c10f6..0414397d39f0d2a18c0d8ce320fe97b0b929fb69 100644 |
--- a/sdk/lib/_internal/pub/test/test_pub.dart |
+++ b/sdk/lib/_internal/pub/test/test_pub.dart |
@@ -147,16 +147,26 @@ Future _closeServer() { |
return sleep(10); |
} |
-/// The [d.DirectoryDescriptor] describing the server layout of packages that |
-/// are being served via [servePackages]. This is `null` if [servePackages] has |
-/// not yet been called for this test. |
+/// The [d.DirectoryDescriptor] describing the server layout of `/api/packages` |
+/// on the test server. |
+/// |
+/// This contains metadata for packages that are being served via |
+/// [servePackages]. It's `null` if [servePackages] has not yet been called for |
+/// this test. |
+d.DirectoryDescriptor _servedApiPackageDir; |
+ |
+/// The [d.DirectoryDescriptor] describing the server layout of `/packages` on |
+/// the test server. |
+/// |
+/// This contains the tarballs for packages that are being served via |
+/// [servePackages]. It's `null` if [servePackages] has not yet been called for |
+/// this test. |
d.DirectoryDescriptor _servedPackageDir; |
-/// A map from package names to version numbers to YAML-serialized pubspecs for |
-/// those packages. This represents the packages currently being served by |
-/// [servePackages], and is `null` if [servePackages] has not yet been called |
-/// for this test. |
-Map<String, Map<String, String>> _servedPackages; |
+/// A map from package names to parsed pubspec maps for those packages. This |
+/// represents the packages currently being served by [servePackages], and is |
+/// `null` if [servePackages] has not yet been called for this test. |
+Map<String, List<Map>> _servedPackages; |
/// Creates an HTTP server that replicates the structure of pub.dartlang.org. |
/// [pubspecs] is a list of unserialized pubspecs representing the packages to |
@@ -166,12 +176,17 @@ Map<String, Map<String, String>> _servedPackages; |
/// are being served. Previous packages will continue to be served. |
void servePackages(List<Map> pubspecs) { |
if (_servedPackages == null || _servedPackageDir == null) { |
- _servedPackages = <String, Map<String, String>>{}; |
+ _servedPackages = <String, List<Map>>{}; |
+ _servedApiPackageDir = d.dir('packages', []); |
_servedPackageDir = d.dir('packages', []); |
- serve([_servedPackageDir]); |
+ serve([ |
+ d.dir('api', [_servedApiPackageDir]), |
+ _servedPackageDir |
+ ]); |
currentSchedule.onComplete.schedule(() { |
_servedPackages = null; |
+ _servedApiPackageDir = null; |
_servedPackageDir = null; |
}, 'cleaning up served packages'); |
} |
@@ -181,28 +196,36 @@ void servePackages(List<Map> pubspecs) { |
for (var spec in resolvedPubspecs) { |
var name = spec['name']; |
var version = spec['version']; |
- var versions = _servedPackages.putIfAbsent( |
- name, () => <String, String>{}); |
- versions[version] = yaml(spec); |
+ var versions = _servedPackages.putIfAbsent(name, () => []); |
+ versions.add(spec); |
} |
+ _servedApiPackageDir.contents.clear(); |
_servedPackageDir.contents.clear(); |
for (var name in _servedPackages.keys) { |
- var versions = _servedPackages[name].keys.toList(); |
- _servedPackageDir.contents.addAll([ |
- d.file('$name.json', json.stringify({'versions': versions})), |
+ _servedApiPackageDir.contents.addAll([ |
+ d.file('$name', json.stringify({ |
+ 'name': name, |
+ 'uploaders': ['nweiz@google.com'], |
+ 'versions': _servedPackages[name].map(packageVersionApiMap).toList() |
+ })), |
d.dir(name, [ |
- d.dir('versions', flatten(versions.map((version) { |
- return [ |
- d.file('$version.yaml', _servedPackages[name][version]), |
- d.tar('$version.tar.gz', [ |
- d.file('pubspec.yaml', _servedPackages[name][version]), |
- d.libDir(name, '$name $version') |
- ]) |
- ]; |
- }))) |
+ d.dir('versions', _servedPackages[name].map((pubspec) { |
+ return d.file(pubspec['version'], json.stringify( |
+ packageVersionApiMap(pubspec, full: true))); |
+ })) |
]) |
]); |
+ |
+ _servedPackageDir.contents.add(d.dir(name, [ |
+ d.dir('versions', _servedPackages[name].map((pubspec) { |
+ var version = pubspec['version']; |
+ return d.tar('$version.tar.gz', [ |
+ d.file('pubspec.yaml', json.stringify(pubspec)), |
+ d.libDir(name, '$name $version') |
+ ]); |
+ })) |
+ ])); |
} |
}); |
}, 'initializing the package server'); |
@@ -632,6 +655,37 @@ String _packageName(String sourceName, description) { |
} |
} |
+/// Returns a Map in the format used by the pub.dartlang.org API to represent a |
+/// package version. |
+/// |
+/// [pubspec] is the parsed pubspec of the package version. If [full] is true, |
+/// this returns the complete map, including metadata that's only included when |
+/// requesting the package version directly. |
+Map packageVersionApiMap(Map pubspec, {bool full: false}) { |
+ var name = pubspec['name']; |
+ var version = pubspec['version']; |
+ var map = { |
+ 'pubspec': pubspec, |
+ 'version': version, |
+ 'url': '/api/packages/$name/versions/$version', |
+ 'archive_url': '/packages/$name/versions/$version.tar.gz', |
+ 'new_dartdoc_url': '/api/packages/$name/versions/$version' |
+ '/new_dartdoc', |
+ 'package_url': '/api/packages/$name' |
+ }; |
+ |
+ if (full) { |
+ mapAddAll(map, { |
+ 'downloads': 0, |
+ 'created': '2012-09-25T18:38:28.685260', |
+ 'libraries': ['$name.dart'], |
+ 'uploader': ['nweiz@google.com'] |
+ }); |
+ } |
+ |
+ return map; |
+} |
+ |
/// Compares the [actual] output from running pub with [expected]. For [String] |
/// patterns, ignores leading and trailing whitespace differences and tries to |
/// report the offending difference in a nice way. For other [Pattern]s, just |