snack-rails 1.2.4rc1

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.
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: