from_clause_translate 0.1.0 → 0.1.1

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
  SHA1:
3
- metadata.gz: 0ef0f453b7b049fbbd56b0126065dcba8a5ab0b5
4
- data.tar.gz: a9f8cf9715a75b690cd8fb4caae8d2bed506fac1
3
+ metadata.gz: d0ae09207f8f74865af8d0cef1824a3c2da59ec0
4
+ data.tar.gz: 69b959f76d9cd39ef6b53948e10ae823bb3e21ff
5
5
  SHA512:
6
- metadata.gz: 1e134c794ac0aebc741de3990ca797fe6378dbddfd2ef5ffc2d25ee53537be5be4a47a6d8946cded1459d6f6d6079d9d8ad9d09e69dafec4a3fcfa8798823651
7
- data.tar.gz: b54da2a3cbcf67ecab08506c501092cc6b947308500ae07b88f5a77984f0804962738ef8286d8fbcb4da3af698c63c0f5d7b26ba32d92eab3180d756e47128cf
6
+ metadata.gz: eb49f4190302bb4680bf8fcc7c210a0c9a48bdb13d4c9077609fc84739e5787c04fd8afd3e70213c29557f2e610467c53de62bff8ed20f27a21a7f09a2c5903f
7
+ data.tar.gz: d392a9299bad1574e6a343e5f992360ea15bc0e6ad677f3e88a6a5dadc64c3c1ff7fd2174f0ffec3ce001eaa9922a0046e48ba786a6dfd42695cecea04bba9e4
@@ -0,0 +1,65 @@
1
+ module ActiveRecord::Relation::Extended
2
+ def to_sql
3
+ apply_translates unless eager_loading?
4
+ super
5
+ end
6
+
7
+ def exec_queries &block
8
+ apply_translates
9
+ super(&block)
10
+ end
11
+
12
+ def pluck *columns
13
+ if !@translated_extra_columns && @klass.const_defined?(:TRANSLATED)
14
+ @translated_extra_columns = columns
15
+ end
16
+ super(*columns)
17
+ end
18
+
19
+ def arel aliases = nil
20
+ arel = super aliases
21
+ if @translated_extra_columns
22
+ add_translated_columns @translated_extra_columns
23
+ @translated_extra_columns = nil
24
+ apply_translates arel
25
+ end
26
+ arel
27
+ end
28
+
29
+ def add_translated_columns columns
30
+ (@values[:translated] ||= []).concat columns
31
+ end
32
+
33
+ def apply_translates arel = nil
34
+ arel ||= self.arel
35
+ return if @translates_applied || !@klass.const_defined?(:TRANSLATED)
36
+
37
+ @translates_applied = true
38
+ columns = translated_columns_get
39
+ return unless columns
40
+
41
+ from = @klass.select(columns).arel.to_sql
42
+ as = @klass.table_name
43
+ arel.from("(#{from}) #{as}")
44
+ end
45
+
46
+ def translated_columns_get without_projections = false
47
+ FromClauseTranslate::TranslatedColumnsBuilder.new(
48
+ self, without_projections
49
+ ).perform
50
+ end
51
+
52
+ private
53
+
54
+ def perform_calculation operation, column_name
55
+ if column_name && !@translated_extra_columns &&
56
+ @klass.const_defined?(:TRANSLATED)
57
+ @translated_extra_columns = [column_name]
58
+ end
59
+ super operation, column_name
60
+ end
61
+ end
62
+
63
+ class ActiveRecord::Relation
64
+ prepend ActiveRecord::Relation::Extended
65
+ end
@@ -0,0 +1,105 @@
1
+ class FromClauseTranslate::TranslatedColumnsBuilder
2
+ def initialize relation, without_projections
3
+ @relation = relation
4
+ @klass = relation.instance_variable_get :@klass
5
+ @arel = relation.arel
6
+ @without_projections = without_projections
7
+ @columns = []
8
+ @has_translated = false
9
+ end
10
+
11
+ def perform
12
+ add_translated_columns_from_values
13
+ add_translated_columns_from_projections
14
+ add_translated_columns_from_cores
15
+ add_translated_colunms_from_orders
16
+
17
+ @columns if @has_translated
18
+ end
19
+
20
+ private
21
+
22
+ def add_translated_columns_from_values
23
+ translated = @relation.instance_variable_get(:@values)[:translated]
24
+ return unless translated
25
+
26
+ translated.each do |column|
27
+ if column.is_a? Hash
28
+ @has_translated = true
29
+ column.each do |key, value|
30
+ @columns << "#{value} AS #{key}"
31
+ end
32
+ elsif (selection = translated_selection(column))
33
+ @columns << selection
34
+ else
35
+ @columns << column
36
+ end
37
+ end
38
+ end
39
+
40
+ def add_translated_columns_from_projections
41
+ return if @without_projections
42
+
43
+ @arel.projections.each do |column|
44
+ selection = arel_projection_translation(column)
45
+ @columns << selection if selection
46
+ end
47
+ end
48
+
49
+ def arel_projection_translation column
50
+ return column.name if column.is_a? Arel::Attributes::Attribute
51
+
52
+ return unless column.is_a? String
53
+
54
+ name = column.first == '"' ? column[1...-1] : column
55
+ selection = translated_selection name
56
+ return column unless selection
57
+
58
+ plural = @klass::TRANSLATED_PLURALS[name.to_sym]
59
+ column.replace plural if plural
60
+ selection
61
+ end
62
+
63
+ def add_translated_columns_from_cores
64
+ @arel.ast.cores.each do |core|
65
+ add_translated_columns_from_groups core
66
+ add_translated_columns_from_nodes core.wheres
67
+ add_translated_columns_from_nodes core.havings
68
+ end
69
+ end
70
+
71
+ def add_translated_columns_from_groups core
72
+ core.groups.each do |group|
73
+ expr = group.expr
74
+ name = expr[0] == '"' ? expr[1...-1] : expr
75
+ selection = translated_selection name
76
+ @columns << selection if selection
77
+ end
78
+ end
79
+
80
+ def add_translated_columns_from_nodes nodes
81
+ nodes.each do |node|
82
+ node.children.each do |child|
83
+ next unless child.respond_to? :left
84
+
85
+ name = child.left.name
86
+ selection = translated_selection name
87
+ @columns << selection if selection
88
+ end
89
+ end
90
+ end
91
+
92
+ def add_translated_colunms_from_orders
93
+ @arel.ast.orders.each do |name|
94
+ name = name.respond_to?(:expr) ? name.expr.name : name.to_sym
95
+ selection = translated_selection name
96
+ @columns << selection if selection
97
+ end
98
+ end
99
+
100
+ def translated_selection name
101
+ translates = @klass.translates? name
102
+ @has_translated = true if translates
103
+ translates ? @klass::TRANSLATED_SELECTION[I18n.locale][name.to_sym] : false
104
+ end
105
+ end
@@ -1,3 +1,3 @@
1
1
  module FromClauseTranslate
2
- VERSION = '0.1.0'
2
+ VERSION = '0.1.1'
3
3
  end
@@ -1,148 +1,4 @@
1
- module ActiveRecord::Relation::Extended
2
- def to_sql
3
- apply_translates unless eager_loading?
4
- super
5
- end
6
-
7
- def exec_queries &block
8
- apply_translates
9
- super(&block)
10
- end
11
-
12
- def pluck *columns
13
- if !@translated_extra_columns && @klass.const_defined?(:TRANSLATED)
14
- @translated_extra_columns = columns
15
- end
16
- super(*columns)
17
- end
18
-
19
- def arel aliases = nil
20
- arel = super aliases
21
- if @translated_extra_columns
22
- add_translated_columns @translated_extra_columns
23
- @translated_extra_columns = nil
24
- apply_translates arel
25
- end
26
- arel
27
- end
28
-
29
- def add_translated_columns columns
30
- (@values[:translated] ||= []).concat columns
31
- end
32
-
33
- def apply_translates arel = nil
34
- arel ||= self.arel
35
- return if @translates_applied || !@klass.const_defined?(:TRANSLATED)
36
- @translates_applied = true
37
- columns = translated_columns_get
38
- return unless columns
39
- from = @klass.select(columns).arel.to_sql
40
- as = @klass.table_name
41
- arel.from("(#{from}) #{as}")
42
- end
43
-
44
- def translated_columns_get without_projections = false
45
- columns = []
46
- has_translated = false
47
-
48
- translated = @values[:translated]
49
- if translated
50
- translated.each do |column|
51
- if column.is_a? Hash
52
- has_translated = true
53
- column.each do |key, value|
54
- columns << "#{value} AS #{key}"
55
- end
56
- elsif @klass.translates? column
57
- columns << @klass::TRANSLATED_SELECTION[I18n.locale][column.to_sym]
58
- has_translated = true
59
- else
60
- columns << column
61
- end
62
- end
63
- end
64
-
65
- unless without_projections
66
- arel.projections.each do |column|
67
- if column.is_a? Arel::Attributes::Attribute
68
- columns << column.name
69
- elsif column.is_a? String
70
- name = column.first == '"' ? column[1...-1] : column
71
- if @klass.translates? name
72
- has_translated = true
73
- sym = name.to_sym
74
- columns << @klass::TRANSLATED_SELECTION[I18n.locale][sym]
75
- plural = @klass::TRANSLATED_PLURALS[sym]
76
- if plural
77
- column.replace plural
78
- end
79
- else
80
- columns << column
81
- end
82
- end
83
- end
84
- end
85
-
86
- arel.ast.cores.each do |core|
87
- core.wheres.each do |where|
88
- where.children.each do |child|
89
- if child.respond_to? :left
90
- name = child.left.name
91
- if @klass.translates? name
92
- has_translated = true
93
- columns << @klass::TRANSLATED_SELECTION[I18n.locale][name.to_sym]
94
- end
95
- end
96
- end
97
- end
98
-
99
- core.groups.each do |group|
100
- expr = group.expr
101
- name = expr[0] == '"' ? expr[1...-1] : expr
102
- if @klass.translates? name
103
- has_translated = true
104
- columns << @klass::TRANSLATED_SELECTION[I18n.locale][name.to_sym]
105
- end
106
- end
107
-
108
- core.havings.each do |having|
109
- having.children.each do |child|
110
- if child.respond_to? :left
111
- name = child.left.name
112
- if @klass.translates? name
113
- has_translated = true
114
- columns << @klass::TRANSLATED_SELECTION[I18n.locale][name.to_sym]
115
- end
116
- end
117
- end
118
- end
119
- end
120
-
121
- arel.ast.orders.each do |name|
122
- name = name.respond_to?(:expr) ? name.expr.name : name.to_sym
123
- if @klass.translates? name
124
- has_translated = true
125
- columns << @klass::TRANSLATED_SELECTION[I18n.locale][name.to_sym]
126
- end
127
- end
128
-
129
- columns if has_translated
130
- end
131
-
132
- private
133
-
134
- def perform_calculation operation, column_name
135
- if column_name && !@translated_extra_columns &&
136
- @klass.const_defined?(:TRANSLATED)
137
- @translated_extra_columns = [column_name]
138
- end
139
- super operation, column_name
140
- end
141
- end
142
-
143
- class ActiveRecord::Relation
144
- prepend ActiveRecord::Relation::Extended
145
- end
1
+ require 'from_clause_translate/active_record_relation'
146
2
 
