@@ -31,42 +31,44 @@ class DownloadCountsBackend {
31
31
late CachedValue <Map <String , int >> _thirtyDaysTotals;
32
32
var _lastDownloadsData = (data: < String , int > {}, etag: '' );
33
33
34
- late CachedValue <Map <String , int >> _trendScores;
35
- var _lastTrendData = (data: < String , int > {}, etag: '' );
34
+ late CachedValue <Map <String , double >> _trendScores;
35
+ var _lastTrendData = (data: < String , double > {}, etag: '' );
36
36
37
37
DownloadCountsBackend (this ._db) {
38
- _thirtyDaysTotals = CachedValue (
38
+ _thirtyDaysTotals = CachedValue < Map < String , int >> (
39
39
name: 'thirtyDaysTotalDownloadCounts' ,
40
40
maxAge: Duration (days: 14 ),
41
41
interval: Duration (minutes: 30 ),
42
42
updateFn: _updateThirtyDaysTotals);
43
- _trendScores = CachedValue (
43
+ _trendScores = CachedValue < Map < String , double >> (
44
44
name: 'trendScores' ,
45
45
maxAge: Duration (days: 14 ),
46
46
interval: Duration (minutes: 30 ),
47
47
updateFn: _updateTrendScores);
48
48
}
49
49
50
50
Future <Map <String , int >> _updateThirtyDaysTotals () async {
51
- return _fetchAndUpdateCachedData (
52
- fileName: downloadCounts30DaysTotalsFileName,
53
- currentCachedData: _lastDownloadsData,
54
- updateCache: (data) => _lastDownloadsData = data,
55
- errorContext: '30-days total download counts' );
51
+ return _fetchAndUpdateCachedData <int >(
52
+ fileName: downloadCounts30DaysTotalsFileName,
53
+ currentCachedData: _lastDownloadsData,
54
+ updateCache: (data) => _lastDownloadsData = data,
55
+ errorContext: '30-days total download counts' ,
56
+ );
56
57
}
57
58
58
- Future <Map <String , int >> _updateTrendScores () async {
59
- return _fetchAndUpdateCachedData (
60
- fileName: trendScoreFileName,
61
- currentCachedData: _lastTrendData,
62
- updateCache: (data) => _lastTrendData = data,
63
- errorContext: 'trend scores' );
59
+ Future <Map <String , double >> _updateTrendScores () async {
60
+ return _fetchAndUpdateCachedData <double >(
61
+ fileName: trendScoreFileName,
62
+ currentCachedData: _lastTrendData,
63
+ updateCache: (data) => _lastTrendData = data,
64
+ errorContext: 'trend scores' ,
65
+ );
64
66
}
65
67
66
- Future <Map <String , int >> _fetchAndUpdateCachedData ({
68
+ Future <Map <String , V >> _fetchAndUpdateCachedData < V > ({
67
69
required String fileName,
68
- required ({Map <String , int > data, String etag}) currentCachedData,
69
- required void Function (({Map <String , int > data, String etag}) newData)
70
+ required ({Map <String , V > data, String etag}) currentCachedData,
71
+ required void Function (({Map <String , V > data, String etag}) newData)
70
72
updateCache,
71
73
required String errorContext,
72
74
}) async {
@@ -89,7 +91,7 @@ class DownloadCountsBackend {
89
91
.single,
90
92
);
91
93
92
- final data = _parseJsonToMapStringInt (rawData, fileName);
94
+ final data = _parseJsonToMapStringV < V > (rawData, fileName);
93
95
94
96
final newData = (data: data, etag: info.etag);
95
97
updateCache (newData);
@@ -109,23 +111,25 @@ class DownloadCountsBackend {
109
111
}
110
112
}
111
113
112
- Map <String , int > _parseJsonToMapStringInt (dynamic rawJson, String fileName) {
114
+ Map <String , V > _parseJsonToMapStringV < V > (dynamic rawJson, String fileName) {
113
115
if (rawJson is ! Map ) {
114
- throw FormatException (
115
- 'Expected JSON for $ fileName to be a Map, but got ${rawJson .runtimeType }' );
116
+ throw FormatException ('Expected JSON for $ fileName to be a Map, but got'
117
+ ' ${rawJson .runtimeType }' );
116
118
}
117
119
118
- final Map <String , int > result = {};
120
+ final Map <String , V > result = {};
119
121
for (final entry in rawJson.entries) {
120
122
if (entry.key is ! String ) {
121
123
throw FormatException (
122
- 'Expected map keys for $fileName to be String, but found ${entry .key .runtimeType }' );
124
+ 'Expected map keys for $fileName to be String, but found'
125
+ ' ${entry .key .runtimeType }' );
123
126
}
124
- if (entry.value is ! int ) {
127
+ if (entry.value is ! V ) {
125
128
throw FormatException (
126
- 'Expected map value for key "${entry .key }" in $fileName to be int, but got ${entry .value .runtimeType }' );
129
+ 'Expected map value for key "${entry .key }" in $fileName to be'
130
+ ' ${V .runtimeType }, but got ${entry .value .runtimeType }' );
127
131
}
128
- result[entry.key as String ] = entry.value as int ;
132
+ result[entry.key as String ] = entry.value as V ;
129
133
}
130
134
return result;
131
135
}
@@ -143,7 +147,7 @@ class DownloadCountsBackend {
143
147
int ? lookup30DaysTotalCounts (String package) =>
144
148
_thirtyDaysTotals.isAvailable ? _thirtyDaysTotals.value! [package] : null ;
145
149
146
- int ? lookupTrendScore (String package) =>
150
+ double ? lookupTrendScore (String package) =>
147
151
_trendScores.isAvailable ? _trendScores.value! [package] : null ;
148
152
149
153
Future <CountData ?> lookupDownloadCountData (String pkg) async {
0 commit comments