paperclip 5.0.0.beta2 → 5.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (89) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +17 -0
  3. data/.hound.yml +5 -16
  4. data/.travis.yml +14 -15
  5. data/Appraisals +3 -23
  6. data/CONTRIBUTING.md +10 -4
  7. data/Gemfile +1 -0
  8. data/NEWS +78 -2
  9. data/README.md +175 -81
  10. data/Rakefile +1 -1
  11. data/UPGRADING +1 -1
  12. data/features/basic_integration.feature +2 -2
  13. data/features/step_definitions/attachment_steps.rb +6 -6
  14. data/features/step_definitions/rails_steps.rb +29 -22
  15. data/features/step_definitions/s3_steps.rb +1 -1
  16. data/features/support/env.rb +1 -0
  17. data/features/support/paths.rb +1 -1
  18. data/features/support/rails.rb +0 -24
  19. data/gemfiles/{4.2.awsv2.0.gemfile → 4.2.gemfile} +1 -1
  20. data/gemfiles/{5.0.awsv2.1.gemfile → 5.0.gemfile} +2 -2
  21. data/lib/generators/paperclip/paperclip_generator.rb +9 -1
  22. data/lib/generators/paperclip/templates/paperclip_migration.rb.erb +1 -1
  23. data/lib/paperclip.rb +13 -10
  24. data/lib/paperclip/attachment.rb +16 -6
  25. data/lib/paperclip/content_type_detector.rb +3 -2
  26. data/lib/paperclip/errors.rb +3 -1
  27. data/lib/paperclip/file_command_content_type_detector.rb +1 -1
  28. data/lib/paperclip/geometry_detector_factory.rb +2 -2
  29. data/lib/paperclip/helpers.rb +15 -12
  30. data/lib/paperclip/interpolations.rb +1 -1
  31. data/lib/paperclip/io_adapters/abstract_adapter.rb +29 -3
  32. data/lib/paperclip/io_adapters/attachment_adapter.rb +10 -5
  33. data/lib/paperclip/io_adapters/data_uri_adapter.rb +8 -8
  34. data/lib/paperclip/io_adapters/empty_string_adapter.rb +5 -4
  35. data/lib/paperclip/io_adapters/file_adapter.rb +12 -6
  36. data/lib/paperclip/io_adapters/http_url_proxy_adapter.rb +7 -7
  37. data/lib/paperclip/io_adapters/identity_adapter.rb +12 -6
  38. data/lib/paperclip/io_adapters/nil_adapter.rb +8 -5
  39. data/lib/paperclip/io_adapters/registry.rb +6 -2
  40. data/lib/paperclip/io_adapters/stringio_adapter.rb +9 -6
  41. data/lib/paperclip/io_adapters/uploaded_file_adapter.rb +10 -6
  42. data/lib/paperclip/io_adapters/uri_adapter.rb +41 -19
  43. data/lib/paperclip/matchers/validate_attachment_content_type_matcher.rb +4 -4
  44. data/lib/paperclip/media_type_spoof_detector.rb +3 -2
  45. data/lib/paperclip/processor.rb +5 -4
  46. data/lib/paperclip/storage/filesystem.rb +13 -2
  47. data/lib/paperclip/storage/fog.rb +12 -7
  48. data/lib/paperclip/storage/s3.rb +46 -19
  49. data/lib/paperclip/thumbnail.rb +18 -8
  50. data/lib/paperclip/url_generator.rb +17 -13
  51. data/lib/paperclip/validators.rb +1 -1
  52. data/lib/paperclip/version.rb +3 -1
  53. data/lib/tasks/paperclip.rake +18 -4
  54. data/paperclip.gemspec +4 -5
  55. data/spec/paperclip/attachment_processing_spec.rb +2 -4
  56. data/spec/paperclip/attachment_spec.rb +40 -9
  57. data/spec/paperclip/content_type_detector_spec.rb +1 -1
  58. data/spec/paperclip/file_command_content_type_detector_spec.rb +15 -1
  59. data/spec/paperclip/io_adapters/abstract_adapter_spec.rb +76 -22
  60. data/spec/paperclip/io_adapters/attachment_adapter_spec.rb +6 -3
  61. data/spec/paperclip/io_adapters/data_uri_adapter_spec.rb +7 -1
  62. data/spec/paperclip/io_adapters/file_adapter_spec.rb +2 -2
  63. data/spec/paperclip/io_adapters/http_url_proxy_adapter_spec.rb +26 -6
  64. data/spec/paperclip/io_adapters/identity_adapter_spec.rb +1 -1
  65. data/spec/paperclip/io_adapters/registry_spec.rb +2 -2
  66. data/spec/paperclip/io_adapters/stringio_adapter_spec.rb +1 -1
  67. data/spec/paperclip/io_adapters/uploaded_file_adapter_spec.rb +5 -5
  68. data/spec/paperclip/io_adapters/uri_adapter_spec.rb +77 -7
  69. data/spec/paperclip/matchers/validate_attachment_content_type_matcher_spec.rb +10 -0
  70. data/spec/paperclip/media_type_spoof_detector_spec.rb +27 -3
  71. data/spec/paperclip/paperclip_spec.rb +13 -13
  72. data/spec/paperclip/processor_spec.rb +4 -4
  73. data/spec/paperclip/storage/fog_spec.rb +28 -0
  74. data/spec/paperclip/storage/s3_live_spec.rb +12 -10
  75. data/spec/paperclip/storage/s3_spec.rb +150 -39
  76. data/spec/paperclip/tempfile_spec.rb +35 -0
  77. data/spec/paperclip/thumbnail_spec.rb +38 -35
  78. data/spec/paperclip/url_generator_spec.rb +54 -43
  79. data/spec/paperclip/validators_spec.rb +3 -2
  80. data/spec/spec_helper.rb +3 -1
  81. data/spec/support/assertions.rb +5 -1
  82. data/spec/support/conditional_filter_helper.rb +5 -0
  83. data/spec/support/mock_attachment.rb +2 -0
  84. data/spec/support/mock_url_generator_builder.rb +2 -2
  85. metadata +37 -36
  86. data/gemfiles/4.2.awsv2.1.gemfile +0 -17
  87. data/gemfiles/4.2.awsv2.gemfile +0 -20
  88. data/gemfiles/5.0.awsv2.0.gemfile +0 -17
  89. data/gemfiles/5.0.awsv2.gemfile +0 -25
data/Rakefile CHANGED
@@ -9,7 +9,7 @@ task :default => [:clean, :all]
9
9
  desc 'Test the paperclip plugin under all supported Rails versions.'
10
10
  task :all do |t|
11
11
  if ENV['BUNDLE_GEMFILE']
12
- exec('rake spec cucumber')
12
+ exec('rake spec && cucumber')
13
13
  else
14
14
  exec("rm -f gemfiles/*.lock")
15
15
  Rake::Task["appraisal:gemfiles"].execute
data/UPGRADING CHANGED
@@ -1,5 +1,5 @@
1
1
  ##################################################
2
- # NOTE FOR UPGRADING FROM 4.3.0 OR EARLIER #
2
+ # NOTE FOR UPGRADING FROM 4.3.0 OR EARLIER #
3
3
  ##################################################
4
4
 
5
5
  Paperclip is now compatible with aws-sdk >= 2.0.0.
@@ -77,5 +77,5 @@ Feature: Rails integration
77
77
  And I attach the file "spec/support/fixtures/5k.png" to "Attachment" on S3
78
78
  And I press "Submit"
79
79
  Then I should see "Name: something"
80
- And I should see an image with a path of "http://s3.amazonaws.com/paperclip/attachments/original/5k.png"
81
- And the file at "http://s3.amazonaws.com/paperclip/attachments/original/5k.png" should be uploaded to S3
80
+ And I should see an image with a path of "//s3.amazonaws.com/paperclip/attachments/original/5k.png"
81
+ And the file at "//s3.amazonaws.com/paperclip/attachments/original/5k.png" should be uploaded to S3
@@ -23,7 +23,7 @@ When /^I modify my attachment definition to:$/ do |definition|
23
23
  end
24
24
 
25
25
  When /^I upload the fixture "([^"]*)"$/ do |filename|
26
- run_simple %(bundle exec #{runner_command} "User.create!(:attachment => File.open('#{fixture_path(filename)}'))")
26
+ run_simple %(bundle exec rails runner "User.create!(:attachment => File.open('#{fixture_path(filename)}'))")
27
27
  end
28
28
 
29
29
  Then /^the attachment "([^"]*)" should have a dimension of (\d+x\d+)$/ do |filename, dimension|
@@ -56,7 +56,7 @@ Then /^the attachment should have the same content type as the fixture "([^"]*)"
56
56
  require "mime/types"
57
57
  end
58
58
 
59
- attachment_content_type = `bundle exec #{runner_command} "puts User.last.attachment_content_type"`.strip
59
+ attachment_content_type = `bundle exec rails runner "puts User.last.attachment_content_type"`.strip
60
60
  expected = MIME::Types.type_for(filename).first.content_type
61
61
  expect(attachment_content_type).to eq(expected)
62
62
  end
@@ -64,14 +64,14 @@ end
64
64
 
65
65
  Then /^the attachment should have the same file name as the fixture "([^"]*)"$/ do |filename|
66
66
  cd(".") do
67
- attachment_file_name = `bundle exec #{runner_command} "puts User.last.attachment_file_name"`.strip
67
+ attachment_file_name = `bundle exec rails runner "puts User.last.attachment_file_name"`.strip
68
68
  expect(attachment_file_name).to eq(File.name(fixture_path(filename)).to_s)
69
69
  end
70
70
  end
71
71
 
72
72
  Then /^the attachment should have the same file size as the fixture "([^"]*)"$/ do |filename|
73
73
  cd(".") do
74
- attachment_file_size = `bundle exec #{runner_command} "puts User.last.attachment_file_size"`.strip
74
+ attachment_file_size = `bundle exec rails runner "puts User.last.attachment_file_size"`.strip
75
75
  expect(attachment_file_size).to eq(File.size(fixture_path(filename)).to_s)
76
76
  end
77
77
  end
@@ -84,7 +84,7 @@ end
84
84
 
85
85
  Then /^I should have attachment columns for "([^"]*)"$/ do |attachment_name|
86
86
  cd(".") do
87
- columns = eval(`bundle exec #{runner_command} "puts User.columns.map{ |column| [column.name, column.type] }.inspect"`.strip)
87
+ columns = eval(`bundle exec rails runner "puts User.columns.map{ |column| [column.name, column.type] }.inspect"`.strip)
88
88
  expect_columns = [
89
89
  ["#{attachment_name}_file_name", :string],
90
90
  ["#{attachment_name}_content_type", :string],
@@ -97,7 +97,7 @@ end
97
97
 
98
98
  Then /^I should not have attachment columns for "([^"]*)"$/ do |attachment_name|
99
99
  cd(".") do
100
- columns = eval(`bundle exec #{runner_command} "puts User.columns.map{ |column| [column.name, column.type] }.inspect"`.strip)
100
+ columns = eval(`bundle exec rails runner "puts User.columns.map{ |column| [column.name, column.type] }.inspect"`.strip)
101
101
  expect_columns = [
102
102
  ["#{attachment_name}_file_name", :string],
103
103
  ["#{attachment_name}_content_type", :string],
@@ -1,34 +1,33 @@
1
1
  Given /^I generate a new rails application$/ do
2
2
  steps %{
3
- When I run `bundle exec #{new_application_command} #{APP_NAME} --skip-bundle`
3
+ When I successfully run `rails new #{APP_NAME} --skip-bundle`
4
4
  And I cd to "#{APP_NAME}"
5
+ }
6
+
7
+ FileUtils.chdir("tmp/aruba/testapp/")
8
+
9
+ steps %{
5
10
  And I turn off class caching
6
- And I fix the application.rb for 3.0.12
7
11
  And I write to "Gemfile" with:
8
12
  """
9
13
  source "http://rubygems.org"
10
14
  gem "rails", "#{framework_version}"
11
- gem "sqlite3", "1.3.8", :platform => [:ruby, :rbx]
15
+ gem "sqlite3", :platform => [:ruby, :rbx]
12
16
  gem "activerecord-jdbcsqlite3-adapter", :platform => :jruby
13
17
  gem "jruby-openssl", :platform => :jruby
14
18
  gem "capybara"
15
19
  gem "gherkin"
16
- gem "aws-sdk"
20
+ gem "aws-sdk", "~> 2.0.0"
17
21
  gem "racc", :platform => :rbx
18
22
  gem "rubysl", :platform => :rbx
19
23
  """
20
24
  And I remove turbolinks
25
+ And I comment out lines that contain "action_mailer" in "config/environments/*.rb"
21
26
  And I empty the application.js file
22
27
  And I configure the application to use "paperclip" from this project
23
28
  }
24
- end
25
29
 
26
- Given "I fix the application.rb for 3.0.12" do
27
- cd(".") do
28
- File.open("config/application.rb", "a") do |f|
29
- f << "ActionController::Base.config.relative_url_root = ''"
30
- end
31
- end
30
+ FileUtils.chdir("../../..")
32
31
  end
33
32
 
34
33
  Given "I allow the attachment to be submitted" do
@@ -51,6 +50,16 @@ Given "I remove turbolinks" do
51
50
  end
52
51
  end
53
52
 
53
+ Given /^I comment out lines that contain "([^"]+)" in "([^"]+)"$/ do |contains, glob|
54
+ cd(".") do
55
+ Dir.glob(glob).each do |file|
56
+ transform_file(file) do |content|
57
+ content.gsub(/^(.*?#{contains}.*?)$/) { |line| "# #{line}" }
58
+ end
59
+ end
60
+ end
61
+ end
62
+
54
63
  Given /^I attach :attachment$/ do
55
64
  attach_attachment("attachment")
56
65
  end
@@ -60,11 +69,7 @@ Given /^I attach :attachment with:$/ do |definition|
60
69
  end
61
70
 
62
71
  def attach_attachment(name, definition = nil)
63
- snippet = ""
64
- if using_protected_attributes?
65
- snippet += "attr_accessible :name, :#{name}\n"
66
- end
67
- snippet += "has_attached_file :#{name}"
72
+ snippet = "has_attached_file :#{name}"
68
73
  if definition
69
74
  snippet += ", \n"
70
75
  snippet += definition
@@ -86,19 +91,19 @@ Given "I empty the application.js file" do
86
91
  end
87
92
 
88
93
  Given /^I run a rails generator to generate a "([^"]*)" scaffold with "([^"]*)"$/ do |model_name, attributes|
89
- step %[I successfully run `bundle exec #{generator_command} scaffold #{model_name} #{attributes}`]
94
+ step %[I successfully run `rails generate scaffold #{model_name} #{attributes}`]
90
95
  end
91
96
 
92
97
  Given /^I run a paperclip generator to add a paperclip "([^"]*)" to the "([^"]*)" model$/ do |attachment_name, model_name|
93
- step %[I successfully run `bundle exec #{generator_command} paperclip #{model_name} #{attachment_name}`]
98
+ step %[I successfully run `rails generate paperclip #{model_name} #{attachment_name}`]
94
99
  end
95
100
 
96
101
  Given /^I run a migration$/ do
97
- step %[I successfully run `bundle exec rake db:migrate --trace`]
102
+ step %[I successfully run `rake db:migrate --trace`]
98
103
  end
99
104
 
100
105
  When /^I rollback a migration$/ do
101
- step %[I successfully run `bundle exec rake db:rollback STEPS=1 --trace`]
106
+ step %[I successfully run `rake db:rollback STEPS=1 --trace`]
102
107
  end
103
108
 
104
109
  Given /^I update my new user view to include the file upload field$/ do
@@ -144,8 +149,10 @@ end
144
149
 
145
150
  Given /^I start the rails application$/ do
146
151
  cd(".") do
152
+ require "rails"
147
153
  require "./config/environment"
148
- require "capybara/rails"
154
+ require "capybara"
155
+ Capybara.app = Rails.application
149
156
  end
150
157
  end
151
158
 
@@ -171,7 +178,7 @@ end
171
178
 
172
179
  When /^I configure the application to use "([^\"]+)" from this project$/ do |name|
173
180
  append_to_gemfile "gem '#{name}', :path => '#{PROJECT_ROOT}'"
174
- steps %{And I run `bundle install --local`}
181
+ steps %{And I successfully run `bundle install --local`}
175
182
  end
176
183
 
177
184
  When /^I configure the application to use "([^\"]+)"$/ do |gem_name|
@@ -1,6 +1,6 @@
1
1
  When /^I attach the file "([^"]*)" to "([^"]*)" on S3$/ do |file_path, field|
2
2
  definition = Paperclip::AttachmentRegistry.definitions_for(User)[field.downcase.to_sym]
3
- path = "https://paperclip.s3-us-west-2.amazonaws.com#{definition[:path]}"
3
+ path = "https://paperclip.s3.us-west-2.amazonaws.com#{definition[:path]}"
4
4
  path.gsub!(':filename', File.basename(file_path))
5
5
  path.gsub!(/:([^\/\.]+)/) do |match|
6
6
  "([^\/\.]+)"
@@ -7,5 +7,6 @@ $CUCUMBER=1
7
7
  World(RSpec::Matchers)
8
8
 
9
9
  Before do
10
+ aruba.config.command_launcher = ENV.fetch("DEBUG", nil) ? :debug : :spawn
10
11
  @aruba_timeout_seconds = 120
11
12
  end
@@ -17,7 +17,7 @@ module NavigationHelpers
17
17
  page_name =~ /the (.*) page/
18
18
  path_components = $1.split(/\s+/)
19
19
  self.send(path_components.push('path').join('_').to_sym)
20
- rescue Object => e
20
+ rescue Object
21
21
  raise "Can't find mapping from \"#{page_name}\" to a path.\n" +
22
22
  "Now, go and add a mapping in #{__FILE__}"
23
23
  end
@@ -35,29 +35,5 @@ module RailsCommandHelpers
35
35
  def framework_major_version
36
36
  framework_version.split(".").first.to_i
37
37
  end
38
-
39
- def using_protected_attributes?
40
- framework_major_version < 4
41
- end
42
-
43
- def new_application_command
44
- "rails new"
45
- end
46
-
47
- def generator_command
48
- if framework_major_version >= 4
49
- "rails generate"
50
- else
51
- "script/rails generate"
52
- end
53
- end
54
-
55
- def runner_command
56
- if framework_major_version >= 4
57
- "rails runner"
58
- else
59
- "script/rails runner"
60
- end
61
- end
62
38
  end
63
39
  World(RailsCommandHelpers)
@@ -5,13 +5,13 @@ source "https://rubygems.org"
5
5
  gem "sqlite3", "~> 1.3.8", :platforms => :ruby
6
6
  gem "pry"
7
7
  gem "rails", "~> 4.2.0"
8
- gem "aws-sdk", "~> 2.0.0"
9
8
 
10
9
  group :development, :test do
11
10
  gem "activerecord-import"
12
11
  gem "mime-types"
13
12
  gem "builder"
14
13
  gem "rubocop", :require => false
14
+ gem "rspec"
15
15
  end
16
16
 
17
17
  gemspec :path => "../"
@@ -4,14 +4,14 @@ source "https://rubygems.org"
4
4
 
5
5
  gem "sqlite3", "~> 1.3.8", :platforms => :ruby
6
6
  gem "pry"
7
- gem "rails", "5.0.0.beta3"
8
- gem "aws-sdk", "~> 2.1.0"
7
+ gem "rails", "~> 5.0.0"
9
8
 
10
9
  group :development, :test do
11
10
  gem "activerecord-import"
12
11
  gem "mime-types"
13
12
  gem "builder"
14
13
  gem "rubocop", :require => false
14
+ gem "rspec"
15
15
  end
16
16
 
17
17
  gemspec :path => "../"
@@ -13,7 +13,9 @@ class PaperclipGenerator < ActiveRecord::Generators::Base
13
13
  end
14
14
 
15
15
  def generate_migration
16
- migration_template "paperclip_migration.rb.erb", "db/migrate/#{migration_file_name}"
16
+ migration_template("paperclip_migration.rb.erb",
17
+ "db/migrate/#{migration_file_name}",
18
+ migration_version: migration_version)
17
19
  end
18
20
 
19
21
  def migration_name
@@ -27,4 +29,10 @@ class PaperclipGenerator < ActiveRecord::Generators::Base
27
29
  def migration_class_name
28
30
  migration_name.camelize
29
31
  end
32
+
33
+ def migration_version
34
+ if Rails.version.start_with? "5"
35
+ "[#{Rails::VERSION::MAJOR}.#{Rails::VERSION::MINOR}]"
36
+ end
37
+ end
30
38
  end
@@ -1,4 +1,4 @@
1
- class <%= migration_class_name %> < ActiveRecord::Migration
1
+ class <%= migration_class_name %> < ActiveRecord::Migration<%= migration_version %>
2
2
  def self.up
3
3
  change_table :<%= table_name %> do |t|
4
4
  <% attachment_names.each do |attachment| -%>
data/lib/paperclip.rb CHANGED
@@ -67,7 +67,7 @@ end
67
67
  require 'mimemagic'
68
68
  require 'mimemagic/overlay'
69
69
  require 'logger'
70
- require 'cocaine'
70
+ require 'terrapin'
71
71
 
72
72
  require 'paperclip/railtie' if defined?(Rails::Railtie)
73
73
 
@@ -90,14 +90,14 @@ module Paperclip
90
90
  # image's orientation. Defaults to true.
91
91
  def self.options
92
92
  @options ||= {
93
- :whiny => true,
94
- :image_magick_path => nil,
95
- :command_path => nil,
96
- :log => true,
97
- :log_command => true,
98
- :swallow_stderr => true,
99
- :content_type_mappings => {},
100
- :use_exif_orientation => true
93
+ command_path: nil,
94
+ content_type_mappings: {},
95
+ log: true,
96
+ log_command: true,
97
+ read_timeout: nil,
98
+ swallow_stderr: true,
99
+ use_exif_orientation: true,
100
+ whiny: true,
101
101
  }
102
102
  end
103
103
 
@@ -119,7 +119,7 @@ module Paperclip
119
119
  # called on it, the attachment will *not* be deleted until +save+ is called. See the
120
120
  # Paperclip::Attachment documentation for more specifics. There are a number of options
121
121
  # you can set to change the behavior of a Paperclip attachment:
122
- # * +url+: The full URL of where the attachment is publically accessible. This can just
122
+ # * +url+: The full URL of where the attachment is publicly accessible. This can just
123
123
  # as easily point to a directory served directly through Apache as it can to an action
124
124
  # that can control permissions. You can specify the full domain and path, but usually
125
125
  # just an absolute path is sufficient. The leading slash *must* be included manually for
@@ -128,6 +128,9 @@ module Paperclip
128
128
  # Paperclip::Attachment#interpolate for more information on variable interpolaton.
129
129
  # :url => "/:class/:attachment/:id/:style_:filename"
130
130
  # :url => "http://some.other.host/stuff/:class/:id_:extension"
131
+ # Note: When using the +s3+ storage option, the +url+ option expects
132
+ # particular values. See the Paperclip::Storage::S3#url documentation for
133
+ # specifics.
131
134
  # * +default_url+: The URL that will be returned if there is no attachment assigned.
132
135
  # This field is interpolated just as the url is. The default value is
133
136
  # "/:attachment/:style/missing.png"
@@ -33,6 +33,7 @@ module Paperclip
33
33
  :use_timestamp => true,
34
34
  :whiny => Paperclip.options[:whiny] || Paperclip.options[:whiny_thumbnails],
35
35
  :validate_media_type => true,
36
+ :adapter_options => { hash_digest: Digest::MD5 },
36
37
  :check_validity_before_processing => true
37
38
  }
38
39
  end
@@ -50,7 +51,8 @@ module Paperclip
50
51
  # +url+ - a relative URL of the attachment. This is interpolated using +interpolator+
51
52
  # +path+ - where on the filesystem to store the attachment. This is interpolated using +interpolator+
52
53
  # +styles+ - a hash of options for processing the attachment. See +has_attached_file+ for the details
53
- # +only_process+ - style args to be run through the post-processor. This defaults to the empty list
54
+ # +only_process+ - style args to be run through the post-processor. This defaults to the empty list (which is
55
+ # a special case that indicates all styles should be processed)
54
56
  # +default_url+ - a URL for the missing image
55
57
  # +default_style+ - the style to use when an argument is not specified e.g. #url, #path
56
58
  # +storage+ - the storage mechanism. Defaults to :filesystem
@@ -82,7 +84,7 @@ module Paperclip
82
84
  @errors = {}
83
85
  @dirty = false
84
86
  @interpolator = options[:interpolator]
85
- @url_generator = options[:url_generator].new(self, @options)
87
+ @url_generator = options[:url_generator].new(self)
86
88
  @source_file_options = options[:source_file_options]
87
89
  @whiny = options[:whiny]
88
90
 
@@ -96,7 +98,8 @@ module Paperclip
96
98
  # attachment:
97
99
  # new_user.avatar = old_user.avatar
98
100
  def assign(uploaded_file)
99
- @file = Paperclip.io_adapters.for(uploaded_file)
101
+ @file = Paperclip.io_adapters.for(uploaded_file,
102
+ @options[:adapter_options])
100
103
  ensure_required_accessors!
101
104
  ensure_required_validations!
102
105
 
@@ -237,6 +240,10 @@ module Paperclip
237
240
  # the instance's errors and returns false, cancelling the save.
238
241
  def save
239
242
  flush_deletes unless @options[:keep_old_files]
243
+ process = only_process
244
+ if process.any? && !process.include?(:original)
245
+ @queued_for_write.except!(:original)
246
+ end
240
247
  flush_writes
241
248
  @dirty = false
242
249
  true
@@ -348,7 +355,7 @@ module Paperclip
348
355
 
349
356
  # Returns true if a file has been assigned.
350
357
  def file?
351
- !original_filename.blank?
358
+ original_filename.present?
352
359
  end
353
360
 
354
361
  alias :present? :file?
@@ -519,15 +526,18 @@ module Paperclip
519
526
  begin
520
527
  raise RuntimeError.new("Style #{name} has no processors defined.") if style.processors.blank?
521
528
  intermediate_files = []
529
+ original = @queued_for_write[:original]
522
530
 
523
- @queued_for_write[name] = style.processors.inject(@queued_for_write[:original]) do |file, processor|
531
+ @queued_for_write[name] = style.processors.
532
+ reduce(original) do |file, processor|
524
533
  file = Paperclip.processor(processor).make(file, style.processor_options, self)
525
534
  intermediate_files << file unless file == @queued_for_write[:original]
526
535
  file
527
536
  end
528
537
 
529
538
  unadapted_file = @queued_for_write[name]
530
- @queued_for_write[name] = Paperclip.io_adapters.for(@queued_for_write[name])
539
+ @queued_for_write[name] = Paperclip.io_adapters.
540
+ for(@queued_for_write[name], @options[:adapter_options])
531
541
  unadapted_file.close if unadapted_file.respond_to?(:close)
532
542
  @queued_for_write[name]
533
543
  rescue Paperclip::Errors::NotIdentifiedByImageMagickError => e
@@ -67,8 +67,9 @@ module Paperclip
67
67
  end
68
68
 
69
69
  def type_from_mime_magic
70
- @type_from_mime_magic ||=
71
- MimeMagic.by_magic(File.open(@filepath)).try(:type)
70
+ @type_from_mime_magic ||= File.open(@filepath) do |file|
71
+ MimeMagic.by_magic(file).try(:type)
72
+ end
72
73
  end
73
74
 
74
75
  def type_from_file_command