Class: DependencyTree

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

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeDependencyTree

Returns a new instance of DependencyTree.



21
22
23
24
25
26
27
# File 'lib/dependency_tree.rb', line 21

def initialize
  @links_count = 0
  @links = []
  @registry = {}
  @types_registry = {}
  @links_registry = {}
end

Instance Attribute Details

Returns the value of attribute links.



19
20
21
# File 'lib/dependency_tree.rb', line 19

def links
  @links
end

Returns the value of attribute links_count.



18
19
20
# File 'lib/dependency_tree.rb', line 18

def links_count
  @links_count
end

Instance Method Details

#add(source, dest, type = DependencyLinkType::UNKNOWN) ⇒ Object



29
30
31
32
33
34
35
36
37
38
39
# File 'lib/dependency_tree.rb', line 29

def add(source, dest, type = DependencyLinkType::UNKNOWN)
  register source
  register dest
  register_link(source, dest, type)

  return if connected?(source, dest)

  @links_count += 1
  @links += [{source: source, dest: dest}]

end

#connected?(source, dest) ⇒ Boolean

Returns:

  • (Boolean)


41
42
43
# File 'lib/dependency_tree.rb', line 41

def connected?(source, dest)
  @links.any? {|item| item[:source] == source && item[:dest] == dest}
end

#filterObject



80
81
82
83
84
85
86
87
88
89
90
# File 'lib/dependency_tree.rb', line 80

def filter
  @types_registry.each { |item, type|
    next if yield item, type
    @types_registry.delete(item)
    @registry.delete(item)
    selected_links = @links.select { |link| link[:source] != item && link[:dest] != item }
    filtered_links = @links.select { |link| link[:source] == item || link[:dest] == item }
    filtered_links.each { |link| remove_link_type(link) }
    @links = selected_links
  }
end


92
93
94
95
96
# File 'lib/dependency_tree.rb', line 92

def filter_links
  @links = @links.select { |link|
    yield link[:source], link[:dest], link_type(link[:source], link[:dest])
  }
end

#isEmpty?Boolean

Returns:

  • (Boolean)


45
46
47
# File 'lib/dependency_tree.rb', line 45

def isEmpty?
  @links_count.zero?
end

#isRegistered?(object) ⇒ Boolean

Returns:

  • (Boolean)


56
57
58
# File 'lib/dependency_tree.rb', line 56

def isRegistered?(object)
  !@registry[object].nil?
end


68
69
70
# File 'lib/dependency_tree.rb', line 68

def link_type(source, dest)
  @links_registry[link_key(source, dest)] || DependencyLinkType::UNKNOWN
end


72
73
74
75
76
77
78
# File 'lib/dependency_tree.rb', line 72

def links_with_types
  @links.map do |l|
    type = link_type(l[:source], l[:dest])
    l[:type] = type unless type == DependencyLinkType::UNKNOWN
    l
  end
end

#objectsObject



64
65
66
# File 'lib/dependency_tree.rb', line 64

def objects
  @types_registry.keys
end

#register(object, type = DependencyItemType::UNKNOWN) ⇒ Object



49
50
51
52
53
54
# File 'lib/dependency_tree.rb', line 49

def register(object, type = DependencyItemType::UNKNOWN)
  @registry[object] = true
  if @types_registry[object].nil? || @types_registry[object] == DependencyItemType::UNKNOWN
    @types_registry[object] = type
  end
end


98
99
100
101
102
# File 'lib/dependency_tree.rb', line 98

def remove_link_type(link)
  source, dest = link[:source], link[:dest]
  return unless source && dest
  @links_registry.delete(link_key(source, dest))
end

#type(object) ⇒ Object



60
61
62
# File 'lib/dependency_tree.rb', line 60

def type(object)
  @types_registry[object]
end