delete_recursively 0.9.3 → 1.0.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 87a42e8c61f945033a7d70c5be9b5d08e1002f47
4
- data.tar.gz: 72ce8ee5ddbd3812f4613508f2025e843b1b37ca
2
+ SHA256:
3
+ metadata.gz: 8dd51a14780db543c8f623dcc7d65a1c64a0711c43e9f903b2dd2c1003290145
4
+ data.tar.gz: ccaac450fe4293eb267bc0570cc055b097bf78d7f179349a351798578c828e57
5
5
  SHA512:
6
- metadata.gz: 9834aae07555564f02a5e4b3f971404f56503652185c3f5c1e33a5931ca3622c973ad20d0291232fe4d58794dd5a19e8526ad035121ad2a92e9fb03c653472a2
7
- data.tar.gz: 9fa49fa62dbabe053bcb983840f7b2f514adaf53aa33145f8459f0c155583150a49ad8a8b6605245b16e31e51cf9a92abe5d66f87b3cddf91ea9da118dac97cf
6
+ metadata.gz: 604ba86881bd30346afa016ff584e1f94b8fa100ea5157e58750e3ff4fce9eb29ba24202b2c84ea1e3bcb0ddcfcac4abf0c5f60f093c6359bc121a952442dc87
7
+ data.tar.gz: 61307162f1cf6f673371d04c32d75b6c920a653254c6d54d3e6806abfc059336a17437b2bd523acd8669de0a9e77506275bb341cd88ce8e84221ee1486832f68
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DeleteRecursively
4
+ VERSION = '1.0.2'
5
+ end
@@ -1,9 +1,13 @@
1
+ # frozen_string_literal: true
2
+
1
3
  #
2
4
  # DeleteRecursively
3
5
  #
4
6
  # Adds a new dependent: option to ActiveRecord associations.
5
7
  #
6
8
  module DeleteRecursively
9
+ require_relative File.join('delete_recursively', 'version')
10
+
7
11
  NEW_DEPENDENT_OPTION = :delete_recursively
8
12
 
9
13
  # override ::valid_dependent_options to make the new
@@ -28,54 +32,103 @@ module DeleteRecursively
28
32
  end
29
33
  end
30
34
 
31
- def self.delete_recursively(reflection, record_ids)
32
- record_class = reflection.klass
33
- record_class.reflect_on_all_associations.each do |sub_reflection|
34
- next unless recurse_on?(sub_reflection)
35
- dependent_ids = dependent_ids(record_class, record_ids, sub_reflection)
36
- delete_recursively(sub_reflection, dependent_ids)
35
+ class << self
36
+ def delete_recursively(reflection, record_ids)
37
+ record_class = reflection.klass
38
+ if recurse_on?(reflection)
39
+ record_class.reflect_on_all_associations.each do |sub_reflection|
40
+ sub_ref_ids = dependent_ids(record_class, record_ids, sub_reflection)
41
+ delete_recursively(sub_reflection, sub_ref_ids)
42
+ end
43
+ end
44
+ destroy_or_delete(reflection, record_class, record_ids)
37
45
  end
38
- record_class.delete(record_ids) if enabled_for?(reflection)
39
- record_class.destroy(record_ids) if destructive?(reflection)
40
- end
41
46
 
42
- def self.recurse_on?(reflection)
43
- enabled_for?(reflection) || destructive?(reflection)
44
- end
47
+ def destroy_or_delete(reflection, record_class, record_ids)
48
+ if destructive?(reflection)
49
+ record_class.destroy(record_ids)
50
+ elsif enabled_for?(reflection) || deleting?(reflection)
51
+ record_class.delete(record_ids)
52
+ end
53
+ end
45
54
 
46
- def self.enabled_for?(reflection)
47
- reflection.options[:dependent] == NEW_DEPENDENT_OPTION
48
- end
55
+ def recurse_on?(reflection)
56
+ enabled_for?(reflection) || destructive?(reflection)
57
+ end
49
58
 
50
- def self.destructive?(reflection)
51
- [:destroy, :destroy_all].include?(reflection.options[:dependent])
52
- end
59
+ def enabled_for?(reflection)
60
+ reflection.options[:dependent] == NEW_DEPENDENT_OPTION
61
+ end
53
62
 
