Skip to content

Commit 9f75e64

Browse files
authored
Experimental: Show thirty days download counts on score page (#8171)
1 parent 3dc7a8a commit 9f75e64

File tree

6 files changed

+38
-15
lines changed

6 files changed

+38
-15
lines changed

app/lib/frontend/templates/views/pkg/score_tab.dart

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5+
import 'package:_pub_shared/format/number_format.dart';
56
import 'package:pana/models.dart';
67
import 'package:pub_dev/shared/popularity_storage.dart';
78

89
import '../../../../scorecard/models.dart' hide ReportStatus;
910
import '../../../../shared/urls.dart' as urls;
1011
import '../../../dom/dom.dart' as d;
12+
import '../../../request_context.dart';
1113
import '../../../static_files.dart';
1214
import '../../package_misc.dart' show formatScore;
1315

@@ -39,7 +41,9 @@ d.Node scoreTabNode({
3941
children: [
4042
_likeKeyFigureNode(likeCount),
4143
_pubPointsKeyFigureNode(report, showPending),
42-
_popularityKeyFigureNode(card.popularityScore),
44+
requestContext.experimentalFlags.showDownloadCounts
45+
? _downloadCountsKeyFigureNode(card.thirtyDaysDownloadCounts)
46+
: _popularityKeyFigureNode(card.popularityScore),
4347
],
4448
),
4549
if (showPending)
@@ -266,6 +270,21 @@ d.Node _popularityKeyFigureNode(double? popularity) {
266270
);
267271
}
268272

273+
d.Node _downloadCountsKeyFigureNode(int? downloadCounts) {
274+
if (downloadCounts == null) {
275+
return _keyFigureNode(
276+
value: '--',
277+
supplemental: '',
278+
label: 'downloads',
279+
);
280+
}
281+
return _keyFigureNode(
282+
value: formatWith3SignificantDigits(downloadCounts).value,
283+
supplemental: formatWith3SignificantDigits(downloadCounts).suffix,
284+
label: 'downloads',
285+
);
286+
}
287+
269288
d.Node _pubPointsKeyFigureNode(Report? report, bool showPending) {
270289
if (report == null) {
271290
return _keyFigureNode(

app/lib/package/models.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1196,7 +1196,7 @@ class PackagePageData {
11961196
scoreCard: scoreCard,
11971197
popularity: popularityStorage.lookupAsScore(package.name!),
11981198
thirtyDaysDownloadCounts:
1199-
downloadCountsBackend.lookup30DayTotalCounts(package.name!),
1199+
downloadCountsBackend.lookup30DaysTotalCounts(package.name!),
12001200
);
12011201
}
12021202
}

app/lib/scorecard/backend.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ class ScoreCardBackend {
9999
scoreCard: card,
100100
popularity: popularityStorage.lookupAsScore(package),
101101
thirtyDaysDownloadCounts:
102-
downloadCountsBackend.lookup30DayTotalCounts(package),
102+
downloadCountsBackend.lookup30DaysTotalCounts(package),
103103
);
104104
});
105105
}

app/lib/scorecard/models.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import 'dart:io';
77
import 'package:_pub_shared/search/tags.dart';
88
import 'package:json_annotation/json_annotation.dart';
99
import 'package:pana/models.dart';
10+
import 'package:pub_dev/service/download_counts/backend.dart';
1011
import 'package:pub_dev/task/models.dart';
1112

1213
import '../scorecard/backend.dart';
@@ -70,6 +71,9 @@ class ScoreCardData {
7071

7172
// TODO: refactor code to use popularityStorage directly.
7273
double get popularityScore => popularityStorage.lookup(packageName!);
74+
75+
int? get thirtyDaysDownloadCounts =>
76+
downloadCountsBackend.lookup30DaysTotalCounts(packageName!);
7377
}
7478

7579
@JsonSerializable(includeIfNull: false)

app/lib/service/download_counts/backend.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ class DownloadCountsBackend {
7878
await _thirtyDaysTotals.close();
7979
}
8080

81-
int? lookup30DayTotalCounts(String package) =>
81+
int? lookup30DaysTotalCounts(String package) =>
8282
_thirtyDaysTotals.isAvailable ? _thirtyDaysTotals.value![package] : null;
8383

8484
Future<CountData?> lookupDownloadCountData(String pkg) async {

app/test/service/download_counts/compute_total_download_counts_test.dart

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -102,22 +102,22 @@ void main() {
102102

103103
testWithProfile('cache 30-days totals', fn: () async {
104104
await generateFake30DaysTotals({'foo': 70, 'bar': 105, 'baz': 140});
105-
expect(downloadCountsBackend.lookup30DayTotalCounts('foo'), isNull);
106-
expect(downloadCountsBackend.lookup30DayTotalCounts('bar'), isNull);
107-
expect(downloadCountsBackend.lookup30DayTotalCounts('baz'), isNull);
105+
expect(downloadCountsBackend.lookup30DaysTotalCounts('foo'), isNull);
106+
expect(downloadCountsBackend.lookup30DaysTotalCounts('bar'), isNull);
107+
expect(downloadCountsBackend.lookup30DaysTotalCounts('baz'), isNull);
108108

109109
await downloadCountsBackend.start();
110-
expect(downloadCountsBackend.lookup30DayTotalCounts('foo'), 70);
111-
expect(downloadCountsBackend.lookup30DayTotalCounts('bar'), 105);
112-
expect(downloadCountsBackend.lookup30DayTotalCounts('baz'), 140);
113-
expect(downloadCountsBackend.lookup30DayTotalCounts('bax'), isNull);
110+
expect(downloadCountsBackend.lookup30DaysTotalCounts('foo'), 70);
111+
expect(downloadCountsBackend.lookup30DaysTotalCounts('bar'), 105);
112+
expect(downloadCountsBackend.lookup30DaysTotalCounts('baz'), 140);
113+
expect(downloadCountsBackend.lookup30DaysTotalCounts('bax'), isNull);
114114

115115
await generateFake30DaysTotals({'foo': 90, 'bar': 120, 'baz': 150});
116116
await downloadCountsBackend.start();
117-
expect(downloadCountsBackend.lookup30DayTotalCounts('foo'), 90);
118-
expect(downloadCountsBackend.lookup30DayTotalCounts('bar'), 120);
119-
expect(downloadCountsBackend.lookup30DayTotalCounts('baz'), 150);
120-
expect(downloadCountsBackend.lookup30DayTotalCounts('bax'), isNull);
117+
expect(downloadCountsBackend.lookup30DaysTotalCounts('foo'), 90);
118+
expect(downloadCountsBackend.lookup30DaysTotalCounts('bar'), 120);
119+
expect(downloadCountsBackend.lookup30DaysTotalCounts('baz'), 150);
120+
expect(downloadCountsBackend.lookup30DaysTotalCounts('bax'), isNull);
121121
});
122122
});
123123
}

0 commit comments

Comments
 (0)