pluck_all 2.0.2 → 2.3.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.
data/Rakefile CHANGED
@@ -1,22 +1,22 @@
1
- require "bundler/gem_tasks"
2
- require "rake/testtask"
1
+ require 'bundler/gem_tasks'
2
+ require 'rake/testtask'
3
3
 
4
4
  Rake::TestTask.new(:test) do |t|
5
- t.libs << "test"
6
- t.libs << "lib"
5
+ t.libs << 'test'
6
+ t.libs << 'lib'
7
7
  t.test_files = FileList['test/**/*_test.rb']
8
8
  end
9
9
 
10
10
  Rake::TestTask.new(:test_active_record) do |t|
11
- t.libs << "test"
12
- t.libs << "lib"
11
+ t.libs << 'test'
12
+ t.libs << 'lib'
13
13
  t.test_files = FileList['test/active_record/**/*_test.rb']
14
14
  end
15
15
 
16
16
  Rake::TestTask.new(:test_mongoid) do |t|
17
- t.libs << "test"
18
- t.libs << "lib"
17
+ t.libs << 'test'
18
+ t.libs << 'lib'
19
19
  t.test_files = FileList['test/mongoid/**/*_test.rb']
20
20
  end
21
21
 
22
- task :default => :test
22
+ task default: :test
data/bin/console CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require "bundler/setup"
4
- require "pluck_all"
3
+ require 'bundler/setup'
4
+ require 'pluck_all'
5
5
 
6
6
  # You can add fixtures and/or initialization code here to make experimenting
7
7
  # with your gem easier. You can also use a different console, if you like.
@@ -10,5 +10,5 @@ require "pluck_all"
10
10
  # require "pry"
11
11
  # Pry.start
12
12
 
13
- require "irb"
13
+ require 'irb'
14
14
  IRB.start
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/4.2.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,14 +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 => "../"
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
+ 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,14 +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 => "../"
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', '~> 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,14 +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 => "../"
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', '~> 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,14 +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 => "../"
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', '~> 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,14 +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 => "../"
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', '~> 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: '../'
@@ -0,0 +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
+ 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: '../'
@@ -0,0 +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
+ 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,12 +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 => "../"
12
-
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,12 +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 => "../"
12
-
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,12 +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 => "../"
12
-
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: '../'
data/lib/pluck_all.rb CHANGED
@@ -1,4 +1,3 @@
1
1
  # frozen_string_literal: true
2
- require "pluck_all/version"
3
- require "pluck_all/hooks"
4
-
2
+ require 'pluck_all/version'
3
+ require 'pluck_all/hooks'
@@ -1,18 +1,18 @@
1
1
  module PluckAll
2
2
  class Hooks
3
- def self.init
4
- # ActiveRecord
5
- begin
6
- require 'active_record'
7
- require 'pluck_all/models/active_record_extension'
8
- rescue LoadError, Gem::LoadError
3
+ class << self
4
+ def init
5
+ require 'pluck_all/models/active_record_extension' if require_if_exists('active_record')
6
+ require 'pluck_all/models/mongoid_extension' if require_if_exists('mongoid')
9
7
  end
10
8
 
11
- # Mongoid
12
- begin
13
- require 'mongoid'
14
- require 'pluck_all/models/mongoid_extension'
9
+ private
10
+
11
+ def require_if_exists(path)
12
+ require path
13
+ return true
15
14
  rescue LoadError, Gem::LoadError
15
+ return false
16
16
  end
17
17
  end
18
18
  end
