gaugejs-rails 0.0.1

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,29 @@
1
+ # largely copying the example from the
2
+ # less-rails-fontawesome gem
3
+
4
+ $:.push File.expand_path("../lib", __FILE__)
5
+
6
+ require 'gaugejs-rails/version'
7
+
8
+ Gem::Specification.new do |s|
9
+ s.name = 'gaugejs-rails'
10
+ s.version = GaugeJS::Rails::VERSION
11
+ s.authors = ['Chris Miller']
12
+ s.email = ['lordsauronthegreat@gmail.com']
13
+ s.homepage = 'https://github.com/NSError/gaugejs-rails'
14
+ s.summary = %q{Gauge.JS packaged for your Rails 3.1+ Asset Pipeline}
15
+ s.description = %q{Gauge.JS packaged for the Rails 3.1+ Asset Pipeline, both the Coffee, JS, and min.JS versions.}
16
+
17
+ s.files = %w{
18
+ gaugejs-rails.gemspec
19
+ vendor/assets/javascripts/gauge.coffee
20
+ vendor/assets/javascripts/gauge.js
21
+ vendor/assets/javascripts/gauge.min.js
22
+ lib/gaugejs-rails.rb
23
+ lib/gaugejs-rails/engine.rb
24
+ lib/gaugejs-rails/version.rb
25
+ }
26
+ s.require_paths = ['lib']
27
+
28
+ s.add_runtime_dependency 'railties', '>= 3.1.1'
29
+ end
@@ -0,0 +1,6 @@
1
+ module GaugeJS
2
+ module Rails
3
+ require 'gaugejs-rails/engine'
4
+ require 'gaugejs-rails/version'
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ module GaugeJS
2
+ module Rails
3
+ class Engine < ::Rails::Engine
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,5 @@
1
+ module GaugeJS
2
+ module Rails
3
+ VERSION = '0.0.1'
4
+ end
5
+ end
@@ -0,0 +1,356 @@
1
+ # Request Animation Frame Polyfill
2
+ # CoffeeScript version of http://paulirish.com/2011/requestanimationframe-for-smart-animating/
3
+ do () ->
4
+ vendors = ['ms', 'moz', 'webkit', 'o']
5
+ for vendor in vendors
6
+ if window.requestAnimationFrame
7
+ break
8
+ window.requestAnimationFrame = window[vendor + 'RequestAnimationFrame']
9
+ window.cancelAnimationFrame = window[vendor + 'CancelAnimationFrame'] or window[vendor + 'CancelRequestAnimationFrame']
10
+
11
+ browserRequestAnimationFrame = null
12
+ lastId = 0
13
+ isCancelled = {}
14
+
15
+ if not requestAnimationFrame
16
+ window.requestAnimationFrame = (callback, element) ->
17
+ currTime = new Date().getTime()
18
+ timeToCall = Math.max(0, 16 - (currTime - lastTime))
19
+ id = window.setTimeout(() ->
20
+ callback(currTime + timeToCall)
21
+ , timeToCall)
22
+ lastTime = currTime + timeToCall
23
+ return id
24
+ # This implementation should only be used with the setTimeout()
25
+ # version of window.requestAnimationFrame().
26
+ window.cancelAnimationFrame = (id) ->
27
+ clearTimeout(id)
28
+ else if not window.cancelAnimationFrame
29
+ browserRequestAnimationFrame = window.requestAnimationFrame
30
+ window.requestAnimationFrame = (callback, element) ->
31
+ myId = ++lastId
32
+ browserRequestAnimationFrame(() ->
33
+ if not isCancelled[myId]
34
+ callback()
35
+ , element)
36
+ return myId
37
+ window.cancelAnimationFrame = (id) ->
38
+ isCancelled[id] = true
39
+
40
+ String.prototype.hashCode = () ->
41
+ hash = 0
42
+ if this.length == 0
43
+ return hash
44
+ for i in [0...this.length]
45
+ char = this.charCodeAt(i)
46
+ hash = ((hash << 5) - hash) + char
47
+ hash = hash & hash # Convert to 32bit integer
48
+ return hash
49
+
50
+ secondsToString = (sec) ->
51
+ hr = Math.floor(sec / 3600)
52
+ min = Math.floor((sec - (hr * 3600))/60)
53
+ sec -= ((hr * 3600) + (min * 60))
54
+ sec += ''
55
+ min += ''
56
+ while min.length < 2
57
+ min = '0' + min
58
+ while sec.length < 2
59
+ sec = '0' + sec
60
+ hr = if hr then hr + ':' else ''
61
+ return hr + min + ':' + sec
62
+
63
+ formatNumber = (num) ->
64
+ return addCommas(num.toFixed(0))
65
+
66
+ updateObjectValues = (obj1, obj2) ->
67
+ for own key, val of obj2
68
+ obj1[key] = val
69
+
70
+ addCommas =(nStr) ->
71
+ nStr += ''
72
+ x = nStr.split('.')
73
+ x1 = x[0]
74
+ x2 = ''
75
+ if x.length > 1
76
+ x2 = '.' + x[1]
77
+ rgx = /(\d+)(\d{3})/
78
+ while rgx.test(x1)
79
+ x1 = x1.replace(rgx, '$1' + ',' + '$2')
80
+ return x1 + x2
81
+
82
+ class ValueUpdater
83
+ animationSpeed: 32
84
+ constructor: () ->
85
+ AnimationUpdater.add(@)
86
+
87
+ update: ->
88
+ if @displayedValue != @value
89
+ if @ctx
90
+ @ctx.clearRect(0, 0, @canvas.width, @canvas.height)
91
+ diff = @value - @displayedValue
92
+ if Math.abs(diff / @animationSpeed) <= 0.001
93
+ @displayedValue = @value
94
+ else
95
+ @displayedValue = @displayedValue + diff / @animationSpeed
96
+ @render()
97
+ return true
98
+ return false
99
+
100
+ class AnimatedText extends ValueUpdater
101
+ displayedValue: 0
102
+ value: 0
103
+
104
+ setVal: (value) ->
105
+ @value = 1 * value
106
+
107
+ constructor: (@elem, @text=false) ->
108
+ @value = 1 * @elem.innerHTML
109
+ if @text
110
+ @value = 0
111
+ render: () ->
112
+ if @text
113
+ textVal = secondsToString(@displayedValue.toFixed(0))
114
+ else
115
+ textVal = addCommas(formatNumber(@displayedValue))
116
+ @elem.innerHTML = textVal
117
+
118
+ AnimatedTextFactory =
119
+ create: (objList) ->
120
+ out = []
121
+ for elem in objList
122
+ out.push(new AnimatedText(elem))
123
+ return out
124
+
125
+ class GaugePointer
126
+ strokeWidth: 3
127
+ length: 76
128
+ options:
129
+ strokeWidth: 0.035
130
+ length: 0.1
131
+ constructor: (@ctx, @canvas) ->
132
+ # @length = @canvas.height * @options.length
133
+ # @strokeWidth = @canvas.height * @options.strokeWidth
134
+ @setOptions()
135
+
136
+ setOptions: (options=null) ->
137
+ updateObjectValues(@options, options)
138
+ @length = @canvas.height * @options.length
139
+ @strokeWidth = @canvas.height * @options.strokeWidth
140
+
141
+ render: (angle) ->
142
+ centerX = @canvas.width / 2
143
+ centerY = @canvas.height * 0.9
144
+
145
+ # angle = Math.PI * 1.45
146
+ x = Math.round(centerX + @length * Math.cos(angle))
147
+ y = Math.round(centerY + @length * Math.sin(angle))
148
+
149
+ startX = Math.round(centerX + @strokeWidth * Math.cos(angle - Math.PI/2))
150
+ startY = Math.round(centerY + @strokeWidth * Math.sin(angle - Math.PI/2))
151
+
152
+ endX = Math.round(centerX + @strokeWidth * Math.cos(angle + Math.PI/2))
153
+ endY = Math.round(centerY + @strokeWidth * Math.sin(angle + Math.PI/2))
154
+
155
+ @ctx.fillStyle = "black"
156
+ @ctx.beginPath()
157
+
158
+ @ctx.arc(centerX, centerY, @strokeWidth, 0, Math.PI*2, true)
159
+ @ctx.fill()
160
+
161
+ @ctx.beginPath()
162
+ @ctx.moveTo(startX, startY)
163
+ @ctx.lineTo(x, y)
164
+ @ctx.lineTo(endX, endY)
165
+ @ctx.fill()
166
+
167
+
168
+ class Bar
169
+ constructor: (@elem) ->
170
+ updateValues: (arrValues) ->
171
+ @value = arrValues[0]
172
+ @maxValue = arrValues[1]
173
+ @avgValue = arrValues[2]
174
+ @render()
175
+
176
+ render: () ->
177
+ if @textField
178
+ @textField.text(formatNumber(@value))
179
+
180
+ if @maxValue == 0
181
+ @maxValue = @avgValue * 2
182
+
183
+ valPercent = (@value / @maxValue) * 100
184
+ avgPercent = (@avgValue / @maxValue) * 100
185
+ # alert(valPercent)
186
+ $(".bar-value", @elem).css({"width": valPercent + "%"})
187
+ $(".typical-value", @elem).css({"width": avgPercent + "%"})
188
+
189
+ class Gauge extends ValueUpdater
190
+ elem: null
191
+ value: 20
192
+ maxValue: 80
193
+ # angle: 1.45 * Math.PI
194
+ displayedAngle: 0
195
+ displayedValue: 0
196
+ lineWidth: 40
197
+ paddingBottom: 0.1
198
+ options:
199
+ colorStart: "#6fadcf"
200
+ colorStop: "#8fc0da"
201
+ strokeColor: "#e0e0e0"
202
+ pointer:
203
+ length: 0.8
204
+ strokeWidth: 0.035
205
+ angle: 0.15
206
+ lineWidth: 0.44
207
+ fontSize: 40
208
+ constructor: (@canvas) ->
209
+ super()
210
+ @ctx = @canvas.getContext('2d')
211
+ @gp = new GaugePointer(@ctx, @canvas)
212
+ @setOptions()
213
+ @render()
214
+
215
+ setOptions: (options=null) ->
216
+ updateObjectValues(@options, options)
217
+ @lineWidth = @canvas.height * (1 - @paddingBottom) * @options.lineWidth # .2 - .7
218
+ @radius = @canvas.height * (1 - @paddingBottom) - @lineWidth
219
+ @gp.setOptions(@options.pointer)
220
+ if @textField
221
+ @textField.style.fontSize = options.fontSize + 'px'
222
+ return @
223
+
224
+ set: (value) ->
225
+ @value = value
226
+ if @value > @maxValue
227
+ @maxValue = @value * 1.1
228
+ AnimationUpdater.run()
229
+
230
+ getAngle: (value) ->
231
+ return (1 + @options.angle) * Math.PI + (value / @maxValue) * (1 - @options.angle * 2) * Math.PI
232
+
233
+ setTextField: (@textField) ->
234
+
235
+ render: () ->
236
+ # Draw using canvas
237
+ w = @canvas.width / 2
238
+ h = @canvas.height * (1 - @paddingBottom)
239
+ displayedAngle = @getAngle(@displayedValue)
240
+ if @textField
241
+ @textField.innerHTML = formatNumber(@displayedValue)
242
+
243
+ grd = @ctx.createRadialGradient(w, h, 9, w, h, 70)
244
+ @ctx.lineCap = "butt"
245
+
246
+ grd.addColorStop(0, @options.colorStart)
247
+ grd.addColorStop(1, @options.colorStop)
248
+ @ctx.strokeStyle = grd
249
+ @ctx.beginPath()
250
+ @ctx.arc(w, h, @radius, (1 + @options.angle) * Math.PI, displayedAngle, false)
251
+ @ctx.lineWidth = @lineWidth
252
+ @ctx.stroke()
253
+
254
+ @ctx.strokeStyle = @options.strokeColor
255
+ @ctx.beginPath()
256
+ @ctx.arc(w, h, @radius, displayedAngle, (2 - @options.angle) * Math.PI, false)
257
+ @ctx.stroke()
258
+ @gp.render(displayedAngle)
259
+
260
+ class Donut extends ValueUpdater
261
+ lineWidth: 15
262
+ displayedValue: 0
263
+ value: 33
264
+ maxValue: 80
265
+
266
+ options:
267
+ lineWidth: 0.10
268
+ colorStart: "#6f6ea0"
269
+ colorStop: "#c0c0db"
270
+ strokeColor: "#eeeeee"
271
+ angle: 0.35
272
+
273
+ constructor: (@canvas) -> #, @color=["#6fadcf", "#8fc0da"]) ->
274
+ super()
275
+ @ctx = @canvas.getContext('2d')
276
+ # @canvas = @elem[0]
277
+ @setOptions()
278
+ @render()
279
+
280
+ getAngle: (value) ->
281
+ return (1 - @options.angle) * Math.PI + (value / @maxValue) * ((2 + @options.angle) - (1 - @options.angle)) * Math.PI
282
+
283
+ setOptions: (options=null) ->
284
+ updateObjectValues(@options, options)
285
+ @lineWidth = @canvas.height * @options.lineWidth #0.10
286
+ @radius = @canvas.height / 2 - @lineWidth/2
287
+ if @textField
288
+ @textField.style.fontSize = options.fontSize + 'px'
289
+ return @
290
+
291
+ setTextField: (@textField) ->
292
+
293
+ set: (value) ->
294
+ @value = value
295
+ if @value > @maxValue
296
+ @maxValue = @value * 1.1
297
+ AnimationUpdater.run()
298
+
299
+ render: () ->
300
+ displayedAngle = @getAngle(@displayedValue)
301
+ w = @canvas.width / 2
302
+ h = @canvas.height / 2
303
+
304
+ if @textField
305
+ @textField.innerHTML = formatNumber(@displayedValue)
306
+
307
+ grdFill = @ctx.createRadialGradient(w, h, 39, w, h, 70)
308
+ grdFill.addColorStop(0, @options.colorStart)
309
+ grdFill.addColorStop(1, @options.colorStop)
310
+
311
+ start = @radius - @lineWidth / 2;
312
+ stop = @radius + @lineWidth / 2;
313
+
314
+ grd = @ctx.createRadialGradient(w, h, start, w, h, stop)
315
+ grd.addColorStop(0, "#d5d5d5")
316
+ grd.addColorStop(0.12, @options.strokeColor)
317
+ grd.addColorStop(0.88, @options.strokeColor)
318
+ grd.addColorStop(1, "#d5d5d5")
319
+
320
+ @ctx.strokeStyle = grd
321
+ @ctx.beginPath()
322
+ @ctx.arc(w, h, @radius, (1 - @options.angle) * Math.PI, (2 + @options.angle) * Math.PI, false)
323
+ @ctx.lineWidth = @lineWidth
324
+ @ctx.lineCap = "round"
325
+ @ctx.stroke()
326
+
327
+ @ctx.strokeStyle = grdFill
328
+ @ctx.beginPath()
329
+ @ctx.arc(w, h, @radius, (1 - @options.angle) * Math.PI, displayedAngle, false)
330
+ @ctx.stroke()
331
+
332
+
333
+ window.AnimationUpdater =
334
+ elements: []
335
+ animId: null
336
+
337
+ addAll: (list) ->
338
+ for elem in list
339
+ AnimationUpdater.elements.push(elem)
340
+
341
+ add: (object) ->
342
+ AnimationUpdater.elements.push(object)
343
+
344
+ run: () ->
345
+ animationFinished = true
346
+ for elem in AnimationUpdater.elements
347
+ if elem.update()
348
+ animationFinished = false
349
+ if not animationFinished
350
+ AnimationUpdater.animId = requestAnimationFrame(AnimationUpdater.run)
351
+ else
352
+ cancelAnimationFrame(AnimationUpdater.animId)
353
+
354
+ window.Gauge = Gauge
355
+ window.Donut = Donut
356
+
@@ -0,0 +1,435 @@
1
+ (function() {
2
+ var AnimatedText, AnimatedTextFactory, Bar, Donut, Gauge, GaugePointer, ValueUpdater, addCommas, formatNumber, secondsToString, updateObjectValues;
3
+ var __hasProp = Object.prototype.hasOwnProperty, __extends = function(child, parent) {
4
+ for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; }
5
+ function ctor() { this.constructor = child; }
6
+ ctor.prototype = parent.prototype;
7
+ child.prototype = new ctor;
8
+ child.__super__ = parent.prototype;
9
+ return child;
10
+ };
11
+ (function() {
12
+ var browserRequestAnimationFrame, isCancelled, lastId, vendor, vendors, _i, _len;
13
+ vendors = ['ms', 'moz', 'webkit', 'o'];
14
+ for (_i = 0, _len = vendors.length; _i < _len; _i++) {
15
+ vendor = vendors[_i];
16
+ if (window.requestAnimationFrame) {
17
+ break;
18
+ }
19
+ window.requestAnimationFrame = window[vendor + 'RequestAnimationFrame'];
20
+ window.cancelAnimationFrame = window[vendor + 'CancelAnimationFrame'] || window[vendor + 'CancelRequestAnimationFrame'];
21
+ }
22
+ browserRequestAnimationFrame = null;
23
+ lastId = 0;
24
+ isCancelled = {};
25
+ if (!requestAnimationFrame) {
26
+ window.requestAnimationFrame = function(callback, element) {
27
+ var currTime, id, lastTime, timeToCall;
28
+ currTime = new Date().getTime();
29
+ timeToCall = Math.max(0, 16 - (currTime - lastTime));
30
+ id = window.setTimeout(function() {
31
+ return callback(currTime + timeToCall);
32
+ }, timeToCall);
33
+ lastTime = currTime + timeToCall;
34
+ return id;
35
+ };
36
+ return window.cancelAnimationFrame = function(id) {
37
+ return clearTimeout(id);
38
+ };
39
+ } else if (!window.cancelAnimationFrame) {
40
+ browserRequestAnimationFrame = window.requestAnimationFrame;
41
+ window.requestAnimationFrame = function(callback, element) {
42
+ var myId;
43
+ myId = ++lastId;
44
+ browserRequestAnimationFrame(function() {
45
+ if (!isCancelled[myId]) {
46
+ return callback();
47
+ }
48
+ }, element);
49
+ return myId;
50
+ };
51
+ return window.cancelAnimationFrame = function(id) {
52
+ return isCancelled[id] = true;
53
+ };
54
+ }
55
+ })();
56
+ String.prototype.hashCode = function() {
57
+ var char, hash, i, _ref;
58
+ hash = 0;
59
+ if (this.length === 0) {
60
+ return hash;
61
+ }
62
+ for (i = 0, _ref = this.length; 0 <= _ref ? i < _ref : i > _ref; 0 <= _ref ? i++ : i--) {
63
+ char = this.charCodeAt(i);
64
+ hash = ((hash << 5) - hash) + char;
65
+ hash = hash & hash;
66
+ }
67
+ return hash;
68
+ };
69
+ secondsToString = function(sec) {
70
+ var hr, min;
71
+ hr = Math.floor(sec / 3600);
72
+ min = Math.floor((sec - (hr * 3600)) / 60);
73
+ sec -= (hr * 3600) + (min * 60);
74
+ sec += '';
75
+ min += '';
76
+ while (min.length < 2) {
77
+ min = '0' + min;
78
+ }
79
+ while (sec.length < 2) {
80
+ sec = '0' + sec;
81
+ }
82
+ hr = hr ? hr + ':' : '';
83
+ return hr + min + ':' + sec;
84
+ };
85
+ formatNumber = function(num) {
86
+ return addCommas(num.toFixed(0));
87
+ };
88
+ updateObjectValues = function(obj1, obj2) {
89
+ var key, val, _results;
90
+ _results = [];
91
+ for (key in obj2) {
92
+ if (!__hasProp.call(obj2, key)) continue;
93
+ val = obj2[key];
94
+ _results.push(obj1[key] = val);
95
+ }
96
+ return _results;
97
+ };
98
+ addCommas = function(nStr) {
99
+ var rgx, x, x1, x2;
100
+ nStr += '';
101
+ x = nStr.split('.');
102
+ x1 = x[0];
103
+ x2 = '';
104
+ if (x.length > 1) {
105
+ x2 = '.' + x[1];
106
+ }
107
+ rgx = /(\d+)(\d{3})/;
108
+ while (rgx.test(x1)) {
109
+ x1 = x1.replace(rgx, '$1' + ',' + '$2');
110
+ }
111
+ return x1 + x2;
112
+ };
113
+ ValueUpdater = (function() {
114
+ ValueUpdater.prototype.animationSpeed = 32;
115
+ function ValueUpdater() {
116
+ AnimationUpdater.add(this);
117
+ }
118
+ ValueUpdater.prototype.update = function() {
119
+ var diff;
120
+ if (this.displayedValue !== this.value) {
121
+ if (this.ctx) {
122
+ this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);
123
+ }
124
+ diff = this.value - this.displayedValue;
125
+ if (Math.abs(diff / this.animationSpeed) <= 0.001) {
126
+ this.displayedValue = this.value;
127
+ } else {
128
+ this.displayedValue = this.displayedValue + diff / this.animationSpeed;
129
+ }
130
+ this.render();
131
+ return true;
132
+ }
133
+ return false;
134
+ };
135
+ return ValueUpdater;
136
+ })();
137
+ AnimatedText = (function() {
138
+ __extends(AnimatedText, ValueUpdater);
139
+ AnimatedText.prototype.displayedValue = 0;
140
+ AnimatedText.prototype.value = 0;
141
+ AnimatedText.prototype.setVal = function(value) {
142
+ return this.value = 1 * value;
143
+ };
144
+ function AnimatedText(elem, text) {
145
+ this.elem = elem;
146
+ this.text = text != null ? text : false;
147
+ this.value = 1 * this.elem.innerHTML;
148
+ if (this.text) {
149
+ this.value = 0;
150
+ }
151
+ }
152
+ AnimatedText.prototype.render = function() {
153
+ var textVal;
154
+ if (this.text) {
155
+ textVal = secondsToString(this.displayedValue.toFixed(0));
156
+ } else {
157
+ textVal = addCommas(formatNumber(this.displayedValue));
158
+ }
159
+ return this.elem.innerHTML = textVal;
160
+ };
161
+ return AnimatedText;
162
+ })();
163
+ AnimatedTextFactory = {
164
+ create: function(objList) {
165
+ var elem, out, _i, _len;
166
+ out = [];
167
+ for (_i = 0, _len = objList.length; _i < _len; _i++) {
168
+ elem = objList[_i];
169
+ out.push(new AnimatedText(elem));
170
+ }
171
+ return out;
172
+ }
173
+ };
174
+ GaugePointer = (function() {
175
+ GaugePointer.prototype.strokeWidth = 3;
176
+ GaugePointer.prototype.length = 76;
177
+ GaugePointer.prototype.options = {
178
+ strokeWidth: 0.035,
179
+ length: 0.1
180
+ };
181
+ function GaugePointer(ctx, canvas) {
182
+ this.ctx = ctx;
183
+ this.canvas = canvas;
184
+ this.setOptions();
185
+ }
186
+ GaugePointer.prototype.setOptions = function(options) {
187
+ if (options == null) {
188
+ options = null;
189
+ }
190
+ updateObjectValues(this.options, options);
191
+ this.length = this.canvas.height * this.options.length;
192
+ return this.strokeWidth = this.canvas.height * this.options.strokeWidth;
193
+ };
194
+ GaugePointer.prototype.render = function(angle) {
195
+ var centerX, centerY, endX, endY, startX, startY, x, y;
196
+ centerX = this.canvas.width / 2;
197
+ centerY = this.canvas.height * 0.9;
198
+ x = Math.round(centerX + this.length * Math.cos(angle));
199
+ y = Math.round(centerY + this.length * Math.sin(angle));
200
+ startX = Math.round(centerX + this.strokeWidth * Math.cos(angle - Math.PI / 2));
201
+ startY = Math.round(centerY + this.strokeWidth * Math.sin(angle - Math.PI / 2));
202
+ endX = Math.round(centerX + this.strokeWidth * Math.cos(angle + Math.PI / 2));
203
+ endY = Math.round(centerY + this.strokeWidth * Math.sin(angle + Math.PI / 2));
204
+ this.ctx.fillStyle = "black";
205
+ this.ctx.beginPath();
206
+ this.ctx.arc(centerX, centerY, this.strokeWidth, 0, Math.PI * 2, true);
207
+ this.ctx.fill();
208
+ this.ctx.beginPath();
209
+ this.ctx.moveTo(startX, startY);
210
+ this.ctx.lineTo(x, y);
211
+ this.ctx.lineTo(endX, endY);
212
+ return this.ctx.fill();
213
+ };
214
+ return GaugePointer;
215
+ })();
216
+ Bar = (function() {
217
+ function Bar(elem) {
218
+ this.elem = elem;
219
+ }
220
+ Bar.prototype.updateValues = function(arrValues) {
221
+ this.value = arrValues[0];
222
+ this.maxValue = arrValues[1];
223
+ this.avgValue = arrValues[2];
224
+ return this.render();
225
+ };
226
+ Bar.prototype.render = function() {
227
+ var avgPercent, valPercent;
228
+ if (this.textField) {
229
+ this.textField.text(formatNumber(this.value));
230
+ }
231
+ if (this.maxValue === 0) {
232
+ this.maxValue = this.avgValue * 2;
233
+ }
234
+ valPercent = (this.value / this.maxValue) * 100;
235
+ avgPercent = (this.avgValue / this.maxValue) * 100;
236
+ $(".bar-value", this.elem).css({
237
+ "width": valPercent + "%"
238
+ });
239
+ return $(".typical-value", this.elem).css({
240
+ "width": avgPercent + "%"
241
+ });
242
+ };
243
+ return Bar;
244
+ })();
245
+ Gauge = (function() {
246
+ __extends(Gauge, ValueUpdater);
247
+ Gauge.prototype.elem = null;
248
+ Gauge.prototype.value = 20;
249
+ Gauge.prototype.maxValue = 80;
250
+ Gauge.prototype.displayedAngle = 0;
251
+ Gauge.prototype.displayedValue = 0;
252
+ Gauge.prototype.lineWidth = 40;
253
+ Gauge.prototype.paddingBottom = 0.1;
254
+ Gauge.prototype.options = {
255
+ colorStart: "#6fadcf",
256
+ colorStop: "#8fc0da",
257
+ strokeColor: "#e0e0e0",
258
+ pointer: {
259
+ length: 0.8,
260
+ strokeWidth: 0.035
261
+ },
262
+ angle: 0.15,
263
+ lineWidth: 0.44,
264
+ fontSize: 40
265
+ };
266
+ function Gauge(canvas) {
267
+ this.canvas = canvas;
268
+ Gauge.__super__.constructor.call(this);
269
+ this.ctx = this.canvas.getContext('2d');
270
+ this.gp = new GaugePointer(this.ctx, this.canvas);
271
+ this.setOptions();
272
+ this.render();
273
+ }
274
+ Gauge.prototype.setOptions = function(options) {
275
+ if (options == null) {
276
+ options = null;
277
+ }
278
+ updateObjectValues(this.options, options);
279
+ this.lineWidth = this.canvas.height * (1 - this.paddingBottom) * this.options.lineWidth;
280
+ this.radius = this.canvas.height * (1 - this.paddingBottom) - this.lineWidth;
281
+ this.gp.setOptions(this.options.pointer);
282
+ if (this.textField) {
283
+ this.textField.style.fontSize = options.fontSize + 'px';
284
+ }
285
+ return this;
286
+ };
287
+ Gauge.prototype.set = function(value) {
288
+ this.value = value;
289
+ if (this.value > this.maxValue) {
290
+ this.maxValue = this.value * 1.1;
291
+ }
292
+ return AnimationUpdater.run();
293
+ };
294
+ Gauge.prototype.getAngle = function(value) {
295
+ return (1 + this.options.angle) * Math.PI + (value / this.maxValue) * (1 - this.options.angle * 2) * Math.PI;
296
+ };
297
+ Gauge.prototype.setTextField = function(textField) {
298
+ this.textField = textField;
299
+ };
300
+ Gauge.prototype.render = function() {
301
+ var displayedAngle, grd, h, w;
302
+ w = this.canvas.width / 2;
303
+ h = this.canvas.height * (1 - this.paddingBottom);
304
+ displayedAngle = this.getAngle(this.displayedValue);
305
+ if (this.textField) {
306
+ this.textField.innerHTML = formatNumber(this.displayedValue);
307
+ }
308
+ grd = this.ctx.createRadialGradient(w, h, 9, w, h, 70);
309
+ this.ctx.lineCap = "butt";
310
+ grd.addColorStop(0, this.options.colorStart);
311
+ grd.addColorStop(1, this.options.colorStop);
312
+ this.ctx.strokeStyle = grd;
313
+ this.ctx.beginPath();
314
+ this.ctx.arc(w, h, this.radius, (1 + this.options.angle) * Math.PI, displayedAngle, false);
315
+ this.ctx.lineWidth = this.lineWidth;
316
+ this.ctx.stroke();
317
+ this.ctx.strokeStyle = this.options.strokeColor;
318
+ this.ctx.beginPath();
319
+ this.ctx.arc(w, h, this.radius, displayedAngle, (2 - this.options.angle) * Math.PI, false);
320
+ this.ctx.stroke();
321
+ return this.gp.render(displayedAngle);
322
+ };
323
+ return Gauge;
324
+ })();
325
+ Donut = (function() {
326
+ __extends(Donut, ValueUpdater);
327
+ Donut.prototype.lineWidth = 15;
328
+ Donut.prototype.displayedValue = 0;
329
+ Donut.prototype.value = 33;
330
+ Donut.prototype.maxValue = 80;
331
+ Donut.prototype.options = {
332
+ lineWidth: 0.10,
333
+ colorStart: "#6f6ea0",
334
+ colorStop: "#c0c0db",
335
+ strokeColor: "#eeeeee",
336
+ angle: 0.35
337
+ };
338
+ function Donut(canvas) {
339
+ this.canvas = canvas;
340
+ Donut.__super__.constructor.call(this);
341
+ this.ctx = this.canvas.getContext('2d');
342
+ this.setOptions();
343
+ this.render();
344
+ }
345
+ Donut.prototype.getAngle = function(value) {
346
+ return (1 - this.options.angle) * Math.PI + (value / this.maxValue) * ((2 + this.options.angle) - (1 - this.options.angle)) * Math.PI;
347
+ };
348
+ Donut.prototype.setOptions = function(options) {
349
+ if (options == null) {
350
+ options = null;
351
+ }
352
+ updateObjectValues(this.options, options);
353
+ this.lineWidth = this.canvas.height * this.options.lineWidth;
354
+ this.radius = this.canvas.height / 2 - this.lineWidth / 2;
355
+ if (this.textField) {
356
+ this.textField.style.fontSize = options.fontSize + 'px';
357
+ }
358
+ return this;
359
+ };
360
+ Donut.prototype.setTextField = function(textField) {
361
+ this.textField = textField;
362
+ };
363
+ Donut.prototype.set = function(value) {
364
+ this.value = value;
365
+ if (this.value > this.maxValue) {
366
+ this.maxValue = this.value * 1.1;
367
+ }
368
+ return AnimationUpdater.run();
369
+ };
370
+ Donut.prototype.render = function() {
371
+ var displayedAngle, grd, grdFill, h, start, stop, w;
372
+ displayedAngle = this.getAngle(this.displayedValue);
373
+ w = this.canvas.width / 2;
374
+ h = this.canvas.height / 2;
375
+ if (this.textField) {
376
+ this.textField.innerHTML = formatNumber(this.displayedValue);
377
+ }
378
+ grdFill = this.ctx.createRadialGradient(w, h, 39, w, h, 70);
379
+ grdFill.addColorStop(0, this.options.colorStart);
380
+ grdFill.addColorStop(1, this.options.colorStop);
381
+ start = this.radius - this.lineWidth / 2;
382
+ stop = this.radius + this.lineWidth / 2;
383
+ grd = this.ctx.createRadialGradient(w, h, start, w, h, stop);
384
+ grd.addColorStop(0, "#d5d5d5");
385
+ grd.addColorStop(0.12, this.options.strokeColor);
386
+ grd.addColorStop(0.88, this.options.strokeColor);
387
+ grd.addColorStop(1, "#d5d5d5");
388
+ this.ctx.strokeStyle = grd;
389
+ this.ctx.beginPath();
390
+ this.ctx.arc(w, h, this.radius, (1 - this.options.angle) * Math.PI, (2 + this.options.angle) * Math.PI, false);
391
+ this.ctx.lineWidth = this.lineWidth;
392
+ this.ctx.lineCap = "round";
393
+ this.ctx.stroke();
394
+ this.ctx.strokeStyle = grdFill;
395
+ this.ctx.beginPath();
396
+ this.ctx.arc(w, h, this.radius, (1 - this.options.angle) * Math.PI, displayedAngle, false);
397
+ return this.ctx.stroke();
398
+ };
399
+ return Donut;
400
+ })();
401
+ window.AnimationUpdater = {
402
+ elements: [],
403
+ animId: null,
404
+ addAll: function(list) {
405
+ var elem, _i, _len, _results;
406
+ _results = [];
407
+ for (_i = 0, _len = list.length; _i < _len; _i++) {
408
+ elem = list[_i];
409
+ _results.push(AnimationUpdater.elements.push(elem));
410
+ }
411
+ return _results;
412
+ },
413
+ add: function(object) {
414
+ return AnimationUpdater.elements.push(object);
415
+ },
416
+ run: function() {
417
+ var animationFinished, elem, _i, _len, _ref;
418
+ animationFinished = true;
419
+ _ref = AnimationUpdater.elements;
420
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
421
+ elem = _ref[_i];
422
+ if (elem.update()) {
423
+ animationFinished = false;
424
+ }
425
+ }
426
+ if (!animationFinished) {
427
+ return AnimationUpdater.animId = requestAnimationFrame(AnimationUpdater.run);
428
+ } else {
429
+ return cancelAnimationFrame(AnimationUpdater.animId);
430
+ }
431
+ }
432
+ };
433
+ window.Gauge = Gauge;
434
+ window.Donut = Donut;
435
+ }).call(this);
@@ -0,0 +1,37 @@
1
+
2
+ (function(){var AnimatedText,AnimatedTextFactory,Bar,Donut,Gauge,GaugePointer,ValueUpdater,addCommas,formatNumber,secondsToString,updateObjectValues;var __hasProp=Object.prototype.hasOwnProperty,__extends=function(child,parent){for(var key in parent){if(__hasProp.call(parent,key))child[key]=parent[key];}
3
+ function ctor(){this.constructor=child;}
4
+ ctor.prototype=parent.prototype;child.prototype=new ctor;child.__super__=parent.prototype;return child;};(function(){var browserRequestAnimationFrame,isCancelled,lastId,vendor,vendors,_i,_len;vendors=['ms','moz','webkit','o'];for(_i=0,_len=vendors.length;_i<_len;_i++){vendor=vendors[_i];if(window.requestAnimationFrame){break;}
5
+ window.requestAnimationFrame=window[vendor+'RequestAnimationFrame'];window.cancelAnimationFrame=window[vendor+'CancelAnimationFrame']||window[vendor+'CancelRequestAnimationFrame'];}
6
+ browserRequestAnimationFrame=null;lastId=0;isCancelled={};if(!requestAnimationFrame){window.requestAnimationFrame=function(callback,element){var currTime,id,lastTime,timeToCall;currTime=new Date().getTime();timeToCall=Math.max(0,16-(currTime-lastTime));id=window.setTimeout(function(){return callback(currTime+timeToCall);},timeToCall);lastTime=currTime+timeToCall;return id;};return window.cancelAnimationFrame=function(id){return clearTimeout(id);};}else if(!window.cancelAnimationFrame){browserRequestAnimationFrame=window.requestAnimationFrame;window.requestAnimationFrame=function(callback,element){var myId;myId=++lastId;browserRequestAnimationFrame(function(){if(!isCancelled[myId]){return callback();}},element);return myId;};return window.cancelAnimationFrame=function(id){return isCancelled[id]=true;};}})();String.prototype.hashCode=function(){var char,hash,i,_ref;hash=0;if(this.length===0){return hash;}
7
+ for(i=0,_ref=this.length;0<=_ref?i<_ref:i>_ref;0<=_ref?i++:i--){char=this.charCodeAt(i);hash=((hash<<5)-hash)+char;hash=hash&hash;}
8
+ return hash;};secondsToString=function(sec){var hr,min;hr=Math.floor(sec/3600);min=Math.floor((sec-(hr*3600))/60);sec-=(hr*3600)+(min*60);sec+='';min+='';while(min.length<2){min='0'+min;}
9
+ while(sec.length<2){sec='0'+sec;}
10
+ hr=hr?hr+':':'';return hr+min+':'+sec;};formatNumber=function(num){return addCommas(num.toFixed(0));};updateObjectValues=function(obj1,obj2){var key,val,_results;_results=[];for(key in obj2){if(!__hasProp.call(obj2,key))continue;val=obj2[key];_results.push(obj1[key]=val);}
11
+ return _results;};addCommas=function(nStr){var rgx,x,x1,x2;nStr+='';x=nStr.split('.');x1=x[0];x2='';if(x.length>1){x2='.'+x[1];}
12
+ rgx=/(\d+)(\d{3})/;while(rgx.test(x1)){x1=x1.replace(rgx,'$1'+','+'$2');}
13
+ return x1+x2;};ValueUpdater=(function(){ValueUpdater.prototype.animationSpeed=32;function ValueUpdater(){AnimationUpdater.add(this);}
14
+ ValueUpdater.prototype.update=function(){var diff;if(this.displayedValue!==this.value){if(this.ctx){this.ctx.clearRect(0,0,this.canvas.width,this.canvas.height);}
15
+ diff=this.value-this.displayedValue;if(Math.abs(diff/this.animationSpeed)<=0.001){this.displayedValue=this.value;}else{this.displayedValue=this.displayedValue+diff/this.animationSpeed;}
16
+ this.render();return true;}
17
+ return false;};return ValueUpdater;})();AnimatedText=(function(){__extends(AnimatedText,ValueUpdater);AnimatedText.prototype.displayedValue=0;AnimatedText.prototype.value=0;AnimatedText.prototype.setVal=function(value){return this.value=1*value;};function AnimatedText(elem,text){this.elem=elem;this.text=text!=null?text:false;this.value=1*this.elem.innerHTML;if(this.text){this.value=0;}}
18
+ AnimatedText.prototype.render=function(){var textVal;if(this.text){textVal=secondsToString(this.displayedValue.toFixed(0));}else{textVal=addCommas(formatNumber(this.displayedValue));}
19
+ return this.elem.innerHTML=textVal;};return AnimatedText;})();AnimatedTextFactory={create:function(objList){var elem,out,_i,_len;out=[];for(_i=0,_len=objList.length;_i<_len;_i++){elem=objList[_i];out.push(new AnimatedText(elem));}
20
+ return out;}};GaugePointer=(function(){GaugePointer.prototype.strokeWidth=3;GaugePointer.prototype.length=76;GaugePointer.prototype.options={strokeWidth:0.035,length:0.1};function GaugePointer(ctx,canvas){this.ctx=ctx;this.canvas=canvas;this.setOptions();}
21
+ GaugePointer.prototype.setOptions=function(options){if(options==null){options=null;}
22
+ updateObjectValues(this.options,options);this.length=this.canvas.height*this.options.length;return this.strokeWidth=this.canvas.height*this.options.strokeWidth;};GaugePointer.prototype.render=function(angle){var centerX,centerY,endX,endY,startX,startY,x,y;centerX=this.canvas.width/2;centerY=this.canvas.height*0.9;x=Math.round(centerX+this.length*Math.cos(angle));y=Math.round(centerY+this.length*Math.sin(angle));startX=Math.round(centerX+this.strokeWidth*Math.cos(angle-Math.PI/2));startY=Math.round(centerY+this.strokeWidth*Math.sin(angle-Math.PI/2));endX=Math.round(centerX+this.strokeWidth*Math.cos(angle+Math.PI/2));endY=Math.round(centerY+this.strokeWidth*Math.sin(angle+Math.PI/2));this.ctx.fillStyle="black";this.ctx.beginPath();this.ctx.arc(centerX,centerY,this.strokeWidth,0,Math.PI*2,true);this.ctx.fill();this.ctx.beginPath();this.ctx.moveTo(startX,startY);this.ctx.lineTo(x,y);this.ctx.lineTo(endX,endY);return this.ctx.fill();};return GaugePointer;})();Bar=(function(){function Bar(elem){this.elem=elem;}
23
+ Bar.prototype.updateValues=function(arrValues){this.value=arrValues[0];this.maxValue=arrValues[1];this.avgValue=arrValues[2];return this.render();};Bar.prototype.render=function(){var avgPercent,valPercent;if(this.textField){this.textField.text(formatNumber(this.value));}
24
+ if(this.maxValue===0){this.maxValue=this.avgValue*2;}
25
+ valPercent=(this.value/this.maxValue)*100;avgPercent=(this.avgValue/this.maxValue)*100;$(".bar-value",this.elem).css({"width":valPercent+"%"});return $(".typical-value",this.elem).css({"width":avgPercent+"%"});};return Bar;})();Gauge=(function(){__extends(Gauge,ValueUpdater);Gauge.prototype.elem=null;Gauge.prototype.value=20;Gauge.prototype.maxValue=80;Gauge.prototype.displayedAngle=0;Gauge.prototype.displayedValue=0;Gauge.prototype.lineWidth=40;Gauge.prototype.paddingBottom=0.1;Gauge.prototype.options={colorStart:"#6fadcf",colorStop:"#8fc0da",strokeColor:"#e0e0e0",pointer:{length:0.8,strokeWidth:0.035},angle:0.15,lineWidth:0.44,fontSize:40};function Gauge(canvas){this.canvas=canvas;Gauge.__super__.constructor.call(this);this.ctx=this.canvas.getContext('2d');this.gp=new GaugePointer(this.ctx,this.canvas);this.setOptions();this.render();}
26
+ Gauge.prototype.setOptions=function(options){if(options==null){options=null;}
27
+ updateObjectValues(this.options,options);this.lineWidth=this.canvas.height*(1-this.paddingBottom)*this.options.lineWidth;this.radius=this.canvas.height*(1-this.paddingBottom)-this.lineWidth;this.gp.setOptions(this.options.pointer);if(this.textField){this.textField.style.fontSize=options.fontSize+'px';}
28
+ return this;};Gauge.prototype.set=function(value){this.value=value;if(this.value>this.maxValue){this.maxValue=this.value*1.1;}
29
+ return AnimationUpdater.run();};Gauge.prototype.getAngle=function(value){return(1+this.options.angle)*Math.PI+(value/this.maxValue)*(1-this.options.angle*2)*Math.PI;};Gauge.prototype.setTextField=function(textField){this.textField=textField;};Gauge.prototype.render=function(){var displayedAngle,grd,h,w;w=this.canvas.width/2;h=this.canvas.height*(1-this.paddingBottom);displayedAngle=this.getAngle(this.displayedValue);if(this.textField){this.textField.innerHTML=formatNumber(this.displayedValue);}
30
+ grd=this.ctx.createRadialGradient(w,h,9,w,h,70);this.ctx.lineCap="butt";grd.addColorStop(0,this.options.colorStart);grd.addColorStop(1,this.options.colorStop);this.ctx.strokeStyle=grd;this.ctx.beginPath();this.ctx.arc(w,h,this.radius,(1+this.options.angle)*Math.PI,displayedAngle,false);this.ctx.lineWidth=this.lineWidth;this.ctx.stroke();this.ctx.strokeStyle=this.options.strokeColor;this.ctx.beginPath();this.ctx.arc(w,h,this.radius,displayedAngle,(2-this.options.angle)*Math.PI,false);this.ctx.stroke();return this.gp.render(displayedAngle);};return Gauge;})();Donut=(function(){__extends(Donut,ValueUpdater);Donut.prototype.lineWidth=15;Donut.prototype.displayedValue=0;Donut.prototype.value=33;Donut.prototype.maxValue=80;Donut.prototype.options={lineWidth:0.10,colorStart:"#6f6ea0",colorStop:"#c0c0db",strokeColor:"#eeeeee",angle:0.35};function Donut(canvas){this.canvas=canvas;Donut.__super__.constructor.call(this);this.ctx=this.canvas.getContext('2d');this.setOptions();this.render();}
31
+ Donut.prototype.getAngle=function(value){return(1-this.options.angle)*Math.PI+(value/this.maxValue)*((2+this.options.angle)-(1-this.options.angle))*Math.PI;};Donut.prototype.setOptions=function(options){if(options==null){options=null;}
32
+ updateObjectValues(this.options,options);this.lineWidth=this.canvas.height*this.options.lineWidth;this.radius=this.canvas.height/2-this.lineWidth/2;if(this.textField){this.textField.style.fontSize=options.fontSize+'px';}
33
+ return this;};Donut.prototype.setTextField=function(textField){this.textField=textField;};Donut.prototype.set=function(value){this.value=value;if(this.value>this.maxValue){this.maxValue=this.value*1.1;}
34
+ return AnimationUpdater.run();};Donut.prototype.render=function(){var displayedAngle,grd,grdFill,h,start,stop,w;displayedAngle=this.getAngle(this.displayedValue);w=this.canvas.width/2;h=this.canvas.height/2;if(this.textField){this.textField.innerHTML=formatNumber(this.displayedValue);}
35
+ grdFill=this.ctx.createRadialGradient(w,h,39,w,h,70);grdFill.addColorStop(0,this.options.colorStart);grdFill.addColorStop(1,this.options.colorStop);start=this.radius-this.lineWidth/2;stop=this.radius+this.lineWidth/2;grd=this.ctx.createRadialGradient(w,h,start,w,h,stop);grd.addColorStop(0,"#d5d5d5");grd.addColorStop(0.12,this.options.strokeColor);grd.addColorStop(0.88,this.options.strokeColor);grd.addColorStop(1,"#d5d5d5");this.ctx.strokeStyle=grd;this.ctx.beginPath();this.ctx.arc(w,h,this.radius,(1-this.options.angle)*Math.PI,(2+this.options.angle)*Math.PI,false);this.ctx.lineWidth=this.lineWidth;this.ctx.lineCap="round";this.ctx.stroke();this.ctx.strokeStyle=grdFill;this.ctx.beginPath();this.ctx.arc(w,h,this.radius,(1-this.options.angle)*Math.PI,displayedAngle,false);return this.ctx.stroke();};return Donut;})();window.AnimationUpdater={elements:[],animId:null,addAll:function(list){var elem,_i,_len,_results;_results=[];for(_i=0,_len=list.length;_i<_len;_i++){elem=list[_i];_results.push(AnimationUpdater.elements.push(elem));}
36
+ return _results;},add:function(object){return AnimationUpdater.elements.push(object);},run:function(){var animationFinished,elem,_i,_len,_ref;animationFinished=true;_ref=AnimationUpdater.elements;for(_i=0,_len=_ref.length;_i<_len;_i++){elem=_ref[_i];if(elem.update()){animationFinished=false;}}
37
+ if(!animationFinished){return AnimationUpdater.animId=requestAnimationFrame(AnimationUpdater.run);}else{return cancelAnimationFrame(AnimationUpdater.animId);}}};window.Gauge=Gauge;window.Donut=Donut;}).call(this);
metadata ADDED
@@ -0,0 +1,82 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: gaugejs-rails
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 0
8
+ - 1
9
+ version: 0.0.1
10
+ platform: ruby
11
+ authors:
12
+ - Chris Miller
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2012-08-07 00:00:00 -06:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: railties
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ segments:
28
+ - 3
29
+ - 1
30
+ - 1
31
+ version: 3.1.1
32
+ type: :runtime
33
+ version_requirements: *id001
34
+ description: Gauge.JS packaged for the Rails 3.1+ Asset Pipeline, both the Coffee, JS, and min.JS versions.
35
+ email:
36
+ - lordsauronthegreat@gmail.com
37
+ executables: []
38
+
39
+ extensions: []
40
+
41
+ extra_rdoc_files: []
42
+
43
+ files:
44
+ - gaugejs-rails.gemspec
45
+ - vendor/assets/javascripts/gauge.coffee
46
+ - vendor/assets/javascripts/gauge.js
47
+ - vendor/assets/javascripts/gauge.min.js
48
+ - lib/gaugejs-rails.rb
49
+ - lib/gaugejs-rails/engine.rb
50
+ - lib/gaugejs-rails/version.rb
51
+ has_rdoc: true
52
+ homepage: https://github.com/NSError/gaugejs-rails
53
+ licenses: []
54
+
55
+ post_install_message:
56
+ rdoc_options: []
57
+
58
+ require_paths:
59
+ - lib
60
+ required_ruby_version: !ruby/object:Gem::Requirement
61
+ requirements:
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ segments:
65
+ - 0
66
+ version: "0"
67
+ required_rubygems_version: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ segments:
72
+ - 0
73
+ version: "0"
74
+ requirements: []
75
+
76
+ rubyforge_project:
77
+ rubygems_version: 1.3.6
78
+ signing_key:
79
+ specification_version: 3
80
+ summary: Gauge.JS packaged for your Rails 3.1+ Asset Pipeline
81
+ test_files: []
82
+