google_visualr 2.0.6 → 2.1.0

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.
Files changed (59) hide show
  1. data/Gemfile.lock +67 -1
  2. data/README.rdoc +7 -2
  3. data/google_visualr.gemspec +1 -0
  4. data/lib/google_visualr.rb +3 -0
  5. data/lib/google_visualr/app/helpers/view_helper.rb +23 -0
  6. data/lib/google_visualr/app/railtie.rb +19 -0
  7. data/lib/google_visualr/version.rb +1 -1
  8. data/spec/dummy/Gemfile +0 -0
  9. data/spec/dummy/Gemfile.lock +7 -0
  10. data/spec/dummy/Rakefile +7 -0
  11. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  12. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  13. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  14. data/spec/dummy/config.ru +4 -0
  15. data/spec/dummy/config/application.rb +38 -0
  16. data/spec/dummy/config/boot.rb +6 -0
  17. data/spec/dummy/config/database.yml +22 -0
  18. data/spec/dummy/config/environment.rb +5 -0
  19. data/spec/dummy/config/environments/development.rb +26 -0
  20. data/spec/dummy/config/environments/production.rb +49 -0
  21. data/spec/dummy/config/environments/test.rb +35 -0
  22. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  23. data/spec/dummy/config/initializers/inflections.rb +10 -0
  24. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  25. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  26. data/spec/dummy/config/initializers/session_store.rb +8 -0
  27. data/spec/dummy/config/locales/en.yml +5 -0
  28. data/spec/dummy/config/routes.rb +58 -0
  29. data/spec/dummy/db/seeds.rb +7 -0
  30. data/spec/dummy/doc/README_FOR_APP +2 -0
  31. data/spec/dummy/lib/tasks/.gitkeep +0 -0
  32. data/spec/dummy/log/development.log +0 -0
  33. data/spec/dummy/log/production.log +0 -0
  34. data/spec/dummy/log/server.log +0 -0
  35. data/spec/dummy/log/test.log +0 -0
  36. data/spec/dummy/public/404.html +26 -0
  37. data/spec/dummy/public/422.html +26 -0
  38. data/spec/dummy/public/500.html +26 -0
  39. data/spec/dummy/public/favicon.ico +0 -0
  40. data/spec/dummy/public/images/rails.png +0 -0
  41. data/spec/dummy/public/index.html +239 -0
  42. data/spec/dummy/public/javascripts/application.js +2 -0
  43. data/spec/dummy/public/javascripts/controls.js +965 -0
  44. data/spec/dummy/public/javascripts/dragdrop.js +974 -0
  45. data/spec/dummy/public/javascripts/effects.js +1123 -0
  46. data/spec/dummy/public/javascripts/prototype.js +6001 -0
  47. data/spec/dummy/public/javascripts/rails.js +191 -0
  48. data/spec/dummy/public/robots.txt +5 -0
  49. data/spec/dummy/public/stylesheets/.gitkeep +0 -0
  50. data/spec/dummy/script/rails +6 -0
  51. data/spec/dummy/test/performance/browsing_test.rb +9 -0
  52. data/spec/dummy/test/test_helper.rb +13 -0
  53. data/spec/dummy/vendor/plugins/.gitkeep +0 -0
  54. data/spec/google_visualr/app/helpers/view_helper_spec.rb +23 -0
  55. data/spec/google_visualr/base_chart_spec.rb +3 -27
  56. data/spec/google_visualr/formatters_spec.rb +1 -0
  57. data/spec/spec_helper.rb +7 -2
  58. data/spec/support/common.rb +33 -0
  59. metadata +63 -2
@@ -0,0 +1,191 @@
1
+ (function() {
2
+ // Technique from Juriy Zaytsev
3
+ // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/
4
+ function isEventSupported(eventName) {
5
+ var el = document.createElement('div');
6
+ eventName = 'on' + eventName;
7
+ var isSupported = (eventName in el);
8
+ if (!isSupported) {
9
+ el.setAttribute(eventName, 'return;');
10
+ isSupported = typeof el[eventName] == 'function';
11
+ }
12
+ el = null;
13
+ return isSupported;
14
+ }
15
+
16
+ function isForm(element) {
17
+ return Object.isElement(element) && element.nodeName.toUpperCase() == 'FORM'
18
+ }
19
+
20
+ function isInput(element) {
21
+ if (Object.isElement(element)) {
22
+ var name = element.nodeName.toUpperCase()
23
+ return name == 'INPUT' || name == 'SELECT' || name == 'TEXTAREA'
24
+ }
25
+ else return false
26
+ }
27
+
28
+ var submitBubbles = isEventSupported('submit'),
29
+ changeBubbles = isEventSupported('change')
30
+
31
+ if (!submitBubbles || !changeBubbles) {
32
+ // augment the Event.Handler class to observe custom events when needed
33
+ Event.Handler.prototype.initialize = Event.Handler.prototype.initialize.wrap(
34
+ function(init, element, eventName, selector, callback) {
35
+ init(element, eventName, selector, callback)
36
+ // is the handler being attached to an element that doesn't support this event?
37
+ if ( (!submitBubbles && this.eventName == 'submit' && !isForm(this.element)) ||
38
+ (!changeBubbles && this.eventName == 'change' && !isInput(this.element)) ) {
39
+ // "submit" => "emulated:submit"
40
+ this.eventName = 'emulated:' + this.eventName
41
+ }
42
+ }
43
+ )
44
+ }
45
+
46
+ if (!submitBubbles) {
47
+ // discover forms on the page by observing focus events which always bubble
48
+ document.on('focusin', 'form', function(focusEvent, form) {
49
+ // special handler for the real "submit" event (one-time operation)
50
+ if (!form.retrieve('emulated:submit')) {
51
+ form.on('submit', function(submitEvent) {
52
+ var emulated = form.fire('emulated:submit', submitEvent, true)
53
+ // if custom event received preventDefault, cancel the real one too
54
+ if (emulated.returnValue === false) submitEvent.preventDefault()
55
+ })
56
+ form.store('emulated:submit', true)
57
+ }
58
+ })
59
+ }
60
+
61
+ if (!changeBubbles) {
62
+ // discover form inputs on the page
63
+ document.on('focusin', 'input, select, texarea', function(focusEvent, input) {
64
+ // special handler for real "change" events
65
+ if (!input.retrieve('emulated:change')) {
66
+ input.on('change', function(changeEvent) {
67
+ input.fire('emulated:change', changeEvent, true)
68
+ })
69
+ input.store('emulated:change', true)
70
+ }
71
+ })
72
+ }
73
+
74
+ function handleRemote(element) {
75
+ var method, url, params;
76
+
77
+ var event = element.fire("ajax:before");
78
+ if (event.stopped) return false;
79
+
80
+ if (element.tagName.toLowerCase() === 'form') {
81
+ method = element.readAttribute('method') || 'post';
82
+ url = element.readAttribute('action');
83
+ params = element.serialize();
84
+ } else {
85
+ method = element.readAttribute('data-method') || 'get';
86
+ url = element.readAttribute('href');
87
+ params = {};
88
+ }
89
+
90
+ new Ajax.Request(url, {
91
+ method: method,
92
+ parameters: params,
93
+ evalScripts: true,
94
+
95
+ onComplete: function(request) { element.fire("ajax:complete", request); },
96
+ onSuccess: function(request) { element.fire("ajax:success", request); },
97
+ onFailure: function(request) { element.fire("ajax:failure", request); }
98
+ });
99
+
100
+ element.fire("ajax:after");
101
+ }
102
+
103
+ function handleMethod(element) {
104
+ var method = element.readAttribute('data-method'),
105
+ url = element.readAttribute('href'),
106
+ csrf_param = $$('meta[name=csrf-param]')[0],
107
+ csrf_token = $$('meta[name=csrf-token]')[0];
108
+
109
+ var form = new Element('form', { method: "POST", action: url, style: "display: none;" });
110
+ element.parentNode.insert(form);
111
+
112
+ if (method !== 'post') {
113
+ var field = new Element('input', { type: 'hidden', name: '_method', value: method });
114
+ form.insert(field);
115
+ }
116
+
117
+ if (csrf_param) {
118
+ var param = csrf_param.readAttribute('content'),
119
+ token = csrf_token.readAttribute('content'),
120
+ field = new Element('input', { type: 'hidden', name: param, value: token });
121
+ form.insert(field);
122
+ }
123
+
124
+ form.submit();
125
+ }
126
+
127
+
128
+ document.on("click", "*[data-confirm]", function(event, element) {
129
+ var message = element.readAttribute('data-confirm');
130
+ if (!confirm(message)) event.stop();
131
+ });
132
+
133
+ document.on("click", "a[data-remote]", function(event, element) {
134
+ if (event.stopped) return;
135
+ handleRemote(element);
136
+ event.stop();
137
+ });
138
+
139
+ document.on("click", "a[data-method]", function(event, element) {
140
+ if (event.stopped) return;
141
+ handleMethod(element);
142
+ event.stop();
143
+ });
144
+
145
+ document.on("submit", function(event) {
146
+ var element = event.findElement(),
147
+ message = element.readAttribute('data-confirm');
148
+ if (message && !confirm(message)) {
149
+ event.stop();
150
+ return false;
151
+ }
152
+
153
+ var inputs = element.select("input[type=submit][data-disable-with]");
154
+ inputs.each(function(input) {
155
+ input.disabled = true;
156
+ input.writeAttribute('data-original-value', input.value);
157
+ input.value = input.readAttribute('data-disable-with');
158
+ });
159
+
160
+ var element = event.findElement("form[data-remote]");
161
+ if (element) {
162
+ handleRemote(element);
163
+ event.stop();
164
+ }
165
+ });
166
+
167
+ document.on("ajax:after", "form", function(event, element) {
168
+ var inputs = element.select("input[type=submit][disabled=true][data-disable-with]");
169
+ inputs.each(function(input) {
170
+ input.value = input.readAttribute('data-original-value');
171
+ input.removeAttribute('data-original-value');
172
+ input.disabled = false;
173
+ });
174
+ });
175
+
176
+ Ajax.Responders.register({
177
+ onCreate: function(request) {
178
+ var csrf_meta_tag = $$('meta[name=csrf-token]')[0];
179
+
180
+ if (csrf_meta_tag) {
181
+ var header = 'X-CSRF-Token',
182
+ token = csrf_meta_tag.readAttribute('content');
183
+
184
+ if (!request.options.requestHeaders) {
185
+ request.options.requestHeaders = {};
186
+ }
187
+ request.options.requestHeaders[header] = token;
188
+ }
189
+ }
190
+ });
191
+ })();
@@ -0,0 +1,5 @@
1
+ # See http://www.robotstxt.org/wc/norobots.html for documentation on how to use the robots.txt file
2
+ #
3
+ # To ban all spiders from the entire site uncomment the next two lines:
4
+ # User-Agent: *
5
+ # Disallow: /
File without changes
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ # This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
3
+
4
+ APP_PATH = File.expand_path('../../config/application', __FILE__)
5
+ require File.expand_path('../../config/boot', __FILE__)
6
+ require 'rails/commands'
@@ -0,0 +1,9 @@
1
+ require 'test_helper'
2
+ require 'rails/performance_test_help'
3
+
4
+ # Profiling results for each test method are written to tmp/performance.
5
+ class BrowsingTest < ActionDispatch::PerformanceTest
6
+ def test_homepage
7
+ get '/'
8
+ end
9
+ end
@@ -0,0 +1,13 @@
1
+ ENV["RAILS_ENV"] = "test"
2
+ require File.expand_path('../../config/environment', __FILE__)
3
+ require 'rails/test_help'
4
+
5
+ class ActiveSupport::TestCase
6
+ # Setup all fixtures in test/fixtures/*.(yml|csv) for all tests in alphabetical order.
7
+ #
8
+ # Note: You'll currently still have to declare fixtures explicitly in integration tests
9
+ # -- they do not yet inherit this setting
10
+ fixtures :all
11
+
12
+ # Add more helper methods to be used by all tests here...
13
+ end
File without changes
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ describe "ApplicationController" do
4
+
5
+ describe "#render_chart" do
6
+
7
+ it "has method" do
8
+ ApplicationController.instance_methods.should include :render_chart
9
+ end
10
+
11
+ it "includes method in corresponding helper" do
12
+ ApplicationController.helpers.methods.should include :render_chart
13
+ end
14
+
15
+ it "returns html_safe javascript" do
16
+ controller = ApplicationController.new
17
+ js = controller.render_chart base_chart, "div_chart"
18
+ js.should == base_chart_js("div_chart")
19
+ end
20
+
21
+ end
22
+
23
+ end
@@ -2,26 +2,9 @@ require 'spec_helper'
2
2
 
