adjustable_schema 0.5.0 → 0.5.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/models/adjustable_schema/relationship/role.rb +10 -0
- data/app/models/concerns/adjustable_schema/active_record/associations.rb +2 -0
- data/app/models/concerns/adjustable_schema/active_record/relationships.rb +74 -0
- data/lib/adjustable_schema/version.rb +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e850de1792bf132577dfde2173875a6935a5f2e11a0d0b4394739d34585216b3
|
4
|
+
data.tar.gz: 0c570f510d467df417755cb7b6fcff67744b2295ce499fbeb298b5f9efa427bd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3a6568bb17944cda2fe8acfdbfde2044690bcbc947fdea72fa25e3a994e664b2d95cd8cd36a2562b43236327cba0205a8c84190bbf404cb859d7717e09abb1e3
|
7
|
+
data.tar.gz: e8957e5c232b69467b07e684a134a07e1654e2038f62701d728eb8e6c544047548b54d4df28457ab8c3d5621b9cb2e19d0e2658e9711089d236fe826d300506c
|
@@ -16,6 +16,16 @@ module AdjustableSchema
|
|
16
16
|
joins(:relationships)
|
17
17
|
.merge Relationship.instance_eval(&)
|
18
18
|
end
|
19
|
+
|
20
|
+
class << self
|
21
|
+
def [] *names, **scopes
|
22
|
+
return super *names if names.any?
|
23
|
+
|
24
|
+
scopes
|
25
|
+
.map { of(_1).for _2 }
|
26
|
+
.reduce &:merge
|
27
|
+
end
|
28
|
+
end
|
19
29
|
end
|
20
30
|
end
|
21
31
|
end
|
@@ -17,6 +17,8 @@ module AdjustableSchema
|
|
17
17
|
def setup_association direction, target = self, role = nil
|
18
18
|
adjustable_association(direction, target ).define
|
19
19
|
adjustable_association(direction, target, role).define if role
|
20
|
+
|
21
|
+
include Relationships::InstanceMethods
|
20
22
|
end
|
21
23
|
|
22
24
|
def adjustable_association(...)
|
@@ -10,6 +10,80 @@ module AdjustableSchema
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def roles(&) = Role.of self, &
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def define_recursive_methods association_name, method
|
17
|
+
redefine_method tree_method = "#{method.to_s.singularize}_tree" do
|
18
|
+
send(association_name)
|
19
|
+
.inject([]) do |tree, node|
|
20
|
+
tree << node << node.send(tree_method)
|
21
|
+
end
|
22
|
+
.reject &:blank?
|
23
|
+
end
|
24
|
+
|
25
|
+
redefine_method "#{method}_with_distance" do
|
26
|
+
(with_distance = -> (level, distance) {
|
27
|
+
case level
|
28
|
+
when Array
|
29
|
+
level.inject({}) do |hash, node|
|
30
|
+
hash.merge with_distance[node, distance.next]
|
31
|
+
end
|
32
|
+
else
|
33
|
+
{ level => distance }
|
34
|
+
end
|
35
|
+
})[send(tree_method), 0]
|
36
|
+
end
|
37
|
+
|
38
|
+
redefine_method method do
|
39
|
+
send(tree_method).flatten
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
concern :InstanceMethods do # to include when needed
|
45
|
+
included do
|
46
|
+
Config.association_directions.recursive
|
47
|
+
.select { reflect_on_association _1 }
|
48
|
+
.reject { method_defined? _2 }
|
49
|
+
.each { define_recursive_methods _1, _2 }
|
50
|
+
end
|
51
|
+
|
52
|
+
def related?(...)
|
53
|
+
relationships(...)
|
54
|
+
.values
|
55
|
+
.reduce(&:or)
|
56
|
+
.any?
|
57
|
+
end
|
58
|
+
|
59
|
+
def related(...)
|
60
|
+
relationships(...)
|
61
|
+
.flat_map do |direction, relationships|
|
62
|
+
relationships
|
63
|
+
.preload(direction)
|
64
|
+
.map &direction
|
65
|
+
end
|
66
|
+
.uniq
|
67
|
+
end
|
68
|
+
|
69
|
+
def relationships *names, **options
|
70
|
+
if (direction, scope = Config.find_direction options)
|
71
|
+
{
|
72
|
+
direction => relationships_to(direction)
|
73
|
+
.try(Config.shortcuts[direction], scope) # filter by related objects
|
74
|
+
}
|
75
|
+
else # both directions
|
76
|
+
Config.association_directions.to_h { [ _1, relationships_to(_1) ] }
|
77
|
+
end
|
78
|
+
.compact
|
79
|
+
.tap do |relationships|
|
80
|
+
break relationships.transform_values { _1.named names } if names.any? # filter by role
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
private
|
85
|
+
|
86
|
+
def relationships_to(direction) = try "#{direction}_relationships"
|
13
87
|
end
|
14
88
|
end
|
15
89
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: adjustable_schema
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alexander Senko
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-01-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -94,7 +94,7 @@ licenses:
|
|
94
94
|
metadata:
|
95
95
|
homepage_uri: https://github.com/Alexander-Senko/adjustable_schema
|
96
96
|
source_code_uri: https://github.com/Alexander-Senko/adjustable_schema
|
97
|
-
changelog_uri: https://github.com/Alexander-Senko/adjustable_schema/CHANGELOG.md
|
97
|
+
changelog_uri: https://github.com/Alexander-Senko/adjustable_schema/blob/v0.5.1/CHANGELOG.md
|
98
98
|
post_install_message:
|
99
99
|
rdoc_options: []
|
100
100
|
require_paths:
|
@@ -110,7 +110,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
110
110
|
- !ruby/object:Gem::Version
|
111
111
|
version: '0'
|
112
112
|
requirements: []
|
113
|
-
rubygems_version: 3.5.
|
113
|
+
rubygems_version: 3.5.3
|
114
114
|
signing_key:
|
115
115
|
specification_version: 4
|
116
116
|
summary: Adjustable data schemas for Rails
|