dependent-auto-rails 0.1.4 → 0.1.6

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: d8a5de40e738a480461d249edc98b76df49778d58e77fee8a3a54f90ffa017ad
4
- data.tar.gz: 8bbb14703a6e1a20da97cde693f05000f77202eae0e05ecbfe37d0fd7ce8d749
3
+ metadata.gz: b0596b3547afda10b9f5dbde19305f2f82513c08f0e0f2cbba8ea61d6c7d3e36
4
+ data.tar.gz: 34d8c36bcec58674d9b1d98f130335e102896493ab7a86aba4ee7ff1aada0b28
5
5
  SHA512:
6
- metadata.gz: 828ba4145c234101a34c753c6d247739f4ee97734a8ab1a5c065d443e5b60cdcb97713c7180d0fc317ba536760827363ec14cb8676e4b59bd628b0f38e00f4ad
7
- data.tar.gz: 1efacf7ea4308f2afe9e7d998ed0fc8fa9e8e23bf06bd0d8ee484c10a7e4bc5ea3cc50a61588577ab8163854b123ae884204255362287e93b832f3396ce1d806
6
+ metadata.gz: fb17812a18ac89155498d56a7a11fbdc36076c9f0859765e18dd6abbaf33d26d7495582cf294b9f464fe49fc316eb23ed529c52dc94e91d7a0098782119a9bbb
7
+ data.tar.gz: e242a528349742be08232e9fae587d630de0d78db8962151ff64af97b414d668dc3f62db70b82cac136692a7bd9d345a8c99420384408f0a1430237191303469
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveRecord::Associations::Builder
4
+ class BelongsTo < SingularAssociation
5
+ def self.valid_dependent_options
6
+ [:auto, :destroy, :delete, :destroy_async]
7
+ end
8
+ private_class_method :valid_dependent_options
9
+ end
10
+ end
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveRecord::Associations::Builder
4
+ class HasMany < CollectionAssociation
5
+ def self.valid_dependent_options
6
+ [:auto, :destroy, :delete_all, :nullify, :restrict_with_error, :restrict_with_exception, :destroy_async]
7
+ end
8
+ private_class_method :macro, :valid_options, :valid_dependent_options
9
+ end
10
+ end
11
+
12
+ module ActiveRecord
13
+ module Associations
14
+ class HasManyAssociation < CollectionAssociation
15
+ def handle_dependency
16
+ case options[:dependent]
17
+ when :restrict_with_exception
18
+ raise ActiveRecord::DeleteRestrictionError.new(reflection.name) unless empty?
19
+
20
+ when :restrict_with_error
21
+ unless empty?
22
+ record = owner.class.human_attribute_name(reflection.name).downcase
23
+ owner.errors.add(:base, :"restrict_dependent_destroy.has_many", record: record)
24
+ throw(:abort)
25
+ end
26
+
27
+ when :destroy
28
+ # No point in executing the counter update since we're going to destroy the parent anyway
29
+ load_target.each { |t| t.destroyed_by_association = reflection }
30
+ destroy_all
31
+ when :destroy_async
32
+ load_target.each do |t|
33
+ t.destroyed_by_association = reflection
34
+ end
35
+
36
+ unless target.empty?
37
+ association_class = target.first.class
38
+ if association_class.query_constraints_list
39
+ primary_key_column = association_class.query_constraints_list.map(&:to_sym)
40
+ ids = target.collect { |assoc| primary_key_column.map { |col| assoc.public_send(col) } }
41
+ else
42
+ primary_key_column = association_class.primary_key.to_sym
43
+ ids = target.collect { |assoc| assoc.public_send(primary_key_column) }
44
+ end
45
+
46
+ ids.each_slice(owner.class.destroy_association_async_batch_size || ids.size) do |ids_batch|
47
+ enqueue_destroy_association(
48
+ owner_model_name: owner.class.to_s,
49
+ owner_id: owner.id,
50
+ association_class: reflection.klass.to_s,
51
+ association_ids: ids_batch,
52
+ association_primary_key_column: primary_key_column,
53
+ ensuring_owner_was_method: options.fetch(:ensuring_owner_was, nil)
54
+ )
55
+ end
56
+ end
57
+ else
58
+ delete_all
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveRecord::Associations::Builder
4
+ class HasOne < SingularAssociation
5
+ def self.valid_dependent_options
6
+ [:auto, :destroy, :destroy_async, :delete, :nullify, :restrict_with_error, :restrict_with_exception]
7
+ end
8
+ private_class_method :valid_dependent_options
9
+ end
10
+ end
@@ -0,0 +1,80 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveRecord
4
+ module Reflection
5
+ class AssociationReflection < MacroReflection
6
+ private
7
+
8
+ def convert_options_to_dynamic_reflection_options!
9
+ @options = DynamicReflectionOptionsHash.new.merge!(
10
+ @options,
11
+ {
12
+ association_model_name: class_name,
13
+ association_type: collection? ? :collection : :singular
14
+ }
15
+ )
16
+ end
17
+
18
+ class DynamicReflectionOptionsHash < Hash
19
+ def [](key)
20
+ return super unless key == :dependent && super(:dependent) == :auto
21
+ return fallback_method if defining_dependent_callbacks?
22
+
23
+ model = super(:association_model_name).constantize
24
+ return :destroy unless valid_destroy_callbacks(model).empty?
25
+
26
+ case super(:association_type)
27
+ when :singular then :delete
28
+ when :collection then :delete_all
29
+ else fallback_method
30
+ end
31
+ end
32
+
33
+ private
34
+
35
+ def fallback_method
36
+ :destroy
37
+ end
38
+
39
+ def defining_dependent_callbacks?
40
+ caller.any? { |line| line.include?("active_record/associations/builder/association.rb") }
41
+ end
42
+
43
+ def valid_destroy_callbacks(model)
44
+ model._destroy_callbacks.reject do |callback|
45
+ # ignore #handle_dependency callback
46
+ callback.filter.to_s.include?("active_record/associations/builder/association.rb")
47
+ end
48
+ end
49
+ end
50
+ end
51
+
52
+ class BelongsToReflection < AssociationReflection
53
+ def initialize(...)
54
+ super(...)
55
+ convert_options_to_dynamic_reflection_options!
56
+ end
57
+ end
58
+
59
+ class HasOneReflection < AssociationReflection
60
+ def initialize(...)
61
+ super(...)
62
+ convert_options_to_dynamic_reflection_options!
63
+ end
64
+ end
65
+
66
+ class HasManyReflection < AssociationReflection
67
+ def initialize(...)
68
+ super(...)
69
+ convert_options_to_dynamic_reflection_options!
70
+ end
71
+ end
72
+
73
+ class HasAndBelongsToManyReflection < AssociationReflection
74
+ def initialize(...)
75
+ super(...)
76
+ convert_options_to_dynamic_reflection_options!
77
+ end
78
+ end
79
+ end
80
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module DependentAutoRails
4
- VERSION = "0.1.4"
4
+ VERSION = "0.1.6"
5
5
  end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_record"
4
+
5
+ ActiveSupport.on_load(:active_record) do
6
+ require_relative "dependent-auto-rails/activerecord/associations/builder/belongs_to"
7
+ require_relative "dependent-auto-rails/activerecord/associations/builder/has_one"
8
+ require_relative "dependent-auto-rails/activerecord/associations/builder/has_many"
9
+ require_relative "dependent-auto-rails/activerecord/reflection"
10
+ end
11
+
12
+ module DependentAutoRails
13
+ class Error < StandardError; end
14
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dependent-auto-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joshua Young
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-02-19 00:00:00.000000000 Z
11
+ date: 2024-02-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -49,17 +49,19 @@ files:
49
49
  - CODE_OF_CONDUCT.md
50
50
  - LICENSE.txt
51
51
  - README.md
52
- - lib/dependent-auto-rails/activerecord/associations/builder/association.rb
53
- - lib/dependent-auto-rails/dependent_auto_rails.rb
52
+ - lib/dependent-auto-rails.rb
53
+ - lib/dependent-auto-rails/activerecord/associations/builder/belongs_to.rb
54
+ - lib/dependent-auto-rails/activerecord/associations/builder/has_many.rb
55
+ - lib/dependent-auto-rails/activerecord/associations/builder/has_one.rb
56
+ - lib/dependent-auto-rails/activerecord/reflection.rb
54
57
  - lib/dependent-auto-rails/version.rb
55
58
  homepage: https://github.com/joshuay03/dependent-auto-rails
56
59
  licenses:
57
60
  - MIT
58
61
  metadata:
59
- allowed_push_host: https://rubygems.org
60
62
  homepage_uri: https://github.com/joshuay03/dependent-auto-rails
61
63
  source_code_uri: https://github.com/joshuay03/dependent-auto-rails
62
- changelog_uri: https://github.com/joshuay03/dependent-auto-rails/CHANGELOG.md
64
+ changelog_uri: https://github.com/joshuay03/dependent-auto-rails/blob/master/CHANGELOG.md
63
65
  post_install_message:
64
66
  rdoc_options: []
65
67
  require_paths:
@@ -1,68 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ActiveRecord::Associations::Builder
4
- class Association
5
- def self.create_reflection(model, name, scope, options, &block)
6
- raise ArgumentError, "association names must be a Symbol" unless name.is_a?(Symbol)
7
-
8
- validate_options(options)
9
-
10
- extension = define_extensions(model, name, &block)
11
- options[:extend] = [*options[:extend], extension] if extension
12
-
13
- scope = build_scope(scope)
14
-
15
- ActiveRecord::Reflection.create(macro, name, scope, dynamic_reflection_options(model, options), model)
16
- end
17
-
18
- def self.dynamic_reflection_options(model, options)
19
- DynamicReflectionOptionsHash.new.merge!(
20
- options,
21
- {
22
- model_name: model.name,
23
- association_type: if self < ActiveRecord::Associations::Builder::SingularAssociation
24
- :singular
25
- elsif self < ActiveRecord::Associations::Builder::CollectionAssociation
26
- :collection
27
- else
28
- raise DependentAutoRails::Error, "Unsupported association type"
29
- end
30
- }
31
- )
32
- end
33
- private_class_method :dynamic_reflection_options
34
-
35
- class DynamicReflectionOptionsHash < Hash
36
- def [](key)
37
- return super unless key == :dependent && super(:dependent) == :auto
38
- return fallback_method if defining_dependent_callbacks?
39
-
40
- model = super(:model_name).constantize
41
- return :destroy unless valid_destroy_callbacks(model).empty?
42
-
43
- case super(:association_type)
44
- when :singular then :delete
45
- when :collection then :delete_all
46
- else fallback_method
47
- end
48
- end
49
-
50
- private
51
-
52
- def fallback_method
53
- :destroy
54
- end
55
-
56
- def defining_dependent_callbacks?
57
- caller.any? { |line| line.include?("active_record/associations/builder/association.rb") }
58
- end
59
-
60
- def valid_destroy_callbacks(model)
61
- model._destroy_callbacks.reject do |callback|
62
- # ignore #handle_dependency callback
63
- callback.filter.to_s.include?("active_record/associations/builder/association.rb")
64
- end
65
- end
66
- end
67
- end
68
- end
@@ -1,11 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "active_record"
4
-
5
- ActiveSupport.on_load(:active_record) do
6
- require "dependent-auto-rails/activerecord/associations/builder/association"
7
- end
8
-
9
- module DependentAutoRails
10
- class Error < StandardError; end
11
- end