pluck_all 2.0.0 → 2.1.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.
@@ -0,0 +1,21 @@
1
+ module PluckAll
2
+ class Hooks
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')
7
+ end
8
+
9
+ private
10
+
11
+ def require_if_exists(path)
12
+ require path
13
+ return true
14
+ rescue LoadError, Gem::LoadError
15
+ return false
16
+ end
17
+ end
18
+ end
19
+ end
20
+
21
+ PluckAll::Hooks.init
@@ -0,0 +1,130 @@
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_klass ||= klass
84
+ @pluck_all_uploaders ||= @pluck_all_cast_klass.uploaders.select{|key, _uploader| attributes.key?(key.to_s) }
85
+ @pluck_all_uploaders.each do |key, _uploader|
86
+ {}.tap do |hash|
87
+ @pluck_all_cast_need_columns.each{|k| hash[k] = attributes[k] } if @pluck_all_cast_need_columns
88
+ obj = @pluck_all_cast_klass.instantiate(hash)
89
+ obj[key] = attributes[key_s = key.to_s]
90
+ # https://github.com/carrierwaveuploader/carrierwave/blob/87c37b706c560de6d01816f9ebaa15ce1c51ed58/lib/carrierwave/mount.rb#L142
91
+ attributes[key_s] = obj.send(key)
92
+ end
93
+ end
94
+ end
95
+ return attributes
96
+ end
97
+ end
98
+
99
+ class ActiveRecord::Relation
100
+ if Gem::Version.new(ActiveRecord::VERSION::STRING) < Gem::Version.new('4.0.2')
101
+ def pluck_array(*args)
102
+ return pluck_all(*args, cast_uploader_url: false).map do |hash|
103
+ result = hash.values # P.S. 這裡是相信ruby 1.9以後,hash.values的順序跟insert的順序一樣。
104
+ next (args.one? ? result.first : result)
105
+ end
106
+ end
107
+ else
108
+ alias pluck_array pluck if not method_defined?(:pluck_array)
109
+ end
110
+ end
111
+
112
+ class << ActiveRecord::Base
113
+ def cast_need_columns(*args)
114
+ where(nil).cast_need_columns(*args)
115
+ end
116
+
117
+ def pluck_all(*args)
118
+ where(nil).pluck_all(*args)
119
+ end
120
+
121
+ def pluck_array(*args)
122
+ where(nil).pluck_array(*args)
123
+ end
124
+ end
125
+
126
+ module ActiveRecord::NullRelation
127
+ def pluck_all(*_args)
128
+ []
129
+ end
130
+ end
@@ -1,5 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
  module Mongoid
3
+ module Document::ClassMethods
4
+ def pluck_array(*fields)
5
+ where(nil).pluck_array(*fields)
6
+ end
7
+
8
+ def pluck_all(*fields)
9
+ where(nil).pluck_all(*fields)
10
+ end
11
+ end
12
+
3
13
  module Findable
4
14
  delegate :pluck_all, :pluck_array, to: :with_default_scope
5
15
  end
@@ -21,9 +31,7 @@ module Mongoid
21
31
  def pluck_array(*fields)
22
32
  normalized_select = get_normalized_select(fields)
23
33
  get_query_data(normalized_select).reduce([]) do |plucked, doc|
24
- values = normalized_select.keys.map do |n|
25
- n =~ /\./ ? doc[n.partition('.')[0]] : doc[n]
26
- end
34
+ values = normalized_select.keys.map(&plucked_value_mapper(:array, doc))
27
35
  plucked << (values.size == 1 ? values.first : values)
28
36
  end
29
37
  end
@@ -31,23 +39,30 @@ module Mongoid
31
39
  def pluck_all(*fields)
32
40
  normalized_select = get_normalized_select(fields)
33
41
  get_query_data(normalized_select).reduce([]) do |plucked, doc|
34
- values = normalized_select.keys.map do |n|
35
- [n, n =~ /\./ ? doc[n.partition('.')[0]] : doc[n]]
36
- end.to_h
37
- plucked << values
42
+ values = normalized_select.keys.map(&plucked_value_mapper(:all, doc))
43
+ plucked << values.to_h
38
44
  end
39
45
  end
40
46
 
41
47
  private
42
48
 
49
+ def plucked_value_mapper(type, doc)
50
+ proc do |n|
51
+ values = [n, n =~ /\./ ? doc[n.partition('.')[0]] : doc[n]]
52
+ case type
53
+ when :array then values[1]
54
+ when :all then values
55
+ end
56
+ end
57
+ end
58
+
43
59
  def get_query_data(normalized_select)
44
60
  return (@view ? @view.projection(normalized_select) : query.dup.select(normalized_select))
45
61
  end
46
62
 
47
63
  def get_normalized_select(fields)
48
- normalized_select = fields.inject({}) do |hash, f|
64
+ fields.each_with_object({}) do |f, hash|
49
65
  hash[klass.database_field_name(f)] = 1
50
- hash
51
66
  end
52
67
  end
53
68
  end
