Class: Lookbook::EntityTreeBuilder

Inherits:
Service
  • Object
show all
Defined in:
lib/lookbook/services/entities/entity_tree_builder.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods inherited from Service

call

Constructor Details

#initialize(entities, include_hidden: false) ⇒ EntityTreeBuilder

Returns a new instance of EntityTreeBuilder.



5
6
7
8
# File 'lib/lookbook/services/entities/entity_tree_builder.rb', line 5

def initialize(entities, include_hidden: false)
  @entities = entities.to_a
  @include_hidden = include_hidden
end

Instance Attribute Details

#include_hiddenObject (readonly)



3
4
5
# File 'lib/lookbook/services/entities/entity_tree_builder.rb', line 3

def include_hidden
  @include_hidden
end

Instance Method Details

#callObject



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/lookbook/services/entities/entity_tree_builder.rb', line 10

def call
  root_node = TreeNode.new
  entities.each do |entity|
    current_node = root_node
    path_segments = parse_segments(entity.logical_path)
    path_segments.each.with_index(1) do |segment, i|
      name, priority_prefix = segment
      content = entity if entity.depth == i # entities are always on the leaf nodes

      current_node.add_child(name, content, priority: priority_prefix) unless current_node.has_child?(name)
      current_node = current_node.get_child(name)

      if content && content.type == :preview
        content.visible_scenarios.each do |scenario|
          current_node.add_child(scenario.name, scenario)
        end
      end
    end
  end
  root_node
end

#entitiesObject



41
42
43
# File 'lib/lookbook/services/entities/entity_tree_builder.rb', line 41

def entities
  include_hidden ? @entities : @entities.select(&:visible?)
end

#parse_segments(path) ⇒ Object



32
33
34
35
36
37
38
39
# File 'lib/lookbook/services/entities/entity_tree_builder.rb', line 32

def parse_segments(path)
  path.split("/").map do |segment|
    unless segment.start_with?(".")
      priority, name = PriorityPrefixParser.call(segment)
      [name, priority || 10000]
    end
  end.compact
end