Module: Ace::Git::Atoms::FileGrouper

Defined in:
lib/ace/git/atoms/file_grouper.rb

Overview

Group parsed numstat entries by package/layer/root buckets.

Constant Summary collapse

DEFAULT_LAYERS =
%w[lib test handbook].freeze

Class Method Summary collapse

Class Method Details

.group(entries, layers: DEFAULT_LAYERS, dotfile_groups: []) ⇒ Object



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/ace/git/atoms/file_grouper.rb', line 11

def group(entries, layers: DEFAULT_LAYERS, dotfile_groups: [])
  normalized_layers = Array(layers).map(&:to_s)
  groups = {}

  Array(entries).each do |entry|
    group_key, layer_key, display_path = classify(entry, normalized_layers)
    groups[group_key] ||= initialize_group(group_key)
    group = groups[group_key]
    group[:layers][layer_key] ||= initialize_layer(layer_key)

    normalized_entry = entry.merge(display_path: display_path)
    add_to_group(group, group[:layers][layer_key], normalized_entry)
  end

  ordered_groups = sort_groups(groups.values, dotfile_groups)
  ordered_groups.each { |group| group[:layers] = sort_layers(group[:layers], normalized_layers) }

  {
    groups: ordered_groups,
    total: {
      additions: ordered_groups.sum { |g| g[:additions] },
      deletions: ordered_groups.sum { |g| g[:deletions] },
      files: ordered_groups.sum { |g| g[:file_count] }
    },
    files: ordered_groups.flat_map { |g| g[:layers].flat_map { |l| l[:files].map { |f| f[:path] } } }
  }
end