3
3
  describe GoogleVisualr::BaseChart do
4
4
 
5
- def data_table
6
-
7
- @cols = [
8
- { :type => "string", :label => "Year" },
9
- { :type => "number", :label => "Sales" },
10
- { :type => "number", :label => "Expenses" }
11
- ]
12
- @rows = [
13
- { :c => [ {:v => "2004"}, {:v => 1000}, {:v => 400} ] },
14
- { :c => [ {:v => "2005"}, {:v => 1200}, {:v => 450} ] },
15
- { :c => [ {:v => "2006"}, {:v => 1500}, {:v => 600} ] },
16
- { :c => [ {:v => "2007"}, {:v => 800 }, {:v => 500} ] }
17
- ]
18
- GoogleVisualr::DataTable.new(:cols => @cols, :rows => @rows)
19
-
20
- end
21
-
22
5
  before do
23
6
  @dt = data_table
24
- @chart = GoogleVisualr::BaseChart.new( @dt, { :legend => "Test Chart", :width => 800, :is3D => true } )
7
+ @chart = base_chart(@dt)
25
8
  end
26
9
 
27
10
  describe "#initialize" do
@@ -40,15 +23,8 @@ describe GoogleVisualr::BaseChart do
40
23
 
41
24
  describe "#to_js" do
42
25
  it "generates JS" do
43
- js = @chart.to_js("#body")
44
- js.should_not be_nil
45
- js.should match /DataTable/i
46
- js.should match /addColumn/i
47
- js.should match /addRow/i
48
- js.should match /legend/i
49
- js.should match /Test Chart/i
50
- js.should match /width/i
51
- js.should match /800/i
26
+ js = @chart.to_js("body")
27
+ js.should == base_chart_js("body")
52
28
  end
53
29
  end
54
30
 
@@ -1,6 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe GoogleVisualr::Formatter do
4
+
4
5
  def valid_object(params={})
5
6
  GoogleVisualr::Formatter.new(params)
6
7
  end
data/spec/spec_helper.rb CHANGED
@@ -1,8 +1,13 @@
1
1
  require 'rubygems'
2
2
  require 'bundler/setup'
3
3
 
4
- require 'google_visualr'
4
+ # Configure Rails Environment
5
+ ENV["RAILS_ENV"] = "test"
6
+ require File.expand_path("../dummy/config/environment.rb", __FILE__)
7
+
8
+ # Load Support Files
9
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
5
10
 
6
11
  RSpec.configure do |config|
7
12
  # some (optional) config here
8
- end
13
+ end
@@ -0,0 +1,33 @@
1
+ def data_table
2
+
3
+ @cols = [
4
+ { :type => "string", :label => "Year" },
5
+ { :type => "number", :label => "Sales" },
6
+ { :type => "number", :label => "Expenses" }
7
+ ]
8
+ @rows = [
9
+ { :c => [ {:v => "2004"}, {:v => 1000}, {:v => 400} ] },
10
+ { :c => [ {:v => "2005"}, {:v => 1200}, {:v => 450} ] },
11
+ { :c => [ {:v => "2006"}, {:v => 1500}, {:v => 600} ] },
12
+ { :c => [ {:v => "2007"}, {:v => 800 }, {:v => 500} ] }
13
+ ]
14
+ GoogleVisualr::DataTable.new(:cols => @cols, :rows => @rows)
15
+
16
+ end
17
+
18
+ def base_chart(data_table=data_table)
19
+
20
+ GoogleVisualr::BaseChart.new( data_table, { :legend => "Test Chart", :width => 800, :is3D => true } )
21
+
22
+ end
23
+
24
+ def base_chart_js(div_class="div_class")
25
+
26
+ js = "\n<script type='text/javascript'>"
27
+ js << "\n google.load('visualization','1', {packages: ['basechart'], callback: function() {"
28
+ js << "\n var data_table = new google.visualization.DataTable();data_table.addColumn('string', 'Year');data_table.addColumn('number', 'Sales');data_table.addColumn('number', 'Expenses');data_table.addRow([{v: '2004'}, {v: 1000}, {v: 400}]);data_table.addRow([{v: '2005'}, {v: 1200}, {v: 450}]);data_table.addRow([{v: '2006'}, {v: 1500}, {v: 600}]);data_table.addRow([{v: '2007'}, {v: 800}, {v: 500}]);\n var chart = new google.visualization.BaseChart(document.getElementById('#{div_class}'));"
29
+ js << "\n chart.draw(data_table, {legend: 'Test Chart', width: 800, is3D: true});"
30
+ js << "\n }});"
31
+ js << "\n</script>"
32
+
33
+ end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: google_visualr
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 2.0.6
5
+ version: 2.1.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - Winston Teo
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-07-11 00:00:00 Z
13
+ date: 2011-08-13 00:00:00 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: bundler
@@ -34,6 +34,17 @@ dependencies:
34
34
  version: 2.6.0
