diff --git a/app/lib/frontend/templates/views/pkg/score_tab.dart b/app/lib/frontend/templates/views/pkg/score_tab.dart index e2e411e096..918519bc96 100644 --- a/app/lib/frontend/templates/views/pkg/score_tab.dart +++ b/app/lib/frontend/templates/views/pkg/score_tab.dart @@ -2,12 +2,14 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. +import 'package:_pub_shared/format/number_format.dart'; import 'package:pana/models.dart'; import 'package:pub_dev/shared/popularity_storage.dart'; import '../../../../scorecard/models.dart' hide ReportStatus; import '../../../../shared/urls.dart' as urls; import '../../../dom/dom.dart' as d; +import '../../../request_context.dart'; import '../../../static_files.dart'; import '../../package_misc.dart' show formatScore; @@ -39,7 +41,9 @@ d.Node scoreTabNode({ children: [ _likeKeyFigureNode(likeCount), _pubPointsKeyFigureNode(report, showPending), - _popularityKeyFigureNode(card.popularityScore), + requestContext.experimentalFlags.showDownloadCounts + ? _downloadCountsKeyFigureNode(card.thirtyDaysDownloadCounts) + : _popularityKeyFigureNode(card.popularityScore), ], ), if (showPending) @@ -266,6 +270,21 @@ d.Node _popularityKeyFigureNode(double? popularity) { ); } +d.Node _downloadCountsKeyFigureNode(int? downloadCounts) { + if (downloadCounts == null) { + return _keyFigureNode( + value: '--', + supplemental: '', + label: 'downloads', + ); + } + return _keyFigureNode( + value: formatWith3SignificantDigits(downloadCounts).value, + supplemental: formatWith3SignificantDigits(downloadCounts).suffix, + label: 'downloads', + ); +} + d.Node _pubPointsKeyFigureNode(Report? report, bool showPending) { if (report == null) { return _keyFigureNode( diff --git a/app/lib/package/models.dart b/app/lib/package/models.dart index 1161e1d772..dae6f5dbb8 100644 --- a/app/lib/package/models.dart +++ b/app/lib/package/models.dart @@ -1196,7 +1196,7 @@ class PackagePageData { scoreCard: scoreCard, popularity: popularityStorage.lookupAsScore(package.name!), thirtyDaysDownloadCounts: - downloadCountsBackend.lookup30DayTotalCounts(package.name!), + downloadCountsBackend.lookup30DaysTotalCounts(package.name!), ); } } diff --git a/app/lib/scorecard/backend.dart b/app/lib/scorecard/backend.dart index e2901040f0..82083ee7e1 100644 --- a/app/lib/scorecard/backend.dart +++ b/app/lib/scorecard/backend.dart @@ -99,7 +99,7 @@ class ScoreCardBackend { scoreCard: card, popularity: popularityStorage.lookupAsScore(package), thirtyDaysDownloadCounts: - downloadCountsBackend.lookup30DayTotalCounts(package), + downloadCountsBackend.lookup30DaysTotalCounts(package), ); }); } diff --git a/app/lib/scorecard/models.dart b/app/lib/scorecard/models.dart index f2ac32abf9..2d0ab40211 100644 --- a/app/lib/scorecard/models.dart +++ b/app/lib/scorecard/models.dart @@ -7,6 +7,7 @@ import 'dart:io'; import 'package:_pub_shared/search/tags.dart'; import 'package:json_annotation/json_annotation.dart'; import 'package:pana/models.dart'; +import 'package:pub_dev/service/download_counts/backend.dart'; import 'package:pub_dev/task/models.dart'; import '../scorecard/backend.dart'; @@ -70,6 +71,9 @@ class ScoreCardData { // TODO: refactor code to use popularityStorage directly. double get popularityScore => popularityStorage.lookup(packageName!); + + int? get thirtyDaysDownloadCounts => + downloadCountsBackend.lookup30DaysTotalCounts(packageName!); } @JsonSerializable(includeIfNull: false) diff --git a/app/lib/service/download_counts/backend.dart b/app/lib/service/download_counts/backend.dart index d400675510..a734abdf3d 100644 --- a/app/lib/service/download_counts/backend.dart +++ b/app/lib/service/download_counts/backend.dart @@ -78,7 +78,7 @@ class DownloadCountsBackend { await _thirtyDaysTotals.close(); } - int? lookup30DayTotalCounts(String package) => + int? lookup30DaysTotalCounts(String package) => _thirtyDaysTotals.isAvailable ? _thirtyDaysTotals.value![package] : null; Future lookupDownloadCountData(String pkg) async { diff --git a/app/test/service/download_counts/compute_total_download_counts_test.dart b/app/test/service/download_counts/compute_total_download_counts_test.dart index 5b16670601..fd39024661 100644 --- a/app/test/service/download_counts/compute_total_download_counts_test.dart +++ b/app/test/service/download_counts/compute_total_download_counts_test.dart @@ -102,22 +102,22 @@ void main() { testWithProfile('cache 30-days totals', fn: () async { await generateFake30DaysTotals({'foo': 70, 'bar': 105, 'baz': 140}); - expect(downloadCountsBackend.lookup30DayTotalCounts('foo'), isNull); - expect(downloadCountsBackend.lookup30DayTotalCounts('bar'), isNull); - expect(downloadCountsBackend.lookup30DayTotalCounts('baz'), isNull); + expect(downloadCountsBackend.lookup30DaysTotalCounts('foo'), isNull); + expect(downloadCountsBackend.lookup30DaysTotalCounts('bar'), isNull); + expect(downloadCountsBackend.lookup30DaysTotalCounts('baz'), isNull); await downloadCountsBackend.start(); - expect(downloadCountsBackend.lookup30DayTotalCounts('foo'), 70); - expect(downloadCountsBackend.lookup30DayTotalCounts('bar'), 105); - expect(downloadCountsBackend.lookup30DayTotalCounts('baz'), 140); - expect(downloadCountsBackend.lookup30DayTotalCounts('bax'), isNull); + expect(downloadCountsBackend.lookup30DaysTotalCounts('foo'), 70); + expect(downloadCountsBackend.lookup30DaysTotalCounts('bar'), 105); + expect(downloadCountsBackend.lookup30DaysTotalCounts('baz'), 140); + expect(downloadCountsBackend.lookup30DaysTotalCounts('bax'), isNull); await generateFake30DaysTotals({'foo': 90, 'bar': 120, 'baz': 150}); await downloadCountsBackend.start(); - expect(downloadCountsBackend.lookup30DayTotalCounts('foo'), 90); - expect(downloadCountsBackend.lookup30DayTotalCounts('bar'), 120); - expect(downloadCountsBackend.lookup30DayTotalCounts('baz'), 150); - expect(downloadCountsBackend.lookup30DayTotalCounts('bax'), isNull); + expect(downloadCountsBackend.lookup30DaysTotalCounts('foo'), 90); + expect(downloadCountsBackend.lookup30DaysTotalCounts('bar'), 120); + expect(downloadCountsBackend.lookup30DaysTotalCounts('baz'), 150); + expect(downloadCountsBackend.lookup30DaysTotalCounts('bax'), isNull); }); }); }