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.
- checksums.yaml +7 -0
- data/lib/active_record_decorator.rb +101 -0
- 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: []
|