Module: Eco::API::UseCases::DefaultCases::CsvToTree::Helper

Extended by:
NodesCleaner, Treeify
Defined in:
lib/eco/api/usecases/default_cases/csv_to_tree_case/helper.rb

Class Method Summary collapse

Methods included from NodesCleaner

done_tags, fill_in_parents, repeated_tags, tidy_nodes, to_rows

Methods included from Treeify

treeify

Class Method Details

.csv_from(filename) ⇒ Object



7
8
9
10
11
12
13
14
15
# File 'lib/eco/api/usecases/default_cases/csv_to_tree_case/helper.rb', line 7

def csv_from(filename)
  raise "Missing #{filename}" unless File.exists?(filename)
  result = csv_from_file(filename)
  if result.is_a?(Integer)
    puts "An encoding problem was found on line #{result}"
    result = csv_from_content(filename)
  end
  result
end

.csv_nodes(filename) ⇒ Object



44
45
46
# File 'lib/eco/api/usecases/default_cases/csv_to_tree_case/helper.rb', line 44

def csv_nodes(filename)
  nodes_from_csv(csv_from(filename))
end

.nodes_from_csv(csv) ⇒ Object



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/eco/api/usecases/default_cases/csv_to_tree_case/helper.rb', line 17

def nodes_from_csv(csv)
  i = 1; prev_level = nil; prev_node = nil; prev_nodes = Array(1..11).zip(Array.new(11, nil)).to_h
  nodes = csv.each_with_object([]) do |row, out|
    values = row.fields.map do |value|
      value = value.to_s.strip
      value.empty?? nil : value
    end
    i += 1
    node = Node.new(i, *values)
    prev_node ||= node

    if prev_node.raw_level <= node.raw_level
      node.set_high_levels(prev_node)
    else
      if parent_node = prev_nodes[node.raw_level - 1]
        node.set_high_levels(parent_node)
      else
        raise "Node '#{node.raw_tag}' (#{node.row_num} row) doesn't have parent"
      end
    end
    out << node
    prev_nodes[node.raw_level] = node
    prev_node = node
  end
  tidy_nodes(nodes)
end