fastclick-rails 0.0.1 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c1a419e6b2534033b89876908ca7e3ebf882db73
4
- data.tar.gz: c1f8a7b65bb3ea51c0cfa45626ef1d738333579b
3
+ metadata.gz: 17091765f01fac79dab61f963deb4c7e7aed0fca
4
+ data.tar.gz: f7656097771fb9844616a7c55f1b9960555d2216
5
5
  SHA512:
6
- metadata.gz: 3c11ecfb60dde7ef22dcb46fca785707eb239057b0db6abba27d97092ca93f2aa7568c3ee4066fa5a6bc874b8312cd94b7aa8f7412f84f1ed72cf3a984d4fc17
7
- data.tar.gz: 23845cf065bb9b27505ee08a36ffb214e5418ac6246518905fbfd8da528320620698cec9c5e1716fe31ff76d9d19267e1fa9cbafbcd9d36b45a9c45d0e3e9704
6
+ metadata.gz: bd0db7a3cd1904e9ec91d98b071c46bcb14680d1447f216a476e94034ae2dae3c89523adbace479e219487d957e2b10b94b0834f95aee5b41c21dd4f7727ea2e
7
+ data.tar.gz: b0365be1495fb26c45240e3b56501fe58991b76c68254211e0cedfd4b5c6c219843b7966ea0ef5b85945969d767b89ddad987ab6e6f67e2768f53ebd4bc3b759
data/README.md CHANGED
@@ -22,6 +22,11 @@ Add the follow line in app/assets/javascripts/application.js
22
22
 
23
23
  //= require fastclick
24
24
 
25
+ Initialize in app/assets/javascripts/foo.js.coffee
26
+
27
+ $ ->
28
+ new FastClick(document.body)
29
+
25
30
  ## Contributing
26
31
 
27
32
  1. Fork it
@@ -2,7 +2,7 @@ require 'rails/engine'
2
2
 
3
3
  module Fastclick
4
4
  module Rails
5
- VERSION = "0.0.1"
5
+ VERSION = "1.0.1"
6
6
  class Engine < ::Rails::Engine
7
7
  end
8
8
  end
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * @preserve FastClick: polyfill to remove click delays on browsers with touch UIs.
3
3
  *
4
- * @version 0.6.5
4
+ * @version 1.0.1
5
5
  * @codingstandard ftlabs-jsv2
6
6
  * @copyright The Financial Times Limited [All Rights Reserved]
7
7
  * @license MIT License (see LICENSE.txt)
@@ -16,11 +16,13 @@
16
16
  *
17
17
  * @constructor
18
18
  * @param {Element} layer The layer to listen on
19
+ * @param {Object} options The options to override the defaults
19
20
  */
