rgviz-rails 0.72 → 0.73

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,6 +1,8 @@
1
1
  rgviz-rails
2
2
  ===========
3
3
 
4
+ [![Build Status](https://secure.travis-ci.org/asterite/rgviz-rails.png?branch=master)](http://travis-ci.org/asterite/rgviz-rails)
5
+
4
6
  This library makes it easy to implement a visualization data source so that you can easily chart or visualize your data from [ActiveRecord](http://ar.rubyonrails.org/) models or from in-memory arrays. the library implements the [Google Visualization API wire protocol](http://code.google.com/apis/visualization/documentation/dev/implementing_data_source.html).
5
7
 
6
8
  It also allows you to [render the visualizations in a view template](https://github.com/asterite/rgviz-rails/wiki/showing-a-visualization-in-a-view) in a very simple but powerful way.
@@ -18,7 +20,7 @@ Rails 3
18
20
  In your gemfile
19
21
 
20
22
  gem 'rgviz'
21
- gem 'rgviz-rails'
23
+ gem 'rgviz-rails', :require => 'rgviz_rails'
22
24
 
23
25
  Rails 2.x
24
26
  ---------
@@ -26,7 +28,7 @@ Rails 2.x
26
28
  In your environment.rb
27
29
 
28
30
  config.gem "rgviz"
29
- config.gem "rgviz-rails"
31
+ config.gem "rgviz-rails", :require => 'rgviz_rails'
30
32
 
31
33
  Usage
32
34
  -----
@@ -119,10 +121,36 @@ You can also apply a query over an array of arrays that contains your "records"
119
121
 
120
122
  This is very useful if you need to present visualizations against data coming from a csv file.
121
123
 
124
+ Virtual columns
125
+ ---------------
126
+
127
+ GQL is nice but it's not very powerful (except for the cute pivot clause).
128
+
129
+ If you need to select columns using complex SQL, you might be able to do it with virtual columns.
130
+
131
+ For example, in your controller you put:
132
+
133
+ render :rgviz => Person, :virtual_columns => {
134
+ 'age_range' => {
135
+ :sql => "case when age < 20 then 'young' else 'old' end",
136
+ :type => :string
137
+ }
138
+ }
139
+
140
+ Then in a query you can do:
141
+
142
+ select age_range ...
143
+
144
+ Note that the keys of the virtual_columns hash must be strings. The value can be a hash with :sql and :type key-value pairs (since GQL needs the type of every column), or can be just a string if you want the column to be replaced by another GQL expression. For example:
145
+
146
+ render :rgviz => Person, :virtual_columns => {
147
+ 'age_plus_two' => 'age + 2'
148
+ }
149
+
122
150
  Current limitations
123
151
  -------------------
124
152
 
125
- * the *format* clause works, but formatting is as in ruby (like "%.2f" for numbers, "foo %s bar" for strings, and "%y-%m-%d" for dates, as specified by time#strftime)
153
+ * the *format* clause works, but formatting is as in ruby (like "%.2f" for numbers, "foo %s bar" for strings, and "%y-%m-%d" for dates, as specified by [Time#strftime](http://www.ruby-doc.org/core-1.9.3/Time.html#method-i-strftime))
126
154
  * only supports mysql, postgresql and sqlite adapters
127
155
  * these scalar functions are not supported for sqlite: *millisecond*, *quarter*
128
156
  * these scalar functions are not supported for mysql: *millisecond*
@@ -23,6 +23,7 @@ module Rgviz
23
23
  conditions = options[:conditions]
24
24
  virtual_columns = options[:virtual_columns]
25
25
  package = options[:package]
26
+ load = options[:load]
26
27
 
27
28
  rgviz_events, google_events = events.partition{|x| x[0].to_s.start_with? 'rgviz'}
28
29
  rgviz_events = rgviz_events.inject(Hash.new){|h, y| h[y[0]] = y[1]; h}
@@ -104,13 +105,24 @@ module Rgviz
104
105
  visitor.params.each{|p| params << p unless params.include?(p)}
105
106
  params = params.sort!.map{|i| "param_#{i}"}
106
107
 
108
+ callback = "rgviz_draw_#{id}"
109
+
107
110
  out = ''
108
111
 
112
+ # Write the div
113
+ out << "<div id=\"#{id}\""
114
+ html.each do |key, value|
115
+ out << " #{key}=\"#{h value}\""
116
+ end
117
+ out << "></div>\n"
118
+
109
119
  # Output the google jsapi tag the first time
110
120
  @first_time ||= 1
111
- if load_google && @first_time == 1
121
+
122
+ if load != :auto && load_google && @first_time == 1
112
123
  out << "<script type=\"text/javascript\" src=\"http://www.google.com/jsapi\"></script>\n"
113
124
  end
125
+
114
126
  # Now the real script
115
127
  out << "<script type=\"text/javascript\">\n"
116
128
 
@@ -156,25 +168,6 @@ module Rgviz
156
168
  @defined_rgviz_append = true
157
169
  end
158
170
 
159
- if load_package
160
- # Load visualizations and the package, if not already loaded
161
- package ||= get_package(kind)
162
-
163
- @packages ||= []
164
- unless @packages.include?(package)
165
- out << "google.load(\"visualization\", \"1\", {'packages':['#{package}']});\n"
166
- @packages << package
167
- end
168
- end
169
-
170
- callback = "rgviz_draw_#{id}"
171
-
172
- # Set the callback if the function doesn't have params and if the
173
- # user didn't request to hide the visualization
174
- if !ajax && !hidden && params.empty?
175
- out << "google.setOnLoadCallback(#{callback});\n"
176
- end
177
-
178
171
  # Define the visualization var and data
179
172
  out << "var rgviz_#{id} = null;\n"
180
173
  out << "var rgviz_#{id}_data = null;\n"
@@ -222,19 +215,44 @@ module Rgviz
222
215
  out << "});\n"
223
216
  end
224
217
  out << "}\n"
218
+
219
+ if load != :auto && load_package
220
+ # Load visualizations and the package, if not already loaded
221
+ package ||= get_package(kind)
222
+
223
+ @packages ||= []
224
+ unless @packages.include?(package)
225
+ out << "google.load(\"visualization\", \"1\", {'packages':['#{package}']"
226
+
227
+ if load == :dynamic && !ajax && !hidden && params.empty?
228
+ out << ", 'callback': #{callback}"
229
+ end
230
+
231
+ out << "});\n"
232
+ @packages << package
233
+ end
234
+ end
235
+
236
+ # Set the callback if the function doesn't have params and if the
237
+ # user didn't request to hide the visualization
238
+ if !load && !ajax && !hidden && params.empty?
239
+ out << "google.setOnLoadCallback(#{callback});\n"
240
+ end
241
+
225
242
  out << "#{callback}()" if ajax
243
+
226
244
  out << "</script>\n"
227
245
 
228
- # Write the div
229
- out << "<div id=\"#{id}\""
230
- html.each do |key, value|
231
- out << " #{key}=\"#{h value}\""
246
+ if load == :auto && !ajax && !hidden && params.empty?
247
+ require 'cgi'
248
+
249
+ package ||= get_package(kind)
250
+ autoload = {'modules' => [{'name' => 'visualization', 'version' => '1', 'packages' => ["#{package}"], 'callback' => callback}]}
251
+ out << "<script type=\"text/javascript\" src=\"http://www.google.com/jsapi?autoload=#{CGI.escape autoload.to_json}\"></script>\n"
232
252
  end
233
- out << "></div>\n"
234
253
 
235
254
  @first_time = 0
236
255
 
237
-
238
256
  if Rails::VERSION::MAJOR == 2
239
257
  out
240
258
  else
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rgviz-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.72'
4
+ version: '0.73'
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-07-30 00:00:00.000000000Z
12
+ date: 2012-08-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rgviz
16
- requirement: &70273597103400 !ruby/object:Gem::Requirement
16
+ requirement: &70257227777720 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0.46'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70273597103400
24
+ version_requirements: *70257227777720
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rails
27
- requirement: &70273597102640 !ruby/object:Gem::Requirement
27
+ requirement: &70257227776920 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,7 +32,7 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70273597102640
35
+ version_requirements: *70257227776920
36
36
  description:
37
37
  email: aborenszweig@manas.com.ar
38
38
  executables: []