diff --git a/.github/workflows/examples.yml b/.github/workflows/examples.yml index 4d597531..63e504c2 100644 --- a/.github/workflows/examples.yml +++ b/.github/workflows/examples.yml @@ -289,7 +289,6 @@ jobs: @use.patterns */* +lowlighter/metrics - +lowlighter/brain output_action: none delay: 120 user: lowlighter diff --git a/source/plugins/lines/examples.yml b/source/plugins/lines/examples.yml index d08c816f..b2afeb1f 100644 --- a/source/plugins/lines/examples.yml +++ b/source/plugins/lines/examples.yml @@ -20,4 +20,3 @@ @use.patterns */* +lowlighter/metrics - +lowlighter/brain diff --git a/source/plugins/lines/index.mjs b/source/plugins/lines/index.mjs index 8903681d..1888c6cc 100644 --- a/source/plugins/lines/index.mjs +++ b/source/plugins/lines/index.mjs @@ -71,54 +71,60 @@ export default async function({login, data, imports, rest, q, account}, {enabled //Diff graphs if (sections.includes("history")) { - //Generate SVG - const height = 315, width = 480 - const margin = 5, offset = 34 - const {d3} = imports const weeks = result.weeks.filter(({date}) => !_history_limit ? true : new Date(date) > new Date(new Date().getFullYear() - _history_limit, 0, 0)) - const d3n = new imports.D3node() - const svg = d3n.createSVG(width, height) + if (weeks.length) { + //Generate SVG + const height = 315, width = 480 + const margin = 5, offset = 34 + const {d3} = imports + const d3n = new imports.D3node() + const svg = d3n.createSVG(width, height) - //Time range - const start = new Date(weeks.at(0).date) - const end = new Date(weeks.at(-1).date) - const x = d3.scaleTime() - .domain([start, end]) - .range([margin + offset, width - (offset + margin)]) - svg.append("g") - .attr("transform", `translate(0,${height - (offset + margin)})`) - .call(d3.axisBottom(x)) - .selectAll("text") - .attr("transform", "translate(-5,5) rotate(-45)") - .style("text-anchor", "end") - .style("font-size", 20) + //Time range + const start = new Date(weeks.at(0).date) + const end = new Date(weeks.at(-1).date) + const x = d3.scaleTime() + .domain([start, end]) + .range([margin + offset, width - (offset + margin)]) + svg.append("g") + .attr("transform", `translate(0,${height - (offset + margin)})`) + .call(d3.axisBottom(x)) + .selectAll("text") + .attr("transform", "translate(-5,5) rotate(-45)") + .style("text-anchor", "end") + .style("font-size", 20) - //Diff range - const points = weeks.flatMap(({added, deleted, changed}) => [added + changed, deleted + changed]) - const extremum = Math.max(...points) - const y = d3.scaleLinear() - .domain([extremum, -extremum]) - .range([margin, height - (offset + margin)]) - svg.append("g") - .attr("transform", `translate(${margin + offset},0)`) - .call(d3.axisLeft(y).ticks(7).tickFormat(d3.format(".2s"))) - .selectAll("text") - .style("font-size", 20) + //Diff range + const points = weeks.flatMap(({added, deleted, changed}) => [added + changed, deleted + changed]) + const extremum = Math.max(...points) + const y = d3.scaleLinear() + .domain([extremum, -extremum]) + .range([margin, height - (offset + margin)]) + svg.append("g") + .attr("transform", `translate(${margin + offset},0)`) + .call(d3.axisLeft(y).ticks(7).tickFormat(d3.format(".2s"))) + .selectAll("text") + .style("font-size", 20) - //Generate history - for (const {type, sign, fill} of [{type: "added", sign: +1, fill: "rgb(63, 185, 80)"}, {type: "deleted", sign: -1, fill: "rgb(218, 54, 51)"}]) { - svg.append("path") - .datum(weeks.map(({date, ...diff}) => [new Date(date), sign * (diff[type] + diff.changed)])) - .attr( - "d", - d3.area() - .x(d => x(d[0])) - .y0(d => y(d[1])) - .y1(() => y(0)), - ) - .attr("fill", fill) + //Generate history + for (const {type, sign, fill} of [{type: "added", sign: +1, fill: "rgb(63, 185, 80)"}, {type: "deleted", sign: -1, fill: "rgb(218, 54, 51)"}]) { + svg.append("path") + .datum(weeks.map(({date, ...diff}) => [new Date(date), sign * (diff[type] + diff.changed)])) + .attr( + "d", + d3.area() + .x(d => x(d[0])) + .y0(d => y(d[1])) + .y1(() => y(0)), + ) + .attr("fill", fill) + } + result.history = d3n.svgString() + } + else { + console.debug(`metrics/compute/${login}/plugins > lines > no history data`) + result.history = null } - result.history = d3n.svgString() } //Results diff --git a/tests/cases/lines.plugin.yml b/tests/cases/lines.plugin.yml index f824b141..3c684a5a 100644 --- a/tests/cases/lines.plugin.yml +++ b/tests/cases/lines.plugin.yml @@ -18,6 +18,5 @@ @use.patterns */* +lowlighter/metrics - +lowlighter/brain use_mocked_data: 'yes' verify: 'yes'