jirametrics 2.5 → 2.6

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 22daa10ce05dd421522069d3b5d73868f8f7bc1a6a53128acab515ca98644892
4
- data.tar.gz: 8d797de1b80fe8f35fde593bc578012af92080e32000a905ea90ed286754bccd
3
+ metadata.gz: 749f92d4329a18999bf8954aee5b41955047ef263d7a37fe766b2233d697a8c9
4
+ data.tar.gz: f174b2241d23a3d7a9ff34b20093ff0716406197563df4b7f4f6447773fc7a51
5
5
  SHA512:
6
- metadata.gz: b00a94c9c676625ff698ecf61211dea8b8bbc6d3fde400e23f349a888147b0245616f8944646eac4435106d1156dca08327fe596dcc0402e92169c67cc72cdb1
7
- data.tar.gz: c85706281f71b2b0adf5dae8f99bcab478dadeb86b014ce88874879051ac0e4288d3d7cda1e0fd949e03b70878969f918248649423704ae5d757f63c83b12733
6
+ metadata.gz: f89eb6c1a9655163d91b19d9f5b92f79a7d714e6b45fe53e972248f20c5d788a356e6d5be0cbfe24a70665381bf0a7a28ce898b0e31cef9c4c3349d8ce335558
7
+ data.tar.gz: b95ee06e9b3ef78aba0635aa634fa56082da2aa8bfa759f7e38be2eb2b6889a04a23e99dc8aa9a021391d8db4fe797247fb2b9379c5801fc2c5ec7a3bc3ff103
@@ -6,7 +6,7 @@ require 'json'
6
6
  class Downloader
7
7
  CURRENT_METADATA_VERSION = 4
8
8
 
9
- attr_accessor :metadata, :quiet_mode
9
+ attr_accessor :metadata
10
10
  attr_reader :file_system
11
11
 
12
12
  # For testing only
@@ -54,8 +54,7 @@ class Downloader
54
54
  end
55
55
 
56
56
  def log text, both: false
57
- @file_system.log text
58
- puts text if both && !@quiet_mode
57
+ @file_system.log text, also_write_to_stderr: both
59
58
  end
60
59
 
61
60
  def find_board_ids
@@ -137,13 +136,6 @@ class Downloader
137
136
  issue.raw['fields']['subtasks']&.each do |raw_subtask|
138
137
  @issue_keys_pending_download << raw_subtask['key']
139
138
  end
140
-
141
- # Links
142
- # We shouldn't blindly follow links as some, like cloners, aren't valuable and are just wasting time/effort
143
- # to download
144
- # issue.raw['fields']['issuelinks'].each do |raw_link|
145
- # @issue_keys_pending_download << IssueLink(raw: raw_link).other_issue.key
146
- # end
147
139
  end
148
140
 
149
141
  def exit_if_call_failed json
@@ -27,8 +27,9 @@ class FileSystem
27
27
  File.write(filename, content)
28
28
  end
29
29
 
30
- def log message
30
+ def log message, also_write_to_stderr: false
31
31
  logfile.puts message
32
+ $stderr.puts message if also_write_to_stderr
32
33
  end
33
34
 
34
35
  # In some Jira instances, a sizeable portion of the JSON is made up of empty fields. I've seen
@@ -137,7 +137,15 @@ class Issue
137
137
  status = board.possible_statuses.find_by_name(name)
138
138
  return status if status
139
139
 
140
- raise "Status name #{name.inspect} for issue #{key} not found in #{board.possible_statuses.collect(&:name).inspect}"
140
+ @board.project_config.file_system.log(
141
+ "Warning: Status name #{name.inspect} for issue #{key} not found in" \
142
+ " #{board.possible_statuses.collect(&:name).inspect}" \
143
+ "\n See Q1 in the FAQ for more details: https://github.com/mikebowler/jirametrics/wiki/FAQ\n",
144
+ also_write_to_stderr: true
145
+ )
146
+ status = Status.new(name: name, category_name: 'In Progress')
147
+ board.possible_statuses << status
148
+ status
141
149
  end
