adaptive_alias 1.1.2 → 1.2.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 +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
|