permanent_records 4.2.8 → 5.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.
- checksums.yaml +4 -4
- data/.github/workflows/gempush.yml +28 -0
- data/.github/workflows/test.yml +32 -0
- data/.rubocop.yml +3 -1
- data/.rubocop_todo.yml +1 -6
- data/.travis.yml +6 -3
- data/README.md +1 -1
- data/README.rst +1 -1
- data/VERSION +1 -1
- data/bin/gempush-if-changed +11 -0
- data/github-actions-test.yml +1 -0
- data/lib/permanent_records.rb +20 -19
- data/lib/permanent_records/active_record_5_2.rb +40 -0
- data/permanent_records.gemspec +6 -5
- metadata +33 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6f7d5e533d3ea6f107b72b635d5c58871601a782d759b41f6c5578f7f556d54f
|
4
|
+
data.tar.gz: 1c1ccdac5a7812cdd3dbaec043580ba62ea82e0858d9a8b56850a58703c7e79c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 42910c3d809df7cda9876f1e752da136055640053682bde499b1a33f7f9142222fe22c7fefe1fae3750ed0180179582a2eb3d6a05321ef9303be37bc93e79a3a
|
7
|
+
data.tar.gz: f2a06abe6da337d41c610a7e539516e4b71ede008f644bc75db3c1bd4805f43c526783ffff18275d4871cf5713619f172f4ed6e9c139080aeded2d47c001bc63
|
@@ -0,0 +1,28 @@
|
|
1
|
+
name: Ruby Gem
|
2
|
+
|
3
|
+
on:
|
4
|
+
push:
|
5
|
+
branches:
|
6
|
+
- master
|
7
|
+
|
8
|
+
jobs:
|
9
|
+
build:
|
10
|
+
name: gem publishing
|
11
|
+
runs-on: ubuntu-latest
|
12
|
+
|
13
|
+
steps:
|
14
|
+
- uses: actions/checkout@master
|
15
|
+
- name: Set up Ruby 2.6
|
16
|
+
uses: actions/setup-ruby@v1
|
17
|
+
with:
|
18
|
+
ruby-version: 2.6.x
|
19
|
+
|
20
|
+
- name: Publish to RubyGems
|
21
|
+
run: |
|
22
|
+
mkdir -p $HOME/.gem
|
23
|
+
touch $HOME/.gem/credentials
|
24
|
+
chmod 0600 $HOME/.gem/credentials
|
25
|
+
printf -- "---\n:rubygems_api_key: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
|
26
|
+
bin/gempush-if-changed
|
27
|
+
env:
|
28
|
+
GEM_HOST_API_KEY: ${{secrets.RUBYGEMS_AUTH_TOKEN}}
|
@@ -0,0 +1,32 @@
|
|
1
|
+
name: Tests
|
2
|
+
|
3
|
+
on: push
|
4
|
+
|
5
|
+
jobs:
|
6
|
+
ci:
|
7
|
+
name: CI
|
8
|
+
runs-on: ubuntu-latest
|
9
|
+
strategy:
|
10
|
+
matrix:
|
11
|
+
ruby:
|
12
|
+
- '2.3.x'
|
13
|
+
- '2.4.x'
|
14
|
+
- '2.5.x'
|
15
|
+
- '2.6.x'
|
16
|
+
rails:
|
17
|
+
- '5.0.7.2'
|
18
|
+
- '5.1.7'
|
19
|
+
- '5.2.3'
|
20
|
+
steps:
|
21
|
+
- name: Install system dependencies
|
22
|
+
run: sudo apt-get install -y libsqlite3-dev
|
23
|
+
- uses: actions/checkout@master
|
24
|
+
- name: Setup ruby
|
25
|
+
uses: actions/setup-ruby@v1
|
26
|
+
with:
|
27
|
+
ruby-version: ${{ matrix.ruby }}
|
28
|
+
architecture: 'x64'
|
29
|
+
- run: gem install bundler && bundle && bundle exec rake
|
30
|
+
env:
|
31
|
+
AR_TEST_VERSION: ${{ matrix.rails }}
|
32
|
+
|
data/.rubocop.yml
CHANGED
data/.rubocop_todo.yml
CHANGED
@@ -1,12 +1,7 @@
|
|
1
1
|
# This configuration was generated by
|
2
2
|
# `rubocop --auto-gen-config`
|
3
|
-
# on 2019-10-
|
3
|
+
# on 2019-10-15 13:32:11 +0200 using RuboCop version 0.68.1.
|
4
4
|
# The point is for the user to remove these configuration records
|
5
5
|
# one by one as the offenses are removed from the code base.
|
6
6
|
# Note that changes in the inspected code, or installation of new
|
7
7
|
# versions of RuboCop, may require this file to be generated again.
|
8
|
-
|
9
|
-
# Offense count: 15
|
10
|
-
Lint/AmbiguousBlockAssociation:
|
11
|
-
Exclude:
|
12
|
-
- 'spec/permanent_records_spec.rb'
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
data/README.rst
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
5.0.0
|
@@ -0,0 +1,11 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
|
3
|
+
set -x
|
4
|
+
if git diff --name-only HEAD..HEAD^ | egrep -q '^VERSION$'; then
|
5
|
+
# The VERSION file changed in the last commit, build the gem and push
|
6
|
+
gem build *.gemspec
|
7
|
+
gem push *.gem
|
8
|
+
version=$(cat VERSION)
|
9
|
+
git tag ${version}
|
10
|
+
git push origin ${version}
|
11
|
+
fi
|
@@ -0,0 +1 @@
|
|
1
|
+
.github/workflows/test.yml
|
data/lib/permanent_records.rb
CHANGED
@@ -51,7 +51,7 @@ module PermanentRecords
|
|
51
51
|
if !is_permanent? || PermanentRecords.should_force_destroy?(force)
|
52
52
|
permanently_delete_records_after { super() }
|
53
53
|
else
|
54
|
-
destroy_with_permanent_records
|
54
|
+
destroy_with_permanent_records(force)
|
55
55
|
end
|
56
56
|
end
|
57
57
|
end
|
@@ -68,7 +68,7 @@ module PermanentRecords
|
|
68
68
|
set_deleted_at(nil, validate)
|
69
69
|
# increment all associated counters for counter cache
|
70
70
|
each_counter_cache do |assoc_class, counter_cache_column, assoc_id|
|
71
|
-
assoc_class.increment_counter
|
71
|
+
assoc_class.increment_counter(counter_cache_column, assoc_id)
|
72
72
|
end
|
73
73
|
true
|
74
74
|
end
|
@@ -81,9 +81,9 @@ module PermanentRecords
|
|
81
81
|
end
|
82
82
|
|
83
83
|
# rubocop:disable Metrics/MethodLength
|
84
|
-
# rubocop:disable Lint/RescueWithoutErrorClass
|
85
84
|
def set_deleted_at(value, force = nil)
|
86
85
|
return self unless is_permanent?
|
86
|
+
|
87
87
|
record = get_deleted_record
|
88
88
|
record.deleted_at = value
|
89
89
|
begin
|
@@ -98,14 +98,14 @@ module PermanentRecords
|
|
98
98
|
end
|
99
99
|
|
100
100
|
@attributes = record.instance_variable_get('@attributes')
|
101
|
-
rescue => e
|
101
|
+
rescue StandardError => e
|
102
102
|
# trigger dependent record destruction (they were revived before this
|
103
103
|
# record, which cannot be revived due to validations)
|
104
104
|
record.destroy
|
105
105
|
raise e
|
106
106
|
end
|
107
107
|
end
|
108
|
-
|
108
|
+
|
109
109
|
# rubocop:enable Metrics/MethodLength
|
110
110
|
|
111
111
|
def each_counter_cache
|
@@ -116,9 +116,7 @@ module PermanentRecords
|
|
116
116
|
|
117
117
|
associated_class = association.class
|
118
118
|
|
119
|
-
yield(associated_class,
|
120
|
-
reflection.counter_cache_column,
|
121
|
-
send(reflection.foreign_key))
|
119
|
+
yield(associated_class, reflection.counter_cache_column, send(reflection.foreign_key))
|
122
120
|
end
|
123
121
|
end
|
124
122
|
|
@@ -131,7 +129,7 @@ module PermanentRecords
|
|
131
129
|
set_deleted_at(Time.now, force)
|
132
130
|
# decrement all associated counters for counter cache
|
133
131
|
each_counter_cache do |assoc_class, counter_cache_column, assoc_id|
|
134
|
-
assoc_class.decrement_counter
|
132
|
+
assoc_class.decrement_counter(counter_cache_column, assoc_id)
|
135
133
|
end
|
136
134
|
end
|
137
135
|
true
|
@@ -143,18 +141,16 @@ module PermanentRecords
|
|
143
141
|
def add_record_window(_request, name, reflection)
|
144
142
|
send(name).unscope(where: :deleted_at).where(
|
145
143
|
[
|
146
|
-
"#{reflection.quoted_table_name}.deleted_at > ?" \
|
144
|
+
"#{reflection.klass.quoted_table_name}.deleted_at > ?" \
|
147
145
|
' AND ' \
|
148
|
-
"#{reflection.quoted_table_name}.deleted_at < ?",
|
146
|
+
"#{reflection.klass.quoted_table_name}.deleted_at < ?",
|
149
147
|
deleted_at - PermanentRecords.dependent_record_window,
|
150
148
|
deleted_at + PermanentRecords.dependent_record_window
|
151
149
|
]
|
152
150
|
)
|
153
151
|
end
|
154
152
|
|
155
|
-
# TODO: Feel free to refactor this without polluting the ActiveRecord
|
156
|
-
# namespace.
|
157
|
-
# rubocop:disable Metrics/AbcSize
|
153
|
+
# TODO: Feel free to refactor this without polluting the ActiveRecord namespace.
|
158
154
|
def revive_destroyed_dependent_records(force = nil)
|
159
155
|
destroyed_dependent_relations.each do |relation|
|
160
156
|
relation.to_a.each { |destroyed_dependent_record| destroyed_dependent_record.try(:revive, force) }
|
@@ -165,15 +161,14 @@ module PermanentRecords
|
|
165
161
|
# rubocop:disable Metrics/MethodLength
|
166
162
|
def destroyed_dependent_relations
|
167
163
|
PermanentRecords.dependent_permanent_reflections(self.class).map do |name, relation|
|
168
|
-
|
169
|
-
|
170
|
-
when :many
|
164
|
+
case relation.macro.to_sym
|
165
|
+
when :has_many
|
171
166
|
if deleted_at
|
172
167
|
add_record_window(send(name), name, relation)
|
173
168
|
else
|
174
169
|
send(name).unscope(where: :deleted_at)
|
175
170
|
end
|
176
|
-
when :
|
171
|
+
when :has_one, :belongs_to
|
177
172
|
self.class.unscoped { Array(send(name)) }
|
178
173
|
end
|
179
174
|
end
|
@@ -194,6 +189,7 @@ module PermanentRecords
|
|
194
189
|
.reduce({}) do |records, (key, _)|
|
195
190
|
found = Array(send(key)).compact
|
196
191
|
next records if found.empty?
|
192
|
+
|
197
193
|
records.update found.first.class => found.map(&:id)
|
198
194
|
end
|
199
195
|
end
|
@@ -218,6 +214,7 @@ module PermanentRecords
|
|
218
214
|
ids.each do |id|
|
219
215
|
record = klass.unscoped.where(klass.primary_key => id).first
|
220
216
|
next unless record
|
217
|
+
|
221
218
|
record.deleted_at = nil
|
222
219
|
record.destroy(:force)
|
223
220
|
end
|
@@ -282,5 +279,9 @@ module PermanentRecords
|
|
282
279
|
end
|
283
280
|
|
284
281
|
ActiveSupport.on_load(:active_record) do
|
285
|
-
ActiveRecord::Base.send
|
282
|
+
ActiveRecord::Base.send(:include, PermanentRecords::ActiveRecord)
|
283
|
+
|
284
|
+
if [ActiveRecord::VERSION::MAJOR, ActiveRecord::VERSION::MINOR] == [5, 2] || ActiveRecord::VERSION::MAJOR > 5
|
285
|
+
require 'permanent_records/active_record_5_2'
|
286
|
+
end
|
286
287
|
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# rubocop:disable Metrics/AbcSize
|
2
|
+
# Support destroy for rails belongs_to assocations.
|
3
|
+
module HandlePermanentRecordsDestroyedInBelongsToAssociation
|
4
|
+
def handle_dependency
|
5
|
+
return unless load_target
|
6
|
+
|
7
|
+
case options[:dependent]
|
8
|
+
when :destroy
|
9
|
+
target.destroy
|
10
|
+
raise ActiveRecord::Rollback if target.respond_to?(:deleted?) && !target.deleted?
|
11
|
+
else
|
12
|
+
target.send(options[:dependent])
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
# rubocop:disable Metrics/MethodLength
|
18
|
+
# rubocop:disable Metrics/CyclomaticComplexity
|
19
|
+
# Support destroy for rails 5.2. has_on associations.
|
20
|
+
module HandlePermanentRecordsDestroyedInHasOneAssociation
|
21
|
+
def delete(method = options[:dependent])
|
22
|
+
return unless load_target
|
23
|
+
|
24
|
+
case method
|
25
|
+
when :delete
|
26
|
+
target.delete
|
27
|
+
when :destroy
|
28
|
+
target.destroyed_by_association = reflection
|
29
|
+
target.destroy
|
30
|
+
throw(:abort) if target.respond_to?(:deleted?) && !target.deleted?
|
31
|
+
when :nullify
|
32
|
+
target.update_columns(reflection.foreign_key => nil) if target.persisted?
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
# rubocop:enable Metrics/CyclomaticComplexity
|
37
|
+
# rubocop:enable Metrics/MethodLength
|
38
|
+
# rubocop:enable Metrics/AbcSize
|
39
|
+
ActiveRecord::Associations::BelongsToAssociation.prepend(HandlePermanentRecordsDestroyedInBelongsToAssociation)
|
40
|
+
ActiveRecord::Associations::HasOneAssociation.prepend(HandlePermanentRecordsDestroyedInHasOneAssociation)
|
data/permanent_records.gemspec
CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |s|
|
|
10
10
|
s.description = <<-DESCRIPTION
|
11
11
|
Never Lose Data. Rather than deleting rows this sets Record#deleted_at and
|
12
12
|
gives you all the scopes you need to work with your data.
|
13
|
-
DESCRIPTION
|
13
|
+
DESCRIPTION
|
14
14
|
s.email = 'github@jackcanty.com'
|
15
15
|
s.extra_rdoc_files = [
|
16
16
|
'LICENSE',
|
@@ -26,12 +26,13 @@ DESCRIPTION
|
|
26
26
|
ver = ENV['AR_TEST_VERSION']
|
27
27
|
ver = ver.dup.chomp if ver
|
28
28
|
|
29
|
-
s.add_runtime_dependency 'activerecord', ver || '>=
|
30
|
-
s.add_runtime_dependency 'activesupport', ver || '>=
|
29
|
+
s.add_runtime_dependency 'activerecord', ver || '>= 5.0.0'
|
30
|
+
s.add_runtime_dependency 'activesupport', ver || '>= 5.0.0'
|
31
31
|
s.add_development_dependency 'database_cleaner', '>= 1.5.1'
|
32
32
|
s.add_development_dependency 'pry-byebug'
|
33
33
|
s.add_development_dependency 'rake' # For Travis-ci
|
34
34
|
s.add_development_dependency 'rspec', '>= 3.5.0'
|
35
|
-
s.add_development_dependency 'rubocop', '~> 0.
|
36
|
-
s.add_development_dependency '
|
35
|
+
s.add_development_dependency 'rubocop', '~> 0.68.0' # freeze to ensure ruby 2.2 compatibility
|
36
|
+
s.add_development_dependency 'rubocop-performance'
|
37
|
+
s.add_development_dependency 'sqlite3', '~> 1.3.13' # freeze to ensure specs are working
|
37
38
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: permanent_records
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 5.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jack Danger Canty
|
@@ -17,36 +17,36 @@ authors:
|
|
17
17
|
autorequire:
|
18
18
|
bindir: bin
|
19
19
|
cert_chain: []
|
20
|
-
date: 2019-10-
|
20
|
+
date: 2019-10-16 00:00:00.000000000 Z
|
21
21
|
dependencies:
|
22
22
|
- !ruby/object:Gem::Dependency
|
23
23
|
name: activerecord
|
24
24
|
requirement: !ruby/object:Gem::Requirement
|
25
25
|
requirements:
|
26
|
-
- -
|
26
|
+
- - ">="
|
27
27
|
- !ruby/object:Gem::Version
|
28
|
-
version:
|
28
|
+
version: 5.0.0
|
29
29
|
type: :runtime
|
30
30
|
prerelease: false
|
31
31
|
version_requirements: !ruby/object:Gem::Requirement
|
32
32
|
requirements:
|
33
|
-
- -
|
33
|
+
- - ">="
|
34
34
|
- !ruby/object:Gem::Version
|
35
|
-
version:
|
35
|
+
version: 5.0.0
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: activesupport
|
38
38
|
requirement: !ruby/object:Gem::Requirement
|
39
39
|
requirements:
|
40
|
-
- -
|
40
|
+
- - ">="
|
41
41
|
- !ruby/object:Gem::Version
|
42
|
-
version:
|
42
|
+
version: 5.0.0
|
43
43
|
type: :runtime
|
44
44
|
prerelease: false
|
45
45
|
version_requirements: !ruby/object:Gem::Requirement
|
46
46
|
requirements:
|
47
|
-
- -
|
47
|
+
- - ">="
|
48
48
|
- !ruby/object:Gem::Version
|
49
|
-
version:
|
49
|
+
version: 5.0.0
|
50
50
|
- !ruby/object:Gem::Dependency
|
51
51
|
name: database_cleaner
|
52
52
|
requirement: !ruby/object:Gem::Requirement
|
@@ -109,28 +109,42 @@ dependencies:
|
|
109
109
|
requirements:
|
110
110
|
- - "~>"
|
111
111
|
- !ruby/object:Gem::Version
|
112
|
-
version: 0.
|
112
|
+
version: 0.68.0
|
113
113
|
type: :development
|
114
114
|
prerelease: false
|
115
115
|
version_requirements: !ruby/object:Gem::Requirement
|
116
116
|
requirements:
|
117
117
|
- - "~>"
|
118
118
|
- !ruby/object:Gem::Version
|
119
|
-
version: 0.
|
119
|
+
version: 0.68.0
|
120
|
+
- !ruby/object:Gem::Dependency
|
121
|
+
name: rubocop-performance
|
122
|
+
requirement: !ruby/object:Gem::Requirement
|
123
|
+
requirements:
|
124
|
+
- - ">="
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
version: '0'
|
127
|
+
type: :development
|
128
|
+
prerelease: false
|
129
|
+
version_requirements: !ruby/object:Gem::Requirement
|
130
|
+
requirements:
|
131
|
+
- - ">="
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
version: '0'
|
120
134
|
- !ruby/object:Gem::Dependency
|
121
135
|
name: sqlite3
|
122
136
|
requirement: !ruby/object:Gem::Requirement
|
123
137
|
requirements:
|
124
138
|
- - "~>"
|
125
139
|
- !ruby/object:Gem::Version
|
126
|
-
version: 1.3.
|
140
|
+
version: 1.3.13
|
127
141
|
type: :development
|
128
142
|
prerelease: false
|
129
143
|
version_requirements: !ruby/object:Gem::Requirement
|
130
144
|
requirements:
|
131
145
|
- - "~>"
|
132
146
|
- !ruby/object:Gem::Version
|
133
|
-
version: 1.3.
|
147
|
+
version: 1.3.13
|
134
148
|
description: |2
|
135
149
|
Never Lose Data. Rather than deleting rows this sets Record#deleted_at and
|
136
150
|
gives you all the scopes you need to work with your data.
|
@@ -142,6 +156,8 @@ extra_rdoc_files:
|
|
142
156
|
- README.md
|
143
157
|
files:
|
144
158
|
- ".document"
|
159
|
+
- ".github/workflows/gempush.yml"
|
160
|
+
- ".github/workflows/test.yml"
|
145
161
|
- ".gitignore"
|
146
162
|
- ".rubocop.yml"
|
147
163
|
- ".rubocop_todo.yml"
|
@@ -154,9 +170,12 @@ files:
|
|
154
170
|
- README.rst
|
155
171
|
- Rakefile
|
156
172
|
- VERSION
|
173
|
+
- bin/gempush-if-changed
|
157
174
|
- bin/rspec
|
158
175
|
- ci
|
176
|
+
- github-actions-test.yml
|
159
177
|
- lib/permanent_records.rb
|
178
|
+
- lib/permanent_records/active_record_5_2.rb
|
160
179
|
- permanent_records.gemspec
|
161
180
|
homepage: https://github.com/JackDanger/permanent_records
|
162
181
|
licenses:
|