@@ -0,0 +1,13 @@
1
+ module ActiveRecord
2
+ [
3
+ *([Type::Value, Type::Integer, Type::Serialized] if defined?(Type::Value)),
4
+ *([Enum::EnumType] if defined?(Enum::EnumType)),
5
+ ].each do |s|
6
+ s.class_eval do
7
+ if !method_defined?(:deserialize) && method_defined?(:type_cast_from_database)
8
+ # deserialize was changed to type_cast_from_database in Rails 5
9
+ alias_method :deserialize, :type_cast_from_database
10
+ end
11
+ end
12
+ end
13
+ end
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module PluckAll
3
- VERSION = '2.0.0'
3
+ VERSION = '2.1.0'
4
4
  end
@@ -4,35 +4,40 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
  require 'pluck_all/version'
5
5
 
6
6
  Gem::Specification.new do |spec|
7
- spec.name = "pluck_all"
7
+ spec.name = 'pluck_all'
8
8
  spec.version = PluckAll::VERSION
9
- spec.authors = ["khiav reoy"]
10
- spec.email = ["mrtmrt15xn@yahoo.com.tw"]
9
+ spec.authors = ['khiav reoy']
10
+ spec.email = ['mrtmrt15xn@yahoo.com.tw']
11
11
 
12
- spec.summary = %q{Pluck multiple columns/attributes and return array of hashes. Support Rails 3, 4, 5.}
13
- spec.description = %q{Pluck multiple columns/attributes and return array of hashes. Support Rails 3, 4, 5. If you have a Rails 3 project, and want to pluck not only one column, feel free to use this gem and no need to worry about upgrading to Rails 4, 5 in the future will break this.}
14
- spec.homepage = "https://github.com/khiav223577/pluck_all"
15
- spec.license = "MIT"
12
+ spec.summary = 'Pluck multiple columns/attributes and return array of hashes. Support Rails 3, 4, 5.'
13
+ spec.description = 'Pluck multiple columns/attributes and return array of hashes. Support Rails 3, 4, 5. If you have a Rails 3 project, and want to pluck not only one column, feel free to use this gem and no need to worry about upgrading to Rails 4, 5 in the future will break this.'
14
+ spec.homepage = 'https://github.com/khiav223577/pluck_all'
15
+ spec.license = 'MIT'
16
16
 
17
17
  # Prevent pushing this gem to RubyGems.org by setting 'allowed_push_host', or
18
18
  # delete this section to allow pushing this gem to any host.
19
- #if spec.respond_to?(:metadata)
19
+ # if spec.respond_to?(:metadata)
20
20
  # spec.metadata['allowed_push_host'] = "TODO: Set to 'http://mygemserver.com'"
21
- #else
21
+ # else
22
22
  # raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
23
- #end
23
+ # end
24
24
 
25
- spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
26
- spec.bindir = "exe"
27
- spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
28
- spec.require_paths = ["lib"]
25
+ spec.files = `git ls-files -z`.split("\x0").reject{|f| f.match(%r{^(test|spec|features)/}) }
26
+ spec.bindir = 'exe'
27
+ spec.executables = spec.files.grep(%r{^exe/}){|f| File.basename(f) }
28
+ spec.require_paths = ['lib']
29
+ spec.metadata = {
30
+ 'homepage_uri' => 'https://github.com/khiav223577/pluck_all',
31
+ 'changelog_uri' => 'https://github.com/khiav223577/pluck_all/blob/master/CHANGELOG.md',
32
+ 'source_code_uri' => 'https://github.com/khiav223577/pluck_all',
33
+ 'documentation_uri' => 'https://www.rubydoc.info/gems/pluck_all',
34
+ 'bug_tracker_uri' => 'https://github.com/khiav223577/pluck_all/issues',
35
+ }
29
36
 
30
- spec.add_development_dependency "bundler", "~> 1.11"
31
- spec.add_development_dependency "rake", "~> 12.0"
32
- spec.add_development_dependency "sqlite3", "~> 1.3"
33
- spec.add_development_dependency "minitest", "~> 5.0"
34
- spec.add_development_dependency "mongoid", ">= 3.1.7"
35
-
36
- spec.add_dependency "activerecord", ">= 3"
37
+ spec.add_dependency 'activesupport', '>= 3.0.0'
38
+ spec.add_dependency 'rails_compatibility', '>= 0.0.2'
37
39
 
40
+ spec.add_development_dependency 'bundler', '>= 1.17', '< 3.x'
41
+ spec.add_development_dependency 'rake', '~> 12.0'
42
+ spec.add_development_dependency 'minitest', '~> 5.0'
38
43
  end
metadata CHANGED
@@ -1,99 +1,91 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pluck_all
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.1.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: 2018-05-27 00:00:00.000000000 Z
11
+ date: 2020-10-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: bundler
14
+ name: activesupport
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '1.11'
20
- type: :development
19
+ version: 3.0.0
20
+ type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '1.11'
26
+ version: 3.0.0
27
27
  - !ruby/object:Gem::Dependency
28
- name: rake
28
+ name: rails_compatibility
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '12.0'
34
- type: :development
33
+ version: 0.0.2
34
+ type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '12.0'
40
+ version: 0.0.2
41
41
  - !ruby/object:Gem::Dependency
42
- name: sqlite3
42
+ name: bundler
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '1.17'
48
+ - - "<"
46
49
  - !ruby/object:Gem::Version
47
- version: '1.3'
50
+ version: 3.x
48
51
  type: :development
49
52
  prerelease: false
50
53
  version_requirements: !ruby/object:Gem::Requirement
51
54
  requirements:
52
- - - "~>"
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ version: '1.17'
58
+ - - "<"
53
59
  - !ruby/object:Gem::Version
54
- version: '1.3'
60
+ version: 3.x
55
61
  - !ruby/object:Gem::Dependency
56
- name: minitest
62
+ name: rake
57
63
  requirement: !ruby/object:Gem::Requirement
58
64
  requirements:
59
65
  - - "~>"
60
66
  - !ruby/object:Gem::Version
61
- version: '5.0'
67
+ version: '12.0'
62
68
  type: :development
63
69
  prerelease: false
64
70
  version_requirements: !ruby/object:Gem::Requirement
65
71
  requirements:
66
72
  - - "~>"
67
73
  - !ruby/object:Gem::Version
68
- version: '5.0'
74
+ version: '12.0'
69
75
  - !ruby/object:Gem::Dependency
70
- name: mongoid
76
+ name: minitest
71
77
  requirement: !ruby/object:Gem::Requirement
72
78
  requirements:
73
- - - ">="
79
+ - - "~>"
74
80
  - !ruby/object:Gem::Version
75
- version: 3.1.7
81
+ version: '5.0'
76
82
  type: :development
77
83
  prerelease: false
78
84
  version_requirements: !ruby/object:Gem::Requirement
79
85
  requirements:
80
- - - ">="
81
- - !ruby/object:Gem::Version
82
- version: 3.1.7
83
- - !ruby/object:Gem::Dependency
84
- name: activerecord
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - ">="
88
- - !ruby/object:Gem::Version
89
- version: '3'
90
- type: :runtime
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - ">="
86
+ - - "~>"
95
87
  - !ruby/object:Gem::Version
96
- version: '3'
88
+ version: '5.0'
97
89
  description: Pluck multiple columns/attributes and return array of hashes. Support
98
90
  Rails 3, 4, 5. If you have a Rails 3 project, and want to pluck not only one column,
99
91
  feel free to use this gem and no need to worry about upgrading to Rails 4, 5 in
@@ -105,6 +97,7 @@ extensions: []
105
97
  extra_rdoc_files: []
106
98
  files:
107
99
  - ".gitignore"
100
+ - ".rubocop.yml"
108
101
  - ".travis.yml"
109
102
  - CHANGELOG.md
110
103
  - CODE_OF_CONDUCT.md
@@ -113,19 +106,31 @@ files:
113
106
  - Rakefile
114
107
  - bin/console
115
108
  - bin/setup
116
- - gemfiles/3.2.gemfile
117
- - gemfiles/4.2.gemfile
118
- - gemfiles/5.0.gemfile
119
- - gemfiles/5.1.gemfile
120
- - gemfiles/5.2.gemfile
109
+ - gemfiles/active_record_32.gemfile
110
+ - gemfiles/active_record_42.gemfile
111
+ - gemfiles/active_record_50.gemfile
112
+ - gemfiles/active_record_51.gemfile
113
+ - gemfiles/active_record_52.gemfile
114
+ - gemfiles/active_record_60.gemfile
115
+ - gemfiles/mongoid_54.gemfile
116
+ - gemfiles/mongoid_64.gemfile
117
+ - gemfiles/mongoid_70.gemfile
121
118
  - lib/pluck_all.rb
122
- - lib/pluck_all/mongoid_pluck_all.rb
119
+ - lib/pluck_all/hooks.rb
120
+ - lib/pluck_all/models/active_record_extension.rb
121
+ - lib/pluck_all/models/mongoid_extension.rb
122
+ - lib/pluck_all/models/patches/deserialize.rb
123
123
  - lib/pluck_all/version.rb
124
124
  - pluck_all.gemspec
125
125
  homepage: https://github.com/khiav223577/pluck_all
126
126
  licenses:
127
127
  - MIT
128
- metadata: {}
128
+ metadata:
129
+ homepage_uri: https://github.com/khiav223577/pluck_all
130
+ changelog_uri: https://github.com/khiav223577/pluck_all/blob/master/CHANGELOG.md
131
+ source_code_uri: https://github.com/khiav223577/pluck_all
132
+ documentation_uri: https://www.rubydoc.info/gems/pluck_all
133
+ bug_tracker_uri: https://github.com/khiav223577/pluck_all/issues
129
134
  post_install_message:
130
135
  rdoc_options: []
131
136
  require_paths:
@@ -141,8 +146,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
141
146
  - !ruby/object:Gem::Version
142
147
  version: '0'
143
148
  requirements: []
144
- rubyforge_project:
145
- rubygems_version: 2.7.6
149
+ rubygems_version: 3.0.3
146
150
  signing_key:
147
151
  specification_version: 4
148
152
  summary: Pluck multiple columns/attributes and return array of hashes. Support Rails