dogviz 0.0.17 → 0.0.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,95 @@
1
+ require_relative 'parent'
2
+ require_relative 'nominator'
3
+ require_relative 'registry'
4
+
5
+ module Dogviz
6
+ class System
7
+ include Parent
8
+ include Nominator
9
+
10
+ attr_reader :render_hints, :title, :children, :graph
11
+
12
+ alias :name :title
13
+ alias :render_options :render_hints
14
+
15
+ def initialize(name, hints = {splines: 'line'})
16
+ @children = []
17
+ @by_name = Registry.new name
18
+ @non_render_hints = remove_dogviz_hints!(hints)
19
+ @render_hints = hints
20
+ @title = create_title(name)
21
+ @rendered = false
22
+ end
23
+
24
+ def output(*args)
25
+ render
26
+ out = graph.output *args
27
+ puts "Created output: #{args.join ' '}" if run_from_command_line?
28
+ out
29
+ end
30
+
31
+ def flow(name)
32
+ Flow.new self, name
33
+ end
34
+
35
+ def render(type=:graphviz)
36
+ return @graph if @rendered
37
+ renderer = create_renderer(type)
38
+
39
+ children.each { |c|
40
+ c.render renderer
41
+ }
42
+ children.each { |c|
43
+ c.render_edges renderer
44
+ }
45
+ @rendered = true
46
+ @graph = renderer.graph
47
+ end
48
+
49
+ def create_renderer(type)
50
+ if type == :graphviz
51
+ GraphvizRenderer.new @title, render_hints
52
+ elsif type == :sigma
53
+ SigmaRenderer.new @title
54
+ else
55
+ raise "dunno bout that '#{type}', only know :graphviz or :sigma"
56
+ end
57
+
58
+ end
59
+
60
+ def rollup?
61
+ false
62
+ end
63
+
64
+ def skip?
65
+ false
66
+ end
67
+
68
+ def register(name, thing)
69
+ @by_name.register name, thing
70
+ end
71
+
72
+ def colorize_edges?
73
+ @non_render_hints[:colorize_edges]
74
+ end
75
+
76
+ private
77
+
78
+ def remove_dogviz_hints!(hints)
79
+ dogviz_only_hints = {}
80
+ %i(colorize_edges).each { |k|
81
+ dogviz_only_hints[k] = hints.delete k
82
+ }
83
+ dogviz_only_hints
84
+ end
85
+
86
+ def create_title(name)
87
+ now = DateTime.now
88
+ "#{now.strftime '%H:%M'} #{name} #{now.strftime '%F'}"
89
+ end
90
+
91
+ def run_from_command_line?
92
+ $stdout.isatty
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,135 @@
1
+ require_relative 'common'
2
+ require_relative 'nominator'
3
+ require_relative 'flowable'
4
+ require_relative 'colorizer'
5
+
6
+ module Dogviz
7
+ class Thing
8
+ include Common
9
+ include Nominator
10
+ include Flowable
11
+ attr_reader :parent
12
+ attr_reader :name, :id, :pointers, :edge_heads
13
+
14
+ @@colorizer = Colorizer.new
15
+
16
+ def initialize(parent, name, options = {})
17
+ @parent = parent
18
+ @name = name
19
+ @id = create_id(name, parent)
20
+ @pointers = []
21
+ @rollup = false
22
+ @skip = false
23
+ @info = {}
24
+ @edge_heads = []
25
+
26
+ rollup! if options[:rollup]
27
+ options.delete(:rollup)
28
+
29
+ @render_options = options
30
+ setup_render_attributes({label: name}.merge inherited_render_options)
31
+
32
+ parent.register name, self
33
+ end
34
+
35
+ def points_to_all(*others)
36
+ others.each { |other|
37
+ points_to other
38
+ }
39
+ end
40
+
41
+ def points_to(other, options = {})
42
+ setup_render_edge(other, options)
43
+ other
44
+ end
45
+
46
+ def render(renderer)
47
+ do_render_node(renderer) unless in_rollup? || in_skip?
48
+ end
49
+
50
+ def render_edges(renderer)
51
+ pointers.each { |p|
52
+ render_pointer p, renderer
53
+ }
54
+ end
55
+
56
+ private
57
+
58
+ def do_render_node(renderer)
59
+ render_options = @render_options
60
+ attributes = @attributes
61
+ renderer.render_node(parent, id, render_options, attributes)
62
+ end
63
+
64
+ def setup_render_edge(other, options)
65
+ pointers << {
66
+ other: other,
67
+ options: {
68
+ xlabel: options[:name],
69
+ style: options[:style]
70
+ }.merge(inherited_render_options)
71
+ }
72
+
73
+ if options[:colorize] || root.colorize_edges?
74
+ edge_color = next_colorizer_color
75
+ pointers.last[:options].merge!({
76
+ color: edge_color,
77
+ fontcolor: edge_color
78
+ })
79
+ end
80
+
81
+ end
82
+
83
+ def render_pointer(pointer, renderer)
84
+ other = pointer[:other]
85
+ while (other.in_rollup? && !other.on_top_rollup?) do
86
+ other = other.parent
87
+ end
88
+ return if other.under_rollup?
89
+
90
+ from = self
91
+ while (from.in_rollup? && !from.on_top_rollup?) do
92
+ from = from.parent
93
+ end
94
+
95
+ return if from.in_skip?
96
+
97
+ return if from == self && from.in_rollup?
98
+ return if from == other
99
+ return if already_added_connection?(other)
100
+
101
+ if other.in_skip?
102
+ others = resolve_skipped_others other
103
+ else
104
+ others = [other]
105
+ end
106
+
107
+ others.each do |other|
108
+ edge_heads << other
109
+ render_options = pointer[:options]
110
+ renderer.render_edge(from, other, render_options)
111
+ end
112
+ end
113
+
114
+ def already_added_connection?(other)
115
+ edge_heads.include? other
116
+ end
117
+
118
+ def resolve_skipped_others(skipped)
119
+ resolved = []
120
+ skipped.pointers.each { |pointer|
121
+ next_in_line = pointer[:other]
122
+ if next_in_line.in_skip?
123
+ resolved += resolve_skipped_others next_in_line
124
+ else
125
+ resolved << next_in_line
126
+ end
127
+ }
128
+ resolved
129
+ end
130
+
131
+ def next_colorizer_color
132
+ @@colorizer.next
133
+ end
134
+ end
135
+ end
@@ -1,3 +1,3 @@
1
1
  module Dogviz
2
- VERSION = '0.0.17'
2
+ VERSION = '0.0.18'
3
3
  end