garru-g_viz 0.0.1 → 0.0.2
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.
- data/CHANGELOG +1 -0
- data/Manifest +2 -0
- data/g_viz.gemspec +3 -3
- data/lib/g_viz/g_viz.rb +23 -134
- data/lib/g_viz/graph.rb +101 -0
- data/lib/g_viz/templates/visualization.erb +3 -3
- data/lib/g_viz.rb +5 -0
- data/spec/g_viz/g_viz_spec.rb +18 -24
- metadata +5 -1
data/CHANGELOG
CHANGED
data/Manifest
CHANGED
data/g_viz.gemspec
CHANGED
@@ -2,15 +2,15 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{g_viz}
|
5
|
-
s.version = "0.0.
|
5
|
+
s.version = "0.0.2"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Gary Tsang"]
|
9
9
|
s.date = %q{2009-05-04}
|
10
10
|
s.description = %q{Ruby Scribe Client. Package and Wrapper for generated ruby interfaces}
|
11
11
|
s.email = %q{}
|
12
|
-
s.extra_rdoc_files = ["CHANGELOG", "lib/g_viz/g_viz.rb", "lib/g_viz/templates/visualization.erb", "README"]
|
13
|
-
s.files = ["CHANGELOG", "lib/g_viz/g_viz.rb", "lib/g_viz/templates/visualization.erb", "Manifest", "Rakefile", "README", "spec/g_viz/fixtures/annotated_timeline.rb", "spec/g_viz/g_viz_spec.rb", "spec/g_viz/templates/rendered_annotated_timeline.html", "spec/test_helper.rb", "g_viz.gemspec"]
|
12
|
+
s.extra_rdoc_files = ["CHANGELOG", "lib/g_viz/g_viz.rb", "lib/g_viz/graph.rb", "lib/g_viz/templates/visualization.erb", "lib/g_viz.rb", "README"]
|
13
|
+
s.files = ["CHANGELOG", "lib/g_viz/g_viz.rb", "lib/g_viz/graph.rb", "lib/g_viz/templates/visualization.erb", "lib/g_viz.rb", "Manifest", "Rakefile", "README", "spec/g_viz/fixtures/annotated_timeline.rb", "spec/g_viz/g_viz_spec.rb", "spec/g_viz/templates/rendered_annotated_timeline.html", "spec/test_helper.rb", "g_viz.gemspec"]
|
14
14
|
s.has_rdoc = true
|
15
15
|
s.homepage = %q{http://github.com/garru/GViz}
|
16
16
|
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "G_viz", "--main", "README"]
|
data/lib/g_viz/g_viz.rb
CHANGED
@@ -1,148 +1,37 @@
|
|
1
|
-
require '
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
# <script type='text/javascript'>
|
14
|
-
# google.load('visualization', '1', {'packages':[<%= @@viz_package_names.map{|p|p.downcase}.join(',') %>]});
|
15
|
-
# google.setOnLoadCallback(drawChart);
|
16
|
-
# function drawChart() {
|
17
|
-
# <% @graphs.each do |graph| %>
|
18
|
-
# var <%= graph.data_name%> = new google.visualization.DataTable();
|
19
|
-
#
|
20
|
-
# <% graph.columns.each do |column| %>
|
21
|
-
# <%= graph.data_name%>.addColumn('<%= column[0] %>', '<%= column[1] %>')
|
22
|
-
# <% end %>
|
23
|
-
#
|
24
|
-
# <%= graph.data_name%>.addRows(<%= graph.size %>)
|
25
|
-
#
|
26
|
-
# <% graph.rows.each_with_index do |row, i| %>
|
27
|
-
# <% row.each_with_index do |value, j| %>
|
28
|
-
# <%= graph.data_name%>.setValue(<%= i %>, <%= j %>, value)
|
29
|
-
# <% end %>
|
30
|
-
# <% end %>
|
31
|
-
# <% end %>
|
32
|
-
# var chart_<%= graph.data_name%> = new google.visualization.<%=graph.chart_type%>(document.getElementById('<%=graph.chart_id%>'));
|
33
|
-
# chart.draw(data, <%=graph.options%>);
|
34
|
-
# }
|
35
|
-
# </script>
|
36
|
-
|
1
|
+
require File.join(File.dirname(__FILE__), 'graph')
|
2
|
+
|
3
|
+
module GViz
|
4
|
+
class Base
|
5
|
+
|
6
|
+
def initialize(config = {})
|
7
|
+
@viz_package_names = Set.new
|
8
|
+
@config = config
|
9
|
+
@graphs = []
|
10
|
+
@template_name = File.join(File.dirname(__FILE__), 'templates', 'visualization.erb')
|
11
|
+
end
|
12
|
+
|
37
13
|
def output
|
38
14
|
b = binding
|
39
|
-
rhtml = ERB.new(IO.read(
|
15
|
+
rhtml = ERB.new(IO.read(@template_name), 0, "-")
|
40
16
|
@output = rhtml.result(b)
|
41
17
|
return @output
|
42
18
|
end
|
43
19
|
|
44
20
|
def add_graph(type, data, mapping, options= {})
|
45
|
-
|
46
|
-
new_graph = new(type, data, mapping,
|
47
|
-
|
21
|
+
@viz_package_names.add(type)
|
22
|
+
new_graph = GViz::Graph.new(type, data, mapping, @graphs.size, options)
|
23
|
+
@graphs << new_graph
|
48
24
|
return new_graph.chart_id
|
49
25
|
end
|
50
|
-
|
51
|
-
def google_data_type(value)
|
52
|
-
if value.is_a?(Numeric)
|
53
|
-
data_type = 'numeric'
|
54
|
-
elsif value.is_a?(Date)
|
55
|
-
data_type = 'date'
|
56
|
-
elsif value.is_a?(DateTime) || value.is_a?(Time)
|
57
|
-
data_type = 'datetime'
|
58
|
-
elsif value.respond_to?(:to_s)
|
59
|
-
if !value.match(/[^0-9.]/)
|
60
|
-
data_type = 'numeric'
|
61
|
-
else
|
62
|
-
if (a = Date._parse(value)).size >= 3
|
63
|
-
if a.size >= 5
|
64
|
-
data_type = 'datetime'
|
65
|
-
else
|
66
|
-
data_type = 'date'
|
67
|
-
end
|
68
|
-
else
|
69
|
-
data_type = 'string'
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
73
|
-
data_type
|
74
|
-
end
|
75
|
-
|
76
|
-
def ruby_to_js(type, value)
|
77
|
-
return nil if value.nil?
|
78
|
-
if type == 'string'
|
79
|
-
value = "'#{value}'"
|
80
|
-
elsif type == 'date'
|
81
|
-
temp_d = Date.parse(value.to_s)
|
82
|
-
value = "new Date(#{temp_d.year}, #{temp_d.month - 1}, #{temp_d.day})"
|
83
|
-
elsif type == 'datetime'
|
84
|
-
temp_d DateTime.parse(value.to_s)
|
85
|
-
value = "new Date(#{temp_d.year}, #{temp_d.month - 1}, #{temp_d.day}, #{temp_d.hour}, #{temp_d.min}, #{temp_d.sec})"
|
86
|
-
end
|
87
|
-
return value
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
attr_reader :type, :options
|
92
|
-
|
93
|
-
def initialize(type, data, map, id = 0, options = {})
|
94
|
-
@type = type
|
95
|
-
@map = map
|
96
|
-
@data = data
|
97
|
-
@data_type = {}
|
98
|
-
@options = options
|
99
|
-
@id = id
|
100
|
-
import_data_types
|
101
|
-
end
|
102
|
-
|
103
|
-
def import_data_types
|
104
|
-
not_all_data_types_found = true
|
105
|
-
find_data_types = @map.dup
|
106
|
-
|
107
|
-
@data.each do |x|
|
108
|
-
break if find_data_types.size == 0
|
109
|
-
find_data_types.each do |k, v|
|
110
|
-
if x.key?(k)
|
111
|
-
@data_type[k] = self.class.google_data_type(x[k])
|
112
|
-
find_data_types.delete([k,v])
|
113
|
-
end
|
114
|
-
end
|
115
|
-
end
|
116
26
|
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
data = @map.map do |k, v|
|
125
|
-
[@data_type[k], v]
|
126
|
-
end
|
127
|
-
end
|
128
|
-
|
129
|
-
def size
|
130
|
-
@data.size
|
131
|
-
end
|
132
|
-
|
133
|
-
def rows
|
134
|
-
@data.map do |value|
|
135
|
-
@map.map do |k, v|
|
136
|
-
self.class.ruby_to_js(@data_type[k], value[k])
|
27
|
+
def method_missing(name, *args)
|
28
|
+
puts name
|
29
|
+
if name.to_s.match(/add_/)
|
30
|
+
type = name.to_s.gsub(/add_/){""}.gsub(/\/(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase }
|
31
|
+
return add_graph(type, *args)
|
32
|
+
else
|
33
|
+
raise NoMethodError.new("Undefined method #{name} for #{self.inspect}")
|
137
34
|
end
|
138
35
|
end
|
139
36
|
end
|
140
|
-
|
141
|
-
def chart_id
|
142
|
-
return @type.downcase + @id.to_s
|
143
|
-
end
|
144
|
-
|
145
|
-
def data_name
|
146
|
-
"data_#{@id}"
|
147
|
-
end
|
148
37
|
end
|
data/lib/g_viz/graph.rb
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
module GViz
|
2
|
+
class Graph
|
3
|
+
attr_reader :type, :options
|
4
|
+
|
5
|
+
def initialize(type, data, map, id = 0, options = {})
|
6
|
+
@type = type
|
7
|
+
@map = map
|
8
|
+
@data = data
|
9
|
+
@data_type = {}
|
10
|
+
@options = options
|
11
|
+
@id = id
|
12
|
+
import_data_types
|
13
|
+
end
|
14
|
+
|
15
|
+
def import_data_types
|
16
|
+
not_all_data_types_found = true
|
17
|
+
find_data_types = @map.dup
|
18
|
+
|
19
|
+
@data.each do |x|
|
20
|
+
break if find_data_types.size == 0
|
21
|
+
find_data_types.each do |k, v|
|
22
|
+
if x[k]
|
23
|
+
@data_type[k] = self.class.google_data_type(x[k])
|
24
|
+
find_data_types.delete([k,v])
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# if there is no data that responds to a mapped value, remove that mapping
|
30
|
+
@map -= find_data_types
|
31
|
+
end
|
32
|
+
|
33
|
+
def columns
|
34
|
+
data = @map.map do |k, v|
|
35
|
+
[@data_type[k], v]
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def size
|
40
|
+
@data.size
|
41
|
+
end
|
42
|
+
|
43
|
+
def rows
|
44
|
+
@data.map do |value|
|
45
|
+
@map.map do |k, v|
|
46
|
+
self.class.ruby_to_js(@data_type[k], value[k])
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def chart_id
|
52
|
+
return @type.downcase + @id.to_s
|
53
|
+
end
|
54
|
+
|
55
|
+
def data_name
|
56
|
+
"data_#{@id}"
|
57
|
+
end
|
58
|
+
|
59
|
+
class << self
|
60
|
+
def google_data_type(value)
|
61
|
+
if value.is_a?(Numeric)
|
62
|
+
data_type = 'number'
|
63
|
+
elsif value.is_a?(Date)
|
64
|
+
data_type = 'date'
|
65
|
+
elsif value.is_a?(DateTime) || value.is_a?(Time)
|
66
|
+
data_type = 'datetime'
|
67
|
+
elsif value.respond_to?(:to_s)
|
68
|
+
if !value.match(/[^0-9.]/)
|
69
|
+
data_type = 'number'
|
70
|
+
else
|
71
|
+
if (a = Date._parse(value)).size >= 3
|
72
|
+
if a.size >= 5
|
73
|
+
data_type = 'datetime'
|
74
|
+
else
|
75
|
+
data_type = 'date'
|
76
|
+
end
|
77
|
+
else
|
78
|
+
data_type = 'string'
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
data_type
|
83
|
+
end
|
84
|
+
|
85
|
+
def ruby_to_js(type, value)
|
86
|
+
return nil if value.nil?
|
87
|
+
if type == 'string'
|
88
|
+
value = "'#{value}'"
|
89
|
+
elsif type == 'date'
|
90
|
+
temp_d = Date.parse(value.to_s)
|
91
|
+
value = "new Date(#{temp_d.year}, #{temp_d.month - 1}, #{temp_d.day})"
|
92
|
+
elsif type == 'datetime'
|
93
|
+
temp_d = DateTime.parse(value.to_s)
|
94
|
+
value = "new Date(#{temp_d.year}, #{temp_d.month - 1}, #{temp_d.day}, #{temp_d.hour}, #{temp_d.min}, #{temp_d.sec})"
|
95
|
+
end
|
96
|
+
return value
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
end
|
101
|
+
end
|
@@ -1,9 +1,9 @@
|
|
1
1
|
<script type='text/javascript' src='http://www.google.com/jsapi<%= @api_key %>'></script>
|
2
2
|
<script type='text/javascript'>
|
3
|
-
google.load('visualization', '1', {'packages':[<%=
|
3
|
+
google.load('visualization', '1', {'packages':[<%= @viz_package_names.map{|p|"'" + p.downcase + "'"}.join(',') -%>]});
|
4
4
|
google.setOnLoadCallback(drawChart);
|
5
5
|
function drawChart() {
|
6
|
-
<%-
|
6
|
+
<%- @graphs.each do |graph| -%>
|
7
7
|
var <%= graph.data_name%> = new google.visualization.DataTable();
|
8
8
|
<%- graph.columns.each do |column| -%>
|
9
9
|
<%= graph.data_name%>.addColumn('<%= column[0] %>', '<%= column[1] %>')
|
@@ -18,7 +18,7 @@
|
|
18
18
|
end
|
19
19
|
end -%>
|
20
20
|
var chart_<%= graph.data_name %> = new google.visualization.<%= graph.type %>(document.getElementById('<%= graph.chart_id %>'));
|
21
|
-
|
21
|
+
chart_<%= graph.data_name %>.draw(<%= graph.data_name%>, <%=graph.options.to_json%>);
|
22
22
|
<%- end -%>
|
23
23
|
}
|
24
24
|
</script>
|
data/lib/g_viz.rb
ADDED
data/spec/g_viz/g_viz_spec.rb
CHANGED
@@ -16,44 +16,38 @@ describe GViz do
|
|
16
16
|
{:date => Date.parse("2008-02-05"), :sold_pencils => 41476, :sold_pens => 66467, :title1 => 'Bought Pens',:text2 => 'Bought 200k pens'},
|
17
17
|
{:date => Date.parse("2008-02-06"), :sold_pencils => 33322, :sold_pens => 39463, :title1 => 'Bought Pens',:text2 => 'Bought 200k pens'}
|
18
18
|
]
|
19
|
-
GViz.
|
20
|
-
|
19
|
+
g = GViz::Base.new
|
20
|
+
g.add_graph('AnnotatedTimeline', @data, @mapping)
|
21
|
+
output = g.output
|
21
22
|
puts output
|
22
23
|
output.should == TestHelper.template('rendered_annotated_timeline')
|
23
24
|
end
|
24
25
|
end
|
25
|
-
|
26
|
-
describe 'graph' do
|
27
|
-
@games = [{:name => "Gary", :games_won => "2", :birthday => "2008-02-01"},
|
28
|
-
{:name => "John", :games_won => "4", :birthday => Date.parse("2009-01-01 11:11")},
|
29
|
-
{:name => "A", :games_won => "2", :birthday => "Jun 14 1982"}]
|
30
|
-
GViz.add_graph('MotionGraph', @games, [[:name, "Name"], [:games_won, "# Games"]])
|
31
|
-
end
|
32
26
|
end
|
33
27
|
|
34
28
|
describe 'implementation details - class methods' do
|
35
29
|
describe 'google_data_type' do
|
36
30
|
it "should classify ruby data types to google visualization data types" do
|
37
|
-
GViz.google_data_type(Time.now).should == 'datetime'
|
38
|
-
GViz.google_data_type(Date.new).should == 'date'
|
39
|
-
GViz.google_data_type("June 23 1982").should == 'date'
|
40
|
-
GViz.google_data_type("June 23 1982 12:23").should == 'datetime'
|
41
|
-
GViz.google_data_type("12312412").should == 'numeric'
|
42
|
-
GViz.google_data_type("12312412.1234").should == 'numeric'
|
43
|
-
GViz.google_data_type(1234123).should == 'numeric'
|
44
|
-
GViz.google_data_type(1234123.1234).should == 'numeric'
|
45
|
-
GViz.google_data_type("a123124123").should == 'string'
|
31
|
+
GViz::Graph.google_data_type(Time.now).should == 'datetime'
|
32
|
+
GViz::Graph.google_data_type(Date.new).should == 'date'
|
33
|
+
GViz::Graph.google_data_type("June 23 1982").should == 'date'
|
34
|
+
GViz::Graph.google_data_type("June 23 1982 12:23").should == 'datetime'
|
35
|
+
GViz::Graph.google_data_type("12312412").should == 'numeric'
|
36
|
+
GViz::Graph.google_data_type("12312412.1234").should == 'numeric'
|
37
|
+
GViz::Graph.google_data_type(1234123).should == 'numeric'
|
38
|
+
GViz::Graph.google_data_type(1234123.1234).should == 'numeric'
|
39
|
+
GViz::Graph.google_data_type("a123124123").should == 'string'
|
46
40
|
# should this really happen? documenting it because i need to think if this is ok.
|
47
|
-
GViz.google_data_type("a12312412").should == 'date'
|
41
|
+
GViz::Graph.google_data_type("a12312412").should == 'date'
|
48
42
|
end
|
49
43
|
end
|
50
44
|
|
51
45
|
describe 'ruby_to_js' do
|
52
46
|
it "should return the js string representation of that data " do
|
53
|
-
GViz.ruby_to_js('numeric', 12341234).should == 12341234
|
54
|
-
GViz.ruby_to_js('string', 12341234).should == "'12341234'"
|
55
|
-
GViz.ruby_to_js('date', "June 23 1982").should == "new Date(1982, 5, 23)"
|
56
|
-
GViz.ruby_to_js('date', Date.parse("June 23 1982")).should == "new Date(1982, 5, 23)"
|
47
|
+
GViz::Graph.ruby_to_js('numeric', 12341234).should == 12341234
|
48
|
+
GViz::Graph.ruby_to_js('string', 12341234).should == "'12341234'"
|
49
|
+
GViz::Graph.ruby_to_js('date', "June 23 1982").should == "new Date(1982, 5, 23)"
|
50
|
+
GViz::Graph.ruby_to_js('date', Date.parse("June 23 1982")).should == "new Date(1982, 5, 23)"
|
57
51
|
end
|
58
52
|
end
|
59
53
|
end
|
@@ -68,7 +62,7 @@ describe GViz do
|
|
68
62
|
["'John'", "4", "new Date(2009, 0, 1)"],
|
69
63
|
["'A'", "2", "new Date(1982, 5, 14)"]]
|
70
64
|
|
71
|
-
@gviz = GViz.
|
65
|
+
@gviz = GViz::Graph.new('bar', @games, [[:name, "Name"], [:games_won, "Games Won"], [:birthday, 'Birthday']])
|
72
66
|
end
|
73
67
|
|
74
68
|
describe 'columns' do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: garru-g_viz
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gary Tsang
|
@@ -22,12 +22,16 @@ extensions: []
|
|
22
22
|
extra_rdoc_files:
|
23
23
|
- CHANGELOG
|
24
24
|
- lib/g_viz/g_viz.rb
|
25
|
+
- lib/g_viz/graph.rb
|
25
26
|
- lib/g_viz/templates/visualization.erb
|
27
|
+
- lib/g_viz.rb
|
26
28
|
- README
|
27
29
|
files:
|
28
30
|
- CHANGELOG
|
29
31
|
- lib/g_viz/g_viz.rb
|
32
|
+
- lib/g_viz/graph.rb
|
30
33
|
- lib/g_viz/templates/visualization.erb
|
34
|
+
- lib/g_viz.rb
|
31
35
|
- Manifest
|
32
36
|
- Rakefile
|
33
37
|
- README
|