Module: Trailblazer::Developer::Trace::Present

Defined in:
lib/trailblazer/developer/trace/present.rb

Constant Summary collapse

INDENTATION =
"   |".freeze
STEP_PREFIX =
"-- ".freeze

Class Method Summary collapse

Class Method Details

.call(stack, level: 1, tree: [], renderer: method(:default_renderer), **options) ⇒ Object



15
16
17
# File 'lib/trailblazer/developer/trace/present.rb', line 15

def call(stack, level: 1, tree: [], renderer: method(:default_renderer), **options)
  tree(stack.to_a, level, tree: tree, renderer: renderer, **options)
end

.default_renderer(task_node:) ⇒ Object



11
12
13
# File 'lib/trailblazer/developer/trace/present.rb', line 11

def default_renderer(task_node:, **)
  [ task_node[:level], %{#{task_node[:name]}} ]
end

.render_tree_for(nodes) ⇒ Object



29
30
31
32
33
34
35
# File 'lib/trailblazer/developer/trace/present.rb', line 29

def render_tree_for(nodes)
  nodes.map { |level, node|
    indentation = INDENTATION * (level -1)
    indentation = indentation[0...-1] + "`" if level == 1 || /End./.match(node) # start or end step
    indentation + STEP_PREFIX + node
  }.join("\n")
end

.tree(stack, level, tree:, renderer:, **options) ⇒ Object



19
20
21
22
23
24
25
26
27
# File 'lib/trailblazer/developer/trace/present.rb', line 19

def tree(stack, level, tree:, renderer:, **options)
  tree_for(stack, level, options.merge(tree: tree))

  nodes = tree.each_with_index.map do |task_node, position|
    renderer.(task_node: task_node, position: position, tree: tree)
  end

  render_tree_for(nodes)
end

.tree_for(stack, level, tree:, **options) ⇒ Object



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/trailblazer/developer/trace/present.rb', line 37

def tree_for(stack, level, tree:, **options)
  stack.each do |lvl| # always a Stack::Task[input, ..., output]
    input, output, nested = Trace::Level.input_output_nested_for_level(lvl)

    task = input.task

    graph = Trailblazer::Activity::Introspect::Graph(input.activity)

    name = (node = graph.find { |node| node[:task] == task }) ? node[:id] : task
    name ||= task # FIXME: bullshit

    tree << { level: level, input: input, output: output, name: name, **options }

    if nested.any? # nesting
      tree_for(nested, level + 1, options.merge(tree: tree))
    end

    tree
  end
end