snack-rails 1.2.4rc1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 34e0e49dba6d5607076abb62c2d3ea3c6ac40c78
4
+ data.tar.gz: 727373b325fe5db57e5fb4696f66428ac919cef0
5
+ SHA512:
6
+ metadata.gz: f6c87816305110fb3aadf0a2b85346200e1bf5c4ae5c0764cbe860a71c113738c3cf33eee266fa2fee63f14bcd49887e4169beac18357e7e852b8f870dd8b99f
7
+ data.tar.gz: c7d2783378d163b7b75f49f3da561d7a8dcf6559d952bfaf2db55bd5526ea91af1b1fbc529d25f1ae52625f013e47065a2e20582af409ad371fa9886bb9e99c4
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in jquery-rails.gemspec
4
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,14 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ snack-rails (1.2.4)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+
10
+ PLATFORMS
11
+ ruby
12
+
13
+ DEPENDENCIES
14
+ snack-rails!
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License
2
+
3
+ Copyright (c) 2010 Andre Arko
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,27 @@
1
+ # snack-rails
2
+
3
+ [Snack](https://github.com/rpflorence/snack) for Rails 3+ asset pipeline.
4
+
5
+ This gem provides snack version 1.2.4rc1
6
+
7
+ ## Installation
8
+
9
+ The snack file will be added to the asset pipeline and available for you to use.
10
+ Add this line to `app/assets/javascripts/application.js`:
11
+
12
+ ```js
13
+ //= require snack
14
+ ```
15
+
16
+ ## Contributing
17
+
18
+ Feel free to open an Issue if you find something that could be improved.
19
+ If you can improve it, please open a Pull Request.
20
+
21
+ If it's an issue pertaining to Snack, please report it to the [snack project](https://github.com/rpflorence/snack).
22
+
23
+ ## Acknowledgements
24
+
25
+ This gem used [the jquery-rails project](https://github.com/rails/jquery-rails) as a template.
26
+
27
+ Copyright [Ahalogy](http://www.ahalogy.com), released under the MIT License.
@@ -0,0 +1 @@
1
+ require 'snack/rails'
@@ -0,0 +1,2 @@
1
+ require 'snack/rails/engine' if ::Rails.version >= '3.1'
2
+ require 'snack/rails/version'
@@ -0,0 +1,6 @@
1
+ module Snack
2
+ module Rails
3
+ class Engine < ::Rails::Engine
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,5 @@
1
+ module Snack
2
+ module Rails
3
+ VERSION = "1.2.4rc1"
4
+ end
5
+ end
@@ -0,0 +1,24 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/snack/rails/version', __FILE__)
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = "snack-rails"
6
+ s.version = Snack::Rails::VERSION
7
+ s.platform = Gem::Platform::RUBY
8
+ s.authors = ["Robin Daugherty"]
9
+ s.email = ["robin@robindaugherty.net"]
10
+ s.homepage = "http://rubygems.org/gems/snack-rails"
11
+ s.summary = "Use SnackJS with Rails 3"
12
+ s.description = "This gem provides SnackJS for your Rails 3 application."
13
+ s.license = "MIT"
14
+
15
+ s.required_rubygems_version = ">= 1.3.6"
16
+ s.rubyforge_project = "snack-rails"
17
+
18
+ # s.add_dependency "railties", ">= 3.0", "< 5.0"
19
+ # s.add_dependency "thor", ">= 0.14", "< 2.0"
20
+
21
+ s.files = `git ls-files`.split("\n")
22
+ s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
23
+ s.require_path = 'lib'
24
+ end
@@ -0,0 +1,683 @@
1
+ /*!
2
+ * snack.js (c) Ryan Florence
3
+ * https://github.com/rpflorence/snack
4
+ * MIT License
5
+ * Inspiration and code adapted from
6
+ * MooTools (c) Valerio Proietti MIT license
7
+ * jQuery (c) John Resig Dual license MIT or GPL Version 2
8
+ * contentLoaded (c) Diego Perini MIT License
9
+ * Zepto.js (c) Thomas Fuchs MIT License
10
+ * Version: 1.2.4dev at fd5896fc2121c45400969b041dec1ad9d805354c
11
+ */
12
+
13
+ if (typeof Object.create != 'function'){
14
+ // ES5 Obeject.create
15
+ Object.create = function (o){
16
+ function F() {}
17
+ F.prototype = o
18
+ return new F
19
+ }
20
+ }
21
+
22
+ !function(window){
23
+ var snack = window.snack = {}
24
+ , guid = 0
25
+ , toString = Object.prototype.toString
26
+ , indexOf = [].indexOf
27
+ , push = [].push
28
+
29
+ snack.extend = function (){
30
+ if (arguments.length == 1)
31
+ return snack.extend(snack, arguments[0])
32
+
33
+ var target = arguments[0]
34
+
35
+ for (var key, i = 1, l = arguments.length; i < l; i++)
36
+ for (key in arguments[i])
37
+ target[key] = arguments[i][key]
38
+
39
+ return target
40
+ }
41
+
42
+ snack.extend({
43
+ v: '1.2.4dev',
44
+
45
+ bind: function (fn, context, args) {
46
+ args = args || [];
47
+ return function (){
48
+ push.apply(args, arguments);
49
+ return fn.apply(context, args)
50
+ }
51
+ },
52
+
53
+ punch: function (obj, method, fn, auto){
54
+ var old = obj[method]
55
+ obj[method] = auto ? function (){
56
+ old.apply(obj, arguments)
57
+ return fn.apply(obj, arguments)
58
+ } : function (){
59
+ var args = [].slice.call(arguments, 0)
60
+ args.unshift(snack.bind(old, obj))
61
+ return fn.apply(obj, args)
62
+ }
63
+ },
64
+
65
+ create: function (proto, ext){
66
+ var obj = Object.create(proto)
67
+ if (!ext)
68
+ return obj
69
+
70
+ for (var i in ext) {
71
+ if (!ext.hasOwnProperty(i))
72
+ continue
73
+
74
+ if (!proto[i] || typeof ext[i] != 'function'){
75
+ obj[i] = ext[i]
76
+ continue
77
+ }
78
+
79
+ snack.punch(obj, i, ext[i])
80
+ }
81
+
82
+ return obj
83
+ },
84
+
85
+ id: function (){
86
+ return ++guid
87
+ },
88
+
89
+ each: function (obj, fn, context){
90
+ if (obj.length === void+0){ // loose check for object, we want array-like objects to be treated as arrays
91
+ for (var key in obj)
92
+ if (obj.hasOwnProperty(key))
93
+ fn.call(context, obj[key], key, obj);
94
+ return obj
95
+ }
96
+
97
+ for (var i = 0, l = obj.length; i < l; i++)
98
+ fn.call(context, obj[i], i, obj)
99
+ return obj
100
+ },
101
+
102
+ parseJSON: function(json) {
103
+ // adapted from jQuery
104
+ if (typeof json != 'string')
105
+ return
106
+
107
+ json = json.replace(/^\s+|\s+$/g, '')
108
+
109
+ var isValid = /^[\],:{}\s]*$/.test(json.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@")
110
+ .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]")
111
+ .replace(/(?:^|:|,)(?:\s*\[)+/g, ""))
112
+
113
+ if (!isValid)
114
+ throw "Invalid JSON"
115
+
116
+ var JSON = window.JSON // saves a couple bytes
117
+ return JSON && JSON.parse ? JSON.parse(json) : (new Function("return " + json))()
118
+ },
119
+
120
+ isArray: function (obj){
121
+ return obj instanceof Array || toString.call(obj) == "[object Array]"
122
+ },
123
+
124
+ indexOf: indexOf ? function(item, array){
125
+ return indexOf.call(array, item)
126
+ } : function (item, array){
127
+ for (var i = 0, l = array.length; i < l; i++)
128
+ if (array[i] === item)
129
+ return i
130
+
131
+ return -1
132
+ }
133
+ })
134
+ }(window);
135
+ !function (snack, document){
136
+ var proto = {}
137
+ , query
138
+
139
+ snack.wrap = function (nodes, context){
140
+ // passed in a CSS selector
141
+ if (typeof nodes == 'string')
142
+ nodes = query(nodes, context)
143
+
144
+ // passed in single node
145
+ if (!nodes.length)
146
+ nodes = [nodes]
147
+
148
+ var wrapper = Object.create(proto)
149
+ , i = 0
150
+ , l = nodes.length
151
+
152
+ for (; i < l; i++)
153
+ wrapper[i] = nodes[i]
154
+
155
+ wrapper.length = l
156
+ wrapper.id = snack.id()
157
+ return wrapper
158
+ }
159
+
160
+ snack.extend(snack.wrap, {
161
+ define: function(name, fn){
162
+ if (typeof name != 'string'){
163
+ for (var i in name)
164
+ snack.wrap.define(i, name[i])
165
+ return
166
+ }
167
+ proto[name] = fn
168
+ },
169
+
170
+ defineEngine: function (fn){
171
+ query = fn
172
+ }
173
+ })
174
+
175
+ // QSA default selector engine, supports real browsers and IE8+
176
+ snack.wrap.defineEngine(function (selector, context){
177
+ if (typeof context == 'string')
178
+ context = document.querySelector(context)
179
+
180
+ return (context || document).querySelectorAll(selector)
181
+ })
182
+ }(snack, document)
183
+ !function (snack, window, document){
184
+ var add = document.addEventListener ? 'addEventListener' : 'attachEvent'
185
+ , remove = document.addEventListener ? 'removeEventListener' : 'detachEvent'
186
+ , prefix = document.addEventListener ? '' : 'on'
187
+ , ready = false
188
+ , top = true
189
+ , root = document.documentElement
190
+ , readyHandlers = []
191
+
192
+ snack.extend({
193
+ stopPropagation: function (event){
194
+ if (event.stopPropagation)
195
+ event.stopPropagation()
196
+ else
197
+ event.cancelBubble = true
198
+ },
199
+
200
+ preventDefault: function (event){
201
+ if (event.preventDefault)
202
+ event.preventDefault()
203
+ else
204
+ event.returnValue = false
205
+ }
206
+ })
207
+
208
+ snack.listener = function (params, handler){
209
+ if (params.delegate){
210
+ params.capture = true
211
+ _handler = handler
212
+ handler = function (event){
213
+ // adapted from Zepto
214
+ var target = event.target || event.srcElement
215
+ , nodes = typeof params.delegate == 'string'
216
+ ? snack.wrap(params.delegate, params.node)
217
+ : params.delegate(params.node)
218
+
219
+ while (target && snack.indexOf(target, nodes) == -1 )
220
+ target = target.parentNode
221
+
222
+ if (target && !(target === this) && !(target === document))
223
+ _handler.call(target, event, target)
224
+ }
225
+ }
226
+
227
+ if (params.context)
228
+ handler = snack.bind(handler, params.context)
229
+
230
+ var methods = {
231
+ attach: function (){
232
+ params.node[add](
233
+ prefix + params.event,
234
+ handler,
235
+ params.capture
236
+ )
237
+ },
238
+
239
+ detach: function (){
240
+ params.node[remove](
241
+ prefix + params.event,
242
+ handler,
243
+ params.capture
244
+ )
245
+ },
246
+
247
+ fire: function (){
248
+ handler.apply(params.node, arguments)
249
+ }
250
+ }
251
+
252
+ methods.attach()
253
+
254
+ return methods
255
+ }
256
+
257
+
258
+
259
+
260
+ snack.ready = function (handler){
261
+ if (ready){
262
+ handler.apply(document)
263
+ return
264
+ }
265
+ readyHandlers.push(handler)
266
+ }
267
+
268
+ // adapted from contentloaded
269
+ function init(e) {
270
+ if (e.type == 'readystatechange' && document.readyState != 'complete')
271
+ return
272
+
273
+ (e.type == 'load' ? window : document)[remove](prefix + e.type, init, false)
274
+
275
+ if (!ready && (ready = true))
276
+ snack.each(readyHandlers, function (handler){
277
+ handler.apply(document)
278
+ })
279
+ }
280
+
281
+ function poll() {
282
+ try {
283
+ root.doScroll('left')
284
+ } catch(e) {
285
+ setTimeout(poll, 50)
286
+ return
287
+ }
288
+ init('poll')
289
+ }
290
+
291
+ if (document.createEventObject && root.doScroll) {
292
+ try {
293
+ top = !window.frameElement
294
+ } catch(e) {}
295
+ if (top)
296
+ poll();
297
+ }
298
+
299
+ document[add](prefix + 'DOMContentLoaded', init, false)
300
+ document[add](prefix + 'readystatechange', init, false)
301
+ window[add](prefix + 'load', init, false)
302
+ }(snack, window, document);
303
+ !function (snack){
304
+ snack.publisher = function (obj){
305
+ var channels = {}
306
+ obj = obj || {}
307
+
308
+ snack.extend(obj, {
309
+ subscribe: function (channel, handler, context){
310
+ var subscription = {
311
+ fn: handler,
312
+ ctxt: (context || {})
313
+ }
314
+
315
+ if (!channels[channel])
316
+ channels[channel] = []
317
+
318
+ var publik = {
319
+ attach: function (){
320
+ channels[channel].push(subscription)
321
+ },
322
+ detach: function (){
323
+ channels[channel].splice(snack.indexOf(handler, channels[channel]), 1)
324
+ }
325
+ }
326
+ publik.attach()
327
+ return publik
328
+ },
329
+
330
+ publish: function (channel, argsArray){
331
+ if (!channels[channel])
332
+ return false
333
+
334
+ snack.each(channels[channel], function (subscription){
335
+ subscription.fn.apply(subscription.ctxt, argsArray || [])
336
+ })
337
+
338
+ return channels[channel].length
339
+ }
340
+ })
341
+
342
+ return obj
343
+ }
344
+
345
+ snack.publisher(snack)
346
+ }(snack);
347
+ !function(snack, window, document){
348
+ snack.JSONP = function(params, callback){
349
+ // adapted from Zepto
350
+ var jsonpString = 'jsonp' + snack.id()
351
+ , script = document.createElement('script')
352
+ , running = false
353
+
354
+ snack.JSONP[jsonpString] = function(data){
355
+ running = false
356
+ delete snack.JSONP[jsonpString]
357
+ callback(data)
358
+ }
359
+
360
+ if (typeof params.data == 'object')
361
+ params.data = snack.toQueryString(params.data)
362
+
363
+ var publik = {
364
+ send: function (){
365
+ running = true
366
+ script.src = params.url + '?' + params.key + '=snack.JSONP.' + jsonpString + '&' + params.data
367
+ document.getElementsByTagName('head')[0].appendChild(script)
368
+ },
369
+
370
+ cancel: function (){
371
+ running && script.parentNode && script.parentNode.removeChild(script)
372
+ running = false
373
+ snack.JSONP[jsonpString] = function (){
374
+ delete snack.JSONP[jsonpString]
375
+ }
376
+ }
377
+ }
378
+
379
+ if (params.now !== false)
380
+ publik.send()
381
+
382
+ return publik
383
+ }
384
+
385
+ snack.toQueryString = function(object, base){
386
+ // adapted from MooTools
387
+ var queryString = []
388
+
389
+ snack.each(object, function(value, key){
390
+ if (base)
391
+ key = base + '[' + key + ']'
392
+
393
+ var result
394
+
395
+ if (snack.isArray(value)){
396
+ var qs = {}
397
+ snack.each(value, function(val, i){
398
+ qs[i] = val
399
+ })
400
+ result = snack.toQueryString(qs, key)
401
+ }
402
+ else if (typeof value == 'object')
403
+ result = snack.toQueryString(value, key)
404
+ else
405
+ result = key + '=' + encodeURIComponent(value)
406
+
407
+ if (value !== null)
408
+ queryString.push(result)
409
+ })
410
+
411
+ return queryString.join('&')
412
+ }
413
+
414
+ var xhrObject = (function(){
415
+ // adapted from MooTools
416
+ var XMLHTTP = function(){
417
+ return new XMLHttpRequest();
418
+ }
419
+
420
+ var MSXML2 = function(){
421
+ return new ActiveXObject('MSXML2.XMLHTTP');
422
+ }
423
+
424
+ var MSXML = function(){
425
+ return new ActiveXObject('Microsoft.XMLHTTP');
426
+ }
427
+
428
+ try {
429
+ XMLHTTP()
430
+ return XMLHTTP
431
+ } catch (e){
432
+ try {
433
+ MSXML2()
434
+ return MSXML2
435
+ } catch (e){
436
+ MSXML()
437
+ return MSXML
438
+ }
439
+ }
440
+ })();
441
+
442
+ function empty(){}
443
+
444
+ snack.request = function (options, callback){
445
+ // adapted from MooTools
446
+ if (!(this instanceof snack.request))
447
+ return new snack.request(options, callback)
448
+
449
+ var self = this
450
+ self.options = snack.extend({}, self.options, options)
451
+ self.callback = callback
452
+ self.xhr = new xhrObject
453
+ self.headers = self.options.headers
454
+ if (self.options.now !== false)
455
+ self.send()
456
+ }
457
+
458
+ snack.request.prototype = {
459
+
460
+ options: {/*
461
+ user: '',
462
+ password: '',*/
463
+ exception: empty,
464
+ url: '',
465
+ data: '',
466
+ method: 'get',
467
+ now: true,
468
+ headers: {
469
+ 'X-Requested-With': 'XMLHttpRequest',
470
+ 'Accept': 'text/javascript, text/html, application/xml, text/xml, */*'
471
+ },
472
+ async: true,
473
+ emulation: true,
474
+ urlEncoded: true,
475
+ encoding: 'utf-8'
476
+ },
477
+
478
+ onStateChange: function(){
479
+ var self = this
480
+ , xhr = self.xhr
481
+
482
+ if (xhr.readyState != 4 || !self.running) return
483
+ self.running = false
484
+ self.status = 0
485
+
486
+ try{
487
+ var status = xhr.status
488
+ self.status = (status == 1223) ? 204 : status
489
+ } catch(e) {}
490
+
491
+ xhr.onreadystatechange = empty;
492
+
493
+ var args = self.status >= 200 && self.status < 300
494
+ ? [false, self.xhr.responseText || '', self.xhr.responseXML]
495
+ : [self.status]
496
+
497
+ self.callback.apply(self, args)
498
+ },
499
+
500
+ setHeader: function(name, value){
501
+ this.headers[name] = value;
502
+ return this;
503
+ },
504
+
505
+ getHeader: function(name){
506
+ try {
507
+ return this.xhr.getResponseHeader(name)
508
+ } catch(e) {
509
+ return null
510
+ }
511
+ },
512
+
513
+ send: function(){
514
+ var self = this
515
+ , options = self.options
516
+
517
+ if (self.running) return self;
518
+
519
+ self.running = true;
520
+
521
+ var data = options.data || ''
522
+ , url = String(options.url)
523
+ , method = options.method.toLowerCase()
524
+
525
+ if (typeof data != 'string')
526
+ data = snack.toQueryString(data)
527
+
528
+ if (options.emulation && snack.indexOf(method, ['get', 'post']) < 0){
529
+ var _method = '_method=' + method
530
+ data = (data) ? _method + '&' + data : _method
531
+ method = 'post'
532
+ }
533
+
534
+ if (options.urlEncoded && snack.indexOf(method, ['post', 'put']) > -1){
535
+ var encoding = (options.encoding) ? '; charset=' + options.encoding : ''
536
+ self.headers['Content-type'] = 'application/x-www-form-urlencoded' + encoding
537
+ }
538
+
539
+ if (!url)
540
+ url = document.location.pathname
541
+
542
+ var trimPosition = url.lastIndexOf('/')
543
+ if (trimPosition > -1 && (trimPosition = url.indexOf('#')) > -1)
544
+ url = url.substr(0, trimPosition)
545
+
546
+ if (data && method == 'get'){
547
+ url += (url.indexOf('?') > -1 ? '&' : '?') + data
548
+ data = null
549
+ }
550
+
551
+ var xhr = self.xhr
552
+
553
+ xhr.open(method.toUpperCase(), url, options.async, options.user, options.password)
554
+ if (options.user && 'withCredentials' in xhr) xhr.withCredentials = true
555
+
556
+ xhr.onreadystatechange = snack.bind(self.onStateChange, self)
557
+
558
+ for (var i in self.headers){
559
+ try {
560
+ xhr.setRequestHeader(i, self.headers[i])
561
+ } catch (e){
562
+ options.exception.apply(self, [i, self.headers[i]])
563
+ }
564
+ }
565
+
566
+ xhr.send(data)
567
+ if (!options.async) self.onStateChange()
568
+
569
+ return self
570
+ },
571
+
572
+ cancel: function(){
573
+ var self = this
574
+
575
+ if (!self.running)
576
+ return self
577
+
578
+ self.running = false
579
+
580
+ var xhr = self.xhr
581
+ xhr.abort()
582
+
583
+ xhr.onreadystatechange = empty
584
+
585
+ self.xhr = new xhrObject()
586
+ return self
587
+ }
588
+ }
589
+ }(snack, window, document)
590
+ !function(snack, document){
591
+ snack.wrap.define({
592
+ data: function (){
593
+ // API inspired by jQuery
594
+ var storage = {}
595
+
596
+ return function (key, value){
597
+ var data = storage[this.id]
598
+
599
+ if (!data)
600
+ data = storage[this.id] = {}
601
+
602
+ if (value === void+1)
603
+ return data[key]
604
+
605
+ return data[key] = value
606
+ }
607
+ }(),
608
+
609
+ each: function (fn, context){
610
+ return snack.each(this, fn, context)
611
+ },
612
+
613
+ addClass: function (className){
614
+ // adapted from MooTools
615
+ return this.each(function (element){
616
+ if (clean(element.className).indexOf(className) > -1)
617
+ return
618
+ element.className = clean(element.className + ' ' + className)
619
+ })
620
+ },
621
+
622
+ removeClass: function (className){
623
+ // adapted from MooTools
624
+ return this.each(function (element){
625
+ element.className = element.className.replace(new RegExp('(^|\\s)' + className + '(?:\\s|$)'), '$1')
626
+ })
627
+ },
628
+
629
+ attach: function (event, handler, /* internal */ delegation){
630
+ var split = event.split('.')
631
+ , listeners = []
632
+
633
+ if (split[1])
634
+ listeners = this.data(split[1]) || []
635
+
636
+ this.each(function(node){
637
+ var params = {
638
+ node: node,
639
+ event: split[0]
640
+ }
641
+
642
+ if (delegation)
643
+ params.delegate = delegation
644
+
645
+ listeners.push(snack.listener(params, handler))
646
+ })
647
+
648
+ if (split[1])
649
+ this.data(split[1], listeners)
650
+
651
+ return this
652
+ },
653
+
654
+ detach: function (namespace){
655
+ listenerMethod(this, 'detach', namespace, null, true)
656
+ this.data(namespace, null)
657
+ return this
658
+ },
659
+
660
+ fire: function (namespace, args){
661
+ return listenerMethod(this, 'fire', namespace, args)
662
+ },
663
+
664
+ delegate: function (event, delegation, handler){
665
+ return this.attach(event, handler, delegation)
666
+ }
667
+ })
668
+
669
+ function clean(str){
670
+ return str.replace(/\s+/g, ' ').replace(/^\s+|\s+$/g, '')
671
+ }
672
+
673
+ function listenerMethod(wrapper, method, namespace, args){
674
+ var data = wrapper.data(namespace)
675
+
676
+ if (data)
677
+ snack.each(data, function (listener){
678
+ listener[method].apply(wrapper, args)
679
+ })
680
+
681
+ return wrapper
682
+ }
683
+ }(snack, document);
metadata ADDED
@@ -0,0 +1,55 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: snack-rails
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.2.4rc1
5
+ platform: ruby
6
+ authors:
7
+ - Robin Daugherty
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-03-06 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: This gem provides SnackJS for your Rails 3 application.
14
+ email:
15
+ - robin@robindaugherty.net
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - Gemfile
21
+ - Gemfile.lock
22
+ - LICENSE
23
+ - README.md
24
+ - lib/snack-rails.rb
25
+ - lib/snack/rails.rb
26
+ - lib/snack/rails/engine.rb
27
+ - lib/snack/rails/version.rb
28
+ - snack-rails.gemspec
29
+ - vendor/assets/javascripts/snack.js
30
+ homepage: http://rubygems.org/gems/snack-rails
31
+ licenses:
32
+ - MIT
33
+ metadata: {}
34
+ post_install_message:
35
+ rdoc_options: []
36
+ require_paths:
37
+ - lib
38
+ required_ruby_version: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - '>='
41
+ - !ruby/object:Gem::Version
42
+ version: '0'
43
+ required_rubygems_version: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: 1.3.6
48
+ requirements: []
49
+ rubyforge_project: snack-rails
50
+ rubygems_version: 2.0.14
51
+ signing_key:
52
+ specification_version: 4
53
+ summary: Use SnackJS with Rails 3
54
+ test_files: []
55
+ has_rdoc: