Skip to content

Commit 7b5fec4

Browse files
authored
Experimental: Show download counts instead of popularity score (#8126)
1 parent 61860e2 commit 7b5fec4

File tree

9 files changed

+49
-14
lines changed

9 files changed

+49
-14
lines changed

app/lib/frontend/handlers/experimental.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import '../../shared/cookie_utils.dart';
99
const _publicFlags = <String>{
1010
'dark',
1111
'search-completion',
12+
'download-counts',
1213
};
1314

1415
const _allFlags = <String>{
@@ -89,6 +90,8 @@ class ExperimentalFlags {
8990
bool get isDarkModeEnabled => isEnabled('dark');
9091
bool get isDarkModeDefault => isEnabled('dark-as-default');
9192

93+
bool get showDownloadCounts => isEnabled('download-counts');
94+
9295
String encodedAsCookie() => _enabled.join(':');
9396

9497
@override

app/lib/frontend/templates/package_misc.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,7 @@ d.Node labeledScoresNodeFromPackageView(PackageView view, {String? version}) {
197197
likeCount: view.likes,
198198
grantedPubPoints: view.grantedPubPoints,
199199
popularity: view.popularity,
200+
thirtyDaysDownloads: view.thirtyDaysDownloadCounts,
200201
);
201202
}
202203

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

Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
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';
6+
import 'package:pub_dev/frontend/request_context.dart';
57
import 'package:pub_dev/shared/popularity_storage.dart';
68

79
import '../../../dom/dom.dart' as d;
@@ -11,39 +13,54 @@ d.Node labeledScoresNode({
1113
required int likeCount,
1214
required int? grantedPubPoints,
1315
required int? popularity,
16+
required int? thirtyDaysDownloads,
1417
}) {
1518
return d.a(
1619
classes: ['packages-scores'],
1720
href: pkgScorePageUrl,
1821
children: [
1922
d.div(
2023
classes: ['packages-score', 'packages-score-like'],
21-
child: _labeledScore('likes', likeCount, sign: ''),
24+
child: _labeledScore('likes', likeCount.toString(), sign: ''),
2225
),
2326
d.div(
2427
classes: ['packages-score', 'packages-score-health'],
25-
child: _labeledScore('pub points', grantedPubPoints, sign: ''),
26-
),
27-
d.div(
28-
classes: ['packages-score', 'packages-score-popularity'],
29-
child: _labeledScore(
30-
'popularity',
31-
popularityStorage.isInvalid ? null : popularity,
32-
sign: popularityStorage.isInvalid ? '' : '%',
33-
),
28+
child:
29+
_labeledScore('pub points', grantedPubPoints?.toString(), sign: ''),
3430
),
31+
requestContext.experimentalFlags.showDownloadCounts
32+
? d.div(
33+
classes: ['packages-score', 'packages-score-downloads'],
34+
child: _labeledScore(
35+
'downloads',
36+
thirtyDaysDownloads != null
37+
? formatWith3SignificantDigits(thirtyDaysDownloads).value
38+
: null,
39+
sign: thirtyDaysDownloads != null
40+
? formatWith3SignificantDigits(thirtyDaysDownloads).suffix
41+
: '',
42+
),
43+
)
44+
: d.div(
45+
classes: ['packages-score', 'packages-score-popularity'],
46+
child: _labeledScore(
47+
'popularity',
48+
popularityStorage.isInvalid ? null : popularity.toString(),
49+
sign: popularityStorage.isInvalid ? '' : '%',
50+
),
51+
),
3552
],
3653
);
3754
}
3855

39-
d.Node _labeledScore(String label, int? value, {required String sign}) {
56+
d.Node _labeledScore(String label, String? value, {required String sign}) {
4057
return d.fragment([
4158
d.div(
4259
classes: ['packages-score-value', if (value != null) '-has-value'],
4360
children: [
4461
d.span(
4562
classes: ['packages-score-value-number'],
46-
text: value?.toString() ?? '--',
63+
text: value ?? '--',
4764
),
4865
d.span(classes: ['packages-score-value-sign'], text: sign),
4966
],

app/lib/package/models.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import 'package:_pub_shared/search/tags.dart';
99
import 'package:clock/clock.dart';
1010
import 'package:json_annotation/json_annotation.dart';
1111
import 'package:pana/models.dart';
12+
import 'package:pub_dev/service/download_counts/backend.dart';
1213
import 'package:pub_dev/shared/markdown.dart';
1314
import 'package:pub_semver/pub_semver.dart';
1415

@@ -962,6 +963,7 @@ class PackageView {
962963

963964
final List<String>? topics;
964965
final int popularity;
966+
final int? thirtyDaysDownloadCounts;
965967

966968
PackageView({
967969
this.screenshots,
@@ -980,6 +982,7 @@ class PackageView {
980982
this.apiPages,
981983
this.topics,
982984
required this.popularity,
985+
required this.thirtyDaysDownloadCounts,
983986
}) : isPending = isPending ?? false,
984987
tags = tags ?? <String>[];
985988

@@ -993,6 +996,7 @@ class PackageView {
993996
required ScoreCardData scoreCard,
994997
List<ApiPageRef>? apiPages,
995998
required int popularity,
999+
required int? thirtyDaysDownloadCounts,
9961000
}) {
9971001
final tags = <String>{
9981002
...package.getTags(),
@@ -1017,6 +1021,7 @@ class PackageView {
10171021
screenshots: scoreCard.panaReport?.screenshots,
10181022
topics: version?.pubspec?.canonicalizedTopics,
10191023
popularity: popularity,
1024+
thirtyDaysDownloadCounts: thirtyDaysDownloadCounts,
10201025
);
10211026
}
10221027

@@ -1038,6 +1043,7 @@ class PackageView {
10381043
screenshots: screenshots,
10391044
topics: topics,
10401045
popularity: popularity,
1046+
thirtyDaysDownloadCounts: thirtyDaysDownloadCounts,
10411047
);
10421048
}
10431049

@@ -1189,6 +1195,8 @@ class PackagePageData {
11891195
version: version,
11901196
scoreCard: scoreCard,
11911197
popularity: popularityStorage.lookupAsScore(package.name!),
1198+
thirtyDaysDownloadCounts:
1199+
downloadCountsBackend.lookup30DayTotalCounts(package.name!),
11921200
);
11931201
}
11941202
}

app/lib/package/models.g.dart

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/lib/scorecard/backend.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import 'package:gcloud/service_scope.dart' as ss;
99
import 'package:logging/logging.dart';
1010
import 'package:meta/meta.dart';
1111
import 'package:pool/pool.dart';
12+
import 'package:pub_dev/service/download_counts/backend.dart';
1213
import 'package:pub_dev/shared/exceptions.dart';
1314
import 'package:pub_dev/shared/popularity_storage.dart';
1415
import 'package:pub_dev/task/backend.dart';
@@ -97,6 +98,8 @@ class ScoreCardBackend {
9798
version: pv,
9899
scoreCard: card,
99100
popularity: popularityStorage.lookupAsScore(package),
101+
thirtyDaysDownloadCounts:
102+
downloadCountsBackend.lookup30DayTotalCounts(package),
100103
);
101104
});
102105
}

app/test/service/download_counts/compute_total_download_counts_test.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@ import 'dart:convert';
55

66
import 'package:basics/basics.dart';
77
import 'package:gcloud/storage.dart';
8+
import 'package:pub_dev/fake/backend/fake_download_counts.dart';
89
import 'package:pub_dev/service/download_counts/backend.dart';
910
import 'package:pub_dev/service/download_counts/compute_30_days_total_counts.dart';
1011
import 'package:pub_dev/shared/configuration.dart';
1112
import 'package:test/test.dart';
1213

1314
import '../../shared/test_services.dart';
14-
import 'fake_download_counts.dart';
1515

1616
void main() {
1717
group('', () {

app/test/service/download_counts/download_counts_test.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@ import 'package:basics/basics.dart';
77
import 'package:clock/clock.dart';
88
import 'package:logging/logging.dart';
99
import 'package:path/path.dart' as path;
10+
import 'package:pub_dev/fake/backend/fake_download_counts.dart';
1011
import 'package:pub_dev/service/download_counts/backend.dart';
1112
import 'package:pub_dev/service/download_counts/sync_download_counts.dart';
1213
import 'package:test/test.dart';
1314

1415
import '../../shared/test_services.dart';
15-
import 'fake_download_counts.dart';
1616

1717
void main() {
1818
group('', () {

0 commit comments

Comments
 (0)