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