jirametrics 2.25 → 2.25.2pre1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of jirametrics might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/lib/jirametrics/cumulative_flow_diagram.rb +5 -0
- data/lib/jirametrics/daily_view.rb +1 -1
- data/lib/jirametrics/data_quality_report.rb +3 -1
- data/lib/jirametrics/dependency_chart.rb +1 -1
- data/lib/jirametrics/downloader.rb +1 -0
- data/lib/jirametrics/flow_efficiency_scatterplot.rb +1 -1
- data/lib/jirametrics/html/cumulative_flow_diagram.erb +7 -8
- data/lib/jirametrics/html/index.erb +1 -0
- data/lib/jirametrics/html_generator.rb +2 -1
- data/lib/jirametrics/html_report_config.rb +2 -1
- data/lib/jirametrics/project_config.rb +10 -0
- data/lib/jirametrics/pull_request_cycle_time_scatterplot.rb +0 -1
- data/lib/jirametrics/time_based_scatterplot.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: '09a5b3a17e5af7e9896e01d5ed661f72d08d99939968b00503dfb8da9773dea2'
|
|
4
|
+
data.tar.gz: 2d2c2a8db4412d9d4412b507dca2951968a562d1d70e82d5e400d67ea09b4556
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: c08239469e00f99f48f3c8e461a9e3e0bd18a2eee56cc3b8546203c747a30aeb1bf8df30256f83d76ee1c777a198c22a02850eca0bd316cb990d958adc1dd89c
|
|
7
|
+
data.tar.gz: ecffbbf4c385d0971ab50e3c8d56b45a8a59504b89e33cdf161fdab85946de241f96a2547bd51eb43dbb89c2af9a0a6b2d18870e954e26b20b55477f5ea435d9
|
|
@@ -64,6 +64,11 @@ class CumulativeFlowDiagram < ChartBase
|
|
|
64
64
|
<b>average throughput (TP)</b> (items completed per day). Use the checkbox above the chart to toggle
|
|
65
65
|
between the triangle and the normal data tooltips.
|
|
66
66
|
</div>
|
|
67
|
+
<div class="p">
|
|
68
|
+
CT and TP require a future point C where cumulative completions catch up to current arrivals.
|
|
69
|
+
When the cursor is near the right edge and that point falls outside the visible date range,
|
|
70
|
+
CT and TP cannot be calculated and are hidden; only WIP is shown.
|
|
71
|
+
</div>
|
|
67
72
|
HTML
|
|
68
73
|
instance_eval(&block)
|
|
69
74
|
end
|
|
@@ -24,7 +24,7 @@ class DailyView < ChartBase
|
|
|
24
24
|
def run
|
|
25
25
|
aging_issues = select_aging_issues
|
|
26
26
|
|
|
27
|
-
return "<h1 class='foldable'>#{@header_text}</h1>There are no items currently in progress" if aging_issues.empty?
|
|
27
|
+
return "<h1 class='foldable'>#{@header_text}</h1><div>There are no items currently in progress</div>" if aging_issues.empty?
|
|
28
28
|
|
|
29
29
|
result = +''
|
|
30
30
|
result << render_top_text(binding)
|
|
@@ -434,8 +434,10 @@ class DataQualityReport < ChartBase
|
|
|
434
434
|
end
|
|
435
435
|
|
|
436
436
|
def render_issue_not_visible_on_board problems
|
|
437
|
+
unique_issue_count = problems.map(&:first).uniq.size
|
|
437
438
|
<<-HTML
|
|
438
|
-
#{
|
|
439
|
+
#{problems.size} #{'time'.then { |w| problems.size == 1 ? w : "#{w}s" }} across #{label_issues unique_issue_count},
|
|
440
|
+
an item was not visible on the board. This may impact
|
|
439
441
|
timings as the work was likely to have been forgotten if it wasn't visible. An issue can be not visible
|
|
440
442
|
for two reasons: the issue was in a status that is not mapped to any visible column on the board
|
|
441
443
|
(look in "unmapped statuses" on your board), or for scrum boards, the issue was not in an active sprint.
|
|
@@ -57,7 +57,7 @@ class DependencyChart < ChartBase
|
|
|
57
57
|
end
|
|
58
58
|
|
|
59
59
|
svg = execute_graphviz(dot_graph.join("\n"))
|
|
60
|
-
"<h1>#{@header_text}</h1><div>#{@description_text}
|
|
60
|
+
"<h1 class='foldable'>#{@header_text}</h1><div>#{@description_text}#{shrink_svg svg}</div>"
|
|
61
61
|
end
|
|
62
62
|
|
|
63
63
|
def link_rules &block
|
|
@@ -63,7 +63,7 @@ class FlowEfficiencyScatterplot < ChartBase
|
|
|
63
63
|
end
|
|
64
64
|
|
|
65
65
|
if data_sets.empty?
|
|
66
|
-
return "<h1 class='foldable'>#{@header_text}</h1>No data matched the selected criteria. Nothing to show
|
|
66
|
+
return "<h1 class='foldable'>#{@header_text}</h1><div>No data matched the selected criteria. Nothing to show.</div>"
|
|
67
67
|
end
|
|
68
68
|
|
|
69
69
|
wrap_and_render(binding, __FILE__)
|
|
@@ -271,14 +271,6 @@ if (!Chart.Tooltip.positioners.legendItem) {
|
|
|
271
271
|
ctx.moveTo(xA, yB);
|
|
272
272
|
ctx.lineTo(xC, yA);
|
|
273
273
|
ctx.stroke();
|
|
274
|
-
} else {
|
|
275
|
-
// C outside range: dashed extension to right edge
|
|
276
|
-
ctx.setLineDash([4, 2]);
|
|
277
|
-
ctx.lineWidth = 1.5;
|
|
278
|
-
ctx.beginPath();
|
|
279
|
-
ctx.moveTo(xA, yA);
|
|
280
|
-
ctx.lineTo(ca.right, yA);
|
|
281
|
-
ctx.stroke();
|
|
282
274
|
}
|
|
283
275
|
|
|
284
276
|
ctx.restore();
|
|
@@ -310,6 +302,12 @@ if (!Chart.Tooltip.positioners.legendItem) {
|
|
|
310
302
|
id: 'cfdFlowMetrics',
|
|
311
303
|
|
|
312
304
|
afterInit(chart) {
|
|
305
|
+
// Guard against being applied to non-CFD charts (Chart.js may fire
|
|
306
|
+
// inline plugin hooks on other charts when plugins share an id with
|
|
307
|
+
// a cached entry).
|
|
308
|
+
const ds = chart.data.datasets;
|
|
309
|
+
if (!ds || !ds[0] || !ds[0].data || !ds[0].data.length) return;
|
|
310
|
+
|
|
313
311
|
const { arrivals, departures } = buildArrays(chart);
|
|
314
312
|
const dates = chart.data.datasets[0].data.map(d => new Date(d.x).getTime());
|
|
315
313
|
chart._flowMetrics = {
|
|
@@ -426,6 +424,7 @@ if (!Chart.Tooltip.positioners.legendItem) {
|
|
|
426
424
|
|
|
427
425
|
afterDraw(chart) {
|
|
428
426
|
const fm = chart._flowMetrics;
|
|
427
|
+
if (!fm) return;
|
|
429
428
|
drawTrendLines(chart, fm);
|
|
430
429
|
// Triangle is on the overlay canvas — no drawing needed here.
|
|
431
430
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
<html>
|
|
2
2
|
<head>
|
|
3
3
|
<meta charset="UTF-8">
|
|
4
|
+
<title><%= project_name.empty? ? 'JiraMetrics' : "JiraMetrics - #{project_name}" %></title>
|
|
4
5
|
<link rel="icon" type="image/png" href="https://github.com/mikebowler/jirametrics/blob/main/favicon.png?raw=true" />
|
|
5
6
|
<script src="https://cdn.jsdelivr.net/npm/moment@2.29.1/moment.js"></script>
|
|
6
7
|
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
|
|
@@ -3,8 +3,9 @@
|
|
|
3
3
|
class HtmlGenerator
|
|
4
4
|
attr_accessor :file_system, :settings
|
|
5
5
|
|
|
6
|
-
def create_html output_filename:, settings:
|
|
6
|
+
def create_html output_filename:, settings:, project_name: ''
|
|
7
7
|
@settings = settings
|
|
8
|
+
project_name = project_name.to_s
|
|
8
9
|
html_directory = "#{Pathname.new(File.realpath(__FILE__)).dirname}/html"
|
|
9
10
|
css = load_css html_directory: html_directory
|
|
10
11
|
javascript = file_system.load(File.join(html_directory, 'index.js'))
|
|
@@ -78,7 +78,8 @@ class HtmlReportConfig < HtmlGenerator
|
|
|
78
78
|
|
|
79
79
|
html create_footer
|
|
80
80
|
|
|
81
|
-
create_html output_filename: @file_config.output_filename, settings: settings
|
|
81
|
+
create_html output_filename: @file_config.output_filename, settings: settings,
|
|
82
|
+
project_name: @file_config.project_config.name
|
|
82
83
|
end
|
|
83
84
|
|
|
84
85
|
def file_system
|
|
@@ -598,6 +598,16 @@ class ProjectConfig
|
|
|
598
598
|
if status_becomes
|
|
599
599
|
status_becomes = [status_becomes] unless status_becomes.is_a? Array
|
|
600
600
|
|
|
601
|
+
status_becomes.each do |status_name|
|
|
602
|
+
next if status_name == :backlog
|
|
603
|
+
|
|
604
|
+
found = possible_statuses.find_all_by_name status_name
|
|
605
|
+
if found.empty?
|
|
606
|
+
raise "discard_changes_before: Status #{status_name.inspect} not found. " \
|
|
607
|
+
"Possible statuses are: #{possible_statuses}"
|
|
608
|
+
end
|
|
609
|
+
end
|
|
610
|
+
|
|
601
611
|
block = lambda do |issue|
|
|
602
612
|
trigger_statuses = status_becomes.collect do |status_name|
|
|
603
613
|
if status_name == :backlog
|
|
@@ -18,7 +18,7 @@ class TimeBasedScatterplot < ChartBase
|
|
|
18
18
|
overall_percent_line = calculate_percent_line(items)
|
|
19
19
|
@percentage_lines << [overall_percent_line, CssVariable['--cycletime-scatterplot-overall-trendline-color']]
|
|
20
20
|
|
|
21
|
-
return "<h1>#{@header_text}</h1>No data matched the selected criteria. Nothing to show
|
|
21
|
+
return "<h1 class='foldable'>#{@header_text}</h1><div>No data matched the selected criteria. Nothing to show.</div>" if data_sets.empty?
|
|
22
22
|
|
|
23
23
|
wrap_and_render(binding, __FILE__)
|
|
24
24
|
end
|