142
150
 
143
151
  def first_status_change_after_created
@@ -251,6 +259,7 @@ class Issue
251
259
 
252
260
  blocked_link_texts = settings['blocked_link_text']
253
261
  stalled_threshold = settings['stalled_threshold_days']
262
+ flagged_means_blocked = !!settings['flagged_means_blocked']
254
263
 
255
264
  blocking_issue_keys = []
256
265
 
@@ -273,7 +282,7 @@ class Issue
273
282
  blocking_stalled_changes: result
274
283
  )
275
284
 
276
- if change.flagged?
285
+ if change.flagged? && flagged_means_blocked
277
286
  flag = change.value
278
287
  flag = nil if change.value == ''
279
288
  elsif change.status?
@@ -362,6 +371,46 @@ class Issue
362
371
  inserted_stalled
363
372
  end
364
373
 
374
+ # return [number of active seconds, total seconds] that this issue had up to the end_time.
375
+ # It does not include data before issue start or after issue end
376
+ def flow_efficiency_numbers end_time:, settings: {}
377
+ issue_start = @board.cycletime.started_time(self)
378
+ return [0.0, 0.0] if !issue_start || issue_start > end_time
379
+
380
+ value_add_time = 0.0
381
+ issue_stop = @board.cycletime.stopped_time(self)
382
+ end_time = issue_stop if issue_stop && issue_stop < end_time
383
+
384
+ active_start = nil
385
+ blocked_stalled_changes(end_time: end_time, settings: settings).each_with_index do |change, index|
386
+ break if change.time > end_time
387
+
388
+ if index.zero?
389
+ active_start = change.time if change.active?
390
+ next
391
+ end
392
+
393
+ # Already active and we just got another active.
394
+ next if active_start && change.active?
395
+
396
+ if change.active?
397
+ active_start = change.time
398
+ elsif active_start && change.time >= issue_start
399
+ # Not active now but we have been. Record the active time.
400
+ change_delta = change.time - [issue_start, active_start].max
401
+ value_add_time += change_delta
402
+ active_start = nil
403
+ end
404
+ end
405
+
406
+ if active_start
407
+ change_delta = end_time - [issue_start, active_start].max
408
+ value_add_time += change_delta if change_delta.positive?
409
+ end
410
+
411
+ [value_add_time, end_time - issue_start]
412
+ end
413
+
365
414
  def all_subtask_activity_times
366
415
  subtask_activity_times = []
367
416
  @subtasks.each do |subtask|
@@ -4,6 +4,7 @@
4
4
 
5
5
  "blocked_link_text": ["is blocked by"],
6
6
  "blocked_statuses": [],
7
+ "flagged_means_blocked": true,
7
8
 
8
9
  "expedited_priority_names": ["Critical", "Highest"]
9
10
  }
@@ -38,8 +38,18 @@ class Status
38
38
  end
39
39
 
40
40
  def to_s
41
- "Status(name=#{@name.inspect}, id=#{@id.inspect}," \
42
- " category_name=#{@category_name.inspect}, category_id=#{@category_id.inspect}, project_id=#{@project_id})"
41
+ result = +"Status(name=#{@name.inspect}," \
42
+ " id=#{@id.inspect}," \
43
+ " category_name=#{@category_name.inspect}," \
44
+ " category_id=#{@category_id.inspect}," \
45
+ " project_id=#{@project_id}"
46
+ result << ' artificial' if artificial?
47
+ result << ')'
48
+ result
49
+ end
50
+
51
+ def artificial?
52
+ @raw.nil?
43
53
  end
44
54
 
45
55
  def value_equality_ignored_variables
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jirametrics
3
3
  version: !ruby/object:Gem::Version
4
- version: '2.5'
4
+ version: '2.6'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Bowler
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-09-22 00:00:00.000000000 Z
11
+ date: 2024-10-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: random-word