radiant-page_attachments-extension 1.0.0
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/.gitignore +5 -0
- data/LICENSE +20 -0
- data/README.md +129 -0
- data/Rakefile +57 -0
- data/VERSION +1 -0
- data/app/models/observe_page_attachments.rb +5 -0
- data/app/models/page_attachment.rb +28 -0
- data/app/models/page_attachment_associations.rb +20 -0
- data/app/models/page_attachment_tags.rb +261 -0
- data/app/models/page_attachments_interface.rb +19 -0
- data/app/views/admin/pages/_attachment.html.haml +12 -0
- data/app/views/admin/pages/_attachments_box.html.haml +12 -0
- data/db/migrate/001_create_page_attachments_extension_schema.rb +22 -0
- data/db/migrate/002_add_page_attachments_fields.rb +23 -0
- data/features/attachments.feature +42 -0
- data/features/step_definitions/attachment_steps.rb +61 -0
- data/features/support/env.rb +57 -0
- data/features/support/paths.rb +14 -0
- data/lib/difference_test_helper.rb +20 -0
- data/lib/radiant-page_attachments-extension.rb +0 -0
- data/lib/tasks/page_attachments_extension_tasks.rake +28 -0
- data/page_attachments_extension.rb +27 -0
- data/public/images/admin/drag_order.png +0 -0
- data/public/javascripts/admin/page_attachments.js +30 -0
- data/public/stylesheets/admin/page_attachments.css +133 -0
- data/radiant-page_attachments-extension.gemspec +139 -0
- data/spec/controllers/pages_controller_spec.rb +10 -0
- data/spec/datasets/page_attachments_dataset.rb +31 -0
- data/spec/fixtures/foo.txt +1 -0
- data/spec/fixtures/rails.png +0 -0
- data/spec/models/observe_page_attachments_spec.rb +14 -0
- data/spec/models/page_attachment_spec.rb +18 -0
- data/spec/models/page_attachment_tags_spec.rb +172 -0
- data/spec/models/page_spec.rb +32 -0
- data/spec/spec.opts +6 -0
- data/spec/spec_helper.rb +39 -0
- data/vendor/plugins/acts_as_list/README +23 -0
- data/vendor/plugins/acts_as_list/init.rb +3 -0
- data/vendor/plugins/acts_as_list/lib/active_record/acts/list.rb +256 -0
- data/vendor/plugins/acts_as_list/test/list_test.rb +332 -0
- data/vendor/plugins/attachment_fu/CHANGELOG +35 -0
- data/vendor/plugins/attachment_fu/LICENSE +20 -0
- data/vendor/plugins/attachment_fu/README +193 -0
- data/vendor/plugins/attachment_fu/Rakefile +22 -0
- data/vendor/plugins/attachment_fu/amazon_s3.yml.tpl +17 -0
- data/vendor/plugins/attachment_fu/init.rb +16 -0
- data/vendor/plugins/attachment_fu/install.rb +7 -0
- data/vendor/plugins/attachment_fu/lib/geometry.rb +93 -0
- data/vendor/plugins/attachment_fu/lib/technoweenie/attachment_fu/backends/cloud_file_backend.rb +211 -0
- data/vendor/plugins/attachment_fu/lib/technoweenie/attachment_fu/backends/db_file_backend.rb +39 -0
- data/vendor/plugins/attachment_fu/lib/technoweenie/attachment_fu/backends/file_system_backend.rb +126 -0
- data/vendor/plugins/attachment_fu/lib/technoweenie/attachment_fu/backends/s3_backend.rb +394 -0
- data/vendor/plugins/attachment_fu/lib/technoweenie/attachment_fu/processors/core_image_processor.rb +59 -0
- data/vendor/plugins/attachment_fu/lib/technoweenie/attachment_fu/processors/gd2_processor.rb +54 -0
- data/vendor/plugins/attachment_fu/lib/technoweenie/attachment_fu/processors/image_science_processor.rb +61 -0
- data/vendor/plugins/attachment_fu/lib/technoweenie/attachment_fu/processors/mini_magick_processor.rb +132 -0
- data/vendor/plugins/attachment_fu/lib/technoweenie/attachment_fu/processors/rmagick_processor.rb +57 -0
- data/vendor/plugins/attachment_fu/lib/technoweenie/attachment_fu.rb +514 -0
- data/vendor/plugins/attachment_fu/rackspace_cloudfiles.yml.tpl +14 -0
- data/vendor/plugins/attachment_fu/test/backends/db_file_test.rb +16 -0
- data/vendor/plugins/attachment_fu/test/backends/file_system_test.rb +143 -0
- data/vendor/plugins/attachment_fu/test/backends/remote/cloudfiles_test.rb +102 -0
- data/vendor/plugins/attachment_fu/test/backends/remote/s3_test.rb +119 -0
- data/vendor/plugins/attachment_fu/test/base_attachment_tests.rb +77 -0
- data/vendor/plugins/attachment_fu/test/basic_test.rb +70 -0
- data/vendor/plugins/attachment_fu/test/database.yml +18 -0
- data/vendor/plugins/attachment_fu/test/extra_attachment_test.rb +67 -0
- data/vendor/plugins/attachment_fu/test/fixtures/attachment.rb +226 -0
- data/vendor/plugins/attachment_fu/test/fixtures/files/fake/rails.png +0 -0
- data/vendor/plugins/attachment_fu/test/fixtures/files/foo.txt +1 -0
- data/vendor/plugins/attachment_fu/test/fixtures/files/rails.png +0 -0
- data/vendor/plugins/attachment_fu/test/geometry_test.rb +108 -0
- data/vendor/plugins/attachment_fu/test/processors/core_image_test.rb +37 -0
- data/vendor/plugins/attachment_fu/test/processors/gd2_test.rb +31 -0
- data/vendor/plugins/attachment_fu/test/processors/image_science_test.rb +31 -0
- data/vendor/plugins/attachment_fu/test/processors/mini_magick_test.rb +103 -0
- data/vendor/plugins/attachment_fu/test/processors/rmagick_test.rb +255 -0
- data/vendor/plugins/attachment_fu/test/schema.rb +134 -0
- data/vendor/plugins/attachment_fu/test/test_helper.rb +150 -0
- data/vendor/plugins/attachment_fu/test/validation_test.rb +55 -0
- data/vendor/plugins/attachment_fu/vendor/red_artisan/core_image/filters/color.rb +27 -0
- data/vendor/plugins/attachment_fu/vendor/red_artisan/core_image/filters/effects.rb +31 -0
- data/vendor/plugins/attachment_fu/vendor/red_artisan/core_image/filters/perspective.rb +25 -0
- data/vendor/plugins/attachment_fu/vendor/red_artisan/core_image/filters/quality.rb +25 -0
- data/vendor/plugins/attachment_fu/vendor/red_artisan/core_image/filters/scale.rb +47 -0
- data/vendor/plugins/attachment_fu/vendor/red_artisan/core_image/filters/watermark.rb +32 -0
- data/vendor/plugins/attachment_fu/vendor/red_artisan/core_image/processor.rb +123 -0
- metadata +178 -0
@@ -0,0 +1,70 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), 'test_helper'))
|
2
|
+
|
3
|
+
class BasicTest < Test::Unit::TestCase
|
4
|
+
def test_should_set_default_min_size
|
5
|
+
assert_equal 1, Attachment.attachment_options[:min_size]
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_should_set_default_max_size
|
9
|
+
assert_equal 1.megabyte, Attachment.attachment_options[:max_size]
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_should_set_default_size
|
13
|
+
assert_equal (1..1.megabyte), Attachment.attachment_options[:size]
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_should_set_default_thumbnails_option
|
17
|
+
assert_equal Hash.new, Attachment.attachment_options[:thumbnails]
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_should_set_default_thumbnail_class
|
21
|
+
assert_equal Attachment, Attachment.attachment_options[:thumbnail_class]
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_should_normalize_content_types_to_array
|
25
|
+
assert_equal %w(pdf), PdfAttachment.attachment_options[:content_type]
|
26
|
+
assert_equal %w(pdf doc txt), DocAttachment.attachment_options[:content_type]
|
27
|
+
assert_equal Technoweenie::AttachmentFu.content_types, ImageAttachment.attachment_options[:content_type]
|
28
|
+
assert_equal ['pdf'] + Technoweenie::AttachmentFu.content_types, ImageOrPdfAttachment.attachment_options[:content_type]
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_should_sanitize_content_type
|
32
|
+
@attachment = Attachment.new :content_type => ' foo '
|
33
|
+
assert_equal 'foo', @attachment.content_type
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_should_sanitize_filenames
|
37
|
+
@attachment = Attachment.new :filename => 'blah/foo.bar'
|
38
|
+
assert_equal 'foo.bar', @attachment.filename
|
39
|
+
|
40
|
+
@attachment.filename = 'blah\\foo.bar'
|
41
|
+
assert_equal 'foo.bar', @attachment.filename
|
42
|
+
|
43
|
+
@attachment.filename = 'f o!O-.bar'
|
44
|
+
assert_equal 'f_o_O-.bar', @attachment.filename
|
45
|
+
|
46
|
+
@attachment.filename = 'sheeps_says_bææ'
|
47
|
+
assert_equal 'sheeps_says_b__', @attachment.filename
|
48
|
+
|
49
|
+
@attachment.filename = nil
|
50
|
+
assert_nil @attachment.filename
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_should_convert_thumbnail_name
|
54
|
+
@attachment = FileAttachment.new :filename => 'foo.bar'
|
55
|
+
assert_equal 'foo.bar', @attachment.thumbnail_name_for(nil)
|
56
|
+
assert_equal 'foo.bar', @attachment.thumbnail_name_for('')
|
57
|
+
assert_equal 'foo_blah.bar', @attachment.thumbnail_name_for(:blah)
|
58
|
+
assert_equal 'foo_blah.blah.bar', @attachment.thumbnail_name_for('blah.blah')
|
59
|
+
|
60
|
+
@attachment.filename = 'foo.bar.baz'
|
61
|
+
assert_equal 'foo.bar_blah.baz', @attachment.thumbnail_name_for(:blah)
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_should_require_valid_thumbnails_option
|
65
|
+
klass = Class.new(ActiveRecord::Base)
|
66
|
+
assert_raise ArgumentError do
|
67
|
+
klass.has_attachment :thumbnails => []
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
sqlite:
|
2
|
+
:adapter: sqlite
|
3
|
+
:dbfile: attachment_fu_plugin.sqlite.db
|
4
|
+
sqlite3:
|
5
|
+
:adapter: sqlite3
|
6
|
+
:dbfile: attachment_fu_plugin.sqlite3.db
|
7
|
+
postgresql:
|
8
|
+
:adapter: postgresql
|
9
|
+
:username: postgres
|
10
|
+
:password: postgres
|
11
|
+
:database: attachment_fu_plugin_test
|
12
|
+
:min_messages: ERROR
|
13
|
+
mysql:
|
14
|
+
:adapter: mysql
|
15
|
+
:host: localhost
|
16
|
+
:username: rails
|
17
|
+
:password:
|
18
|
+
:database: attachment_fu_plugin_test
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), 'test_helper'))
|
2
|
+
|
3
|
+
class OrphanAttachmentTest < Test::Unit::TestCase
|
4
|
+
include BaseAttachmentTests
|
5
|
+
attachment_model OrphanAttachment
|
6
|
+
|
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
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_should_create_file_from_uploaded_file
|
18
|
+
assert_created do
|
19
|
+
attachment = upload_file :filename => '/files/foo.txt'
|
20
|
+
assert_valid attachment
|
21
|
+
assert !attachment.db_file.new_record? if attachment.respond_to?(:db_file)
|
22
|
+
assert attachment.image?
|
23
|
+
assert !attachment.size.zero?
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_should_create_file_from_merb_temp_file
|
28
|
+
assert_created do
|
29
|
+
attachment = upload_merb_file :filename => '/files/foo.txt'
|
30
|
+
assert_valid attachment
|
31
|
+
assert !attachment.db_file.new_record? if attachment.respond_to?(:db_file)
|
32
|
+
assert attachment.image?
|
33
|
+
assert !attachment.size.zero?
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_should_create_image_from_uploaded_file_with_custom_content_type
|
38
|
+
assert_created do
|
39
|
+
attachment = upload_file :content_type => 'foo/bar', :filename => '/files/rails.png'
|
40
|
+
assert_valid attachment
|
41
|
+
assert !attachment.image?
|
42
|
+
assert !attachment.db_file.new_record? if attachment.respond_to?(:db_file)
|
43
|
+
assert !attachment.size.zero?
|
44
|
+
#assert_equal 1784, attachment.size
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_should_create_thumbnail
|
49
|
+
attachment = upload_file :filename => '/files/rails.png'
|
50
|
+
|
51
|
+
assert_raise Technoweenie::AttachmentFu::ThumbnailError do
|
52
|
+
attachment.create_or_update_thumbnail(attachment.create_temp_file, 'thumb', 50, 50)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_should_create_thumbnail_with_geometry_string
|
57
|
+
attachment = upload_file :filename => '/files/rails.png'
|
58
|
+
|
59
|
+
assert_raise Technoweenie::AttachmentFu::ThumbnailError do
|
60
|
+
attachment.create_or_update_thumbnail(attachment.create_temp_file, 'thumb', 'x50')
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
class MinimalAttachmentTest < OrphanAttachmentTest
|
66
|
+
attachment_model MinimalAttachment
|
67
|
+
end
|
@@ -0,0 +1,226 @@
|
|
1
|
+
class Attachment < ActiveRecord::Base
|
2
|
+
@@saves = 0
|
3
|
+
cattr_accessor :saves
|
4
|
+
has_attachment :processor => :rmagick
|
5
|
+
validates_as_attachment
|
6
|
+
after_attachment_saved do |record|
|
7
|
+
self.saves += 1
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
class SmallAttachment < Attachment
|
12
|
+
has_attachment :max_size => 1.kilobyte
|
13
|
+
end
|
14
|
+
|
15
|
+
class BigAttachment < Attachment
|
16
|
+
has_attachment :size => 1.megabyte..2.megabytes
|
17
|
+
end
|
18
|
+
|
19
|
+
class PdfAttachment < Attachment
|
20
|
+
has_attachment :content_type => 'pdf'
|
21
|
+
end
|
22
|
+
|
23
|
+
class DocAttachment < Attachment
|
24
|
+
has_attachment :content_type => %w(pdf doc txt)
|
25
|
+
end
|
26
|
+
|
27
|
+
class ImageAttachment < Attachment
|
28
|
+
has_attachment :content_type => :image, :resize_to => [50,50]
|
29
|
+
end
|
30
|
+
|
31
|
+
class ImageOrPdfAttachment < Attachment
|
32
|
+
has_attachment :content_type => ['pdf', :image], :resize_to => 'x50'
|
33
|
+
end
|
34
|
+
|
35
|
+
class ImageWithThumbsAttachment < Attachment
|
36
|
+
has_attachment :thumbnails => { :thumb => [50, 50], :geometry => 'x50' }, :resize_to => [55,55]
|
37
|
+
after_resize do |record, img|
|
38
|
+
# record.aspect_ratio = img.columns.to_f / img.rows.to_f
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
class FileAttachment < ActiveRecord::Base
|
43
|
+
has_attachment :path_prefix => 'vendor/plugins/attachment_fu/test/files', :processor => :rmagick
|
44
|
+
validates_as_attachment
|
45
|
+
end
|
46
|
+
|
47
|
+
class FileAttachmentWithStringId < ActiveRecord::Base
|
48
|
+
set_table_name 'file_attachments_with_string_id'
|
49
|
+
has_attachment :path_prefix => 'vendor/plugins/attachment_fu/test/files', :processor => :rmagick
|
50
|
+
validates_as_attachment
|
51
|
+
|
52
|
+
before_validation :auto_generate_id
|
53
|
+
before_save :auto_generate_id
|
54
|
+
@@last_id = 0
|
55
|
+
|
56
|
+
private
|
57
|
+
def auto_generate_id
|
58
|
+
@@last_id += 1
|
59
|
+
self.id = "id_#{@@last_id}"
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
class FileAttachmentWithUuid < ActiveRecord::Base
|
64
|
+
set_table_name 'file_attachments_with_string_id'
|
65
|
+
has_attachment :path_prefix => 'vendor/plugins/attachment_fu/test/files', :processor => :rmagick, :uuid_primary_key => true
|
66
|
+
validates_as_attachment
|
67
|
+
|
68
|
+
before_validation :auto_generate_id
|
69
|
+
before_save :auto_generate_id
|
70
|
+
@@last_id = 0
|
71
|
+
|
72
|
+
private
|
73
|
+
def auto_generate_id
|
74
|
+
@@last_id += 1
|
75
|
+
self.id = "%0127dx" % @@last_id
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
class ImageFileAttachment < FileAttachment
|
80
|
+
has_attachment :path_prefix => 'vendor/plugins/attachment_fu/test/files',
|
81
|
+
:content_type => :image, :resize_to => [50,50]
|
82
|
+
end
|
83
|
+
|
84
|
+
class ImageWithThumbsFileAttachment < FileAttachment
|
85
|
+
has_attachment :path_prefix => 'vendor/plugins/attachment_fu/test/files',
|
86
|
+
:thumbnails => { :thumb => [50, 50], :geometry => 'x50' }, :resize_to => [55,55]
|
87
|
+
after_resize do |record, img|
|
88
|
+
# record.aspect_ratio = img.columns.to_f / img.rows.to_f
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
class ImageWithThumbsClassFileAttachment < FileAttachment
|
93
|
+
# use file_system_path to test backwards compatibility
|
94
|
+
has_attachment :file_system_path => 'vendor/plugins/attachment_fu/test/files',
|
95
|
+
:thumbnails => { :thumb => [50, 50] }, :resize_to => [55,55],
|
96
|
+
:thumbnail_class => 'ImageThumbnail'
|
97
|
+
end
|
98
|
+
|
99
|
+
class ImageThumbnail < FileAttachment
|
100
|
+
has_attachment :path_prefix => 'vendor/plugins/attachment_fu/test/files/thumbnails'
|
101
|
+
end
|
102
|
+
|
103
|
+
# no parent
|
104
|
+
class OrphanAttachment < ActiveRecord::Base
|
105
|
+
has_attachment :processor => :rmagick
|
106
|
+
validates_as_attachment
|
107
|
+
end
|
108
|
+
|
109
|
+
# no filename, no size, no content_type
|
110
|
+
class MinimalAttachment < ActiveRecord::Base
|
111
|
+
has_attachment :path_prefix => 'vendor/plugins/attachment_fu/test/files', :processor => :rmagick
|
112
|
+
validates_as_attachment
|
113
|
+
|
114
|
+
def filename
|
115
|
+
"#{id}.file"
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
begin
|
120
|
+
class ImageScienceAttachment < ActiveRecord::Base
|
121
|
+
has_attachment :path_prefix => 'vendor/plugins/attachment_fu/test/files',
|
122
|
+
:processor => :image_science, :thumbnails => { :thumb => [50, 51], :geometry => '31>' }, :resize_to => 55
|
123
|
+
end
|
124
|
+
rescue MissingSourceFile
|
125
|
+
puts $!.message
|
126
|
+
puts "no ImageScience"
|
127
|
+
end
|
128
|
+
|
129
|
+
begin
|
130
|
+
class CoreImageAttachment < ActiveRecord::Base
|
131
|
+
has_attachment :path_prefix => 'vendor/plugins/attachment_fu/test/files',
|
132
|
+
:processor => :core_image, :thumbnails => { :thumb => [50, 51], :geometry => '31>' }, :resize_to => 55
|
133
|
+
end
|
134
|
+
rescue MissingSourceFile
|
135
|
+
puts $!.message
|
136
|
+
puts "no CoreImage"
|
137
|
+
end
|
138
|
+
|
139
|
+
begin
|
140
|
+
class MiniMagickAttachment < ActiveRecord::Base
|
141
|
+
has_attachment :path_prefix => 'vendor/plugins/attachment_fu/test/files',
|
142
|
+
:processor => :mini_magick, :thumbnails => { :thumb => [50, 51], :geometry => '31>' }, :resize_to => 55
|
143
|
+
end
|
144
|
+
rescue MissingSourceFile
|
145
|
+
puts $!.message
|
146
|
+
puts "no Mini Magick"
|
147
|
+
end
|
148
|
+
|
149
|
+
begin
|
150
|
+
class GD2Attachment < ActiveRecord::Base
|
151
|
+
has_attachment :path_prefix => 'vendor/plugins/attachment_fu/test/files',
|
152
|
+
:processor => :gd2, :thumbnails => { :thumb => [50, 51], :geometry => '31>' }, :resize_to => 55
|
153
|
+
end
|
154
|
+
rescue MissingSourceFile
|
155
|
+
puts $!.message
|
156
|
+
puts "no GD2"
|
157
|
+
end
|
158
|
+
|
159
|
+
|
160
|
+
begin
|
161
|
+
class MiniMagickAttachment < ActiveRecord::Base
|
162
|
+
has_attachment :path_prefix => 'vendor/plugins/attachment_fu/test/files',
|
163
|
+
:processor => :mini_magick, :thumbnails => { :thumb => [50, 51], :geometry => '31>' }, :resize_to => 55
|
164
|
+
end
|
165
|
+
class ImageThumbnailCrop < MiniMagickAttachment
|
166
|
+
has_attachment :path_prefix => 'vendor/plugins/attachment_fu/test/files',
|
167
|
+
:thumbnails => { :square => "50x50c", :vertical => "30x60c", :horizontal => "60x30c"}
|
168
|
+
|
169
|
+
# TODO this is a bad duplication, this method is in the MiniMagick Processor
|
170
|
+
def self.calculate_offset(image_width,image_height,image_aspect,thumb_width,thumb_height,thumb_aspect)
|
171
|
+
# only crop if image is not smaller in both dimensions
|
172
|
+
|
173
|
+
# special cases, image smaller in one dimension then thumbsize
|
174
|
+
if image_width < thumb_width
|
175
|
+
offset = (image_height / 2) - (thumb_height / 2)
|
176
|
+
command = "#{image_width}x#{thumb_height}+0+#{offset}"
|
177
|
+
elsif image_height < thumb_height
|
178
|
+
offset = (image_width / 2) - (thumb_width / 2)
|
179
|
+
command = "#{thumb_width}x#{image_height}+#{offset}+0"
|
180
|
+
|
181
|
+
# normal thumbnail generation
|
182
|
+
# calculate height and offset y, width is fixed
|
183
|
+
elsif (image_aspect <= thumb_aspect or image_width < thumb_width) and image_height > thumb_height
|
184
|
+
height = image_width / thumb_aspect
|
185
|
+
offset = (image_height / 2) - (height / 2)
|
186
|
+
command = "#{image_width}x#{height}+0+#{offset}"
|
187
|
+
# calculate width and offset x, height is fixed
|
188
|
+
else
|
189
|
+
width = image_height * thumb_aspect
|
190
|
+
offset = (image_width / 2) - (width / 2)
|
191
|
+
command = "#{width}x#{image_height}+#{offset}+0"
|
192
|
+
end
|
193
|
+
# crop image
|
194
|
+
command
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
rescue MissingSourceFile
|
199
|
+
end
|
200
|
+
|
201
|
+
|
202
|
+
|
203
|
+
begin
|
204
|
+
class S3Attachment < ActiveRecord::Base
|
205
|
+
has_attachment :storage => :s3, :processor => :rmagick, :s3_config_path => File.join(File.dirname(__FILE__), '../amazon_s3.yml')
|
206
|
+
validates_as_attachment
|
207
|
+
end
|
208
|
+
|
209
|
+
class CloudFilesAttachment < ActiveRecord::Base
|
210
|
+
has_attachment :storage => :cloud_files, :processor => :rmagick, :cloudfiles_config_path => File.join(File.dirname(__FILE__), '../rackspace_cloudfiles.yml')
|
211
|
+
validates_as_attachment
|
212
|
+
end
|
213
|
+
|
214
|
+
class S3WithPathPrefixAttachment < S3Attachment
|
215
|
+
has_attachment :storage => :s3, :path_prefix => 'some/custom/path/prefix', :processor => :rmagick
|
216
|
+
validates_as_attachment
|
217
|
+
end
|
218
|
+
|
219
|
+
class CloudFilesWithPathPrefixAttachment < CloudFilesAttachment
|
220
|
+
has_attachment :storage => :cloud_files, :path_prefix => 'some/custom/path/prefix', :processor => :rmagick
|
221
|
+
validates_as_attachment
|
222
|
+
end
|
223
|
+
|
224
|
+
rescue
|
225
|
+
puts "S3 error: #{$!}"
|
226
|
+
end
|
Binary file
|
@@ -0,0 +1 @@
|
|
1
|
+
foo
|
Binary file
|
@@ -0,0 +1,108 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '../lib/geometry')) unless Object.const_defined?(:Geometry)
|
3
|
+
|
4
|
+
class GeometryTest < Test::Unit::TestCase
|
5
|
+
def test_should_resize
|
6
|
+
assert_geometry 50, 64,
|
7
|
+
"50x50" => [39, 50],
|
8
|
+
"60x60" => [47, 60],
|
9
|
+
"100x100" => [78, 100]
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_should_resize_no_width
|
13
|
+
assert_geometry 50, 64,
|
14
|
+
"x50" => [39, 50],
|
15
|
+
"x60" => [47, 60],
|
16
|
+
"x100" => [78, 100]
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_should_resize_no_height
|
20
|
+
assert_geometry 50, 64,
|
21
|
+
"50" => [50, 64],
|
22
|
+
"60" => [60, 77],
|
23
|
+
"100" => [100, 128]
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_should_resize_no_height_with_x
|
27
|
+
assert_geometry 50, 64,
|
28
|
+
"50x" => [50, 64],
|
29
|
+
"60x" => [60, 77],
|
30
|
+
"100x" => [100, 128]
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_should_resize_with_percent
|
34
|
+
assert_geometry 50, 64,
|
35
|
+
"50x50%" => [25, 32],
|
36
|
+
"60x60%" => [30, 38],
|
37
|
+
"120x112%" => [60, 72]
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_should_resize_with_percent_and_no_width
|
41
|
+
assert_geometry 50, 64,
|
42
|
+
"x50%" => [50, 32],
|
43
|
+
"x60%" => [50, 38],
|
44
|
+
"x112%" => [50, 72]
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_should_resize_with_percent_and_no_height
|
48
|
+
assert_geometry 50, 64,
|
49
|
+
"50%" => [25, 32],
|
50
|
+
"60%" => [30, 38],
|
51
|
+
"120%" => [60, 77]
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_should_resize_with_less
|
55
|
+
assert_geometry 50, 64,
|
56
|
+
"50x50<" => [50, 64],
|
57
|
+
"60x60<" => [50, 64],
|
58
|
+
"100x100<" => [78, 100],
|
59
|
+
"100x112<" => [88, 112],
|
60
|
+
"40x70<" => [50, 64]
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_should_resize_with_less_and_no_width
|
64
|
+
assert_geometry 50, 64,
|
65
|
+
"x50<" => [50, 64],
|
66
|
+
"x60<" => [50, 64],
|
67
|
+
"x100<" => [78, 100]
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_should_resize_with_less_and_no_height
|
71
|
+
assert_geometry 50, 64,
|
72
|
+
"50<" => [50, 64],
|
73
|
+
"60<" => [60, 77],
|
74
|
+
"100<" => [100, 128]
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_should_resize_with_greater
|
78
|
+
assert_geometry 50, 64,
|
79
|
+
"50x50>" => [39, 50],
|
80
|
+
"60x60>" => [47, 60],
|
81
|
+
"100x100>" => [50, 64],
|
82
|
+
"100x112>" => [50, 64],
|
83
|
+
"40x70>" => [40, 51]
|
84
|
+
end
|
85
|
+
|
86
|
+
def test_should_resize_with_greater_and_no_width
|
87
|
+
assert_geometry 50, 64,
|
88
|
+
"x40>" => [31, 40],
|
89
|
+
"x60>" => [47, 60],
|
90
|
+
"x100>" => [50, 64]
|
91
|
+
end
|
92
|
+
|
93
|
+
def test_should_resize_with_greater_and_no_height
|
94
|
+
assert_geometry 50, 64,
|
95
|
+
"40>" => [40, 51],
|
96
|
+
"60>" => [50, 64],
|
97
|
+
"100>" => [50, 64]
|
98
|
+
end
|
99
|
+
|
100
|
+
protected
|
101
|
+
def assert_geometry(width, height, values)
|
102
|
+
values.each do |geo, result|
|
103
|
+
# run twice to verify the Geometry string isn't modified after a run
|
104
|
+
geo = Geometry.from_s(geo)
|
105
|
+
2.times { assert_equal result, [width, height] / geo }
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|