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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 615528aa77577881d7658b0ce059e9e3972ce4285aeb3c1081c4347dd1a20ca4
4
- data.tar.gz: 483cc9b7535da95ca2249813e5ad8ff924334f65c8b7fa84c5705367a9d1b147
3
+ metadata.gz: '09a5b3a17e5af7e9896e01d5ed661f72d08d99939968b00503dfb8da9773dea2'
4
+ data.tar.gz: 2d2c2a8db4412d9d4412b507dca2951968a562d1d70e82d5e400d67ea09b4556
5
5
  SHA512:
6
- metadata.gz: 36acebeef4d036c6ed043f0073177944c390d5c80ba6ef162319f6a9bbb67bb2762ca4a345f4160d0f1d3fdc7047e257474920c09da9c5770c8a0e45a4748e59
7
- data.tar.gz: 2c6f92cdb1d61b49ed7b318bc5c2108649ad387e9af51c312ade43f1522f3cc842dc949dde7d0373d41dc25630bbf9e5a3f883fc9255423ecd6e19c9008b3a4f
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
- #{label_issues problems.size} were not visible on the board for some period of time. This may impact
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}</div>#{shrink_svg svg}"
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
@@ -74,6 +74,7 @@ class Downloader
74
74
  download_statuses
75
75
  find_board_ids.each do |id|
76
76
  board = download_board_configuration board_id: id
77
+ board.project_config = @download_config.project_config
77
78
  download_issues board: board
78
79
  end
79
80
  download_users
@@ -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
@@ -77,5 +77,4 @@ class PullRequestCycleTimeScatterplot < TimeBasedScatterplot
77
77
  text << "], Files changed: #{to_human_readable pull_request.changed_files}"
78
78
  text
79
79
  end
80
-
81
80
  end
@@ -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." if data_sets.empty?
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
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jirametrics
3
3
  version: !ruby/object:Gem::Version
4
- version: '2.25'
4
+ version: 2.25.2pre1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Bowler