Skip to content

Commit 65e03e0

Browse files
committed
Download counts: add computations for weekly downloads
1 parent c16181e commit 65e03e0

File tree

5 files changed

+73
-4
lines changed

5 files changed

+73
-4
lines changed

app/lib/fake/backend/fake_download_counts.dart

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

77
import 'package:gcloud/storage.dart';
8-
import 'package:pub_dev/service/download_counts/compute_30_days_total_counts.dart';
8+
import 'package:pub_dev/service/download_counts/computations.dart';
99
import 'package:pub_dev/shared/configuration.dart';
1010
import 'package:pub_dev/shared/utils.dart';
1111

app/lib/service/download_counts/backend.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import 'dart:convert';
77
import 'package:gcloud/service_scope.dart' as ss;
88
import 'package:gcloud/storage.dart';
99
import 'package:googleapis/storage/v1.dart';
10-
import 'package:pub_dev/service/download_counts/compute_30_days_total_counts.dart';
10+
import 'package:pub_dev/service/download_counts/computations.dart';
1111
import 'package:pub_dev/service/download_counts/download_counts.dart';
1212
import 'package:pub_dev/service/download_counts/models.dart';
1313
import 'package:pub_dev/service/entrypoint/analyzer.dart';

app/lib/service/download_counts/compute_30_days_total_counts.dart renamed to app/lib/service/download_counts/computations.dart

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,3 +42,29 @@ Future<void> upload30DaysTotal(Map<String, int> counts) async {
4242
await uploadBytesWithRetry(reportsBucket, downloadCounts30DaysTotalsFileName,
4343
jsonUtf8Encoder.convert(counts));
4444
}
45+
46+
Future<({List<int> weeklyPoints, DateTime? newestDate})> computeWeeklyDownloads(
47+
String package) async {
48+
final weeklyPoints = List.filled(52, 0);
49+
final countData =
50+
await downloadCountsBackend.lookupDownloadCountData(package);
51+
if (countData == null) {
52+
return (weeklyPoints: <int>[], newestDate: null);
53+
}
54+
55+
final totals = countData!.totalCounts;
56+
57+
var sum = 0;
58+
for (int i = 0; i < 52 * 7; i++) {
59+
if (totals[i] < 0) {
60+
// There is no more available data.
61+
break;
62+
}
63+
sum += totals[i];
64+
if ((i + 1) % 7 == 0) {
65+
weeklyPoints[(i ~/ 7)] = sum;
66+
sum = 0;
67+
}
68+
}
69+
return (weeklyPoints: weeklyPoints, newestDate: countData.newestDate!);
70+
}

app/lib/tool/neat_task/pub_dev_tasks.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import 'dart:io';
88
import 'package:gcloud/service_scope.dart' as ss;
99
import 'package:logging/logging.dart';
1010
import 'package:neat_periodic_task/neat_periodic_task.dart';
11-
import 'package:pub_dev/service/download_counts/compute_30_days_total_counts.dart';
11+
import 'package:pub_dev/service/download_counts/computations.dart';
1212

1313
import '../../account/backend.dart';
1414
import '../../account/consent_backend.dart';
Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import 'package:basics/basics.dart';
77
import 'package:gcloud/storage.dart';
88
import 'package:pub_dev/fake/backend/fake_download_counts.dart';
99
import 'package:pub_dev/service/download_counts/backend.dart';
10-
import 'package:pub_dev/service/download_counts/compute_30_days_total_counts.dart';
10+
import 'package:pub_dev/service/download_counts/computations.dart';
1111
import 'package:pub_dev/shared/configuration.dart';
1212
import 'package:test/test.dart';
1313

@@ -119,5 +119,48 @@ void main() {
119119
expect(downloadCountsBackend.lookup30DaysTotalCounts('baz'), 150);
120120
expect(downloadCountsBackend.lookup30DaysTotalCounts('bax'), isNull);
121121
});
122+
123+
testWithProfile('compute weekly', fn: () async {
124+
final pkg = 'foo';
125+
final date = DateTime.parse('1986-02-16');
126+
final versionsCounts = {
127+
'1.0.1': 2,
128+
'2.0.0-alpha': 2,
129+
'2.0.0': 2,
130+
'2.1.0': 2,
131+
'3.1.0': 2,
132+
'4.0.0-0': 2,
133+
'6.1.0': 2,
134+
};
135+
final versionsCounts2 = {
136+
'1.0.1': 3,
137+
'2.0.0-alpha': 3,
138+
'2.0.0': 3,
139+
'2.1.0': 3,
140+
'3.1.0': 3,
141+
'4.0.0-0': 3,
142+
'6.1.0': 3,
143+
};
144+
145+
for (var i = 0; i < 7 * 20; i++) {
146+
await downloadCountsBackend.updateDownloadCounts(
147+
pkg, versionsCounts, date.addCalendarDays(i));
148+
}
149+
150+
for (var i = 7 * 20; i < 7 * 40; i++) {
151+
await downloadCountsBackend.updateDownloadCounts(
152+
pkg, versionsCounts2, date.addCalendarDays(i));
153+
}
154+
155+
final res = await computeWeeklyDownloads(pkg);
156+
157+
final expectedList = List.from(List.filled(20, 147))
158+
..addAll(List.filled(20, 98))
159+
..addAll(List.filled(12, 0));
160+
final expectedNewstDate = date.addCalendarDays(7 * 40 - 1);
161+
162+
expect(res.weeklyPoints, expectedList);
163+
expect(res.newestDate, expectedNewstDate);
164+
});
122165
});
123166
}

0 commit comments

Comments
 (0)