dependent-auto-rails 0.1.4 → 0.1.6

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: 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