active_record_decorator 0.0.1

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.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/active_record_decorator.rb +101 -0
  3. metadata +101 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: a553f1f34967ddcda72fda29064ea4e1424e974fbedc3c2c921a21982502c739
4
+ data.tar.gz: cf2cb0673c163f2677f159b77830c03dbf844c0d64378b6718611aef4e261e89
5
+ SHA512:
6
+ metadata.gz: 0eae119da8efc7d9e90bd06b92d0b2d57ac9389c0a60ec0bef7f00bcdc816bc3e36194343ebace25743246ef60f2bb8400ee51be663a7be864da6942912093d3
7
+ data.tar.gz: 7de351aaed4fb73d431ab313ae740862bbfa065029bbd2c450083649a5f307c9140021c0ec459711de6498cde33a5852764f7108119329190223b6fa518a6d3c
@@ -0,0 +1,101 @@
1
+
2
+ module ActiveRecordDecorator
3
+ extend ActiveSupport::Concern
4
+
5
+ class Callback
6
+
7
+ attr_reader :relation_name, :method_name, :relation_class
8
+
9
+ def initialize(relation_type, relation_name, relation_class, method_name)
10
+ @relation_type = relation_type
11
+ @relation_name = relation_name
12
+ @method_name = method_name
13
+ @relation_class = relation_class
14
+ end
15
+
16
+ def build(relation_name, method_name)
17
+ new(relation_name, method_name)
18
+ end
19
+
20
+ def relation_class_match?(rl_class)
21
+ rl_class == @relation_class
22
+ end
23
+
24
+ end
25
+
26
+ included do
27
+ class_attribute :relation_callback_chain
28
+ self.relation_callback_chain = Concurrent::Array.new
29
+
30
+ # Return self if false else self with passed scoped attached
31
+ # @param[condition] - deciding condition true/false to attach scope
32
+ # @param[scope] - name of the scope
33
+ # @param[scope_args] - Array of args
34
+ scope :conditional_scope, lambda { |condition, scope, scope_args = []|
35
+ if condition
36
+ return self.public_send(scope) if scope_args.blank?
37
+
38
+ return self.public_send(scope, *scope_args)
39
+ end
40
+ self
41
+ }
42
+
43
+ # Return self if @param[condition] false
44
+ # => else return self with passed includes attached
45
+ # @param[condition] - deciding condition true/false to attach includes
46
+ # @param[scope_args] - Array of args
47
+ scope :conditional_includes, lambda { |condition, association|
48
+ return self.includes(association) if condition
49
+ self
50
+ }
51
+
52
+ after_update :run_callbacks_registered
53
+ end
54
+
55
+ module ClassMethods
56
+ def on_has_one_update(relation_name, method, params = {})
57
+ register_relation_callback(:has_one, relation_name, method, params)
58
+ end
59
+
60
+ def on_has_many_update(relation_name, method, params = {})
61
+ register_relation_callback(:has_many, relation_name, method, params)
62
+ end
63
+
64
+ def register_relation_callback(relation_type, relation_name, method, params = {})
65
+ return if self.relation_callback_chain.detect { |rl| rl.relation_name == relation_name }
66
+ rl_reflects = self.reflect_on_all_associations(relation_type)
67
+ rl_reflect = rl_reflects.find { |rl| rl.name == relation_name }
68
+ self.relation_callback_chain << Callback.new(relation_type, relation_name, rl_reflect.klass, method)
69
+ end
70
+
71
+ def has_relation_callback_registered?(rl_class)
72
+ status = false
73
+ self.relation_callback_chain.each do |cb|
74
+ if cb.relation_class_match?(rl_class)
75
+ status = true
76
+ break
77
+ end
78
+ end
79
+ return status
80
+ end
81
+ end
82
+
83
+ def run_callbacks_registered()
84
+ relations = self.class.reflect_on_all_associations(:belongs_to)
85
+ relations.each do |rl|
86
+ rl_class = rl.klass
87
+ if rl_class.respond_to?(:has_relation_callback_registered?) && rl_class.has_relation_callback_registered?(self.class)
88
+ run_callback_for_relation_class(rl_class, self)
89
+ end
90
+ end
91
+ end
92
+
93
+ def run_callback_for_relation_class(rl_class, model)
94
+ rl_class.relation_callback_chain.each do |cb|
95
+ if cb.relation_class_match?(self.class)
96
+ rl = self.class.reflect_on_all_associations(:belongs_to).find { |rl_reflect| rl_reflect.klass == rl_class }
97
+ model.send(rl.name).send(cb.method_name) if rl
98
+ end
99
+ end
100
+ end
101
+ end
metadata ADDED
@@ -0,0 +1,101 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: active_record_decorator
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - kathir
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-08-20 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '4.2'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '4.2'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.15'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.15'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '10.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '10.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.0'
69
+ description: Activerecord utilities/extensions that will helps to make day-to-day
70
+ application development easily.
71
+ email: kathirvalavan.ict@gmail.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - lib/active_record_decorator.rb
77
+ homepage: https://rubygems.org/gems/active_record_decorator
78
+ licenses:
79
+ - MIT
80
+ metadata:
81
+ source_code_uri: https://github.com/kathirvalavan/active_record_decorator
82
+ post_install_message:
83
+ rdoc_options: []
84
+ require_paths:
85
+ - lib
86
+ required_ruby_version: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: '2.3'
91
+ required_rubygems_version: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ requirements: []
97
+ rubygems_version: 3.1.6
98
+ signing_key:
99
+ specification_version: 4
100
+ summary: Activerecord utilities/extensions
101
+ test_files: []