@@ -1,125 +1,139 @@
1
- class ActiveRecord::Base
2
- if !defined?(attribute_types) && defined?(column_types)
3
- class << self
4
- # column_types was changed to attribute_types in Rails 5
5
- alias_method :attribute_types, :column_types
6
- end
7
- end
8
- end
9
-
10
- module ActiveRecord
11
- [
12
- *([Type::Value, Type::Integer, Type::Serialized] if defined?(Type::Value)),
13
- *([Enum::EnumType] if defined?(Enum::EnumType)),
14
- ].each do |s|
15
- s.class_eval do
16
- if !method_defined?(:deserialize) && method_defined?(:type_cast_from_database)
17
- # column_types was changed to attribute_types in Rails 5
18
- alias deserialize type_cast_from_database
19
- end
20
- end
21
- end
22
- end
23
-
24
- class ActiveRecord::Relation
25
- if Gem::Version.new(ActiveRecord::VERSION::STRING) < Gem::Version.new('4.0.0')
26
- def pluck_all(*args, cast_uploader_url: true)
27
- result = select_all(*args)
28
- result.map! do |attributes| # This map! behaves different to array#map!
29
- initialized_attributes = klass.initialize_attributes(attributes)
30
- attributes.each do |key, attribute|
31
- attributes[key] = klass.type_cast_attribute(key, initialized_attributes) #TODO 現在AS過後的type cast會有一點問題
32
- end
33
- cast_carrier_wave_uploader_url(attributes) if cast_uploader_url
34
- next attributes
35
- end
36
- end
37
- else
38
- def pluck_all(*args, cast_uploader_url: true)
39
- result = select_all(*args)
40
- attribute_types = klass.attribute_types
41
- result.map! do |attributes| # This map! behaves different to array#map!
42
- attributes.each do |key, attribute|
43
- attributes[key] = result.send(:column_type, key, attribute_types).deserialize(attribute) #TODO 現在AS過後的type cast會有一點問題,但似乎原生的pluck也有此問題
44
- end
45
- cast_carrier_wave_uploader_url(attributes) if cast_uploader_url
46
- next attributes
47
- end
48
- end
49
- end
50
-
51
- def cast_need_columns(column_names, _klass = nil)
52
- @pluck_all_cast_need_columns = column_names.map(&:to_s)
53
- @pluck_all_cast_klass = _klass
54
- return self
55
- end
56
-
57
- private
58
-
59
- def select_all(*args)
60
- args.map! do |column_name|
61
- if column_name.is_a?(Symbol) && column_names.include?(column_name.to_s)
62
- "#{connection.quote_table_name(table_name)}.#{connection.quote_column_name(column_name)}"
63
- else
64
- column_name.to_s
65
- end
66
- end
67
- relation = clone
68
- return klass.connection.select_all(relation.select(args).to_sql)
69
- #return klass.connection.select_all(relation.arel)
70
- end
71
-
72
- # ----------------------------------------------------------------
73
- # ● Support casting CarrierWave url
74
- # ----------------------------------------------------------------
75
- def cast_carrier_wave_uploader_url(attributes)
76
- if defined?(CarrierWave) && klass.respond_to?(:uploaders)
77
- @pluck_all_cast_klass ||= klass
78
- @pluck_all_uploaders ||= @pluck_all_cast_klass.uploaders.select{|key, uploader| attributes.key?(key.to_s) }
79
- @pluck_all_uploaders.each do |key, uploader|
80
- {}.tap do |hash|
81
- @pluck_all_cast_need_columns.each{|k| hash[k] = attributes[k] } if @pluck_all_cast_need_columns
82
- obj = @pluck_all_cast_klass.new(hash)
83
- obj[key] = attributes[key_s = key.to_s]
84
- #https://github.com/carrierwaveuploader/carrierwave/blob/87c37b706c560de6d01816f9ebaa15ce1c51ed58/lib/carrierwave/mount.rb#L142
85
- attributes[key_s] = obj.send(key)
86
- end
87
- end
88
- end
89
- return attributes
90
- end
91
- end
92
-
93
- class ActiveRecord::Relation
94
- if Gem::Version.new(ActiveRecord::VERSION::STRING) < Gem::Version.new('4.0.2')
95
- def pluck_array(*args)
96
- return pluck_all(*args, cast_uploader_url: false).map{|hash|
97
- result = hash.values #P.S. 這裡是相信ruby 1.9以後,hash.values的順序跟insert的順序一樣。
98
- next (args.one? ? result.first : result)
99
- }
100
- end
101
- else
102
- alias_method :pluck_array, :pluck if not method_defined?(:pluck_array)
103
- end
104
- end
105
-
106
-
107
- class << ActiveRecord::Base
108
- def cast_need_columns(*args)
109
- where(nil).cast_need_columns(*args)
110
- end
111
-
112
- def pluck_all(*args)
113
- where(nil).pluck_all(*args)
114
- end
115
-
116
- def pluck_array(*args)
117
- where(nil).pluck_array(*args)
118
- end
119
- end
120
-
121
- module ActiveRecord::NullRelation
122
- def pluck_all(*args)
123
- []
124
- end
125
- 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