@@ -31,42 +31,44 @@ class DownloadCountsBackend {
3131 late CachedValue <Map <String , int >> _thirtyDaysTotals;
3232 var _lastDownloadsData = (data: < String , int > {}, etag: '' );
3333
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: '' );
3636
3737 DownloadCountsBackend (this ._db) {
38- _thirtyDaysTotals = CachedValue (
38+ _thirtyDaysTotals = CachedValue < Map < String , int >> (
3939 name: 'thirtyDaysTotalDownloadCounts' ,
4040 maxAge: Duration (days: 14 ),
4141 interval: Duration (minutes: 30 ),
4242 updateFn: _updateThirtyDaysTotals);
43- _trendScores = CachedValue (
43+ _trendScores = CachedValue < Map < String , double >> (
4444 name: 'trendScores' ,
4545 maxAge: Duration (days: 14 ),
4646 interval: Duration (minutes: 30 ),
4747 updateFn: _updateTrendScores);
4848 }
4949
5050 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+ );
5657 }
5758
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+ );
6466 }
6567
66- Future <Map <String , int >> _fetchAndUpdateCachedData ({
68+ Future <Map <String , V >> _fetchAndUpdateCachedData < V > ({
6769 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)
7072 updateCache,
7173 required String errorContext,
7274 }) async {
@@ -89,7 +91,7 @@ class DownloadCountsBackend {
8991 .single,
9092 );
9193
92- final data = _parseJsonToMapStringInt (rawData, fileName);
94+ final data = _parseJsonToMapStringV < V > (rawData, fileName);
9395
9496 final newData = (data: data, etag: info.etag);
9597 updateCache (newData);
@@ -109,23 +111,25 @@ class DownloadCountsBackend {
109111 }
110112 }
111113
112- Map <String , int > _parseJsonToMapStringInt (dynamic rawJson, String fileName) {
114+ Map <String , V > _parseJsonToMapStringV < V > (dynamic rawJson, String fileName) {
113115 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 }' );
116118 }
117119
118- final Map <String , int > result = {};
120+ final Map <String , V > result = {};
119121 for (final entry in rawJson.entries) {
120122 if (entry.key is ! String ) {
121123 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 }' );
123126 }
124- if (entry.value is ! int ) {
127+ if (entry.value is ! V ) {
125128 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 }' );
127131 }
128- result[entry.key as String ] = entry.value as int ;
132+ result[entry.key as String ] = entry.value as V ;
129133 }
130134 return result;
131135 }
@@ -143,7 +147,7 @@ class DownloadCountsBackend {
143147 int ? lookup30DaysTotalCounts (String package) =>
144148 _thirtyDaysTotals.isAvailable ? _thirtyDaysTotals.value! [package] : null ;
145149
146- int ? lookupTrendScore (String package) =>
150+ double ? lookupTrendScore (String package) =>
147151 _trendScores.isAvailable ? _trendScores.value! [package] : null ;
148152
149153 Future <CountData ?> lookupDownloadCountData (String pkg) async {
0 commit comments