Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions app/lib/frontend/handlers/experimental.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import '../../shared/cookie_utils.dart';
const _publicFlags = <String>{
'dark',
'search-completion',
'download-counts',
};

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

bool get showDownloadCounts => isEnabled('download-counts');

String encodedAsCookie() => _enabled.join(':');

@override
Expand Down
1 change: 1 addition & 0 deletions app/lib/frontend/templates/package_misc.dart
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,7 @@ d.Node labeledScoresNodeFromPackageView(PackageView view, {String? version}) {
likeCount: view.likes,
grantedPubPoints: view.grantedPubPoints,
popularity: view.popularity,
thirtyDaysDownloads: view.thirtyDaysDownloadCounts,
);
}

Expand Down
41 changes: 29 additions & 12 deletions app/lib/frontend/templates/views/pkg/labeled_scores.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
// 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:pub_dev/frontend/request_context.dart';
import 'package:pub_dev/shared/popularity_storage.dart';

import '../../../dom/dom.dart' as d;
Expand All @@ -11,39 +13,54 @@ d.Node labeledScoresNode({
required int likeCount,
required int? grantedPubPoints,
required int? popularity,
required int? thirtyDaysDownloads,
}) {
return d.a(
classes: ['packages-scores'],
href: pkgScorePageUrl,
children: [
d.div(
classes: ['packages-score', 'packages-score-like'],
child: _labeledScore('likes', likeCount, sign: ''),
child: _labeledScore('likes', likeCount.toString(), sign: ''),
),
d.div(
classes: ['packages-score', 'packages-score-health'],
child: _labeledScore('pub points', grantedPubPoints, sign: ''),
),
d.div(
classes: ['packages-score', 'packages-score-popularity'],
child: _labeledScore(
'popularity',
popularityStorage.isInvalid ? null : popularity,
sign: popularityStorage.isInvalid ? '' : '%',
),
child:
_labeledScore('pub points', grantedPubPoints?.toString(), sign: ''),
),
requestContext.experimentalFlags.showDownloadCounts
? d.div(
classes: ['packages-score', 'packages-score-downloads'],
child: _labeledScore(
'downloads',
thirtyDaysDownloads != null
? formatWith3SignificantDigits(thirtyDaysDownloads).value
: null,
sign: thirtyDaysDownloads != null
? formatWith3SignificantDigits(thirtyDaysDownloads).suffix
: '',
),
)
: d.div(
classes: ['packages-score', 'packages-score-popularity'],
child: _labeledScore(
'popularity',
popularityStorage.isInvalid ? null : popularity.toString(),
sign: popularityStorage.isInvalid ? '' : '%',
),
),
],
);
}

d.Node _labeledScore(String label, int? value, {required String sign}) {
d.Node _labeledScore(String label, String? value, {required String sign}) {
return d.fragment([
d.div(
classes: ['packages-score-value', if (value != null) '-has-value'],
children: [
d.span(
classes: ['packages-score-value-number'],
text: value?.toString() ?? '--',
text: value ?? '--',
),
d.span(classes: ['packages-score-value-sign'], text: sign),
],
Expand Down
8 changes: 8 additions & 0 deletions app/lib/package/models.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import 'package:_pub_shared/search/tags.dart';
import 'package:clock/clock.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/shared/markdown.dart';
import 'package:pub_semver/pub_semver.dart';

Expand Down Expand Up @@ -964,6 +965,7 @@ class PackageView {

final List<String>? topics;
final int popularity;
final int? thirtyDaysDownloadCounts;

PackageView({
this.screenshots,
Expand All @@ -982,6 +984,7 @@ class PackageView {
this.apiPages,
this.topics,
required this.popularity,
required this.thirtyDaysDownloadCounts,
}) : isPending = isPending ?? false,
tags = tags ?? <String>[];

Expand All @@ -995,6 +998,7 @@ class PackageView {
required ScoreCardData scoreCard,
List<ApiPageRef>? apiPages,
required int popularity,
required int? thirtyDaysDownloadCounts,
}) {
final tags = <String>{
...package.getTags(),
Expand All @@ -1019,6 +1023,7 @@ class PackageView {
screenshots: scoreCard.panaReport?.screenshots,
topics: version?.pubspec?.canonicalizedTopics,
popularity: popularity,
thirtyDaysDownloadCounts: thirtyDaysDownloadCounts,
);
}

Expand All @@ -1040,6 +1045,7 @@ class PackageView {
screenshots: screenshots,
topics: topics,
popularity: popularity,
thirtyDaysDownloadCounts: thirtyDaysDownloadCounts,
);
}

Expand Down Expand Up @@ -1191,6 +1197,8 @@ class PackagePageData {
version: version,
scoreCard: scoreCard,
popularity: popularityStorage.lookupAsScore(package.name!),
thirtyDaysDownloadCounts:
downloadCountsBackend.lookup30DayTotalCounts(package.name!),
);
}
}
Expand Down
3 changes: 3 additions & 0 deletions app/lib/package/models.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions app/lib/scorecard/backend.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import 'package:gcloud/service_scope.dart' as ss;
import 'package:logging/logging.dart';
import 'package:meta/meta.dart';
import 'package:pool/pool.dart';
import 'package:pub_dev/service/download_counts/backend.dart';
import 'package:pub_dev/shared/exceptions.dart';
import 'package:pub_dev/shared/popularity_storage.dart';
import 'package:pub_dev/task/backend.dart';
Expand Down Expand Up @@ -97,6 +98,8 @@ class ScoreCardBackend {
version: pv,
scoreCard: card,
popularity: popularityStorage.lookupAsScore(package),
thirtyDaysDownloadCounts:
downloadCountsBackend.lookup30DayTotalCounts(package),
);
});
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,13 @@ import 'dart:convert';

import 'package:basics/basics.dart';
import 'package:gcloud/storage.dart';
import 'package:pub_dev/fake/backend/fake_download_counts.dart';
import 'package:pub_dev/service/download_counts/backend.dart';
import 'package:pub_dev/service/download_counts/compute_30_days_total_counts.dart';
import 'package:pub_dev/shared/configuration.dart';
import 'package:test/test.dart';

import '../../shared/test_services.dart';
import 'fake_download_counts.dart';

void main() {
group('', () {
Expand Down
2 changes: 1 addition & 1 deletion app/test/service/download_counts/download_counts_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@ import 'package:basics/basics.dart';
import 'package:clock/clock.dart';
import 'package:logging/logging.dart';
import 'package:path/path.dart' as path;
import 'package:pub_dev/fake/backend/fake_download_counts.dart';
import 'package:pub_dev/service/download_counts/backend.dart';
import 'package:pub_dev/service/download_counts/sync_download_counts.dart';
import 'package:test/test.dart';

import '../../shared/test_services.dart';
import 'fake_download_counts.dart';

void main() {
group('', () {
Expand Down
Loading