From 184cdabd3c79c8d7e887b24eb7afd4c3c850f754 Mon Sep 17 00:00:00 2001 From: Sarah Zakarias Date: Fri, 20 Dec 2024 13:31:51 +0000 Subject: [PATCH 1/4] Prepare data for downloads chart --- .../widget/downloads_chart/computations.dart | 36 +++++++++ .../src/widget/downloads_chart/widget.dart | 34 +++++++- .../downloads_chart/downloads_chart_test.dart | 81 +++++++++++++++++++ 3 files changed, 149 insertions(+), 2 deletions(-) create mode 100644 pkg/web_app/lib/src/widget/downloads_chart/computations.dart create mode 100644 pkg/web_app/test/widget/downloads_chart/downloads_chart_test.dart diff --git a/pkg/web_app/lib/src/widget/downloads_chart/computations.dart b/pkg/web_app/lib/src/widget/downloads_chart/computations.dart new file mode 100644 index 0000000000..aa0a211c2d --- /dev/null +++ b/pkg/web_app/lib/src/widget/downloads_chart/computations.dart @@ -0,0 +1,36 @@ +// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file +// 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/data/download_counts_data.dart'; + +Iterable prepareRanges(List rangeDownloads) { + return rangeDownloads.map((e) => e.versionRange); +} + +/// Returns an iterable containing data to be shown in a chart displaying the +/// ranges in [rangeDownloads]. +/// +/// The 'i'th entry in the iterable is a list of the download values +/// (y coordinates) for the 'i'th week (x coordinate). +Iterable> prepareWeekLists( + List totals, + List rangeDownloads, + int displayLength, +) { + final result = >[]; + + final showOther = + totals[0] > rangeDownloads.fold(0, (sum, d) => sum + d.counts[0]); + + for (int week = 0; week < displayLength; week++) { + final weekList = []; + if (showOther) { + weekList.add(totals[week] - + rangeDownloads.fold(0, (sum, d) => sum + d.counts[week])); + } + rangeDownloads.forEach((d) => weekList.add(d.counts[week])); + result.add(weekList); + } + return result.reversed; +} diff --git a/pkg/web_app/lib/src/widget/downloads_chart/widget.dart b/pkg/web_app/lib/src/widget/downloads_chart/widget.dart index 009f08d93b..dba278a313 100644 --- a/pkg/web_app/lib/src/widget/downloads_chart/widget.dart +++ b/pkg/web_app/lib/src/widget/downloads_chart/widget.dart @@ -7,6 +7,8 @@ import 'dart:convert'; import 'package:_pub_shared/data/download_counts_data.dart'; import 'package:web/web.dart'; +import 'computations.dart'; + void create(HTMLElement element, Map options) { final dataPoints = options['points']; if (dataPoints == null) { @@ -18,7 +20,35 @@ void create(HTMLElement element, Map options) { final data = WeeklyVersionDownloadCounts.fromJson((utf8.decoder .fuse(json.decoder) .convert(base64Decode(dataPoints)) as Map)); - drawChart(svg, data); + + final weeksToDisplay = data.totalWeeklyDownloads.length > 28 + ? 28 + : data.totalWeeklyDownloads.length; + + final majorDisplayLists = prepareWeekLists( + data.totalWeeklyDownloads, + data.majorRangeWeeklyDownloads, + weeksToDisplay, + ); + final majorRanges = data.majorRangeWeeklyDownloads.map((e) => e.versionRange); + + // final minorDisplayLists = prepareWeekLists( + // data.totalWeeklyDownloads, + // data.minorRangeWeeklyDownloads, + // weeksToDisplay, + // ); + // final minorRanges = data.minorRangeWeeklyDownloads.map((e) => e.versionRange); + + // final patchDisplayLists = prepareWeekLists( + // data.totalWeeklyDownloads, + // data.patchRangeWeeklyDownloads, + // weeksToDisplay, + // ); + // final patchRanges = data.patchRangeWeeklyDownloads.map((e) => e.versionRange); + + drawChart(svg, majorRanges, majorDisplayLists, data.newestDate); } -void drawChart(Element svg, WeeklyVersionDownloadCounts data) {} +void drawChart(Element svg, Iterable ranges, Iterable> values, + DateTime newestData, + {bool stacked = true}) {} diff --git a/pkg/web_app/test/widget/downloads_chart/downloads_chart_test.dart b/pkg/web_app/test/widget/downloads_chart/downloads_chart_test.dart new file mode 100644 index 0000000000..c94aff92ca --- /dev/null +++ b/pkg/web_app/test/widget/downloads_chart/downloads_chart_test.dart @@ -0,0 +1,81 @@ +// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file +// 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:test/test.dart'; +import 'package:web_app/src/widget/downloads_chart/computations.dart'; +// import 'package:web_app/src/widget/downloads_chart/widget.dart'; + +void main() { + test('week lists - simpler', () { + final List l1 = List.from(List.filled(10, 10)) + ..addAll(List.filled(10, 20)) + ..add(2) + ..addAll(List.filled(31, 0)); + + final List l2 = List.from(List.filled(10, 20)) + ..addAll(List.filled(10, 40)) + ..add(4) + ..addAll(List.filled(31, 0)); + + final List l3 = List.from(List.filled(10, 70)) + ..addAll(List.filled(10, 140)) + ..add(14) + ..addAll(List.filled(31, 0)); + + final totals = List.from(List.filled(10, 110)) + ..addAll(List.filled(10, 220)) + ..add(22) + ..addAll(List.filled(31, 0)); + + final patchRangeDownloads = [ + (counts: l1, versionRange: '>=6.2.0-0 <6.2.1'), + (counts: l1, versionRange: '>=6.2.1-0 <6.2.2'), + (counts: l1, versionRange: '>=6.3.1-0 <6.3.2'), + (counts: l1, versionRange: '>=6.4.0-0 <6.4.1'), + (counts: l1, versionRange: '>=6.6.1-0 <6.6.2'), + ]; + + final minorRangeDownloads = [ + (counts: l1, versionRange: '>=6.1.0-0 <6.2.0'), + (counts: l2, versionRange: '>=6.2.0-0 <6.3.0'), + (counts: l1, versionRange: '>=6.3.0-0 <6.4.0'), + (counts: l1, versionRange: '>=6.4.0-0 <6.5.0'), + (counts: l1, versionRange: '>=6.6.0-0 <6.7.0') + ]; + + final majorRangeDownloads = [ + (counts: l1, versionRange: '>=1.0.0-0 <2.0.0'), + (counts: l1, versionRange: '>=2.0.0-0 <3.0.0'), + (counts: l1, versionRange: '>=3.0.0-0 <4.0.0'), + (counts: l1, versionRange: '>=4.0.0-0 <5.0.0'), + (counts: l3, versionRange: '>=6.0.0-0 <7.0.0') + ]; + + final w1 = prepareWeekLists(totals, majorRangeDownloads, 52).toList(); + final w2 = prepareWeekLists(totals, minorRangeDownloads, 52).toList(); + final w3 = prepareWeekLists(totals, patchRangeDownloads, 52).toList(); + + for (int i = 42; i < 52; i++) { + expect(w1[i], [10, 10, 10, 10, 70]); + expect(w2[i], [50, 10, 20, 10, 10, 10]); + expect(w3[i], [60, 10, 10, 10, 10, 10]); + } + + for (int i = 32; i < 42; i++) { + expect(w1[i], [20, 20, 20, 20, 140]); + expect(w2[i], [100, 20, 40, 20, 20, 20]); + expect(w3[i], [120, 20, 20, 20, 20, 20]); + } + + expect(w1[31], [2, 2, 2, 2, 14]); + expect(w2[31], [10, 2, 4, 2, 2, 2]); + expect(w3[31], [12, 2, 2, 2, 2, 2]); + + for (int i = 0; i < 31; i++) { + expect(w1[i], [0, 0, 0, 0, 0]); + expect(w2[i], [0, 0, 0, 0, 0, 0]); + expect(w3[i], [0, 0, 0, 0, 0, 0]); + } + }); +} From df1406197b1ac3ceeb6ec99fb8f8237fed5402d2 Mon Sep 17 00:00:00 2001 From: Sarah Zakarias Date: Sat, 21 Dec 2024 07:47:34 +0000 Subject: [PATCH 2/4] use math.min --- pkg/web_app/lib/src/widget/downloads_chart/widget.dart | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/pkg/web_app/lib/src/widget/downloads_chart/widget.dart b/pkg/web_app/lib/src/widget/downloads_chart/widget.dart index dba278a313..0f335a9e46 100644 --- a/pkg/web_app/lib/src/widget/downloads_chart/widget.dart +++ b/pkg/web_app/lib/src/widget/downloads_chart/widget.dart @@ -3,6 +3,7 @@ // BSD-style license that can be found in the LICENSE file. import 'dart:convert'; +import 'dart:math' as math; import 'package:_pub_shared/data/download_counts_data.dart'; import 'package:web/web.dart'; @@ -21,9 +22,7 @@ void create(HTMLElement element, Map options) { .fuse(json.decoder) .convert(base64Decode(dataPoints)) as Map)); - final weeksToDisplay = data.totalWeeklyDownloads.length > 28 - ? 28 - : data.totalWeeklyDownloads.length; + final weeksToDisplay = math.min(28, data.totalWeeklyDownloads.length); final majorDisplayLists = prepareWeekLists( data.totalWeeklyDownloads, From e903261b70d9d905a2563049332e2c050cf87ec9 Mon Sep 17 00:00:00 2001 From: Sarah Zakarias Date: Mon, 6 Jan 2025 10:12:36 +0000 Subject: [PATCH 3/4] remove out commented code --- .../lib/src/widget/downloads_chart/widget.dart | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/pkg/web_app/lib/src/widget/downloads_chart/widget.dart b/pkg/web_app/lib/src/widget/downloads_chart/widget.dart index 0f335a9e46..f4b2da1848 100644 --- a/pkg/web_app/lib/src/widget/downloads_chart/widget.dart +++ b/pkg/web_app/lib/src/widget/downloads_chart/widget.dart @@ -31,20 +31,6 @@ void create(HTMLElement element, Map options) { ); final majorRanges = data.majorRangeWeeklyDownloads.map((e) => e.versionRange); - // final minorDisplayLists = prepareWeekLists( - // data.totalWeeklyDownloads, - // data.minorRangeWeeklyDownloads, - // weeksToDisplay, - // ); - // final minorRanges = data.minorRangeWeeklyDownloads.map((e) => e.versionRange); - - // final patchDisplayLists = prepareWeekLists( - // data.totalWeeklyDownloads, - // data.patchRangeWeeklyDownloads, - // weeksToDisplay, - // ); - // final patchRanges = data.patchRangeWeeklyDownloads.map((e) => e.versionRange); - drawChart(svg, majorRanges, majorDisplayLists, data.newestDate); } From b2d3a3cfe850e7d2c86f57395fd8f2507a714d65 Mon Sep 17 00:00:00 2001 From: Sarah Zakarias Date: Mon, 6 Jan 2025 12:09:07 +0000 Subject: [PATCH 4/4] toList --- pkg/web_app/lib/src/widget/downloads_chart/computations.dart | 4 ++-- pkg/web_app/lib/src/widget/downloads_chart/widget.dart | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/web_app/lib/src/widget/downloads_chart/computations.dart b/pkg/web_app/lib/src/widget/downloads_chart/computations.dart index aa0a211c2d..1d59151509 100644 --- a/pkg/web_app/lib/src/widget/downloads_chart/computations.dart +++ b/pkg/web_app/lib/src/widget/downloads_chart/computations.dart @@ -13,7 +13,7 @@ Iterable prepareRanges(List rangeDownloads) { /// /// The 'i'th entry in the iterable is a list of the download values /// (y coordinates) for the 'i'th week (x coordinate). -Iterable> prepareWeekLists( +List> prepareWeekLists( List totals, List rangeDownloads, int displayLength, @@ -32,5 +32,5 @@ Iterable> prepareWeekLists( rangeDownloads.forEach((d) => weekList.add(d.counts[week])); result.add(weekList); } - return result.reversed; + return result.reversed.toList(); } diff --git a/pkg/web_app/lib/src/widget/downloads_chart/widget.dart b/pkg/web_app/lib/src/widget/downloads_chart/widget.dart index f4b2da1848..009bf59458 100644 --- a/pkg/web_app/lib/src/widget/downloads_chart/widget.dart +++ b/pkg/web_app/lib/src/widget/downloads_chart/widget.dart @@ -35,5 +35,5 @@ void create(HTMLElement element, Map options) { } void drawChart(Element svg, Iterable ranges, Iterable> values, - DateTime newestData, + DateTime newestDate, {bool stacked = true}) {}