bulk_dependency_eraser 2.2.0 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 73ac2c6209f874175a8a1208c184a3fdaa73f2020a411f2f41bd069668b63fbc
4
- data.tar.gz: 86df357905f75f34337d30446cfc6b34b9aa55fc1947d17a008329379f2beae7
3
+ metadata.gz: 954e4ce7b9c7d42a0cdcdc1403592dce3e61c6c196e72858a5c2f66f5be3e3df
4
+ data.tar.gz: 18233fefb36153a49d43d4aed40e3f44ca0f3123d346429a0a0b50a355577a16
5
5
  SHA512:
6
- metadata.gz: 69fd26f7fcbd04f158adf4bc038181818136f17d878bad544bb888b1d0f547d557153204876a91b222154f7154d0f38b143f4db08f5081242c107488832fa682
7
- data.tar.gz: b31893d532b1be190f5288ddfb495008615a3c54f2e5a9fb12344a733c4322345911597822c835277f9f4632657aeefe4ee7a77fe7eecea16cf64151dd63a797
6
+ metadata.gz: e57be3e7ab4203123f919530710dd4f63842abbf588b49896fa78b2cb3fcf0c58d7e64e2881b165396cb919a897acfe3279d2c3d740a3c8f0ace8dfd923eb3c0
7
+ data.tar.gz: 3b05c7edc262d1cf0b663d451084698b52f2e11fb8ec03a057ac70551f630d35ad67530921f24535288adf1761377981e69803bb7519e8f4449977dab8ec56ca
@@ -123,6 +123,8 @@ module BulkDependencyEraser
123
123
  end
124
124
  end
125
125
 
126
+ # We're supporting custom query scopes on by klass name.
127
+ # - apply them here
126
128
  def custom_scope_for_query(query)
127
129
  klass = query.klass
128
130
  if opts_c.proc_scopes_per_class_name.key?(klass.name)
@@ -1,8 +1,22 @@
1
1
  module BulkDependencyEraser
2
2
  class Builder < Base
3
+ DEFAULT_DB_BUILD_ALL_WRAPPER = ->(builder, block) do
4
+ begin
5
+ block.call
6
+ rescue StandardError => e
7
+ builder.report_error(
8
+ <<~STRING.strip
9
+ Issue attempting to build deletion query for '#{e.building_klass_name}'
10
+ => #{e.original_error_klass.name}: #{e.message}
11
+ STRING
12
+ )
13
+ end
14
+ end
15
+
3
16
  DEFAULT_OPTS = {
4
17
  force_destroy_restricted: false,
5
18
  verbose: false,
19
+ db_build_all_wrapper: self::DEFAULT_DB_BUILD_ALL_WRAPPER,
6
20
  # Some associations scopes take parameters.
7
21
  # - We would have to instantiate if we wanted to apply that scope filter.
8
22
  instantiate_if_assoc_scope_with_arity: false,
@@ -38,6 +52,7 @@ module BulkDependencyEraser
38
52
  attr_accessor :deletion_list, :nullification_list
39
53
  attr_reader :ignore_table_deletion_list, :ignore_table_nullification_list
40
54
  attr_reader :query_schema_parser
55
+ attr_reader :current_klass_name
41
56
 
42
57
  delegate :circular_dependency_klasses, :flat_dependencies_per_klass, to: :query_schema_parser
43
58
 
@@ -57,6 +72,8 @@ module BulkDependencyEraser
57
72
  @ignore_table_name_and_dependencies = opts_c.ignore_tables_and_dependencies.collect { |table_name| table_name }
58
73
  @ignore_klass_name_and_dependencies = opts_c.ignore_klass_names_and_dependencies.collect { |klass_name| klass_name }
59
74
  @query_schema_parser = BulkDependencyEraser::QuerySchemaParser.new(query:, opts:)
75
+ # Moving pointer, points to the current class that is being queries
76
+ @current_klass_name = query.is_a?(ActiveRecord::Relation) ? query.klass.name : query.name
60
77
  end
61
78
 
62
79
  def execute
@@ -82,33 +99,20 @@ module BulkDependencyEraser
82
99
  end
83
100
 
84
101
  def build
85
- begin
86
- if opts_c.verbose
87
- puts "Starting build for #{@query.is_a?(ActiveRecord::Relation) ? @query.klass.name : @query.name}"
88
- end
102
+ build_all_in_db do
103
+ begin
104
+ if opts_c.verbose
105
+ puts "Starting build for #{@query.is_a?(ActiveRecord::Relation) ? @query.klass.name : @query.name}"
106
+ end
89
107
 
90
- deletion_query_parser(@query)
108
+ deletion_query_parser(@query)
91
109
 
92
- uniqify_errors!
110
+ uniqify_errors!
93
111
 
94
- return errors.none?
95
- rescue StandardError => e
96
- if @query.is_a?(ActiveRecord::Relation)
97
- klass = @query.klass
98
- else
99
- # current_query is a normal rails class
100
- klass = @query
112
+ return errors.none?
113
+ rescue StandardError => e
114
+ raise BulkDependencyEraser::Errors::BuilderError.new(e.class, e.message, building_klass_name: current_klass_name)
101
115
  end
102
- report_error(
103
- "
104
- Error Encountered in 'execute' for '#{klass.name}':
105
- #{e.class.name}
106
- #{e.message}
107
- "
108
- )
109
- raise e
110
-
111
- return false
112
116
  end
113
117
  end
114
118
 
@@ -127,7 +131,8 @@ module BulkDependencyEraser
127
131
  end
128
132
  end
129
133
 
130
- def pluck_from_query query, column = :id
134
+ def pluck_from_query(query, column = :id)
135
+ set_current_klass_name(query)
131
136
  # ordering shouldn't matter in these queries, and would slow it down
132
137
  # - we're ignoring default_scope ordering, but assoc-defined ordering would still take effect
133
138
  query = query.reorder('')
@@ -293,6 +298,7 @@ module BulkDependencyEraser
293
298
  is_polymorphic = reflection.options[:polymorphic]
294
299
  unless is_polymorphic
295
300
  klass = reflection.klass
301
+ set_current_klass_name(reflection.klass)
296
302
 
297
303
  if ignore_table_name_and_dependencies.include?(klass.table_name)
298
304
  # Not parsing, table and dependencies ignorable
@@ -445,7 +451,6 @@ module BulkDependencyEraser
445
451
  assoc_klass = reflection.klass
446
452
  assoc_klass_name = assoc_klass.name
447
453
 
448
-
449
454
  # specified_primary_key = reflection.options[:primary_key]&.to_s
450
455
  # specified_foreign_key = reflection.options[:foreign_key]&.to_s
451
456
 
@@ -739,5 +744,16 @@ module BulkDependencyEraser
739
744
 
740
745
  return klass_index
741
746
  end
747
+
748
+ def build_all_in_db(&block)
749
+ puts "Building all from DB..." if opts_c.verbose
750
+ opts_c.db_build_all_wrapper.call(self, block)
751
+ puts "Building all from DB complete." if opts_c.verbose
752
+ end
753
+
754
+ def set_current_klass_name(query_or_klass)
755
+ klass = query_or_klass.is_a?(ActiveRecord::Relation) ? query_or_klass.klass : query_or_klass
756
+ @current_klass_name = klass.name
757
+ end
742
758
  end
743
759
  end
@@ -3,8 +3,13 @@ module BulkDependencyEraser
3
3
  DEFAULT_DB_DELETE_ALL_WRAPPER = ->(deleter, block) do
4
4
  begin
5
5
  block.call
6
- rescue StandardError => e
7
- report_error("Issue attempting to delete '#{current_class_name}': #{e.class.name} - #{e.message}")
6
+ rescue BulkDependencyEraser::Errors::DeleterError => e
7
+ deleter.report_error(
8
+ <<~STRING.strip
9
+ Issue attempting to delete klass '#{e.deleting_klass_name}'
10
+ => #{e.original_error_klass.name}: #{e.message}
11
+ STRING
12
+ )
8
13
  end
9
14
  end
10
15
 
@@ -60,23 +65,27 @@ module BulkDependencyEraser
60
65
 
61
66
  current_class_name = 'N/A'
62
67
  delete_all_in_db do
63
- class_names_and_ids.keys.reverse.each do |class_name|
64
- current_class_name = class_name
65
- ids = class_names_and_ids[class_name].reverse
66
- klass = constantize(class_name)
68
+ begin
69
+ class_names_and_ids.keys.reverse.each do |class_name|
70
+ current_class_name = class_name
71
+ ids = class_names_and_ids[class_name].reverse
72
+ klass = constantize(class_name)
67
73
 
68
- if opts_c.enable_invalid_foreign_key_detection
69
- # delete with referential integrity
70
- delete_by_klass_and_ids(klass, ids)
71
- else
72
- # delete without referential integrity
73
- # Disable any ActiveRecord::InvalidForeignKey raised errors.
74
- # - src: https://stackoverflow.com/questions/41005849/rails-migrations-temporarily-ignore-foreign-key-constraint
75
- # https://apidock.com/rails/ActiveRecord/ConnectionAdapters/AbstractAdapter/disable_referential_integrity
76
- ActiveRecord::Base.connection.disable_referential_integrity do
74
+ if opts_c.enable_invalid_foreign_key_detection
75
+ # delete with referential integrity
77
76
  delete_by_klass_and_ids(klass, ids)
77
+ else
78
+ # delete without referential integrity
79
+ # Disable any ActiveRecord::InvalidForeignKey raised errors.
80
+ # - src: https://stackoverflow.com/questions/41005849/rails-migrations-temporarily-ignore-foreign-key-constraint
81
+ # https://apidock.com/rails/ActiveRecord/ConnectionAdapters/AbstractAdapter/disable_referential_integrity
82
+ ActiveRecord::Base.connection.disable_referential_integrity do
83
+ delete_by_klass_and_ids(klass, ids)
84
+ end
78
85
  end
79
86
  end
87
+ rescue StandardError => e
88
+ raise BulkDependencyEraser::Errors::DeleterError.new(e.class, e.message, deleting_klass_name: current_class_name)
80
89
  end
81
90
  end
82
91
 
@@ -0,0 +1,5 @@
1
+ module BulkDependencyEraser
2
+ module Errors
3
+ class BaseError < StandardError; end
4
+ end
5
+ end
@@ -0,0 +1,13 @@
1
+ module BulkDependencyEraser
2
+ module Errors
3
+ class BuilderError < BaseError
4
+ attr_reader :original_error_klass, :building_klass_name
5
+
6
+ def initialize(original_error_klass, message, building_klass_name:)
7
+ @original_error_klass = original_error_klass
8
+ @building_klass_name = building_klass_name
9
+ super(message)
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module BulkDependencyEraser
2
+ module Errors
3
+ class DeleterError < BaseError
4
+ attr_reader :original_error_klass, :deleting_klass_name
5
+
6
+ def initialize(original_error_klass, message, deleting_klass_name:)
7
+ @original_error_klass = original_error_klass
8
+ @deleting_klass_name = deleting_klass_name
9
+ super(message)
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,14 @@
1
+ module BulkDependencyEraser
2
+ module Errors
3
+ class NullifierError < BaseError
4
+ attr_reader :original_error_klass, :nullifying_klass_name, :nullifying_columns
5
+
6
+ def initialize(original_error_klass, message, nullifying_klass_name:, nullifying_columns:)
7
+ @original_error_klass = original_error_klass
8
+ @nullifying_klass_name = nullifying_klass_name
9
+ @nullifying_columns = nullifying_columns
10
+ super(message)
11
+ end
12
+ end
13
+ end
14
+ end
@@ -3,8 +3,13 @@ module BulkDependencyEraser
3
3
  DEFAULT_DB_NULLIFY_ALL_WRAPPER = ->(nullifier, block) do
4
4
  begin
5
5
  block.call
6
- rescue StandardError => e
7
- nullifier.report_error("Issue attempting to nullify: #{e.class.name} - #{e.message}")
6
+ rescue BulkDependencyEraser::Errors::NullifierError => e
7
+ nullifier.report_error(
8
+ <<~STRING.strip
9
+ Issue attempting to nullify klass '#{e.nullifying_klass_name}' on column(s) '#{e.nullifying_columns}'
10
+ => #{e.original_error_klass.name}: #{e.message}
11
+ STRING
12
+ )
8
13
  end
9
14
  end
10
15
 
@@ -114,6 +119,7 @@ module BulkDependencyEraser
114
119
  current_class_name = 'N/A'
115
120
  current_column = 'N/A'
116
121
  nullify_all_in_db do
122
+ begin
117
123
  # column_and_ids should have already been reversed in builder
118
124
  class_names_columns_and_ids.keys.reverse.each do |class_name|
119
125
  current_class_name = class_name
@@ -139,6 +145,14 @@ module BulkDependencyEraser
139
145
  end
140
146
  end
141
147
  end
148
+ rescue StandardError => e
149
+ raise BulkDependencyEraser::Errors::NullifierError.new(
150
+ e.class,
151
+ e.message,
152
+ nullifying_klass_name: current_class_name,
153
+ nullifying_columns: current_column.to_s # could be an array, string, or symbol
154
+ )
155
+ end
142
156
  end
143
157
 
144
158
  return errors.none?
@@ -1,3 +1,3 @@
1
1
  module BulkDependencyEraser
2
- VERSION = "2.2.0".freeze
2
+ VERSION = "3.0.0".freeze
3
3
  end
@@ -6,4 +6,8 @@ require_relative 'bulk_dependency_eraser/nullifier'
6
6
  require_relative 'bulk_dependency_eraser/query_schema_parser'
7
7
  require_relative 'bulk_dependency_eraser/manager'
8
8
  require_relative 'bulk_dependency_eraser/utils'
9
- require_relative 'bulk_dependency_eraser/version'
9
+ require_relative 'bulk_dependency_eraser/version'
10
+ require_relative 'bulk_dependency_eraser/errors/base_error'
11
+ require_relative 'bulk_dependency_eraser/errors/builder_error'
12
+ require_relative 'bulk_dependency_eraser/errors/deleter_error'
13
+ require_relative 'bulk_dependency_eraser/errors/nullifier_error'
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: 2.2.0
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - benjamin.dana.software.dev@gmail.com
@@ -146,6 +146,10 @@ files:
146
146
  - lib/bulk_dependency_eraser/base.rb
147
147
  - lib/bulk_dependency_eraser/builder.rb
148
148
  - lib/bulk_dependency_eraser/deleter.rb
149
+ - lib/bulk_dependency_eraser/errors/base_error.rb
150
+ - lib/bulk_dependency_eraser/errors/builder_error.rb
151
+ - lib/bulk_dependency_eraser/errors/deleter_error.rb
152
+ - lib/bulk_dependency_eraser/errors/nullifier_error.rb
149
153
  - lib/bulk_dependency_eraser/full_schema_parser.rb
150
154
  - lib/bulk_dependency_eraser/manager.rb
151
155
  - lib/bulk_dependency_eraser/nullifier.rb