Class: Board

Inherits:
Object
  • Object
show all
Defined in:
lib/jirametrics/board.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(raw:, possible_statuses:) ⇒ Board

Returns a new instance of Board.



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/jirametrics/board.rb', line 7

def initialize raw:, possible_statuses:
  @raw = raw
  @possible_statuses = possible_statuses
  @sprints = []

  columns = raw['columnConfig']['columns']
  ensure_uniqueness_of_column_names! columns

  # For a Kanban board, the first column here will always be called 'Backlog' and will NOT be
  # visible on the board. If the board is configured to have a kanban backlog then it will have
  # statuses matched to it and otherwise, there will be no statuses.
  columns = columns.drop(1) if kanban?

  @backlog_statuses = []
  @visible_columns = columns.filter_map do |column|
    # It's possible for a column to be defined without any statuses and in this case, it won't be visible.
    BoardColumn.new column unless status_ids_from_column(column).empty?
  end
end

Instance Attribute Details

#cycletimeObject

Returns the value of attribute cycletime.



5
6
7
# File 'lib/jirametrics/board.rb', line 5

def cycletime
  @cycletime
end

#possible_statusesObject (readonly)

Returns the value of attribute possible_statuses.



4
5
6
# File 'lib/jirametrics/board.rb', line 4

def possible_statuses
  @possible_statuses
end

#project_configObject

Returns the value of attribute project_config.



5
6
7
# File 'lib/jirametrics/board.rb', line 5

def project_config
  @project_config
end

#rawObject (readonly)

Returns the value of attribute raw.



4
5
6
# File 'lib/jirametrics/board.rb', line 4

def raw
  @raw
end

#sprintsObject (readonly)

Returns the value of attribute sprints.



4
5
6
# File 'lib/jirametrics/board.rb', line 4

def sprints
  @sprints
end

#visible_columnsObject (readonly)

Returns the value of attribute visible_columns.



4
5
6
# File 'lib/jirametrics/board.rb', line 4

def visible_columns
  @visible_columns
end

Instance Method Details

#accumulated_status_ids_per_columnObject



88
89
90
91
92
93
94
95
96
# File 'lib/jirametrics/board.rb', line 88

def accumulated_status_ids_per_column
  accumulated_status_ids = []
  visible_columns.reverse.filter_map do |column|
    next if column == @fake_column

    accumulated_status_ids += column.status_ids
    [column.name, accumulated_status_ids.dup]
  end.reverse
end

#backlog_statusesObject



27
28
29
30
31
32
33
34
35
# File 'lib/jirametrics/board.rb', line 27

def backlog_statuses
  if @backlog_statuses.empty? && kanban?
    status_ids = status_ids_from_column raw['columnConfig']['columns'].first
    @backlog_statuses = status_ids.filter_map do |id|
      @possible_statuses.find_by_id id
    end
  end
  @backlog_statuses
end

#board_typeObject



69
# File 'lib/jirametrics/board.rb', line 69

def board_type = raw['type']

#ensure_uniqueness_of_column_names!(json) ⇒ Object



98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# File 'lib/jirametrics/board.rb', line 98

def ensure_uniqueness_of_column_names! json
  all_names = []
  json.each do |column_json|
    name = column_json['name']
    if all_names.include? name
      (2..).each do |i|
        new_name = "#{name}-#{i}"
        next if all_names.include?(new_name)

        name = new_name
        column_json['name'] = new_name
        break
      end
    end
    all_names << name
  end
end

#estimation_configurationObject



116
117
118
# File 'lib/jirametrics/board.rb', line 116

def estimation_configuration
  EstimationConfiguration.new raw: raw['estimation']
end

#idObject



73
74
75
# File 'lib/jirametrics/board.rb', line 73

def id
  @raw['id'].to_i
end

#kanban?Boolean

Returns:

  • (Boolean)


70
# File 'lib/jirametrics/board.rb', line 70

def kanban? = (board_type == 'kanban')

#nameObject



84
85
86
# File 'lib/jirametrics/board.rb', line 84

def name
  @raw['name']
end

#project_idObject



77
78
79
80
81
82
# File 'lib/jirametrics/board.rb', line 77

def project_id
  location = @raw['location']
  return nil unless location

  location['id'] if location['type'] == 'project'
end

#scrum?Boolean

Returns:

  • (Boolean)


71
# File 'lib/jirametrics/board.rb', line 71

def scrum? = (board_type == 'scrum')

#server_url_prefixObject



37
38
39
40
41
# File 'lib/jirametrics/board.rb', line 37

def server_url_prefix
  raise "Cannot parse self: #{@raw['self'].inspect}" unless @raw['self'] =~ /^(https?:\/\/.+)\/rest\//

  $1
end

#status_ids_from_column(column) ⇒ Object



48
49
50
# File 'lib/jirametrics/board.rb', line 48

def status_ids_from_column column
  column['statuses']&.collect { |status| status['id'].to_i } || []
end

#status_ids_in_or_right_of_column(column_name) ⇒ Object



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/jirametrics/board.rb', line 52

def status_ids_in_or_right_of_column column_name
  status_ids = []
  found_it = false

  @visible_columns.each do |column|
    # Check both the current name and also the original raw name in case anonymization has happened.
    found_it = true if column.name == column_name || column.raw['name'] == column_name
    status_ids += column.status_ids if found_it
  end

  unless found_it
    column_names = @visible_columns.collect { |c| c.name.inspect }.join(', ')
    raise "No visible column with name: #{column_name.inspect} Possible options are: #{column_names}"
  end
  status_ids
end

#urlObject



43
44
45
46
# File 'lib/jirametrics/board.rb', line 43

def url
  # Strangely, the URL isn't anywhere in the returned data so we have to fabricate it.
  "#{server_url_prefix}/secure/RapidBoard.jspa?rapidView=#{id}"
end