dragonfly 0.1.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of dragonfly might be problematic. Click here for more details.

Files changed (75) hide show
  1. data/.gitignore +7 -0
  2. data/LICENSE +20 -0
  3. data/README.markdown +95 -0
  4. data/Rakefile +60 -0
  5. data/VERSION +1 -0
  6. data/config.rb +7 -0
  7. data/config.ru +10 -0
  8. data/dragonfly-rails.gemspec +41 -0
  9. data/dragonfly.gemspec +137 -0
  10. data/features/dragonfly.feature +38 -0
  11. data/features/steps/common_steps.rb +8 -0
  12. data/features/steps/dragonfly_steps.rb +39 -0
  13. data/features/support/env.rb +25 -0
  14. data/features/support/image_helpers.rb +9 -0
  15. data/generators/dragonfly_app/USAGE +16 -0
  16. data/generators/dragonfly_app/dragonfly_app_generator.rb +54 -0
  17. data/generators/dragonfly_app/templates/custom_processing.erb +13 -0
  18. data/generators/dragonfly_app/templates/initializer.erb +7 -0
  19. data/generators/dragonfly_app/templates/metal_file.erb +32 -0
  20. data/irbrc.rb +20 -0
  21. data/lib/dragonfly/active_record_extensions/attachment.rb +117 -0
  22. data/lib/dragonfly/active_record_extensions/class_methods.rb +41 -0
  23. data/lib/dragonfly/active_record_extensions/instance_methods.rb +28 -0
  24. data/lib/dragonfly/active_record_extensions/validations.rb +19 -0
  25. data/lib/dragonfly/active_record_extensions.rb +12 -0
  26. data/lib/dragonfly/analysis/analyser.rb +45 -0
  27. data/lib/dragonfly/analysis/base.rb +10 -0
  28. data/lib/dragonfly/analysis/r_magick_analyser.rb +40 -0
  29. data/lib/dragonfly/app.rb +85 -0
  30. data/lib/dragonfly/app_configuration.rb +9 -0
  31. data/lib/dragonfly/configurable.rb +113 -0
  32. data/lib/dragonfly/core_ext/object.rb +8 -0
  33. data/lib/dragonfly/data_storage/base.rb +19 -0
  34. data/lib/dragonfly/data_storage/file_data_store.rb +72 -0
  35. data/lib/dragonfly/data_storage.rb +9 -0
  36. data/lib/dragonfly/encoding/base.rb +13 -0
  37. data/lib/dragonfly/encoding/r_magick_encoder.rb +17 -0
  38. data/lib/dragonfly/extended_temp_object.rb +94 -0
  39. data/lib/dragonfly/middleware.rb +27 -0
  40. data/lib/dragonfly/parameters.rb +152 -0
  41. data/lib/dragonfly/processing/processor.rb +14 -0
  42. data/lib/dragonfly/processing/r_magick_processor.rb +71 -0
  43. data/lib/dragonfly/r_magick_configuration.rb +47 -0
  44. data/lib/dragonfly/rails/images.rb +20 -0
  45. data/lib/dragonfly/temp_object.rb +118 -0
  46. data/lib/dragonfly/url_handler.rb +148 -0
  47. data/lib/dragonfly.rb +33 -0
  48. data/samples/beach.png +0 -0
  49. data/samples/egg.png +0 -0
  50. data/samples/round.gif +0 -0
  51. data/samples/taj.jpg +0 -0
  52. data/spec/argument_matchers.rb +29 -0
  53. data/spec/dragonfly/active_record_extensions/attachment_spec.rb +8 -0
  54. data/spec/dragonfly/active_record_extensions/initializer.rb +1 -0
  55. data/spec/dragonfly/active_record_extensions/migration.rb +21 -0
  56. data/spec/dragonfly/active_record_extensions/model_spec.rb +400 -0
  57. data/spec/dragonfly/active_record_extensions/models.rb +2 -0
  58. data/spec/dragonfly/active_record_extensions/spec_helper.rb +23 -0
  59. data/spec/dragonfly/analysis/analyser_spec.rb +85 -0
  60. data/spec/dragonfly/analysis/r_magick_analyser_spec.rb +35 -0
  61. data/spec/dragonfly/app_spec.rb +69 -0
  62. data/spec/dragonfly/configurable_spec.rb +193 -0
  63. data/spec/dragonfly/data_storage/data_store_spec.rb +47 -0
  64. data/spec/dragonfly/data_storage/file_data_store_spec.rb +93 -0
  65. data/spec/dragonfly/extended_temp_object_spec.rb +67 -0
  66. data/spec/dragonfly/middleware_spec.rb +44 -0
  67. data/spec/dragonfly/parameters_spec.rb +293 -0
  68. data/spec/dragonfly/processing/rmagick_processor_spec.rb +148 -0
  69. data/spec/dragonfly/temp_object_spec.rb +233 -0
  70. data/spec/dragonfly/url_handler_spec.rb +246 -0
  71. data/spec/dragonfly_spec.rb +4 -0
  72. data/spec/image_matchers.rb +31 -0
  73. data/spec/simple_matchers.rb +14 -0
  74. data/spec/spec_helper.rb +19 -0
  75. metadata +160 -0
@@ -0,0 +1,246 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe Dragonfly::UrlHandler do
4
+
5
+ before(:each) do
6
+ @url_handler = Dragonfly::UrlHandler.new
7
+ end
8
+
9
+ describe "extracting parameters from the url" do
10
+
11
+ before(:each) do
12
+ @url_handler.configure{|c| c.protect_from_dos_attacks = false}
13
+ @path = "/images/some_image.jpg"
14
+ @query_string = "m=b&o[d]=e&o[j]=k&e[l]=m"
15
+ @parameters = @url_handler.url_to_parameters(@path, @query_string)
16
+ end
17
+
18
+ it "should correctly extract the uid" do
19
+ @parameters.uid.should == 'images/some_image'
20
+ end
21
+
22
+ it "should behave the same if there is no beginning slash" do
23
+ parameters = @url_handler.url_to_parameters('images/some_image.jpg', @query_string)
24
+ parameters.uid.should == 'images/some_image'
25
+ end
26
+
27
+ it "should take into account the path prefix if there is one" do
28
+ @url_handler.path_prefix = '/images'
29
+ parameters = @url_handler.url_to_parameters('/images/2009/some_image.jpg', @query_string)
30
+ parameters.uid.should == '2009/some_image'
31
+ end
32
+
33
+ it "should raise an UnknownUrl error if the url doesn't have the path prefix" do
34
+ @url_handler.path_prefix = '/images'
35
+ lambda{
36
+ parameters = @url_handler.url_to_parameters('/wrongprefix/2009/some_image.jpg', @query_string)
37
+ }.should raise_error(Dragonfly::UrlHandler::UnknownUrl)
38
+ end
39
+
40
+ it "should correctly extract the format" do
41
+ @parameters.format.should == 'jpg'
42
+ end
43
+
44
+ it "should correctly extract the processing method" do
45
+ @parameters.processing_method.should == 'b'
46
+ end
47
+
48
+ it "should correctly extract the processing_options" do
49
+ @parameters.processing_options.should == {:j => 'k', :d => 'e'}
50
+ end
51
+
52
+ it "should correctly extract the encoding" do
53
+ @parameters.encoding.should == {:l => 'm'}
54
+ end
55
+
56
+ it "should have processing_options and encoding as optional" do
57
+ parameters = @url_handler.url_to_parameters(@path, 'm=b')
58
+ parameters.processing_options.should == {}
59
+ parameters.encoding.should == {}
60
+ end
61
+
62
+ it "should use the parameters class passed in if initialized with one" do
63
+ parameters_class = mock('parameters_class')
64
+ url_handler = Dragonfly::UrlHandler.new(parameters_class)
65
+ url_handler.stub!(:validate_parameters)
66
+ parameters_class.should_receive(:new)
67
+ url_handler.url_to_parameters(@path, @query_string)
68
+ end
69
+
70
+ it "should raise an UnknownUrl error if the path doesn't have an extension" do
71
+ lambda{
72
+ @url_handler.url_to_parameters('hello', @query_string)
73
+ }.should raise_error(Dragonfly::UrlHandler::UnknownUrl)
74
+ end
75
+
76
+ it "should raise an UnknownUrl error if the path doesn't have a uid bit" do
77
+ lambda{
78
+ @url_handler.url_to_parameters('.hello', @query_string)
79
+ }.should raise_error(Dragonfly::UrlHandler::UnknownUrl)
80
+ end
81
+
82
+ it "should raise an UnknownUrl error if the path is only slashes" do
83
+ lambda{
84
+ @url_handler.url_to_parameters('/./', @query_string)
85
+ }.should raise_error(Dragonfly::UrlHandler::UnknownUrl)
86
+ end
87
+
88
+ it "should set most of the path as the uid if there is more than one dot" do
89
+ parameters = @url_handler.url_to_parameters('hello.old.bean', @query_string)
90
+ parameters.uid.should == 'hello.old'
91
+ parameters.format.should == 'bean'
92
+ end
93
+
94
+ end
95
+
96
+ describe "forming a url from parameters" do
97
+ before(:each) do
98
+ @parameters = Dragonfly::Parameters.new
99
+ @parameters.uid = 'thisisunique'
100
+ @parameters.processing_method = 'b'
101
+ @parameters.processing_options = {:d => 'e', :j => 'k'}
102
+ @parameters.format = :gif
103
+ @parameters.encoding = {:x => 'y'}
104
+ @url_handler.configure{|c| c.protect_from_dos_attacks = false}
105
+ end
106
+ it "should correctly form a query string" do
107
+ @url_handler.parameters_to_url(@parameters).should match_url('/thisisunique.gif?m=b&o[d]=e&o[j]=k&e[x]=y')
108
+ end
109
+ it "should correctly form a query string when dos protection turned on" do
110
+ @url_handler.configure{|c| c.protect_from_dos_attacks = true}
111
+ @parameters.should_receive(:generate_sha).and_return('thisismysha12345')
112
+ @url_handler.parameters_to_url(@parameters).should match_url('/thisisunique.gif?m=b&o[d]=e&o[j]=k&e[x]=y&s=thisismysha12345')
113
+ end
114
+ it "should leave out any nil parameters" do
115
+ @parameters.processing_method = nil
116
+ @url_handler.parameters_to_url(@parameters).should match_url('/thisisunique.gif?o[d]=e&o[j]=k&e[x]=y')
117
+ end
118
+ it "should leave out any empty parameters" do
119
+ @parameters.processing_options = {}
120
+ @url_handler.parameters_to_url(@parameters).should match_url('/thisisunique.gif?m=b&e[x]=y')
121
+ end
122
+ it "should prefix with the path_prefix if there is one" do
123
+ @url_handler.path_prefix = '/images'
124
+ @url_handler.parameters_to_url(@parameters).should match_url('/images/thisisunique.gif?m=b&o[d]=e&o[j]=k&e[x]=y')
125
+ end
126
+ it "should validate the parameters" do
127
+ @parameters.should_receive(:validate!)
128
+ @url_handler.parameters_to_url(@parameters)
129
+ end
130
+ it "should escape any non-url friendly characters except for '/'" do
131
+ parameters = Dragonfly::Parameters.new :uid => 'hello/u"u', :processing_method => 'm"m', :format => 'jpg'
132
+ @url_handler.parameters_to_url(parameters).should == '/hello/u%22u.jpg?m=m%22m'
133
+ end
134
+ end
135
+
136
+ describe "protecting from DOS attacks with SHA" do
137
+
138
+ before(:each) do
139
+ @url_handler.configure{|c|
140
+ c.protect_from_dos_attacks = true
141
+ c.secret = 'secret'
142
+ c.sha_length = 16
143
+ }
144
+ @path = "/images/some_image.jpg"
145
+ @query_string = "m=b&o[d]=e&o[j]=k"
146
+ @parameters = Dragonfly::Parameters.new
147
+ Dragonfly::Parameters.stub!(:new).and_return(@parameters)
148
+ end
149
+
150
+ it "should return the parameters as normal if the sha is ok" do
151
+ @parameters.should_receive(:generate_sha).with('secret', 16).and_return('thisismysha12345')
152
+ lambda{
153
+ @url_handler.url_to_parameters(@path, "#{@query_string}&s=thisismysha12345")
154
+ }.should_not raise_error
155
+ end
156
+
157
+ it "should raise an error if the sha is incorrect" do
158
+ @parameters.should_receive(:generate_sha).with('secret', 16).and_return('thisismysha12345')
159
+ lambda{
160
+ @url_handler.url_to_parameters(@path, "#{@query_string}&s=heyNOTmysha12345")
161
+ }.should raise_error(Dragonfly::UrlHandler::IncorrectSHA)
162
+ end
163
+
164
+ it "should raise an error if the sha isn't given" do
165
+ lambda{
166
+ @url_handler.url_to_parameters(@path, @query_string)
167
+ }.should raise_error(Dragonfly::UrlHandler::SHANotGiven)
168
+ end
169
+
170
+ describe "specifying the SHA length" do
171
+
172
+ before(:each) do
173
+ @url_handler.configure{|c|
174
+ c.sha_length = 3
175
+ }
176
+ Digest::SHA1.should_receive(:hexdigest).and_return("thisismysha12345")
177
+ end
178
+
179
+ it "should use a SHA of the specified length" do
180
+ lambda{
181
+ @url_handler.url_to_parameters(@path, "#{@query_string}&s=thi")
182
+ }.should_not raise_error
183
+ end
184
+
185
+ it "should raise an error if the SHA is correct but too long" do
186
+ lambda{
187
+ @url_handler.url_to_parameters(@path, "#{@query_string}&s=this")
188
+ }.should raise_error(Dragonfly::UrlHandler::IncorrectSHA)
189
+ end
190
+
191
+ it "should raise an error if the SHA is correct but too short" do
192
+ lambda{
193
+ @url_handler.url_to_parameters(@path, "#{@query_string}&s=th")
194
+ }.should raise_error(Dragonfly::UrlHandler::IncorrectSHA)
195
+ end
196
+
197
+ end
198
+
199
+ it "should use the secret given to create the sha" do
200
+ @url_handler.configure{|c| c.secret = 'digby' }
201
+ Digest::SHA1.should_receive(:hexdigest).with(string_matching(/digby/)).and_return('thisismysha12345')
202
+ @url_handler.url_to_parameters(@path, "#{@query_string}&s=thisismysha12345")
203
+ end
204
+
205
+ end
206
+
207
+ describe "#url_for" do
208
+
209
+ it "should pass parameters from Parameter.from_args plus the uid to parameters_to_url" do
210
+ parameters_class = Class.new(Dragonfly::Parameters)
211
+ url_handler = Dragonfly::UrlHandler.new(parameters_class)
212
+ parameters_class.should_receive(:from_args).with(:a, :b, :c).and_return parameters_class.new(:processing_method => :resize)
213
+ url_handler.should_receive(:parameters_to_url).with(parameters_matching(:processing_method => :resize, :uid => 'some_uid')).and_return 'some.url'
214
+ url_handler.url_for('some_uid', :a, :b, :c)
215
+ end
216
+
217
+ end
218
+
219
+ describe "sanity check" do
220
+ it "parameters_to_url should exactly reverse map url_to_parameters" do
221
+ Digest::SHA1.should_receive(:hexdigest).exactly(:twice).and_return('thisismysha12345')
222
+ path = "/images/some_image.gif"
223
+ query_string = "m=b&o[d]=e&o[j]=k&e[l]=m&s=thisismysha12345"
224
+ parameters = @url_handler.url_to_parameters(path, query_string)
225
+ @url_handler.parameters_to_url(parameters).should match_url("#{path}?#{query_string}")
226
+ end
227
+
228
+ it "url_to_parameters should exactly reverse map parameters_to_url" do
229
+ @url_handler.configure{|c| c.protect_from_dos_attacks = true}
230
+ parameters = Dragonfly::Parameters.new(
231
+ :processing_method => 'b',
232
+ :processing_options => {
233
+ :d => 'e',
234
+ :j => 'k'
235
+ },
236
+ :format => 'jpg',
237
+ :encoding => {:x => 'y'},
238
+ :uid => 'thisisunique'
239
+ )
240
+
241
+ url = @url_handler.parameters_to_url(parameters)
242
+ @url_handler.url_to_parameters(*url.split('?')).should == parameters
243
+ end
244
+ end
245
+
246
+ end
@@ -0,0 +1,4 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ describe "Dragonfly" do
4
+ end
@@ -0,0 +1,31 @@
1
+ def image_properties(data)
2
+ tempfile = Tempfile.new('image')
3
+ tempfile.write(data)
4
+ tempfile.close
5
+ details = `identify #{tempfile.path}`
6
+ # example of details string:
7
+ # myimage.png PNG 200x100 200x100+0+0 8-bit DirectClass 31.2kb
8
+ filename, format, geometry, geometry_2, depth, image_class, size = details.split(' ')
9
+ width, height = geometry.split('x')
10
+ {
11
+ :filename => filename,
12
+ :format => format.downcase,
13
+ :width => width,
14
+ :height => height,
15
+ :depth => depth,
16
+ :image_class => image_class,
17
+ :size => size
18
+ }
19
+ end
20
+
21
+ def have_width(width)
22
+ simple_matcher("have width #{width}"){|given| image_properties(given)[:width].to_i.should == width }
23
+ end
24
+
25
+ def have_height(height)
26
+ simple_matcher("have height #{height}"){|given| image_properties(given)[:height].to_i.should == height }
27
+ end
28
+
29
+ def have_format(format)
30
+ simple_matcher("have format #{format}"){|given| image_properties(given)[:format].should == format }
31
+ end
@@ -0,0 +1,14 @@
1
+ def match_url(url)
2
+ simple_matcher("match url #{url}") do |given|
3
+ given_path, given_query_string = given.split('?')
4
+ path, query_string = url.split('?')
5
+
6
+ path == given_path && given_query_string.split('&').sort == query_string.split('&').sort
7
+ end
8
+ end
9
+
10
+ def be_an_empty_directory
11
+ simple_matcher("be empty") do |given|
12
+ Dir.entries(given) == ['.','..']
13
+ end
14
+ end
@@ -0,0 +1,19 @@
1
+ require 'spec'
2
+ require 'rubygems'
3
+ require 'ruby-debug'
4
+
5
+ require File.dirname(__FILE__) + '/../lib/dragonfly'
6
+ $:.unshift(File.dirname(__FILE__))
7
+ require 'argument_matchers'
8
+ require 'simple_matchers'
9
+ require 'image_matchers'
10
+
11
+ SAMPLES_DIR = File.expand_path(File.dirname(__FILE__) + '/../samples') unless defined?(SAMPLES_DIR)
12
+
13
+ Spec::Runner.configure do |config|
14
+
15
+ end
16
+
17
+ def todo
18
+ raise "TODO"
19
+ end
metadata ADDED
@@ -0,0 +1,160 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dragonfly
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Mark Evans
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-11-09 00:00:00 +00:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: rack
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0"
24
+ version:
25
+ description:
26
+ email: mark@new-bamboo.co.uk
27
+ executables: []
28
+
29
+ extensions: []
30
+
31
+ extra_rdoc_files:
32
+ - LICENSE
33
+ - README.markdown
34
+ files:
35
+ - .gitignore
36
+ - LICENSE
37
+ - README.markdown
38
+ - Rakefile
39
+ - VERSION
40
+ - config.rb
41
+ - config.ru
42
+ - dragonfly-rails.gemspec
43
+ - dragonfly.gemspec
44
+ - features/dragonfly.feature
45
+ - features/steps/common_steps.rb
46
+ - features/steps/dragonfly_steps.rb
47
+ - features/support/env.rb
48
+ - features/support/image_helpers.rb
49
+ - generators/dragonfly_app/USAGE
50
+ - generators/dragonfly_app/dragonfly_app_generator.rb
51
+ - generators/dragonfly_app/templates/custom_processing.erb
52
+ - generators/dragonfly_app/templates/initializer.erb
53
+ - generators/dragonfly_app/templates/metal_file.erb
54
+ - irbrc.rb
55
+ - lib/dragonfly.rb
56
+ - lib/dragonfly/active_record_extensions.rb
57
+ - lib/dragonfly/active_record_extensions/attachment.rb
58
+ - lib/dragonfly/active_record_extensions/class_methods.rb
59
+ - lib/dragonfly/active_record_extensions/instance_methods.rb
60
+ - lib/dragonfly/active_record_extensions/validations.rb
61
+ - lib/dragonfly/analysis/analyser.rb
62
+ - lib/dragonfly/analysis/base.rb
63
+ - lib/dragonfly/analysis/r_magick_analyser.rb
64
+ - lib/dragonfly/app.rb
65
+ - lib/dragonfly/app_configuration.rb
66
+ - lib/dragonfly/configurable.rb
67
+ - lib/dragonfly/core_ext/object.rb
68
+ - lib/dragonfly/data_storage.rb
69
+ - lib/dragonfly/data_storage/base.rb
70
+ - lib/dragonfly/data_storage/file_data_store.rb
71
+ - lib/dragonfly/encoding/base.rb
72
+ - lib/dragonfly/encoding/r_magick_encoder.rb
73
+ - lib/dragonfly/extended_temp_object.rb
74
+ - lib/dragonfly/middleware.rb
75
+ - lib/dragonfly/parameters.rb
76
+ - lib/dragonfly/processing/processor.rb
77
+ - lib/dragonfly/processing/r_magick_processor.rb
78
+ - lib/dragonfly/r_magick_configuration.rb
79
+ - lib/dragonfly/rails/images.rb
80
+ - lib/dragonfly/temp_object.rb
81
+ - lib/dragonfly/url_handler.rb
82
+ - samples/beach.png
83
+ - samples/egg.png
84
+ - samples/round.gif
85
+ - samples/taj.jpg
86
+ - spec/argument_matchers.rb
87
+ - spec/dragonfly/active_record_extensions/attachment_spec.rb
88
+ - spec/dragonfly/active_record_extensions/initializer.rb
89
+ - spec/dragonfly/active_record_extensions/migration.rb
90
+ - spec/dragonfly/active_record_extensions/model_spec.rb
91
+ - spec/dragonfly/active_record_extensions/models.rb
92
+ - spec/dragonfly/active_record_extensions/spec_helper.rb
93
+ - spec/dragonfly/analysis/analyser_spec.rb
94
+ - spec/dragonfly/analysis/r_magick_analyser_spec.rb
95
+ - spec/dragonfly/app_spec.rb
96
+ - spec/dragonfly/configurable_spec.rb
97
+ - spec/dragonfly/data_storage/data_store_spec.rb
98
+ - spec/dragonfly/data_storage/file_data_store_spec.rb
99
+ - spec/dragonfly/extended_temp_object_spec.rb
100
+ - spec/dragonfly/middleware_spec.rb
101
+ - spec/dragonfly/parameters_spec.rb
102
+ - spec/dragonfly/processing/rmagick_processor_spec.rb
103
+ - spec/dragonfly/temp_object_spec.rb
104
+ - spec/dragonfly/url_handler_spec.rb
105
+ - spec/dragonfly_spec.rb
106
+ - spec/image_matchers.rb
107
+ - spec/simple_matchers.rb
108
+ - spec/spec_helper.rb
109
+ has_rdoc: true
110
+ homepage: http://github.com/markevans/dragonfly
111
+ licenses: []
112
+
113
+ post_install_message:
114
+ rdoc_options:
115
+ - --charset=UTF-8
116
+ require_paths:
117
+ - lib
118
+ required_ruby_version: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - ">="
121
+ - !ruby/object:Gem::Version
122
+ version: "0"
123
+ version:
124
+ required_rubygems_version: !ruby/object:Gem::Requirement
125
+ requirements:
126
+ - - ">="
127
+ - !ruby/object:Gem::Version
128
+ version: "0"
129
+ version:
130
+ requirements: []
131
+
132
+ rubyforge_project:
133
+ rubygems_version: 1.3.5
134
+ signing_key:
135
+ specification_version: 3
136
+ summary: dragonfly is an on-the-fly processing/encoding framework written as a Rack application. It includes an extension for Ruby on Rails to enable easy image handling
137
+ test_files:
138
+ - spec/argument_matchers.rb
139
+ - spec/dragonfly/active_record_extensions/attachment_spec.rb
140
+ - spec/dragonfly/active_record_extensions/initializer.rb
141
+ - spec/dragonfly/active_record_extensions/migration.rb
142
+ - spec/dragonfly/active_record_extensions/model_spec.rb
143
+ - spec/dragonfly/active_record_extensions/models.rb
144
+ - spec/dragonfly/active_record_extensions/spec_helper.rb
145
+ - spec/dragonfly/analysis/analyser_spec.rb
146
+ - spec/dragonfly/analysis/r_magick_analyser_spec.rb
147
+ - spec/dragonfly/app_spec.rb
148
+ - spec/dragonfly/configurable_spec.rb
149
+ - spec/dragonfly/data_storage/data_store_spec.rb
150
+ - spec/dragonfly/data_storage/file_data_store_spec.rb
151
+ - spec/dragonfly/extended_temp_object_spec.rb
152
+ - spec/dragonfly/middleware_spec.rb
153
+ - spec/dragonfly/parameters_spec.rb
154
+ - spec/dragonfly/processing/rmagick_processor_spec.rb
155
+ - spec/dragonfly/temp_object_spec.rb
156
+ - spec/dragonfly/url_handler_spec.rb
157
+ - spec/dragonfly_spec.rb
158
+ - spec/image_matchers.rb
159
+ - spec/simple_matchers.rb
160
+ - spec/spec_helper.rb