jirametrics 2.14 → 2.22

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.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/lib/jirametrics/aging_work_bar_chart.rb +176 -134
  3. data/lib/jirametrics/anonymizer.rb +8 -6
  4. data/lib/jirametrics/atlassian_document_format.rb +3 -3
  5. data/lib/jirametrics/bar_chart_range.rb +17 -0
  6. data/lib/jirametrics/board.rb +4 -0
  7. data/lib/jirametrics/board_config.rb +3 -1
  8. data/lib/jirametrics/change_item.rb +11 -4
  9. data/lib/jirametrics/chart_base.rb +34 -2
  10. data/lib/jirametrics/cycletime_config.rb +22 -4
  11. data/lib/jirametrics/cycletime_histogram.rb +3 -1
  12. data/lib/jirametrics/cycletime_scatterplot.rb +36 -17
  13. data/lib/jirametrics/daily_view.rb +6 -20
  14. data/lib/jirametrics/daily_wip_by_age_chart.rb +3 -4
  15. data/lib/jirametrics/daily_wip_by_blocked_stalled_chart.rb +13 -3
  16. data/lib/jirametrics/daily_wip_chart.rb +1 -1
  17. data/lib/jirametrics/data_quality_report.rb +8 -3
  18. data/lib/jirametrics/dependency_chart.rb +4 -1
  19. data/lib/jirametrics/downloader.rb +34 -99
  20. data/lib/jirametrics/downloader_for_cloud.rb +202 -0
  21. data/lib/jirametrics/downloader_for_data_center.rb +94 -0
  22. data/lib/jirametrics/examples/standard_project.rb +9 -9
  23. data/lib/jirametrics/expedited_chart.rb +1 -1
  24. data/lib/jirametrics/exporter.rb +12 -5
  25. data/lib/jirametrics/file_system.rb +24 -1
  26. data/lib/jirametrics/fix_version.rb +13 -0
  27. data/lib/jirametrics/flow_efficiency_scatterplot.rb +1 -1
  28. data/lib/jirametrics/groupable_issue_chart.rb +7 -1
  29. data/lib/jirametrics/html/aging_work_bar_chart.erb +2 -1
  30. data/lib/jirametrics/html/aging_work_in_progress_chart.erb +3 -1
  31. data/lib/jirametrics/html/aging_work_table.erb +2 -0
  32. data/lib/jirametrics/html/collapsible_issues_panel.erb +2 -2
  33. data/lib/jirametrics/html/cycletime_histogram.erb +4 -2
  34. data/lib/jirametrics/html/cycletime_scatterplot.erb +6 -6
  35. data/lib/jirametrics/html/daily_wip_chart.erb +2 -0
  36. data/lib/jirametrics/html/estimate_accuracy_chart.erb +2 -0
  37. data/lib/jirametrics/html/expedited_chart.erb +3 -1
  38. data/lib/jirametrics/html/flow_efficiency_scatterplot.erb +2 -0
  39. data/lib/jirametrics/html/index.css +16 -9
  40. data/lib/jirametrics/html/index.erb +3 -35
  41. data/lib/jirametrics/html/index.js +114 -0
  42. data/lib/jirametrics/html/sprint_burndown.erb +11 -3
  43. data/lib/jirametrics/html/throughput_chart.erb +2 -2
  44. data/lib/jirametrics/html_generator.rb +31 -0
  45. data/lib/jirametrics/html_report_config.rb +8 -25
  46. data/lib/jirametrics/issue.rb +125 -19
  47. data/lib/jirametrics/jira_gateway.rb +55 -17
  48. data/lib/jirametrics/project_config.rb +22 -2
  49. data/lib/jirametrics/raw_javascript.rb +13 -0
  50. data/lib/jirametrics/settings.json +3 -1
  51. data/lib/jirametrics/sprint.rb +12 -0
  52. data/lib/jirametrics/sprint_burndown.rb +6 -2
  53. data/lib/jirametrics/stitcher.rb +75 -0
  54. data/lib/jirametrics.rb +26 -70
  55. metadata +10 -3
@@ -0,0 +1,75 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Stitcher < HtmlGenerator
4
+ class StitchContent
5
+ include ValueEquality
6
+
7
+ attr_reader :file, :title, :content, :type
8
+
9
+ def initialize file:, title:, type:, content:
10
+ @file = file
11
+ @title = title
12
+ @content = content
13
+ @type = type
14
+ end
15
+ end
16
+
17
+ attr_reader :loaded_files, :all_stitches
18
+
19
+ def initialize file_system:
20
+ super()
21
+ self.file_system = file_system
22
+ @all_stitches = []
23
+ @loaded_files = []
24
+ end
25
+
26
+ def run stitch_file:
27
+ output_filename = make_output_filename stitch_file
28
+ file_system.log "Creating file #{output_filename.inspect}", also_write_to_stderr: true
29
+ erb = ERB.new file_system.load(stitch_file)
30
+ @sections = [[erb.result(binding), :body]]
31
+ create_html output_filename: output_filename, settings: {}
32
+ end
33
+
34
+ def make_output_filename input_filename
35
+ if /^(.+)\.erb$/ =~ input_filename
36
+ "#{$1}.html"
37
+ else
38
+ "#{input_filename}.html"
39
+ end
40
+ end
41
+
42
+ def grab_by_title title, from_file:, type: 'chart'
43
+ parse_file from_file
44
+ stitch_content = @all_stitches.find { |s| s.file == from_file && s.title == title && s.type == type }
45
+ return stitch_content.content if stitch_content
46
+
47
+ raise "Unable to find content in file #{from_file.inspect} matching title: #{title.inspect}"
48
+ end
49
+
50
+ def parse_file filename
51
+ return false if @loaded_files.include? filename
52
+
53
+ # To match: <!-- seam-start | chart78 | GithubPrScatterplot | PR Scatterplot | chart -->
54
+ regex = /^<!-- seam-(?<seam>start|end) \| (?<id>[^|]+) \| (?<clazz>[^|]+) \| (?<title>[^|]+) \| (?<type>[^|]+) -->$/
55
+ content = nil
56
+ file_system.load(filename).lines do |line|
57
+ matches = line.match(regex)
58
+ if matches
59
+ if matches[:seam] == 'start'
60
+ content = +''
61
+ else
62
+ @all_stitches << Stitcher::StitchContent.new(
63
+ file: filename, title: matches[:title], type: matches[:type], content: content
64
+ )
65
+ content = nil
66
+ end
67
+ elsif content
68
+ content << line
69
+ end
70
+ end
71
+
72
+ @loaded_files << filename
73
+ true
74
+ end
75
+ end
data/lib/jirametrics.rb CHANGED
@@ -1,6 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'thor'
4
+ require 'require_all'
5
+
6
+ # This one does need to be loaded early. The rest will be loaded later.
7
+ require 'jirametrics/file_system'
4
8
 
5
9
  class JiraMetrics < Thor
6
10
  def self.exit_on_failure?
@@ -43,81 +47,33 @@ class JiraMetrics < Thor
43
47
 
44
48
  option :config
45
49
  desc 'info', 'Dump information about one issue'
46
- def info keys
50
+ def info key
47
51
  load_config options[:config]
48
- Exporter.instance.info(keys, name_filter: options[:name] || '*')
52
+ Exporter.instance.info(key, name_filter: options[:name] || '*')
49
53
  end
50
54
 
51
- private
52
-
53
- def load_config config_file
54
- config_file = './config.rb' if config_file.nil?
55
+ option :config
56
+ desc 'stitch', 'Dump information about one issue'
57
+ def stitch stitch_file = 'stitcher.erb'
58
+ load_config options[:config]
59
+ Exporter.instance.stitch stitch_file
60
+ end
55
61
 
56
- if File.exist? config_file
57
- # The fact that File.exist can see the file does not mean that require will be
58
- # able to load it. Convert this to an absolute pathname now for require.
59
- config_file = File.absolute_path(config_file).to_s
60
- else
61
- puts "Cannot find configuration file #{config_file.inspect}"
62
- exit 1
63
- end
62
+ no_commands do
63
+ def load_config config_file, file_system: FileSystem.new
64
+ config_file = './config.rb' if config_file.nil?
64
65
 
65
- require 'jirametrics/value_equality'
66
- require 'jirametrics/chart_base'
67
- require 'jirametrics/rules'
68
- require 'jirametrics/grouping_rules'
69
- require 'jirametrics/daily_wip_chart'
70
- require 'jirametrics/groupable_issue_chart'
71
- require 'jirametrics/css_variable'
72
- require 'jirametrics/issue_collection'
66
+ if file_system.file_exist? config_file
67
+ # The fact that File.exist can see the file does not mean that require will be
68
+ # able to load it. Convert this to an absolute pathname now for require.
69
+ config_file = File.absolute_path(config_file).to_s
70
+ else
71
+ file_system.error "Cannot find configuration file #{config_file.inspect}"
72
+ exit 1
73
+ end
73
74
 
74
- require 'jirametrics/aggregate_config'
75
- require 'jirametrics/expedited_chart'
76
- require 'jirametrics/board_config'
77
- require 'jirametrics/file_config'
78
- require 'jirametrics/jira_gateway'
79
- require 'jirametrics/trend_line_calculator'
80
- require 'jirametrics/status'
81
- require 'jirametrics/issue_link'
82
- require 'jirametrics/estimate_accuracy_chart'
83
- require 'jirametrics/status_collection'
84
- require 'jirametrics/sprint'
85
- require 'jirametrics/issue'
86
- require 'jirametrics/daily_wip_by_age_chart'
87
- require 'jirametrics/daily_wip_by_parent_chart'
88
- require 'jirametrics/aging_work_in_progress_chart'
89
- require 'jirametrics/cycletime_scatterplot'
90
- require 'jirametrics/flow_efficiency_scatterplot'
91
- require 'jirametrics/sprint_issue_change_data'
92
- require 'jirametrics/cycletime_histogram'
93
- require 'jirametrics/daily_wip_by_blocked_stalled_chart'
94
- require 'jirametrics/html_report_config'
95
- require 'jirametrics/data_quality_report'
96
- require 'jirametrics/aging_work_bar_chart'
97
- require 'jirametrics/change_item'
98
- require 'jirametrics/project_config'
99
- require 'jirametrics/dependency_chart'
100
- require 'jirametrics/cycletime_config'
101
- require 'jirametrics/tree_organizer'
102
- require 'jirametrics/aging_work_table'
103
- require 'jirametrics/sprint_burndown'
104
- require 'jirametrics/self_or_issue_dispatcher'
105
- require 'jirametrics/throughput_chart'
106
- require 'jirametrics/exporter'
107
- require 'jirametrics/file_system'
108
- require 'jirametrics/blocked_stalled_change'
109
- require 'jirametrics/board_column'
110
- require 'jirametrics/anonymizer'
111
- require 'jirametrics/downloader'
112
- require 'jirametrics/fix_version'
113
- require 'jirametrics/download_config'
114
- require 'jirametrics/columns_config'
115
- require 'jirametrics/hierarchy_table'
116
- require 'jirametrics/estimation_configuration'
117
- require 'jirametrics/board'
118
- require 'jirametrics/daily_view'
119
- require 'jirametrics/user'
120
- require 'jirametrics/atlassian_document_format'
121
- load config_file
75
+ require_rel 'jirametrics'
76
+ load config_file
77
+ end
122
78
  end
123
79
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jirametrics
3
3
  version: !ruby/object:Gem::Version
4
- version: '2.14'
4
+ version: '2.22'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Bowler
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2025-08-18 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: random-word
@@ -66,6 +66,7 @@ files:
66
66
  - lib/jirametrics/aging_work_table.rb
67
67
  - lib/jirametrics/anonymizer.rb
68
68
  - lib/jirametrics/atlassian_document_format.rb
69
+ - lib/jirametrics/bar_chart_range.rb
69
70
  - lib/jirametrics/blocked_stalled_change.rb
70
71
  - lib/jirametrics/board.rb
71
72
  - lib/jirametrics/board_column.rb
@@ -87,6 +88,8 @@ files:
87
88
  - lib/jirametrics/dependency_chart.rb
88
89
  - lib/jirametrics/download_config.rb
89
90
  - lib/jirametrics/downloader.rb
91
+ - lib/jirametrics/downloader_for_cloud.rb
92
+ - lib/jirametrics/downloader_for_data_center.rb
90
93
  - lib/jirametrics/estimate_accuracy_chart.rb
91
94
  - lib/jirametrics/estimation_configuration.rb
92
95
  - lib/jirametrics/examples/aggregated_project.rb
@@ -113,14 +116,17 @@ files:
113
116
  - lib/jirametrics/html/hierarchy_table.erb
114
117
  - lib/jirametrics/html/index.css
115
118
  - lib/jirametrics/html/index.erb
119
+ - lib/jirametrics/html/index.js
116
120
  - lib/jirametrics/html/sprint_burndown.erb
117
121
  - lib/jirametrics/html/throughput_chart.erb
122
+ - lib/jirametrics/html_generator.rb
118
123
  - lib/jirametrics/html_report_config.rb
119
124
  - lib/jirametrics/issue.rb
120
125
  - lib/jirametrics/issue_collection.rb
121
126
  - lib/jirametrics/issue_link.rb
122
127
  - lib/jirametrics/jira_gateway.rb
123
128
  - lib/jirametrics/project_config.rb
129
+ - lib/jirametrics/raw_javascript.rb
124
130
  - lib/jirametrics/rules.rb
125
131
  - lib/jirametrics/self_or_issue_dispatcher.rb
126
132
  - lib/jirametrics/settings.json
@@ -129,6 +135,7 @@ files:
129
135
  - lib/jirametrics/sprint_issue_change_data.rb
130
136
  - lib/jirametrics/status.rb
131
137
  - lib/jirametrics/status_collection.rb
138
+ - lib/jirametrics/stitcher.rb
132
139
  - lib/jirametrics/throughput_chart.rb
133
140
  - lib/jirametrics/tree_organizer.rb
134
141
  - lib/jirametrics/trend_line_calculator.rb
@@ -156,7 +163,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
156
163
  - !ruby/object:Gem::Version
157
164
  version: '0'
158
165
  requirements: []
159
- rubygems_version: 3.6.2
166
+ rubygems_version: 3.6.9
160
167
  specification_version: 4
161
168
  summary: Extract Jira metrics
162
169
  test_files: []