bulk_dependency_eraser 0.0.2 → 1.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dca31bd9e7da64eaade636f74a6d787a1faacaf7f1489d8c2e3970443cd61c24
4
- data.tar.gz: bd407ef3c87918562d28f350c5b3051406ef605c93bbbf55e017969b601e39f0
3
+ metadata.gz: 3cafe34b586a54a169d2d728ba0a39d9403c90796db9f40c9050620eaa4ef156
4
+ data.tar.gz: a1a7001243a75db7740e2fbcbdfbf43dad5253f83de8c757bb7b2d0ab2f57763
5
5
  SHA512:
6
- metadata.gz: 3bb5b2c4dc13c792fc9dc909e1a4e7593dff9978f152a62d834fbe273a0166ac7e659004f299d3d8ab5e5cc9464d7d11c5fa88f1c8d3c4bac2b1661a4f344563
7
- data.tar.gz: c9ed11ba64c5de00b3dc248935c9345873741c071e7517f321b6c928b103bc52a9a59c69f65cf4e110d616c12257642c496e25a987501ab80a898b7231d8b774
6
+ metadata.gz: 9fc46dd24138b1be6c2ff436e9afdaa4f4f877c37fe23bec00ffec8ce142ffda71c6cccefd7a5d8354986757f9df02f0c64918419d270471eea866226cce87a6
7
+ data.tar.gz: ecfa3aca0fdae9d2de444f8fb8427758420c8ffa7ae8370daff95b5ef975db83ec9fc573e91d83e93f84acfd11e117171a1a276b45841954526cba6c481d2b21
@@ -12,6 +12,7 @@ module BulkDependencyEraser
12
12
  ignore_tables: [],
13
13
  # Won't parse any table in this list
14
14
  ignore_tables_and_dependencies: [],
15
+ ignore_klass_names_and_dependencies: [],
15
16
  }.freeze
16
17
 
17
18
  DEPENDENCY_NULLIFY = %i[
@@ -52,10 +53,12 @@ module BulkDependencyEraser
52
53
  @ignore_table_deletion_list = {}
53
54
  @ignore_table_nullification_list = {}
54
55
 
56
+ @table_names_to_parsed_klass_names = {}
57
+
55
58
  super(opts:)
56
59
 
57
- # populate with klass_names for ignorable klasses
58
- @ignore_klass_and_dependencies = opts_c.ignore_tables_and_dependencies.collect { |table_name| table_name.classify }
60
+ @ignore_table_name_and_dependencies = opts_c.ignore_tables_and_dependencies.collect { |table_name| table_name }
61
+ @ignore_klass_name_and_dependencies = opts_c.ignore_klass_names_and_dependencies.collect { |klass_name| klass_name }
59
62
  end
60
63
 
61
64
  def execute
@@ -63,10 +66,12 @@ module BulkDependencyEraser
63
66
  build_result = build
64
67
 
65
68
  # move any klass names if told to ignore them into their respective new lists
69
+ # - prior approach was to use table_name.classify, but we can't trust that approach.
66
70
  opts_c.ignore_tables.each do |table_name|
67
- klass_name = table_name.classify
68
- ignore_table_deletion_list[klass_name] = deletion_list.delete(klass_name) if deletion_list.key?(klass_name)
69
- ignore_table_nullification_list[klass_name] = nullification_list.delete(klass_name) if nullification_list.key?(klass_name)
71
+ table_names_to_parsed_klass_names.dig(table_name)&.each do |klass_name|
72
+ ignore_table_deletion_list[klass_name] = deletion_list.delete(klass_name) if deletion_list.key?(klass_name)
73
+ ignore_table_nullification_list[klass_name] = nullification_list.delete(klass_name) if nullification_list.key?(klass_name)
74
+ end
70
75
  end
71
76
 
72
77
  return build_result
@@ -108,15 +113,24 @@ module BulkDependencyEraser
108
113
  if query.is_a?(ActiveRecord::Relation)
109
114
  klass = query.klass
110
115
  klass_name = query.klass.name
111
- table_klass_name = query.klass.table_name.classify
112
116
  else
113
117
  # current_query is a normal rails class
114
118
  klass = query
115
119
  klass_name = query.name
116
- table_klass_name = query.table_name.classify
117
120
  end
118
121
 
119
- if ignore_klass_and_dependencies.include?(table_klass_name)
122
+ table_names_to_parsed_klass_names[klass.table_name] ||= []
123
+ # Need to populate this list here, so we can have access to it later for the :ignore_tables option
124
+ unless table_names_to_parsed_klass_names[klass.table_name].include?(klass_name)
125
+ table_names_to_parsed_klass_names[klass.table_name] << klass_name
126
+ end
127
+
128
+ if ignore_table_name_and_dependencies.include?(klass.table_name)
129
+ # Not parsing, table and dependencies ignorable
130
+ return
131
+ end
132
+
133
+ if ignore_klass_name_and_dependencies.include?(klass_name)
120
134
  # Not parsing, table and dependencies ignorable
121
135
  return
122
136
  end
@@ -141,25 +155,25 @@ module BulkDependencyEraser
141
155
  query.pluck(:id)
142
156
  end
143
157
 
144
- deletion_list[table_klass_name] ||= []
158
+ deletion_list[klass_name] ||= []
145
159
 
146
160
  # prevent infinite recursion here.
147
161
  # - Remove any IDs that have been processed before
148
- query_ids = query_ids - deletion_list[table_klass_name]
162
+ query_ids = query_ids - deletion_list[klass_name]
149
163
  # If ids are nil, let's find that error
150
164
  if query_ids.none? #|| query_ids.nil?
151
165
  # quick cleanup, if turns out was an empty class
152
- deletion_list.delete(table_klass_name) if deletion_list[table_klass_name].none?
166
+ deletion_list.delete(klass_name) if deletion_list[klass_name].none?
153
167
  return
154
168
  end
155
169
 
156
170
  # Use-case: We have more IDs to process
157
171
  # - can now safely add to the list, since we've prevented infinite recursion
158
- deletion_list[table_klass_name] += query_ids
172
+ deletion_list[klass_name] += query_ids
159
173
 
160
174
  # Hard to test if not sorted
161
175
  # - if we had more advanced rspec matches, we could do away with this.
162
- deletion_list[table_klass_name].sort! if Rails.env.test?
176
+ deletion_list[klass_name].sort! if Rails.env.test?
163
177
 
164
178
  # ignore associations that aren't a dependent destroyable type
165
179
  destroy_associations = query.reflect_on_all_associations.select do |reflection|
@@ -209,7 +223,7 @@ module BulkDependencyEraser
209
223
  reflection = parent_class.reflect_on_association(association_name)
210
224
  reflection_type = reflection.class.name
211
225
  assoc_klass = reflection.klass
212
- assoc_table_klass_name = assoc_klass.table_name.classify
226
+ assoc_klass_name = assoc_klass.name
213
227
 
214
228
  assoc_query = assoc_klass.unscoped
215
229
 
@@ -288,10 +302,10 @@ module BulkDependencyEraser
288
302
  # No assoc_ids, no need to add it to the nullification list
289
303
  return if assoc_ids.none?
290
304
 
291
- nullification_list[assoc_table_klass_name] ||= {}
292
- nullification_list[assoc_table_klass_name][specified_foreign_key] ||= []
293
- nullification_list[assoc_table_klass_name][specified_foreign_key] += assoc_ids
294
- nullification_list[assoc_table_klass_name][specified_foreign_key].uniq!
305
+ nullification_list[assoc_klass_name] ||= {}
306
+ nullification_list[assoc_klass_name][specified_foreign_key] ||= []
307
+ nullification_list[assoc_klass_name][specified_foreign_key] += assoc_ids
308
+ nullification_list[assoc_klass_name][specified_foreign_key].uniq!
295
309
  else
296
310
  raise "invalid parsing type: #{type}"
297
311
  end
@@ -300,6 +314,8 @@ module BulkDependencyEraser
300
314
  protected
301
315
 
302
316
  attr_reader :ignore_klass_and_dependencies
317
+ attr_reader :table_names_to_parsed_klass_names
318
+ attr_reader :ignore_table_name_and_dependencies, :ignore_klass_name_and_dependencies
303
319
 
304
320
  # A dependent assoc may be through another association. Follow the throughs to find the correct assoc to destroy.
305
321
  def find_root_association_from_through_assocs klass, association_name
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bulk_dependency_eraser
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - benjamin.dana.software.dev@gmail.com