20
- function FastClick(layer) {
21
+ function FastClick(layer, options) {
21
22
  'use strict';
22
- var oldOnClick, self = this;
23
+ var oldOnClick;
23
24
 
25
+ options = options || {};
24
26
 
25
27
  /**
26
28
  * Whether a click is currently being tracked.
@@ -31,7 +33,7 @@ function FastClick(layer) {
31
33
 
32
34
 
33
35
  /**
34
- * Timestamp for when when click tracking started.
36
+ * Timestamp for when click tracking started.
35
37
  *
36
38
  * @type number
37
39
  */
@@ -70,6 +72,14 @@ function FastClick(layer) {
70
72
  this.lastTouchIdentifier = 0;
71
73
 
72
74
 
75
+ /**
76
+ * Touchmove boundary, beyond which a click will be cancelled.
77
+ *
78
+ * @type number
79
+ */
80
+ this.touchBoundary = options.touchBoundary || 10;
81
+
82
+
73
83
  /**
74
84
  * The FastClick layer.
75
85
  *
@@ -77,31 +87,31 @@ function FastClick(layer) {
77
87
  */
78
88
  this.layer = layer;
79
89
 
80
- if (!layer || !layer.nodeType) {
81
- throw new TypeError('Layer must be a document node');
82
- }
83
-
84
- /** @type function() */
85
- this.onClick = function() { return FastClick.prototype.onClick.apply(self, arguments); };
86
-
87
- /** @type function() */
88
- this.onMouse = function() { return FastClick.prototype.onMouse.apply(self, arguments); };
90
+ /**
91
+ * The minimum time between tap(touchstart and touchend) events
92
+ *
93
+ * @type number
94
+ */
95
+ this.tapDelay = options.tapDelay || 200;
89
96
 
90
- /** @type function() */
91
- this.onTouchStart = function() { return FastClick.prototype.onTouchStart.apply(self, arguments); };
97
+ if (FastClick.notNeeded(layer)) {
98
+ return;
99
+ }
92
100
 
93
- /** @type function() */
94
- this.onTouchEnd = function() { return FastClick.prototype.onTouchEnd.apply(self, arguments); };
101
+ // Some old versions of Android don't have Function.prototype.bind
102
+ function bind(method, context) {
103
+ return function() { return method.apply(context, arguments); };
104
+ }
95
105
 
96
- /** @type function() */
97
- this.onTouchCancel = function() { return FastClick.prototype.onTouchCancel.apply(self, arguments); };
98
106
 
99
- if (FastClick.notNeeded()) {
100
- return;
107
+ var methods = ['onMouse', 'onClick', 'onTouchStart', 'onTouchMove', 'onTouchEnd', 'onTouchCancel'];
108
+ var context = this;
109
+ for (var i = 0, l = methods.length; i < l; i++) {
110
+ context[methods[i]] = bind(context[methods[i]], context);
101
111
  }
102
112
 
103
113
  // Set up event handlers as required
104
- if (this.deviceIsAndroid) {
114
+ if (deviceIsAndroid) {
105
115
  layer.addEventListener('mouseover', this.onMouse, true);
106
116
  layer.addEventListener('mousedown', this.onMouse, true);
107
117
  layer.addEventListener('mouseup', this.onMouse, true);
@@ -109,6 +119,7 @@ function FastClick(layer) {
109
119
 
110
120
  layer.addEventListener('click', this.onClick, true);
111
121
  layer.addEventListener('touchstart', this.onTouchStart, false);
122
+ layer.addEventListener('touchmove', this.onTouchMove, false);
112
123
  layer.addEventListener('touchend', this.onTouchEnd, false);
113
124
  layer.addEventListener('touchcancel', this.onTouchCancel, false);
114
125
 
@@ -160,7 +171,7 @@ function FastClick(layer) {
160
171
  *
161
172
  * @type boolean
162
173
  */
163
- FastClick.prototype.deviceIsAndroid = navigator.userAgent.indexOf('Android') > 0;
174
+ var deviceIsAndroid = navigator.userAgent.indexOf('Android') > 0;
164
175
 
165
176
 
166
177
  /**
@@ -168,7 +179,7 @@ FastClick.prototype.deviceIsAndroid = navigator.userAgent.indexOf('Android') > 0
168
179
  *
169
180
  * @type boolean
170
181
  */
171
- FastClick.prototype.deviceIsIOS = /iP(ad|hone|od)/.test(navigator.userAgent);
182
+ var deviceIsIOS = /iP(ad|hone|od)/.test(navigator.userAgent);
172
183
 
173
184
 
174
185
  /**
@@ -176,7 +187,7 @@ FastClick.prototype.deviceIsIOS = /iP(ad|hone|od)/.test(navigator.userAgent);
176
187
  *
177
188
  * @type boolean
178
189
  */
179
- FastClick.prototype.deviceIsIOS4 = FastClick.prototype.deviceIsIOS && (/OS 4_\d(_\d)?/).test(navigator.userAgent);
190
+ var deviceIsIOS4 = deviceIsIOS && (/OS 4_\d(_\d)?/).test(navigator.userAgent);
180
191
 
181
192
 
182
193
  /**
@@ -184,7 +195,7 @@ FastClick.prototype.deviceIsIOS4 = FastClick.prototype.deviceIsIOS && (/OS 4_\d(
184
195
  *
185
196
  * @type boolean
186
197
  */
187
- FastClick.prototype.deviceIsIOSWithBadTarget = FastClick.prototype.deviceIsIOS && (/OS ([6-9]|\d{2})_\d/).test(navigator.userAgent);
198
+ var deviceIsIOSWithBadTarget = deviceIsIOS && (/OS ([6-9]|\d{2})_\d/).test(navigator.userAgent);
188
199
 
189
200
 
190
201
  /**
@@ -209,7 +220,7 @@ FastClick.prototype.needsClick = function(target) {
209
220
  case 'input':
210
221
 
211
222
  // File inputs need real clicks on iOS 6 due to a browser bug (issue #68)
212
- if ((this.deviceIsIOS && target.type === 'file') || target.disabled) {
223
+ if ((deviceIsIOS && target.type === 'file') || target.disabled) {
213
224
  return true;
214
225
  }
215
226
 
@@ -233,8 +244,9 @@ FastClick.prototype.needsFocus = function(target) {
233
244
  'use strict';
234
245
  switch (target.nodeName.toLowerCase()) {
235
246
  case 'textarea':
236
- case 'select':
237
247
  return true;
248
+ case 'select':
249
+ return !deviceIsAndroid;
238
250
  case 'input':
239
251
  switch (target.type) {
240
252
  case 'button':
@@ -273,11 +285,22 @@ FastClick.prototype.sendClick = function(targetElement, event) {
273
285
 
274
286
  // Synthesise a click event, with an extra attribute so it can be tracked
275
287
  clickEvent = document.createEvent('MouseEvents');
276
- clickEvent.initMouseEvent('click', true, true, window, 1, touch.screenX, touch.screenY, touch.clientX, touch.clientY, false, false, false, false, 0, null);
288
+ clickEvent.initMouseEvent(this.determineEventType(targetElement), true, true, window, 1, touch.screenX, touch.screenY, touch.clientX, touch.clientY, false, false, false, false, 0, null);
277
289
  clickEvent.forwardedTouchEvent = true;
278
290
  targetElement.dispatchEvent(clickEvent);
279
291
  };
280
292
 
293
+ FastClick.prototype.determineEventType = function(targetElement) {
294
+ 'use strict';
295
+
296
+ //Issue #159: Android Chrome Select Box does not open with a synthetic click event
297
+ if (deviceIsAndroid && targetElement.tagName.toLowerCase() === 'select') {
298
+ return 'mousedown';
299
+ }
300
+
301
+ return 'click';
302
+ };
303
+
281
304
 
282
305
  /**
283
306
  * @param {EventTarget|Element} targetElement
@@ -286,7 +309,8 @@ FastClick.prototype.focus = function(targetElement) {
286
309
  'use strict';
287
310
  var length;
288
311
 
289
- if (this.deviceIsIOS && targetElement.setSelectionRange) {
312
+ // Issue #160: on iOS 7, some input elements (e.g. date datetime) throw a vague TypeError on setSelectionRange. These elements don't have an integer value for the selectionStart and selectionEnd properties, but unfortunately that can't be used for detection because accessing the properties also throws a TypeError. Just check the type instead. Filed as Apple bug #15122724.
313
+ if (deviceIsIOS && targetElement.setSelectionRange && targetElement.type.indexOf('date') !== 0 && targetElement.type !== 'time') {
290
314
  length = targetElement.value.length;
291
315
  targetElement.setSelectionRange(length, length);
292
316
  } else {
@@ -354,10 +378,15 @@ FastClick.prototype.onTouchStart = function(event) {
354
378
  'use strict';
355
379
  var targetElement, touch, selection;
356
380
 
381
+ // Ignore multiple touches, otherwise pinch-to-zoom is prevented if both fingers are on the FastClick element (issue #111).
382
+ if (event.targetTouches.length > 1) {
383
+ return true;
384
+ }
385
+
357
386
  targetElement = this.getTargetElementFromEventTarget(event.target);
358
387
  touch = event.targetTouches[0];
359
388
 
360
- if (this.deviceIsIOS) {
389
+ if (deviceIsIOS) {
361
390
 
362
391
  // Only trusted events will deselect text on iOS (issue #49)
363
392
  selection = window.getSelection();
@@ -365,7 +394,7 @@ FastClick.prototype.onTouchStart = function(event) {
365
394
  return true;
366
395
  }
367
396
 
368
- if (!this.deviceIsIOS4) {
397
+ if (!deviceIsIOS4) {
369
398
 
370
399
  // Weird things happen on iOS when an alert or confirm dialog is opened from a click event callback (issue #23):
371
400
  // when the user next taps anywhere else on the page, new touchstart and touchend events are dispatched
@@ -397,7 +426,7 @@ FastClick.prototype.onTouchStart = function(event) {
397
426
  this.touchStartY = touch.pageY;
398
427
 
399
428
  // Prevent phantom clicks on fast double-tap (issue #36)
400
- if ((event.timeStamp - this.lastClickTime) < 200) {
429
+ if ((event.timeStamp - this.lastClickTime) < this.tapDelay) {
401
430
  event.preventDefault();
402
431
  }
403
432
 
@@ -413,9 +442,9 @@ FastClick.prototype.onTouchStart = function(event) {
413
442
  */
414
443
  FastClick.prototype.touchHasMoved = function(event) {
415
444
  'use strict';
416
- var touch = event.changedTouches[0];
445
+ var touch = event.changedTouches[0], boundary = this.touchBoundary;
417
446
 
418
- if (Math.abs(touch.pageX - this.touchStartX) > 10 || Math.abs(touch.pageY - this.touchStartY) > 10) {
447
+ if (Math.abs(touch.pageX - this.touchStartX) > boundary || Math.abs(touch.pageY - this.touchStartY) > boundary) {
419
448
  return true;
420
449
  }
421
450
 
@@ -423,6 +452,28 @@ FastClick.prototype.touchHasMoved = function(event) {
423
452
  };
424
453
 
425
454
 
455
+ /**
456
+ * Update the last position.
457
+ *
458
+ * @param {Event} event
459
+ * @returns {boolean}
460
+ */
461
+ FastClick.prototype.onTouchMove = function(event) {
462
+ 'use strict';
463
+ if (!this.trackingClick) {
464
+ return true;
465
+ }
466
+
467
+ // If the touch has moved, cancel the click tracking
468
+ if (this.targetElement !== this.getTargetElementFromEventTarget(event.target) || this.touchHasMoved(event)) {
469
+ this.trackingClick = false;
470
+ this.targetElement = null;
471
+ }
472
+
473
+ return true;
474
+ };
475
+
476
+
426
477
  /**
427
478
  * Attempt to find the labelled control for the given label element.
428
479
  *
@@ -458,22 +509,19 @@ FastClick.prototype.onTouchEnd = function(event) {
458
509
  'use strict';
459
510
  var forElement, trackingClickStart, targetTagName, scrollParent, touch, targetElement = this.targetElement;
460
511
 
461
- // If the touch has moved, cancel the click tracking
462
- if (this.touchHasMoved(event)) {
463
- this.trackingClick = false;
464
- this.targetElement = null;
465
- }
466
-
467
512
  if (!this.trackingClick) {
468
513
  return true;
469
514
  }
470
515
 
471
516
  // Prevent phantom clicks on fast double-tap (issue #36)
472
- if ((event.timeStamp - this.lastClickTime) < 200) {
517
+ if ((event.timeStamp - this.lastClickTime) < this.tapDelay) {
473
518
  this.cancelNextClick = true;
474
519
  return true;
475
520
  }
476
521
 
522
+ // Reset to prevent wrong click cancel on input (issue #156).
523
+ this.cancelNextClick = false;
524
+
477
525
  this.lastClickTime = event.timeStamp;
478
526
 
479
527
  trackingClickStart = this.trackingClickStart;
@@ -484,9 +532,12 @@ FastClick.prototype.onTouchEnd = function(event) {
484
532
  // is performing a transition or scroll, and has to be re-detected manually. Note that
485
533
  // for this to function correctly, it must be called *after* the event target is checked!
486
534
  // See issue #57; also filed as rdar://13048589 .
487
- if (this.deviceIsIOSWithBadTarget) {
535
+ if (deviceIsIOSWithBadTarget) {
488
536
  touch = event.changedTouches[0];
489
- targetElement = document.elementFromPoint(touch.pageX - window.pageXOffset, touch.pageY - window.pageYOffset);
537
+
538
+ // In certain cases arguments of elementFromPoint can be negative, so prevent setting targetElement to null
539
+ targetElement = document.elementFromPoint(touch.pageX - window.pageXOffset, touch.pageY - window.pageYOffset) || targetElement;
540
+ targetElement.fastClickScrollParent = this.targetElement.fastClickScrollParent;
490
541
  }
491
542
 
492
543
  targetTagName = targetElement.tagName.toLowerCase();
@@ -494,7 +545,7 @@ FastClick.prototype.onTouchEnd = function(event) {
494
545
  forElement = this.findControl(targetElement);
495
546
  if (forElement) {
496
547
  this.focus(targetElement);
497
- if (this.deviceIsAndroid) {
548
+ if (deviceIsAndroid) {
498
549
  return false;
499
550
  }
500
551
 
@@ -504,15 +555,17 @@ FastClick.prototype.onTouchEnd = function(event) {
504
555
 
505
556
  // Case 1: If the touch started a while ago (best guess is 100ms based on tests for issue #36) then focus will be triggered anyway. Return early and unset the target element reference so that the subsequent click will be allowed through.
506
557
  // Case 2: Without this exception for input elements tapped when the document is contained in an iframe, then any inputted text won't be visible even though the value attribute is updated as the user types (issue #37).
507
- if ((event.timeStamp - trackingClickStart) > 100 || (this.deviceIsIOS && window.top !== window && targetTagName === 'input')) {
558
+ if ((event.timeStamp - trackingClickStart) > 100 || (deviceIsIOS && window.top !== window && targetTagName === 'input')) {
508
559
  this.targetElement = null;
509
560
  return false;
510
561
  }
511
562
 
512
563
  this.focus(targetElement);
564
+ this.sendClick(targetElement, event);
513
565
 
514
566
  // Select elements need the event to go through on iOS 4, otherwise the selector menu won't open.
515
- if (!this.deviceIsIOS4 || targetTagName !== 'select') {
567
+ // Also this breaks opening selects when VoiceOver is active on iOS6, iOS7 (and possibly others)
568
+ if (!deviceIsIOS || targetTagName !== 'select') {
516
569
  this.targetElement = null;
517
570
  event.preventDefault();
518
571
  }
@@ -520,7 +573,7 @@ FastClick.prototype.onTouchEnd = function(event) {
520
573
  return false;
521
574
  }
522
575
 
523
- if (this.deviceIsIOS && !this.deviceIsIOS4) {
576
+ if (deviceIsIOS && !deviceIsIOS4) {
524
577
 
525
578
  // Don't send a synthetic click event if the target element is contained within a parent layer that was scrolled
526
579
  // and this tap is being used to stop the scrolling (usually initiated by a fling - issue #42).
@@ -647,7 +700,7 @@ FastClick.prototype.destroy = function() {
647
700
  'use strict';
648
701
  var layer = this.layer;
649
702
 
650
- if (this.deviceIsAndroid) {
703
+ if (deviceIsAndroid) {
651
704
  layer.removeEventListener('mouseover', this.onMouse, true);
652
705
  layer.removeEventListener('mousedown', this.onMouse, true);
653
706
  layer.removeEventListener('mouseup', this.onMouse, true);
@@ -655,27 +708,44 @@ FastClick.prototype.destroy = function() {
655
708
 
656
709
  layer.removeEventListener('click', this.onClick, true);
657
710
  layer.removeEventListener('touchstart', this.onTouchStart, false);
711
+ layer.removeEventListener('touchmove', this.onTouchMove, false);
658
712
  layer.removeEventListener('touchend', this.onTouchEnd, false);
659
713
  layer.removeEventListener('touchcancel', this.onTouchCancel, false);
660
714
  };
661
715
 
662
716
 
663
- FastClick.notNeeded = function() {
717
+ /**
718
+ * Check whether FastClick is needed.
719
+ *
720
+ * @param {Element} layer The layer to listen on
721
+ */
722
+ FastClick.notNeeded = function(layer) {
664
723
  'use strict';
665
724
  var metaViewport;
725
+ var chromeVersion;
666
726
 
667
727
  // Devices that don't support touch don't need FastClick
668
728
  if (typeof window.ontouchstart === 'undefined') {
669
729
  return true;
670
730
  }
671
731
 
672
- if ((/Chrome\/[0-9]+/).test(navigator.userAgent)) {
732
+ // Chrome version - zero for other browsers
733
+ chromeVersion = +(/Chrome\/([0-9]+)/.exec(navigator.userAgent) || [,0])[1];
734
+
735
+ if (chromeVersion) {
673
736
 
674
- // Chrome on Android with user-scalable="no" doesn't need FastClick (issue #89)
675
- if (FastClick.prototype.deviceIsAndroid) {
737
+ if (deviceIsAndroid) {
676
738
  metaViewport = document.querySelector('meta[name=viewport]');
677
- if (metaViewport && metaViewport.content.indexOf('user-scalable=no') !== -1) {
678
- return true;
739
+
740
+ if (metaViewport) {
741
+ // Chrome on Android with user-scalable="no" doesn't need FastClick (issue #89)
742
+ if (metaViewport.content.indexOf('user-scalable=no') !== -1) {
743
+ return true;
744
+ }
745
+ // Chrome 32 and above with width=device-width or less don't need FastClick
746
+ if (chromeVersion > 31 && document.documentElement.scrollWidth <= window.outerWidth) {
747
+ return true;
748
+ }
679
749
  }
680
750
 
681
751
  // Chrome desktop doesn't need FastClick (issue #15)
@@ -684,6 +754,11 @@ FastClick.notNeeded = function() {
684
754
  }
685
755
  }
686
756
 
757
+ // IE10 with -ms-touch-action: none, which disables double-tap-to-zoom (issue #97)
758
+ if (layer.style.msTouchAction === 'none') {
759
+ return true;
760
+ }
761
+
687
762
  return false;
688
763
  };
689
764
 
@@ -692,10 +767,11 @@ FastClick.notNeeded = function() {
692
767
  * Factory method for creating a FastClick object
693
768
  *
694
769
  * @param {Element} layer The layer to listen on
770
+ * @param {Object} options The options to override the defaults
695
771
  */
696
- FastClick.attach = function(layer) {
772
+ FastClick.attach = function(layer, options) {
697
773
  'use strict';
698
- return new FastClick(layer);
774
+ return new FastClick(layer, options);
699
775
  };
700
776
 
701
777
 
metadata CHANGED
@@ -1,55 +1,55 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fastclick-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Masaki Komagata
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-05-01 00:00:00.000000000 Z
11
+ date: 2014-04-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1.3'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.3'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '>='
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rails
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - '>='
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - '>='
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  description: gem for fastclick.js
@@ -59,7 +59,7 @@ executables: []
59
59
  extensions: []
60
60
  extra_rdoc_files: []
61
61
  files:
62
- - .gitignore
62
+ - ".gitignore"
63
63
  - Gemfile
64
64
  - LICENSE.txt
65
65
  - README.md
@@ -77,19 +77,18 @@ require_paths:
77
77
  - lib
78
78
  required_ruby_version: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - '>='
80
+ - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  required_rubygems_version: !ruby/object:Gem::Requirement
84
84
  requirements:
85
- - - '>='
85
+ - - ">="
86
86
  - !ruby/object:Gem::Version
87
87
  version: '0'
88
88
  requirements: []
89
89
  rubyforge_project:
90
- rubygems_version: 2.0.0
90
+ rubygems_version: 2.2.0
91
91
  signing_key:
92
92
  specification_version: 4
93
93
  summary: gem for fastclick.js
94
94
  test_files: []
95
- has_rdoc: