hisrc-rails 0.1.0

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.
data/.gitignore ADDED
@@ -0,0 +1,2 @@
1
+ Gemfile.lock
2
+ log/
data/CHANGELOG.md ADDED
@@ -0,0 +1,3 @@
1
+ ## 0.1.0 (June 16, 2012)
2
+
3
+ * First public version.
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source :rubygems
2
+
3
+ gemspec
data/README.md ADDED
@@ -0,0 +1,86 @@
1
+ # hisrc-rails
2
+
3
+ Retina displays are coming! Be sure to make your Rails app ready today.
4
+
5
+ How? Well, there are a lot of different approaches:
6
+ * http://css-tricks.com/which-responsive-images-solution-should-you-use/
7
+ * http://www.alistapart.com/articles/responsive-images-how-they-almost-worked-and-what-we-need/
8
+
9
+ The one I like the most is [HiSRC](https://github.com/teleject/hisrc). This gem makes your live easier through two steps:
10
+
11
+ * It adds HiSRC to the Rails asset pipeline – no more messing around with javascript files.
12
+ * It provides a helper method to easy include HiSRC in your Rails views.
13
+
14
+ ## Installation
15
+
16
+ In your `Gemfile`:
17
+
18
+ ```ruby
19
+ gem 'hisrc-rails'
20
+ ```
21
+
22
+ In your `application.js`:
23
+
24
+ ```js
25
+ //= require hisrc
26
+
27
+ $(function() {
28
+ $('img').hisrc();
29
+ });
30
+ ```
31
+
32
+ For detailed information about available configuration options be sure to checkout the [HiSRC readme](https://github.com/teleject/hisrc#setting-up).
33
+
34
+ ## Usage
35
+
36
+ This gem provides a nice little helper method to optimize your views: `responsive_image_tag`
37
+
38
+ `responsive_image_tag` accepts the same options as `image_tag`, and two additional options as well:
39
+
40
+ * `:'1x'` - If no 1x option is provided, the `src` is used.
41
+ * `:'2x'` - If no 2x options is provided, "@2x" is added to the `src`. So "rails.png" becomes "rails@2x.png".
42
+
43
+ ## Examples
44
+ ```ruby
45
+ responsive_image_tag("rails.png")
46
+ # => <img src="/assets/rails.png" data-1x="/assets/rails.png" data-2x="/assets/rails@2x.png" />
47
+
48
+ responsive_image_tag("http://placehold.it/100x100", :'1x' => "http://placehold.it/200x200", :'2x' => "http://placehold.it/400x400")
49
+ # => <img src="http://placehold.it/100x100" data-1x="http://placehold.it/200x200" data-2x="http://placehold.it/200x200" />
50
+ ```
51
+
52
+ ## Acknowledgements
53
+ Many thanks to [1Mark](https://github.com/1Marc) for [his first version](https://github.com/1Marc/hisrc) of HiSRC, and to [teleject](https://github.com/teleject) for maintaining the [current version](https://github.com/teleject/hisrc) of this really great jQuery plugin. :)
54
+
55
+ ## Contributing
56
+
57
+ 1. Fork it
58
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
59
+ 3. Commit your changes (`git commit -am 'Added some feature'`)
60
+ 4. Push to the branch (`git push origin my-new-feature`)
61
+ 5. Create new Pull Request
62
+
63
+ ## Copyright
64
+
65
+ (The MIT license)
66
+
67
+ Copyright (c) 2012 Mario Uher
68
+
69
+ Permission is hereby granted, free of charge, to any person obtaining
70
+ a copy of this software and associated documentation files (the
71
+ "Software"), to deal in the Software without restriction, including
72
+ without limitation the rights to use, copy, modify, merge, publish,
73
+ distribute, sublicense, and/or sell copies of the Software, and to
74
+ permit persons to whom the Software is furnished to do so, subject to
75
+ the following conditions:
76
+
77
+ The above copyright notice and this permission notice shall be
78
+ included in all copies or substantial portions of the Software.
79
+
80
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
81
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
82
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
83
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
84
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
85
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
86
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile ADDED
@@ -0,0 +1,8 @@
1
+ require 'rake'
2
+ require 'rake/testtask'
3
+
4
+ Rake::TestTask.new do |t|
5
+ t.test_files = Dir.glob('spec/**/*_spec.rb')
6
+ end
7
+
8
+ task(default: :test)
@@ -0,0 +1,18 @@
1
+ Gem::Specification.new do |gem|
2
+ gem.name = 'hisrc-rails'
3
+ gem.version = '0.1.0'
4
+ gem.authors = 'Mario Uher'
5
+ gem.email = 'uher.mario@gmail.com'
6
+ gem.description = 'Make owners of the MacBook Pro with Retina Display happy and provide high-res images within your Rails app.'
7
+ gem.summary = 'Use hisrc-rails with Rails 3.1+.'
8
+ gem.homepage = 'http://haihappen.github.com/hisrc-rails'
9
+
10
+ gem.files = `git ls-files`.split("\n")
11
+ gem.require_path = 'lib'
12
+
13
+ gem.add_dependency 'activesupport', '~> 3.1'
14
+ gem.add_dependency 'jquery-rails', '~> 2.0'
15
+
16
+ gem.add_development_dependency 'minitest'
17
+ gem.add_development_dependency 'rails', '~> 3.1'
18
+ end
@@ -0,0 +1,3 @@
1
+ module HisrcRails
2
+ require 'hisrc-rails/railtie' if defined?(Rails)
3
+ end
@@ -0,0 +1,15 @@
1
+ require 'rails/railtie'
2
+ require 'rails/engine'
3
+
4
+ module HisrcRails
5
+ class Railtie < Rails::Railtie
6
+ initializer 'hisrc-rails.initialize' do
7
+ ActiveSupport.on_load :action_view do
8
+ require 'hisrc-rails/responsive_image_tag_helper'
9
+ include HisrcRails::ResponsiveImageTagHelper
10
+ end
11
+ end
12
+ end
13
+
14
+ class Engine < ::Rails::Engine; end
15
+ end
@@ -0,0 +1,30 @@
1
+ require 'active_support/core_ext/object/blank'
2
+
3
+ module HisrcRails
4
+ module ResponsiveImageTagHelper
5
+ # Returns a hisrc-ready html image tag for the +src+.
6
+ # If not otherwise specified, it will add two data attributes
7
+ # which are required for hisrc to work.
8
+ #
9
+ # ==== Options
10
+ # +responsive_image_tag+ accepts the same options as +image_tag+,
11
+ # and two additional options as well:
12
+ #
13
+ # * <tt>:'1x'</tt> - If no 1x option is provided, the +src+ is used.
14
+ # * <tt>:'2x'</tt> - If no 2x options is provided, "@2x" is added to
15
+ # the +src+. So "rails.png" becomes "rails@2x.png".
16
+ #
17
+ # ==== Examples
18
+ # responsive_image_tag("rails.png") # =>
19
+ # <img src="/assets/rails.png" data-1x="/assets/rails.png" data-2x="/assets/rails@2x.png" />
20
+ # responsive_image_tag("http://placehold.it/100x100", :'1x' => "http://placehold.it/200x200", :'2x' => "http://placehold.it/400x400") # =>
21
+ # <img src="http://placehold.it/100x100" data-1x="http://placehold.it/200x200" data-2x="http://placehold.it/200x200" />
22
+ def responsive_image_tag(src, options = {})
23
+ options[:data] ||= {}
24
+ options[:data][:'1x'] ||= path_to_image(options.delete(:'1x').presence || options.delete('1x').presence || src)
25
+ options[:data][:'2x'] ||= path_to_image(options.delete(:'2x').presence || options.delete('2x').presence || src.gsub(/([\w\/]+).(\w+)/, '\1@2x.\2'))
26
+
27
+ image_tag(src, options)
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,22 @@
1
+ require File.expand_path('../spec_helper', __FILE__)
2
+ require 'rails/railtie'
3
+ require 'hisrc-rails/railtie'
4
+ require 'action_controller/railtie'
5
+
6
+ class App < Rails::Application
7
+ config.active_support.deprecation = :log
8
+ new.initialize!
9
+ end
10
+
11
+ describe ActionView::Base do
12
+ it 'haz method' do
13
+ ActionView::Base.instance_methods.must_include(:responsive_image_tag)
14
+ end
15
+ end
16
+
17
+
18
+ describe ActionController::Base do
19
+ it 'haz helper' do
20
+ ActionController::Base.helpers.methods.must_include(:responsive_image_tag)
21
+ end
22
+ end
@@ -0,0 +1,58 @@
1
+ require File.expand_path('../spec_helper', __FILE__)
2
+ require 'hisrc-rails/responsive_image_tag_helper'
3
+
4
+ describe HisrcRails::ResponsiveImageTagHelper do
5
+ let(:mock) do
6
+ Class.new(MiniTest::Mock) do
7
+ include HisrcRails::ResponsiveImageTagHelper
8
+
9
+ def path_to_image(_) _ end
10
+ end.new
11
+ end
12
+
13
+ def data(_1x, _2x)
14
+ { data: { :'1x' => _1x, :'2x' => _2x }}
15
+ end
16
+
17
+
18
+ describe :responsive_image_tag do
19
+ it 'sets the data-1x and data-2x attributes' do
20
+ mock.expect(:image_tag, nil, ['rails.png', data('rails.png', 'rails@2x.png')])
21
+
22
+ mock.responsive_image_tag('rails.png')
23
+ mock.verify
24
+ end
25
+
26
+
27
+ it 'accepts a long +src+ path too' do
28
+ mock.expect(:image_tag, nil, ['long/path/to/image.png', data('long/path/to/image.png', 'long/path/to/image@2x.png')])
29
+
30
+ mock.responsive_image_tag('long/path/to/image.png')
31
+ mock.verify
32
+ end
33
+
34
+
35
+ it 'allows to explicity set the +x+ option' do
36
+ mock.expect(:image_tag, nil, ['http://placehold.it/100x100', data('http://placehold.it/200x200', 'http://placehold.it/400x400')])
37
+
38
+ mock.responsive_image_tag("http://placehold.it/100x100", :'1x' => "http://placehold.it/200x200", :'2x' => "http://placehold.it/400x400")
39
+ mock.verify
40
+ end
41
+
42
+
43
+ it 'allows to explicity set the +x+ option using strings' do
44
+ mock.expect(:image_tag, nil, ['http://placehold.it/100x100', data('http://placehold.it/200x200', 'http://placehold.it/400x400')])
45
+
46
+ mock.responsive_image_tag("http://placehold.it/100x100", '1x' => "http://placehold.it/200x200", '2x' => "http://placehold.it/400x400")
47
+ mock.verify
48
+ end
49
+
50
+
51
+ it 'allows to explicity set the +data+ hash' do
52
+ mock.expect(:image_tag, nil, ['http://placehold.it/100x100', data('http://placehold.it/200x200', 'http://placehold.it/400x400')])
53
+
54
+ mock.responsive_image_tag("http://placehold.it/100x100", data: { :'1x' => "http://placehold.it/200x200", :'2x' => "http://placehold.it/400x400" })
55
+ mock.verify
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,5 @@
1
+ $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+
3
+ require 'minitest/autorun'
4
+ require 'minitest/pride'
5
+ require 'minitest/spec'
@@ -0,0 +1,252 @@
1
+ /*
2
+ * Hisrc jQuery Plugin
3
+ *
4
+ * Copyright (c) 2012
5
+ * Licensed under the MIT license.
6
+ *
7
+ */
8
+
9
+ (function($){
10
+ $.hisrc = {
11
+ bandwidth: null,
12
+ connectionTestResult: null,
13
+ connectionKbps: null,
14
+ connectionType: null,
15
+ devicePixelRatio: null
16
+ };
17
+
18
+ $.hisrc.defaults = {
19
+ useTransparentGif: false,
20
+ transparentGifSrc: 'data:image/gif;base64,R0lGODlhAQABAIAAAMz/AAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==',
21
+ minKbpsForHighBandwidth: 300,
22
+ speedTestUri: 'https://s3.amazonaws.com/cdeutsch/50K',
23
+ speedTestKB: 50,
24
+ speedTestExpireMinutes: 30,
25
+ forcedBandwidth: false
26
+ };
27
+
28
+ // for performance, run this right away (requires jQuery, but no need to wait for DOM to be ready)
29
+ $.hisrc.speedTest = function() {
30
+ $(window).hisrc();
31
+ };
32
+
33
+ $.fn.hisrc = function(options) {
34
+ var settings = $.extend({}, $.hisrc.defaults, options),
35
+
36
+ $els = $(this),
37
+
38
+ // check bandwidth via @Modernizr's network-connection.js
39
+ connection = navigator.connection || { type: 0 }, // polyfill
40
+
41
+ isSlowConnection = connection.type == 3
42
+ || connection.type == 4
43
+ || /^[23]g$/.test(connection.type);
44
+
45
+
46
+ // get pixel ratio
47
+ $.hisrc.devicePixelRatio = 1;
48
+ if(window.devicePixelRatio !== undefined) { $.hisrc.devicePixelRatio = window.devicePixelRatio; }
49
+
50
+
51
+ // variables/functions below for speed test are taken from Foresight.js
52
+ // Copyright (c) 2012 Adam Bradley
53
+ // Licensed under the MIT license.
54
+ // https://github.com/adamdbradley/foresight.js
55
+ // Modified by Christopher Deutsch for hisrc.js
56
+ var speedTestUri = settings.speedTestUri,
57
+ STATUS_LOADING = 'loading',
58
+ STATUS_COMPLETE = 'complete',
59
+ LOCAL_STORAGE_KEY = 'fsjs', // may as well piggy-back on Forsight localstorage key since we're doing the same thing.
60
+ speedConnectionStatus,
61
+
62
+ initSpeedTest = function () {
63
+
64
+ // only check the connection speed once, if there is a status then we've
65
+ // already got info or it already started
66
+ if ( speedConnectionStatus ) {
67
+ return;
68
+ }
69
+
70
+ // force that this device has a low or high bandwidth, used more so for debugging purposes
71
+ if ( settings.forcedBandwidth ) {
72
+ $.hisrc.bandwidth = settings.forcedBandwidth;
73
+ $.hisrc.connectionTestResult = 'forced';
74
+ speedConnectionStatus = STATUS_COMPLETE;
75
+ $els.trigger('speedTestComplete.hisrc');
76
+ return;
77
+ }
78
+
79
+ // if the device pixel ratio is 1, then no need to do a network connection
80
+ // speed test since it can't show hi-res anyways
81
+ if ( $.hisrc.devicePixelRatio === 1 ) {
82
+ $.hisrc.connectionTestResult = 'skip';
83
+ speedConnectionStatus = STATUS_COMPLETE;
84
+ $els.trigger('speedTestComplete.hisrc');
85
+ return;
86
+ }
87
+
88
+ // if we know the connection is 2g or 3g
89
+ // don't even bother with the speed test, cuz its slow
90
+ // Copyright (c) Faruk Ates, Paul Irish, Alex Sexton
91
+ // Available under the BSD and MIT licenses: www.modernizr.com/license/
92
+ // https://github.com/Modernizr/Modernizr/blob/master/feature-detects/network-connection.js
93
+ // Modified by Adam Bradley for Foresight.js
94
+ $.hisrc.connectionType = connection.type;
95
+ if ( isSlowConnection ) {
96
+ // we know this connection is slow, don't bother even doing a speed test
97
+ $.hisrc.connectionTestResult = 'connTypeSlow';
98
+ speedConnectionStatus = STATUS_COMPLETE;
99
+ $els.trigger('speedTestComplete.hisrc');
100
+ return;
101
+ }
102
+
103
+ // check if a speed test has recently been completed and its
104
+ // results are saved in the local storage
105
+ try {
106
+ var fsData = JSON.parse( localStorage.getItem( LOCAL_STORAGE_KEY ) );
107
+ if ( fsData !== null ) {
108
+ if ( ( new Date() ).getTime() < fsData.exp ) {
109
+ // already have connection data within our desired timeframe
110
+ // use this recent data instead of starting another test
111
+ $.hisrc.bandwidth = fsData.bw;
112
+ $.hisrc.connectionKbps = fsData.kbps;
113
+ $.hisrc.connectionTestResult = 'localStorage';
114
+ speedConnectionStatus = STATUS_COMPLETE;
115
+ $els.trigger('speedTestComplete.hisrc');
116
+ return;
117
+ }
118
+ }
119
+ } catch( e ) { }
120
+
121
+ var
122
+ speedTestImg = document.createElement( 'img' ),
123
+ endTime,
124
+ startTime,
125
+ speedTestTimeoutMS;
126
+
127
+ speedTestImg.onload = function () {
128
+ // speed test image download completed
129
+ // figure out how long it took and an estimated connection speed
130
+ endTime = ( new Date() ).getTime();
131
+
132
+ var duration = ( endTime - startTime ) / 1000;
133
+ duration = ( duration > 1 ? duration : 1 ); // just to ensure we don't divide by 0
134
+
135
+ $.hisrc.connectionKbps = ( ( settings.speedTestKB * 1024 * 8 ) / duration ) / 1024;
136
+ $.hisrc.bandwidth = ( $.hisrc.connectionKbps >= settings.minKbpsForHighBandwidth ? 'high' : 'low' );
137
+
138
+ speedTestComplete( 'networkSuccess' );
139
+ };
140
+
141
+ speedTestImg.onerror = function () {
142
+ // fallback incase there was an error downloading the speed test image
143
+ speedTestComplete( 'networkError', 5 );
144
+ };
145
+
146
+ speedTestImg.onabort = function () {
147
+ // fallback incase there was an abort during the speed test image
148
+ speedTestComplete( 'networkAbort', 5 );
149
+ };
150
+
151
+ // begin the network connection speed test image download
152
+ startTime = ( new Date() ).getTime();
153
+ speedConnectionStatus = STATUS_LOADING;
154
+ if ( document.location.protocol === 'https:' ) {
155
+ // if this current document is SSL, make sure this speed test request
156
+ // uses https so there are no ugly security warnings from the browser
157
+ speedTestUri = speedTestUri.replace( 'http:', 'https:' );
158
+ }
159
+ speedTestImg.src = speedTestUri + "?r=" + Math.random();
160
+
161
+ // calculate the maximum number of milliseconds it 'should' take to download an XX Kbps file
162
+ // set a timeout so that if the speed test download takes too long
163
+ // than it isn't a 'high-bandwidth' and ignore what the test image .onload has to say
164
+ // this is used so we don't wait too long on a speed test response
165
+ // Adding 350ms to account for TCP slow start, quickAndDirty === TRUE
166
+ speedTestTimeoutMS = ( ( ( settings.speedTestKB * 8 ) / settings.minKbpsForHighBandwidth ) * 1000 ) + 350;
167
+ setTimeout( function () {
168
+ speedTestComplete( 'networkSlow' );
169
+ }, speedTestTimeoutMS );
170
+ },
171
+
172
+ speedTestComplete = function ( connTestResult, expireMinutes ) {
173
+ // if we haven't already gotten a speed connection status then save the info
174
+ if (speedConnectionStatus === STATUS_COMPLETE) { return; }
175
+
176
+ // first one with an answer wins
177
+ speedConnectionStatus = STATUS_COMPLETE;
178
+ $.hisrc.connectionTestResult = connTestResult;
179
+
180
+ try {
181
+ if ( !expireMinutes ) {
182
+ expireMinutes = settings.speedTestExpireMinutes;
183
+ }
184
+ var fsDataToSet = {
185
+ kbps: $.hisrc.connectionKbps,
186
+ bw: $.hisrc.bandwidth,
187
+ exp: ( new Date() ).getTime() + (expireMinutes * 60000)
188
+ };
189
+ localStorage.setItem( LOCAL_STORAGE_KEY, JSON.stringify( fsDataToSet ) );
190
+ } catch( e ) { }
191
+
192
+ // trigger swap once speedtest is complete.
193
+ $els.trigger('speedTestComplete.hisrc');
194
+ },
195
+
196
+ setImageSource = function ( $el, src ) {
197
+ if ( settings.useTransparentGif ) {
198
+ $el.attr('src', settings.transparentGifSrc)
199
+ .css('max-height', '100%')
200
+ .css('max-width', '100%')
201
+ .css('background', 'url("' + src + '") no-repeat 0 0')
202
+ .css('background-size', 'contain');
203
+ } else {
204
+ $el.attr( 'src', src );
205
+ }
206
+ };
207
+
208
+ $els.each(function(){
209
+ var $el = $(this);
210
+
211
+ if (!$el.data('m1src')) {
212
+ $el.data('m1src', $el.attr('src'));
213
+ }
214
+
215
+ // check for zero which often happens in safari.
216
+ if (!$el.attr('width') && $el.width() > 0) {
217
+ $el.attr('width', $el.width());
218
+ }
219
+ if (!$el.attr('height') && $el.height() > 0) {
220
+ $el.attr('height', $el.height());
221
+ }
222
+
223
+ $el.on('speedTestComplete.hisrc', function(){
224
+
225
+ if (speedConnectionStatus === STATUS_COMPLETE) {
226
+
227
+ if (isSlowConnection) {
228
+ $el.attr( 'src', $el.data('m1src') );
229
+ } else {
230
+
231
+ // check if client can get high res image
232
+ if ($.hisrc.devicePixelRatio > 1 && $.hisrc.bandwidth === 'high') {
233
+ setImageSource( $el, $el.data('2x') );
234
+ } else {
235
+ setImageSource( $el, $el.data('1x') );
236
+ }
237
+ }
238
+ // turn off so hisrc() can be called many times on same element.
239
+ $el.off('speedTestComplete.hisrc');
240
+ }
241
+
242
+ });
243
+ });
244
+
245
+ initSpeedTest();
246
+
247
+ return $els;
248
+ };
249
+
250
+ })(jQuery);
251
+
252
+
metadata ADDED
@@ -0,0 +1,123 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: hisrc-rails
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Mario Uher
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-06-16 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: activesupport
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '3.1'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '3.1'
30
+ - !ruby/object:Gem::Dependency
31
+ name: jquery-rails
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: '2.0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: '2.0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: minitest
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: rails
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: '3.1'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: '3.1'
78
+ description: Make owners of the MacBook Pro with Retina Display happy and provide
79
+ high-res images within your Rails app.
80
+ email: uher.mario@gmail.com
81
+ executables: []
82
+ extensions: []
83
+ extra_rdoc_files: []
84
+ files:
85
+ - .gitignore
86
+ - CHANGELOG.md
87
+ - Gemfile
88
+ - README.md
89
+ - Rakefile
90
+ - hisrc-rails.gemspec
91
+ - lib/hisrc-rails.rb
92
+ - lib/hisrc-rails/railtie.rb
93
+ - lib/hisrc-rails/responsive_image_tag_helper.rb
94
+ - spec/integration_spec.rb
95
+ - spec/responsive_image_tag_helper_spec.rb
96
+ - spec/spec_helper.rb
97
+ - vendor/assets/javascripts/hisrc.js
98
+ homepage: http://haihappen.github.com/hisrc-rails
99
+ licenses: []
100
+ post_install_message:
101
+ rdoc_options: []
102
+ require_paths:
103
+ - lib
104
+ required_ruby_version: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ required_rubygems_version: !ruby/object:Gem::Requirement
111
+ none: false
112
+ requirements:
113
+ - - ! '>='
114
+ - !ruby/object:Gem::Version
115
+ version: '0'
116
+ requirements: []
117
+ rubyforge_project:
118
+ rubygems_version: 1.8.23
119
+ signing_key:
120
+ specification_version: 3
121
+ summary: Use hisrc-rails with Rails 3.1+.
122
+ test_files: []
123
+ has_rdoc: