paperclip-permanent_records 0.4.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: d3bdbba54470c8648d6c9142341358a972517d28
4
+ data.tar.gz: c08220d8ac31b12ac11bc89c58ac102eae0429fa
5
+ SHA512:
6
+ metadata.gz: 0889073c9419ff4a7dbeba7dca791e7b54058154b596509ae007f8beaa4124c041d5ddcb923a77336743b7b3f770e229863f3d0f9d41035748d8361e3a963ff2
7
+ data.tar.gz: 9db4b49baf4aad4b0a27ada9f2768e635eb34fc7a4d4e2583928f48e474f79656b642d4e4cd99c6ca3f78544a9034da6510cbdc067b48a01dd01b94d8928ae25
data/.gitignore ADDED
@@ -0,0 +1,16 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /spec/examples.txt
10
+ /tmp/
11
+ *.bundle
12
+ *.so
13
+ *.o
14
+ *.a
15
+ mkmf.log
16
+ /gemfiles/*.lock
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format progress
2
+ --color
data/.rubocop.yml ADDED
@@ -0,0 +1,32 @@
1
+ require: rubocop-rspec
2
+
3
+ inherit_from: .rubocop_todo.yml
4
+
5
+ AllCops:
6
+ Include:
7
+ - 'Appraisals'
8
+ - '**/*.gemspec'
9
+ - '**/*.rake'
10
+ - '**/*.gemfile'
11
+ - '**/Gemfile'
12
+ - '**/Rakefile'
13
+ - '**/Capfile'
14
+ TargetRubyVersion: 2.2
15
+
16
+ Layout/AlignHash:
17
+ EnforcedColonStyle: 'table'
18
+
19
+ Layout/AlignParameters:
20
+ EnforcedStyle: 'with_fixed_indentation'
21
+
22
+ Layout/DotPosition:
23
+ EnforcedStyle: 'trailing'
24
+
25
+ Layout/SpaceInsideHashLiteralBraces:
26
+ EnforcedStyle: 'no_space'
27
+
28
+ Metrics/LineLength:
29
+ Max: 120
30
+
31
+ Naming/VariableNumber:
32
+ EnforcedStyle: 'snake_case'
data/.rubocop_todo.yml ADDED
@@ -0,0 +1,45 @@
1
+ # This configuration was generated by
2
+ # `rubocop --auto-gen-config`
3
+ # on 2018-01-18 16:08:39 +0100 using RuboCop version 0.52.1.
4
+ # The point is for the user to remove these configuration records
5
+ # one by one as the offenses are removed from the code base.
6
+ # Note that changes in the inspected code, or installation of new
7
+ # versions of RuboCop, may require this file to be generated again.
8
+
9
+ # Offense count: 3
10
+ # Configuration parameters: CountComments, ExcludedMethods.
11
+ Metrics/BlockLength:
12
+ Max: 82
13
+
14
+ # Offense count: 4
15
+ # Configuration parameters: Prefixes.
16
+ # Prefixes: when, with, without
17
+ RSpec/ContextWording:
18
+ Exclude:
19
+ - 'spec/paperclip/permanent_records_spec.rb'
20
+
21
+ # Offense count: 2
22
+ # Configuration parameters: Max.
23
+ RSpec/ExampleLength:
24
+ Exclude:
25
+ - 'spec/paperclip/permanent_records_spec.rb'
26
+
27
+ # Offense count: 4
28
+ # Configuration parameters: AggregateFailuresByDefault.
29
+ RSpec/MultipleExpectations:
30
+ Max: 4
31
+
32
+ # Offense count: 2
33
+ # Configuration parameters: Max.
34
+ RSpec/NestedGroups:
35
+ Exclude:
36
+ - 'spec/paperclip/permanent_records_spec.rb'
37
+
38
+ # Offense count: 3
39
+ Style/Documentation:
40
+ Exclude:
41
+ - 'spec/**/*'
42
+ - 'test/**/*'
43
+ - 'lib/paperclip/permanent_records.rb'
44
+ - 'lib/paperclip/permanent_records/active_record.rb'
45
+ - 'lib/paperclip/permanent_records/paperclip_patch.rb'
data/.travis.yml ADDED
@@ -0,0 +1,24 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.2.9
4
+ - 2.3.5
5
+ - 2.4.3
6
+ - 2.5.0
7
+ script: "bundle exec rake spec"
8
+ gemfile:
9
+ - gemfiles/rails_4.2_pc_4.1.gemfile
10
+ - gemfiles/rails_4.2_pc_4.2.gemfile
11
+ - gemfiles/rails_4.2_pc_5.0.gemfile
12
+ - gemfiles/rails_4.2_pc_5.1.gemfile
13
+ - gemfiles/rails_5.0_pc_5.0.gemfile
14
+ - gemfiles/rails_5.1_pc_5.1.gemfile
15
+ matrix:
16
+ exclude:
17
+ - rvm: 2.5.0
18
+ gemfile: gemfiles/rails_4.2_pc_4.1.gemfile
19
+ - rvm: 2.5.0
20
+ gemfile: gemfiles/rails_4.2_pc_4.2.gemfile
21
+ - rvm: 2.5.0
22
+ gemfile: gemfiles/rails_4.2_pc_5.0.gemfile
23
+ - rvm: 2.5.0
24
+ gemfile: gemfiles/rails_4.2_pc_5.1.gemfile
data/Appraisals ADDED
@@ -0,0 +1,29 @@
1
+ appraise 'rails_4.2_pc_4.1' do
2
+ gem 'rails', '~> 4.2.0'
3
+ gem 'paperclip', '~> 4.1.1'
4
+ end
5
+
6
+ appraise 'rails_4.2_pc_4.2' do
7
+ gem 'rails', '~> 4.2.0'
8
+ gem 'paperclip', '~> 4.2.4'
9
+ end
10
+
11
+ appraise 'rails_4.2_pc_5.0' do
12
+ gem 'rails', '~> 4.2.0'
13
+ gem 'paperclip', '~> 5.0.0'
14
+ end
15
+
16
+ appraise 'rails_4.2_pc_5.1' do
17
+ gem 'rails', '~> 4.2.0'
18
+ gem 'paperclip', '~> 5.1.0'
19
+ end
20
+
21
+ appraise 'rails_5.0_pc_5.0' do
22
+ gem 'rails', '~> 5.0.0'
23
+ gem 'paperclip', '~> 5.0.0'
24
+ end
25
+
26
+ appraise 'rails_5.1_pc_5.1' do
27
+ gem 'rails', '~> 5.1.0'
28
+ gem 'paperclip', '~> 5.1.0'
29
+ end
data/CHANGELOG.md ADDED
@@ -0,0 +1,26 @@
1
+ # 0.4.0 (2018-01-18)
2
+
3
+ * Remove support for rails < 4.2
4
+ * Remove support for ruby 2.1
5
+ * Test with rails 5.0 and 5.1
6
+ * Test on ruby 2.4 and 2.5
7
+ * Update permanent_records dependency to at least 4.2.7 (currenly the latest)
8
+ * paperclip: update patch to its 5.1.0 counterpart, test with 5.0 and 5.1
9
+ * Don't trigger ActiveRecord loading on requiring this gem
10
+ * Dev dependencies: update rake and rubocop/rubocop-rspec (+ some code style fixes)
11
+
12
+ # 0.3.0 (2018-01-17)
13
+
14
+ * Remove support for rails < 4.0 and paperclip < 4.1
15
+ * Remove support for ruby 1.9 and 2.0
16
+ * Test on ruby 2.1 and 2.3
17
+ * Test with paperclip 4.2
18
+ * Dev dependencies: update versions, add rubocop (+ lots of code style fixes), fix definitions
19
+
20
+ # 0.2.0 (2015-03-11)
21
+
22
+ * Update permanent_records dependency from 3.2 to 3.3
23
+
24
+ # 0.1.0 (2015-02-12)
25
+
26
+ Initial version.
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in paperclip-permanent_records.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2015-2018 emjot GmbH & Co. KG
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,57 @@
1
+ # Paperclip::PermanentRecords
2
+
3
+ When using permanent_records, paperclip attachments should only be deleted
4
+ when the model is really destroyed.
5
+
6
+ See [paperclip #804](https://github.com/thoughtbot/paperclip/issues/804#issuecomment-4946231).
7
+
8
+ ## Compatibility
9
+
10
+ * rails 4.2: works with paperclip 4.1 - 5.1 and ruby 2.2 - 2.4.
11
+ * rails 5.0 - 5.1 : works with paperclip 5.0 - 5.1 and ruby 2.2 - 2.5.
12
+ * all tested with permanent_records 4.2.7.
13
+
14
+ Please see `.travis.yml` and `Appraisals` for what combinations have actually been tested. Usage with other versions
15
+ might cause data loss.
16
+
17
+ ## Installation
18
+
19
+ Add this line to your application's Gemfile:
20
+
21
+ ```ruby
22
+ gem 'paperclip-permanent_records'
23
+ ```
24
+
25
+ And then execute:
26
+
27
+ $ bundle
28
+
29
+ Or install it yourself as:
30
+
31
+ $ gem install paperclip-permanent_records
32
+
33
+ ## Usage
34
+
35
+ Nothing to do, this should just work.
36
+
37
+ ## How does it work?
38
+
39
+ This gem does basically two things:
40
+
41
+ * prevent paperclip from marking attachments to be deleted in paperclip's `before_destroy` callback(s)
42
+ (by patching paperclip)
43
+ * mark attachments to be deleted in the model's `destroy` method
44
+ (depending on whether the model is actually destroyed or only deleted)
45
+
46
+ ## Development
47
+
48
+ Code style: Please use rubocop before you commit (`bundle exec rubocop`) and fix any warnings.
49
+
50
+ To setup tests, make sure all the ruby versions defined in `.travis.yml` are installed on your system.
51
+ Use `bundle exec appraisal generate` to generate the gemfiles if you change them in `Appraisals` and `.travis.yml`.
52
+
53
+ Run tests via:
54
+
55
+ * `rake wwtd` for all combinations of ruby/rails/paperclip versions
56
+ * `rake wwtd:local` for all rails/paperclip versions, but only on current ruby
57
+ * `rake spec` (or e.g. `bundle exec rspec spec --format documentation`) with main Gemfile and only on current ruby
data/Rakefile ADDED
@@ -0,0 +1,20 @@
1
+ require 'bundler/setup'
2
+ require 'paperclip/permanent_records/gem_tasks'
3
+ require 'appraisal'
4
+ require 'rspec/core/rake_task'
5
+ require 'wwtd/tasks'
6
+
7
+ desc 'Default: run all tests with all supported versions'
8
+ task default: :all
9
+
10
+ desc 'Run tests with all supported versions.'
11
+ task all: ['appraisal:install'] do
12
+ exec('rake appraisal spec')
13
+ end
14
+
15
+ task local: 'wwtd:local' # run all gemfiles with local ruby
16
+
17
+ desc 'Run all tests'
18
+ RSpec::Core::RakeTask.new('spec') do |t|
19
+ t.pattern = FileList['spec/**/*_spec.rb']
20
+ end
@@ -0,0 +1,8 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ gem 'rails', '~> 4.2.0'
6
+ gem 'paperclip', '~> 4.1.1'
7
+
8
+ gemspec path: '../'
@@ -0,0 +1,8 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ gem 'rails', '~> 4.2.0'
6
+ gem 'paperclip', '~> 4.2.4'
7
+
8
+ gemspec path: '../'
@@ -0,0 +1,8 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ gem 'rails', '~> 4.2.0'
6
+ gem 'paperclip', '~> 5.0.0'
7
+
8
+ gemspec path: '../'
@@ -0,0 +1,8 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ gem 'rails', '~> 4.2.0'
6
+ gem 'paperclip', '~> 5.1.0'
7
+
8
+ gemspec path: '../'
@@ -0,0 +1,8 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ gem 'rails', '~> 5.0.0'
6
+ gem 'paperclip', '~> 5.0.0'
7
+
8
+ gemspec path: '../'
@@ -0,0 +1,8 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ gem 'rails', '~> 5.1.0'
6
+ gem 'paperclip', '~> 5.1.0'
7
+
8
+ gemspec path: '../'
@@ -0,0 +1,28 @@
1
+ module Paperclip
2
+ module PermanentRecords
3
+ module ActiveRecord
4
+ extend ActiveSupport::Concern
5
+
6
+ def destroy(force = nil)
7
+ if paperclip_attachments? && # only when we have paperclip attachments,
8
+ (!is_permanent? || # if model does not support "safe deletion"
9
+ ::PermanentRecords.should_force_destroy?(force)) # or if model supports "safe deletion" but it is forced
10
+ schedule_attachments_for_deletion # => delete the attachments
11
+ end
12
+
13
+ super(force)
14
+ end
15
+
16
+ private
17
+
18
+ def paperclip_attachments?
19
+ self.class.respond_to?(:attachment_definitions)
20
+ end
21
+
22
+ # (this contains what each of the before_destroy callbacks originally did)
23
+ def schedule_attachments_for_deletion
24
+ self.class.attachment_definitions.each_key { |name| send(name).send(:queue_all_for_delete) }
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,26 @@
1
+ module Paperclip
2
+ module PermanentRecords
3
+ # Like Bundler::GemHelper, but without the 'release' task
4
+ # (would need to be implemented for release on gems.emjot.de)
5
+ class GemHelper < Bundler::GemHelper
6
+ def install
7
+ built_gem_path = nil
8
+ desc "Build #{name}-#{version}.gem into the pkg directory."
9
+ task 'build' do
10
+ built_gem_path = build_gem
11
+ end
12
+
13
+ desc "Build and install #{name}-#{version}.gem into system gems."
14
+ task 'install' => 'build' do
15
+ install_gem(built_gem_path)
16
+ end
17
+
18
+ GemHelper.instance = self
19
+ end
20
+
21
+ def version_tag
22
+ version.to_s
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,2 @@
1
+ require 'paperclip/permanent_records/gem_helper'
2
+ Paperclip::PermanentRecords::GemHelper.install_tasks
@@ -0,0 +1,22 @@
1
+ # Patch for paperclip >= 3.5.0 (based on 5.1.0)
2
+
3
+ module Paperclip
4
+ class HasAttachedFile
5
+ private
6
+
7
+ # Overwrite so it doesn't add a :before_destroy filter - we want to handle that in
8
+ # {Paperclip::PermanentRecords::ActiveRecord#destroy} instead
9
+ def add_active_record_callbacks
10
+ name = @name
11
+ @klass.send(:after_save) { send(name).send(:save) }
12
+ # @klass.send(:before_destroy) { send(name).send(:queue_all_for_delete) }
13
+ if @klass.respond_to?(:after_commit)
14
+ @klass.send(:after_commit, on: :destroy) do
15
+ send(name).send(:flush_deletes)
16
+ end
17
+ else
18
+ @klass.send(:after_destroy) { send(name).send(:flush_deletes) }
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,5 @@
1
+ module Paperclip
2
+ module PermanentRecords
3
+ VERSION = '0.4.0'.freeze
4
+ end
5
+ end
@@ -0,0 +1,15 @@
1
+ require 'paperclip/permanent_records/version'
2
+
3
+ require 'paperclip'
4
+ require 'permanent_records'
5
+ require 'paperclip/permanent_records/active_record'
6
+
7
+ module Paperclip
8
+ module PermanentRecords
9
+ ActiveSupport.on_load(:active_record) do
10
+ ::ActiveRecord::Base.send :include, Paperclip::PermanentRecords::ActiveRecord
11
+ end
12
+
13
+ require 'paperclip/permanent_records/paperclip_patch'
14
+ end
15
+ end
@@ -0,0 +1,34 @@
1
+ lib = File.expand_path('../lib', __FILE__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require 'paperclip/permanent_records/version'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = 'paperclip-permanent_records'
7
+ spec.version = Paperclip::PermanentRecords::VERSION
8
+ spec.authors = ['Maximilian Herold']
9
+ spec.email = ['herold@emjot.de']
10
+ spec.summary = 'Make paperclip attachments work with permanent_records'
11
+ spec.description = 'Make paperclip attachments work with permanent_records'
12
+ spec.homepage = ''
13
+ spec.license = 'MIT'
14
+
15
+ spec.files = `git ls-files -z`.split("\x0")
16
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
+ spec.require_paths = ['lib']
19
+
20
+ spec.required_ruby_version = '>= 2.2'
21
+
22
+ spec.add_dependency 'activerecord', '>= 4.2'
23
+ spec.add_dependency 'paperclip', '>= 4.1'
24
+ spec.add_dependency 'permanent_records', '>= 4.2.7'
25
+
26
+ spec.add_development_dependency 'appraisal', '~> 2.2'
27
+ spec.add_development_dependency 'bundler', '~> 1.15'
28
+ spec.add_development_dependency 'rake', '>= 10.0'
29
+ spec.add_development_dependency 'rspec-rails', '~> 3.7'
30
+ spec.add_development_dependency 'rubocop'
31
+ spec.add_development_dependency 'rubocop-rspec'
32
+ spec.add_development_dependency 'sqlite3'
33
+ spec.add_development_dependency 'wwtd', '~> 1.3'
34
+ end
@@ -0,0 +1,17 @@
1
+ class Post < ActiveRecord::Base
2
+ has_attached_file :image,
3
+ url: '/system/:test_env_number/:class/:attachment/:id/:style-:fingerprint.:extension'
4
+ validates_attachment :image, content_type: {content_type: ['image/png']}
5
+ end
6
+
7
+ class PermanentPost < ActiveRecord::Base
8
+ has_attached_file :image,
9
+ url: '/system/:test_env_number/:class/:attachment/:id/:style-:fingerprint.:extension'
10
+ validates_attachment :image, content_type: {content_type: ['image/png']}
11
+ end
12
+
13
+ class Uid < ActiveRecord::Base
14
+ end
15
+
16
+ class PermanentUid < ActiveRecord::Base
17
+ end
@@ -0,0 +1,29 @@
1
+ ActiveRecord::Migration.verbose = false
2
+
3
+ ActiveRecord::Schema.define do
4
+ create_table :permanent_posts, force: true do |t|
5
+ t.string :image_file_name
6
+ t.integer :image_file_size
7
+ t.string :image_content_type
8
+ t.string :image_fingerprint
9
+ t.timestamp :image_updated_at
10
+ t.timestamp :deleted_at
11
+ end
12
+
13
+ create_table :posts, force: true do |t|
14
+ t.string :image_file_name
15
+ t.integer :image_file_size
16
+ t.string :image_content_type
17
+ t.string :image_fingerprint
18
+ t.timestamp :image_updated_at
19
+ end
20
+
21
+ create_table :permanent_uids, force: true do |t|
22
+ t.integer :uid
23
+ t.timestamp :deleted_at
24
+ end
25
+
26
+ create_table :uids, force: true do |t|
27
+ t.integer :uid
28
+ end
29
+ end
Binary file
@@ -0,0 +1,108 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Paperclip::PermanentRecords do
4
+ before do
5
+ stub_const('Rails', instance_double('Rails'))
6
+ allow(Rails).to receive(:root).and_return(ROOT.join('tmp'))
7
+ allow(Rails).to receive(:env).and_return('test')
8
+ allow(Rails).to receive(:const_defined?).with(:Railtie).and_return(false)
9
+ end
10
+
11
+ let(:test_image_dir) do
12
+ File.expand_path(File.join(File.dirname(__FILE__), '..', 'data'))
13
+ end
14
+
15
+ let(:test_image_file) do
16
+ File.new(File.join(test_image_dir, 'test.png'))
17
+ end
18
+
19
+ describe '#destroy' do
20
+ context 'on a permanent model with attachments' do
21
+ let!(:model) { PermanentPost.create!(image: test_image_file) }
22
+ let!(:file_path) { model.image.path }
23
+
24
+ it 'soft-deletes the model' do
25
+ expect { model.destroy }.to change(model, :deleted?).from(false).to(true)
26
+ end
27
+
28
+ it 'keeps the model' do
29
+ expect(model.destroy).not_to be_destroyed
30
+ end
31
+
32
+ it "keeps the attachments' files" do
33
+ model.destroy
34
+ expect(model).to be_image
35
+ expect(File).to be_exist(file_path)
36
+
37
+ # should still be okay even after saving again
38
+ model.save!
39
+ expect(model).to be_image
40
+ expect(File).to be_exist(file_path)
41
+ end
42
+
43
+ it "keeps the attachments' files after revive" do
44
+ model.destroy.revive
45
+ expect(model).to be_image
46
+ expect(File).to be_exist(file_path)
47
+
48
+ # should still be okay even after saving again
49
+ model.save!
50
+ expect(model).to be_image
51
+ expect(File).to be_exist(file_path)
52
+ end
53
+
54
+ context 'with :force option' do
55
+ it 'destroys the model' do
56
+ expect(model.destroy(:force)).to be_destroyed
57
+ end
58
+
59
+ it "deletes the attachments' files" do
60
+ model.destroy(:force)
61
+ expect(model).not_to be_image
62
+ expect(File).not_to be_exist(file_path)
63
+ end
64
+ end
65
+ end
66
+
67
+ context 'on a permanent model without attachments' do
68
+ let!(:model) { PermanentUid.create!(uid: 99) }
69
+
70
+ it 'soft-deletes the model' do
71
+ expect { model.destroy }.to change(model, :deleted?).from(false).to(true)
72
+ end
73
+
74
+ it 'keeps the model' do
75
+ expect(model.destroy).not_to be_destroyed
76
+ end
77
+
78
+ context 'with :force option' do
79
+ it 'destroys the model' do
80
+ expect(model.destroy(:force)).to be_destroyed
81
+ end
82
+ end
83
+ end
84
+
85
+ context 'on a regular model with attachments' do
86
+ let!(:model) { Post.create!(image: test_image_file) }
87
+ let!(:file_path) { model.image.path }
88
+
89
+ it 'destroys the model' do
90
+ expect { model.destroy }.to change(Post, :count).from(1).to(0)
91
+ end
92
+
93
+ it "deletes the attachments' files" do
94
+ model.destroy
95
+ expect(model).not_to be_image
96
+ expect(File).not_to be_exist(file_path)
97
+ end
98
+ end
99
+
100
+ context 'on a regular model without attachments' do
101
+ let!(:model) { Uid.create!(uid: 99) }
102
+
103
+ it 'destroys the model' do
104
+ expect { model.destroy }.to change(Uid, :count).from(1).to(0)
105
+ end
106
+ end
107
+ end
108
+ end
@@ -0,0 +1,55 @@
1
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
2
+ require 'pathname'
3
+ require 'fileutils'
4
+
5
+ ROOT = Pathname(File.expand_path(File.join(File.dirname(__FILE__), '..')))
6
+ TEST_ASSETS_PATH = Pathname.new(ROOT).join('tmp', 'public')
7
+
8
+ RSpec.configure do |config|
9
+ config.expect_with :rspec do |expectations|
10
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
11
+ end
12
+
13
+ config.mock_with :rspec do |mocks|
14
+ mocks.verify_partial_doubles = true
15
+ end
16
+
17
+ config.shared_context_metadata_behavior = :apply_to_host_groups
18
+ config.filter_run_when_matching :focus
19
+ config.example_status_persistence_file_path = 'spec/examples.txt'
20
+ config.disable_monkey_patching!
21
+
22
+ config.default_formatter = 'doc' if config.files_to_run.one?
23
+
24
+ config.profile_examples = 2
25
+ config.order = :random
26
+ Kernel.srand config.seed
27
+
28
+ config.after(:suite) do
29
+ FileUtils.rm_rf TEST_ASSETS_PATH if File.exist?(TEST_ASSETS_PATH)
30
+ end
31
+ end
32
+
33
+ require 'active_record'
34
+ require 'active_support'
35
+ require 'paperclip/permanent_records'
36
+
37
+ ActiveRecord::Base.send(:include, Paperclip::Glue)
38
+
39
+ Paperclip.interpolates(:test_env_number) do |_, _|
40
+ ENV['TEST_ENV_NUMBER'].presence || '0'
41
+ end
42
+
43
+ # set up models
44
+ require 'fileutils'
45
+ require 'logger'
46
+ tmpdir = File.join(File.dirname(__FILE__), '../tmp')
47
+ FileUtils.mkdir(tmpdir) unless File.exist?(tmpdir)
48
+ log = File.expand_path(File.join(tmpdir, 'permanent_records_test.log'))
49
+ FileUtils.touch(log) unless File.exist?(log)
50
+ ActiveRecord::Base.logger = Logger.new(log)
51
+ ActiveRecord::LogSubscriber.attach_to(:active_record)
52
+ ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: ':memory:')
53
+ require File.expand_path('../data/schema', __FILE__)
54
+ require File.expand_path('../data/models', __FILE__)
55
+ I18n.locale = I18n.default_locale = :en
metadata ADDED
@@ -0,0 +1,232 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: paperclip-permanent_records
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.4.0
5
+ platform: ruby
6
+ authors:
7
+ - Maximilian Herold
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-01-18 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activerecord
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '4.2'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '4.2'
27
+ - !ruby/object:Gem::Dependency
28
+ name: paperclip
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '4.1'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '4.1'
41
+ - !ruby/object:Gem::Dependency
42
+ name: permanent_records
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: 4.2.7
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: 4.2.7
55
+ - !ruby/object:Gem::Dependency
56
+ name: appraisal
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '2.2'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '2.2'
69
+ - !ruby/object:Gem::Dependency
70
+ name: bundler
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '1.15'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '1.15'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rake
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '10.0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '10.0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rspec-rails
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '3.7'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '3.7'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rubocop
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rubocop-rspec
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: sqlite3
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: wwtd
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: '1.3'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: '1.3'
167
+ description: Make paperclip attachments work with permanent_records
168
+ email:
169
+ - herold@emjot.de
170
+ executables: []
171
+ extensions: []
172
+ extra_rdoc_files: []
173
+ files:
174
+ - ".gitignore"
175
+ - ".rspec"
176
+ - ".rubocop.yml"
177
+ - ".rubocop_todo.yml"
178
+ - ".travis.yml"
179
+ - Appraisals
180
+ - CHANGELOG.md
181
+ - Gemfile
182
+ - LICENSE.txt
183
+ - README.md
184
+ - Rakefile
185
+ - gemfiles/rails_4.2_pc_4.1.gemfile
186
+ - gemfiles/rails_4.2_pc_4.2.gemfile
187
+ - gemfiles/rails_4.2_pc_5.0.gemfile
188
+ - gemfiles/rails_4.2_pc_5.1.gemfile
189
+ - gemfiles/rails_5.0_pc_5.0.gemfile
190
+ - gemfiles/rails_5.1_pc_5.1.gemfile
191
+ - lib/paperclip/permanent_records.rb
192
+ - lib/paperclip/permanent_records/active_record.rb
193
+ - lib/paperclip/permanent_records/gem_helper.rb
194
+ - lib/paperclip/permanent_records/gem_tasks.rb
195
+ - lib/paperclip/permanent_records/paperclip_patch.rb
196
+ - lib/paperclip/permanent_records/version.rb
197
+ - paperclip-permanent_records.gemspec
198
+ - spec/data/models.rb
199
+ - spec/data/schema.rb
200
+ - spec/data/test.png
201
+ - spec/paperclip/permanent_records_spec.rb
202
+ - spec/spec_helper.rb
203
+ homepage: ''
204
+ licenses:
205
+ - MIT
206
+ metadata: {}
207
+ post_install_message:
208
+ rdoc_options: []
209
+ require_paths:
210
+ - lib
211
+ required_ruby_version: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - ">="
214
+ - !ruby/object:Gem::Version
215
+ version: '2.2'
216
+ required_rubygems_version: !ruby/object:Gem::Requirement
217
+ requirements:
218
+ - - ">="
219
+ - !ruby/object:Gem::Version
220
+ version: '0'
221
+ requirements: []
222
+ rubyforge_project:
223
+ rubygems_version: 2.6.14
224
+ signing_key:
225
+ specification_version: 4
226
+ summary: Make paperclip attachments work with permanent_records
227
+ test_files:
228
+ - spec/data/models.rb
229
+ - spec/data/schema.rb
230
+ - spec/data/test.png
231
+ - spec/paperclip/permanent_records_spec.rb
232
+ - spec/spec_helper.rb