pluck_all 2.0.2 → 2.3.0

Sign up to get free protection for your applications and to get access to all the features.
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