Skip to content

Commit 24aac68

Browse files
committed
Move JS to own file, re-use fetchCsvData, refactor
1 parent be4bca5 commit 24aac68

File tree

2 files changed

+60
-55
lines changed

2 files changed

+60
-55
lines changed

by-year.html

Lines changed: 3 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -25,65 +25,13 @@
2525
<link rel="stylesheet" href="style.css" />
2626

2727
<script src="https://www.gstatic.com/charts/loader.js"></script>
28+
<script src="script.js" defer></script>
29+
<script src="by-year.js" defer></script>
2830
<script src="https://unpkg.com/[email protected]/dist/d3.min.js"></script>
2931
<script>
30-
async function fetchCsvData(url) {
31-
const response = await fetch(url);
32-
const csvText = await response.text();
33-
return d3.csvParseRows(csvText, d3.autoType);
34-
}
35-
36-
function processData(data) {
37-
const countsPerYear = {};
38-
const today = new Date();
39-
data.forEach((item) => {
40-
const joinYear = new Date(item[2]).getFullYear();
41-
countsPerYear[joinYear] = countsPerYear[joinYear] || { joins: 0, leaves: 0 };
42-
countsPerYear[joinYear].joins++;
43-
if (item[3]) {
44-
const leaveYear = new Date(item[3]).getFullYear();
45-
countsPerYear[leaveYear] = countsPerYear[leaveYear] || {
46-
joins: 0,
47-
leaves: 0,
48-
};
49-
countsPerYear[leaveYear].leaves++;
50-
}
51-
});
52-
const startYear = Object.keys(countsPerYear)[0];
53-
const endYear = today.getFullYear();
54-
for (let year = startYear; year <= endYear; year++) {
55-
countsPerYear[year] = countsPerYear[year] || { joins: 0, leaves: 0 };
56-
}
57-
return countsPerYear;
58-
}
59-
60-
function convertDataToArray(countsPerYear) {
61-
const countsPerYearArray = Object.entries(countsPerYear).map(
62-
([year, counts]) => [year, counts.joins],
63-
);
64-
countsPerYearArray.unshift(["Year", "New core devs"]);
65-
return countsPerYearArray;
66-
}
67-
68-
function drawBarChart(rows) {
69-
const data = new google.visualization.arrayToDataTable(rows);
70-
const options = {
71-
bars: "vertical",
72-
legend: { position: "none" },
73-
axes: { x: { 0: { label: "" } } },
74-
};
75-
const chart = new google.charts.Bar(document.getElementById("chart_div"));
76-
chart.draw(data, options);
77-
}
78-
7932
google.charts.load("current", { packages: ["bar"] });
8033
google.charts.setOnLoadCallback(async function () {
81-
const url =
82-
"https://raw.githubusercontent.com/python/devguide/main/core-developers/developers.csv";
83-
const csvData = await fetchCsvData(url);
84-
const processedData = processData(csvData);
85-
const dataArray = convertDataToArray(processedData);
86-
drawBarChart(dataArray);
34+
getDataAndDrawBarChart();
8735
});
8836
</script>
8937
</head>

by-year.js

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
function processData(data) {
2+
const countsPerYear = {};
3+
const today = new Date();
4+
data.forEach((item) => {
5+
const joinYear = new Date(item[2]).getFullYear();
6+
countsPerYear[joinYear] = countsPerYear[joinYear] || { joins: 0, leaves: 0 };
7+
countsPerYear[joinYear].joins++;
8+
if (item[3]) {
9+
const leaveYear = new Date(item[3]).getFullYear();
10+
countsPerYear[leaveYear] = countsPerYear[leaveYear] || {
11+
joins: 0,
12+
leaves: 0,
13+
};
14+
countsPerYear[leaveYear].leaves++;
15+
}
16+
});
17+
const startYear = Object.keys(countsPerYear)[0];
18+
const endYear = today.getFullYear();
19+
for (let year = startYear; year <= endYear; year++) {
20+
countsPerYear[year] = countsPerYear[year] || { joins: 0, leaves: 0 };
21+
}
22+
return countsPerYear;
23+
}
24+
25+
function convertDataToArray(countsPerYear) {
26+
const countsPerYearArray = Object.entries(countsPerYear).map(([year, counts]) => [
27+
year,
28+
counts.joins,
29+
]);
30+
countsPerYearArray.unshift(["Year", "New core devs"]);
31+
return countsPerYearArray;
32+
}
33+
34+
function drawBarChart(rows) {
35+
// https://developers.google.com/chart/interactive/docs/gallery/barchart
36+
const container = document.getElementById("chart_div");
37+
const chart = new google.charts.Bar(container);
38+
const dataTable = new google.visualization.arrayToDataTable(rows);
39+
40+
const options = {
41+
bars: "vertical",
42+
legend: { position: "none" },
43+
axes: { x: { 0: { label: "" } } },
44+
};
45+
46+
chart.draw(dataTable, options);
47+
}
48+
49+
async function getDataAndDrawBarChart() {
50+
const url =
51+
"https://raw.githubusercontent.com/python/devguide/main/core-developers/developers.csv";
52+
53+
const csvData = await fetchCsvData(url);
54+
const processedData = processData(csvData);
55+
const dataArray = convertDataToArray(processedData);
56+
drawBarChart(dataArray);
57+
}

0 commit comments

Comments
 (0)