class TTY::Tree

Constants

VERSION

Attributes

nodes[R]

The list of nodes in this tree.

Public Class Methods

[](data) click to toggle source

@api public

# File lib/tty/tree.rb, line 13
def self.[](data)
  new(data)
end
new(data = nil, options = {}, &block) click to toggle source

Create a Tree

@param [String,Dir,Hash] data

@api public

# File lib/tty/tree.rb, line 25
def initialize(data = nil, options = {}, &block)
  @data   = data ? data.dup.freeze : nil
  @walker = select_walker.new(options)
  @nodes  = []

  if @data
    @walker.traverse(data)
    @nodes = @walker.nodes
  end

  @nodes_stack = []

  instance_eval(&block) if block_given?

  freeze
end

Public Instance Methods

leaf(name, &block) click to toggle source

Add leaf node

@api public

# File lib/tty/tree.rb, line 82
def leaf(name, &block)
  node(name, LeafNode, &block)
end
node(name, type = Node, &block) click to toggle source

Add node to this tree.

@param [Symbol,String] name

the name for the node

@param [Node, LeafNode] type

the type of node to add

@example

TTY::Tree.new do
  node '...' do
    node '...'
  end
end

@api public

# File lib/tty/tree.rb, line 58
def node(name, type = Node, &block)
  parent = @nodes_stack.empty? ? Node::ROOT : @nodes_stack.last
  level = [0, @nodes_stack.size - 1].max
  prefix = ':pipe' * level
  if parent.class == LeafNode
    prefix = ':space' * level
  end
  node = type.new(name, parent.full_path, prefix, @nodes_stack.size)
  @nodes << node

  return unless block_given?

  @nodes_stack << node
  if block.arity.zero?
    instance_eval(&block)
  else
    instance_eval(&(->(*_args) { block[node] }))
  end
  @nodes_stack.pop
end
render(options = {}) click to toggle source

@api public

# File lib/tty/tree.rb, line 87
def render(options = {})
  as = options.delete(:as) || :dir
  renderer = select_renderer(as).new(nodes, options)
  renderer.render
end

Private Instance Methods

select_renderer(as) click to toggle source
# File lib/tty/tree.rb, line 105
def select_renderer(as)
  case as
  when :dir, :directory then DirectoryRenderer
  when :num, :number then NumberRenderer
  end
end
select_walker() click to toggle source

@api private

# File lib/tty/tree.rb, line 96
def select_walker
  if @data.is_a?(Hash) || @data.nil?
    HashWalker
  else
    @data ||= Dir.pwd
    PathWalker
  end
end