fog-dragonfly 0.8.1
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/.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
|