discourse_fastimage 2.0.3 → 2.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.textile +20 -13
- data/lib/fastimage.rb +97 -62
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a75deaf2e304cde6b7109dc87c50d3fe2866633a
|
4
|
+
data.tar.gz: ad9f971c2769571d02c14e409482399e0ae7a714
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 73efc6a4b04c496a7d834ef2a7d9071111ef801b94a03a92f40700d9ff790d551a9fa6d642e1537b3d730a532762604766b97c673db0de7b6c8b5db465bcd302
|
7
|
+
data.tar.gz: 808365bbfc92ce320ff314f814548cb71d44ece029035a4a2f8d7f4a3e382fdf9e47f452427c4db70e575c92405de7c80377a212508bd6e0ccd6069493d22ee0
|
data/README.textile
CHANGED
@@ -19,29 +19,29 @@ You only need supply the uri, and FastImage will do the rest.
|
|
19
19
|
|
20
20
|
h2. Features
|
21
21
|
|
22
|
-
|
23
|
-
interpreted as a filename, and FastImage will attempt to open it with File#open.
|
22
|
+
FastImage can also read local (and other) files - anything that is not parseable as a URI will be interpreted as a filename, and FastImage will attempt to open it with @File#open@.
|
24
23
|
|
25
|
-
FastImage will also automatically read from any object that responds to
|
26
|
-
instance an IO object if that is passed instead of a URI.
|
24
|
+
FastImage will also automatically read from any object that responds to @:read@ - for instance an IO object if that is passed instead of a URI.
|
27
25
|
|
28
26
|
FastImage will follow up to 4 HTTP redirects to get the image.
|
29
27
|
|
30
|
-
FastImage will obey the http_proxy setting in your environment to route requests via a proxy. You can also pass a
|
28
|
+
FastImage will obey the @http_proxy@ setting in your environment to route requests via a proxy. You can also pass a @:proxy@ argument if you want to specify the proxy address in the call.
|
31
29
|
|
32
|
-
You can add a timeout to the request which will limit the request time by passing
|
30
|
+
You can add a timeout to the request which will limit the request time by passing @:timeout => number_of_seconds@.
|
33
31
|
|
34
|
-
FastImage normally replies
|
32
|
+
FastImage normally replies with @nil@ if it encounters an error, but you can pass @:raise_on_failure => true@ to get an exception.
|
35
33
|
|
36
34
|
FastImage also provides a reader for the content length header provided in HTTP. This may be useful to assess the file size of an image, but do not rely on it exclusively - it will not be present in chunked responses for instance.
|
37
35
|
|
38
|
-
FastImage accepts additional HTTP headers. This can be used to set a user agent or referrer which some servers require. Pass an
|
36
|
+
FastImage accepts additional HTTP headers. This can be used to set a user agent or referrer which some servers require. Pass an @:http_header@ argument to specify headers, e.g., @:http_header => {'User-Agent' => 'Fake Browser'}@.
|
39
37
|
|
40
38
|
FastImage can give you information about the parsed display orientation of an image with Exif data (jpeg or tiff).
|
41
39
|
|
40
|
+
FastImage also handles "Data URIs":https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs correctly.
|
41
|
+
|
42
42
|
h2. Security
|
43
43
|
|
44
|
-
As of v1.6.7 FastImage no longer uses openuri to open files, but directly calls File.open
|
44
|
+
As of v1.6.7 FastImage no longer uses @openuri@ to open files, but directly calls @File.open@. Take care to sanitise the strings passed to FastImage; it will try to read from whatever is passed.
|
45
45
|
|
46
46
|
h2. Examples
|
47
47
|
|
@@ -64,6 +64,8 @@ FastImage.size("http://stephensykes.com/images/ss.com_x.gif", :http_header => {'
|
|
64
64
|
=> [266, 56]
|
65
65
|
FastImage.new("http://stephensykes.com/images/ExifOrientation3.jpg").orientation
|
66
66
|
=> 3
|
67
|
+
FastImage.size("data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==")
|
68
|
+
=> [1, 1]
|
67
69
|
</code></pre>
|
68
70
|
|
69
71
|
h2. Installation
|
@@ -90,6 +92,10 @@ h2. Documentation
|
|
90
92
|
|
91
93
|
"http://sdsykes.github.io/fastimage/rdoc/FastImage.html":http://sdsykes.github.io/fastimage/rdoc/FastImage.html
|
92
94
|
|
95
|
+
h2. Maintainer
|
96
|
+
|
97
|
+
FastImage is maintained by Stephen Sykes (@sdsykes). Support this project by using "LibPixel":https://libpixel.com cloud based image resizing and processing service.
|
98
|
+
|
93
99
|
h2. Benchmark
|
94
100
|
|
95
101
|
It's way faster than conventional methods (for example the image_size gem) for most types of file when fetching over the wire.
|
@@ -99,7 +105,7 @@ irb> uri = "http://upload.wikimedia.org/wikipedia/commons/b/b4/Mardin_1350660_13
|
|
99
105
|
irb> puts Benchmark.measure {open(uri, 'rb') {|fh| p ImageSize.new(fh).size}}
|
100
106
|
[9545, 6623]
|
101
107
|
0.680000 0.250000 0.930000 ( 7.571887)
|
102
|
-
|
108
|
+
|
103
109
|
irb> puts Benchmark.measure {p FastImage.size(uri)}
|
104
110
|
[9545, 6623]
|
105
111
|
0.010000 0.000000 0.010000 ( 0.090640)
|
@@ -116,7 +122,7 @@ irb> uri = "http://upload.wikimedia.org/wikipedia/commons/1/11/Shinbutsureijoush
|
|
116
122
|
irb> puts Benchmark.measure {open(uri, 'rb') {|fh| p ImageSize.new(fh).size}}
|
117
123
|
[1120, 1559]
|
118
124
|
1.080000 0.370000 1.450000 ( 13.766962)
|
119
|
-
|
125
|
+
|
120
126
|
irb> puts Benchmark.measure {p FastImage.size(uri)}
|
121
127
|
[1120, 1559]
|
122
128
|
3.490000 3.810000 7.300000 ( 11.754315)
|
@@ -126,8 +132,8 @@ h2. Tests
|
|
126
132
|
|
127
133
|
You'll need to @gem install fakeweb@ and possibly also @gem install test-unit@ to be able to run the tests.
|
128
134
|
|
129
|
-
bc.. $ ruby test.rb
|
130
|
-
Run options:
|
135
|
+
bc.. $ ruby test.rb
|
136
|
+
Run options:
|
131
137
|
|
132
138
|
# Running tests:
|
133
139
|
|
@@ -149,6 +155,7 @@ h2. FastImage in other languages
|
|
149
155
|
* "PHP by tommoor":https://github.com/tommoor/fastimage
|
150
156
|
* "Node.js by ShogunPanda":https://github.com/ShogunPanda/fastimage
|
151
157
|
* "Objective C by kylehickinson":https://github.com/kylehickinson/FastImage
|
158
|
+
* "Android by qstumn":https://github.com/qstumn/FastImageSize
|
152
159
|
|
153
160
|
h2. Licence
|
154
161
|
|
data/lib/fastimage.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
# coding: ASCII-8BIT
|
2
3
|
|
3
4
|
# FastImage finds the size or type of an image given its uri.
|
@@ -55,10 +56,18 @@
|
|
55
56
|
#
|
56
57
|
|
57
58
|
require 'net/https'
|
58
|
-
require 'open-uri'
|
59
59
|
require 'delegate'
|
60
60
|
require 'pathname'
|
61
61
|
require 'zlib'
|
62
|
+
require 'base64'
|
63
|
+
require 'uri'
|
64
|
+
|
65
|
+
# see http://stackoverflow.com/questions/5208851/i/41048816#41048816
|
66
|
+
if RUBY_VERSION < "2.2"
|
67
|
+
module URI
|
68
|
+
DEFAULT_PARSER = Parser.new(:HOSTNAME => "(?:(?:[a-zA-Z\\d](?:[-\\_a-zA-Z\\d]*[a-zA-Z\\d])?)\\.)*(?:[a-zA-Z](?:[-\\_a-zA-Z\\d]*[a-zA-Z\\d])?)\\.?")
|
69
|
+
end
|
70
|
+
end
|
62
71
|
|
63
72
|
class FastImage
|
64
73
|
attr_reader :size, :type, :content_length, :orientation
|
@@ -80,28 +89,6 @@ class FastImage
|
|
80
89
|
|
81
90
|
LocalFileChunkSize = 256 unless const_defined?(:LocalFileChunkSize)
|
82
91
|
|
83
|
-
# Parser object should respond to #parse
|
84
|
-
# and raise a URI::InvalidURIError if something goes wrong
|
85
|
-
def self.uri_parser=(parser)
|
86
|
-
@uri_parser = parser
|
87
|
-
end
|
88
|
-
|
89
|
-
# Helper that sets URI parsing to use the Addressable gem
|
90
|
-
def self.use_addressable_uri_parser
|
91
|
-
require 'addressable/uri'
|
92
|
-
self.uri_parser = Class.new do
|
93
|
-
def self.parse(location)
|
94
|
-
Addressable::URI.parse(location)
|
95
|
-
rescue Addressable::URI::InvalidURIError
|
96
|
-
raise URI::InvalidURIError
|
97
|
-
end
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
def self.parse_uri(location)
|
102
|
-
(@uri_parser || URI).parse(location)
|
103
|
-
end
|
104
|
-
|
105
92
|
# Returns an array containing the width and height of the image.
|
106
93
|
# It will return nil if the image could not be fetched, or if the image type was not recognised.
|
107
94
|
#
|
@@ -204,11 +191,15 @@ class FastImage
|
|
204
191
|
|
205
192
|
@property = @options[:type_only] ? :type : :size
|
206
193
|
|
194
|
+
@type, @state = nil
|
195
|
+
|
207
196
|
if uri.respond_to?(:read)
|
208
197
|
fetch_using_read(uri)
|
198
|
+
elsif uri.start_with?('data:')
|
199
|
+
fetch_using_base64(uri)
|
209
200
|
else
|
210
201
|
begin
|
211
|
-
@parsed_uri =
|
202
|
+
@parsed_uri = URI.parse(uri)
|
212
203
|
rescue URI::InvalidURIError
|
213
204
|
fetch_using_file_open
|
214
205
|
else
|
@@ -222,11 +213,10 @@ class FastImage
|
|
222
213
|
|
223
214
|
raise SizeNotFound if @options[:raise_on_failure] && @property == :size && !@size
|
224
215
|
|
225
|
-
rescue Timeout::Error,
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
ImageFetchFailure
|
216
|
+
rescue Timeout::Error, SocketError, Errno::ECONNREFUSED, Errno::EHOSTUNREACH, Errno::ECONNRESET,
|
217
|
+
ImageFetchFailure, Net::HTTPBadResponse, EOFError, Errno::ENOENT
|
218
|
+
raise ImageFetchFailure if @options[:raise_on_failure]
|
219
|
+
rescue NoMethodError # 1.8.7p248 can raise this due to a net/http bug
|
230
220
|
raise ImageFetchFailure if @options[:raise_on_failure]
|
231
221
|
rescue UnknownImageType
|
232
222
|
raise UnknownImageType if @options[:raise_on_failure]
|
@@ -241,6 +231,7 @@ class FastImage
|
|
241
231
|
|
242
232
|
ensure
|
243
233
|
uri.rewind if uri.respond_to?(:rewind)
|
234
|
+
|
244
235
|
end
|
245
236
|
|
246
237
|
private
|
@@ -259,9 +250,11 @@ class FastImage
|
|
259
250
|
if res.is_a?(Net::HTTPRedirection) && @redirect_count < 4
|
260
251
|
@redirect_count += 1
|
261
252
|
begin
|
262
|
-
newly_parsed_uri =
|
253
|
+
newly_parsed_uri = URI.parse(res['Location'])
|
263
254
|
# The new location may be relative - check for that
|
264
|
-
if
|
255
|
+
if protocol_relative_url?(res['Location'])
|
256
|
+
@parsed_uri = URI.parse("#{@parsed_uri.scheme}:#{res['Location']}")
|
257
|
+
elsif newly_parsed_uri.scheme != "http" && newly_parsed_uri.scheme != "https"
|
265
258
|
@parsed_uri.path = res['Location']
|
266
259
|
else
|
267
260
|
@parsed_uri = newly_parsed_uri
|
@@ -304,12 +297,16 @@ class FastImage
|
|
304
297
|
end
|
305
298
|
end
|
306
299
|
|
300
|
+
def protocol_relative_url?(url)
|
301
|
+
url.start_with?("//")
|
302
|
+
end
|
303
|
+
|
307
304
|
def proxy_uri
|
308
305
|
begin
|
309
306
|
if @options[:proxy]
|
310
|
-
proxy =
|
307
|
+
proxy = URI.parse(@options[:proxy])
|
311
308
|
else
|
312
|
-
proxy = ENV['http_proxy'] && ENV['http_proxy'] != "" ?
|
309
|
+
proxy = ENV['http_proxy'] && ENV['http_proxy'] != "" ? URI.parse(ENV['http_proxy']) : nil
|
313
310
|
end
|
314
311
|
rescue URI::InvalidURIError
|
315
312
|
proxy = nil
|
@@ -319,16 +316,13 @@ class FastImage
|
|
319
316
|
|
320
317
|
def setup_http
|
321
318
|
proxy = proxy_uri
|
322
|
-
use_ssl = (@parsed_uri.scheme == "https")
|
323
|
-
port = @parsed_uri.port || (use_ssl ? 443 : 80)
|
324
319
|
|
325
320
|
if proxy
|
326
|
-
@http = Net::HTTP::Proxy(proxy.host, proxy.port).new(@parsed_uri.host, port)
|
321
|
+
@http = Net::HTTP::Proxy(proxy.host, proxy.port).new(@parsed_uri.host, @parsed_uri.port)
|
327
322
|
else
|
328
|
-
@http = Net::HTTP.new(@parsed_uri.host, port)
|
323
|
+
@http = Net::HTTP.new(@parsed_uri.host, @parsed_uri.port)
|
329
324
|
end
|
330
|
-
|
331
|
-
@http.use_ssl = use_ssl
|
325
|
+
@http.use_ssl = (@parsed_uri.scheme == "https")
|
332
326
|
@http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
333
327
|
@http.open_timeout = @options[:timeout]
|
334
328
|
@http.read_timeout = @options[:timeout]
|
@@ -359,6 +353,7 @@ class FastImage
|
|
359
353
|
end
|
360
354
|
|
361
355
|
def fetch_using_file_open
|
356
|
+
@content_length = File.size?(@uri)
|
362
357
|
File.open(@uri) do |s|
|
363
358
|
fetch_using_read(s)
|
364
359
|
end
|
@@ -391,6 +386,11 @@ class FastImage
|
|
391
386
|
send("parse_size_for_#{@type}")
|
392
387
|
end
|
393
388
|
|
389
|
+
def fetch_using_base64(uri)
|
390
|
+
data = uri.split(',')[1]
|
391
|
+
fetch_using_read StringIO.new(Base64.decode64(data))
|
392
|
+
end
|
393
|
+
|
394
394
|
module StreamUtil # :nodoc:
|
395
395
|
def read_byte
|
396
396
|
read(1)[0].ord
|
@@ -420,6 +420,7 @@ class FastImage
|
|
420
420
|
@str = ''
|
421
421
|
end
|
422
422
|
|
423
|
+
# Peeking beyond the end of the input will raise
|
423
424
|
def peek(n)
|
424
425
|
while @strpos + n - 1 >= @str.size
|
425
426
|
unused_str = @str[@strpos..-1]
|
@@ -442,6 +443,24 @@ class FastImage
|
|
442
443
|
@pos += n
|
443
444
|
result
|
444
445
|
end
|
446
|
+
|
447
|
+
def skip(n)
|
448
|
+
discarded = 0
|
449
|
+
fetched = @str[@strpos..-1].size
|
450
|
+
while n > fetched
|
451
|
+
discarded += @str[@strpos..-1].size
|
452
|
+
new_string = @read_fiber.resume
|
453
|
+
raise CannotParseImage if !new_string
|
454
|
+
|
455
|
+
new_string.force_encoding("ASCII-8BIT") if String.method_defined? :force_encoding
|
456
|
+
|
457
|
+
fetched += new_string.size
|
458
|
+
@str = new_string
|
459
|
+
@strpos = 0
|
460
|
+
end
|
461
|
+
@strpos = @strpos + n - discarded
|
462
|
+
@pos += n
|
463
|
+
end
|
445
464
|
end
|
446
465
|
|
447
466
|
class IOStream < SimpleDelegator # :nodoc:
|
@@ -449,7 +468,7 @@ class FastImage
|
|
449
468
|
end
|
450
469
|
|
451
470
|
def parse_type
|
452
|
-
case @stream.peek(2)
|
471
|
+
parsed_type = case @stream.peek(2)
|
453
472
|
when "BM"
|
454
473
|
:bmp
|
455
474
|
when "GI"
|
@@ -469,22 +488,21 @@ class FastImage
|
|
469
488
|
when 2 then :cur
|
470
489
|
end
|
471
490
|
when "RI"
|
472
|
-
if @stream.peek(12)[8..11] == "WEBP"
|
473
|
-
:webp
|
474
|
-
else
|
475
|
-
raise UnknownImageType
|
476
|
-
end
|
491
|
+
:webp if @stream.peek(12)[8..11] == "WEBP"
|
477
492
|
when "<s"
|
478
493
|
:svg
|
479
|
-
when
|
480
|
-
|
481
|
-
|
482
|
-
|
483
|
-
|
494
|
+
when /<[?!]/
|
495
|
+
# Peek 10 more chars each time, and if end of file is reached just raise
|
496
|
+
# unknown. We assume the <svg tag cannot be within 10 chars of the end of
|
497
|
+
# the file, and is within the first 250 chars.
|
498
|
+
begin
|
499
|
+
:svg if (1..25).detect {|n| @stream.peek(10 * n).include?("<svg")}
|
500
|
+
rescue FiberError
|
501
|
+
nil
|
484
502
|
end
|
485
|
-
else
|
486
|
-
raise UnknownImageType
|
487
503
|
end
|
504
|
+
|
505
|
+
parsed_type or raise UnknownImageType
|
488
506
|
end
|
489
507
|
|
490
508
|
def parse_size_for_ico
|
@@ -503,10 +521,11 @@ class FastImage
|
|
503
521
|
end
|
504
522
|
|
505
523
|
def parse_size_for_jpeg
|
524
|
+
exif = nil
|
506
525
|
loop do
|
507
526
|
@state = case @state
|
508
527
|
when nil
|
509
|
-
@stream.
|
528
|
+
@stream.skip(2)
|
510
529
|
:started
|
511
530
|
when :started
|
512
531
|
@stream.read_byte == 0xFF ? :sof : :started
|
@@ -518,7 +537,7 @@ class FastImage
|
|
518
537
|
io = StringIO.new(data)
|
519
538
|
if io.read(4) == "Exif"
|
520
539
|
io.read(2)
|
521
|
-
|
540
|
+
exif = Exif.new(IOStream.new(io)) rescue nil
|
522
541
|
end
|
523
542
|
:started
|
524
543
|
when 0xe0..0xef
|
@@ -532,14 +551,14 @@ class FastImage
|
|
532
551
|
end
|
533
552
|
when :skipframe
|
534
553
|
skip_chars = @stream.read_int - 2
|
535
|
-
@stream.
|
554
|
+
@stream.skip(skip_chars)
|
536
555
|
:started
|
537
556
|
when :readsize
|
538
|
-
|
557
|
+
@stream.skip(3)
|
539
558
|
height = @stream.read_int
|
540
559
|
width = @stream.read_int
|
541
|
-
width, height = height, width if
|
542
|
-
return [width, height,
|
560
|
+
width, height = height, width if exif && exif.rotated?
|
561
|
+
return [width, height, exif ? exif.orientation : 1]
|
543
562
|
end
|
544
563
|
end
|
545
564
|
end
|
@@ -579,7 +598,7 @@ class FastImage
|
|
579
598
|
end
|
580
599
|
|
581
600
|
def parse_size_vp8l
|
582
|
-
@stream.
|
601
|
+
@stream.skip(1) # 0x2f
|
583
602
|
b1, b2, b3, b4 = @stream.read(4).bytes.to_a
|
584
603
|
[1 + (((b2 & 0x3f) << 8) | b1), 1 + (((b4 & 0xF) << 10) | (b3 << 2) | ((b2 & 0xC0) >> 6))]
|
585
604
|
end
|
@@ -602,6 +621,7 @@ class FastImage
|
|
602
621
|
|
603
622
|
def initialize(stream)
|
604
623
|
@stream = stream
|
624
|
+
@width, @height, @orientation = nil
|
605
625
|
parse_exif
|
606
626
|
end
|
607
627
|
|
@@ -652,7 +672,11 @@ class FastImage
|
|
652
672
|
@stream.read(2) # 42
|
653
673
|
|
654
674
|
offset = @stream.read(4).unpack(@long)[0]
|
655
|
-
@stream.
|
675
|
+
if @stream.respond_to?(:skip)
|
676
|
+
@stream.skip(offset - 8)
|
677
|
+
else
|
678
|
+
@stream.read(offset - 8)
|
679
|
+
end
|
656
680
|
|
657
681
|
parse_exif_ifd
|
658
682
|
|
@@ -677,6 +701,7 @@ class FastImage
|
|
677
701
|
class Svg # :nodoc:
|
678
702
|
def initialize(stream)
|
679
703
|
@stream = stream
|
704
|
+
@width, @height, @ratio, @viewbox_width, @viewbox_height = nil
|
680
705
|
parse_svg
|
681
706
|
end
|
682
707
|
|
@@ -687,6 +712,10 @@ class FastImage
|
|
687
712
|
[@width, @width / @ratio]
|
688
713
|
elsif @height && @ratio
|
689
714
|
[@height * @ratio, @height]
|
715
|
+
elsif @viewbox_width && @viewbox_height
|
716
|
+
[@viewbox_width, @viewbox_height]
|
717
|
+
else
|
718
|
+
nil
|
690
719
|
end
|
691
720
|
end
|
692
721
|
|
@@ -709,10 +738,16 @@ class FastImage
|
|
709
738
|
return if @width
|
710
739
|
elsif attr_name.join =~ /viewbox/i
|
711
740
|
values = attr_value.split(/\s/)
|
712
|
-
|
741
|
+
if values[2].to_f > 0 && values[3].to_f > 0
|
742
|
+
@ratio = values[2].to_f / values[3].to_f
|
743
|
+
@viewbox_width = values[2].to_i
|
744
|
+
@viewbox_height = values[3].to_i
|
745
|
+
end
|
713
746
|
end
|
714
|
-
when
|
747
|
+
when /\w/
|
715
748
|
attr_name << char
|
749
|
+
when "<"
|
750
|
+
attr_name = [char]
|
716
751
|
when ">"
|
717
752
|
state = :stop if state == :started
|
718
753
|
else
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: discourse_fastimage
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0
|
4
|
+
version: 2.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stephen Sykes
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-02-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: fakeweb
|
@@ -77,7 +77,7 @@ files:
|
|
77
77
|
- MIT-LICENSE
|
78
78
|
- README.textile
|
79
79
|
- lib/fastimage.rb
|
80
|
-
homepage: http://github.com/
|
80
|
+
homepage: http://github.com/sdsykes/fastimage
|
81
81
|
licenses:
|
82
82
|
- MIT
|
83
83
|
metadata: {}
|
@@ -98,7 +98,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
98
98
|
version: '0'
|
99
99
|
requirements: []
|
100
100
|
rubyforge_project:
|
101
|
-
rubygems_version: 2.
|
101
|
+
rubygems_version: 2.6.11
|
102
102
|
signing_key:
|
103
103
|
specification_version: 4
|
104
104
|
summary: FastImage - Image info fast
|