54
- def self.dependent_ids(owner_class, owner_ids, reflection)
55
- if reflection.belongs_to?
56
- owners_arel = owner_class.where(owner_class.primary_key => owner_ids)
57
- owners_arel.pluck(reflection.association_foreign_key).compact
58
- else
59
- custom_foreign_key = reflection.options[:foreign_key]
60
- foreign_key = custom_foreign_key || owner_class.to_s.foreign_key
61
- reflection.klass.where(foreign_key => owner_ids).ids
63
+ def destructive?(reflection)
64
+ %i[destroy destroy_all].include?(reflection.options[:dependent])
65
+ end
66
+
67
+ def deleting?(reflection)
68
+ %i[delete delete_all].include?(reflection.options[:dependent])
69
+ end
70
+
71
+ def dependent_ids(owner_class, owner_ids, reflection)
72
+ if reflection.belongs_to?
73
+ owners_arel = owner_class.where(owner_class.primary_key => owner_ids)
74
+ owners_arel.pluck(reflection.association_foreign_key).compact
75
+ elsif reflection.through_reflection
76
+ dependent_ids_with_through_option(owner_class, owner_ids, reflection)
77
+ else
78
+ owner_foreign_key = foreign_key(owner_class, reflection)
79
+ reflection.klass.where(owner_foreign_key => owner_ids).ids
80
+ end
81
+ end
82
+
83
+ def dependent_ids_with_through_option(owner_class, owner_ids, reflection)
84
+ through_reflection = reflection.through_reflection
85
+ owner_foreign_key = foreign_key(owner_class, through_reflection)
86
+
87
+ dependent_class = reflection.klass
88
+ dependent_through_reflection = inverse_through_reflection(reflection)
89
+ dependent_foreign_key =
90
+ foreign_key(dependent_class, dependent_through_reflection)
91
+
92
+ through_reflection.klass
93
+ .where(owner_foreign_key => owner_ids)
94
+ .pluck(dependent_foreign_key)
62
95
  end
63
- end
64
96
 
65
- def self.all(record_class, criteria = {})
66
- applicable_criteria = criteria.select do |column_name, _value|
67
- record_class.column_names.include?(column_name.to_s)
97
+ def inverse_through_reflection(reflection)
98
+ through_class = reflection.through_reflection.klass
99
+ reflection.klass.reflect_on_all_associations
100
+ .map(&:through_reflection)
101
+ .find { |thr_ref| thr_ref && thr_ref.klass == through_class }
68
102
  end
69
- record_class.delete_all(applicable_criteria)
70
- record_class.reflect_on_all_associations.each do |reflection|
71
- all(reflection.klass, criteria) if recurse_on?(reflection)
103
+
104
+ def foreign_key(owner_class, reflection)
105
+ custom_foreign_key = reflection && reflection.options[:foreign_key]
106
+ custom_foreign_key || owner_class.to_s.foreign_key
107
+ end
108
+
109
+ def all(record_class, criteria = {})
110
+ record_class.reflect_on_all_associations.each do |reflection|
111
+ if recurse_on?(reflection)
112
+ all(reflection.klass, criteria)
113
+ elsif deleting?(reflection)
114
+ delete_with_applicable_criteria(reflection.klass, criteria)
115
+ end
116
+ end
117
+ delete_with_applicable_criteria(record_class, criteria)
118
+ end
119
+
120
+ def delete_with_applicable_criteria(record_class, criteria)
121
+ applicable_criteria = criteria.select do |column_name, _value|
122
+ record_class.column_names.include?(column_name.to_s)
123
+ end
124
+ record_class.where(applicable_criteria).delete_all
72
125
  end
73
126
  end
74
127
  end
75
128
 
76
129
  require 'active_record'
77
130
 
78
- %w(BelongsTo HasMany HasOne).each do |assoc_name|
131
+ %w[BelongsTo HasMany HasOne].each do |assoc_name|
79
132
  assoc_builder = ActiveRecord::Associations::Builder.const_get(assoc_name)
80
133
  assoc_builder.singleton_class.prepend(DeleteRecursively::OptionPermission)
81
134
 
metadata CHANGED
@@ -1,113 +1,139 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: delete_recursively
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.3
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Janosch Müller
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-12-13 00:00:00.000000000 Z
11
+ date: 2021-12-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 4.1.14
20
+ - - "<"
18
21
  - !ruby/object:Gem::Version
19
- version: '4.2'
22
+ version: 8.0.0
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
24
- - - "~>"
27
+ - - ">="
25
28
  - !ruby/object:Gem::Version
26
- version: '4.2'
29
+ version: 4.1.14
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: 8.0.0
27
33
  - !ruby/object:Gem::Dependency
28
- name: codeclimate-test-reporter
34
+ name: appraisal
29
35
  requirement: !ruby/object:Gem::Requirement
30
36
  requirements:
31
37
  - - "~>"
32
38
  - !ruby/object:Gem::Version
33
- version: '0.4'
39
+ version: '2.3'
34
40
  type: :development
35
41
  prerelease: false
36
42
  version_requirements: !ruby/object:Gem::Requirement
37
43
  requirements:
38
44
  - - "~>"
39
45
  - !ruby/object:Gem::Version
40
- version: '0.4'
46
+ version: '2.3'
41
47
  - !ruby/object:Gem::Dependency
42
- name: rails
48
+ name: codecov
43
49
  requirement: !ruby/object:Gem::Requirement
44
50
  requirements:
45
51
  - - "~>"
46
52
  - !ruby/object:Gem::Version
47
- version: '4.2'
53
+ version: '0.2'
48
54
  type: :development
49
55
  prerelease: false
50
56
  version_requirements: !ruby/object:Gem::Requirement
51
57
  requirements:
52
58
  - - "~>"
53
59
  - !ruby/object:Gem::Version
54
- version: '4.2'
60
+ version: '0.2'
61
+ - !ruby/object:Gem::Dependency
62
+ name: rails
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: 4.1.14
68
+ - - "<"
69
+ - !ruby/object:Gem::Version
70
+ version: 8.0.0
71
+ type: :development
72
+ prerelease: false
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - ">="
76
+ - !ruby/object:Gem::Version
77
+ version: 4.1.14
78
+ - - "<"
79
+ - !ruby/object:Gem::Version
80
+ version: 8.0.0
55
81
  - !ruby/object:Gem::Dependency
56
82
  name: rake
57
83
  requirement: !ruby/object:Gem::Requirement
58
84
  requirements:
59
85
  - - "~>"
60
86
  - !ruby/object:Gem::Version
61
- version: '10.4'
87
+ version: '13.0'
62
88
  type: :development
63
89
  prerelease: false
64
90
  version_requirements: !ruby/object:Gem::Requirement
65
91
  requirements:
66
92
  - - "~>"
67
93
  - !ruby/object:Gem::Version
68
- version: '10.4'
94
+ version: '13.0'
69
95
  - !ruby/object:Gem::Dependency
70
96
  name: rspec
71
97
  requirement: !ruby/object:Gem::Requirement
72
98
  requirements:
73
99
  - - "~>"
74
100
  - !ruby/object:Gem::Version
75
- version: '3.3'
101
+ version: '3.10'
76
102
  type: :development
77
103
  prerelease: false
78
104
  version_requirements: !ruby/object:Gem::Requirement
79
105
  requirements:
80
106
  - - "~>"
81
107
  - !ruby/object:Gem::Version
82
- version: '3.3'
108
+ version: '3.10'
83
109
  - !ruby/object:Gem::Dependency
84
110
  name: rspec-rails
85
111
  requirement: !ruby/object:Gem::Requirement
86
112
  requirements:
87
113
  - - "~>"
88
114
  - !ruby/object:Gem::Version
89
- version: '3.3'
115
+ version: '4.0'
90
116
  type: :development
91
117
  prerelease: false
92
118
  version_requirements: !ruby/object:Gem::Requirement
93
119
  requirements:
94
120
  - - "~>"
95
121
  - !ruby/object:Gem::Version
96
- version: '3.3'
122
+ version: '4.0'
97
123
  - !ruby/object:Gem::Dependency
98
124
  name: sqlite3
99
125
  requirement: !ruby/object:Gem::Requirement
100
126
  requirements:
101
127
  - - "~>"
102
128
  - !ruby/object:Gem::Version
103
- version: '1.3'
129
+ version: '1.4'
104
130
  type: :development
105
131
  prerelease: false
106
132
  version_requirements: !ruby/object:Gem::Requirement
107
133
  requirements:
108
134
  - - "~>"
109
135
  - !ruby/object:Gem::Version
110
- version: '1.3'
136
+ version: '1.4'
111
137
  description: Adds a new :dependent option for ActiveRecord associations that recursively
112
138
  deletes all dependent records without instantiating them.
113
139
  email: janosch84@gmail.com
@@ -116,11 +142,12 @@ extensions: []
116
142
  extra_rdoc_files: []
117
143
  files:
118
144
  - lib/delete_recursively.rb
119
- homepage: https://github.com/janosch-x/delete_recursively
145
+ - lib/delete_recursively/version.rb
146
+ homepage: https://github.com/jaynetics/delete_recursively
120
147
  licenses:
121
148
  - MIT
122
149
  metadata: {}
123
- post_install_message:
150
+ post_install_message:
124
151
  rdoc_options: []
125
152
  require_paths:
126
153
  - lib
@@ -135,10 +162,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
135
162
  - !ruby/object:Gem::Version
136
163
  version: '0'
137
164
  requirements: []
138
- rubyforge_project:
139
- rubygems_version: 2.4.8
140
- signing_key:
165
+ rubygems_version: 3.2.32
166
+ signing_key:
141
167
  specification_version: 4
142
168
  summary: Delete ActiveRecords efficiently
143
169
  test_files: []
144
- has_rdoc: