fog-dragonfly 0.8.1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of fog-dragonfly might be problematic. Click here for more details.
- data/.specopts +2 -0
- data/.yardopts +23 -0
- data/Gemfile +23 -0
- data/Gemfile.rails.2.3.5 +14 -0
- data/History.md +266 -0
- data/LICENSE +20 -0
- data/README.md +88 -0
- data/Rakefile +92 -0
- data/VERSION +1 -0
- data/config.ru +13 -0
- data/docs.watchr +1 -0
- data/dragonfly.gemspec +293 -0
- data/extra_docs/Analysers.md +108 -0
- data/extra_docs/Caching.md +23 -0
- data/extra_docs/Configuration.md +138 -0
- data/extra_docs/DataStorage.md +136 -0
- data/extra_docs/Encoding.md +96 -0
- data/extra_docs/GeneralUsage.md +121 -0
- data/extra_docs/Generators.md +102 -0
- data/extra_docs/Heroku.md +50 -0
- data/extra_docs/Index.md +36 -0
- data/extra_docs/MimeTypes.md +40 -0
- data/extra_docs/Models.md +266 -0
- data/extra_docs/Mongo.md +45 -0
- data/extra_docs/Processing.md +130 -0
- data/extra_docs/Rack.md +52 -0
- data/extra_docs/Rails2.md +55 -0
- data/extra_docs/Rails3.md +62 -0
- data/extra_docs/Sinatra.md +25 -0
- data/extra_docs/URLs.md +169 -0
- data/features/3.0.3.feature +8 -0
- data/features/images.feature +47 -0
- data/features/no_processing.feature +14 -0
- data/features/rails_2.3.5.feature +7 -0
- data/features/steps/common_steps.rb +8 -0
- data/features/steps/dragonfly_steps.rb +66 -0
- data/features/steps/rails_steps.rb +39 -0
- data/features/support/env.rb +40 -0
- data/fixtures/files/app/models/album.rb +3 -0
- data/fixtures/files/app/views/albums/new.html.erb +4 -0
- data/fixtures/files/app/views/albums/show.html.erb +4 -0
- data/fixtures/files/config/initializers/dragonfly.rb +4 -0
- data/fixtures/files/features/manage_album_images.feature +12 -0
- data/fixtures/files/features/step_definitions/image_steps.rb +15 -0
- data/fixtures/files/features/support/paths.rb +15 -0
- data/fixtures/files/features/text_images.feature +7 -0
- data/fixtures/rails_2.3.5/template.rb +10 -0
- data/fixtures/rails_3.0.3/template.rb +20 -0
- data/irbrc.rb +17 -0
- data/lib/dragonfly.rb +45 -0
- data/lib/dragonfly/active_model_extensions.rb +13 -0
- data/lib/dragonfly/active_model_extensions/attachment.rb +169 -0
- data/lib/dragonfly/active_model_extensions/class_methods.rb +45 -0
- data/lib/dragonfly/active_model_extensions/instance_methods.rb +28 -0
- data/lib/dragonfly/active_model_extensions/validations.rb +37 -0
- data/lib/dragonfly/analyser.rb +59 -0
- data/lib/dragonfly/analysis/file_command_analyser.rb +32 -0
- data/lib/dragonfly/analysis/image_magick_analyser.rb +47 -0
- data/lib/dragonfly/analysis/r_magick_analyser.rb +63 -0
- data/lib/dragonfly/app.rb +182 -0
- data/lib/dragonfly/config/heroku.rb +19 -0
- data/lib/dragonfly/config/image_magick.rb +41 -0
- data/lib/dragonfly/config/r_magick.rb +46 -0
- data/lib/dragonfly/config/rails.rb +17 -0
- data/lib/dragonfly/configurable.rb +119 -0
- data/lib/dragonfly/core_ext/object.rb +8 -0
- data/lib/dragonfly/core_ext/string.rb +9 -0
- data/lib/dragonfly/core_ext/symbol.rb +9 -0
- data/lib/dragonfly/data_storage.rb +9 -0
- data/lib/dragonfly/data_storage/file_data_store.rb +114 -0
- data/lib/dragonfly/data_storage/mongo_data_store.rb +82 -0
- data/lib/dragonfly/data_storage/s3data_store.rb +115 -0
- data/lib/dragonfly/encoder.rb +13 -0
- data/lib/dragonfly/encoding/image_magick_encoder.rb +57 -0
- data/lib/dragonfly/encoding/r_magick_encoder.rb +61 -0
- data/lib/dragonfly/function_manager.rb +69 -0
- data/lib/dragonfly/generation/hash_with_css_style_keys.rb +23 -0
- data/lib/dragonfly/generation/image_magick_generator.rb +140 -0
- data/lib/dragonfly/generation/r_magick_generator.rb +155 -0
- data/lib/dragonfly/generator.rb +9 -0
- data/lib/dragonfly/image_magick_utils.rb +81 -0
- data/lib/dragonfly/job.rb +371 -0
- data/lib/dragonfly/job_builder.rb +39 -0
- data/lib/dragonfly/job_definitions.rb +26 -0
- data/lib/dragonfly/job_endpoint.rb +15 -0
- data/lib/dragonfly/loggable.rb +28 -0
- data/lib/dragonfly/middleware.rb +34 -0
- data/lib/dragonfly/processing/image_magick_processor.rb +99 -0
- data/lib/dragonfly/processing/r_magick_processor.rb +126 -0
- data/lib/dragonfly/processor.rb +9 -0
- data/lib/dragonfly/r_magick_utils.rb +48 -0
- data/lib/dragonfly/rails/images.rb +22 -0
- data/lib/dragonfly/response.rb +82 -0
- data/lib/dragonfly/routed_endpoint.rb +40 -0
- data/lib/dragonfly/serializer.rb +32 -0
- data/lib/dragonfly/simple_cache.rb +23 -0
- data/lib/dragonfly/simple_endpoint.rb +63 -0
- data/lib/dragonfly/temp_object.rb +220 -0
- data/samples/beach.png +0 -0
- data/samples/egg.png +0 -0
- data/samples/round.gif +0 -0
- data/samples/sample.docx +0 -0
- data/samples/taj.jpg +0 -0
- data/spec/argument_matchers.rb +19 -0
- data/spec/dragonfly/active_model_extensions/active_model_setup.rb +97 -0
- data/spec/dragonfly/active_model_extensions/active_record_setup.rb +85 -0
- data/spec/dragonfly/active_model_extensions/model_spec.rb +723 -0
- data/spec/dragonfly/active_model_extensions/spec_helper.rb +11 -0
- data/spec/dragonfly/analyser_spec.rb +123 -0
- data/spec/dragonfly/analysis/file_command_analyser_spec.rb +57 -0
- data/spec/dragonfly/analysis/image_magick_analyser_spec.rb +15 -0
- data/spec/dragonfly/analysis/r_magick_analyser_spec.rb +27 -0
- data/spec/dragonfly/analysis/shared_analyser_spec.rb +51 -0
- data/spec/dragonfly/app_spec.rb +280 -0
- data/spec/dragonfly/config/r_magick_spec.rb +25 -0
- data/spec/dragonfly/configurable_spec.rb +220 -0
- data/spec/dragonfly/core_ext/string_spec.rb +17 -0
- data/spec/dragonfly/core_ext/symbol_spec.rb +17 -0
- data/spec/dragonfly/data_storage/data_store_spec.rb +76 -0
- data/spec/dragonfly/data_storage/file_data_store_spec.rb +169 -0
- data/spec/dragonfly/data_storage/mongo_data_store_spec.rb +38 -0
- data/spec/dragonfly/data_storage/s3_data_store_spec.rb +94 -0
- data/spec/dragonfly/deprecation_spec.rb +20 -0
- data/spec/dragonfly/encoding/image_magick_encoder_spec.rb +41 -0
- data/spec/dragonfly/encoding/r_magick_encoder_spec.rb +37 -0
- data/spec/dragonfly/function_manager_spec.rb +154 -0
- data/spec/dragonfly/generation/hash_with_css_style_keys_spec.rb +24 -0
- data/spec/dragonfly/generation/image_magick_generator_spec.rb +12 -0
- data/spec/dragonfly/generation/r_magick_generator_spec.rb +24 -0
- data/spec/dragonfly/generation/shared_generator_spec.rb +91 -0
- data/spec/dragonfly/image_magick_utils_spec.rb +16 -0
- data/spec/dragonfly/job_builder_spec.rb +37 -0
- data/spec/dragonfly/job_definitions_spec.rb +35 -0
- data/spec/dragonfly/job_endpoint_spec.rb +120 -0
- data/spec/dragonfly/job_spec.rb +773 -0
- data/spec/dragonfly/loggable_spec.rb +80 -0
- data/spec/dragonfly/middleware_spec.rb +68 -0
- data/spec/dragonfly/processing/image_magick_processor_spec.rb +29 -0
- data/spec/dragonfly/processing/r_magick_processor_spec.rb +26 -0
- data/spec/dragonfly/processing/shared_processing_spec.rb +215 -0
- data/spec/dragonfly/routed_endpoint_spec.rb +48 -0
- data/spec/dragonfly/serializer_spec.rb +61 -0
- data/spec/dragonfly/simple_cache_spec.rb +27 -0
- data/spec/dragonfly/simple_endpoint_spec.rb +89 -0
- data/spec/dragonfly/temp_object_spec.rb +352 -0
- data/spec/image_matchers.rb +47 -0
- data/spec/simple_matchers.rb +44 -0
- data/spec/spec_helper.rb +58 -0
- data/yard/handlers/configurable_attr_handler.rb +38 -0
- data/yard/setup.rb +15 -0
- data/yard/templates/default/fulldoc/html/css/common.css +107 -0
- data/yard/templates/default/layout/html/layout.erb +87 -0
- data/yard/templates/default/module/html/configuration_summary.erb +31 -0
- data/yard/templates/default/module/setup.rb +17 -0
- metadata +550 -0
@@ -0,0 +1,61 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
3
|
+
|
4
|
+
describe Dragonfly::Serializer do
|
5
|
+
|
6
|
+
include Dragonfly::Serializer
|
7
|
+
|
8
|
+
[
|
9
|
+
'a',
|
10
|
+
'sdhflasd',
|
11
|
+
'/2010/03/01/hello.png',
|
12
|
+
'//..',
|
13
|
+
'whats/up.egg.frog',
|
14
|
+
'£ñçùí;'
|
15
|
+
].each do |string|
|
16
|
+
it "should encode #{string.inspect} properly with no padding/line break" do
|
17
|
+
b64_encode(string).should_not =~ /\n|=/
|
18
|
+
end
|
19
|
+
it "should correctly encode and decode #{string.inspect} to the same string" do
|
20
|
+
str = b64_decode(b64_encode(string))
|
21
|
+
str.force_encoding('UTF-8') if str.respond_to?(:force_encoding)
|
22
|
+
str.should == string
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
[
|
27
|
+
:hello,
|
28
|
+
nil,
|
29
|
+
true,
|
30
|
+
4,
|
31
|
+
2.3,
|
32
|
+
'wassup man',
|
33
|
+
[3,4,5],
|
34
|
+
{:wo => 'there'},
|
35
|
+
[{:this => 'should', :work => [3, 5.3, nil, {false => 'egg'}]}, [], true]
|
36
|
+
].each do |object|
|
37
|
+
it "should correctly marshal encode #{object.inspect} properly with no padding/line break" do
|
38
|
+
encoded = marshal_encode(object)
|
39
|
+
# raise encoded.index("\n").inspect
|
40
|
+
encoded.should be_a(String)
|
41
|
+
encoded.should_not =~ /\n|=/
|
42
|
+
end
|
43
|
+
it "should correctly marshal encode and decode #{object.inspect} to the same object" do
|
44
|
+
marshal_decode(marshal_encode(object)).should == object
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe "marshal_decode" do
|
49
|
+
it "should raise an error if the string passed in is empty" do
|
50
|
+
lambda{
|
51
|
+
marshal_decode('')
|
52
|
+
}.should raise_error(Dragonfly::Serializer::BadString)
|
53
|
+
end
|
54
|
+
it "should raise an error if the string passed in is gobbledeegook" do
|
55
|
+
lambda{
|
56
|
+
marshal_decode('ahasdkjfhasdkfjh')
|
57
|
+
}.should raise_error(Dragonfly::Serializer::BadString)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
+
|
3
|
+
describe Dragonfly::SimpleCache do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
@cache = Dragonfly::SimpleCache.new(2)
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should act as a normal hash" do
|
10
|
+
@cache[:egg] = 'four'
|
11
|
+
@cache[:egg].should == 'four'
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should allow filling up to the limit" do
|
15
|
+
@cache[:a] = 1
|
16
|
+
@cache[:b] = 2
|
17
|
+
@cache.should == {:a => 1, :b => 2}
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should get rid of the first added when full" do
|
21
|
+
@cache[:a] = 1
|
22
|
+
@cache[:b] = 2
|
23
|
+
@cache[:c] = 3
|
24
|
+
@cache.should == {:b => 2, :c => 3}
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
+
require 'rack/mock'
|
3
|
+
require 'rack/cache'
|
4
|
+
|
5
|
+
def request(app, path)
|
6
|
+
Rack::MockRequest.new(app).get(path)
|
7
|
+
end
|
8
|
+
|
9
|
+
describe Dragonfly::SimpleEndpoint do
|
10
|
+
|
11
|
+
before(:each) do
|
12
|
+
@app = test_app
|
13
|
+
@app.protect_from_dos_attacks = false
|
14
|
+
@uid = @app.store('HELLO THERE')
|
15
|
+
@endpoint = Dragonfly::SimpleEndpoint.new(@app)
|
16
|
+
end
|
17
|
+
|
18
|
+
after(:each) do
|
19
|
+
@app.destroy(@uid)
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should return the thing when given the url" do
|
23
|
+
url = "/#{@app.fetch(@uid).serialize}"
|
24
|
+
response = request(@endpoint, url)
|
25
|
+
response.status.should == 200
|
26
|
+
response.body.should == 'HELLO THERE'
|
27
|
+
response.content_type.should == 'application/octet-stream'
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should return a 400 if no sha given but protection on" do
|
31
|
+
@app.protect_from_dos_attacks = true
|
32
|
+
url = "/#{@app.fetch(@uid).serialize}"
|
33
|
+
response = request(@endpoint, url)
|
34
|
+
response.status.should == 400
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should return a 400 if wrong sha given and protection on" do
|
38
|
+
@app.protect_from_dos_attacks = true
|
39
|
+
url = "/#{@app.fetch(@uid).serialize}?s=asdfs"
|
40
|
+
response = request(@endpoint, url)
|
41
|
+
response.status.should == 400
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should return a 404 when the url isn't known" do
|
45
|
+
response = request(@endpoint, '/sadhfasdfdsfsdf')
|
46
|
+
response.status.should == 404
|
47
|
+
response.body.should == 'Not found'
|
48
|
+
response.content_type.should == 'text/plain'
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should return a 404 when the url is a well-encoded but bad array" do
|
52
|
+
url = "/#{Dragonfly::Serializer.marshal_encode([[:egg, {:some => 'args'}]])}"
|
53
|
+
response = request(@endpoint, url)
|
54
|
+
response.status.should == 404
|
55
|
+
response.body.should == 'Not found'
|
56
|
+
response.content_type.should == 'text/plain'
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should still work when mapped to a prefix" do
|
60
|
+
endpoint = @endpoint
|
61
|
+
rack_app = Rack::Builder.new do
|
62
|
+
map '/some_prefix' do
|
63
|
+
run endpoint
|
64
|
+
end
|
65
|
+
end.to_app
|
66
|
+
url = "/some_prefix/#{@app.fetch(@uid).serialize}"
|
67
|
+
response = request(rack_app, url)
|
68
|
+
response.status.should == 200
|
69
|
+
response.body.should == 'HELLO THERE'
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should return a simple text response at the root" do
|
73
|
+
response = request(@endpoint, '/')
|
74
|
+
response.status.should == 200
|
75
|
+
response.body.length.should > 0
|
76
|
+
response.content_type.should == 'text/plain'
|
77
|
+
end
|
78
|
+
|
79
|
+
it "should return a cacheable response" do
|
80
|
+
url = "/#{@app.fetch(@uid).serialize}"
|
81
|
+
cache = Rack::Cache.new(@endpoint, :entitystore => 'heap:/')
|
82
|
+
response = request(cache, url)
|
83
|
+
response.status.should == 200
|
84
|
+
response.headers['X-Rack-Cache'].should == "miss, store"
|
85
|
+
response = request(cache, url)
|
86
|
+
response.status.should == 200
|
87
|
+
response.headers['X-Rack-Cache'].should == "fresh"
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,352 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
+
|
3
|
+
describe Dragonfly::TempObject do
|
4
|
+
|
5
|
+
####### Helper Methods #######
|
6
|
+
|
7
|
+
def sample_path(filename)
|
8
|
+
File.dirname(__FILE__) + '/../../samples/' + filename
|
9
|
+
end
|
10
|
+
|
11
|
+
def new_tempfile(data='HELLO')
|
12
|
+
tempfile = Tempfile.new('test')
|
13
|
+
tempfile.write(data)
|
14
|
+
tempfile.rewind
|
15
|
+
tempfile
|
16
|
+
end
|
17
|
+
|
18
|
+
def new_file(data='HELLO')
|
19
|
+
File.open('/tmp/test_file', 'w') do |f|
|
20
|
+
f.write(data)
|
21
|
+
end
|
22
|
+
File.new('/tmp/test_file')
|
23
|
+
end
|
24
|
+
|
25
|
+
def new_temp_object(data, opts={})
|
26
|
+
klass = opts.delete(:class) || Dragonfly::TempObject
|
27
|
+
klass.new(initialization_object(data), opts)
|
28
|
+
end
|
29
|
+
|
30
|
+
def initialization_object(data)
|
31
|
+
raise NotImplementedError, "This should be implemented in the describe block!"
|
32
|
+
end
|
33
|
+
|
34
|
+
def get_parts(temp_object)
|
35
|
+
parts = []
|
36
|
+
temp_object.each do |bytes|
|
37
|
+
parts << bytes
|
38
|
+
end
|
39
|
+
parts.length.should >= 2 # Sanity check to check that the sample file is adequate for this test
|
40
|
+
parts
|
41
|
+
end
|
42
|
+
|
43
|
+
###############################
|
44
|
+
|
45
|
+
it "should raise an error if initialized with a non-string/file/tempfile" do
|
46
|
+
lambda{
|
47
|
+
Dragonfly::TempObject.new(3)
|
48
|
+
}.should raise_error(ArgumentError)
|
49
|
+
end
|
50
|
+
|
51
|
+
describe "common behaviour", :shared => true do
|
52
|
+
|
53
|
+
describe "simple initialization" do
|
54
|
+
|
55
|
+
before(:each) do
|
56
|
+
@temp_object = new_temp_object('HELLO')
|
57
|
+
end
|
58
|
+
|
59
|
+
describe "data" do
|
60
|
+
it "should return the data correctly" do
|
61
|
+
@temp_object.data.should == 'HELLO'
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
describe "file" do
|
66
|
+
it "should return a readable file" do
|
67
|
+
@temp_object.file.should be_a(File)
|
68
|
+
end
|
69
|
+
it "should contain the correct data" do
|
70
|
+
@temp_object.file.read.should == 'HELLO'
|
71
|
+
end
|
72
|
+
it "should yield a file then close it if a block is given" do
|
73
|
+
@temp_object.file do |f|
|
74
|
+
f.read.should == 'HELLO'
|
75
|
+
f.should_receive :close
|
76
|
+
end
|
77
|
+
end
|
78
|
+
it "should return whatever is returned from the block if a block is given" do
|
79
|
+
@temp_object.file do |f|
|
80
|
+
'doogie'
|
81
|
+
end.should == 'doogie'
|
82
|
+
end
|
83
|
+
it "should enable reading the file twice" do
|
84
|
+
@temp_object.file{|f| f.read }.should == "HELLO"
|
85
|
+
@temp_object.file{|f| f.read }.should == "HELLO"
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
describe "tempfile" do
|
90
|
+
it "should create a closed tempfile" do
|
91
|
+
@temp_object.tempfile.should be_a(Tempfile)
|
92
|
+
@temp_object.tempfile.should be_closed
|
93
|
+
end
|
94
|
+
it "should contain the correct data" do
|
95
|
+
@temp_object.tempfile.open.read.should == 'HELLO'
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
describe "path" do
|
100
|
+
it "should return the absolute file path" do
|
101
|
+
@temp_object.path.should == @temp_object.tempfile.path
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
describe "size" do
|
106
|
+
it "should return the size in bytes" do
|
107
|
+
@temp_object.size.should == 5
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
describe "to_file" do
|
112
|
+
before(:each) do
|
113
|
+
@filename = 'eggnog.txt'
|
114
|
+
FileUtils.rm(@filename) if File.exists?(@filename)
|
115
|
+
end
|
116
|
+
after(:each) do
|
117
|
+
FileUtils.rm(@filename) if File.exists?(@filename)
|
118
|
+
end
|
119
|
+
it "should write to a file" do
|
120
|
+
@temp_object.to_file(@filename)
|
121
|
+
File.exists?(@filename).should be_true
|
122
|
+
end
|
123
|
+
it "should write the correct data to the file" do
|
124
|
+
@temp_object.to_file(@filename)
|
125
|
+
File.read(@filename).should == 'HELLO'
|
126
|
+
end
|
127
|
+
it "should return a readable file" do
|
128
|
+
file = @temp_object.to_file(@filename)
|
129
|
+
file.should be_a(File)
|
130
|
+
file.read.should == 'HELLO'
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
end
|
135
|
+
|
136
|
+
describe "initializing attributes too" do
|
137
|
+
it "should set the name" do
|
138
|
+
temp_object = Dragonfly::TempObject.new(initialization_object('HELLO'), :name => 'monkey.egg')
|
139
|
+
temp_object.name.should == 'monkey.egg'
|
140
|
+
end
|
141
|
+
it "should set the meta" do
|
142
|
+
temp_object = Dragonfly::TempObject.new(initialization_object('HELLO'), :meta => {:dr => 'doolittle'})
|
143
|
+
temp_object.meta.should == {:dr => 'doolittle'}
|
144
|
+
end
|
145
|
+
it "should set the format" do
|
146
|
+
temp_object = Dragonfly::TempObject.new(initialization_object('HELLO'), :format => :jpg)
|
147
|
+
temp_object.format.should == :jpg
|
148
|
+
end
|
149
|
+
it "should raise an error if an invalid option is given" do
|
150
|
+
lambda {
|
151
|
+
Dragonfly::TempObject.new(initialization_object('HELLO'), :doobie => 'doo')
|
152
|
+
}.should raise_error(ArgumentError)
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
describe "each" do
|
157
|
+
it "should yield 8192 bytes each time" do
|
158
|
+
temp_object = new_temp_object(File.read(sample_path('round.gif')))
|
159
|
+
parts = get_parts(temp_object)
|
160
|
+
parts[0...-1].each do |part|
|
161
|
+
part.bytesize.should == 8192
|
162
|
+
end
|
163
|
+
parts.last.bytesize.should <= 8192
|
164
|
+
end
|
165
|
+
it "should yield the number of bytes specified in the class configuration" do
|
166
|
+
klass = Class.new(Dragonfly::TempObject)
|
167
|
+
temp_object = new_temp_object(File.read(sample_path('round.gif')), :class => klass)
|
168
|
+
klass.block_size = 3001
|
169
|
+
parts = get_parts(temp_object)
|
170
|
+
parts[0...-1].each do |part|
|
171
|
+
part.length.should == 3001
|
172
|
+
end
|
173
|
+
parts.last.length.should <= 3001
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
end
|
178
|
+
|
179
|
+
describe "initializing from a string" do
|
180
|
+
|
181
|
+
def initialization_object(data)
|
182
|
+
data
|
183
|
+
end
|
184
|
+
|
185
|
+
it_should_behave_like "common behaviour"
|
186
|
+
|
187
|
+
it "should not create a file when calling each" do
|
188
|
+
temp_object = new_temp_object('HELLO')
|
189
|
+
temp_object.should_not_receive(:tempfile)
|
190
|
+
temp_object.each{}
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
describe "initializing from a tempfile" do
|
195
|
+
|
196
|
+
def initialization_object(data)
|
197
|
+
new_tempfile(data)
|
198
|
+
end
|
199
|
+
|
200
|
+
it_should_behave_like "common behaviour"
|
201
|
+
|
202
|
+
it "should not create a data string when calling each" do
|
203
|
+
temp_object = new_temp_object('HELLO')
|
204
|
+
temp_object.should_not_receive(:data)
|
205
|
+
temp_object.each{}
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
209
|
+
describe "initializing from a file" do
|
210
|
+
|
211
|
+
def initialization_object(data)
|
212
|
+
new_file(data)
|
213
|
+
end
|
214
|
+
|
215
|
+
it_should_behave_like "common behaviour"
|
216
|
+
|
217
|
+
it "should not create a data string when calling each" do
|
218
|
+
temp_object = new_temp_object('HELLO')
|
219
|
+
temp_object.should_not_receive(:data)
|
220
|
+
temp_object.each{}
|
221
|
+
end
|
222
|
+
end
|
223
|
+
|
224
|
+
describe "initializing from another temp object" do
|
225
|
+
before(:each) do
|
226
|
+
@temp_object1 = Dragonfly::TempObject.new(new_tempfile('hello'))
|
227
|
+
@temp_object2 = Dragonfly::TempObject.new(@temp_object1)
|
228
|
+
end
|
229
|
+
it "should not be the same object" do
|
230
|
+
@temp_object1.should_not == @temp_object2
|
231
|
+
end
|
232
|
+
it "should have the same data" do
|
233
|
+
@temp_object1.data.should == @temp_object2.data
|
234
|
+
end
|
235
|
+
it "should have a different file path" do
|
236
|
+
@temp_object1.path.should_not == @temp_object2.path
|
237
|
+
end
|
238
|
+
end
|
239
|
+
|
240
|
+
describe "name" do
|
241
|
+
before(:each) do
|
242
|
+
@obj = new_tempfile
|
243
|
+
end
|
244
|
+
it "should set the name if the initial object responds to 'original filename'" do
|
245
|
+
def @obj.original_filename
|
246
|
+
'jimmy.page'
|
247
|
+
end
|
248
|
+
Dragonfly::TempObject.new(@obj).name.should == 'jimmy.page'
|
249
|
+
end
|
250
|
+
it "should not set the name if the initial object doesn't respond to 'original filename'" do
|
251
|
+
Dragonfly::TempObject.new(@obj).name.should be_nil
|
252
|
+
end
|
253
|
+
it "should set the name if the initial object is a file object" do
|
254
|
+
file = File.new(SAMPLES_DIR + '/round.gif')
|
255
|
+
temp_object = Dragonfly::TempObject.new(file)
|
256
|
+
temp_object.name.should == 'round.gif'
|
257
|
+
end
|
258
|
+
it "should still be nil if set to empty string on initialize" do
|
259
|
+
temp_object = Dragonfly::TempObject.new('sdf', :name => '')
|
260
|
+
temp_object.name.should be_nil
|
261
|
+
end
|
262
|
+
it "should allow setting" do
|
263
|
+
temp_object = Dragonfly::TempObject.new('sdf')
|
264
|
+
temp_object.name = "jonny.briggs"
|
265
|
+
temp_object.name.should == 'jonny.briggs'
|
266
|
+
end
|
267
|
+
end
|
268
|
+
|
269
|
+
describe "ext" do
|
270
|
+
it "should use the correct extension from name" do
|
271
|
+
temp_object = Dragonfly::TempObject.new('asfsadf', :name => 'hello.there.mate')
|
272
|
+
temp_object.ext.should == 'mate'
|
273
|
+
end
|
274
|
+
it "should be nil if name has none" do
|
275
|
+
temp_object = Dragonfly::TempObject.new('asfsadf', :name => 'hello')
|
276
|
+
temp_object.ext.should be_nil
|
277
|
+
end
|
278
|
+
it "should be nil if name is nil" do
|
279
|
+
temp_object = Dragonfly::TempObject.new('asfsadf')
|
280
|
+
temp_object.ext.should be_nil
|
281
|
+
end
|
282
|
+
end
|
283
|
+
|
284
|
+
describe "basename" do
|
285
|
+
it "should use the correct basename from name" do
|
286
|
+
temp_object = Dragonfly::TempObject.new('A', :name => 'hello.there.mate')
|
287
|
+
temp_object.basename.should == 'hello.there'
|
288
|
+
end
|
289
|
+
it "should be the name if it has no ext" do
|
290
|
+
temp_object = Dragonfly::TempObject.new('A', :name => 'hello')
|
291
|
+
temp_object.basename.should == 'hello'
|
292
|
+
end
|
293
|
+
it "should be nil if name is nil" do
|
294
|
+
temp_object = Dragonfly::TempObject.new('A', :name => nil)
|
295
|
+
temp_object.basename.should be_nil
|
296
|
+
end
|
297
|
+
end
|
298
|
+
|
299
|
+
describe "meta" do
|
300
|
+
before(:each) do
|
301
|
+
@temp_object = Dragonfly::TempObject.new('get outta here!')
|
302
|
+
end
|
303
|
+
it "should return an empty hash if not set" do
|
304
|
+
@temp_object.meta.should == {}
|
305
|
+
end
|
306
|
+
it "should allow setting" do
|
307
|
+
@temp_object.meta = {:teeth => 'many'}
|
308
|
+
@temp_object.meta.should == {:teeth => 'many'}
|
309
|
+
end
|
310
|
+
end
|
311
|
+
|
312
|
+
describe "format" do
|
313
|
+
it "should return nil if not set" do
|
314
|
+
temp_object = Dragonfly::TempObject.new('wassin my belly??!')
|
315
|
+
temp_object.format.should be_nil
|
316
|
+
end
|
317
|
+
it "should allow setting on initialize" do
|
318
|
+
temp_object = Dragonfly::TempObject.new('wassin my belly??!', :format => :jpg)
|
319
|
+
temp_object.format.should == :jpg
|
320
|
+
end
|
321
|
+
it "should allow setting" do
|
322
|
+
temp_object = Dragonfly::TempObject.new('jo*ida pero contenta')
|
323
|
+
temp_object.format = :tiff
|
324
|
+
temp_object.format.should == :tiff
|
325
|
+
end
|
326
|
+
end
|
327
|
+
|
328
|
+
describe "extract_attributes_from" do
|
329
|
+
before(:each) do
|
330
|
+
@temp_object = Dragonfly::TempObject.new("ne'er gonna give you up",
|
331
|
+
:meta => {:a => 4},
|
332
|
+
:name => 'fred.txt',
|
333
|
+
:format => :txt
|
334
|
+
)
|
335
|
+
@attributes = {:meta => {:b => 5}, :ogle => 'bogle', :format => :dungbats}
|
336
|
+
@temp_object.extract_attributes_from(@attributes)
|
337
|
+
end
|
338
|
+
it "should overwrite its own attributes if specified" do
|
339
|
+
@temp_object.format.should == :dungbats
|
340
|
+
end
|
341
|
+
it "should merge its own meta if specified" do
|
342
|
+
@temp_object.meta.should == {:a => 4, :b => 5}
|
343
|
+
end
|
344
|
+
it "should leave non-specified attributes untouched" do
|
345
|
+
@temp_object.name.should == 'fred.txt'
|
346
|
+
end
|
347
|
+
it "should remove attributes from the hash" do
|
348
|
+
@attributes.should == {:ogle => 'bogle'}
|
349
|
+
end
|
350
|
+
end
|
351
|
+
|
352
|
+
end
|