adaptive_alias 0.1.0 → 0.2.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 81757ab8f4098990940d499ee2286c8c831fdac6462dfcafcd59b868ff596ec2
4
- data.tar.gz: b88816e4745352dc63fb29a4d102a52935538bd0f5ef5591f8ce56e9057dc9d5
3
+ metadata.gz: 26cc1e7589ccce6ae23b91968e01b0c419efbd482ce217c5c2efceaef33cb35d
4
+ data.tar.gz: ef91b943cb0aeb07a1f9ac8370195d5f75fe48ce3c3908cc7f546ead6719fe7a
5
5
  SHA512:
6
- metadata.gz: 60cb4e6e2f31787f93f6edf5415bd3fbe283999c50d0fba89d9e48e055a5c06ca7479ee8a158ec4618453352bc8034a18e9acbafae5905f4e4f2a7a0ee8ba54f
7
- data.tar.gz: e80d6cdd3e41254d07e70e4440bc120b6940bfddb31f54709e97becafc18dd4eef2341832fc049d750e247e002a8097f4d9128697de0f657c8fdd1b47310d103
6
+ metadata.gz: 9969274e1e866cc6ff99349a0da832044c3171fc654e9603afd4151846f9ac82cd31c76513ff865e4669d0dc96eb7abedd62225331eb46a769bbcb4bed681fec
7
+ data.tar.gz: 9fad3f81d3bd1e4d768d43c94e476719a0e0a6b0af0fd7bf82fe89fae0195dcb877f8b73fb91c9d09fd0650ebfd82c12277a61616799fb710d94f9b80b008b97
data/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
1
  ## Change Log
2
2
 
3
+ ### [v0.1.0](https://github.com/khiav223577/adaptive_alias/compare/v0.0.3...v0.1.0) 2022/08/01
4
+ - [#6](https://github.com/khiav223577/adaptive_alias/pull/6) Deal with creating records (@khiav223577)
5
+ - [#5](https://github.com/khiav223577/adaptive_alias/pull/5) Prevent infinite loop if something went wrong (@khiav223577)
6
+ - [#4](https://github.com/khiav223577/adaptive_alias/pull/4) Fix: attributes writer method should be defined after schema changes (@khiav223577)
7
+
3
8
  ### [v0.0.3](https://github.com/khiav223577/adaptive_alias/compare/v0.0.2...v0.0.3) 2022/07/27
4
9
  - [#3](https://github.com/khiav223577/adaptive_alias/pull/3) Fix: prevent calling custom column names from raising missing attributes (@khiav223577)
5
10
 
@@ -0,0 +1,17 @@
1
+ require 'active_record'
2
+
3
+ module AdaptiveAlias
4
+ module ActiveModelPatches
5
+ module ApplyScope
6
+ def apply_scope(scope, table, key, value)
7
+ klass = table.instance_variable_get(:@klass) || table.send(:type_caster).send(:types)
8
+ key = klass.attribute_aliases[key] || key
9
+ super(scope, table, key, value)
10
+ end
11
+ end
12
+ end
13
+ end
14
+
15
+ class ActiveRecord::Associations::AssociationScope
16
+ prepend AdaptiveAlias::ActiveModelPatches::ApplyScope
17
+ end
@@ -1,22 +1,30 @@
1
1
  require 'active_record'
2
2
 
3
- module ActiveRecord::AttributeMethods::Read
4
- def read_attribute(attr_name, &block) # :nodoc:
5
- name = attr_name.to_s
6
- name = self.class.attribute_aliases[name] || name
3
+ module AdaptiveAlias
4
+ module ActiveModelPatches
5
+ module ReadAttribute
6
+ def read_attribute(attr_name, &block) # :nodoc:
7
+ name = attr_name.to_s
8
+ name = self.class.attribute_aliases[name] || name
7
9
 
8
- name = @primary_key if name == 'id' && @primary_key
9
- _read_attribute(name, &block)
10
- end
10
+ name = @primary_key if name == 'id' && @primary_key
11
+ _read_attribute(name, &block)
12
+ end
11
13
 
12
- # This method exists to avoid the expensive primary_key check internally, without
13
- # breaking compatibility with the write_attribute API
14
- def _read_attribute(attr_name, &block) # :nodoc:
15
- name = attr_name.to_s
16
- name = self.class.attribute_aliases[name] || name
14
+ # This method exists to avoid the expensive primary_key check internally, without
15
+ # breaking compatibility with the write_attribute API
16
+ def _read_attribute(attr_name, &block) # :nodoc:
17
+ name = attr_name.to_s
18
+ name = self.class.attribute_aliases[name] || name
17
19
 
18
- sync_with_transaction_state if @transaction_state&.finalized?
19
- return yield(name) if block_given? and AdaptiveAlias.missing_value?(@attributes, self.class, name)
20
- return @attributes.fetch_value(name, &block)
20
+ sync_with_transaction_state if @transaction_state&.finalized?
21
+ return yield(name) if block_given? and AdaptiveAlias.missing_value?(@attributes, self.class, name)
22
+ return @attributes.fetch_value(name, &block)
23
+ end
24
+ end
21
25
  end
22
26
  end
27
+
28
+ module ActiveRecord::AttributeMethods::Read
29
+ prepend AdaptiveAlias::ActiveModelPatches::ReadAttribute
30
+ end
@@ -1,18 +1,24 @@
1
1
  require 'active_model'
2
2
 
3
- module ActiveModel::AttributeMethods
4
- module ClassMethods
5
- def remove_proxy_call(mod, name)
6
- mod.module_eval "remove_method(:'#{name}')", __FILE__, __LINE__ + 1
7
- end
3
+ module AdaptiveAlias
4
+ module ActiveModelPatches
5
+ module RemoveAliasAttribute
6
+ def remove_proxy_call(mod, name)
7
+ mod.module_eval "remove_method(:'#{name}')", __FILE__, __LINE__ + 1
8
+ end
8
9
 
9
- def remove_alias_attribute(new_name)
10
- self.attribute_aliases = attribute_aliases.except(new_name.to_s)
10
+ def remove_alias_attribute(new_name)
11
+ self.attribute_aliases = attribute_aliases.except(new_name.to_s)
11
12
 
12
- attribute_method_matchers.each do |matcher|
13
- matcher_new = matcher.method_name(new_name).to_s
14
- remove_proxy_call self, matcher_new
13
+ attribute_method_matchers.each do |matcher|
14
+ matcher_new = matcher.method_name(new_name).to_s
15
+ remove_proxy_call self, matcher_new
16
+ end
15
17
  end
16
18
  end
17
19
  end
18
20
  end
21
+
22
+ module ActiveModel::AttributeMethods::ClassMethods
23
+ include AdaptiveAlias::ActiveModelPatches::RemoveAliasAttribute
24
+ end
@@ -1,22 +1,25 @@
1
1
  require 'active_record'
2
2
 
3
- module ActiveRecord::AttributeMethods::Write
4
- def write_attribute(attr_name, value)
5
- name = attr_name.to_s
6
- name = self.class.attribute_aliases[name] || name
3
+ module AdaptiveAlias
4
+ module ActiveModelPatches
5
+ module WriteAttribute
6
+ def write_attribute(attr_name, value)
7
+ name = attr_name.to_s
8
+ name = self.class.attribute_aliases[name] || name
9
+ super(name, value)
10
+ end
7
11
 
8
- name = @primary_key if name == 'id' && @primary_key
9
- _write_attribute(name, value)
12
+ # This method exists to avoid the expensive primary_key check internally, without
13
+ # breaking compatibility with the write_attribute API
14
+ def _write_attribute(attr_name, value) # :nodoc:
15
+ name = attr_name.to_s
16
+ name = self.class.attribute_aliases[name] || name
17
+ super(name, value)
18
+ end
19
+ end
10
20
  end
21
+ end
11
22
 
12
- # This method exists to avoid the expensive primary_key check internally, without
13
- # breaking compatibility with the write_attribute API
14
- def _write_attribute(attr_name, value) # :nodoc:
15
- name = attr_name.to_s
16
- name = self.class.attribute_aliases[name] || name
17
-
18
- sync_with_transaction_state if @transaction_state&.finalized?
19
- @attributes.write_from_user(name, value)
20
- value
21
- end
23
+ module ActiveRecord::AttributeMethods::Write
24
+ prepend AdaptiveAlias::ActiveModelPatches::WriteAttribute
22
25
  end
@@ -2,11 +2,11 @@ module AdaptiveAlias
2
2
  module Hooks
3
3
  module Association
4
4
  def find_target(*)
5
- AdaptiveAlias.rescue_statement_invalid(nil){ super }
5
+ AdaptiveAlias.rescue_statement_invalid(nil, reflection){ super }
6
6
  end
7
7
 
8
8
  def create!(attributes = {}, &block)
9
- AdaptiveAlias.rescue_statement_invalid(association_scope){ super }
9
+ AdaptiveAlias.rescue_statement_invalid(association_scope, reflection){ super }
10
10
  end
11
11
  end
12
12
  end
@@ -2,15 +2,15 @@ module AdaptiveAlias
2
2
  module Hooks
3
3
  module Relation
4
4
  def pluck(*)
5
- AdaptiveAlias.rescue_statement_invalid(self){ super }
5
+ AdaptiveAlias.rescue_statement_invalid(self, nil){ super }
6
6
  end
7
7
 
8
8
  def select_all(*)
9
- AdaptiveAlias.rescue_statement_invalid(self){ super }
9
+ AdaptiveAlias.rescue_statement_invalid(self, nil){ super }
10
10
  end
11
11
 
12
12
  def exec_queries(*)
13
- AdaptiveAlias.rescue_statement_invalid(self){ super }
13
+ AdaptiveAlias.rescue_statement_invalid(self, nil){ super }
14
14
  end
15
15
  end
16
16
  end
@@ -15,7 +15,9 @@ module AdaptiveAlias
15
15
  super
16
16
  @klass.remove_alias_attribute(@old_column)
17
17
  @klass.define_attribute_method(@old_column)
18
- ForwardPatch.new(@klass, @old_column, @new_column).apply!
18
+ new_patch = ForwardPatch.new(@klass, @old_column, @new_column)
19
+ new_patch.apply!
20
+ return new_patch
19
21
  end
20
22
  end
21
23
  end
@@ -64,21 +64,25 @@ module AdaptiveAlias
64
64
  next true
65
65
  end
66
66
 
67
- @fix_association = proc do |target, error|
67
+ @fix_association = proc do |relation, reflection, error|
68
68
  next false if not patch.removable
69
69
  next false if patch.removed
70
70
  next false if not expected_association_err_msgs.include?(error.message)
71
71
 
72
72
  patch.remove!
73
73
 
74
- if target
75
- hash = target.where_values_hash
76
- hash[alias_column] = hash.delete(current_column) if hash.key?(current_column)
77
- hash[alias_column.to_s] = hash.delete(current_column.to_s) if hash.key?(current_column.to_s)
78
- target.instance_variable_set(:@arel, nil)
79
- target.unscope!(:where).where!(hash)
74
+ if relation
75
+ relation.where_clause.send(:predicates).each do |node|
76
+ next if node.left.name != current_column.to_s
77
+ next if klass.table_name != node.left.relation.name
78
+
79
+ node.left = node.left.clone
80
+ node.left.name = alias_column.to_s
81
+ end
80
82
  end
81
83
 
84
+ reflection.clear_association_scope_cache if reflection
85
+
82
86
  next true
83
87
  end
84
88
  end
@@ -15,7 +15,9 @@ module AdaptiveAlias
15
15
  super
16
16
  @klass.remove_alias_attribute(@new_column)
17
17
  @klass.define_attribute_method(@new_column)
18
- BackwardPatch.new(@klass, @old_column, @new_column).apply!
18
+ new_patch = BackwardPatch.new(@klass, @old_column, @new_column)
19
+ new_patch.apply!
20
+ return new_patch
19
21
  end
20
22
  end
21
23
  end
@@ -1,3 +1,3 @@
1
1
  module AdaptiveAlias
2
- VERSION = '0.1.0'
2
+ VERSION = '0.2.0'
3
3
  end
@@ -4,6 +4,7 @@ require 'adaptive_alias/version'
4
4
  require 'adaptive_alias/active_model_patches/read_attribute'
5
5
  require 'adaptive_alias/active_model_patches/write_attribute'
6
6
  require 'adaptive_alias/active_model_patches/remove_alias_attribute'
7
+ require 'adaptive_alias/active_model_patches/apply_scope'
7
8
  require 'adaptive_alias/patches/backward_patch'
8
9
  require 'adaptive_alias/patches/forward_patch'
9
10
 
@@ -39,12 +40,12 @@ module AdaptiveAlias
39
40
  end
40
41
  end
41
42
 
42
- def rescue_statement_invalid(relation, &block)
43
+ def rescue_statement_invalid(relation, reflection, &block)
43
44
  yield
44
45
  rescue ActiveRecord::StatementInvalid => error
45
- raise error if AdaptiveAlias.current_patches.all?{|_key, patch| !patch.fix_association.call(relation, error) }
46
+ raise error if AdaptiveAlias.current_patches.all?{|_key, patch| !patch.fix_association.call(relation, reflection, error) }
46
47
 
47
- result = rescue_statement_invalid(relation, &block)
48
+ result = rescue_statement_invalid(relation, reflection, &block)
48
49
  AdaptiveAlias.current_patches.each_value(&:mark_removable)
49
50
  return result
50
51
  end
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: 0.1.0
4
+ version: 0.2.0
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-08-01 00:00:00.000000000 Z
11
+ date: 2022-08-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -123,6 +123,7 @@ files:
123
123
  - gemfiles/6.1.gemfile
124
124
  - gemfiles/7.0.gemfile
125
125
  - lib/adaptive_alias.rb
126
+ - lib/adaptive_alias/active_model_patches/apply_scope.rb
126
127
  - lib/adaptive_alias/active_model_patches/read_attribute.rb
127
128
  - lib/adaptive_alias/active_model_patches/remove_alias_attribute.rb
128
129
  - lib/adaptive_alias/active_model_patches/write_attribute.rb