lazysizes_rails 0.0.1

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: 798e7771330ba8d4034f67cdf7a754751ee680e3
4
+ data.tar.gz: a59520c8a45dc565d2be28009768bc8a8c596da5
5
+ SHA512:
6
+ metadata.gz: 5d789610444cf69dc942fad2765ef765d0d9ab2eaa5c0ab52767505507ec537ba65166366176b4a71749aa93fd4133d8bb93d8ee2c40e46f5666d872ce46881f
7
+ data.tar.gz: e3a622373bed0a0fc9b7eacabeabf50f781fe7c6dddf515c7ee20f84ed9e7ccb953d1d35e87decb0bbb1cfafd4dffc2d589c4ed44507e69ebd32969258e4ab89
data/.gitignore ADDED
@@ -0,0 +1,14 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ mkmf.log
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in lazysizes_rails.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Dima Zudochkin
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,36 @@
1
+ # LazysizesRails
2
+
3
+ Simple wrapper for [lazysizes](https://github.com/aFarkas/lazysizes)
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'lazysizes_rails'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ $ gem install lazysizes_rails
18
+
19
+ ## Usage
20
+
21
+ * put necessary images into /app/assets/images folder
22
+ * and show images with **image_tag** helper
23
+
24
+ ```ruby
25
+ <%= image_tag 'low_quality_src.jpeg', data:
26
+ { src: image_path('normal_quality_src.jpeg') }, class: 'lazyload'
27
+ %>
28
+ ```
29
+
30
+ ## Contributing
31
+
32
+ 1. Fork it ( https://github.com/vredniy/lazysizes_rails/fork )
33
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
34
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
35
+ 4. Push to the branch (`git push origin my-new-feature`)
36
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+
@@ -0,0 +1,22 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'lazysizes_rails/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "lazysizes_rails"
8
+ spec.version = LazysizesRails::VERSION
9
+ spec.authors = ["Dima Zudochkin"]
10
+ spec.email = ["dnd.pliz@gmail.com"]
11
+ spec.summary = %q{Lazysizes for Rails application.}
12
+ spec.homepage = ""
13
+ spec.license = "MIT"
14
+
15
+ spec.files = `git ls-files -z`.split("\x0")
16
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
+ spec.require_paths = ["lib"]
19
+
20
+ spec.add_development_dependency "bundler", "~> 1.7"
21
+ spec.add_development_dependency "rake", "~> 10.0"
22
+ end
@@ -0,0 +1,4 @@
1
+ module LazysizesRails
2
+ class Engine < Rails::Engine
3
+ end
4
+ end
@@ -0,0 +1,3 @@
1
+ module LazysizesRails
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,3 @@
1
+ require 'lazysizes_rails/engine'
2
+ require 'lazysizes_rails/version'
3
+
@@ -0,0 +1,483 @@
1
+ (function (factory) {
2
+ window.lazySizes = factory();
3
+ if (typeof define === 'function' && define.amd) {
4
+ define(function() {
5
+ return window.lazySizes;
6
+ });
7
+ }
8
+ }(function () {
9
+ 'use strict';
10
+
11
+ if(!Date.now || !window.document.getElementsByClassName){return;}
12
+
13
+ var lazyloadElems, autosizesElems, lazySizesConfig, globalSizesTimer,
14
+ globalSizesIndex, globalLazyTimer, globalLazyIndex, globalInitialTimer,
15
+ addClass, removeClass, hasClass, isWinloaded;
16
+ var document = window.document;
17
+ var isPreloading = 0;
18
+
19
+ var regDummyTags = /^(?:span|div)$/i;
20
+ var regPicture = /^picture$/i;
21
+ var regScript = /^script$/i;
22
+ var regImg = /^img$/i;
23
+ var inViewTreshhold = 10;
24
+
25
+ var setImmediate = window.setImmediate || window.setTimeout;
26
+ var scriptUrls = {};
27
+ var addRemoveImgEvents = function(dom, fn, add){
28
+ var action = add ? 'addEventListener' : 'removeEventListener';
29
+ dom[action]('load', fn, false);
30
+ dom[action]('abort', fn, false);
31
+ dom[action]('readystatechange', fn, false);
32
+ dom[action]('error', fn, false);
33
+ };
34
+ var unveilAfterLoad = function(e){
35
+ addRemoveImgEvents(e.target, unveilAfterLoad);
36
+ unveilLazy(e.target, true);
37
+ };
38
+ var triggerEvent = function(elem, name, details){
39
+ var event = document.createEvent('Event');
40
+
41
+ event.initEvent(name, true, true);
42
+
43
+ event.details = details || {};
44
+
45
+ elem.dispatchEvent(event);
46
+ return event;
47
+ };
48
+
49
+ if(document.documentElement.classList){
50
+ addClass = function(el, cls){
51
+ el.classList.add(cls);
52
+ };
53
+ removeClass = function(el, cls){
54
+ el.classList.remove(cls);
55
+ };
56
+ hasClass = function(el, cls){
57
+ return el.classList.contains(cls);
58
+ };
59
+ } else {
60
+ addClass = function(ele, cls) {
61
+ if (!hasClass(ele, cls)){
62
+ ele.className += " "+cls;
63
+ }
64
+ };
65
+ removeClass = function(ele, cls) {
66
+ var reg;
67
+ if (hasClass(ele,cls)) {
68
+ reg = new RegExp('(\\s|^)'+cls+'(\\s|$)');
69
+ ele.className = ele.className.replace(reg,' ');
70
+ }
71
+ };
72
+ hasClass = function hasClass(ele,cls) {
73
+ return ele.className.match(new RegExp('(\\s|^)'+cls+'(\\s|$)'));
74
+ };
75
+ }
76
+
77
+ function updatePolyfill(el, full){
78
+ var imageData;
79
+ if(window.picturefill){
80
+ picturefill({reevaluate: true, reparse: true, elements: [el]});
81
+ } else if(window.respimage && !respimage._.observer){
82
+ if(full){
83
+ imageData = el[respimage._.ns];
84
+ if(imageData){
85
+ imageData[full.srcset ? 'srcset' : 'src'] = undefined;
86
+ }
87
+ }
88
+ respimage({reparse: true, elements: [el]});
89
+ } else if(!window.HTMLPictureElement && window.console && document.readyState == 'complete'){
90
+ console.log('Please use a responsive image polyfill, like respimage or picturefill. https://github.com/aFarkas/respimage');
91
+ }
92
+ }
93
+
94
+ var eLlen, resetPreloadingTimer, eLvW, elvH, eLtop, eLleft, eLright, eLbottom, eLnegativeTreshhold;
95
+ var eLnow = Date.now();
96
+ var resetPreloading = function(e){
97
+ isPreloading--;
98
+ clearTimeout(resetPreloadingTimer);
99
+ if(e && e.target){
100
+ addRemoveImgEvents(e.target, resetPreloading);
101
+ }
102
+ if(!e || isPreloading < 0 || !e.target) {
103
+ isPreloading = 0;
104
+ }
105
+ };
106
+ var lazyEvalLazy = (function(){
107
+ var timer, running;
108
+ var unblock = function(){
109
+ running = false;
110
+ };
111
+ var run = function(){
112
+ clearTimeout(timer);
113
+ clearLazyTimer();
114
+ evalLazyElements();
115
+ setTimeout(unblock);
116
+ };
117
+ return {
118
+ debounce: function(){
119
+ clearTimeout(timer);
120
+ clearTimeout(globalInitialTimer);
121
+ running = true;
122
+ timer = setTimeout(run, 66);
123
+ },
124
+ throttled: function(){
125
+ var delay;
126
+ if(!running){
127
+ running = true;
128
+ clearTimeout(timer);
129
+ delay = Date.now() - eLnow;
130
+ if(delay > 300){
131
+ delay = 9;
132
+ } else {
133
+ delay = 99;
134
+ }
135
+ timer = setTimeout(run, delay);
136
+ }
137
+ }
138
+ };
139
+ })();
140
+
141
+ var evalLazyElements = function (){
142
+ var rect, autoLoadElem, loadedSomething;
143
+ eLlen = lazyloadElems.length;
144
+ eLnow = Date.now();
145
+ if(eLlen){
146
+ eLvW = window.innerWidth + inViewTreshhold;
147
+ elvH = window.innerHeight + inViewTreshhold;
148
+ eLnegativeTreshhold = inViewTreshhold * -1;
149
+
150
+ for(; globalLazyIndex < eLlen; globalLazyIndex++){
151
+ rect = lazyloadElems[globalLazyIndex].getBoundingClientRect();
152
+
153
+ if ((eLbottom = rect.bottom) >= eLnegativeTreshhold &&
154
+ (eLtop = rect.top) <= elvH &&
155
+ (eLright = rect.right) >= eLnegativeTreshhold &&
156
+ (eLleft = rect.left) <= eLvW &&
157
+ (eLbottom || eLright || eLleft || eLtop)){
158
+ unveilLazy(lazyloadElems[globalLazyIndex]);
159
+ loadedSomething = true;
160
+ } else {
161
+ if(globalLazyIndex < eLlen - 1 && Date.now() - eLnow > 9){
162
+ globalLazyIndex++;
163
+ autoLoadElem = false;
164
+ globalLazyTimer = setTimeout(evalLazyElements, 4);
165
+ break;
166
+ }
167
+
168
+ if(!loadedSomething && isWinloaded && !autoLoadElem &&
169
+ lazySizesConfig.preloadAfterLoad && isPreloading < 2 &&
170
+ ((eLbottom || eLright || eLleft || eLtop) || lazyloadElems[globalLazyIndex].getAttribute(lazySizesConfig.sizesAttr) != 'auto')){
171
+ autoLoadElem = lazyloadElems[globalLazyIndex];
172
+ }
173
+ }
174
+ }
175
+
176
+ if(autoLoadElem && !loadedSomething){
177
+ preload(autoLoadElem);
178
+ }
179
+ }
180
+ };
181
+
182
+ function preload(elem){
183
+ isPreloading++;
184
+ elem = unveilLazy(elem);
185
+ addRemoveImgEvents(elem, resetPreloading);
186
+ addRemoveImgEvents(elem, resetPreloading, true);
187
+ clearTimeout(resetPreloadingTimer);
188
+ resetPreloadingTimer = setTimeout(resetPreloading, 5000);
189
+ }
190
+
191
+ function addScript(dummyEl){
192
+ var elem = document.createElement('script');
193
+
194
+ var parent = dummyEl.parentNode;
195
+
196
+ dummyEl.removeAttribute(lazySizesConfig.srcAttr);
197
+ parent.insertBefore(elem, dummyEl);
198
+ setImmediate(function(){
199
+ removeClass(dummyEl, lazySizesConfig.lazyClass);
200
+ });
201
+
202
+ return elem;
203
+ }
204
+
205
+ function clearLazyTimer(){
206
+ globalLazyIndex = 0;
207
+ clearTimeout(globalLazyTimer);
208
+ }
209
+
210
+ function unveilLazy(elem, force){
211
+ var sources, i, len, sourceSrcset, sizes, src, srcset, parent;
212
+
213
+ var event = triggerEvent(elem, 'lazybeforeunveil', {force: !!force});
214
+
215
+ if(!event.defaultPrevented){
216
+ sizes = elem.getAttribute(lazySizesConfig.sizesAttr);
217
+ src = elem.getAttribute(lazySizesConfig.srcAttr);
218
+ srcset = elem.getAttribute(lazySizesConfig.srcsetAttr);
219
+ parent = elem.parentNode;
220
+
221
+ if(src || srcset){
222
+
223
+ if(regDummyTags.test(elem.nodeName)){
224
+ elem = addScript(elem);
225
+ }
226
+
227
+ if(regScript.test(elem.nodeName || '')){
228
+ if(scriptUrls[src]){
229
+ return;
230
+ } else {
231
+ scriptUrls[src] = true;
232
+ }
233
+ } else if(regImg.test(elem.nodeName || '')) {
234
+
235
+ //LQIP
236
+ if(!force && !elem.complete && elem.getAttribute('src') && elem.src && !elem.lazyload){
237
+ addRemoveImgEvents(elem, resetPreloading);
238
+ addRemoveImgEvents(elem, resetPreloading, true);
239
+ return;
240
+ }
241
+ if(regPicture.test(parent.nodeName || '')){
242
+ sources = parent.getElementsByTagName('source');
243
+ for(i = 0, len = sources.length; i < len; i++){
244
+ sourceSrcset = sources[i].getAttribute(lazySizesConfig.srcsetAttr);
245
+ if(sourceSrcset){
246
+ sources[i].setAttribute('srcset', sourceSrcset);
247
+ }
248
+ }
249
+ }
250
+ }
251
+
252
+ if(sizes){
253
+ if(sizes == 'auto'){
254
+ updateSizes(elem, true);
255
+ } else {
256
+ elem.setAttribute('sizes', sizes);
257
+ }
258
+ elem.removeAttribute(lazySizesConfig.sizesAttr);
259
+ if (!srcset && window.console && elem.getAttribute('srcset')){
260
+ console.log('using lazysizes with a `srcset` attribute is not good. Use `data-srcset` instead');
261
+ }
262
+ }
263
+
264
+ if(srcset){
265
+ elem.setAttribute('srcset', srcset);
266
+ elem.removeAttribute(lazySizesConfig.srcsetAttr);
267
+ } else if(src){
268
+ elem.setAttribute('src', src);
269
+ elem.removeAttribute(lazySizesConfig.srcAttr);
270
+ }
271
+ }
272
+ }
273
+
274
+ setImmediate(function(){
275
+ removeClass(elem, lazySizesConfig.lazyClass);
276
+ if(sizes == 'auto'){
277
+ addClass(elem, lazySizesConfig.autosizesClass);
278
+ }
279
+
280
+ if(srcset || sizes){
281
+ updatePolyfill(elem, {srcset: srcset, src: src});
282
+ }
283
+ });
284
+ return elem;
285
+ }
286
+
287
+ var lazyEvalSizes = (function(){
288
+ var timer;
289
+ var run = function(){
290
+ clearTimeout(timer);
291
+ clearSizesTimer();
292
+ evalSizesElements();
293
+ };
294
+ return function(){
295
+ clearTimeout(timer);
296
+ clearTimeout(globalSizesTimer);
297
+ timer = setTimeout(run, 99);
298
+ };
299
+ })();
300
+
301
+ var evalSizesElements = function(){
302
+ var checkTime, now, i;
303
+ var len = autosizesElems.length;
304
+ if(len){
305
+
306
+ now = Date.now();
307
+ i = globalSizesIndex || 0;
308
+ checkTime = i + 3;
309
+
310
+ clearSizesTimer();
311
+
312
+ for(; i < len; i++){
313
+ updateSizes(autosizesElems[i]);
314
+
315
+ if(i > checkTime && i < len - 1 && Date.now() - now > 9){
316
+ globalSizesIndex = i + 1;
317
+
318
+ globalSizesTimer = setTimeout(evalSizesElements, 4);
319
+ break;
320
+ }
321
+ }
322
+ }
323
+ };
324
+
325
+ function clearSizesTimer(){
326
+ globalSizesIndex = 0;
327
+ clearTimeout(globalSizesTimer);
328
+ }
329
+
330
+ function updateSizes(elem, noPolyfill){
331
+ var parentWidth, elemWidth, width, cbWidth, parent, sources, i, len, event;
332
+ parent = elem.parentNode;
333
+
334
+ if(parent){
335
+ parentWidth = parent.offsetWidth;
336
+ elemWidth = elem.offsetWidth;
337
+ width = (elemWidth > parentWidth) ?
338
+ elemWidth :
339
+ parentWidth;
340
+
341
+ if(!width && !elem._lazysizesWidth){
342
+ while(parent && parent != document.body && !width){
343
+ width = parent.offsetWidth;
344
+ parent = parent.parentNode;
345
+ }
346
+ }
347
+
348
+ event = triggerEvent(elem, 'lazybeforesizes', {width: width, polyfill: !noPolyfill});
349
+
350
+ if(!event.defaultPrevented){
351
+ width = event.details.width;
352
+
353
+ if(width && width !== elem._lazysizesWidth && (!lazySizesConfig.onlyLargerSizes || (!elem._lazysizesWidth || elem._lazysizesWidth < width))){
354
+ elem._lazysizesWidth = width;
355
+ width += 'px';
356
+ elem.setAttribute('sizes', width);
357
+
358
+ if(regPicture.test(parent.nodeName || '')){
359
+ sources = parent.getElementsByTagName('source');
360
+ for(i = 0, len = sources.length; i < len; i++){
361
+ sources[i].setAttribute('sizes', width);
362
+ }
363
+ }
364
+
365
+ if(event.details.polyfill){
366
+ updatePolyfill(elem);
367
+ }
368
+ }
369
+ }
370
+ }
371
+ }
372
+
373
+ // bind to all possible events ;-) This might look like a performance disaster, but it isn't.
374
+ // The main check functions are written to run extreme fast without consuming memory.
375
+ var onload = function(){
376
+ inViewTreshhold = 400;
377
+ clearTimeout(globalInitialTimer);
378
+
379
+ document.addEventListener('load', lazyEvalLazy.throttled, true);
380
+ isWinloaded = true;
381
+ };
382
+ var onready = function(){
383
+ var element = document.body || document.documentElement;
384
+
385
+ if(lazySizesConfig.mutation){
386
+ if(window.MutationObserver){
387
+ new MutationObserver( lazyEvalLazy.throttled ).observe( document.documentElement, {childList: true, subtree: true, attributes: true} );
388
+ } else {
389
+ element.addEventListener( "DOMNodeInserted", lazyEvalLazy.throttled, true);
390
+ document.documentElement.addEventListener( "DOMAttrModified", lazyEvalLazy.throttled, true);
391
+ }
392
+ }
393
+
394
+ //:hover
395
+ if(lazySizesConfig.hover){
396
+ document.addEventListener('mouseover', lazyEvalLazy.throttled, true);
397
+ }
398
+ //:focus/active
399
+ document.addEventListener('focus', lazyEvalLazy.throttled, true);
400
+ //:target
401
+ window.addEventListener('hashchange', lazyEvalLazy.throttled, true);
402
+
403
+ //:fullscreen
404
+ if(('onmozfullscreenchange' in element)){
405
+ window.addEventListener('mozfullscreenchange', lazyEvalLazy.throttled, true);
406
+ } else if(('onwebkitfullscreenchange' in element)){
407
+ window.addEventListener('webkitfullscreenchange', lazyEvalLazy.throttled, true);
408
+ } else {
409
+ window.addEventListener('fullscreenchange', lazyEvalLazy.throttled, true);
410
+ }
411
+
412
+ if(lazySizesConfig.cssanimation){
413
+ document.addEventListener('animationstart', lazyEvalLazy.throttled, true);
414
+ document.addEventListener('transitionstart', lazyEvalLazy.throttled, true);
415
+ }
416
+ };
417
+
418
+ setTimeout(function(){
419
+ var prop;
420
+ var lazySizesDefaults = {
421
+ mutation: true,
422
+ hover: true,
423
+ cssanimation: true,
424
+ lazyClass: 'lazyload',
425
+ autosizesClass: 'lazyautosizes',
426
+ srcAttr: 'data-src',
427
+ srcsetAttr: 'data-srcset',
428
+ sizesAttr: 'data-sizes',
429
+ preloadAfterLoad: false,
430
+ onlyLargerSizes: true
431
+ };
432
+
433
+ lazySizesConfig = window.lazySizesConfig || {};
434
+
435
+ for(prop in lazySizesDefaults){
436
+ if(!(prop in lazySizesConfig)){
437
+ lazySizesConfig[prop] = lazySizesDefaults[prop];
438
+ }
439
+ }
440
+
441
+ lazyloadElems = document.getElementsByClassName(lazySizesConfig.lazyClass);
442
+ autosizesElems = document.getElementsByClassName(lazySizesConfig.autosizesClass);
443
+
444
+ addEventListener('scroll', lazyEvalLazy.throttled, false);
445
+ (document.body || document.documentElement).addEventListener('scroll', lazyEvalLazy.throttled, true);
446
+ document.addEventListener('touchmove', lazyEvalLazy.throttled, false);
447
+
448
+ addEventListener('resize', lazyEvalLazy.debounce, false);
449
+ addEventListener('resize', lazyEvalSizes, false);
450
+
451
+ if(/^i|^loade|c/.test(document.readyState)){
452
+ onready();
453
+ } else {
454
+ document.addEventListener('DOMContentLoaded', onready, false);
455
+ }
456
+
457
+ if(document.readyState == 'complete'){
458
+ onload();
459
+ } else {
460
+ addEventListener('load', onload, false);
461
+ document.addEventListener('readystatechange', lazyEvalLazy.throttled, false);
462
+ }
463
+
464
+ lazyEvalLazy.throttled();
465
+
466
+ if('lazySizesConfig' in window){
467
+ window.lazySizesConfig = null;
468
+ }
469
+
470
+ }, document.body ? 9 : 99);
471
+
472
+ return {
473
+ updateAllSizes: lazyEvalSizes,
474
+ updateAllLazy: lazyEvalLazy.throttled,
475
+ unveilLazy: function(el){
476
+ if(hasClass(el, lazySizesConfig.lazyClass)){
477
+ unveilLazy(el);
478
+ }
479
+ },
480
+ updateSizes: updateSizes,
481
+ updatePolyfill: updatePolyfill
482
+ };
483
+ }));
metadata ADDED
@@ -0,0 +1,82 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: lazysizes_rails
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Dima Zudochkin
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-10-21 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.7'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.7'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ description:
42
+ email:
43
+ - dnd.pliz@gmail.com
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - ".gitignore"
49
+ - Gemfile
50
+ - LICENSE.txt
51
+ - README.md
52
+ - Rakefile
53
+ - lazysizes_rails.gemspec
54
+ - lib/lazysizes_rails.rb
55
+ - lib/lazysizes_rails/engine.rb
56
+ - lib/lazysizes_rails/version.rb
57
+ - vendor/assets/javascripts/lazysizes_rails.js
58
+ homepage: ''
59
+ licenses:
60
+ - MIT
61
+ metadata: {}
62
+ post_install_message:
63
+ rdoc_options: []
64
+ require_paths:
65
+ - lib
66
+ required_ruby_version: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
71
+ required_rubygems_version: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ requirements: []
77
+ rubyforge_project:
78
+ rubygems_version: 2.2.2
79
+ signing_key:
80
+ specification_version: 4
81
+ summary: Lazysizes for Rails application.
82
+ test_files: []