active_record_decorator 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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: []