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.
Files changed (155) hide show
  1. data/.specopts +2 -0
  2. data/.yardopts +23 -0
  3. data/Gemfile +23 -0
  4. data/Gemfile.rails.2.3.5 +14 -0
  5. data/History.md +266 -0
  6. data/LICENSE +20 -0
  7. data/README.md +88 -0
  8. data/Rakefile +92 -0
  9. data/VERSION +1 -0
  10. data/config.ru +13 -0
  11. data/docs.watchr +1 -0
  12. data/dragonfly.gemspec +293 -0
  13. data/extra_docs/Analysers.md +108 -0
  14. data/extra_docs/Caching.md +23 -0
  15. data/extra_docs/Configuration.md +138 -0
  16. data/extra_docs/DataStorage.md +136 -0
  17. data/extra_docs/Encoding.md +96 -0
  18. data/extra_docs/GeneralUsage.md +121 -0
  19. data/extra_docs/Generators.md +102 -0
  20. data/extra_docs/Heroku.md +50 -0
  21. data/extra_docs/Index.md +36 -0
  22. data/extra_docs/MimeTypes.md +40 -0
  23. data/extra_docs/Models.md +266 -0
  24. data/extra_docs/Mongo.md +45 -0
  25. data/extra_docs/Processing.md +130 -0
  26. data/extra_docs/Rack.md +52 -0
  27. data/extra_docs/Rails2.md +55 -0
  28. data/extra_docs/Rails3.md +62 -0
  29. data/extra_docs/Sinatra.md +25 -0
  30. data/extra_docs/URLs.md +169 -0
  31. data/features/3.0.3.feature +8 -0
  32. data/features/images.feature +47 -0
  33. data/features/no_processing.feature +14 -0
  34. data/features/rails_2.3.5.feature +7 -0
  35. data/features/steps/common_steps.rb +8 -0
  36. data/features/steps/dragonfly_steps.rb +66 -0
  37. data/features/steps/rails_steps.rb +39 -0
  38. data/features/support/env.rb +40 -0
  39. data/fixtures/files/app/models/album.rb +3 -0
  40. data/fixtures/files/app/views/albums/new.html.erb +4 -0
  41. data/fixtures/files/app/views/albums/show.html.erb +4 -0
  42. data/fixtures/files/config/initializers/dragonfly.rb +4 -0
  43. data/fixtures/files/features/manage_album_images.feature +12 -0
  44. data/fixtures/files/features/step_definitions/image_steps.rb +15 -0
  45. data/fixtures/files/features/support/paths.rb +15 -0
  46. data/fixtures/files/features/text_images.feature +7 -0
  47. data/fixtures/rails_2.3.5/template.rb +10 -0
  48. data/fixtures/rails_3.0.3/template.rb +20 -0
  49. data/irbrc.rb +17 -0
  50. data/lib/dragonfly.rb +45 -0
  51. data/lib/dragonfly/active_model_extensions.rb +13 -0
  52. data/lib/dragonfly/active_model_extensions/attachment.rb +169 -0
  53. data/lib/dragonfly/active_model_extensions/class_methods.rb +45 -0
  54. data/lib/dragonfly/active_model_extensions/instance_methods.rb +28 -0
  55. data/lib/dragonfly/active_model_extensions/validations.rb +37 -0
  56. data/lib/dragonfly/analyser.rb +59 -0
  57. data/lib/dragonfly/analysis/file_command_analyser.rb +32 -0
  58. data/lib/dragonfly/analysis/image_magick_analyser.rb +47 -0
  59. data/lib/dragonfly/analysis/r_magick_analyser.rb +63 -0
  60. data/lib/dragonfly/app.rb +182 -0
  61. data/lib/dragonfly/config/heroku.rb +19 -0
  62. data/lib/dragonfly/config/image_magick.rb +41 -0
  63. data/lib/dragonfly/config/r_magick.rb +46 -0
  64. data/lib/dragonfly/config/rails.rb +17 -0
  65. data/lib/dragonfly/configurable.rb +119 -0
  66. data/lib/dragonfly/core_ext/object.rb +8 -0
  67. data/lib/dragonfly/core_ext/string.rb +9 -0
  68. data/lib/dragonfly/core_ext/symbol.rb +9 -0
  69. data/lib/dragonfly/data_storage.rb +9 -0
  70. data/lib/dragonfly/data_storage/file_data_store.rb +114 -0
  71. data/lib/dragonfly/data_storage/mongo_data_store.rb +82 -0
  72. data/lib/dragonfly/data_storage/s3data_store.rb +115 -0
  73. data/lib/dragonfly/encoder.rb +13 -0
  74. data/lib/dragonfly/encoding/image_magick_encoder.rb +57 -0
  75. data/lib/dragonfly/encoding/r_magick_encoder.rb +61 -0
  76. data/lib/dragonfly/function_manager.rb +69 -0
  77. data/lib/dragonfly/generation/hash_with_css_style_keys.rb +23 -0
  78. data/lib/dragonfly/generation/image_magick_generator.rb +140 -0
  79. data/lib/dragonfly/generation/r_magick_generator.rb +155 -0
  80. data/lib/dragonfly/generator.rb +9 -0
  81. data/lib/dragonfly/image_magick_utils.rb +81 -0
  82. data/lib/dragonfly/job.rb +371 -0
  83. data/lib/dragonfly/job_builder.rb +39 -0
  84. data/lib/dragonfly/job_definitions.rb +26 -0
  85. data/lib/dragonfly/job_endpoint.rb +15 -0
  86. data/lib/dragonfly/loggable.rb +28 -0
  87. data/lib/dragonfly/middleware.rb +34 -0
  88. data/lib/dragonfly/processing/image_magick_processor.rb +99 -0
  89. data/lib/dragonfly/processing/r_magick_processor.rb +126 -0
  90. data/lib/dragonfly/processor.rb +9 -0
  91. data/lib/dragonfly/r_magick_utils.rb +48 -0
  92. data/lib/dragonfly/rails/images.rb +22 -0
  93. data/lib/dragonfly/response.rb +82 -0
  94. data/lib/dragonfly/routed_endpoint.rb +40 -0
  95. data/lib/dragonfly/serializer.rb +32 -0
  96. data/lib/dragonfly/simple_cache.rb +23 -0
  97. data/lib/dragonfly/simple_endpoint.rb +63 -0
  98. data/lib/dragonfly/temp_object.rb +220 -0
  99. data/samples/beach.png +0 -0
  100. data/samples/egg.png +0 -0
  101. data/samples/round.gif +0 -0
  102. data/samples/sample.docx +0 -0
  103. data/samples/taj.jpg +0 -0
  104. data/spec/argument_matchers.rb +19 -0
  105. data/spec/dragonfly/active_model_extensions/active_model_setup.rb +97 -0
  106. data/spec/dragonfly/active_model_extensions/active_record_setup.rb +85 -0
  107. data/spec/dragonfly/active_model_extensions/model_spec.rb +723 -0
  108. data/spec/dragonfly/active_model_extensions/spec_helper.rb +11 -0
  109. data/spec/dragonfly/analyser_spec.rb +123 -0
  110. data/spec/dragonfly/analysis/file_command_analyser_spec.rb +57 -0
  111. data/spec/dragonfly/analysis/image_magick_analyser_spec.rb +15 -0
  112. data/spec/dragonfly/analysis/r_magick_analyser_spec.rb +27 -0
  113. data/spec/dragonfly/analysis/shared_analyser_spec.rb +51 -0
  114. data/spec/dragonfly/app_spec.rb +280 -0
  115. data/spec/dragonfly/config/r_magick_spec.rb +25 -0
  116. data/spec/dragonfly/configurable_spec.rb +220 -0
  117. data/spec/dragonfly/core_ext/string_spec.rb +17 -0
  118. data/spec/dragonfly/core_ext/symbol_spec.rb +17 -0
  119. data/spec/dragonfly/data_storage/data_store_spec.rb +76 -0
  120. data/spec/dragonfly/data_storage/file_data_store_spec.rb +169 -0
  121. data/spec/dragonfly/data_storage/mongo_data_store_spec.rb +38 -0
  122. data/spec/dragonfly/data_storage/s3_data_store_spec.rb +94 -0
  123. data/spec/dragonfly/deprecation_spec.rb +20 -0
  124. data/spec/dragonfly/encoding/image_magick_encoder_spec.rb +41 -0
  125. data/spec/dragonfly/encoding/r_magick_encoder_spec.rb +37 -0
  126. data/spec/dragonfly/function_manager_spec.rb +154 -0
  127. data/spec/dragonfly/generation/hash_with_css_style_keys_spec.rb +24 -0
  128. data/spec/dragonfly/generation/image_magick_generator_spec.rb +12 -0
  129. data/spec/dragonfly/generation/r_magick_generator_spec.rb +24 -0
  130. data/spec/dragonfly/generation/shared_generator_spec.rb +91 -0
  131. data/spec/dragonfly/image_magick_utils_spec.rb +16 -0
  132. data/spec/dragonfly/job_builder_spec.rb +37 -0
  133. data/spec/dragonfly/job_definitions_spec.rb +35 -0
  134. data/spec/dragonfly/job_endpoint_spec.rb +120 -0
  135. data/spec/dragonfly/job_spec.rb +773 -0
  136. data/spec/dragonfly/loggable_spec.rb +80 -0
  137. data/spec/dragonfly/middleware_spec.rb +68 -0
  138. data/spec/dragonfly/processing/image_magick_processor_spec.rb +29 -0
  139. data/spec/dragonfly/processing/r_magick_processor_spec.rb +26 -0
  140. data/spec/dragonfly/processing/shared_processing_spec.rb +215 -0
  141. data/spec/dragonfly/routed_endpoint_spec.rb +48 -0
  142. data/spec/dragonfly/serializer_spec.rb +61 -0
  143. data/spec/dragonfly/simple_cache_spec.rb +27 -0
  144. data/spec/dragonfly/simple_endpoint_spec.rb +89 -0
  145. data/spec/dragonfly/temp_object_spec.rb +352 -0
  146. data/spec/image_matchers.rb +47 -0
  147. data/spec/simple_matchers.rb +44 -0
  148. data/spec/spec_helper.rb +58 -0
  149. data/yard/handlers/configurable_attr_handler.rb +38 -0
  150. data/yard/setup.rb +15 -0
  151. data/yard/templates/default/fulldoc/html/css/common.css +107 -0
  152. data/yard/templates/default/layout/html/layout.erb +87 -0
  153. data/yard/templates/default/module/html/configuration_summary.erb +31 -0
  154. data/yard/templates/default/module/setup.rb +17 -0
  155. metadata +550 -0
