pluck_all 2.2.1 → 2.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/bin/console CHANGED
File without changes
data/bin/setup CHANGED
@@ -1,8 +1,8 @@
1
- #!/usr/bin/env bash
2
- set -euo pipefail
3
- IFS=$'\n\t'
4
- set -vx
5
-
6
- bundle install --gemfile=gemfiles/active_record_42.gemfile
7
-
8
- # Do any other automated setup that you need to do here
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install --gemfile=gemfiles/active_record_42.gemfile
7
+
8
+ # Do any other automated setup that you need to do here
@@ -1,13 +1,14 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in pluck_all.gemspec
4
-
5
- gem 'sqlite3', '~> 1.3.0'
6
- gem 'activerecord', '~> 3.2.0'
7
- gem 'carrierwave', '~> 0.11.0'
8
-
9
- group :test do
10
- gem 'simplecov'
11
- end
12
-
13
- gemspec path: '../'
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in pluck_all.gemspec
4
+
5
+ gem 'sqlite3', '~> 1.3.0'
6
+ gem 'activerecord', '~> 3.2.0'
7
+ gem 'carrierwave', '~> 0.11.0'
8
+ gem 'mimemagic', '< 0.4.3' # Used by carrierwave gem
9
+
10
+ group :test do
11
+ gem 'simplecov', '< 0.18'
12
+ end
13
+
14
+ gemspec path: '../'
@@ -1,13 +1,16 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in pluck_all.gemspec
4
-
5
- gem 'sqlite3', '~> 1.3.0'
6
- gem 'activerecord', '~> 4.2.0'
7
- gem 'carrierwave', '~> 0.11.0'
8
-
9
- group :test do
10
- gem 'simplecov'
11
- end
12
-
13
- gemspec path: '../'
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in pluck_all.gemspec
4
+
5
+ gem 'sqlite3', '~> 1.3.0'
6
+ gem 'activerecord', '~> 4.2.0'
7
+ gem 'carrierwave', '~> 0.11.0'
8
+ gem 'mimemagic', '< 0.4.3' # Used by carrierwave gem
9
+
10
+ gem 'globalize'
11
+
12
+ group :test do
13
+ gem 'simplecov', '< 0.18'
14
+ end
15
+
16
+ gemspec path: '../'
@@ -1,13 +1,16 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in pluck_all.gemspec
4
-
5
- gem 'sqlite3', '~> 1.3.0'
6
- gem 'activerecord', '~> 5.0.0'
7
- gem 'carrierwave', '~> 0.11.0'
8
-
9
- group :test do
10
- gem 'simplecov'
11
- end
12
-
13
- gemspec path: '../'
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in pluck_all.gemspec
4
+
5
+ gem 'sqlite3', '~> 1.3.0'
6
+ gem 'activerecord', '~> 5.0.0'
7
+ gem 'carrierwave', '~> 0.11.0'
8
+ gem 'mimemagic', '< 0.4.3' # Used by carrierwave gem
9
+
10
+ gem 'globalize'
11
+
12
+ group :test do
13
+ gem 'simplecov', '< 0.18'
14
+ end
15
+
16
+ gemspec path: '../'
@@ -1,13 +1,16 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in pluck_all.gemspec
4
-
5
- gem 'sqlite3', '~> 1.3.0'
6
- gem 'activerecord', '~> 5.1.0'
7
- gem 'carrierwave', '~> 0.11.0'
8
-
9
- group :test do
10
- gem 'simplecov'
11
- end
12
-
13
- gemspec path: '../'
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in pluck_all.gemspec
4
+
5
+ gem 'sqlite3', '~> 1.3.0'
6
+ gem 'activerecord', '~> 5.1.0'
7
+ gem 'carrierwave', '~> 0.11.0'
8
+ gem 'mimemagic', '< 0.4.3' # Used by carrierwave gem
9
+
10
+ gem 'globalize'
11
+
12
+ group :test do
13
+ gem 'simplecov', '< 0.18'
14
+ end
15
+
16
+ gemspec path: '../'
@@ -1,13 +1,16 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in pluck_all.gemspec
4
-
5
- gem 'sqlite3', '~> 1.3.0'
6
- gem 'activerecord', '~> 5.2.0'
7
- gem 'carrierwave', '~> 0.11.0'
8
-
9
- group :test do
10
- gem 'simplecov'
11
- end
12
-
13
- gemspec path: '../'
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in pluck_all.gemspec
4
+
5
+ gem 'sqlite3', '~> 1.3.0'
6
+ gem 'activerecord', '~> 5.2.0'
7
+ gem 'carrierwave', '~> 0.11.0'
8
+ gem 'mimemagic', '< 0.4.3' # Used by carrierwave gem
9
+
10
+ gem 'globalize'
11
+
12
+ group :test do
13
+ gem 'simplecov', '< 0.18'
14
+ end
15
+
16
+ gemspec path: '../'
@@ -1,13 +1,16 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in pluck_all.gemspec
4
-
5
- gem 'sqlite3', '~> 1.4.1'
6
- gem 'activerecord', '~> 6.0.0'
7
- gem 'carrierwave', '~> 0.11.0'
8
-
9
- group :test do
10
- gem 'simplecov'
11
- end
12
-
13
- gemspec path: '../'
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in pluck_all.gemspec
4
+
5
+ gem 'sqlite3', '~> 1.4.1'
6
+ gem 'activerecord', '~> 6.0.0'
7
+ gem 'carrierwave', '~> 0.11.0'
8
+ gem 'mimemagic', '< 0.4.3' # Used by carrierwave gem
9
+
10
+ gem 'globalize'
11
+
12
+ group :test do
13
+ gem 'simplecov', '< 0.18'
14
+ end
15
+
16
+ gemspec path: '../'
@@ -1,13 +1,16 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in pluck_all.gemspec
4
-
5
- gem 'sqlite3', '~> 1.4.1'
6
- gem 'activerecord', '~> 6.1.0'
7
- gem 'carrierwave', '~> 0.11.0'
8
-
9
- group :test do
10
- gem 'simplecov'
11
- end
12
-
13
- gemspec path: '../'
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in pluck_all.gemspec
4
+
5
+ gem 'sqlite3', '~> 1.4.1'
6
+ gem 'activerecord', '~> 6.1.0'
7
+ gem 'carrierwave', '~> 0.11.0'
8
+ gem 'mimemagic', '< 0.4.3' # Used by carrierwave gem
9
+
10
+ gem 'globalize'
11
+
12
+ group :test do
13
+ gem 'simplecov', '< 0.18'
14
+ end
15
+
16
+ gemspec path: '../'
@@ -1,11 +1,11 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in pluck_all.gemspec
4
-
5
- gem 'mongoid', '~> 5.4.0'
6
-
7
- group :test do
8
- gem 'simplecov'
9
- end
10
-
11
- gemspec path: '../'
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in pluck_all.gemspec
4
+
5
+ gem 'mongoid', '~> 5.4.0'
6
+
7
+ group :test do
8
+ gem 'simplecov', '< 0.18'
9
+ end
10
+
11
+ gemspec path: '../'
@@ -1,11 +1,11 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in pluck_all.gemspec
4
-
5
- gem 'mongoid', '~> 6.4.0'
6
-
7
- group :test do
8
- gem 'simplecov'
9
- end
10
-
11
- gemspec path: '../'
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in pluck_all.gemspec
4
+
5
+ gem 'mongoid', '~> 6.4.0'
6
+
7
+ group :test do
8
+ gem 'simplecov', '< 0.18'
9
+ end
10
+
11
+ gemspec path: '../'
@@ -1,11 +1,11 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in pluck_all.gemspec
4
-
5
- gem 'mongoid', '~> 7.0.0'
6
-
7
- group :test do
8
- gem 'simplecov'
9
- end
10
-
11
- gemspec path: '../'
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in pluck_all.gemspec
4
+
5
+ gem 'mongoid', '~> 7.0.0'
6
+
7
+ group :test do
8
+ gem 'simplecov', '< 0.18'
9
+ end
10
+
11
+ gemspec path: '../'
@@ -1,131 +1,139 @@
1
- require 'rails_compatibility/attribute_types'
2
- require_relative 'patches/deserialize'
3
-
4
- class ActiveRecord::Relation
5
- def cast_need_columns(column_names, _klass = nil)
6
- @pluck_all_cast_need_columns = column_names.map(&:to_s)
7
- @pluck_all_cast_klass = _klass
8
- return self
9
- end
10
-
11
- def select_all(*column_names)
12
- relation = clone
13
- relation.select_values = [].freeze # cannot use `unscope(:select)` in Rails 3
14
- return klass.connection.select_all(relation.select(column_names).to_sql)
15
- end
16
-
17
- if Gem::Version.new(ActiveRecord::VERSION::STRING) < Gem::Version.new('4.0.0')
18
- def pluck_all(*column_names, cast_uploader_url: true)
19
- column_names.map!(&to_sql_column_name)
20
- result = select_all(*column_names)
21
- result.map! do |attributes| # This map! behaves different to array#map!
22
- initialized_attributes = klass.initialize_attributes(attributes)
23
- attributes.each do |key, _attribute|
24
- attributes[key] = klass.type_cast_attribute(key, initialized_attributes) # TODO: 現在AS過後的type cast會有一點問題
25
- end
26
- cast_carrier_wave_uploader_url(attributes) if cast_uploader_url
27
- next attributes
28
- end
29
- end
30
-
31
- private
32
-
33
- def to_sql_column_name
34
- proc do |column_name|
35
- if column_name.is_a?(Arel::Attributes::Attribute)
36
- "#{column_name.relation.name}.#{column_name.name}"
37
- elsif column_name.is_a?(Symbol) && column_names.include?(column_name.to_s)
38
- "#{connection.quote_table_name(table_name)}.#{connection.quote_column_name(column_name)}"
39
- else
40
- column_name.to_s
41
- end
42
- end
43
- end
44
- else
45
- def pluck_all(*column_names, cast_uploader_url: true)
46
- column_names.map!(&to_sql_column_name)
47
- if has_include?(column_names.first)
48
- # The `construct_relation_for_association_calculations` method was removed at Rails 5.2.
49
- relation = Gem::Version.new(ActiveRecord::VERSION::STRING) >= Gem::Version.new('5.2.0') ? apply_join_dependency : construct_relation_for_association_calculations
50
- return relation.pluck_all(*column_names)
51
- end
52
- result = select_all(*column_names)
53
- attribute_types = RailsCompatibility.attribute_types(klass)
54
- result.map do |attributes| # This map behaves different to array#map
55
- attributes.each do |key, attribute|
56
- attributes[key] = result.send(:column_type, key, attribute_types).deserialize(attribute) # TODO: 現在AS過後的type cast會有一點問題,但似乎原生的pluck也有此問題
57
- end
58
- cast_carrier_wave_uploader_url(attributes) if cast_uploader_url
59
- next attributes
60
- end
61
- end
62
-
63
- private
64
-
65
- def to_sql_column_name
66
- proc do |column_name|
67
- if column_name.is_a?(Arel::Attributes::Attribute)
68
- "#{column_name.relation.name}.#{column_name.name}"
69
- elsif column_name.is_a?(Symbol) && attribute_alias?(column_name)
70
- attribute_alias(column_name)
71
- else
72
- column_name.to_s
73
- end
74
- end
75
- end
76
- end
77
-
78
- # ----------------------------------------------------------------
79
- # ● Support casting CarrierWave url
80
- # ----------------------------------------------------------------
81
- def cast_carrier_wave_uploader_url(attributes)
82
- if defined?(CarrierWave) && klass.respond_to?(:uploaders)
83
- @pluck_all_cast_need_columns ||= nil
84
- @pluck_all_cast_klass ||= klass
85
- @pluck_all_uploaders ||= @pluck_all_cast_klass.uploaders.select{|key, _uploader| attributes.key?(key.to_s) }
86
- @pluck_all_uploaders.each do |key, _uploader|
87
- {}.tap do |hash|
88
- @pluck_all_cast_need_columns.each{|k| hash[k] = attributes[k] } if @pluck_all_cast_need_columns
89
- obj = @pluck_all_cast_klass.instantiate(hash)
90
- obj[key] = attributes[key_s = key.to_s]
91
- # https://github.com/carrierwaveuploader/carrierwave/blob/87c37b706c560de6d01816f9ebaa15ce1c51ed58/lib/carrierwave/mount.rb#L142
92
- attributes[key_s] = obj.send(key)
93
- end
94
- end
95
- end
96
- return attributes
97
- end
98
- end
99
-
100
- class ActiveRecord::Relation
101
- if Gem::Version.new(ActiveRecord::VERSION::STRING) < Gem::Version.new('4.0.2')
102
- def pluck_array(*args)
103
- return pluck_all(*args, cast_uploader_url: false).map do |hash|
104
- result = hash.values # P.S. 這裡是相信ruby 1.9以後,hash.values的順序跟insert的順序一樣。
105
- next (args.one? ? result.first : result)
106
- end
107
- end
108
- else
109
- alias pluck_array pluck if not method_defined?(:pluck_array)
110
- end
111
- end
112
-
113
- class << ActiveRecord::Base
114
- def cast_need_columns(*args)
115
- where(nil).cast_need_columns(*args)
116
- end
117
-
118
- def pluck_all(*args)
119
- where(nil).pluck_all(*args)
120
- end
121
-
122
- def pluck_array(*args)
123
- where(nil).pluck_array(*args)
124
- end
125
- end
126
-
127
- module ActiveRecord::NullRelation
128
- def pluck_all(*_args)
129
- []
130
- end
131
- end
1
+ require 'rails_compatibility/attribute_types'
2
+ require_relative 'patches/deserialize'
3
+
4
+ class ActiveRecord::Relation
5
+ def cast_need_columns(column_names, _klass = nil)
6
+ @pluck_all_cast_need_columns = column_names.map(&:to_s)
7
+ @pluck_all_cast_klass = _klass
8
+ return self
9
+ end
10
+
11
+ def select_all(column_names)
12
+ relation = clone
13
+
14
+ # See: https://github.com/globalize/globalize/pull/707
15
+ if respond_to?(:translated_attribute_names) && (parsed = parse_translated_columns(column_names))
16
+ relation = relation.join_translations
17
+ column_names = parsed
18
+ end
19
+
20
+ relation.select_values = [].freeze # cannot use `unscope(:select)` in Rails 3
21
+
22
+ sql = relation.select(column_names.map(&to_sql_column_name)).to_sql
23
+ return klass.connection.select_all(sql)
24
+ end
25
+
26
+ if Gem::Version.new(ActiveRecord::VERSION::STRING) < Gem::Version.new('4.0.0')
27
+ def pluck_all(*column_names, cast_uploader_url: true)
28
+ result = select_all(column_names)
29
+ result.map! do |attributes| # This map! behaves different to array#map!
30
+ initialized_attributes = klass.initialize_attributes(attributes)
31
+ attributes.each do |key, _attribute|
32
+ attributes[key] = klass.type_cast_attribute(key, initialized_attributes) # TODO: 現在AS過後的type cast會有一點問題
33
+ end
34
+ cast_carrier_wave_uploader_url(attributes) if cast_uploader_url
35
+ next attributes
36
+ end
37
+ end
38
+
39
+ private
40
+
41
+ def to_sql_column_name
42
+ proc do |column_name|
43
+ if column_name.is_a?(Arel::Attributes::Attribute)
44
+ "#{column_name.relation.name}.#{column_name.name}"
45
+ elsif column_name.is_a?(Symbol) && column_names.include?(column_name.to_s)
46
+ "#{connection.quote_table_name(table_name)}.#{connection.quote_column_name(column_name)}"
47
+ else
48
+ column_name.to_s
49
+ end
50
+ end
51
+ end
52
+ else
53
+ def pluck_all(*column_names, cast_uploader_url: true)
54
+ if has_include?(column_names.first)
55
+ # The `construct_relation_for_association_calculations` method was removed at Rails 5.2.
56
+ relation = Gem::Version.new(ActiveRecord::VERSION::STRING) >= Gem::Version.new('5.2.0') ? apply_join_dependency : construct_relation_for_association_calculations
57
+ return relation.pluck_all(*column_names)
58
+ end
59
+
60
+ result = select_all(column_names)
61
+ attribute_types = RailsCompatibility.attribute_types(klass)
62
+ result.map do |attributes| # This map behaves different to array#map
63
+ attributes.each do |key, attribute|
64
+ attributes[key] = result.send(:column_type, key, attribute_types).deserialize(attribute) # TODO: 現在AS過後的type cast會有一點問題,但似乎原生的pluck也有此問題
65
+ end
66
+ cast_carrier_wave_uploader_url(attributes) if cast_uploader_url
67
+ next attributes
68
+ end
69
+ end
70
+
71
+ private
72
+
73
+ def to_sql_column_name
74
+ proc do |column_name|
75
+ if column_name.is_a?(Arel::Attributes::Attribute)
76
+ "#{column_name.relation.name}.#{column_name.name}"
77
+ elsif column_name.is_a?(Symbol) && attribute_alias?(column_name)
78
+ attribute_alias(column_name)
79
+ else
80
+ column_name.to_s
81
+ end
82
+ end
83
+ end
84
+ end
85
+
86
+ # ----------------------------------------------------------------
87
+ # Support casting CarrierWave url
88
+ # ----------------------------------------------------------------
89
+ def cast_carrier_wave_uploader_url(attributes)
90
+ if defined?(CarrierWave) && klass.respond_to?(:uploaders)
91
+ @pluck_all_cast_need_columns ||= nil
92
+ @pluck_all_cast_klass ||= klass
93
+ @pluck_all_uploaders ||= @pluck_all_cast_klass.uploaders.select{|key, _uploader| attributes.key?(key.to_s) }
94
+ @pluck_all_uploaders.each do |key, _uploader|
95
+ {}.tap do |hash|
96
+ @pluck_all_cast_need_columns.each{|k| hash[k] = attributes[k] } if @pluck_all_cast_need_columns
97
+ obj = @pluck_all_cast_klass.instantiate(hash)
98
+ obj[key] = attributes[key_s = key.to_s]
99
+ # https://github.com/carrierwaveuploader/carrierwave/blob/87c37b706c560de6d01816f9ebaa15ce1c51ed58/lib/carrierwave/mount.rb#L142
100
+ attributes[key_s] = obj.send(key)
101
+ end
102
+ end
103
+ end
104
+ return attributes
105
+ end
106
+ end
107
+
108
+ class ActiveRecord::Relation
109
+ if Gem::Version.new(ActiveRecord::VERSION::STRING) < Gem::Version.new('4.0.2')
110
+ def pluck_array(*args)
111
+ return pluck_all(*args, cast_uploader_url: false).map do |hash|
112
+ result = hash.values # P.S. 這裡是相信ruby 1.9以後,hash.values的順序跟insert的順序一樣。
113
+ next (args.one? ? result.first : result)
114
+ end
115
+ end
116
+ else
117
+ alias pluck_array pluck if not method_defined?(:pluck_array)
118
+ end
119
+ end
120
+
121
+ class << ActiveRecord::Base
122
+ def cast_need_columns(*args)
123
+ where(nil).cast_need_columns(*args)
124
+ end
125
+
126
+ def pluck_all(*args)
127
+ where(nil).pluck_all(*args)
128
+ end
129
+
130
+ def pluck_array(*args)
131
+ where(nil).pluck_array(*args)
132
+ end
133
+ end
134
+
135
+ module ActiveRecord::NullRelation
136
+ def pluck_all(*_args)
137
+ []
138
+ end
139
+ end