147
3
  module FromClauseTranslate
148
4
  def self.included model
@@ -166,19 +22,22 @@ module FromClauseTranslate
166
22
  end
167
23
  define_translated_column_methods column
168
24
  end
169
- plurals = options[:plurals]
170
- if plurals
171
- plurals.each do |plural|
172
- plural = plural.to_sym
173
- self::TRANSLATED[plural] = true
174
- column = plural.to_s.singularize.to_sym
175
- selection = I18n.available_locales.map do |locale|
176
- "#{column}_#{locale}"
177
- end.join ','
178
- self::TRANSLATED_PLURALS[plural] = selection
179
- I18n.available_locales.each do |locale|
180
- self::TRANSLATED_SELECTION[locale][plural] = selection
181
- end
25
+ translates_plurals options[:plurals]
26
+ end
27
+
28
+ def translates_plurals plurals
29
+ return unless plurals
30
+
31
+ plurals.each do |plural|
32
+ plural = plural.to_sym
33
+ self::TRANSLATED[plural] = true
34
+ column = plural.to_s.singularize.to_sym
35
+ selection = I18n.available_locales.map do |locale|
36
+ "#{column}_#{locale}"
37
+ end.join ','
38
+ self::TRANSLATED_PLURALS[plural] = selection
39
+ I18n.available_locales.each do |locale|
40
+ self::TRANSLATED_SELECTION[locale][plural] = selection
182
41
  end
183
42
  end
184
43
  end
@@ -202,48 +61,38 @@ module FromClauseTranslate
202
61
  end
203
62
  end
204
63
 
205
- def define_translated_column_methods column
206
- column = column.to_s
207
- with_dash = "#{column}_"
208
-
209
- define_method column do
210
- if @attributes.key?(column)
211
- self[column]
212
- else
213
- send(with_dash + I18n.locale.to_s)
214
- end
215
- end
216
-
217
- define_method column + '=' do |value|
218
- send "#{with_dash}#{I18n.locale}=", value
219
- end
220
-
221
- define_method column + '_changed?' do
222
- send "#{with_dash}#{I18n.locale}_changed?"
223
- end
224
-
225
- define_method 'saved_change_to_' + column do
226
- send "saved_change_to_#{with_dash}#{I18n.locale}"
227
- end
64
+ def define_translated_column_methods col
65
+ col = col.to_s
66
+ dashed = "#{col}_"
67
+ define_translated_column_getter_and_setter col, dashed
68
+ define_translated_column_changing_methods col, dashed
69
+ end
228
70
 
229
- define_method 'saved_change_to_' + column + '?' do
230
- send "saved_change_to_#{with_dash}#{I18n.locale}?"
71
+ def define_translated_column_getter_and_setter col, dashed
72
+ define_method col do
73
+ @attributes.key?(col) ? self[col] : send("#{dashed}#{I18n.locale}")
231
74
  end
232
75
 
233
- define_method column + '_before_last_save' do
234
- send "#{with_dash}#{I18n.locale}_before_last_save"
76
+ define_method col + '=' do |val|
77
+ send "#{dashed}#{I18n.locale}=", val
235
78
  end
79
+ end
236
80
 
237
- define_method 'will_save_change_to_' + column + '?' do
238
- send "will_save_change_to_#{with_dash}#{I18n.locale}?"
81
+ def define_translated_column_changing_methods col, dashed
82
+ define_method 'saved_change_to_' + col do
83
+ send "saved_change_to_#{dashed}#{I18n.locale}"
239
84
  end
240
85
 
241
- define_method with_dash + 'change_to_be_saved' do
242
- send "#{with_dash}#{I18n.locale}_change_to_be_saved"
86
+ %w[changed? before_last_save change_to_be_saved in_database].each do |suf|
87
+ define_method dashed + suf do
88
+ send "#{dashed}#{I18n.locale}_#{suf}"
89
+ end
243
90
  end
244
91
 
245
- define_method with_dash + 'in_database' do
246
- send "#{with_dash}#{I18n.locale}_in_database"
92
+ %w[saved_change_to will_save_change_to].each do |prefix|
93
+ define_method "#{prefix}_#{col}?" do
94
+ send "#{prefix}_#{dashed}#{I18n.locale}?"
95
+ end
247
96
  end
248
97
  end
249
98
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: from_clause_translate
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Roman Kushin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-11-22 00:00:00.000000000 Z
11
+ date: 2018-11-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -34,6 +34,8 @@ files:
34
34
  - MIT-LICENSE
35
35
  - README.md
36
36
  - lib/from_clause_translate.rb
37
+ - lib/from_clause_translate/active_record_relation.rb
38
+ - lib/from_clause_translate/translated_columns_builder.rb
37
39
  - lib/from_clause_translate/version.rb
38
40
  homepage:
39
41
  licenses: