paperclip 3.5.4 → 4.3.7
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of paperclip might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/.gitignore +0 -6
- data/.hound.yml +1066 -0
- data/.rubocop.yml +1 -0
- data/.travis.yml +11 -17
- data/Appraisals +6 -14
- data/CONTRIBUTING.md +13 -8
- data/Gemfile +16 -3
- data/LICENSE +1 -3
- data/NEWS +167 -49
- data/README.md +294 -75
- data/RELEASING.md +17 -0
- data/Rakefile +6 -8
- data/features/basic_integration.feature +24 -6
- data/features/step_definitions/attachment_steps.rb +30 -22
- data/features/step_definitions/html_steps.rb +2 -2
- data/features/step_definitions/rails_steps.rb +44 -14
- data/features/step_definitions/web_steps.rb +1 -103
- data/features/support/env.rb +2 -2
- data/features/support/file_helpers.rb +2 -2
- data/features/support/fixtures/gemfile.txt +1 -1
- data/features/support/rails.rb +2 -1
- data/gemfiles/3.2.gemfile +14 -6
- data/gemfiles/4.1.gemfile +19 -0
- data/gemfiles/4.2.gemfile +19 -0
- data/lib/generators/paperclip/paperclip_generator.rb +0 -2
- data/lib/generators/paperclip/templates/paperclip_migration.rb.erb +1 -1
- data/lib/paperclip/attachment.rb +132 -38
- data/lib/paperclip/attachment_registry.rb +1 -1
- data/lib/paperclip/callbacks.rb +11 -1
- data/lib/paperclip/content_type_detector.rb +25 -22
- data/lib/paperclip/deprecations.rb +42 -0
- data/lib/paperclip/errors.rb +5 -0
- data/lib/paperclip/file_command_content_type_detector.rb +6 -8
- data/lib/paperclip/geometry_detector_factory.rb +3 -1
- data/lib/paperclip/geometry_parser_factory.rb +1 -1
- data/lib/paperclip/has_attached_file.rb +10 -0
- data/lib/paperclip/interpolations/plural_cache.rb +6 -5
- data/lib/paperclip/interpolations.rb +25 -12
- data/lib/paperclip/io_adapters/abstract_adapter.rb +3 -1
- data/lib/paperclip/io_adapters/attachment_adapter.rb +4 -4
- data/lib/paperclip/io_adapters/data_uri_adapter.rb +5 -10
- data/lib/paperclip/io_adapters/stringio_adapter.rb +6 -10
- data/lib/paperclip/io_adapters/uri_adapter.rb +30 -11
- data/lib/paperclip/locales/de.yml +18 -0
- data/lib/paperclip/locales/en.yml +1 -0
- data/lib/paperclip/locales/es.yml +18 -0
- data/lib/paperclip/locales/ja.yml +18 -0
- data/lib/paperclip/locales/pt-BR.yml +18 -0
- data/lib/paperclip/locales/zh-CN.yml +18 -0
- data/lib/paperclip/locales/zh-HK.yml +18 -0
- data/lib/paperclip/locales/zh-TW.yml +18 -0
- data/lib/paperclip/matchers/have_attached_file_matcher.rb +2 -1
- data/lib/paperclip/matchers/validate_attachment_presence_matcher.rb +2 -1
- data/lib/paperclip/matchers/validate_attachment_size_matcher.rb +2 -1
- data/lib/paperclip/media_type_spoof_detector.rb +89 -0
- data/lib/paperclip/processor.rb +0 -37
- data/lib/paperclip/processor_helpers.rb +50 -0
- data/lib/paperclip/rails_environment.rb +25 -0
- data/lib/paperclip/schema.rb +10 -2
- data/lib/paperclip/storage/filesystem.rb +1 -1
- data/lib/paperclip/storage/fog.rb +18 -7
- data/lib/paperclip/storage/s3.rb +53 -22
- data/lib/paperclip/style.rb +8 -2
- data/lib/paperclip/tempfile_factory.rb +5 -1
- data/lib/paperclip/thumbnail.rb +12 -10
- data/lib/paperclip/url_generator.rb +11 -3
- data/lib/paperclip/validators/attachment_content_type_validator.rb +4 -0
- data/lib/paperclip/validators/attachment_file_name_validator.rb +80 -0
- data/lib/paperclip/validators/attachment_file_type_ignorance_validator.rb +29 -0
- data/lib/paperclip/validators/attachment_presence_validator.rb +4 -0
- data/lib/paperclip/validators/attachment_size_validator.rb +11 -3
- data/lib/paperclip/validators/media_type_spoof_detection_validator.rb +27 -0
- data/lib/paperclip/validators.rb +10 -3
- data/lib/paperclip/version.rb +1 -1
- data/lib/paperclip.rb +26 -8
- data/lib/tasks/paperclip.rake +17 -2
- data/paperclip.gemspec +16 -14
- data/shoulda_macros/paperclip.rb +0 -1
- data/spec/paperclip/attachment_definitions_spec.rb +13 -0
- data/{test/attachment_processing_test.rb → spec/paperclip/attachment_processing_spec.rb} +20 -21
- data/spec/paperclip/attachment_registry_spec.rb +130 -0
- data/{test/attachment_test.rb → spec/paperclip/attachment_spec.rb} +438 -397
- data/{test/content_type_detector_test.rb → spec/paperclip/content_type_detector_spec.rb} +16 -19
- data/spec/paperclip/deprecations_spec.rb +65 -0
- data/{test/file_command_content_type_detector_test.rb → spec/paperclip/file_command_content_type_detector_spec.rb} +5 -6
- data/spec/paperclip/filename_cleaner_spec.rb +14 -0
- data/spec/paperclip/geometry_detector_spec.rb +39 -0
- data/{test/geometry_parser_test.rb → spec/paperclip/geometry_parser_spec.rb} +27 -27
- data/{test/geometry_test.rb → spec/paperclip/geometry_spec.rb} +50 -52
- data/spec/paperclip/glue_spec.rb +44 -0
- data/{test/has_attached_file_test.rb → spec/paperclip/has_attached_file_spec.rb} +45 -28
- data/{test/integration_test.rb → spec/paperclip/integration_spec.rb} +134 -126
- data/{test/interpolations_test.rb → spec/paperclip/interpolations_spec.rb} +70 -46
- data/spec/paperclip/io_adapters/abstract_adapter_spec.rb +78 -0
- data/{test/io_adapters/attachment_adapter_test.rb → spec/paperclip/io_adapters/attachment_adapter_spec.rb} +27 -29
- data/{test/io_adapters/data_uri_adapter_test.rb → spec/paperclip/io_adapters/data_uri_adapter_spec.rb} +26 -17
- data/spec/paperclip/io_adapters/empty_string_adapter_spec.rb +17 -0
- data/{test/io_adapters/file_adapter_test.rb → spec/paperclip/io_adapters/file_adapter_spec.rb} +36 -40
- data/{test/io_adapters/http_url_proxy_adapter_test.rb → spec/paperclip/io_adapters/http_url_proxy_adapter_spec.rb} +31 -29
- data/spec/paperclip/io_adapters/identity_adapter_spec.rb +8 -0
- data/{test/io_adapters/nil_adapter_test.rb → spec/paperclip/io_adapters/nil_adapter_spec.rb} +7 -7
- data/{test/io_adapters/registry_test.rb → spec/paperclip/io_adapters/registry_spec.rb} +10 -7
- data/{test/io_adapters/stringio_adapter_test.rb → spec/paperclip/io_adapters/stringio_adapter_spec.rb} +20 -17
- data/{test/io_adapters/uploaded_file_adapter_test.rb → spec/paperclip/io_adapters/uploaded_file_adapter_spec.rb} +41 -41
- data/{test/io_adapters/uri_adapter_test.rb → spec/paperclip/io_adapters/uri_adapter_spec.rb} +53 -28
- data/spec/paperclip/matchers/have_attached_file_matcher_spec.rb +19 -0
- data/spec/paperclip/matchers/validate_attachment_content_type_matcher_spec.rb +99 -0
- data/spec/paperclip/matchers/validate_attachment_presence_matcher_spec.rb +69 -0
- data/spec/paperclip/matchers/validate_attachment_size_matcher_spec.rb +88 -0
- data/spec/paperclip/media_type_spoof_detector_spec.rb +79 -0
- data/spec/paperclip/meta_class_spec.rb +30 -0
- data/spec/paperclip/paperclip_missing_attachment_styles_spec.rb +84 -0
- data/{test/paperclip_test.rb → spec/paperclip/paperclip_spec.rb} +53 -48
- data/spec/paperclip/plural_cache_spec.rb +37 -0
- data/spec/paperclip/processor_helpers_spec.rb +57 -0
- data/{test/processor_test.rb → spec/paperclip/processor_spec.rb} +5 -5
- data/spec/paperclip/rails_environment_spec.rb +33 -0
- data/{test/rake_test.rb → spec/paperclip/rake_spec.rb} +15 -15
- data/spec/paperclip/schema_spec.rb +248 -0
- data/{test/storage/filesystem_test.rb → spec/paperclip/storage/filesystem_spec.rb} +18 -18
- data/spec/paperclip/storage/fog_spec.rb +535 -0
- data/spec/paperclip/storage/s3_live_spec.rb +182 -0
- data/spec/paperclip/storage/s3_spec.rb +1526 -0
- data/spec/paperclip/style_spec.rb +255 -0
- data/spec/paperclip/tempfile_factory_spec.rb +33 -0
- data/{test/thumbnail_test.rb → spec/paperclip/thumbnail_spec.rb} +123 -107
- data/spec/paperclip/url_generator_spec.rb +211 -0
- data/spec/paperclip/validators/attachment_content_type_validator_spec.rb +322 -0
- data/spec/paperclip/validators/attachment_file_name_validator_spec.rb +160 -0
- data/{test/validators/attachment_presence_validator_test.rb → spec/paperclip/validators/attachment_presence_validator_spec.rb} +20 -20
- data/{test/validators/attachment_size_validator_test.rb → spec/paperclip/validators/attachment_size_validator_spec.rb} +65 -58
- data/spec/paperclip/validators/media_type_spoof_detection_validator_spec.rb +52 -0
- data/spec/paperclip/validators_spec.rb +164 -0
- data/spec/spec_helper.rb +43 -0
- data/spec/support/assertions.rb +71 -0
- data/spec/support/deprecations.rb +9 -0
- data/spec/support/fake_model.rb +25 -0
- data/spec/support/fake_rails.rb +12 -0
- data/spec/support/fixtures/empty.html +1 -0
- data/spec/support/fixtures/empty.xlsx +0 -0
- data/spec/support/fixtures/spaced file.jpg +0 -0
- data/spec/support/matchers/accept.rb +5 -0
- data/spec/support/matchers/exist.rb +5 -0
- data/spec/support/matchers/have_column.rb +23 -0
- data/spec/support/model_reconstruction.rb +60 -0
- data/spec/support/rails_helpers.rb +7 -0
- data/spec/support/test_data.rb +13 -0
- data/spec/support/version_helper.rb +9 -0
- metadata +334 -219
- data/RUNNING_TESTS.md +0 -4
- data/gemfiles/3.0.gemfile +0 -11
- data/gemfiles/3.1.gemfile +0 -11
- data/gemfiles/4.0.gemfile +0 -11
- data/test/attachment_definitions_test.rb +0 -12
- data/test/attachment_registry_test.rb +0 -88
- data/test/filename_cleaner_test.rb +0 -14
- data/test/generator_test.rb +0 -84
- data/test/geometry_detector_test.rb +0 -24
- data/test/helper.rb +0 -232
- data/test/io_adapters/abstract_adapter_test.rb +0 -58
- data/test/io_adapters/empty_string_adapter_test.rb +0 -18
- data/test/io_adapters/identity_adapter_test.rb +0 -8
- data/test/matchers/have_attached_file_matcher_test.rb +0 -24
- data/test/matchers/validate_attachment_content_type_matcher_test.rb +0 -110
- data/test/matchers/validate_attachment_presence_matcher_test.rb +0 -69
- data/test/matchers/validate_attachment_size_matcher_test.rb +0 -86
- data/test/meta_class_test.rb +0 -32
- data/test/paperclip_missing_attachment_styles_test.rb +0 -90
- data/test/plural_cache_test.rb +0 -36
- data/test/schema_test.rb +0 -200
- data/test/storage/fog_test.rb +0 -473
- data/test/storage/s3_live_test.rb +0 -179
- data/test/storage/s3_test.rb +0 -1356
- data/test/style_test.rb +0 -213
- data/test/support/mock_model.rb +0 -2
- data/test/tempfile_factory_test.rb +0 -17
- data/test/url_generator_test.rb +0 -187
- data/test/validators/attachment_content_type_validator_test.rb +0 -324
- data/test/validators_test.rb +0 -61
- /data/{test → spec}/database.yml +0 -0
- /data/{test → spec/support}/fixtures/12k.png +0 -0
- /data/{test → spec/support}/fixtures/50x50.png +0 -0
- /data/{test → spec/support}/fixtures/5k.png +0 -0
- /data/{test → spec/support}/fixtures/animated +0 -0
- /data/{test → spec/support}/fixtures/animated.gif +0 -0
- /data/{test → spec/support}/fixtures/animated.unknown +0 -0
- /data/{test → spec/support}/fixtures/bad.png +0 -0
- /data/{test → spec/support}/fixtures/fog.yml +0 -0
- /data/{test → spec/support}/fixtures/rotated.jpg +0 -0
- /data/{test → spec/support}/fixtures/s3.yml +0 -0
- /data/{test → spec/support}/fixtures/spaced file.png +0 -0
- /data/{test → spec/support}/fixtures/text.txt +0 -0
- /data/{test → spec/support}/fixtures/twopage.pdf +0 -0
- /data/{test → spec/support}/fixtures/uppercase.PNG +0 -0
- /data/{test → spec}/support/mock_attachment.rb +0 -0
- /data/{test → spec}/support/mock_interpolator.rb +0 -0
- /data/{test → spec}/support/mock_url_generator_builder.rb +0 -0
data/RUNNING_TESTS.md
DELETED
data/gemfiles/3.0.gemfile
DELETED
@@ -1,11 +0,0 @@
|
|
1
|
-
# This file was generated by Appraisal
|
2
|
-
|
3
|
-
source "https://rubygems.org"
|
4
|
-
|
5
|
-
gem "jruby-openssl", :platform=>:jruby
|
6
|
-
gem "activerecord-jdbcsqlite3-adapter", :platform=>:jruby
|
7
|
-
gem "pry", :platform=>:ruby
|
8
|
-
gem "rails", "~> 3.0.20"
|
9
|
-
gem "paperclip", :path=>"../"
|
10
|
-
|
11
|
-
gemspec :path=>"../"
|
data/gemfiles/3.1.gemfile
DELETED
@@ -1,11 +0,0 @@
|
|
1
|
-
# This file was generated by Appraisal
|
2
|
-
|
3
|
-
source "https://rubygems.org"
|
4
|
-
|
5
|
-
gem "jruby-openssl", :platform=>:jruby
|
6
|
-
gem "activerecord-jdbcsqlite3-adapter", :platform=>:jruby
|
7
|
-
gem "pry", :platform=>:ruby
|
8
|
-
gem "rails", "~> 3.1.12"
|
9
|
-
gem "paperclip", :path=>"../"
|
10
|
-
|
11
|
-
gemspec :path=>"../"
|
data/gemfiles/4.0.gemfile
DELETED
@@ -1,11 +0,0 @@
|
|
1
|
-
# This file was generated by Appraisal
|
2
|
-
|
3
|
-
source "https://rubygems.org"
|
4
|
-
|
5
|
-
gem "jruby-openssl", :platform=>:jruby
|
6
|
-
gem "activerecord-jdbcsqlite3-adapter", :platform=>:jruby
|
7
|
-
gem "pry", :platform=>:ruby
|
8
|
-
gem "rails", "~> 4.0.0"
|
9
|
-
gem "paperclip", :path=>"../"
|
10
|
-
|
11
|
-
gemspec :path=>"../"
|
@@ -1,12 +0,0 @@
|
|
1
|
-
require './test/helper'
|
2
|
-
|
3
|
-
class AttachmentDefinitionsTest < Test::Unit::TestCase
|
4
|
-
should 'return all of the attachments on the class' do
|
5
|
-
reset_class "Dummy"
|
6
|
-
Dummy.has_attached_file :avatar, {:path => "abc"}
|
7
|
-
Dummy.has_attached_file :other_attachment, {:url => "123"}
|
8
|
-
expected = {:avatar => {:path => "abc"}, :other_attachment => {:url => "123"}}
|
9
|
-
|
10
|
-
assert_equal expected, Dummy.attachment_definitions
|
11
|
-
end
|
12
|
-
end
|
@@ -1,88 +0,0 @@
|
|
1
|
-
require './test/helper'
|
2
|
-
require 'paperclip/attachment_registry'
|
3
|
-
|
4
|
-
class AttachmentRegistryTest < Test::Unit::TestCase
|
5
|
-
def setup
|
6
|
-
Paperclip::AttachmentRegistry.clear
|
7
|
-
end
|
8
|
-
|
9
|
-
context '.names_for' do
|
10
|
-
should 'include attachment names for the given class' do
|
11
|
-
foo = Class.new
|
12
|
-
Paperclip::AttachmentRegistry.register(foo, :avatar, {})
|
13
|
-
|
14
|
-
assert_equal [:avatar], Paperclip::AttachmentRegistry.names_for(foo)
|
15
|
-
end
|
16
|
-
|
17
|
-
should 'not include attachment names for other classes' do
|
18
|
-
foo = Class.new
|
19
|
-
bar = Class.new
|
20
|
-
Paperclip::AttachmentRegistry.register(foo, :avatar, {})
|
21
|
-
Paperclip::AttachmentRegistry.register(bar, :lover, {})
|
22
|
-
|
23
|
-
assert_equal [:lover], Paperclip::AttachmentRegistry.names_for(bar)
|
24
|
-
end
|
25
|
-
|
26
|
-
should 'produce the empty array for a missing key' do
|
27
|
-
assert_empty Paperclip::AttachmentRegistry.names_for(Class.new)
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
context '.each_definition' do
|
32
|
-
should 'call the block with the class, attachment name, and options' do
|
33
|
-
foo = Class.new
|
34
|
-
expected_accumulations = [
|
35
|
-
[foo, :avatar, { yo: 'greeting' }],
|
36
|
-
[foo, :greeter, { ciao: 'greeting' }]
|
37
|
-
]
|
38
|
-
expected_accumulations.each do |args|
|
39
|
-
Paperclip::AttachmentRegistry.register(*args)
|
40
|
-
end
|
41
|
-
accumulations = []
|
42
|
-
|
43
|
-
Paperclip::AttachmentRegistry.each_definition do |*args|
|
44
|
-
accumulations << args
|
45
|
-
end
|
46
|
-
|
47
|
-
assert_equal expected_accumulations, accumulations
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
context '.definitions_for' do
|
52
|
-
should 'produce the attachment name and options' do
|
53
|
-
expected_definitions = {
|
54
|
-
avatar: { yo: 'greeting' },
|
55
|
-
greeter: { ciao: 'greeting' }
|
56
|
-
}
|
57
|
-
foo = Class.new
|
58
|
-
Paperclip::AttachmentRegistry.register(foo, :avatar, { yo: 'greeting' })
|
59
|
-
Paperclip::AttachmentRegistry.register(foo, :greeter, { ciao: 'greeting' })
|
60
|
-
|
61
|
-
definitions = Paperclip::AttachmentRegistry.definitions_for(foo)
|
62
|
-
|
63
|
-
assert_equal expected_definitions, definitions
|
64
|
-
end
|
65
|
-
|
66
|
-
should "produce defintions for subclasses" do
|
67
|
-
expected_definitions = { avatar: { yo: 'greeting' } }
|
68
|
-
Foo = Class.new
|
69
|
-
Bar = Class.new(Foo)
|
70
|
-
Paperclip::AttachmentRegistry.register(Foo, :avatar, expected_definitions[:avatar])
|
71
|
-
|
72
|
-
definitions = Paperclip::AttachmentRegistry.definitions_for(Bar)
|
73
|
-
|
74
|
-
assert_equal expected_definitions, definitions
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
context '.clear' do
|
79
|
-
should 'remove all of the existing attachment definitions' do
|
80
|
-
foo = Class.new
|
81
|
-
Paperclip::AttachmentRegistry.register(foo, :greeter, { ciao: 'greeting' })
|
82
|
-
|
83
|
-
Paperclip::AttachmentRegistry.clear
|
84
|
-
|
85
|
-
assert_empty Paperclip::AttachmentRegistry.names_for(foo)
|
86
|
-
end
|
87
|
-
end
|
88
|
-
end
|
@@ -1,14 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
require './test/helper'
|
3
|
-
|
4
|
-
class FilenameCleanerTest < Test::Unit::TestCase
|
5
|
-
should 'convert invalid characters to underscores' do
|
6
|
-
cleaner = Paperclip::FilenameCleaner.new(/[aeiou]/)
|
7
|
-
assert_equal "b_s_b_ll", cleaner.call("baseball")
|
8
|
-
end
|
9
|
-
|
10
|
-
should 'not convert anything if the character regex is nil' do
|
11
|
-
cleaner = Paperclip::FilenameCleaner.new(nil)
|
12
|
-
assert_equal "baseball", cleaner.call("baseball")
|
13
|
-
end
|
14
|
-
end
|
data/test/generator_test.rb
DELETED
@@ -1,84 +0,0 @@
|
|
1
|
-
require './test/helper'
|
2
|
-
require 'rails/generators'
|
3
|
-
require 'generators/paperclip/paperclip_generator'
|
4
|
-
|
5
|
-
class GeneratorTest < Rails::Generators::TestCase
|
6
|
-
tests PaperclipGenerator
|
7
|
-
destination File.expand_path("../tmp", File.dirname(__FILE__))
|
8
|
-
setup :prepare_destination
|
9
|
-
|
10
|
-
context 'running migration' do
|
11
|
-
context 'with single attachment name' do
|
12
|
-
setup do
|
13
|
-
run_generator %w(user avatar)
|
14
|
-
end
|
15
|
-
|
16
|
-
should 'create a correct migration file' do
|
17
|
-
assert_migration 'db/migrate/add_attachment_avatar_to_users.rb' do |migration|
|
18
|
-
assert_match /class AddAttachmentAvatarToUsers/, migration
|
19
|
-
|
20
|
-
assert_class_method :up, migration do |up|
|
21
|
-
expected = <<-migration
|
22
|
-
change_table :users do |t|
|
23
|
-
t.attachment :avatar
|
24
|
-
end
|
25
|
-
migration
|
26
|
-
|
27
|
-
assert_equal expected.squish, up.squish
|
28
|
-
end
|
29
|
-
|
30
|
-
assert_class_method :down, migration do |down|
|
31
|
-
expected = <<-migration
|
32
|
-
drop_attached_file :users, :avatar
|
33
|
-
migration
|
34
|
-
|
35
|
-
assert_equal expected.squish, down.squish
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
context 'with multiple attachment names' do
|
42
|
-
setup do
|
43
|
-
run_generator %w(user avatar photo)
|
44
|
-
end
|
45
|
-
|
46
|
-
should 'create a correct migration file' do
|
47
|
-
assert_migration 'db/migrate/add_attachment_avatar_photo_to_users.rb' do |migration|
|
48
|
-
assert_match /class AddAttachmentAvatarPhotoToUsers/, migration
|
49
|
-
|
50
|
-
assert_class_method :up, migration do |up|
|
51
|
-
expected = <<-migration
|
52
|
-
change_table :users do |t|
|
53
|
-
t.attachment :avatar
|
54
|
-
t.attachment :photo
|
55
|
-
end
|
56
|
-
migration
|
57
|
-
|
58
|
-
assert_equal expected.squish, up.squish
|
59
|
-
end
|
60
|
-
|
61
|
-
assert_class_method :down, migration do |down|
|
62
|
-
expected = <<-migration
|
63
|
-
drop_attached_file :users, :avatar
|
64
|
-
drop_attached_file :users, :photo
|
65
|
-
migration
|
66
|
-
|
67
|
-
assert_equal expected.squish, down.squish
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
context 'without required arguments' do
|
74
|
-
should 'not create the migration' do
|
75
|
-
begin
|
76
|
-
silence_stream(STDERR) { run_generator %w() }
|
77
|
-
assert_no_migration 'db/migrate/add_attachment_avatar_to_users.rb'
|
78
|
-
rescue Thor::RequiredArgumentMissingError
|
79
|
-
# This is also OK. It happens in 1.9.2 and Rails 3.2
|
80
|
-
end
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
@@ -1,24 +0,0 @@
|
|
1
|
-
require './test/helper'
|
2
|
-
|
3
|
-
class GeometryDetectorTest < Test::Unit::TestCase
|
4
|
-
should 'identify an image and extract its dimensions' do
|
5
|
-
Paperclip::GeometryParser.stubs(:new).with("434x66,").returns(stub(:make => :correct))
|
6
|
-
file = fixture_file("5k.png")
|
7
|
-
factory = Paperclip::GeometryDetector.new(file)
|
8
|
-
|
9
|
-
output = factory.make
|
10
|
-
|
11
|
-
assert_equal :correct, output
|
12
|
-
end
|
13
|
-
|
14
|
-
should 'identify an image and extract its dimensions and orientation' do
|
15
|
-
Paperclip::GeometryParser.stubs(:new).with("300x200,6").returns(stub(:make => :correct))
|
16
|
-
file = fixture_file("rotated.jpg")
|
17
|
-
factory = Paperclip::GeometryDetector.new(file)
|
18
|
-
|
19
|
-
output = factory.make
|
20
|
-
|
21
|
-
assert_equal :correct, output
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
data/test/helper.rb
DELETED
@@ -1,232 +0,0 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'tempfile'
|
3
|
-
require 'pathname'
|
4
|
-
require 'test/unit'
|
5
|
-
require 'active_record'
|
6
|
-
require 'active_record/version'
|
7
|
-
require 'active_support'
|
8
|
-
require 'active_support/core_ext'
|
9
|
-
require 'shoulda'
|
10
|
-
require 'mocha/setup'
|
11
|
-
require 'bourne'
|
12
|
-
require 'shoulda/context'
|
13
|
-
require 'mime/types'
|
14
|
-
require 'pathname'
|
15
|
-
require 'ostruct'
|
16
|
-
|
17
|
-
begin
|
18
|
-
require 'pry'
|
19
|
-
rescue LoadError
|
20
|
-
# Pry is not available, just ignore.
|
21
|
-
end
|
22
|
-
|
23
|
-
puts "Testing against version #{ActiveRecord::VERSION::STRING}"
|
24
|
-
|
25
|
-
`ruby -e 'exit 0'` # Prime $? with a value.
|
26
|
-
|
27
|
-
begin
|
28
|
-
require 'ruby-debug'
|
29
|
-
rescue LoadError
|
30
|
-
puts "debugger disabled"
|
31
|
-
end
|
32
|
-
|
33
|
-
ROOT = Pathname(File.expand_path(File.join(File.dirname(__FILE__), '..')))
|
34
|
-
|
35
|
-
$previous_count = 0
|
36
|
-
class Test::Unit::TestCase
|
37
|
-
def setup
|
38
|
-
silence_warnings do
|
39
|
-
Object.const_set(:Rails, stub('Rails'))
|
40
|
-
Rails.stubs(:root).returns(Pathname.new(ROOT).join('tmp'))
|
41
|
-
Rails.stubs(:env).returns('test')
|
42
|
-
Rails.stubs(:const_defined?).with(:Railtie).returns(false)
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
def teardown
|
47
|
-
end
|
48
|
-
|
49
|
-
def report_files
|
50
|
-
files = []
|
51
|
-
ObjectSpace.each_object(IO){|io| files << io unless io.closed? }
|
52
|
-
if files.count > $previous_count
|
53
|
-
puts __name__
|
54
|
-
puts "#{files.count} files"
|
55
|
-
files.each do |file|
|
56
|
-
puts "Open IO: #{file.inspect}"
|
57
|
-
end
|
58
|
-
end
|
59
|
-
$previous_count = files.count
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
$LOAD_PATH << File.join(ROOT, 'lib')
|
64
|
-
$LOAD_PATH << File.join(ROOT, 'lib', 'paperclip')
|
65
|
-
|
66
|
-
require File.join(ROOT, 'lib', 'paperclip.rb')
|
67
|
-
|
68
|
-
require './shoulda_macros/paperclip'
|
69
|
-
|
70
|
-
FIXTURES_DIR = File.join(File.dirname(__FILE__), "fixtures")
|
71
|
-
config = YAML::load(IO.read(File.dirname(__FILE__) + '/database.yml'))
|
72
|
-
ActiveRecord::Base.logger = Logger.new(File.dirname(__FILE__) + "/debug.log")
|
73
|
-
ActiveRecord::Base.establish_connection(config['test'])
|
74
|
-
Paperclip.options[:logger] = ActiveRecord::Base.logger
|
75
|
-
|
76
|
-
def using_protected_attributes?
|
77
|
-
ActiveRecord::VERSION::MAJOR < 4
|
78
|
-
end
|
79
|
-
|
80
|
-
def require_everything_in_directory(directory_name)
|
81
|
-
Dir[File.join(File.dirname(__FILE__), directory_name, '*')].each do |f|
|
82
|
-
require f
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
require_everything_in_directory('support')
|
87
|
-
|
88
|
-
def reset_class class_name
|
89
|
-
ActiveRecord::Base.send(:include, Paperclip::Glue)
|
90
|
-
Object.send(:remove_const, class_name) rescue nil
|
91
|
-
klass = Object.const_set(class_name, Class.new(ActiveRecord::Base))
|
92
|
-
|
93
|
-
klass.class_eval do
|
94
|
-
include Paperclip::Glue
|
95
|
-
end
|
96
|
-
|
97
|
-
klass.reset_column_information
|
98
|
-
klass.connection_pool.clear_table_cache!(klass.table_name) if klass.connection_pool.respond_to?(:clear_table_cache!)
|
99
|
-
klass.connection.schema_cache.clear_table_cache!(klass.table_name) if klass.connection.respond_to?(:schema_cache)
|
100
|
-
klass
|
101
|
-
end
|
102
|
-
|
103
|
-
def reset_table table_name, &block
|
104
|
-
block ||= lambda { |table| true }
|
105
|
-
ActiveRecord::Base.connection.create_table :dummies, {:force => true}, &block
|
106
|
-
end
|
107
|
-
|
108
|
-
def modify_table table_name, &block
|
109
|
-
ActiveRecord::Base.connection.change_table :dummies, &block
|
110
|
-
end
|
111
|
-
|
112
|
-
def rebuild_model options = {}
|
113
|
-
ActiveRecord::Base.connection.create_table :dummies, :force => true do |table|
|
114
|
-
table.column :title, :string
|
115
|
-
table.column :other, :string
|
116
|
-
table.column :avatar_file_name, :string
|
117
|
-
table.column :avatar_content_type, :string
|
118
|
-
table.column :avatar_file_size, :integer
|
119
|
-
table.column :avatar_updated_at, :datetime
|
120
|
-
table.column :avatar_fingerprint, :string
|
121
|
-
end
|
122
|
-
rebuild_class options
|
123
|
-
end
|
124
|
-
|
125
|
-
def rebuild_class options = {}
|
126
|
-
reset_class("Dummy").tap do |klass|
|
127
|
-
klass.has_attached_file :avatar, options
|
128
|
-
Paperclip.reset_duplicate_clash_check!
|
129
|
-
end
|
130
|
-
end
|
131
|
-
|
132
|
-
def rebuild_meta_class_of obj, options = {}
|
133
|
-
(class << obj; self; end).tap do |metaklass|
|
134
|
-
metaklass.has_attached_file :avatar, options
|
135
|
-
Paperclip.reset_duplicate_clash_check!
|
136
|
-
end
|
137
|
-
end
|
138
|
-
|
139
|
-
class FakeModel
|
140
|
-
attr_accessor :avatar_file_name,
|
141
|
-
:avatar_file_size,
|
142
|
-
:avatar_updated_at,
|
143
|
-
:avatar_content_type,
|
144
|
-
:avatar_fingerprint,
|
145
|
-
:id
|
146
|
-
|
147
|
-
def errors
|
148
|
-
@errors ||= []
|
149
|
-
end
|
150
|
-
|
151
|
-
def run_paperclip_callbacks name, *args
|
152
|
-
end
|
153
|
-
|
154
|
-
def valid?
|
155
|
-
errors.empty?
|
156
|
-
end
|
157
|
-
end
|
158
|
-
|
159
|
-
def attachment(options={})
|
160
|
-
Paperclip::Attachment.new(:avatar, FakeModel.new, options)
|
161
|
-
end
|
162
|
-
|
163
|
-
def silence_warnings
|
164
|
-
old_verbose, $VERBOSE = $VERBOSE, nil
|
165
|
-
yield
|
166
|
-
ensure
|
167
|
-
$VERBOSE = old_verbose
|
168
|
-
end
|
169
|
-
|
170
|
-
def should_accept_dummy_class
|
171
|
-
should "accept the class" do
|
172
|
-
assert_accepts @matcher, @dummy_class
|
173
|
-
end
|
174
|
-
|
175
|
-
should "accept an instance of that class" do
|
176
|
-
assert_accepts @matcher, @dummy_class.new
|
177
|
-
end
|
178
|
-
end
|
179
|
-
|
180
|
-
def should_reject_dummy_class
|
181
|
-
should "reject the class" do
|
182
|
-
assert_rejects @matcher, @dummy_class
|
183
|
-
end
|
184
|
-
|
185
|
-
should "reject an instance of that class" do
|
186
|
-
assert_rejects @matcher, @dummy_class.new
|
187
|
-
end
|
188
|
-
end
|
189
|
-
|
190
|
-
def with_exitstatus_returning(code)
|
191
|
-
saved_exitstatus = $?.nil? ? 0 : $?.exitstatus
|
192
|
-
begin
|
193
|
-
`ruby -e 'exit #{code.to_i}'`
|
194
|
-
yield
|
195
|
-
ensure
|
196
|
-
`ruby -e 'exit #{saved_exitstatus.to_i}'`
|
197
|
-
end
|
198
|
-
end
|
199
|
-
|
200
|
-
def fixture_file(filename)
|
201
|
-
File.join(File.dirname(__FILE__), 'fixtures', filename)
|
202
|
-
end
|
203
|
-
|
204
|
-
def assert_success_response(url)
|
205
|
-
Net::HTTP.get_response(URI.parse(url)) do |response|
|
206
|
-
assert_equal "200", response.code,
|
207
|
-
"Expected HTTP response code 200, got #{response.code}"
|
208
|
-
end
|
209
|
-
end
|
210
|
-
|
211
|
-
def assert_not_found_response(url)
|
212
|
-
Net::HTTP.get_response(URI.parse(url)) do |response|
|
213
|
-
assert_equal "404", response.code,
|
214
|
-
"Expected HTTP response code 404, got #{response.code}"
|
215
|
-
end
|
216
|
-
end
|
217
|
-
|
218
|
-
def assert_file_exists(path)
|
219
|
-
assert File.exists?(path), %(Expect "#{path}" to be exists.)
|
220
|
-
end
|
221
|
-
|
222
|
-
def assert_file_not_exists(path)
|
223
|
-
assert !File.exists?(path), %(Expect "#{path}" to not exists.)
|
224
|
-
end
|
225
|
-
|
226
|
-
def assert_frame_dimensions(range, frames)
|
227
|
-
frames.each_with_index do |frame, frame_index|
|
228
|
-
frame.split('x').each_with_index do |dimension, dimension_index |
|
229
|
-
assert range.include?(dimension.to_i), "Frame #{frame_index}[#{dimension_index}] should have been within #{range.inspect}, but was #{dimension}"
|
230
|
-
end
|
231
|
-
end
|
232
|
-
end
|
@@ -1,58 +0,0 @@
|
|
1
|
-
require './test/helper'
|
2
|
-
|
3
|
-
class AbstractAdapterTest < Test::Unit::TestCase
|
4
|
-
class TestAdapter < Paperclip::AbstractAdapter
|
5
|
-
attr_accessor :tempfile
|
6
|
-
|
7
|
-
def content_type
|
8
|
-
Paperclip::ContentTypeDetector.new(path).detect
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
context "content type from file command" do
|
13
|
-
setup do
|
14
|
-
@adapter = TestAdapter.new
|
15
|
-
@adapter.stubs(:path).returns("image.png")
|
16
|
-
end
|
17
|
-
|
18
|
-
should "return the content type without newline" do
|
19
|
-
assert_equal "image/png", @adapter.content_type
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
context "nil?" do
|
24
|
-
should "return false" do
|
25
|
-
assert !TestAdapter.new.nil?
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
context "delegation" do
|
30
|
-
setup do
|
31
|
-
@adapter = TestAdapter.new
|
32
|
-
@adapter.tempfile = stub("Tempfile")
|
33
|
-
end
|
34
|
-
|
35
|
-
[:binmode, :binmode?, :close, :close!, :closed?, :eof?, :path, :rewind, :unlink].each do |method|
|
36
|
-
should "delegate #{method} to @tempfile" do
|
37
|
-
@adapter.tempfile.stubs(method)
|
38
|
-
@adapter.public_send(method)
|
39
|
-
assert_received @adapter.tempfile, method
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
should 'get rid of slashes and colons in filenames' do
|
45
|
-
@adapter = TestAdapter.new
|
46
|
-
@adapter.original_filename = "awesome/file:name.png"
|
47
|
-
|
48
|
-
assert_equal "awesome_file_name.png", @adapter.original_filename
|
49
|
-
end
|
50
|
-
|
51
|
-
should 'be an assignment' do
|
52
|
-
assert TestAdapter.new.assignment?
|
53
|
-
end
|
54
|
-
|
55
|
-
should 'not be nil' do
|
56
|
-
assert !TestAdapter.new.nil?
|
57
|
-
end
|
58
|
-
end
|
@@ -1,18 +0,0 @@
|
|
1
|
-
require './test/helper'
|
2
|
-
|
3
|
-
class EmptyStringAdapterTest < Test::Unit::TestCase
|
4
|
-
|
5
|
-
context 'a new instance' do
|
6
|
-
setup do
|
7
|
-
@subject = Paperclip.io_adapters.for('')
|
8
|
-
end
|
9
|
-
|
10
|
-
should "return false for a call to nil?" do
|
11
|
-
assert !@subject.nil?
|
12
|
-
end
|
13
|
-
|
14
|
-
should 'return false for a call to assignment?' do
|
15
|
-
assert !@subject.assignment?
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
@@ -1,24 +0,0 @@
|
|
1
|
-
require './test/helper'
|
2
|
-
|
3
|
-
class HaveAttachedFileMatcherTest < Test::Unit::TestCase
|
4
|
-
context "have_attached_file" do
|
5
|
-
setup do
|
6
|
-
@dummy_class = reset_class "Dummy"
|
7
|
-
reset_table "dummies"
|
8
|
-
@matcher = self.class.have_attached_file(:avatar)
|
9
|
-
end
|
10
|
-
|
11
|
-
context "given a class with no attachment" do
|
12
|
-
should_reject_dummy_class
|
13
|
-
end
|
14
|
-
|
15
|
-
context "given a class with an attachment" do
|
16
|
-
setup do
|
17
|
-
modify_table("dummies"){|d| d.string :avatar_file_name }
|
18
|
-
@dummy_class.has_attached_file :avatar
|
19
|
-
end
|
20
|
-
|
21
|
-
should_accept_dummy_class
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|