Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1198)

Side by Side Diff: app/lib/handlers.dart

Issue 2074933004: Add support for showing latest dev/stable versions (Closed) Base URL: git@github.com:dart-lang/pub-dartlang-dart.git@master
Patch Set: Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | app/lib/package_memcache.dart » ('j') | app/views/pkg/show.mustache » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library pub_dartlang_org.handlers; 5 library pub_dartlang_org.handlers;
6 6
7 import 'dart:async'; 7 import 'dart:async';
8 import 'dart:math'; 8 import 'dart:math';
9 import 'dart:convert'; 9 import 'dart:convert';
10 10
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after
221 if (responseAsJson) { 221 if (responseAsJson) {
222 return packageShowHandlerJson(request, Uri.decodeComponent(path)); 222 return packageShowHandlerJson(request, Uri.decodeComponent(path));
223 } else { 223 } else {
224 return packageShowHandlerHtml(request, Uri.decodeComponent(path)); 224 return packageShowHandlerHtml(request, Uri.decodeComponent(path));
225 } 225 }
226 } 226 }
227 227
228 var package = Uri.decodeComponent(path.substring(0, slash)); 228 var package = Uri.decodeComponent(path.substring(0, slash));
229 if (path.substring(slash).startsWith('/versions')) { 229 if (path.substring(slash).startsWith('/versions')) {
230 path = path.substring(slash + '/versions'.length); 230 path = path.substring(slash + '/versions'.length);
231 if (path.startsWith('/') && path.endsWith('.yaml')) { 231 if (path.startsWith('/')) {
232 path = path.substring(1, path.length - '.yaml'.length); 232 if (path.endsWith('.yaml')) {
233 String version = Uri.decodeComponent(path); 233 path = path.substring(1, path.length - '.yaml'.length);
234 return packageVersionHandlerYaml(request, package, version); 234 String version = Uri.decodeComponent(path);
235 return packageVersionHandlerYaml(request, package, version);
236 } else {
237 path = path.substring(1);
238 String version = Uri.decodeComponent(path);
239 return packageVersionHandlerHtml(request, package, version);
240 }
235 } else { 241 } else {
236 return packageVersionsHandler(request, package); 242 return packageVersionsHandler(request, package);
237 } 243 }
238 } 244 }
239 return _notFoundHandler(request); 245 return _notFoundHandler(request);
240 } 246 }
241 247
242 /// Handles requests for /packages/<package> - JSON 248 /// Handles requests for /packages/<package> - JSON
243 packageShowHandlerJson(shelf.Request request, String packageName) async { 249 packageShowHandlerJson(shelf.Request request, String packageName) async {
244 Package package = await backend.lookupPackage(packageName); 250 Package package = await backend.lookupPackage(packageName);
245 if (package == null) return _notFoundHandler(request); 251 if (package == null) return _notFoundHandler(request);
246 252
247 var versions = await backend.versionsOfPackage(packageName); 253 var versions = await backend.versionsOfPackage(packageName);
248 _sortVersionsDesc(versions, decreasing: false); 254 _sortVersionsDesc(versions, decreasing: false);
249 255
250 var json = { 256 var json = {
251 'name' : package.name, 257 'name' : package.name,
252 'uploaders': package.uploaderEmails, 258 'uploaders': package.uploaderEmails,
253 'versions': 259 'versions':
254 versions.map((packageVersion) => packageVersion.version).toList(), 260 versions.map((packageVersion) => packageVersion.version).toList(),
255 }; 261 };
256 return _jsonResponse(json); 262 return _jsonResponse(json);
257 } 263 }
258 264
259 /// Handles requests for /packages/<package> - HTML 265 /// Handles requests for /packages/<package> - HTML
260 packageShowHandlerHtml(shelf.Request request, String packageName) async { 266 packageShowHandlerHtml(shelf.Request request, String packageName) async {
267 return packageVersionHandlerHtml(request, packageName, null);
268 }
269
270 /// Handles requests for /packages/<package>/versions
271 packageVersionsHandler(shelf.Request request, String packageName) async {
272 var versions = await backend.versionsOfPackage(packageName);
273 if (versions.isEmpty) return _notFoundHandler(request);
274
275 _sortVersionsDesc(versions);
276
277 var versionDownloadUrls = await Future.wait(
278 versions.map((PackageVersion version) {
279 return backend.downloadUrl(packageName, version.version);
280 }).toList());
281
282 return _htmlResponse(templateService.renderPkgVersionsPage(
283 packageName, versions, versionDownloadUrls));
284 }
285
286 /// Handles requests for /packages/<package>/versions/<version>
287 packageVersionHandlerHtml(request, String packageName, String versionName) async {
Søren Gjesse 2016/06/17 07:03:37 Long line.
kustermann 2016/06/28 09:53:31 Done.
261 String cachedPage; 288 String cachedPage;
262 if (backend.uiPackageCache != null) { 289 if (backend.uiPackageCache != null) {
263 cachedPage = await backend.uiPackageCache.getUIPackagePage(packageName); 290 cachedPage = await backend.uiPackageCache.getUIPackagePage(
291 packageName, versionName);
264 } 292 }
265 293
266 if (cachedPage == null) { 294 if (cachedPage == null) {
267 Package package = await backend.lookupPackage(packageName); 295 Package package = await backend.lookupPackage(packageName);
268 if (package == null) return _notFoundHandler(request); 296 if (package == null) return _notFoundHandler(request);
269 297
270 var versions = await backend.versionsOfPackage(packageName); 298 var versions = await backend.versionsOfPackage(packageName);
271 _sortVersionsDesc(versions);
272 299
273 var latestVersion = versions.where( 300 _sortVersionsDesc(versions, decreasing: true, pubSorting: true);
274 (version) => version.key == package.latestVersionKey).first; 301 var latestStable = versions[0];
302 var first10Versions = versions.take(10).toList();
275 303
276 var first10Versions = versions.take(10).toList(); 304 _sortVersionsDesc(versions, decreasing: true, pubSorting: false);
305 var latestDev = versions[0];
306
307 var selectedVersion;
308 if (versionName != null) {
309 for (var v in versions) {
310 if (v.version == versionName) selectedVersion = v;
311 }
312 // TODO: cache error?
313 if (selectedVersion == null) {
314 return _notFoundHandler(request);
315 }
316 } else {
317 if (selectedVersion == null) {
318 selectedVersion = latestStable;
319 }
320 }
277 321
278 var versionDownloadUrls = await Future.wait( 322 var versionDownloadUrls = await Future.wait(
279 first10Versions.map((PackageVersion version) { 323 first10Versions.map((PackageVersion version) {
280 return backend.downloadUrl(packageName, version.version); 324 return backend.downloadUrl(packageName, version.version);
281 }).toList()); 325 }).toList());
282 326
283 cachedPage = templateService.renderPkgShowPage( 327 cachedPage = templateService.renderPkgShowPage(
284 package, first10Versions, versionDownloadUrls, latestVersion, 328 package, first10Versions, versionDownloadUrls, selectedVersion,
285 versions.length); 329 latestStable, latestDev, versions.length);
286 if (backend.uiPackageCache != null) { 330 if (backend.uiPackageCache != null) {
287 await backend.uiPackageCache.setUIPackagePage(packageName, cachedPage); 331 await backend.uiPackageCache.setUIPackagePage(
332 packageName, versionName, cachedPage);
288 } 333 }
289 } 334 }
290 335
291 return _htmlResponse(cachedPage); 336 return _htmlResponse(cachedPage);
292 } 337 }
293 338
294 /// Handles requests for /packages/<package>/versions
295 packageVersionsHandler(shelf.Request request, String packageName) async {
296 var versions = await backend.versionsOfPackage(packageName);
297 if (versions.isEmpty) return _notFoundHandler(request);
298
299 _sortVersionsDesc(versions);
300
301 var versionDownloadUrls = await Future.wait(
302 versions.map((PackageVersion version) {
303 return backend.downloadUrl(packageName, version.version);
304 }).toList());
305
306 return _htmlResponse(templateService.renderPkgVersionsPage(
307 packageName, versions, versionDownloadUrls));
308 }
309
310 /// Handles requests for /packages/<package>/versions/<version>.yaml 339 /// Handles requests for /packages/<package>/versions/<version>.yaml
311 packageVersionHandlerYaml(request, String package, String version) async { 340 packageVersionHandlerYaml(request, String package, String version) async {
312 var packageVersion = await backend.lookupPackageVersion(package, version); 341 var packageVersion = await backend.lookupPackageVersion(package, version);
313 if (packageVersion == null) { 342 if (packageVersion == null) {
314 return _notFoundHandler(request); 343 return _notFoundHandler(request);
315 } else { 344 } else {
316 return _yamlResponse(packageVersion.pubspec.jsonString); 345 return _yamlResponse(packageVersion.pubspec.jsonString);
317 } 346 }
318 } 347 }
319 348
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
431 status, 460 status,
432 body: content, 461 body: content,
433 headers: {'content-type' : 'application/atom+xml; charset="utf-8"'}); 462 headers: {'content-type' : 'application/atom+xml; charset="utf-8"'});
434 } 463 }
435 464
436 shelf.Response _redirectResponse(url) { 465 shelf.Response _redirectResponse(url) {
437 return new shelf.Response.seeOther(url); 466 return new shelf.Response.seeOther(url);
438 } 467 }
439 468
440 469
441 /// Sorts [versions] according to the semantic versioning specification. 470 /// Sorts [versions] according to the semantic versioning specification.
Søren Gjesse 2016/06/17 07:03:37 Please add a comment on the difference between pub
kustermann 2016/06/28 09:53:31 Done.
442 void _sortVersionsDesc(List<PackageVersion> versions, {bool decreasing: true}) { 471 void _sortVersionsDesc(List<PackageVersion> versions,
472 {bool decreasing: true, bool pubSorting: true}) {
443 versions.sort((PackageVersion a, PackageVersion b) { 473 versions.sort((PackageVersion a, PackageVersion b) {
444 if (decreasing) { 474 if (pubSorting) {
445 return semver.Version.prioritize(b.semanticVersion, a.semanticVersion); 475 if (decreasing) {
476 return semver.Version.prioritize(b.semanticVersion, a.semanticVersion);
477 } else {
478 return semver.Version.prioritize(a.semanticVersion, b.semanticVersion);
479 }
446 } else { 480 } else {
447 return semver.Version.prioritize(a.semanticVersion, b.semanticVersion); 481 if (decreasing) {
482 return b.semanticVersion.compareTo(a.semanticVersion);
483 } else {
484 return a.semanticVersion.compareTo(b.semanticVersion);
485 }
448 } 486 }
449 }); 487 });
450 } 488 }
451 489
452 490
453 /// Extracts the 'page' query parameter from [url]. 491 /// Extracts the 'page' query parameter from [url].
454 /// 492 ///
455 /// Returns a valid positive integer. If [maxPages] is given, the result is 493 /// Returns a valid positive integer. If [maxPages] is given, the result is
456 /// clamped to [maxPages]. 494 /// clamped to [maxPages].
457 int _pageFromUrl(Uri url, {int maxPages}) { 495 int _pageFromUrl(Uri url, {int maxPages}) {
458 var pageAsString = url.queryParameters['page']; 496 var pageAsString = url.queryParameters['page'];
459 int pageAsInt = 1; 497 int pageAsInt = 1;
460 if (pageAsString != null) { 498 if (pageAsString != null) {
461 try { 499 try {
462 pageAsInt = max(int.parse(pageAsString), 1); 500 pageAsInt = max(int.parse(pageAsString), 1);
463 } catch (_, __) { } 501 } catch (_, __) { }
464 } 502 }
465 503
466 if (maxPages != null && pageAsInt > maxPages) pageAsInt = maxPages; 504 if (maxPages != null && pageAsInt > maxPages) pageAsInt = maxPages;
467 return pageAsInt; 505 return pageAsInt;
468 } 506 }
OLDNEW
« no previous file with comments | « no previous file | app/lib/package_memcache.dart » ('j') | app/views/pkg/show.mustache » ('J')

Powered by Google App Engine
This is Rietveld 408576698