35
35
  type: :development
36
36
  version_requirements: *id002
37
+ - !ruby/object:Gem::Dependency
38
+ name: rails
39
+ prerelease: false
40
+ requirement: &id003 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ version: 3.0.9
46
+ type: :development
47
+ version_requirements: *id003
37
48
  description: This Ruby gem, GoogleVisualr, is a wrapper around the Google Chart Tools that allows anyone to create the same beautiful charts with just Ruby; you don't have to write any JavaScript at all.
38
49
  email:
39
50
  - winston.yongwei+google_visualr@gmail.com
@@ -55,6 +66,8 @@ files:
55
66
  - Rakefile
56
67
  - google_visualr.gemspec
57
68
  - lib/google_visualr.rb
69
+ - lib/google_visualr/app/helpers/view_helper.rb
70
+ - lib/google_visualr/app/railtie.rb
58
71
  - lib/google_visualr/base_chart.rb
59
72
  - lib/google_visualr/data_table.rb
60
73
  - lib/google_visualr/formatters.rb
@@ -80,11 +93,59 @@ files:
80
93
  - lib/google_visualr/packages.rb
81
94
  - lib/google_visualr/param_helpers.rb
82
95
  - lib/google_visualr/version.rb
96
+ - spec/dummy/Gemfile
97
+ - spec/dummy/Gemfile.lock
98
+ - spec/dummy/Rakefile
99
+ - spec/dummy/app/controllers/application_controller.rb
100
+ - spec/dummy/app/helpers/application_helper.rb
101
+ - spec/dummy/app/views/layouts/application.html.erb
102
+ - spec/dummy/config.ru
103
+ - spec/dummy/config/application.rb
104
+ - spec/dummy/config/boot.rb
105
+ - spec/dummy/config/database.yml
106
+ - spec/dummy/config/environment.rb
107
+ - spec/dummy/config/environments/development.rb
108
+ - spec/dummy/config/environments/production.rb
109
+ - spec/dummy/config/environments/test.rb
110
+ - spec/dummy/config/initializers/backtrace_silencers.rb
111
+ - spec/dummy/config/initializers/inflections.rb
112
+ - spec/dummy/config/initializers/mime_types.rb
113
+ - spec/dummy/config/initializers/secret_token.rb
114
+ - spec/dummy/config/initializers/session_store.rb
115
+ - spec/dummy/config/locales/en.yml
116
+ - spec/dummy/config/routes.rb
117
+ - spec/dummy/db/seeds.rb
118
+ - spec/dummy/doc/README_FOR_APP
119
+ - spec/dummy/lib/tasks/.gitkeep
120
+ - spec/dummy/log/development.log
121
+ - spec/dummy/log/production.log
122
+ - spec/dummy/log/server.log
123
+ - spec/dummy/log/test.log
124
+ - spec/dummy/public/404.html
125
+ - spec/dummy/public/422.html
126
+ - spec/dummy/public/500.html
127
+ - spec/dummy/public/favicon.ico
128
+ - spec/dummy/public/images/rails.png
129
+ - spec/dummy/public/index.html
130
+ - spec/dummy/public/javascripts/application.js
131
+ - spec/dummy/public/javascripts/controls.js
132
+ - spec/dummy/public/javascripts/dragdrop.js
133
+ - spec/dummy/public/javascripts/effects.js
134
+ - spec/dummy/public/javascripts/prototype.js
135
+ - spec/dummy/public/javascripts/rails.js
136
+ - spec/dummy/public/robots.txt
137
+ - spec/dummy/public/stylesheets/.gitkeep
138
+ - spec/dummy/script/rails
139
+ - spec/dummy/test/performance/browsing_test.rb
140
+ - spec/dummy/test/test_helper.rb
141
+ - spec/dummy/vendor/plugins/.gitkeep
142
+ - spec/google_visualr/app/helpers/view_helper_spec.rb
83
143
  - spec/google_visualr/base_chart_spec.rb
84
144
  - spec/google_visualr/data_table_spec.rb
85
145
  - spec/google_visualr/formatters_spec.rb
86
146
  - spec/google_visualr/param_helpers_spec.rb
87
147
  - spec/spec_helper.rb
148
+ - spec/support/common.rb
88
149
  - test/google_visualr_spec.rb
89
150
  - test/helper.rb
90
151
  homepage: https://github.com/winston/google_visualr