futuresinc-attachment_fu 1.0.4

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 (51) hide show
  1. data/.gitignore +4 -0
  2. data/CHANGELOG +35 -0
  3. data/LICENSE +20 -0
  4. data/README +202 -0
  5. data/Rakefile +37 -0
  6. data/VERSION.yml +4 -0
  7. data/amazon_s3.yml.tpl +17 -0
  8. data/attachment_fu.gemspec +103 -0
  9. data/init.rb +1 -0
  10. data/install.rb +7 -0
  11. data/lib/geometry.rb +93 -0
  12. data/lib/technoweenie/attachment_fu/backends/cloud_file_backend.rb +211 -0
  13. data/lib/technoweenie/attachment_fu/backends/db_file_backend.rb +39 -0
  14. data/lib/technoweenie/attachment_fu/backends/file_system_backend.rb +126 -0
  15. data/lib/technoweenie/attachment_fu/backends/s3_backend.rb +394 -0
  16. data/lib/technoweenie/attachment_fu/processors/core_image_processor.rb +59 -0
  17. data/lib/technoweenie/attachment_fu/processors/gd2_processor.rb +54 -0
  18. data/lib/technoweenie/attachment_fu/processors/image_science_processor.rb +61 -0
  19. data/lib/technoweenie/attachment_fu/processors/mini_magick_processor.rb +132 -0
  20. data/lib/technoweenie/attachment_fu/processors/rmagick_processor.rb +57 -0
  21. data/lib/technoweenie/attachment_fu.rb +545 -0
  22. data/rackspace_cloudfiles.yml.tpl +14 -0
  23. data/test/backends/db_file_test.rb +16 -0
  24. data/test/backends/file_system_test.rb +143 -0
  25. data/test/backends/remote/cloudfiles_test.rb +102 -0
  26. data/test/backends/remote/s3_test.rb +119 -0
  27. data/test/base_attachment_tests.rb +77 -0
  28. data/test/basic_test.rb +70 -0
  29. data/test/database.yml +18 -0
  30. data/test/extra_attachment_test.rb +67 -0
  31. data/test/fixtures/attachment.rb +226 -0
  32. data/test/fixtures/files/fake/rails.png +0 -0
  33. data/test/fixtures/files/foo.txt +1 -0
  34. data/test/fixtures/files/rails.png +0 -0
  35. data/test/geometry_test.rb +108 -0
  36. data/test/processors/core_image_test.rb +37 -0
  37. data/test/processors/gd2_test.rb +31 -0
  38. data/test/processors/image_science_test.rb +31 -0
  39. data/test/processors/mini_magick_test.rb +103 -0
  40. data/test/processors/rmagick_test.rb +255 -0
  41. data/test/schema.rb +134 -0
  42. data/test/test_helper.rb +157 -0
  43. data/test/validation_test.rb +55 -0
  44. data/vendor/red_artisan/core_image/filters/color.rb +27 -0
  45. data/vendor/red_artisan/core_image/filters/effects.rb +31 -0
  46. data/vendor/red_artisan/core_image/filters/perspective.rb +25 -0
  47. data/vendor/red_artisan/core_image/filters/quality.rb +25 -0
  48. data/vendor/red_artisan/core_image/filters/scale.rb +47 -0
  49. data/vendor/red_artisan/core_image/filters/watermark.rb +32 -0
  50. data/vendor/red_artisan/core_image/processor.rb +123 -0
  51. metadata +119 -0
@@ -0,0 +1,255 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', 'test_helper'))
2
+
3
+ class RmagickTest < ActiveSupport::TestCase
4
+ attachment_model Attachment
5
+
6
+ if Object.const_defined?(:Magick)
7
+ def test_should_create_image_from_uploaded_file
8
+ assert_created do
9
+ attachment = upload_file :filename => '/files/rails.png'
10
+ assert_valid attachment
11
+ assert !attachment.db_file.new_record? if attachment.respond_to?(:db_file)
12
+ assert attachment.image?
13
+ assert !attachment.size.zero?
14
+ #assert_equal 1784, attachment.size
15
+ assert_equal 50, attachment.width
16
+ assert_equal 64, attachment.height
17
+ assert_equal '50x64', attachment.image_size
18
+ end
19
+ end
20
+
21
+ def test_should_create_image_from_uploaded_file_with_custom_content_type
22
+ assert_created do
23
+ attachment = upload_file :content_type => 'foo/bar', :filename => '/files/rails.png'
24
+ assert_valid attachment
25
+ assert !attachment.image?
26
+ assert !attachment.db_file.new_record? if attachment.respond_to?(:db_file)
27
+ assert !attachment.size.zero?
28
+ #assert_equal 1784, attachment.size
29
+ assert_nil attachment.width
30
+ assert_nil attachment.height
31
+ assert_equal [], attachment.thumbnails
32
+ end
33
+ end
34
+
35
+ def test_should_create_thumbnail
36
+ attachment = upload_file :filename => '/files/rails.png'
37
+
38
+ assert_created do
39
+ basename, ext = attachment.filename.split '.'
40
+ thumbnail = attachment.create_or_update_thumbnail(attachment.create_temp_file, 'thumb', 50, 50)
41
+ assert_valid thumbnail
42
+ assert !thumbnail.size.zero?
43
+ #assert_in_delta 4673, thumbnail.size, 2
44
+ assert_equal 50, thumbnail.width
45
+ assert_equal 50, thumbnail.height
46
+ assert_equal [thumbnail.id], attachment.thumbnails.collect(&:id)
47
+ assert_equal attachment.id, thumbnail.parent_id if thumbnail.respond_to?(:parent_id)
48
+ assert_equal "#{basename}_thumb.#{ext}", thumbnail.filename
49
+ end
50
+ end
51
+
52
+ def test_should_create_thumbnail_with_geometry_string
53
+ attachment = upload_file :filename => '/files/rails.png'
54
+
55
+ assert_created do
56
+ basename, ext = attachment.filename.split '.'
57
+ thumbnail = attachment.create_or_update_thumbnail(attachment.create_temp_file, 'thumb', 'x50')
58
+ assert_valid thumbnail
59
+ assert !thumbnail.size.zero?
60
+ #assert_equal 3915, thumbnail.size
61
+ assert_equal 39, thumbnail.width
62
+ assert_equal 50, thumbnail.height
63
+ assert_equal [thumbnail], attachment.thumbnails
64
+ assert_equal attachment.id, thumbnail.parent_id if thumbnail.respond_to?(:parent_id)
65
+ assert_equal "#{basename}_thumb.#{ext}", thumbnail.filename
66
+ end
67
+ end
68
+
69
+ def test_should_resize_image(klass = ImageAttachment)
70
+ attachment_model klass
71
+ assert_equal [50, 50], attachment_model.attachment_options[:resize_to]
72
+ attachment = upload_file :filename => '/files/rails.png'
73
+ assert_valid attachment
74
+ assert !attachment.db_file.new_record? if attachment.respond_to?(:db_file)
75
+ assert attachment.image?
76
+ assert !attachment.size.zero?
77
+ #assert_in_delta 4673, attachment.size, 2
78
+ assert_equal 50, attachment.width
79
+ assert_equal 50, attachment.height
80
+ end
81
+
82
+ test_against_subclass :test_should_resize_image, ImageAttachment
83
+
84
+ def test_should_resize_image_with_geometry(klass = ImageOrPdfAttachment)
85
+ attachment_model klass
86
+ assert_equal 'x50', attachment_model.attachment_options[:resize_to]
87
+ attachment = upload_file :filename => '/files/rails.png'
88
+ assert_valid attachment
89
+ assert !attachment.db_file.new_record? if attachment.respond_to?(:db_file)
90
+ assert attachment.image?
91
+ assert !attachment.size.zero?
92
+ #assert_equal 3915, attachment.size
93
+ assert_equal 39, attachment.width
94
+ assert_equal 50, attachment.height
95
+ end
96
+
97
+ test_against_subclass :test_should_resize_image_with_geometry, ImageOrPdfAttachment
98
+
99
+ def test_should_give_correct_thumbnail_filenames(klass = ImageWithThumbsFileAttachment)
100
+ attachment_model klass
101
+ assert_created 3 do
102
+ attachment = upload_file :filename => '/files/rails.png'
103
+ thumb = attachment.thumbnails.detect { |t| t.filename =~ /_thumb/ }
104
+ geo = attachment.thumbnails.detect { |t| t.filename =~ /_geometry/ }
105
+
106
+ [attachment, thumb, geo].each { |record| assert_valid record }
107
+
108
+ assert_match /rails\.png$/, attachment.full_filename
109
+ assert_match /rails_geometry\.png$/, attachment.full_filename(:geometry)
110
+ assert_match /rails_thumb\.png$/, attachment.full_filename(:thumb)
111
+ end
112
+ end
113
+
114
+ test_against_subclass :test_should_give_correct_thumbnail_filenames, ImageWithThumbsFileAttachment
115
+
116
+ def test_should_automatically_create_thumbnails(klass = ImageWithThumbsAttachment)
117
+ attachment_model klass
118
+ assert_created 3 do
119
+ attachment = upload_file :filename => '/files/rails.png'
120
+ assert_valid attachment
121
+ assert !attachment.size.zero?
122
+ #assert_equal 1784, attachment.size
123
+ assert_equal 55, attachment.width
124
+ assert_equal 55, attachment.height
125
+ assert_equal 2, attachment.thumbnails.length
126
+ assert_equal 1.0, attachment.aspect_ratio
127
+
128
+ thumb = attachment.thumbnails.detect { |t| t.filename =~ /_thumb/ }
129
+ assert !thumb.new_record?, thumb.errors.full_messages.join("\n")
130
+ assert !thumb.size.zero?
131
+ #assert_in_delta 4673, thumb.size, 2
132
+ assert_equal 50, thumb.width
133
+ assert_equal 50, thumb.height
134
+ assert_equal 1.0, thumb.aspect_ratio
135
+
136
+ geo = attachment.thumbnails.detect { |t| t.filename =~ /_geometry/ }
137
+ assert !geo.new_record?, geo.errors.full_messages.join("\n")
138
+ assert !geo.size.zero?
139
+ #assert_equal 3915, geo.size
140
+ assert_equal 50, geo.width
141
+ assert_equal 50, geo.height
142
+ assert_equal 1.0, geo.aspect_ratio
143
+ end
144
+ end
145
+
146
+ test_against_subclass :test_should_automatically_create_thumbnails, ImageWithThumbsAttachment
147
+
148
+ # same as above method, but test it on a file model
149
+ test_against_class :test_should_automatically_create_thumbnails, ImageWithThumbsFileAttachment
150
+ test_against_subclass :test_should_automatically_create_thumbnails_on_class, ImageWithThumbsFileAttachment
151
+
152
+ def test_should_use_thumbnail_subclass(klass = ImageWithThumbsClassFileAttachment)
153
+ attachment_model klass
154
+ attachment = nil
155
+ assert_difference ImageThumbnail, :count do
156
+ attachment = upload_file :filename => '/files/rails.png'
157
+ assert_valid attachment
158
+ end
159
+ assert_kind_of ImageThumbnail, attachment.thumbnails.first
160
+ if attachment.thumbnails.first.respond_to?(:parent)
161
+ assert_equal attachment.id, attachment.thumbnails.first.parent.id
162
+ assert_kind_of FileAttachment, attachment.thumbnails.first.parent
163
+ end
164
+ assert_equal 'rails_thumb.png', attachment.thumbnails.first.filename
165
+ assert_equal attachment.thumbnails.first.full_filename, attachment.full_filename(attachment.thumbnails.first.thumbnail),
166
+ "#full_filename does not use thumbnail class' path."
167
+ assert_equal attachment.destroy, attachment
168
+ end
169
+
170
+ test_against_subclass :test_should_use_thumbnail_subclass, ImageWithThumbsClassFileAttachment
171
+
172
+ def test_should_remove_old_thumbnail_files_when_updating(klass = ImageWithThumbsFileAttachment)
173
+ attachment_model klass
174
+ attachment = nil
175
+ assert_created 3 do
176
+ attachment = upload_file :filename => '/files/rails.png'
177
+ end
178
+
179
+ old_filenames = [attachment.full_filename] + attachment.thumbnails.collect(&:full_filename)
180
+
181
+ assert_not_created do
182
+ use_temp_file "files/rails.png" do |file|
183
+ attachment.filename = 'rails2.png'
184
+ attachment.temp_paths.unshift File.join(fixture_path, file)
185
+ attachment.save
186
+ new_filenames = [attachment.reload.full_filename] + attachment.thumbnails.collect { |t| t.reload.full_filename }
187
+ new_filenames.each { |f| assert File.exists?(f), "#{f} does not exist" }
188
+ old_filenames.each { |f| assert !File.exists?(f), "#{f} still exists" }
189
+ end
190
+ end
191
+ end
192
+
193
+ test_against_subclass :test_should_remove_old_thumbnail_files_when_updating, ImageWithThumbsFileAttachment
194
+
195
+ def test_should_delete_file_when_in_file_system_when_attachment_record_destroyed(klass = ImageWithThumbsFileAttachment)
196
+ attachment_model klass
197
+ attachment = upload_file :filename => '/files/rails.png'
198
+ filenames = [attachment.full_filename] + attachment.thumbnails.collect(&:full_filename)
199
+ filenames.each { |f| assert File.exists?(f), "#{f} never existed to delete on destroy" }
200
+ attachment.destroy
201
+ filenames.each { |f| assert !File.exists?(f), "#{f} still exists" }
202
+ end
203
+
204
+ test_against_subclass :test_should_delete_file_when_in_file_system_when_attachment_record_destroyed, ImageWithThumbsFileAttachment
205
+
206
+ def test_should_have_full_filename_method(klass = FileAttachment)
207
+ attachment_model klass
208
+ attachment = upload_file :filename => '/files/rails.png'
209
+ assert_respond_to attachment, :full_filename
210
+ end
211
+
212
+ test_against_subclass :test_should_have_full_filename_method, FileAttachment
213
+
214
+ def test_should_overwrite_old_thumbnail_records_when_updating(klass = ImageWithThumbsAttachment)
215
+ attachment_model klass
216
+ attachment = nil
217
+ assert_created 3 do
218
+ attachment = upload_file :filename => '/files/rails.png'
219
+ end
220
+ assert_not_created do # no new db_file records
221
+ use_temp_file "files/rails.png" do |file|
222
+ attachment.filename = 'rails2.png'
223
+ # The above test (#test_should_have_full_filename_method) to pass before be can set the temp_path below --
224
+ # #temp_path calls #full_filename, which is not getting mixed into the attachment. Maybe we don't need to
225
+ # set temp_path at all?
226
+ #
227
+ # attachment.temp_paths.unshift File.join(fixture_path, file)
228
+ attachment.save!
229
+ end
230
+ end
231
+ end
232
+
233
+ test_against_subclass :test_should_overwrite_old_thumbnail_records_when_updating, ImageWithThumbsAttachment
234
+
235
+ def test_should_overwrite_old_thumbnail_records_when_renaming(klass = ImageWithThumbsAttachment)
236
+ attachment_model klass
237
+ attachment = nil
238
+ assert_created 3 do
239
+ attachment = upload_file :class => klass, :filename => '/files/rails.png'
240
+ end
241
+ assert_not_created do # no new db_file records
242
+ attachment.filename = 'rails2.png'
243
+ attachment.save
244
+ assert !attachment.reload.size.zero?
245
+ assert_equal 'rails2.png', attachment.filename
246
+ end
247
+ end
248
+
249
+ test_against_subclass :test_should_overwrite_old_thumbnail_records_when_renaming, ImageWithThumbsAttachment
250
+ else
251
+ def test_flunk
252
+ puts "RMagick not installed, no tests running"
253
+ end
254
+ end
255
+ end
data/test/schema.rb ADDED
@@ -0,0 +1,134 @@
1
+ ActiveRecord::Schema.define(:version => 0) do
2
+ create_table :attachments, :force => true do |t|
3
+ t.column :db_file_id, :integer
4
+ t.column :parent_id, :integer
5
+ t.column :thumbnail, :string
6
+ t.column :filename, :string, :limit => 255
7
+ t.column :content_type, :string, :limit => 255
8
+ t.column :size, :integer
9
+ t.column :width, :integer
10
+ t.column :height, :integer
11
+ t.column :aspect_ratio, :float
12
+ end
13
+
14
+ create_table :file_attachments, :force => true do |t|
15
+ t.column :parent_id, :integer
16
+ t.column :thumbnail, :string
17
+ t.column :filename, :string, :limit => 255
18
+ t.column :content_type, :string, :limit => 255
19
+ t.column :size, :integer
20
+ t.column :width, :integer
21
+ t.column :height, :integer
22
+ t.column :type, :string
23
+ t.column :aspect_ratio, :float
24
+ end
25
+
26
+ create_table :file_attachments_with_string_id, :id => false, :force => true do |t|
27
+ t.column :id, :string
28
+ t.column :parent_id, :string
29
+ t.column :thumbnail, :string
30
+ t.column :filename, :string, :limit => 255
31
+ t.column :content_type, :string, :limit => 255
32
+ t.column :size, :integer
33
+ t.column :width, :integer
34
+ t.column :height, :integer
35
+ t.column :type, :string
36
+ t.column :aspect_ratio, :float
37
+ end
38
+
39
+ create_table :gd2_attachments, :force => true do |t|
40
+ t.column :parent_id, :integer
41
+ t.column :thumbnail, :string
42
+ t.column :filename, :string, :limit => 255
43
+ t.column :content_type, :string, :limit => 255
44
+ t.column :size, :integer
45
+ t.column :width, :integer
46
+ t.column :height, :integer
47
+ t.column :type, :string
48
+ end
49
+
50
+ create_table :image_science_attachments, :force => true do |t|
51
+ t.column :parent_id, :integer
52
+ t.column :thumbnail, :string
53
+ t.column :filename, :string, :limit => 255
54
+ t.column :content_type, :string, :limit => 255
55
+ t.column :size, :integer
56
+ t.column :width, :integer
57
+ t.column :height, :integer
58
+ t.column :type, :string
59
+ end
60
+
61
+ create_table :core_image_attachments, :force => true do |t|
62
+ t.column :parent_id, :integer
63
+ t.column :thumbnail, :string
64
+ t.column :filename, :string, :limit => 255
65
+ t.column :content_type, :string, :limit => 255
66
+ t.column :size, :integer
67
+ t.column :width, :integer
68
+ t.column :height, :integer
69
+ t.column :type, :string
70
+ end
71
+
72
+ create_table :mini_magick_attachments, :force => true do |t|
73
+ t.column :parent_id, :integer
74
+ t.column :thumbnail, :string
75
+ t.column :filename, :string, :limit => 255
76
+ t.column :content_type, :string, :limit => 255
77
+ t.column :size, :integer
78
+ t.column :width, :integer
79
+ t.column :height, :integer
80
+ t.column :type, :string
81
+ end
82
+
83
+ create_table :mini_magick_attachments, :force => true do |t|
84
+ t.column :parent_id, :integer
85
+ t.column :thumbnail, :string
86
+ t.column :filename, :string, :limit => 255
87
+ t.column :content_type, :string, :limit => 255
88
+ t.column :size, :integer
89
+ t.column :width, :integer
90
+ t.column :height, :integer
91
+ t.column :type, :string
92
+ end
93
+
94
+ create_table :orphan_attachments, :force => true do |t|
95
+ t.column :db_file_id, :integer
96
+ t.column :filename, :string, :limit => 255
97
+ t.column :content_type, :string, :limit => 255
98
+ t.column :size, :integer
99
+ end
100
+
101
+ create_table :minimal_attachments, :force => true do |t|
102
+ t.column :size, :integer
103
+ t.column :content_type, :string, :limit => 255
104
+ end
105
+
106
+ create_table :db_files, :force => true do |t|
107
+ t.column :data, :binary
108
+ end
109
+
110
+ create_table :s3_attachments, :force => true do |t|
111
+ t.column :parent_id, :integer
112
+ t.column :thumbnail, :string
113
+ t.column :filename, :string, :limit => 255
114
+ t.column :content_type, :string, :limit => 255
115
+ t.column :size, :integer
116
+ t.column :width, :integer
117
+ t.column :height, :integer
118
+ t.column :type, :string
119
+ t.column :aspect_ratio, :float
120
+ end
121
+
122
+ create_table :cloud_files_attachments, :force => true do |t|
123
+ t.column :parent_id, :integer
124
+ t.column :thumbnail, :string
125
+ t.column :filename, :string, :limit => 255
126
+ t.column :content_type, :string, :limit => 255
127
+ t.column :size, :integer
128
+ t.column :width, :integer
129
+ t.column :height, :integer
130
+ t.column :type, :string
131
+ t.column :aspect_ratio, :float
132
+ end
133
+
134
+ end
@@ -0,0 +1,157 @@
1
+ $:.unshift(File.dirname(__FILE__) + '/../lib')
2
+
3
+ ENV['RAILS_ENV'] = 'test'
4
+ ENV['RAILS_ROOT'] ||= File.dirname(__FILE__) + '/../../../..'
5
+
6
+ require 'test/unit'
7
+ Thread.current[:rconditions_processing_predicate_method] = true # Turn off the RConditions beast!!!
8
+ require File.expand_path(File.join(ENV['RAILS_ROOT'], 'config/environment.rb'))
9
+ require 'active_record/fixtures'
10
+ require 'action_controller/test_process'
11
+
12
+ config = YAML::load(IO.read(File.dirname(__FILE__) + '/database.yml'))
13
+ ActiveRecord::Base.logger = Logger.new(File.dirname(__FILE__) + "/debug.log")
14
+
15
+ db_adapter = ENV['DB']
16
+
17
+ # no db passed, try one of these fine config-free DBs before bombing.
18
+ db_adapter ||=
19
+ begin
20
+ require 'rubygems'
21
+ require 'sqlite'
22
+ 'sqlite'
23
+ rescue MissingSourceFile
24
+ begin
25
+ require 'sqlite3'
26
+ 'sqlite3'
27
+ rescue MissingSourceFile
28
+ end
29
+ end
30
+
31
+ if db_adapter.nil?
32
+ raise "No DB Adapter selected. Pass the DB= option to pick one, or install Sqlite or Sqlite3."
33
+ end
34
+
35
+ load(File.dirname(__FILE__) + "/schema.rb")
36
+
37
+ fixture_path_klazz = Test::Unit::TestCase
38
+ if defined?(ActiveRecord::TestFixtures)
39
+ fixture_path_klazz = ActiveSupport::TestCase
40
+ class ActiveSupport::TestCase
41
+ include ActiveRecord::TestFixtures
42
+ end
43
+ end
44
+
45
+ fixture_path_klazz.fixture_path = File.dirname(__FILE__) + "/fixtures"
46
+ $LOAD_PATH.unshift(fixture_path_klazz.fixture_path)
47
+
48
+ class ActiveSupport::TestCase #:nodoc:
49
+ include ActionController::TestProcess
50
+ def create_fixtures(*table_names)
51
+ if block_given?
52
+ Fixtures.create_fixtures(ActiveSupport::TestCase.fixture_path, table_names) { yield }
53
+ else
54
+ Fixtures.create_fixtures(ActiveSupport::TestCase.fixture_path, table_names)
55
+ end
56
+ end
57
+
58
+ def setup
59
+ Attachment.saves = 0
60
+ DbFile.transaction { [Attachment, FileAttachment, OrphanAttachment, MinimalAttachment, DbFile].each { |klass| klass.delete_all } }
61
+ attachment_model self.class.attachment_model
62
+ end
63
+
64
+ def teardown
65
+ FileUtils.rm_rf File.join(File.dirname(__FILE__), 'files')
66
+ end
67
+
68
+ self.use_transactional_fixtures = true
69
+ self.use_instantiated_fixtures = false
70
+
71
+ def self.attachment_model(klass = nil)
72
+ @attachment_model = klass if klass
73
+ @attachment_model
74
+ end
75
+
76
+ def self.test_against_class(test_method, klass, subclass = false)
77
+ define_method("#{test_method}_on_#{:sub if subclass}class") do
78
+ klass = Class.new(klass) if subclass
79
+ attachment_model klass
80
+ send test_method, klass
81
+ end
82
+ end
83
+
84
+ def self.test_against_subclass(test_method, klass)
85
+ test_against_class test_method, klass, true
86
+ end
87
+
88
+ protected
89
+ def upload_file(options = {})
90
+ use_temp_file options[:filename] do |file|
91
+ att = attachment_model.create :uploaded_data => fixture_file_upload(file, options[:content_type] || 'image/png')
92
+ att.reload unless att.new_record?
93
+ return att
94
+ end
95
+ end
96
+
97
+ def upload_merb_file(options = {})
98
+ use_temp_file options[:filename] do |file|
99
+ att = attachment_model.create :uploaded_data => {"size" => file.size, "content_type" => options[:content_type] || 'image/png', "filename" => file, 'tempfile' => fixture_file_upload(file, options[:content_type] || 'image/png')}
100
+ att.reload unless att.new_record?
101
+ return att
102
+ end
103
+ end
104
+
105
+ def use_temp_file(fixture_filename)
106
+ temp_path = File.join('/tmp', File.basename(fixture_filename))
107
+ FileUtils.mkdir_p File.join(fixture_path, 'tmp')
108
+ FileUtils.cp File.join(fixture_path, fixture_filename), File.join(fixture_path, temp_path)
109
+ yield temp_path
110
+ ensure
111
+ FileUtils.rm_rf File.join(fixture_path, 'tmp')
112
+ end
113
+
114
+ def assert_created(num = 1)
115
+ assert_difference attachment_model.base_class, :count, num do
116
+ if attachment_model.included_modules.include? DbFile
117
+ assert_difference DbFile, :count, num do
118
+ yield
119
+ end
120
+ else
121
+ yield
122
+ end
123
+ end
124
+ end
125
+
126
+ def assert_not_created
127
+ assert_created(0) { yield }
128
+ end
129
+
130
+ def should_reject_by_size_with(klass)
131
+ attachment_model klass
132
+ assert_not_created do
133
+ attachment = upload_file :filename => '/files/rails.png'
134
+ assert attachment.new_record?
135
+ assert attachment.errors.on(:size)
136
+ assert_nil attachment.db_file if attachment.respond_to?(:db_file)
137
+ end
138
+ end
139
+
140
+ def assert_difference(object, method = nil, difference = 1)
141
+ initial_value = object.send(method)
142
+ yield
143
+ assert_equal initial_value + difference, object.send(method)
144
+ end
145
+
146
+ def assert_no_difference(object, method, &block)
147
+ assert_difference object, method, 0, &block
148
+ end
149
+
150
+ def attachment_model(klass = nil)
151
+ @attachment_model = klass if klass
152
+ @attachment_model
153
+ end
154
+ end
155
+
156
+ require File.join(File.dirname(__FILE__), 'fixtures/attachment')
157
+ require File.join(File.dirname(__FILE__), 'base_attachment_tests')
@@ -0,0 +1,55 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), 'test_helper'))
2
+
3
+ class ValidationTest < ActiveSupport::TestCase
4
+ def test_should_invalidate_big_files
5
+ @attachment = SmallAttachment.new
6
+ assert !@attachment.valid?
7
+ assert @attachment.errors.on(:size)
8
+
9
+ @attachment.size = 2000
10
+ assert !@attachment.valid?
11
+ assert @attachment.errors.on(:size), @attachment.errors.full_messages.to_sentence
12
+
13
+ @attachment.size = 1000
14
+ assert !@attachment.valid?
15
+ assert_nil @attachment.errors.on(:size)
16
+ end
17
+
18
+ def test_should_invalidate_small_files
19
+ @attachment = BigAttachment.new
20
+ assert !@attachment.valid?
21
+ assert @attachment.errors.on(:size)
22
+
23
+ @attachment.size = 2000
24
+ assert !@attachment.valid?
25
+ assert @attachment.errors.on(:size), @attachment.errors.full_messages.to_sentence
26
+
27
+ @attachment.size = 1.megabyte
28
+ assert !@attachment.valid?
29
+ assert_nil @attachment.errors.on(:size)
30
+ end
31
+
32
+ def test_should_validate_content_type
33
+ @attachment = PdfAttachment.new
34
+ assert !@attachment.valid?
35
+ assert @attachment.errors.on(:content_type)
36
+
37
+ @attachment.content_type = 'foo'
38
+ assert !@attachment.valid?
39
+ assert @attachment.errors.on(:content_type)
40
+
41
+ @attachment.content_type = 'pdf'
42
+ assert !@attachment.valid?
43
+ assert_nil @attachment.errors.on(:content_type)
44
+ end
45
+
46
+ def test_should_require_filename
47
+ @attachment = Attachment.new
48
+ assert !@attachment.valid?
49
+ assert @attachment.errors.on(:filename)
50
+
51
+ @attachment.filename = 'foo'
52
+ assert !@attachment.valid?
53
+ assert_nil @attachment.errors.on(:filename)
54
+ end
55
+ end
@@ -0,0 +1,27 @@
1
+ module RedArtisan
2
+ module CoreImage
3
+ module Filters
4
+ module Color
5
+
6
+ def greyscale(color = nil, intensity = 1.00)
7
+ create_core_image_context(@original.extent.size.width, @original.extent.size.height)
8
+
9
+ color = OSX::CIColor.colorWithString("1.0 1.0 1.0 1.0") unless color
10
+
11
+ @original.color_monochrome :inputColor => color, :inputIntensity => intensity do |greyscale|
12
+ @target = greyscale
13
+ end
14
+ end
15
+
16
+ def sepia(intensity = 1.00)
17
+ create_core_image_context(@original.extent.size.width, @original.extent.size.height)
18
+
19
+ @original.sepia_tone :inputIntensity => intensity do |sepia|
20
+ @target = sepia
21
+ end
22
+ end
23
+
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,31 @@
1
+ module RedArtisan
2
+ module CoreImage
3
+ module Filters
4
+ module Effects
5
+
6
+ def spotlight(position, points_at, brightness, concentration, color)
7
+ create_core_image_context(@original.extent.size.width, @original.extent.size.height)
8
+
9
+ @original.spot_light :inputLightPosition => vector3(*position), :inputLightPointsAt => vector3(*points_at),
10
+ :inputBrightness => brightness, :inputConcentration => concentration, :inputColor => color do |spot|
11
+ @target = spot
12
+ end
13
+ end
14
+
15
+ def edges(intensity = 1.00)
16
+ create_core_image_context(@original.extent.size.width, @original.extent.size.height)
17
+
18
+ @original.edges :inputIntensity => intensity do |edged|
19
+ @target = edged
20
+ end
21
+ end
22
+
23
+ private
24
+
25
+ def vector3(x, y, w)
26
+ OSX::CIVector.vectorWithX_Y_Z(x, y, w)
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,25 @@
1
+ module RedArtisan
2
+ module CoreImage
3
+ module Filters
4
+ module Perspective
5
+
6
+ def perspective(top_left, top_right, bottom_left, bottom_right)
7
+ create_core_image_context(@original.extent.size.width, @original.extent.size.height)
8
+
9
+ @original.perspective_transform :inputTopLeft => top_left, :inputTopRight => top_right, :inputBottomLeft => bottom_left, :inputBottomRight => bottom_right do |transformed|
10
+ @target = transformed
11
+ end
12
+ end
13
+
14
+ def perspective_tiled(top_left, top_right, bottom_left, bottom_right)
15
+ create_core_image_context(@original.extent.size.width, @original.extent.size.height)
16
+
17
+ @original.perspective_tile :inputTopLeft => top_left, :inputTopRight => top_right, :inputBottomLeft => bottom_left, :inputBottomRight => bottom_right do |tiled|
18
+ @target = tiled
19
+ end
20
+ end
21
+
22
+ end
23
+ end
24
+ end
25
+ end