pluck_to_hash 0.3.0 → 1.0.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6a3229df2da1185b057f0e9044706edf65e95c40
4
- data.tar.gz: 6747bf279dc92fb4b16fb4e42a84186ee1b5e63b
3
+ metadata.gz: d8a7cad98ab4502a9b3836f0a5d769d334fa99b0
4
+ data.tar.gz: 5eb006f187a81d71311c3a019154fb9b21fbf2ad
5
5
  SHA512:
6
- metadata.gz: 9b8c27695035f0ff794a34d5fd153728eb872aa693fef0cb078bc0326c00523c9f9d912a473a41925c14dfe6f2e0a662f7c8c1de4992e0029a786be44e6bb936
7
- data.tar.gz: b3f5d9d7e24ffea05bf52c579cc381cf88b51f8280d41f805efb567dceb4b94866bb99f09ab795a31450d2a17e06b6d720b0949d012409817518a917d93e4aac
6
+ metadata.gz: 760b2cb5d06226b6e8def38a999452471b53b9a1fda35e7aec89c6c8d20cbfb3d3410ad43442e4f6da2e6b9d32363f428f40dee807d95384025c5c9e12d70c84
7
+ data.tar.gz: 778887f19c45dd8b929b2979ba0566730faf38fa0655d9dcef07cca08f7fde3b22a1ce36024e9a3076157fe0ca95f4731c459896e2d6c786d0f6d6db562abf3b
data/README.md CHANGED
@@ -65,6 +65,14 @@ User.pluck_to_hash(:id, :title) do |user_hash|
65
65
  end
66
66
  ```
67
67
 
68
+ Allows specifying the type of hash. Defaults to HashWithIndifferentAccess
69
+
70
+ ```ruby
71
+ User.pluck_to_hash(:id, :title, hash_type: CustomHash) do |custom_hash|
72
+ ...
73
+ end
74
+ ```
75
+
68
76
  ### Using `pluck_to_struct`
69
77
 
70
78
  ```ruby
@@ -98,6 +106,12 @@ Post.limit(2).pluck_to_struct(:id, :title) do |post_struct|
98
106
  end
