adaptive_alias 1.1.2 → 1.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -0
- data/README.md +3 -1
- data/gemfiles/6.0.gemfile +1 -0
- data/gemfiles/6.1.gemfile +1 -0
- data/gemfiles/7.0.gemfile +1 -0
- data/lib/adaptive_alias/active_model_patches/read_attribute.rb +1 -0
- data/lib/adaptive_alias/hooks/relation.rb +8 -0
- data/lib/adaptive_alias/patches/backward_patch.rb +1 -1
- data/lib/adaptive_alias/patches/base.rb +39 -42
- data/lib/adaptive_alias/patches/forward_patch.rb +1 -1
- data/lib/adaptive_alias/version.rb +1 -1
- data/lib/adaptive_alias.rb +5 -16
- metadata +2 -4
- data/lib/adaptive_alias/hooks/association_scope.rb +0 -13
- data/lib/adaptive_alias/hooks/singular_association.rb +0 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6ac3bfeadde0c8fed89cc4c1803939cfcb5ebbd8f33bb9ecff1401fa0f33393c
|
4
|
+
data.tar.gz: e716802e6b36217f0bb94f056183887812f7c488a310d6b7b38e206a2d29e471
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 14726e4300d86f5f5093c6682d8f8be1f864f7fd29cd4f0978567025fb442f04c4276d3f1e61e8ca90f89429dd6c998fec194e92586f362f56da1c1241d166d2
|
7
|
+
data.tar.gz: c0b89da78c766cbaf1208b17f2858d35c1b04b972cf13822fd88b6fa9b3b72ad8b28f628cf4fbcfab28290e0fa95df02c03d71510e5acbf6ba77f89c77557208
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,13 @@
|
|
1
1
|
## Change Log
|
2
2
|
|
3
|
+
### [v1.2.0](https://github.com/khiav223577/adaptive_alias/compare/v1.1.2...v1.2.0) 2022/10/12
|
4
|
+
- [#28](https://github.com/khiav223577/adaptive_alias/pull/28) [Fix] Deal with OR-query (@khiav223577)
|
5
|
+
- [#27](https://github.com/khiav223577/adaptive_alias/pull/27) [Enhance] make sure `mark_removable` will be called when manually remove patch (@khiav223577)
|
6
|
+
- [#26](https://github.com/khiav223577/adaptive_alias/pull/26) [Fix] Deal with old attribute sets come from cache (identity_cache) (@khiav223577)
|
7
|
+
|
8
|
+
### [v1.1.2](https://github.com/khiav223577/adaptive_alias/compare/v1.1.1...v1.1.2) 2022/10/11
|
9
|
+
- [#25](https://github.com/khiav223577/adaptive_alias/pull/25) [Fix] Deal with count, sum, and group (@khiav223577)
|
10
|
+
|
3
11
|
### [v1.1.1](https://github.com/khiav223577/adaptive_alias/compare/v1.1.0...v1.1.1) 2022/10/07
|
4
12
|
- [#24](https://github.com/khiav223577/adaptive_alias/pull/24) [Fix] Disappeared value when instantiating all and then create / update multiple models one by one (@khiav223577)
|
5
13
|
- [#23](https://github.com/khiav223577/adaptive_alias/pull/23) [Enhance] No need to determine missing value manually (@khiav223577)
|
data/README.md
CHANGED
@@ -25,10 +25,12 @@ We need a way to automatically adjust the patch to adapt current schema.
|
|
25
25
|
|
26
26
|
```
|
27
27
|
|
28
|
-
This is what this gem wants to achieve. We don't want to do complex migrations, take care of backward-
|
28
|
+
This is what this gem wants to achieve. We don't want to do complex migrations, take care of backward-compatibility, and have any downtime.
|
29
29
|
Just rely on this gem.
|
30
30
|
|
31
31
|
|
32
|
+
Note that it is not thread-safe when swapping patches, please make sure there is no multi-thread during migration.
|
33
|
+
|
32
34
|
## Supports
|
33
35
|
- Ruby 2.6 ~ 2.7, 3.0 ~ 3.1
|
34
36
|
- Rails 6.0, 6.1, 7.0
|
data/gemfiles/6.0.gemfile
CHANGED
data/gemfiles/6.1.gemfile
CHANGED
data/gemfiles/7.0.gemfile
CHANGED
@@ -5,6 +5,14 @@ module AdaptiveAlias
|
|
5
5
|
AdaptiveAlias.rescue_statement_invalid(relation: self){ super }
|
6
6
|
end
|
7
7
|
|
8
|
+
def update_all(*)
|
9
|
+
AdaptiveAlias.rescue_statement_invalid(relation: self){ super }
|
10
|
+
end
|
11
|
+
|
12
|
+
def exists?(*)
|
13
|
+
AdaptiveAlias.rescue_statement_invalid(relation: self){ super }
|
14
|
+
end
|
15
|
+
|
8
16
|
def select_all(*)
|
9
17
|
AdaptiveAlias.rescue_statement_invalid(relation: self){ super }
|
10
18
|
end
|
@@ -3,8 +3,8 @@
|
|
3
3
|
module AdaptiveAlias
|
4
4
|
module Patches
|
5
5
|
class Base
|
6
|
-
attr_reader :
|
7
|
-
attr_reader :
|
6
|
+
attr_reader :check_matched
|
7
|
+
attr_reader :remove_and_fix_association
|
8
8
|
attr_reader :removed
|
9
9
|
attr_reader :removable
|
10
10
|
|
@@ -23,24 +23,24 @@ module AdaptiveAlias
|
|
23
23
|
AdaptiveAlias.get_or_create_model_module(klass).instance_exec do
|
24
24
|
remove_method(new_column) if method_defined?(new_column)
|
25
25
|
define_method(new_column) do
|
26
|
-
|
26
|
+
self[new_column]
|
27
27
|
end
|
28
28
|
|
29
29
|
remove_method("#{new_column}=") if method_defined?("#{new_column}=")
|
30
30
|
define_method("#{new_column}=") do |*args|
|
31
|
-
|
31
|
+
super(*args)
|
32
32
|
end
|
33
33
|
|
34
34
|
remove_method(old_column) if method_defined?(old_column)
|
35
35
|
define_method(old_column) do
|
36
36
|
patch.log_warning if log_warning
|
37
|
-
|
37
|
+
self[old_column]
|
38
38
|
end
|
39
39
|
|
40
40
|
remove_method("#{old_column}=") if method_defined?("#{old_column}=")
|
41
41
|
define_method("#{old_column}=") do |*args|
|
42
42
|
patch.log_warning if log_warning
|
43
|
-
|
43
|
+
super(*args)
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
@@ -54,24 +54,6 @@ module AdaptiveAlias
|
|
54
54
|
"Mysql2::Error: Unknown column '#{current_column}' in 'field list'".freeze,
|
55
55
|
].freeze
|
56
56
|
|
57
|
-
expected_attribute_err_msgs = [
|
58
|
-
"can't write unknown attribute `#{current_column}`".freeze,
|
59
|
-
"missing attribute: #{current_column}".freeze,
|
60
|
-
].freeze
|
61
|
-
|
62
|
-
@fix_missing_attribute = proc do |error_klass, error|
|
63
|
-
next false if not patch.removable
|
64
|
-
next false if patch.removed
|
65
|
-
next false if klass.table_name != error_klass.table_name
|
66
|
-
|
67
|
-
# Error highlight behavior in Ruby 3.1 pollutes the error message
|
68
|
-
error_msg = error.respond_to?(:original_message) ? error.original_message : error.message
|
69
|
-
next false if not expected_attribute_err_msgs.include?(error_msg)
|
70
|
-
|
71
|
-
patch.remove!
|
72
|
-
next true
|
73
|
-
end
|
74
|
-
|
75
57
|
fix_arel_attributes = proc do |attr|
|
76
58
|
next if not attr.is_a?(Arel::Attributes::Attribute)
|
77
59
|
next if attr.name != current_column.to_s
|
@@ -87,9 +69,8 @@ module AdaptiveAlias
|
|
87
69
|
end
|
88
70
|
end
|
89
71
|
|
90
|
-
@
|
72
|
+
@check_matched = proc do |relation, reflection, model, error|
|
91
73
|
next false if not patch.removable
|
92
|
-
next false if patch.removed
|
93
74
|
|
94
75
|
# Error highlight behavior in Ruby 3.1 pollutes the error message
|
95
76
|
error_msg = error.respond_to?(:original_message) ? error.original_message : error.message
|
@@ -103,25 +84,28 @@ module AdaptiveAlias
|
|
103
84
|
end
|
104
85
|
|
105
86
|
next false if not expected_association_err_msgs.include?(error_msg) and not ambiguous
|
87
|
+
next true
|
88
|
+
end
|
106
89
|
|
107
|
-
|
90
|
+
@remove_and_fix_association = proc do |relation, reflection, &block|
|
91
|
+
patch.remove! do
|
92
|
+
if relation
|
93
|
+
relation.reset # reset @arel
|
108
94
|
|
109
|
-
|
110
|
-
relation.reset # reset @arel
|
95
|
+
joins = relation.arel.source.right # @ctx.source.right << create_join(relation, nil, klass)
|
111
96
|
|
112
|
-
|
97
|
+
# adjust select fields
|
98
|
+
index = relation.select_values.index(current_column)
|
99
|
+
relation.select_values[index] = alias_column if index
|
113
100
|
|
114
|
-
|
115
|
-
|
116
|
-
|
101
|
+
fix_arel_nodes.call(joins.map{|s| s.right.expr })
|
102
|
+
fix_arel_nodes.call(relation.where_clause.send(:predicates))
|
103
|
+
end
|
117
104
|
|
118
|
-
|
119
|
-
fix_arel_nodes.call(relation.where_clause.send(:predicates))
|
120
|
-
end
|
105
|
+
reflection.clear_association_scope_cache if reflection
|
121
106
|
|
122
|
-
|
123
|
-
|
124
|
-
next true
|
107
|
+
block.call
|
108
|
+
end
|
125
109
|
end
|
126
110
|
end
|
127
111
|
|
@@ -133,15 +117,24 @@ module AdaptiveAlias
|
|
133
117
|
end
|
134
118
|
|
135
119
|
def remove!
|
136
|
-
@removed
|
120
|
+
if not @removed
|
121
|
+
@removed = true
|
122
|
+
new_patch = do_remove!
|
123
|
+
end
|
124
|
+
|
125
|
+
yield if block_given?
|
126
|
+
ensure
|
127
|
+
new_patch.mark_removable if new_patch
|
128
|
+
end
|
137
129
|
|
130
|
+
def do_remove!
|
138
131
|
reset_caches(@klass)
|
139
132
|
ActiveRecord::Base.descendants.each do |model_klass|
|
140
133
|
reset_caches(model_klass) if model_klass.table_name == @klass.table_name
|
141
134
|
end
|
142
135
|
|
143
|
-
@
|
144
|
-
@
|
136
|
+
@check_matched = nil
|
137
|
+
@remove_and_fix_association = nil
|
145
138
|
end
|
146
139
|
|
147
140
|
def mark_removable
|
@@ -162,10 +155,14 @@ module AdaptiveAlias
|
|
162
155
|
def each_nodes(nodes, &block)
|
163
156
|
nodes.each do |node|
|
164
157
|
case node
|
158
|
+
when Arel::Nodes::Grouping
|
159
|
+
each_nodes([node.expr], &block)
|
165
160
|
when Arel::Nodes::Equality
|
166
161
|
yield(node)
|
167
162
|
when Arel::Nodes::And
|
168
163
|
each_nodes(node.children, &block)
|
164
|
+
when Arel::Nodes::Or
|
165
|
+
each_nodes([node.left, node.right], &block)
|
169
166
|
end
|
170
167
|
end
|
171
168
|
end
|
data/lib/adaptive_alias.rb
CHANGED
@@ -10,8 +10,6 @@ require 'adaptive_alias/patches/backward_patch'
|
|
10
10
|
require 'adaptive_alias/patches/forward_patch'
|
11
11
|
|
12
12
|
require 'adaptive_alias/hooks/association'
|
13
|
-
require 'adaptive_alias/hooks/association_scope'
|
14
|
-
require 'adaptive_alias/hooks/singular_association'
|
15
13
|
require 'adaptive_alias/hooks/relation'
|
16
14
|
require 'adaptive_alias/hooks/active_record_core'
|
17
15
|
require 'adaptive_alias/hooks/active_record_persistence'
|
@@ -47,21 +45,12 @@ module AdaptiveAlias
|
|
47
45
|
def rescue_statement_invalid(relation: nil, reflection: nil, model: nil, &block)
|
48
46
|
yield
|
49
47
|
rescue ActiveRecord::StatementInvalid => error
|
50
|
-
|
48
|
+
_key, patch = AdaptiveAlias.current_patches.find{|_key, patch| patch.check_matched.call(relation, reflection, model, error) }
|
49
|
+
raise error if patch == nil
|
51
50
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
end
|
56
|
-
|
57
|
-
def rescue_missing_attribute(klass, &block)
|
58
|
-
yield
|
59
|
-
rescue ActiveModel::MissingAttributeError => error
|
60
|
-
raise error if AdaptiveAlias.current_patches.all?{|_key, patch| !patch.fix_missing_attribute.call(klass, error) }
|
61
|
-
|
62
|
-
result = rescue_missing_attribute(klass, &block)
|
63
|
-
AdaptiveAlias.current_patches.each_value(&:mark_removable)
|
64
|
-
return result
|
51
|
+
patch.remove_and_fix_association.call(relation, reflection) do
|
52
|
+
return rescue_statement_invalid(relation: relation, reflection: reflection, model: model, &block)
|
53
|
+
end
|
65
54
|
end
|
66
55
|
|
67
56
|
def get_or_create_model_module(klass)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: adaptive_alias
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1
|
4
|
+
version: 1.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- khiav reoy
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-10-
|
11
|
+
date: 2022-10-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -131,10 +131,8 @@ files:
|
|
131
131
|
- lib/adaptive_alias/hooks/active_record_core.rb
|
132
132
|
- lib/adaptive_alias/hooks/active_record_persistence.rb
|
133
133
|
- lib/adaptive_alias/hooks/association.rb
|
134
|
-
- lib/adaptive_alias/hooks/association_scope.rb
|
135
134
|
- lib/adaptive_alias/hooks/calculations.rb
|
136
135
|
- lib/adaptive_alias/hooks/relation.rb
|
137
|
-
- lib/adaptive_alias/hooks/singular_association.rb
|
138
136
|
- lib/adaptive_alias/patches/backward_patch.rb
|
139
137
|
- lib/adaptive_alias/patches/base.rb
|
140
138
|
- lib/adaptive_alias/patches/forward_patch.rb
|
@@ -1,13 +0,0 @@
|
|
1
|
-
module AdaptiveAlias
|
2
|
-
module Hooks
|
3
|
-
module AssociationScope
|
4
|
-
def last_chain_scope(_scope, reflection, owner)
|
5
|
-
AdaptiveAlias.rescue_missing_attribute(owner.class){ super }
|
6
|
-
end
|
7
|
-
end
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
class ActiveRecord::Associations::AssociationScope
|
12
|
-
prepend AdaptiveAlias::Hooks::AssociationScope
|
13
|
-
end
|
@@ -1,13 +0,0 @@
|
|
1
|
-
module AdaptiveAlias
|
2
|
-
module Hooks
|
3
|
-
module SingularAssociation
|
4
|
-
def reader(*)
|
5
|
-
AdaptiveAlias.rescue_missing_attribute(owner.class){ super }
|
6
|
-
end
|
7
|
-
end
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
class ActiveRecord::Associations::SingularAssociation
|
12
|
-
prepend AdaptiveAlias::Hooks::SingularAssociation
|
13
|
-
end
|