lib/dogviz.rb in dogviz-0.0.4 vs lib/dogviz.rb in dogviz-0.0.5
- old
+ new
@@ -6,13 +6,10 @@
parts = []
parts << parent.id if parent.respond_to? :id
parts += name.split /\s/
parts.join '_'
end
- def graph
- parent.graph
- end
def root
ancestors.last
end
def ancestors
ancestors = [parent]
@@ -34,10 +31,19 @@
end
def rollup!
@rollup = true
self
end
+ def skip!
+ @skip = true
+ self
+ end
+
+ def skip?
+ @skip
+ end
+
def under_rollup?
ancestors.any? &:rollup?
end
def in_rollup?
rollup? || under_rollup?
@@ -86,10 +92,11 @@
@parent = parent
@name = name
@id = create_id(name, parent)
@pointers = []
@rollup = false
+ @skip = false
@edge_heads = []
rollup! if options[:rollup]
options.delete(:rollup)
@@ -103,32 +110,23 @@
render_options = @render_options
attributes = @attributes
renderer.render_node(parent, id, render_options, attributes)
end
- def node
- graph.find_node(id)
- end
-
def points_to_all(*others)
others.each {|other|
points_to other
}
end
def points_to(other, options = {})
setup_render_edge(other, options)
+ other
end
- def pointees
- pointers.map {|e|
- e[:other]
- }
- end
-
def render(renderer)
- do_render_node(renderer) unless in_rollup?
+ do_render_node(renderer) unless in_rollup? || skip?
end
def render_edges(renderer)
pointers.each {|p|
render_pointer p, renderer
@@ -157,19 +155,45 @@
from = self
while (from.in_rollup? && !from.on_top_rollup?) do
from = from.parent
end
- return if from == self && from.in_rollup?
+ return if from.skip?
+ return if from == self && from.in_rollup?
return if from == other
- return if edge_heads.include? other
+ return if already_added_connection?(other)
- edge_heads << other
- render_options = pointer[:options]
- renderer.render_edge(from, other, render_options)
+ if other.skip?
+ others = resolve_skipped_others other
+ else
+ others = [other]
+ end
+
+ others.each do |other|
+ edge_heads << other
+ render_options = pointer[:options]
+ renderer.render_edge(from, other, render_options)
+ end
end
+
+ def already_added_connection?(other)
+ edge_heads.include? other
+ end
+
+ def resolve_skipped_others(skipped)
+ resolved = []
+ skipped.pointers.each {|pointer|
+ next_in_line = pointer[:other]
+ if next_in_line.skip?
+ resolved += resolve_skipped_others next_in_line
+ else
+ resolved << next_in_line
+ end
+ }
+ resolved
+ end
end
class Container
include Common
include Parent
@@ -180,10 +204,11 @@
@children = []
@by_name = Registry.new
@parent = parent
@name = name
@id = create_id(name, parent)
+ @skip = false
init_rollup options
setup_render_attributes label: name
@@ -213,18 +238,10 @@
children.each {|c|
c.render_edges renderer
}
end
- def node
- if render_type == :node
- graph.find_node(render_id)
- elsif render_type == :subgraph
- @subgraph
- end
- end
-
private
def do_render_subgraph(renderer)
@render_type = :subgraph
render_id = cluster_prefix + id
@@ -333,13 +350,9 @@
@children = []
@by_name = Registry.new
@render_hints = hints
@title = create_title(name)
@rendered = false
- end
-
- def node
- graph
end
def output(*args)
render
out = graph.output *args