99
107
  ```
100
108
 
109
+ Allows specifying the type of struct. Defaults to statndard Struct.
110
+ ```ruby
111
+ Post.limit(2).pluck_to_struct(:id, :title,struct_type: OtherStructType) do |post_struct|
112
+ puts post_struct.title
113
+ end
114
+ ```
101
115
 
102
116
  ## Using with Sinatra or other non-rails frameworks without ActiveSupport
103
117
 
@@ -5,39 +5,45 @@ module PluckToHash
5
5
 
6
6
  module ClassMethods
7
7
  def pluck_to_hash(*keys)
8
+ hash_type = keys[-1].is_a?(Hash) ? keys.pop.fetch(:hash_type,HashWithIndifferentAccess) : HashWithIndifferentAccess
8
9
  block_given = block_given?
9
- keys = column_names if keys.blank?
10
- formatted_keys = format_keys(keys)
10
+ keys, formatted_keys = format_keys(keys)
11
+ keys_one = keys.size == 1
12
+
11
13
  pluck(*keys).map do |row|
12
- row = [row] if keys.size == 1
13
- value = HashWithIndifferentAccess[formatted_keys.zip(row)]
14
- yield(value) if block_given
15
- value
14
+ value = hash_type[formatted_keys.zip(keys_one ? [row] : row)]
15
+ block_given ? yield(value) : value
16
16
  end
17
17
  end
18
18
 
19
19
  def pluck_to_struct(*keys)
20
+ struct_type = keys[-1].is_a?(Hash) ? keys.pop.fetch(:struct_type,Struct) : Struct
20
21
  block_given = block_given?
21
- keys = column_names if keys.blank?
22
- formatted_keys = format_keys(keys)
22
+ keys, formatted_keys = format_keys(keys)
23
+ keys_one = keys.size == 1
23
24
 
24
- struct = Struct.new(*formatted_keys)
25
+ struct = struct_type.new(*formatted_keys)
25
26
  pluck(*keys).map do |row|
26
- row = [row] if keys.size == 1
27
- value = struct.new(*row)
28
- yield(value) if block_given
29
- value
27
+ value = keys_one ? struct.new(*[row]) : struct.new(*row)
28
+ block_given ? yield(value) : value
30
29
  end
31
30
  end
32
31
 
33
32
  def format_keys(keys)
34
- keys.map do |k|
35
- case k
36
- when String
37
- k.split(/ as /i)[-1].to_sym
38
- when Symbol
39
- k
40
- end
33
+ if keys.blank?
34
+ [column_names, column_names]
35
+ else
36
+ [
37
+ keys,
38
+ keys.map do |k|
39
+ case k
40
+ when String
41
+ k.split(/\bas\b/i)[-1].strip.to_sym
42
+ when Symbol
43
+ k
44
+ end
45
+ end
46
+ ]
41
47
  end
42
48
  end
43
49
 
@@ -1,3 +1,3 @@
1
1
  module PluckToHash
2
- VERSION = "0.3.0"
2
+ VERSION = "1.0.0"
3
3
  end
@@ -22,6 +22,7 @@ Gem::Specification.new do |spec|
22
22
  spec.add_development_dependency "rake", "~> 10.0"
23
23
  spec.add_development_dependency "sqlite3", "~> 1.3"
24
24
  spec.add_development_dependency "rspec", "~> 3.2"
25
+ spec.add_development_dependency "values", "~> 1.8"
25
26
 
26
27
  spec.add_dependency "activerecord", ">= 4.0.2"
27
28
  spec.add_dependency "activesupport", ">= 4.0.2"
@@ -35,21 +35,18 @@ describe 'PluckToHash' do
35
35
  end
36
36
  end
37
37
 
38
-
39
38
  context 'the model does not have the attribute specified' do
40
39
  it 'raises an error' do
41
40
  expect do
42
41
  TestModel.all.pluck_to_hash(:foo)
43
- end.to raise_error
42
+ end.to raise_error(ActiveRecord::StatementInvalid)
44
43
  end
45
44
  end
46
45
 
47
46
  context 'no models exist for the given criteria' do
48
47
  it 'returns an empty relation' do
49
- expect do
50
- result = TestModel.where(id: -1).pluck_to_hash(:id)
51
- expect(result).to be_empty
52
- end.to_not raise_error
48
+ result = TestModel.where(id: -1).pluck_to_hash(:id)
49
+ expect(result).to be_empty
53
50
  end
54
51
  end
55
52
 
@@ -62,6 +59,16 @@ describe 'PluckToHash' do
62
59
  end
63
60
  end
64
61
  end
62
+
63
+ context 'when using a different hash type' do
64
+ it 'returns a hash of the correct type with all attributes' do
65
+ TestModel.all.pluck_to_hash(:id, :test_attribute,hash_type: Hash).each do |hash|
66
+ expect(hash.class).to eq(Hash)
67
+ expect(hash).to have_key(:id)
68
+ expect(hash).to have_key(:test_attribute)
69
+ end
70
+ end
71
+ end
65
72
  end
66
73
 
67
74
  context 'when serialize attributes used' do
@@ -111,16 +118,14 @@ describe 'PluckToHash' do
111
118
  it 'raises an error' do
112
119
  expect do
113
120
  TestModel.all.pluck_h(:foo)
114
- end.to raise_error
121
+ end.to raise_error(ActiveRecord::StatementInvalid)
115
122
  end
116
123
  end
117
124
 
118
125
  context 'no models exist for the given criteria' do
119
126
  it 'returns an empty relation' do
120
- expect do
121
- result = TestModel.where(id: -1).pluck_h(:id)
122
- expect(result).to be_empty
123
- end.to_not raise_error
127
+ result = TestModel.where(id: -1).pluck_h(:id)
128
+ expect(result).to be_empty
124
129
  end
125
130
  end
126
131
 
@@ -1,4 +1,5 @@
1
1
  require_relative './spec_helper'
2
+ require 'values'
2
3
 
3
4
  describe 'PluckToStruct' do
4
5
  before { TestModel.delete_all }
@@ -12,7 +13,7 @@ describe 'PluckToStruct' do
12
13
 
13
14
  it 'plucks the ids, test_attributes of the objects to a struct correctly' do
14
15
  TestModel.all.pluck_to_struct(:test_attribute, :id).each_with_index do |model, ix|
15
- id = ix+1
16
+ id = ix + 1
16
17
  expect(model).to be_a(Struct)
17
18
  expect(model.test_attribute).to eq("test#{id}")
18
19
  expect(model.id).to eq(id)
@@ -29,17 +30,23 @@ describe 'PluckToStruct' do
29
30
  context 'the model does not have the attribute specified' do
30
31
  it 'raises an error' do
31
32
  expect do
32
- TestModel.all.pluck_h(:foo)
33
- end.to raise_error
33
+ TestModel.all.pluck_s(:foo)
34
+ end.to raise_error(ActiveRecord::StatementInvalid)
34
35
  end
35
36
  end
36
37
 
37
38
  context 'no models exist for the given criteria' do
38
39
  it 'returns an empty relation' do
39
- expect do
40
- result = TestModel.where(id: -1).pluck_h(:id)
41
- expect(result).to be_empty
42
- end.to_not raise_error
40
+ result = TestModel.where(id: -1).pluck_s(:id)
41
+ expect(result).to be_empty
42
+ end
43
+ end
44
+
45
+ context 'when a different struct type is specified' do
46
+ it 'returns an object with all attributes' do
47
+ TestModel.all.pluck_to_struct(:test_attribute, :id, struct_type: Value).each do |model|
48
+ expect(model).to respond_to(:id, :test_attribute)
49
+ end
43
50
  end
44
51
  end
45
52
 
@@ -77,4 +84,4 @@ describe 'PluckToStruct' do
77
84
  end
78
85
  end
79
86
 
80
- end
87
+ end
@@ -17,4 +17,4 @@ end
17
17
 
18
18
  class TestModel < ActiveRecord::Base
19
19
  serialize :serialized_attribute, Array
20
- end
20
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pluck_to_hash
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Girish S
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-05-24 00:00:00.000000000 Z
11
+ date: 2016-06-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: '3.2'
69
+ - !ruby/object:Gem::Dependency
70
+ name: values
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '1.8'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '1.8'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: activerecord
71
85
  requirement: !ruby/object:Gem::Requirement