mugshot 0.1.5 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +1 -1
- data/README.md +45 -0
- data/features/retrieve_resized_image.feature +0 -2
- data/features/step_definitions/{general_steps.rb → all_steps.rb} +8 -0
- data/features/support/env.rb +8 -7
- data/features/support/files/test.200x.jpg +0 -0
- data/features/support/files/test.200x200.jpg +0 -0
- data/features/support/files/test.x200.jpg +0 -0
- data/lib/mugshot/application.rb +21 -14
- data/lib/mugshot/image.rb +33 -6
- data/lib/mugshot.rb +1 -7
- data/spec/mugshot/application_spec.rb +21 -39
- data/spec/mugshot/image_spec.rb +57 -11
- data/spec/spec.opts +3 -2
- data/spec/spec_helper.rb +0 -6
- metadata +34 -62
- data/.document +0 -5
- data/.gitignore +0 -22
- data/README.rdoc +0 -18
- data/Rakefile +0 -70
- data/VERSION +0 -1
- data/config.ru +0 -5
- data/features/retrieve_original_image.feature +0 -12
- data/features/step_definitions/retrieve_original_image_steps.rb +0 -15
- data/features/step_definitions/retrieve_resized_image_keeping_aspect_ratio_steps.rb +0 -10
- data/features/step_definitions/retrieve_resized_image_steps.rb +0 -10
- data/gems.yml +0 -11
- data/gems_dev.yml +0 -11
- data/lib/mugshot/dimension.rb +0 -27
- data/mugshot.gemspec +0 -102
- data/spec/mugshot/dimension_spec.rb +0 -25
data/LICENSE
CHANGED
data/README.md
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
Mugshot
|
2
|
+
=======
|
3
|
+
|
4
|
+
**Mugshot is a dead simple image server**.
|
5
|
+
|
6
|
+
|
7
|
+
Overview
|
8
|
+
--------
|
9
|
+
|
10
|
+
The basic idea of Mugshot is that you upload the largest/highest quality images
|
11
|
+
possible. When retrieving the images you apply different operations to it such
|
12
|
+
as: resizing, rounded corners, transparency and anything else we can think of!
|
13
|
+
|
14
|
+
Only the original image is stored on the server. All operations are performed
|
15
|
+
dynamically, which is why caching is so important (see below).
|
16
|
+
|
17
|
+
|
18
|
+
Caching
|
19
|
+
-------
|
20
|
+
|
21
|
+
Mugshot doesn't cache anything by itself but is designed to play nice with
|
22
|
+
standard HTTP caching.
|
23
|
+
|
24
|
+
For production use, don't even think about using Mugshot without something like
|
25
|
+
Varnish or Squid sitting in front.
|
26
|
+
|
27
|
+
|
28
|
+
Supported Operations
|
29
|
+
--------------------
|
30
|
+
|
31
|
+
### Resize
|
32
|
+
|
33
|
+
/widthxheight/id.jpg (ex: http://mugshot.ws/200x100/test.jpg)
|
34
|
+
|
35
|
+
### Resize keeping aspect ratio
|
36
|
+
|
37
|
+
/widthx/id.jpg (ex.: http://mugshot.ws/200x/test.jpg)
|
38
|
+
|
39
|
+
/xheight/id.jpg (ex.: http://mugshot.ws/x100/test.jpg)
|
40
|
+
|
41
|
+
|
42
|
+
Who's using
|
43
|
+
-----------
|
44
|
+
|
45
|
+
We currently use Mugshot with Varnish on [Baixatudo](http://www.baixatudo.com.br).
|
@@ -3,10 +3,8 @@ Feature: Retrieve resized image
|
|
3
3
|
Scenario: Successful retrieval of resized image
|
4
4
|
When I upload an image
|
5
5
|
And I ask for the 200x200 resized image
|
6
|
-
|
7
6
|
Then I should get the 200x200 resized image
|
8
7
|
|
9
8
|
Scenario: Image doesn't exist
|
10
9
|
When I ask for a 200x200 resized image that doesn't exist
|
11
|
-
|
12
10
|
Then I should get a 404 response
|
@@ -15,3 +15,11 @@ end
|
|
15
15
|
Then /^I should get a (\d+) response$/ do |response_code|
|
16
16
|
last_response.status.should == response_code.to_i
|
17
17
|
end
|
18
|
+
|
19
|
+
Then /^I should get the (.*) resized image$/ do |size|
|
20
|
+
@retrieved_image.should be_same_image_as("test.#{size}.jpg")
|
21
|
+
end
|
22
|
+
|
23
|
+
Then /^I should get the (.*) resized image keeping the aspect ratio$/ do |size|
|
24
|
+
@retrieved_image.should be_same_image_as("test.#{size}.jpg")
|
25
|
+
end
|
data/features/support/env.rb
CHANGED
@@ -1,10 +1,3 @@
|
|
1
|
-
$LOAD_PATH.unshift(File.dirname(__FILE__) + '/../../lib')
|
2
|
-
|
3
|
-
gems = YAML.load_file(File.join(File.dirname(__FILE__), '..', '..', 'gems_dev.yml'))
|
4
|
-
gems.each do |depgem|
|
5
|
-
gem "#{depgem[:name]}", "#{depgem[:version]}"
|
6
|
-
end
|
7
|
-
|
8
1
|
require 'mugshot'
|
9
2
|
|
10
3
|
require 'rack/test'
|
@@ -25,3 +18,11 @@ After do
|
|
25
18
|
require 'fileutils'
|
26
19
|
FileUtils.rm_rf("/tmp/mugshot/cucumber")
|
27
20
|
end
|
21
|
+
|
22
|
+
Spec::Matchers.define :be_same_image_as do |expected_filename|
|
23
|
+
match do |actual_blob|
|
24
|
+
actual = Magick::Image.from_blob(actual_blob).first
|
25
|
+
expected = Magick::Image.read("features/support/files/#{expected_filename}").first
|
26
|
+
actual.get_pixels(0, 0, actual.columns, actual.rows) == expected.get_pixels(0, 0, expected.columns, expected.rows)
|
27
|
+
end
|
28
|
+
end
|
Binary file
|
Binary file
|
Binary file
|
data/lib/mugshot/application.rb
CHANGED
@@ -1,15 +1,16 @@
|
|
1
1
|
require 'sinatra/base'
|
2
|
-
|
3
2
|
class Mugshot::Application < Sinatra::Base
|
4
3
|
|
5
4
|
set :static, true
|
6
5
|
set :public, ::File.expand_path(::File.join(::File.dirname(__FILE__), "public"))
|
7
6
|
|
8
|
-
before do
|
7
|
+
before do
|
8
|
+
response['Cache-Control'] = "public, max-age=#{1.year.to_i}"
|
9
9
|
content_type :jpg
|
10
10
|
end
|
11
11
|
|
12
12
|
get '/?' do
|
13
|
+
content_type :html
|
13
14
|
'ok'
|
14
15
|
end
|
15
16
|
|
@@ -18,24 +19,30 @@ class Mugshot::Application < Sinatra::Base
|
|
18
19
|
@storage.write(params['file'][:tempfile].read)
|
19
20
|
end
|
20
21
|
|
21
|
-
get '/:size/:id.:
|
22
|
+
get '/:size/:id.:format' do |size, id, format|
|
22
23
|
image = @storage.read(id)
|
23
|
-
|
24
|
-
halt 404 if image.nil?
|
25
|
-
|
26
|
-
dimm = Mugshot::Dimension.parse!(size)
|
27
|
-
image.resize! dimm
|
28
|
-
image.to_blob
|
29
|
-
end
|
24
|
+
halt 404 if image.blank?
|
30
25
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
26
|
+
begin
|
27
|
+
resize(image, size)
|
28
|
+
send_image(image, format.to_sym)
|
29
|
+
ensure
|
30
|
+
image.destroy!
|
31
|
+
end
|
35
32
|
end
|
36
33
|
|
37
34
|
protected
|
38
35
|
def initialize(storage)
|
39
36
|
@storage = storage
|
40
37
|
end
|
38
|
+
|
39
|
+
def resize(image, size)
|
40
|
+
image.resize!(size)
|
41
|
+
end
|
42
|
+
|
43
|
+
def send_image(image, format)
|
44
|
+
content_type format
|
45
|
+
response['Content-Disposition'] = 'inline'
|
46
|
+
image.to_blob(:format => format)
|
47
|
+
end
|
41
48
|
end
|
data/lib/mugshot/image.rb
CHANGED
@@ -1,16 +1,43 @@
|
|
1
|
+
|
1
2
|
class Mugshot::Image
|
2
|
-
|
3
|
-
|
4
|
-
@image.
|
3
|
+
|
4
|
+
def width
|
5
|
+
@image.columns
|
6
|
+
end
|
7
|
+
|
8
|
+
def height
|
9
|
+
@image.rows
|
10
|
+
end
|
11
|
+
|
12
|
+
def resize!(size)
|
13
|
+
w, h = size.to_s.split("x").map{|i| i.blank? ? nil : i.to_i}
|
14
|
+
|
15
|
+
if [w, h].include?(nil)
|
16
|
+
@image.resize_to_fit! w, h
|
17
|
+
else
|
18
|
+
@image.resize! w, h
|
19
|
+
end
|
20
|
+
|
21
|
+
self
|
22
|
+
end
|
23
|
+
|
24
|
+
def destroy!
|
25
|
+
@image.destroy!
|
26
|
+
self
|
5
27
|
end
|
6
28
|
|
7
|
-
def to_blob
|
8
|
-
@image.
|
29
|
+
def to_blob(opts = {})
|
30
|
+
@image.strip!
|
31
|
+
@image.to_blob do
|
32
|
+
self.format = opts[:format].to_s if opts[:format].present?
|
33
|
+
self.quality = opts[:quality] if opts[:quality].present?
|
34
|
+
end
|
9
35
|
end
|
10
36
|
|
11
37
|
protected
|
12
|
-
|
38
|
+
|
13
39
|
def initialize(file)
|
14
40
|
@image = Magick::Image.read(file).first
|
15
41
|
end
|
42
|
+
|
16
43
|
end
|
data/lib/mugshot.rb
CHANGED
@@ -1,8 +1,3 @@
|
|
1
|
-
gems = YAML.load_file(File.join(File.dirname(__FILE__), '..', 'gems.yml'))
|
2
|
-
gems.each do |depgem|
|
3
|
-
gem "#{depgem[:name]}", "#{depgem[:version]}"
|
4
|
-
end
|
5
|
-
|
6
1
|
require 'rubygems'
|
7
2
|
require 'fileutils'
|
8
3
|
require 'uuid'
|
@@ -12,8 +7,7 @@ require 'RMagick'
|
|
12
7
|
module Mugshot
|
13
8
|
end
|
14
9
|
|
15
|
-
require 'mugshot/
|
16
|
-
require 'mugshot/image'
|
10
|
+
require 'mugshot/image'
|
17
11
|
require 'mugshot/storage'
|
18
12
|
require 'mugshot/fs_storage'
|
19
13
|
require 'mugshot/application'
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) +
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
|
2
2
|
|
3
3
|
describe Mugshot::Application do
|
4
4
|
before :each do
|
@@ -8,13 +8,13 @@ describe Mugshot::Application do
|
|
8
8
|
end
|
9
9
|
end
|
10
10
|
|
11
|
-
describe
|
11
|
+
describe "POST /" do
|
12
12
|
it "should create image" do
|
13
13
|
file_read = nil
|
14
14
|
File.open("spec/files/test.jpg") {|f| file_read = f.read}
|
15
15
|
@storage.should_receive(:write).with(file_read)
|
16
16
|
|
17
|
-
post
|
17
|
+
post "/", "file" => Rack::Test::UploadedFile.new("spec/files/test.jpg", "image/jpeg")
|
18
18
|
|
19
19
|
last_response.status.should == 200
|
20
20
|
end
|
@@ -22,23 +22,21 @@ describe Mugshot::Application do
|
|
22
22
|
it "should return image id" do
|
23
23
|
@storage.stub!(:write).and_return("batata")
|
24
24
|
|
25
|
-
post
|
25
|
+
post "/", "file" => Rack::Test::UploadedFile.new("spec/files/test.jpg", "image/jpeg")
|
26
26
|
|
27
27
|
last_response.body.should == "batata"
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
31
|
-
describe
|
32
|
-
it
|
33
|
-
dimension = mock(Mugshot::Dimension)
|
34
|
-
Mugshot::Dimension.stub!(:parse!).with('200x200').and_return(dimension)
|
35
|
-
|
31
|
+
describe "GET /:size/:id.:ext" do
|
32
|
+
it "should return resized image" do
|
36
33
|
image = mock(Mugshot::Image)
|
37
|
-
image.stub!(:to_blob).and_return(
|
38
|
-
image.should_receive(:resize!).with(
|
39
|
-
|
34
|
+
image.stub!(:to_blob).and_return("image data")
|
35
|
+
image.should_receive(:resize!).with("200x200")
|
36
|
+
image.should_receive(:destroy!)
|
37
|
+
@storage.stub!(:read).with("batata").and_return(image)
|
40
38
|
|
41
|
-
get
|
39
|
+
get "/200x200/batata.jpg"
|
42
40
|
|
43
41
|
last_response.status.should == 200
|
44
42
|
last_response.content_type == "image/jpg"
|
@@ -48,30 +46,7 @@ describe Mugshot::Application do
|
|
48
46
|
it "should halt 404 when image doesn't exist" do
|
49
47
|
@storage.stub!(:read).with("batata").and_return(nil)
|
50
48
|
|
51
|
-
get
|
52
|
-
|
53
|
-
last_response.status.should == 404
|
54
|
-
last_response.body.should be_empty
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
describe "GET /:id" do
|
59
|
-
it "should return original image" do
|
60
|
-
image = mock(Mugshot::Image)
|
61
|
-
image.stub!(:to_blob).and_return('image data')
|
62
|
-
@storage.stub!(:read).with('batata').and_return(image)
|
63
|
-
|
64
|
-
get '/batata.jpg'
|
65
|
-
|
66
|
-
last_response.status.should == 200
|
67
|
-
last_response.content_type == "image/jpg"
|
68
|
-
last_response.body.should == "image data"
|
69
|
-
end
|
70
|
-
|
71
|
-
it "should halt 404 when image doesn't exist" do
|
72
|
-
@storage.stub!(:read).with("batata").and_return(nil)
|
73
|
-
|
74
|
-
get '/batata.jpg'
|
49
|
+
get "/200x200/batata.jpg"
|
75
50
|
|
76
51
|
last_response.status.should == 404
|
77
52
|
last_response.body.should be_empty
|
@@ -80,10 +55,17 @@ describe Mugshot::Application do
|
|
80
55
|
|
81
56
|
describe "GET /" do
|
82
57
|
it "should return ok as healthcheck" do
|
83
|
-
get
|
58
|
+
get "/"
|
84
59
|
|
85
60
|
last_response.status.should == 200
|
86
|
-
last_response.body.should ==
|
61
|
+
last_response.body.should == "ok"
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
describe "before" do
|
66
|
+
it "should cache response with max age of 1 day" do
|
67
|
+
get "/"
|
68
|
+
last_response.headers["Cache-Control"].should == "public, max-age=31557600"
|
87
69
|
end
|
88
70
|
end
|
89
71
|
end
|
data/spec/mugshot/image_spec.rb
CHANGED
@@ -5,30 +5,76 @@ describe Mugshot::Image do
|
|
5
5
|
@magick_image = mock(Magick::Image)
|
6
6
|
Magick::Image.stub!(:read).and_return([@magick_image])
|
7
7
|
|
8
|
-
@image = Mugshot::Image.new
|
8
|
+
@image = Mugshot::Image.new(File.open("spec/files/test.jpg"))
|
9
9
|
end
|
10
|
+
|
11
|
+
it 'should return image width and height' do
|
12
|
+
@magick_image.stub!(:columns).and_return(100)
|
13
|
+
@magick_image.stub!(:rows).and_return(200)
|
14
|
+
|
15
|
+
@image.width.should == 100
|
16
|
+
@image.height.should == 200
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "to blob" do
|
20
|
+
before(:each) do
|
21
|
+
@magick_image.stub!(:strip!)
|
22
|
+
@magick_image.instance_eval do
|
23
|
+
def to_blob(&block)
|
24
|
+
block.call if block.present?
|
25
|
+
return 'blob_data'
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'should return image as a blob using default options' do
|
31
|
+
@image.to_blob.should == 'blob_data'
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'should return image as a blob using quality' do
|
35
|
+
@image.should_receive(:quality=).with(75)
|
36
|
+
@magick_image.instance_eval do
|
37
|
+
def to_blob(&block)
|
38
|
+
yield
|
39
|
+
return 'blob_data'
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
@image.to_blob(:quality => 75).should == 'blob_data'
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'should return image as a blob using format' do
|
47
|
+
@image.should_receive(:format=).with('png')
|
48
|
+
@magick_image.instance_eval do
|
49
|
+
def to_blob(&block)
|
50
|
+
yield
|
51
|
+
return 'blob_data'
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
@image.to_blob(:format => :png).should == 'blob_data'
|
56
|
+
end
|
10
57
|
|
11
|
-
it 'should return image as a blob' do
|
12
|
-
blob_data = 'blob data'
|
13
|
-
@magick_image.stub!(:to_blob).and_return(blob_data)
|
14
|
-
@image.to_blob.should == blob_data
|
15
58
|
end
|
16
59
|
|
17
60
|
it "should resize image to given width and height" do
|
18
61
|
@magick_image.should_receive(:resize!).with(300, 200)
|
19
|
-
|
20
|
-
@image.resize! dim
|
62
|
+
@image.resize! "300x200"
|
21
63
|
end
|
22
64
|
|
23
65
|
it 'should resize image to fit given width' do
|
24
66
|
@magick_image.should_receive(:resize_to_fit!).with(300, nil)
|
25
|
-
|
26
|
-
@image.resize! dim
|
67
|
+
@image.resize! "300x"
|
27
68
|
end
|
28
69
|
|
29
70
|
it 'should resize image to fit given height' do
|
30
71
|
@magick_image.should_receive(:resize_to_fit!).with(nil, 200)
|
31
|
-
|
32
|
-
@image.resize! dim
|
72
|
+
@image.resize! "x200"
|
33
73
|
end
|
74
|
+
|
75
|
+
it 'should destroy image' do
|
76
|
+
@magick_image.should_receive(:'destroy!')
|
77
|
+
@image.destroy!
|
78
|
+
end
|
79
|
+
|
34
80
|
end
|
data/spec/spec.opts
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -2,12 +2,6 @@ $LOAD_PATH.unshift(File.dirname(__FILE__))
|
|
2
2
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
3
3
|
|
4
4
|
require 'rubygems'
|
5
|
-
|
6
|
-
gems = YAML.load_file(File.join(File.dirname(__FILE__), '..', 'gems_dev.yml'))
|
7
|
-
gems.each do |depgem|
|
8
|
-
gem "#{depgem[:name]}", "#{depgem[:version]}"
|
9
|
-
end
|
10
|
-
|
11
5
|
require 'mugshot'
|
12
6
|
|
13
7
|
require 'spec'
|
metadata
CHANGED
@@ -1,19 +1,18 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mugshot
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- "Cain\xC3\xA3 Nunes"
|
8
8
|
- "Fabr\xC3\xADcio Lopes"
|
9
|
-
- Fernando Meyer
|
10
9
|
- Guilherme Cirne
|
11
|
-
-
|
10
|
+
- Jose Peleteiro
|
12
11
|
autorequire:
|
13
12
|
bindir: bin
|
14
13
|
cert_chain: []
|
15
14
|
|
16
|
-
date:
|
15
|
+
date: 2010-01-29 00:00:00 -02:00
|
17
16
|
default_executable:
|
18
17
|
dependencies:
|
19
18
|
- !ruby/object:Gem::Dependency
|
@@ -22,29 +21,29 @@ dependencies:
|
|
22
21
|
version_requirement:
|
23
22
|
version_requirements: !ruby/object:Gem::Requirement
|
24
23
|
requirements:
|
25
|
-
- - "
|
24
|
+
- - ">="
|
26
25
|
- !ruby/object:Gem::Version
|
27
|
-
version:
|
26
|
+
version: "0"
|
28
27
|
version:
|
29
28
|
- !ruby/object:Gem::Dependency
|
30
|
-
name:
|
29
|
+
name: sinatra
|
31
30
|
type: :runtime
|
32
31
|
version_requirement:
|
33
32
|
version_requirements: !ruby/object:Gem::Requirement
|
34
33
|
requirements:
|
35
|
-
- - "
|
34
|
+
- - ">="
|
36
35
|
- !ruby/object:Gem::Version
|
37
|
-
version:
|
36
|
+
version: 0.9.4
|
38
37
|
version:
|
39
38
|
- !ruby/object:Gem::Dependency
|
40
|
-
name:
|
39
|
+
name: rmagick
|
41
40
|
type: :runtime
|
42
41
|
version_requirement:
|
43
42
|
version_requirements: !ruby/object:Gem::Requirement
|
44
43
|
requirements:
|
45
|
-
- - "
|
44
|
+
- - ">="
|
46
45
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
46
|
+
version: 2.12.2
|
48
47
|
version:
|
49
48
|
- !ruby/object:Gem::Dependency
|
50
49
|
name: uuid
|
@@ -52,7 +51,7 @@ dependencies:
|
|
52
51
|
version_requirement:
|
53
52
|
version_requirements: !ruby/object:Gem::Requirement
|
54
53
|
requirements:
|
55
|
-
- - "
|
54
|
+
- - ">="
|
56
55
|
- !ruby/object:Gem::Version
|
57
56
|
version: 2.0.2
|
58
57
|
version:
|
@@ -62,9 +61,9 @@ dependencies:
|
|
62
61
|
version_requirement:
|
63
62
|
version_requirements: !ruby/object:Gem::Requirement
|
64
63
|
requirements:
|
65
|
-
- - "
|
64
|
+
- - ">="
|
66
65
|
- !ruby/object:Gem::Version
|
67
|
-
version: 1.
|
66
|
+
version: 1.3.0
|
68
67
|
version:
|
69
68
|
- !ruby/object:Gem::Dependency
|
70
69
|
name: cucumber
|
@@ -72,35 +71,24 @@ dependencies:
|
|
72
71
|
version_requirement:
|
73
72
|
version_requirements: !ruby/object:Gem::Requirement
|
74
73
|
requirements:
|
75
|
-
- - "
|
74
|
+
- - ">="
|
76
75
|
- !ruby/object:Gem::Version
|
77
|
-
version: 0.
|
76
|
+
version: 0.6.2
|
78
77
|
version:
|
79
78
|
- !ruby/object:Gem::Dependency
|
80
79
|
name: rack-test
|
81
80
|
type: :development
|
82
81
|
version_requirement:
|
83
|
-
version_requirements: !ruby/object:Gem::Requirement
|
84
|
-
requirements:
|
85
|
-
- - "="
|
86
|
-
- !ruby/object:Gem::Version
|
87
|
-
version: 0.5.1
|
88
|
-
version:
|
89
|
-
- !ruby/object:Gem::Dependency
|
90
|
-
name: yard
|
91
|
-
type: :development
|
92
|
-
version_requirement:
|
93
82
|
version_requirements: !ruby/object:Gem::Requirement
|
94
83
|
requirements:
|
95
84
|
- - ">="
|
96
85
|
- !ruby/object:Gem::Version
|
97
|
-
version:
|
86
|
+
version: 0.5.1
|
98
87
|
version:
|
99
|
-
description:
|
88
|
+
description: Dead simple image server
|
100
89
|
email:
|
101
90
|
- cainanunes@gmail.com
|
102
91
|
- fabriciolopesvital@gmail.com
|
103
|
-
- fmcamargo@gmail.com
|
104
92
|
- gcirne@gmail.com
|
105
93
|
- jose@peleteiro.net
|
106
94
|
executables: []
|
@@ -109,44 +97,18 @@ extensions: []
|
|
109
97
|
|
110
98
|
extra_rdoc_files:
|
111
99
|
- LICENSE
|
112
|
-
- README.
|
100
|
+
- README.md
|
113
101
|
files:
|
114
|
-
- .document
|
115
|
-
- .gitignore
|
116
|
-
- LICENSE
|
117
|
-
- README.rdoc
|
118
|
-
- Rakefile
|
119
|
-
- VERSION
|
120
|
-
- config.ru
|
121
|
-
- features/retrieve_original_image.feature
|
122
|
-
- features/retrieve_resized_image.feature
|
123
|
-
- features/retrieve_resized_image_keeping_aspect_ratio.feature
|
124
|
-
- features/step_definitions/general_steps.rb
|
125
|
-
- features/step_definitions/retrieve_original_image_steps.rb
|
126
|
-
- features/step_definitions/retrieve_resized_image_keeping_aspect_ratio_steps.rb
|
127
|
-
- features/step_definitions/retrieve_resized_image_steps.rb
|
128
|
-
- features/support/env.rb
|
129
|
-
- features/support/files/test.jpg
|
130
|
-
- gems.yml
|
131
|
-
- gems_dev.yml
|
132
102
|
- lib/mugshot.rb
|
133
103
|
- lib/mugshot/application.rb
|
134
|
-
- lib/mugshot/dimension.rb
|
135
104
|
- lib/mugshot/fs_storage.rb
|
136
105
|
- lib/mugshot/image.rb
|
137
106
|
- lib/mugshot/public/crossdomain.xml
|
138
107
|
- lib/mugshot/storage.rb
|
139
|
-
-
|
140
|
-
-
|
141
|
-
- spec/mugshot/application_spec.rb
|
142
|
-
- spec/mugshot/dimension_spec.rb
|
143
|
-
- spec/mugshot/fs_storage_spec.rb
|
144
|
-
- spec/mugshot/image_spec.rb
|
145
|
-
- spec/spec.opts
|
146
|
-
- spec/spec_helper.rb
|
147
|
-
- spec/test.html
|
108
|
+
- LICENSE
|
109
|
+
- README.md
|
148
110
|
has_rdoc: true
|
149
|
-
homepage: http://
|
111
|
+
homepage: http://mugshot.ws
|
150
112
|
licenses: []
|
151
113
|
|
152
114
|
post_install_message:
|
@@ -172,10 +134,20 @@ rubyforge_project:
|
|
172
134
|
rubygems_version: 1.3.5
|
173
135
|
signing_key:
|
174
136
|
specification_version: 3
|
175
|
-
summary:
|
137
|
+
summary: Dead simple image server
|
176
138
|
test_files:
|
139
|
+
- spec/files/test.jpg
|
177
140
|
- spec/mugshot/application_spec.rb
|
178
|
-
- spec/mugshot/dimension_spec.rb
|
179
141
|
- spec/mugshot/fs_storage_spec.rb
|
180
142
|
- spec/mugshot/image_spec.rb
|
143
|
+
- spec/spec.opts
|
181
144
|
- spec/spec_helper.rb
|
145
|
+
- spec/test.html
|
146
|
+
- features/retrieve_resized_image.feature
|
147
|
+
- features/retrieve_resized_image_keeping_aspect_ratio.feature
|
148
|
+
- features/step_definitions/all_steps.rb
|
149
|
+
- features/support/env.rb
|
150
|
+
- features/support/files/test.200x.jpg
|
151
|
+
- features/support/files/test.200x200.jpg
|
152
|
+
- features/support/files/test.jpg
|
153
|
+
- features/support/files/test.x200.jpg
|
data/.document
DELETED
data/.gitignore
DELETED
data/README.rdoc
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
= farofus-mugshot
|
2
|
-
|
3
|
-
Description goes here.
|
4
|
-
|
5
|
-
== Note on Patches/Pull Requests
|
6
|
-
|
7
|
-
* Fork the project.
|
8
|
-
* Make your feature addition or bug fix.
|
9
|
-
* Add tests for it. This is important so I don't break it in a
|
10
|
-
future version unintentionally.
|
11
|
-
* Commit, do not mess with rakefile, version, or history.
|
12
|
-
(if you want to have your own version, that is fine but
|
13
|
-
bump version in a commit by itself I can ignore when I pull)
|
14
|
-
* Send me a pull request. Bonus points for topic branches.
|
15
|
-
|
16
|
-
== Copyright
|
17
|
-
|
18
|
-
Copyright (c) 2009 Fernando Meyer. See LICENSE for details.
|
data/Rakefile
DELETED
@@ -1,70 +0,0 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'rake'
|
3
|
-
|
4
|
-
task :default => :spec
|
5
|
-
|
6
|
-
begin
|
7
|
-
require 'jeweler'
|
8
|
-
namespace :gem do
|
9
|
-
Jeweler::Tasks.new do |gem|
|
10
|
-
gem.name = "mugshot"
|
11
|
-
gem.summary = %Q{Image server}
|
12
|
-
gem.description = %Q{Image server}
|
13
|
-
gem.email = %w{cainanunes@gmail.com fabriciolopesvital@gmail.com fmcamargo@gmail.com gcirne@gmail.com jose@peleteiro.net}
|
14
|
-
gem.homepage = "http://github.com/timebeta/mugshot"
|
15
|
-
gem.authors = ["Cainã Nunes", "Fabrício Lopes", "Fernando Meyer", "Guilherme Cirne", "José Peleteiro"]
|
16
|
-
|
17
|
-
## dependencies
|
18
|
-
gems = YAML.load_file 'gems.yml'
|
19
|
-
gems.each do |depgem|
|
20
|
-
gem.add_dependency(depgem[:name], depgem[:version])
|
21
|
-
end
|
22
|
-
|
23
|
-
## developments dependencies
|
24
|
-
gems = YAML.load_file 'gems_dev.yml'
|
25
|
-
gems.each do |depgem|
|
26
|
-
gem.add_development_dependency(depgem[:name], depgem[:version])
|
27
|
-
end
|
28
|
-
|
29
|
-
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
30
|
-
end
|
31
|
-
end
|
32
|
-
rescue LoadError
|
33
|
-
puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
|
34
|
-
end
|
35
|
-
|
36
|
-
require 'spec/rake/spectask'
|
37
|
-
Spec::Rake::SpecTask.new(:spec) do |spec|
|
38
|
-
spec.libs << 'lib' << 'spec'
|
39
|
-
spec.pattern = 'spec/**/*_spec.rb'
|
40
|
-
spec.rcov = true
|
41
|
-
spec.rcov_dir = 'doc/coverage'
|
42
|
-
spec.rcov_opts = %w{--text-summary --failure-threshold 100 --exclude spec/*,gems/*,/usr/lib/ruby/*}
|
43
|
-
end
|
44
|
-
task :spec => 'gem:check_dependencies'
|
45
|
-
|
46
|
-
require 'cucumber/rake/task'
|
47
|
-
Cucumber::Rake::Task.new(:features)
|
48
|
-
task :features => 'gem:check_dependencies'
|
49
|
-
|
50
|
-
begin
|
51
|
-
require 'reek/adapters/rake_task'
|
52
|
-
Reek::RakeTask.new do |t|
|
53
|
-
t.fail_on_error = true
|
54
|
-
t.verbose = false
|
55
|
-
t.source_files = 'lib/**/*.rb'
|
56
|
-
end
|
57
|
-
rescue LoadError
|
58
|
-
task :reek do
|
59
|
-
abort "Reek is not available. In order to run reek, you must: sudo gem install reek"
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
begin
|
64
|
-
require 'yard'
|
65
|
-
YARD::Rake::YardocTask.new
|
66
|
-
rescue LoadError
|
67
|
-
task :yardoc do
|
68
|
-
abort "YARD is not available. In order to run yardoc, you must: sudo gem install yard"
|
69
|
-
end
|
70
|
-
end
|
data/VERSION
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
0.1.5
|
data/config.ru
DELETED
@@ -1,12 +0,0 @@
|
|
1
|
-
Feature: Retrieve original image
|
2
|
-
|
3
|
-
Scenario: Successful retrieval of original image
|
4
|
-
When I upload an image
|
5
|
-
And I ask for the original image
|
6
|
-
|
7
|
-
Then I should get the original image
|
8
|
-
|
9
|
-
Scenario: Image doesn't exist
|
10
|
-
When I ask for an image that doesn't exist
|
11
|
-
|
12
|
-
Then I should get a 404 response
|
@@ -1,15 +0,0 @@
|
|
1
|
-
When /^I ask for the original image$/ do
|
2
|
-
get "/#{@image_id}.jpg"
|
3
|
-
@retrieved_image = last_response.body
|
4
|
-
end
|
5
|
-
|
6
|
-
When /^I ask for an image that doesn't exist$/ do
|
7
|
-
get '/nonexistant.jpg'
|
8
|
-
end
|
9
|
-
|
10
|
-
Then /^I should get the original image$/ do
|
11
|
-
require 'digest/md5'
|
12
|
-
original_image = Magick::Image.read('features/support/files/test.jpg').first.to_blob
|
13
|
-
@retrieved_image.should == original_image
|
14
|
-
last_response.status.should == 200
|
15
|
-
end
|
@@ -1,10 +0,0 @@
|
|
1
|
-
Then /^I should get the (.*) resized image keeping the aspect ratio$/ do |size|
|
2
|
-
dimension = Mugshot::Dimension.parse!(size)
|
3
|
-
|
4
|
-
image = Magick::Image.read('features/support/files/test.jpg').first
|
5
|
-
image.resize_to_fit!(*dimension.size)
|
6
|
-
resized_image = image.to_blob
|
7
|
-
|
8
|
-
@retrieved_image.should == resized_image
|
9
|
-
last_response.status.should == 200
|
10
|
-
end
|
@@ -1,10 +0,0 @@
|
|
1
|
-
Then /^I should get the (.*) resized image$/ do |size|
|
2
|
-
dimension = Mugshot::Dimension.parse!(size)
|
3
|
-
|
4
|
-
image = Magick::Image.read('features/support/files/test.jpg').first
|
5
|
-
image.resize!(*dimension.size)
|
6
|
-
resized_image = image.to_blob
|
7
|
-
|
8
|
-
@retrieved_image.should == resized_image
|
9
|
-
last_response.status.should == 200
|
10
|
-
end
|
data/gems.yml
DELETED
data/gems_dev.yml
DELETED
data/lib/mugshot/dimension.rb
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
class Mugshot::Dimension
|
2
|
-
attr_reader :width, :height
|
3
|
-
|
4
|
-
def self.parse!(size)
|
5
|
-
size = /(\d*)x(\d*)/.match(size)
|
6
|
-
width = size[1].to_i if size[1].present?
|
7
|
-
height = size[2].to_i if size[2].present?
|
8
|
-
new(width, height)
|
9
|
-
end
|
10
|
-
|
11
|
-
def to_s
|
12
|
-
"#{@width}x#{@height}"
|
13
|
-
end
|
14
|
-
|
15
|
-
def size
|
16
|
-
return @width, @height
|
17
|
-
end
|
18
|
-
|
19
|
-
def will_keep_aspect?
|
20
|
-
(@width == nil) || (@height == nil)
|
21
|
-
end
|
22
|
-
|
23
|
-
def initialize (width, height)
|
24
|
-
@width = width
|
25
|
-
@height = height
|
26
|
-
end
|
27
|
-
end
|
data/mugshot.gemspec
DELETED
@@ -1,102 +0,0 @@
|
|
1
|
-
# Generated by jeweler
|
2
|
-
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
-
# -*- encoding: utf-8 -*-
|
5
|
-
|
6
|
-
Gem::Specification.new do |s|
|
7
|
-
s.name = %q{mugshot}
|
8
|
-
s.version = "0.1.1"
|
9
|
-
|
10
|
-
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
-
s.authors = ["Cain\303\243 Nunes", "Fabr\303\255cio Lopes", "Fernando Meyer", "Guilherme Cirne", "Jos\303\251 Peleteiro"]
|
12
|
-
s.date = %q{2009-11-30}
|
13
|
-
s.description = %q{Image server}
|
14
|
-
s.email = ["cainanunes@gmail.com", "fabriciolopesvital@gmail.com", "fmcamargo@gmail.com", "gcirne@gmail.com", "jose@peleteiro.net"]
|
15
|
-
s.extra_rdoc_files = [
|
16
|
-
"LICENSE",
|
17
|
-
"README.rdoc"
|
18
|
-
]
|
19
|
-
s.files = [
|
20
|
-
".document",
|
21
|
-
".gitignore",
|
22
|
-
"LICENSE",
|
23
|
-
"README.rdoc",
|
24
|
-
"Rakefile",
|
25
|
-
"VERSION",
|
26
|
-
"config.ru",
|
27
|
-
"features/retrieve_original_image.feature",
|
28
|
-
"features/retrieve_resized_image.feature",
|
29
|
-
"features/retrieve_resized_image_keeping_aspect_ratio.feature",
|
30
|
-
"features/step_definitions/general_steps.rb",
|
31
|
-
"features/step_definitions/retrieve_original_image_steps.rb",
|
32
|
-
"features/step_definitions/retrieve_resized_image_keeping_aspect_ratio_steps.rb",
|
33
|
-
"features/step_definitions/retrieve_resized_image_steps.rb",
|
34
|
-
"features/support/env.rb",
|
35
|
-
"features/support/files/test.jpg",
|
36
|
-
"gems.yml",
|
37
|
-
"gems_dev.yml",
|
38
|
-
"lib/mugshot.rb",
|
39
|
-
"lib/mugshot/application.rb",
|
40
|
-
"lib/mugshot/dimension.rb",
|
41
|
-
"lib/mugshot/fs_storage.rb",
|
42
|
-
"lib/mugshot/image.rb",
|
43
|
-
"lib/mugshot/storage.rb",
|
44
|
-
"mugshot.gemspec",
|
45
|
-
"public/crossdomain.xml",
|
46
|
-
"spec/files/test.jpg",
|
47
|
-
"spec/mugshot/application_spec.rb",
|
48
|
-
"spec/mugshot/dimension_spec.rb",
|
49
|
-
"spec/mugshot/fs_storage_spec.rb",
|
50
|
-
"spec/mugshot/image_spec.rb",
|
51
|
-
"spec/spec.opts",
|
52
|
-
"spec/spec_helper.rb",
|
53
|
-
"spec/test.html"
|
54
|
-
]
|
55
|
-
s.homepage = %q{http://github.com/timebeta/mugshot}
|
56
|
-
s.rdoc_options = ["--charset=UTF-8"]
|
57
|
-
s.require_paths = ["lib"]
|
58
|
-
s.rubygems_version = %q{1.3.5}
|
59
|
-
s.summary = %q{Image server}
|
60
|
-
s.test_files = [
|
61
|
-
"spec/mugshot/application_spec.rb",
|
62
|
-
"spec/mugshot/dimension_spec.rb",
|
63
|
-
"spec/mugshot/fs_storage_spec.rb",
|
64
|
-
"spec/mugshot/image_spec.rb",
|
65
|
-
"spec/spec_helper.rb"
|
66
|
-
]
|
67
|
-
|
68
|
-
if s.respond_to? :specification_version then
|
69
|
-
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
70
|
-
s.specification_version = 3
|
71
|
-
|
72
|
-
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
73
|
-
s.add_runtime_dependency(%q<activesupport>, ["= 2.3.5"])
|
74
|
-
s.add_runtime_dependency(%q<rmagick>, ["= 2.12.2"])
|
75
|
-
s.add_runtime_dependency(%q<sinatra>, ["= 0.9.4"])
|
76
|
-
s.add_runtime_dependency(%q<uuid>, ["= 2.0.2"])
|
77
|
-
s.add_development_dependency(%q<rspec>, ["= 1.2.9"])
|
78
|
-
s.add_development_dependency(%q<cucumber>, ["= 0.4.4"])
|
79
|
-
s.add_development_dependency(%q<rack-test>, ["= 0.5.1"])
|
80
|
-
s.add_development_dependency(%q<yard>, [">= 0"])
|
81
|
-
else
|
82
|
-
s.add_dependency(%q<activesupport>, ["= 2.3.5"])
|
83
|
-
s.add_dependency(%q<rmagick>, ["= 2.12.2"])
|
84
|
-
s.add_dependency(%q<sinatra>, ["= 0.9.4"])
|
85
|
-
s.add_dependency(%q<uuid>, ["= 2.0.2"])
|
86
|
-
s.add_dependency(%q<rspec>, ["= 1.2.9"])
|
87
|
-
s.add_dependency(%q<cucumber>, ["= 0.4.4"])
|
88
|
-
s.add_dependency(%q<rack-test>, ["= 0.5.1"])
|
89
|
-
s.add_dependency(%q<yard>, [">= 0"])
|
90
|
-
end
|
91
|
-
else
|
92
|
-
s.add_dependency(%q<activesupport>, ["= 2.3.5"])
|
93
|
-
s.add_dependency(%q<rmagick>, ["= 2.12.2"])
|
94
|
-
s.add_dependency(%q<sinatra>, ["= 0.9.4"])
|
95
|
-
s.add_dependency(%q<uuid>, ["= 2.0.2"])
|
96
|
-
s.add_dependency(%q<rspec>, ["= 1.2.9"])
|
97
|
-
s.add_dependency(%q<cucumber>, ["= 0.4.4"])
|
98
|
-
s.add_dependency(%q<rack-test>, ["= 0.5.1"])
|
99
|
-
s.add_dependency(%q<yard>, [">= 0"])
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
@@ -1,25 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
-
|
3
|
-
describe Mugshot::Dimension do
|
4
|
-
it "should parse a double size value" do
|
5
|
-
Mugshot::Dimension.parse!("100x100").size.should == [100,100]
|
6
|
-
end
|
7
|
-
|
8
|
-
it "should parse a single left value" do
|
9
|
-
Mugshot::Dimension.parse!("100x").size.should == [100, nil]
|
10
|
-
end
|
11
|
-
|
12
|
-
it "should parse a single right value" do
|
13
|
-
Mugshot::Dimension.parse!("x100").size.should == [nil, 100]
|
14
|
-
end
|
15
|
-
|
16
|
-
it "should keep aspect" do
|
17
|
-
Mugshot::Dimension.parse!("x100").will_keep_aspect?.should be_true
|
18
|
-
Mugshot::Dimension.parse!("100x").will_keep_aspect?.should be_true
|
19
|
-
end
|
20
|
-
|
21
|
-
it "should parse and convert" do
|
22
|
-
Mugshot::Dimension.parse!("100x100").to_s.should == "100x100"
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|