adjustable_schema 0.5.0 → 0.5.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3485d9747332369fa6717cfcc2f8340dedc75cb47a991c4f6f52f6838dd0bab6
4
- data.tar.gz: 9805cfd3909951255df31007226bf699208d710c4fc74861df94cc80730a6130
3
+ metadata.gz: 0c1789abd8073508a7768242d964718458c267d98d58ec4ac96872048d9e28b3
4
+ data.tar.gz: b565d636b51ec479a9b10784f21dd96b15ae1fc744dce0763ef9b42b8fbd548e
5
5
  SHA512:
6
- metadata.gz: af22e30050202341aba9503e91382526e25db5955f0d4dc6582078a09f415a3461db50f39c06f7307f7ed35bb8bbfdc987533a1d51ba30fccb038b91bf9db034
7
- data.tar.gz: 2080e9f4268d52ee0ec94cffe07ba747eac277d14917727ec0c6156e0dd6b498958365a16d308b257f6f55885c3cffbcdaa617bca424fea0c557ab5a2f5de4d1
6
+ metadata.gz: e892e5c9b20b1cc7745a4fd69cd534764204ae80c7c19f13d9d13863c4be4abb59f541fe2347a9d65465b7946783f73470a734144e3a87e4e0f3c956ecd66aea
7
+ data.tar.gz: f794633f6c6799df9b4703525b3fdfc3a7a88e416ed2582671ebadb0d53028fcfce31c0570e5d42c9fc5421304382c7187ea1273a560b8fafe75ddea8dc2aea3
@@ -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
@@ -1,3 +1,5 @@
1
+ require 'organizer'
2
+
1
3
  module AdjustableSchema
2
4
  class Engine < ::Rails::Engine
3
5
  isolate_namespace AdjustableSchema
@@ -1,3 +1,3 @@
1
1
  module AdjustableSchema
2
- VERSION = '0.5.0'
2
+ VERSION = '0.5.2'
3
3
  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.0
4
+ version: 0.5.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexander Senko
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-12-29 00:00:00.000000000 Z
11
+ date: 2024-02-04 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.2/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.0.dev
113
+ rubygems_version: 3.5.5
114
114
  signing_key:
115
115
  specification_version: 4
116
116
  summary: Adjustable data schemas for Rails