Class: NbfTools::Merge

Inherits:
Object
  • Object
show all
Defined in:
lib/nbf_tools/merge.rb

Instance Method Summary collapse

Constructor Details

#initialize(data) ⇒ Merge

Returns a new instance of Merge.



7
8
9
10
11
# File 'lib/nbf_tools/merge.rb', line 7

def initialize(data)
  @data = data
  @link_map = {}
  @folder_map = {}
end

Instance Method Details

#choose_latest_element(data_map, key, new_element) ⇒ Object



49
50
51
52
53
54
55
56
57
58
# File 'lib/nbf_tools/merge.rb', line 49

def choose_latest_element(data_map, key, new_element)
  if data_map.key?(new_element[key])
    old_e = data_map[new_element[key]]
    if [new_element["add_date"].to_i, new_element["last_modified"].to_i].max > [old_e["add_date"].to_i, old_e["last_modified"].to_i].max
      data_map[new_element[key]] = new_element.except("items")
    end
  else
    data_map[new_element[key]] = new_element.except("items")
  end
end


37
38
39
40
41
42
43
44
45
46
47
# File 'lib/nbf_tools/merge.rb', line 37

def flat_folder_and_link_map(data, link_map, folder_map)
  data.map do |e|
    case e["type"]
    when NbfTools::Type::LINK
      choose_latest_element(link_map, "href", e)
    when NbfTools::Type::FOLDER
      choose_latest_element(folder_map, "path", e)
      flat_folder_and_link_map(e["items"], link_map, folder_map)
    end
  end
end

#to_aObject



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/nbf_tools/merge.rb', line 13

def to_a
  @data.each do |file_data|
    flat_folder_and_link_map(file_data, @link_map, @folder_map)
  end

  @link_map.values.each do |e|
    folder = @folder_map[e["path"]]
    next if folder.nil?
    folder["items"] ||= []
    folder["items"] << e
    @folder_map[e["path"]] = folder
  end

  @folder_map.values.each do |e|
    parent_path = e["path"].split("/")[0..-2].join("/")
    folder = @folder_map[parent_path]
    next if folder.nil?
    folder["items"] ||= []
    folder["items"] << e
    @folder_map[parent_path] = folder
  end
  @folder_map.values.select { |e| e["path"].count("/") < 2 } + @link_map.values.select { |e| e["path"] == "/" }
end