@@ -0,0 +1,11 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ begin
4
+ require 'active_model'
5
+ rescue LoadError => e
6
+ # When there's NO active_model
7
+ require File.dirname(__FILE__) + '/active_record_setup'
8
+ else
9
+ # When there IS active model
10
+ require File.dirname(__FILE__) + '/active_model_setup'
11
+ end
@@ -0,0 +1,123 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe Dragonfly::Analyser do
4
+
5
+ before(:each) do
6
+ @analyser = Dragonfly::Analyser.new
7
+ @analyser.log = Logger.new(LOG_FILE)
8
+ end
9
+
10
+ describe "analysis_methods module" do
11
+
12
+ before(:each) do
13
+ @analyser.add(:num_letters){|temp_object, letter| temp_object.data.count(letter) }
14
+ @obj = Object.new
15
+ @obj.extend @analyser.analysis_methods
16
+ end
17
+
18
+ it "should return a module" do
19
+ @analyser.analysis_methods.should be_a(Module)
20
+ end
21
+
22
+ it "should provide the object with the analyser method" do
23
+ @obj.analyser.should == @analyser
24
+ end
25
+
26
+ it "should provide the object with the direct analysis method, provided that analyse method exists" do
27
+ def @obj.analyse(meth, *args)
28
+ analyser.analyse Dragonfly::TempObject.new('HELLO'), meth, *args
29
+ end
30
+ @obj.num_letters('L').should == 2
31
+ end
32
+
33
+ end
34
+
35
+ describe "analyse" do
36
+ it "should return nil if the function isn't defined" do
37
+ @analyser.analyse(Dragonfly::TempObject.new("Hello"), :width).should be_nil
38
+ end
39
+ it "should return nil if the function can't be handled" do
40
+ @analyser.add(:width){ throw :unable_to_handle }
41
+ @analyser.analyse(Dragonfly::TempObject.new("Hello"), :width).should be_nil
42
+ end
43
+ end
44
+
45
+ describe "analysis_method_names" do
46
+ it "should return the analysis methods" do
47
+ @analyser.add(:width){}
48
+ @analyser.add(:height){}
49
+ @analyser.analysis_method_names.should == [:width, :height]
50
+ end
51
+ end
52
+
53
+ describe "cache" do
54
+ before(:each) do
55
+ @temp_object = Dragonfly::TempObject.new('HELLO')
56
+ end
57
+
58
+ def it_should_analyse_using(meth, temp_object, *args)
59
+ result = mock('result')
60
+ @analyser.should_receive(:call_last).with(meth, temp_object, *args).exactly(:once).and_return result
61
+ @analyser.analyse(temp_object, meth, *args).should == result
62
+ result
63
+ end
64
+
65
+ it "should do the analysis the first time" do
66
+ it_should_analyse_using(:blah, @temp_object, :arg1)
67
+ end
68
+
69
+ describe "when already called" do
70
+ before(:each) do
71
+ @result = it_should_analyse_using(:blah, @temp_object, :arg1)
72
+ end
73
+
74
+ it "should not do it subsequent times but still return the result" do
75
+ @analyser.should_not_receive(:call_last)
76
+ @analyser.analyse(@temp_object, :blah, :arg1).should == @result
77
+ @analyser.analyse(@temp_object, :blah, :arg1).should == @result
78
+ end
79
+
80
+ it "should not use the cache if the temp_object is different" do
81
+ temp_object = Dragonfly::TempObject.new('aaa')
82
+ it_should_analyse_using(:blah, temp_object, :arg1)
83
+ end
84
+
85
+ it "should not use the cache if the method name is different" do
86
+ it_should_analyse_using(:egghead, @temp_object, :arg1)
87
+ end
88
+
89
+ it "should not use the cache if the args are different" do
90
+ it_should_analyse_using(:blah, @temp_object, :arg2)
91
+ end
92
+
93
+ it "should do it again if the cache has been cleared" do
94
+ @analyser.clear_cache!
95
+ it_should_analyse_using(:blah, @temp_object, :arg1)
96
+ end
97
+
98
+ it "should not use the cache if it has been turned off" do
99
+ @analyser.enable_cache = false
100
+ it_should_analyse_using(:blah, @temp_object, :arg1)
101
+ end
102
+
103
+ end
104
+
105
+ describe "cache size" do
106
+ it "should not exceed the cache size" do
107
+ @analyser.cache_size = 2
108
+
109
+ res1 = it_should_analyse_using(:blah, @temp_object, :arg1)
110
+ res2 = it_should_analyse_using(:blah, @temp_object, :arg2)
111
+ res3 = it_should_analyse_using(:blah, @temp_object, :arg3) # Should kick out first one
112
+
113
+ it_should_analyse_using(:blah, @temp_object, :arg1)
114
+
115
+ # Third analysis should still be cached
116
+ @analyser.should_not_receive(:call_last)
117
+ @analyser.analyse(@temp_object, :blah, :arg3).should == res3
118
+ end
119
+ end
120
+
121
+ end
122
+
123
+ end
@@ -0,0 +1,57 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ png_path = File.dirname(__FILE__) + '/../../../samples/egg.png'
4
+
5
+ describe Dragonfly::Analysis::FileCommandAnalyser do
6
+
7
+ before(:each) do
8
+ @analyser = Dragonfly::Analysis::FileCommandAnalyser.new
9
+ end
10
+
11
+ describe "mime_type" do
12
+
13
+ describe "when using the filesystem" do
14
+ before(:each) do
15
+ @analyser.use_filesystem = true
16
+ @temp_object = Dragonfly::TempObject.new(File.new(png_path))
17
+ end
18
+ it "should give the mime-type" do
19
+ @analyser.mime_type(@temp_object).should == 'image/png'
20
+ end
21
+ it "should not have initialized the data string" do
22
+ @analyser.mime_type(@temp_object)
23
+ @temp_object.instance_eval{@data}.should be_nil
24
+ end
25
+ end
26
+
27
+ describe "when not using the filesystem" do
28
+ before(:each) do
29
+ @analyser.use_filesystem = false
30
+ @temp_object = Dragonfly::TempObject.new(File.read(png_path))
31
+ end
32
+ it "should give the mime-type" do
33
+ @analyser.mime_type(@temp_object).should == 'image/png'
34
+ end
35
+ it "should not have initialized the file" do
36
+ @analyser.mime_type(@temp_object)
37
+ @temp_object.instance_eval{@tempfile}.should be_nil
38
+ end
39
+
40
+ {
41
+ :jpg => 'image/jpeg',
42
+ :png => 'image/png',
43
+ :gif => 'image/gif',
44
+ :tif => 'image/tiff'
45
+ }.each do |format, mime_type|
46
+ it "should work properly (without a broken pipe error) for big files of format #{format}" do
47
+ data = Dragonfly::Generation::RMagickGenerator.new.plasma(1000, 1000, format).first
48
+ temp_object = Dragonfly::TempObject.new(data)
49
+ @analyser.mime_type(temp_object).should == mime_type
50
+ end
51
+ end
52
+
53
+ end
54
+
55
+ end
56
+
57
+ end
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+ require 'dragonfly/analysis/shared_analyser_spec'
3
+
4
+ describe Dragonfly::Analysis::ImageMagickAnalyser do
5
+
6
+ before(:each) do
7
+ image_path = File.dirname(__FILE__) + '/../../../samples/beach.png'
8
+ @image = Dragonfly::TempObject.new(File.new(image_path))
9
+ @analyser = Dragonfly::Analysis::ImageMagickAnalyser.new
10
+ @analyser.log = Logger.new(LOG_FILE)
11
+ end
12
+
13
+ it_should_behave_like "image analyser methods"
14
+
15
+ end
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+ require 'dragonfly/analysis/shared_analyser_spec'
3
+
4
+ describe Dragonfly::Analysis::RMagickAnalyser do
5
+
6
+ before(:each) do
7
+ image_path = File.dirname(__FILE__) + '/../../../samples/beach.png'
8
+ @image = Dragonfly::TempObject.new(File.new(image_path))
9
+ @analyser = Dragonfly::Analysis::RMagickAnalyser.new
10
+ @analyser.log = Logger.new(LOG_FILE)
11
+ end
12
+
13
+ describe "when using the filesystem" do
14
+ before(:each) do
15
+ @analyser.use_filesystem = true
16
+ end
17
+ it_should_behave_like "image analyser methods"
18
+ end
19
+
20
+ describe "when not using the filesystem" do
21
+ before(:each) do
22
+ @analyser.use_filesystem = false
23
+ end
24
+ it_should_behave_like "image analyser methods"
25
+ end
26
+
27
+ end
@@ -0,0 +1,51 @@
1
+ # NEEDS:
2
+ #
3
+ # @image
4
+ # @processor
5
+ #
6
+ describe "image analyser methods", :shared => true do
7
+
8
+ it "should return the width" do
9
+ @analyser.width(@image).should == 280
10
+ end
11
+
12
+ it "should return the height" do
13
+ @analyser.height(@image).should == 355
14
+ end
15
+
16
+ it "should return the aspect ratio" do
17
+ @analyser.aspect_ratio(@image).should == (280.0/355.0)
18
+ end
19
+
20
+ it "should say if it's portrait" do
21
+ @analyser.portrait?(@image).should be_true
22
+ end
23
+
24
+ it "should say if it's landscape" do
25
+ @analyser.landscape?(@image).should be_false
26
+ end
27
+
28
+ it "should return the number of colours" do
29
+ @analyser.number_of_colours(@image).should == 34703
30
+ end
31
+
32
+ it "should return the depth" do
33
+ @analyser.depth(@image).should == 8
34
+ end
35
+
36
+ it "should return the format" do
37
+ @analyser.format(@image).should == :png
38
+ end
39
+
40
+ %w(width height aspect_ratio number_of_colours depth format portrait? landscape?).each do |meth|
41
+ it "should throw unable_to_handle in #{meth.inspect} if it's not an image file" do
42
+ suppressing_stderr do
43
+ temp_object = Dragonfly::TempObject.new('blah')
44
+ lambda{
45
+ @analyser.send(meth, temp_object)
46
+ }.should throw_symbol(:unable_to_handle)
47
+ end
48
+ end
49
+ end
50
+
51
+ end
@@ -0,0 +1,280 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+ require 'rack/mock'
3
+
4
+ def request(app, path)
5
+ Rack::MockRequest.new(app).get(path)
6
+ end
7
+
8
+ describe Dragonfly::App do
9
+
10
+ describe ".instance" do
11
+
12
+ it "should create a new instance if it didn't already exist" do
13
+ app = Dragonfly::App.instance(:images)
14
+ app.should be_a(Dragonfly::App)
15
+ end
16
+
17
+ it "should return an existing instance if called by name" do
18
+ app = Dragonfly::App.instance(:images)
19
+ Dragonfly::App.instance(:images).should == app
20
+ end
21
+
22
+ it "should also work using square brackets" do
23
+ Dragonfly[:images].should == Dragonfly::App.instance(:images)
24
+ end
25
+
26
+ end
27
+
28
+ describe ".new" do
29
+ it "should not be callable" do
30
+ lambda{
31
+ Dragonfly::App.new
32
+ }.should raise_error(NoMethodError)
33
+ end
34
+ end
35
+
36
+ describe "mime types" do
37
+ describe "#mime_type_for" do
38
+ before(:each) do
39
+ @app = test_app
40
+ end
41
+ it "should return the correct mime type for a symbol" do
42
+ @app.mime_type_for(:png).should == 'image/png'
43
+ end
44
+ it "should work for strings" do
45
+ @app.mime_type_for('png').should == 'image/png'
46
+ end
47
+ it "should work with uppercase strings" do
48
+ @app.mime_type_for('PNG').should == 'image/png'
49
+ end
50
+ it "should work with a dot" do
51
+ @app.mime_type_for('.png').should == 'image/png'
52
+ end
53
+ it "should return nil if not known" do
54
+ @app.mime_type_for(:mark).should be_nil
55
+ end
56
+ it "should allow for configuring extra mime types" do
57
+ @app.register_mime_type 'mark', 'application/mark'
58
+ @app.mime_type_for(:mark).should == 'application/mark'
59
+ end
60
+ it "should override existing mime types when registered" do
61
+ @app.register_mime_type :png, 'ping/pong'
62
+ @app.mime_type_for(:png).should == 'ping/pong'
63
+ end
64
+ it "should have a per-app mime-type configuration" do
65
+ other_app = Dragonfly[:other_app]
66
+ @app.register_mime_type(:mark, 'first/one')
67
+ other_app.register_mime_type(:mark, 'second/one')
68
+ @app.mime_type_for(:mark).should == 'first/one'
69
+ other_app.mime_type_for(:mark).should == 'second/one'
70
+ end
71
+ end
72
+
73
+ describe "#resolve_mime_type" do
74
+ before(:each) do
75
+ @app = test_app
76
+ @app.analyser.add :format do |temp_object|
77
+ :png
78
+ end
79
+ @app.analyser.add :mime_type do |temp_object|
80
+ 'image/jpeg'
81
+ end
82
+ @app.encoder.add do |temp_object|
83
+ 'ENCODED DATA YO'
84
+ end
85
+ end
86
+
87
+ it "should return the correct mime_type if the temp_object has a format" do
88
+ temp_object = Dragonfly::TempObject.new("HIMATE", :format => :tiff, :name => 'test.pdf')
89
+ @app.resolve_mime_type(temp_object).should == 'image/tiff'
90
+ end
91
+
92
+ it "should use the file extension if it has no format" do
93
+ temp_object = Dragonfly::TempObject.new("HIMATE", :name => 'test.pdf')
94
+ @app.resolve_mime_type(temp_object).should == 'application/pdf'
95
+ end
96
+
97
+ it "should not use the file extension if it's been switched off (fall back to mime_type analyser)" do
98
+ @app.infer_mime_type_from_file_ext = false
99
+ temp_object = Dragonfly::TempObject.new("HIMATE", :name => 'test.pdf')
100
+ @app.resolve_mime_type(temp_object).should == 'image/jpeg'
101
+ end
102
+
103
+ it "should fall back to the mime_type analyser if the temp_object has no ext" do
104
+ temp_object = Dragonfly::TempObject.new("HIMATE", :name => 'test')
105
+ @app.resolve_mime_type(temp_object).should == 'image/jpeg'
106
+ end
107
+
108
+ describe "when the temp_object has no name" do
109
+
110
+ before(:each) do
111
+ @temp_object = Dragonfly::TempObject.new("HIMATE")
112
+ end
113
+
114
+ it "should fall back to the mime_type analyser" do
115
+ @app.resolve_mime_type(@temp_object).should == 'image/jpeg'
116
+ end
117
+
118
+ it "should fall back to the format analyser if the mime_type analyser doesn't exist" do
119
+ @app.analyser.functions.delete(:mime_type)
120
+ @app.resolve_mime_type(@temp_object).should == 'image/png'
121
+ end
122
+
123
+ it "should fall back to the app's fallback mime_type if no mime_type/format analyser exists" do
124
+ @app.analyser.functions.delete(:mime_type)
125
+ @app.analyser.functions.delete(:format)
126
+ @app.resolve_mime_type(@temp_object).should == 'application/octet-stream'
127
+ end
128
+
129
+ end
130
+
131
+ end
132
+
133
+ end
134
+
135
+ describe "without path prefix or DOS protection" do
136
+ before(:each) do
137
+ @app = test_app
138
+ @job = Dragonfly::Job.new(@app).fetch('some_uid')
139
+ @app.datastore.stub!(:retrieve).with('some_uid').and_return "Hi there"
140
+ @app.configure{|c| c.protect_from_dos_attacks = false }
141
+ end
142
+ it "should correctly respond with the job data" do
143
+ response = request(@app, "/#{@job.serialize}")
144
+ response.status.should == 200
145
+ response.body.should == "Hi there"
146
+ end
147
+ it "should generate the correct url" do
148
+ @app.url_for(@job).should == "/#{@job.serialize}"
149
+ end
150
+ end
151
+
152
+ describe "url_path_prefix" do
153
+ before(:each) do
154
+ @app = test_app
155
+ @job = Dragonfly::Job.new(@app)
156
+ end
157
+ it "should add the path prefix to the url if configured" do
158
+ @app.url_path_prefix = '/media'
159
+ @app.url_for(@job).should =~ %r{^/media/\w+$}
160
+ end
161
+ it "should add the path prefix to the url if passed in" do
162
+ @app.url_for(@job, :path_prefix => '/eggs').should =~ %r{^/eggs/\w+$}
163
+ end
164
+ it "should favour the passed in one" do
165
+ @app.url_path_prefix = '/media'
166
+ @app.url_for(@job, :path_prefix => '/bacon').should =~ %r{^/bacon/\w+$}
167
+ end
168
+ end
169
+
170
+ describe "url_host" do
171
+ before(:each) do
172
+ @app = test_app
173
+ @job = Dragonfly::Job.new(@app)
174
+ end
175
+ it "should add the host to the url if configured" do
176
+ @app.url_host = 'http://some.server:4000'
177
+ @app.url_for(@job).should =~ %r{^http://some\.server:4000/\w+$}
178
+ end
179
+ it "should add the host to the url if passed in" do
180
+ @app.url_for(@job, :host => 'https://bungle.com').should =~ %r{^https://bungle\.com/\w+$}
181
+ end
182
+ it "should favour the passed in one" do
183
+ @app.url_host = 'http://some.server:4000'
184
+ @app.url_for(@job, :host => 'https://smeedy').should =~ %r{^https://smeedy/\w+$}
185
+ end
186
+ end
187
+
188
+ describe "url_suffix" do
189
+ before(:each) do
190
+ @app = test_app
191
+ @job = Dragonfly::Job.new(@app)
192
+ end
193
+ it "should add the suffix to the url if configured" do
194
+ @app.url_suffix = 'hellodudes'
195
+ @app.url_for(@job).should =~ /\w+hellodudes$/
196
+ end
197
+ it "should add the suffix to the url if passed in" do
198
+ @app.url_for(@job, :suffix => '/howdy.pardner').should =~ /\w+\/howdy\.pardner$/
199
+ end
200
+ it "should favour the passed in one" do
201
+ @app.url_suffix = 'hellodudes'
202
+ @app.url_for(@job, :suffix => '/howdy.pardner').should =~ /\w+\/howdy\.pardner$/
203
+ end
204
+ it "should accept a proc yielding the job" do
205
+ @app.url_suffix = proc{|job| job.uid }
206
+ @job.fetch!('some_uid')
207
+ @app.url_for(@job).should =~ /\w+some_uid$/
208
+ end
209
+ end
210
+
211
+ describe "url params" do
212
+ before(:each) do
213
+ @app = test_app
214
+ @job = Dragonfly::Job.new(@app)
215
+ end
216
+ it "should add extra params to the url query string" do
217
+ @app.url_for(@job, :suffix => '/suffix', :a => 'thing', :b => 'nuther').should =~ /\w+\/suffix\?a=thing&b=nuther$/
218
+ end
219
+ end
220
+
221
+ describe "Denial of Service protection" do
222
+ before(:each) do
223
+ @app = test_app
224
+ @app.protect_from_dos_attacks = true
225
+ @job = Dragonfly::Job.new(@app).fetch('some_uid')
226
+ end
227
+ it "should generate the correct url" do
228
+ @app.url_for(@job).should == "/#{@job.serialize}?s=#{@job.sha}"
229
+ end
230
+ end
231
+
232
+ describe "configuring with saved configurations" do
233
+ before(:each) do
234
+ @app = test_app
235
+ end
236
+
237
+ {
238
+ :imagemagick => Dragonfly::Config::ImageMagick,
239
+ :image_magick => Dragonfly::Config::ImageMagick,
240
+ :rmagick => Dragonfly::Config::RMagick,
241
+ :r_magick => Dragonfly::Config::RMagick,
242
+ :rails => Dragonfly::Config::Rails,
243
+ :heroku => Dragonfly::Config::Heroku,
244
+ }.each do |key, klass|
245
+ it "should map #{key} to #{klass}" do
246
+ klass.should_receive(:apply_configuration).with(@app)
247
+ @app.configure_with(key)
248
+ end
249
+ end
250
+
251
+ it "should description" do
252
+ lambda {
253
+ @app.configure_with(:eggs)
254
+ }.should raise_error(ArgumentError)
255
+ end
256
+ end
257
+
258
+ describe "#store" do
259
+ before(:each) do
260
+ @app = test_app
261
+ end
262
+ it "should allow just storing content" do
263
+ @app.datastore.should_receive(:store).with(a_temp_object_with_data("HELLO"), {})
264
+ @app.store("HELLO")
265
+ end
266
+ it "should allow storing using a TempObject" do
267
+ temp_object = Dragonfly::TempObject.new("HELLO")
268
+ @app.datastore.should_receive(:store).with(temp_object, {})
269
+ @app.store(temp_object)
270
+ end
271
+ it "should allow storing with extra stuff" do
272
+ @app.datastore.should_receive(:store).with(
273
+ a_temp_object_with_data("HELLO", :meta => {:egg => :head}),
274
+ {:option => :blarney}
275
+ )
276
+ @app.store("HELLO", :meta => {:egg => :head}, :option => :blarney)
277
+ end
278
+ end
279
+
280
+ end