muster 0.0.10 → 0.0.11
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 +13 -5
- data/.rubocop.yml +14 -0
- data/Changes +4 -0
- data/Rakefile +6 -1
- data/lib/muster/rack.rb +8 -11
- data/lib/muster/results.rb +22 -25
- data/lib/muster/strategies/active_record.rb +28 -33
- data/lib/muster/strategies/filter_expression.rb +51 -40
- data/lib/muster/strategies/hash.rb +12 -15
- data/lib/muster/strategies/joins_expression.rb +14 -17
- data/lib/muster/strategies/pagination.rb +24 -27
- data/lib/muster/strategies/rack.rb +10 -13
- data/lib/muster/strategies/sort_expression.rb +10 -13
- data/lib/muster/version.rb +2 -1
- data/muster.gemspec +14 -12
- data/spec/muster/rack_spec.rb +8 -8
- data/spec/muster/results_spec.rb +10 -10
- data/spec/muster/strategies/active_record_spec.rb +49 -40
- data/spec/muster/strategies/filter_expression_spec.rb +16 -18
- data/spec/muster/strategies/hash_spec.rb +11 -13
- data/spec/muster/strategies/joins_expression_spec.rb +14 -17
- data/spec/muster/strategies/pagination_spec.rb +9 -9
- data/spec/muster/strategies/sort_expression_spec.rb +3 -5
- metadata +37 -22
data/spec/muster/rack_spec.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Muster::Rack do
|
4
|
-
let(:application) { lambda{|
|
4
|
+
let(:application) { lambda { |_| [200, { 'Content-Type' => 'text/plain' }, ''] } }
|
5
5
|
let(:environment) { Rack::MockRequest.env_for('/?name=value&order=name') }
|
6
6
|
let(:options) { {} }
|
7
7
|
let(:middleware) { Muster::Rack.new(application, Muster::Strategies::Hash, options) }
|
@@ -9,7 +9,7 @@ describe Muster::Rack do
|
|
9
9
|
it 'parse query string with strategy' do
|
10
10
|
middleware.call(environment)
|
11
11
|
|
12
|
-
environment[Muster::Rack::QUERY].should
|
12
|
+
environment[Muster::Rack::QUERY].should eq('name' => 'value', 'order' => 'name')
|
13
13
|
environment[Muster::Rack::QUERY].should be_an_instance_of(Muster::Results)
|
14
14
|
end
|
15
15
|
|
@@ -18,7 +18,7 @@ describe Muster::Rack do
|
|
18
18
|
|
19
19
|
middleware.call(environment)
|
20
20
|
|
21
|
-
environment[Muster::Rack::QUERY].should
|
21
|
+
environment[Muster::Rack::QUERY].should eq('name' => 'value')
|
22
22
|
environment[Muster::Rack::QUERY].should be_an_instance_of(Muster::Results)
|
23
23
|
end
|
24
24
|
|
@@ -26,27 +26,27 @@ describe Muster::Rack do
|
|
26
26
|
strategy = Muster::Strategies::Hash.new(:field => :name)
|
27
27
|
Muster::Rack.new(application, strategy).call(environment)
|
28
28
|
|
29
|
-
environment[Muster::Rack::QUERY].should
|
29
|
+
environment[Muster::Rack::QUERY].should eq('name' => 'value')
|
30
30
|
environment[Muster::Rack::QUERY].should be_an_instance_of(Muster::Results)
|
31
31
|
end
|
32
32
|
|
33
33
|
it 'merges multiple strategies into one result' do
|
34
34
|
Muster::Rack.new(application, Muster::Strategies::Hash, :field => :name).call(environment)
|
35
|
-
environment[Muster::Rack::QUERY].should
|
35
|
+
environment[Muster::Rack::QUERY].should eq('name' => 'value')
|
36
36
|
environment[Muster::Rack::QUERY].should be_an_instance_of(Muster::Results)
|
37
37
|
|
38
38
|
Muster::Rack.new(application, Muster::Strategies::Hash, :field => :order).call(environment)
|
39
|
-
environment[Muster::Rack::QUERY].should
|
39
|
+
environment[Muster::Rack::QUERY].should eq('name' => 'value', 'order' => 'name')
|
40
40
|
environment[Muster::Rack::QUERY].should be_an_instance_of(Muster::Results)
|
41
41
|
end
|
42
42
|
|
43
43
|
it 'supports indifferent access' do
|
44
44
|
Muster::Rack.new(application, Muster::Strategies::Hash, :field => :name).call(environment)
|
45
|
-
environment[Muster::Rack::QUERY].should
|
45
|
+
environment[Muster::Rack::QUERY].should eq('name' => 'value')
|
46
46
|
environment[Muster::Rack::QUERY].should be_an_instance_of(Muster::Results)
|
47
47
|
|
48
48
|
Muster::Rack.new(application, Muster::Strategies::Hash, :field => :order).call(environment)
|
49
|
-
environment[Muster::Rack::QUERY].should
|
49
|
+
environment[Muster::Rack::QUERY].should eq('name' => 'value', 'order' => 'name')
|
50
50
|
environment[Muster::Rack::QUERY].should be_an_instance_of(Muster::Results)
|
51
51
|
|
52
52
|
environment[Muster::Rack::QUERY]['name'].should eq 'value'
|
data/spec/muster/results_spec.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Muster::Results do
|
4
|
-
let(:data) { {:name => [1, 2, 3]} }
|
4
|
+
let(:data) { { :name => [1, 2, 3] } }
|
5
5
|
let(:options) { {} }
|
6
6
|
subject(:results) { Muster::Results.new(data, options) }
|
7
7
|
|
@@ -10,7 +10,7 @@ describe Muster::Results do
|
|
10
10
|
describe '#filter' do
|
11
11
|
context 'without options hash' do
|
12
12
|
it 'returns the same as fetch' do
|
13
|
-
results.filter(:name).should eq [1,2,3]
|
13
|
+
results.filter(:name).should eq [1, 2, 3]
|
14
14
|
end
|
15
15
|
|
16
16
|
it 'supports a default value' do
|
@@ -18,21 +18,21 @@ describe Muster::Results do
|
|
18
18
|
end
|
19
19
|
|
20
20
|
it 'throws exception without default' do
|
21
|
-
expect{ results.filter(:bogons) }.to raise_error(KeyError)
|
21
|
+
expect { results.filter(:bogons) }.to raise_error(KeyError)
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
25
|
context 'with options hash' do
|
26
26
|
context 'with :except option' do
|
27
27
|
context 'with data value as Array' do
|
28
|
-
before { data[:name] = [1,2,3] }
|
28
|
+
before { data[:name] = [1, 2, 3] }
|
29
29
|
|
30
30
|
it 'returns values not listed in :except as array' do
|
31
|
-
results.filter(:name, :except => [2]).should eq [1,3]
|
31
|
+
results.filter(:name, :except => [2]).should eq [1, 3]
|
32
32
|
end
|
33
33
|
|
34
34
|
it 'returns values not listed in :except as scalar' do
|
35
|
-
results.filter(:name, :except => 2).should eq [1,3]
|
35
|
+
results.filter(:name, :except => 2).should eq [1, 3]
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
@@ -55,7 +55,7 @@ describe Muster::Results do
|
|
55
55
|
end
|
56
56
|
|
57
57
|
it 'returns values listed in :only as array' do
|
58
|
-
results.filter(:name, :only => [1,3]).should eq [1,3]
|
58
|
+
results.filter(:name, :only => [1, 3]).should eq [1, 3]
|
59
59
|
end
|
60
60
|
end
|
61
61
|
end
|
@@ -80,7 +80,7 @@ describe Muster::Results do
|
|
80
80
|
|
81
81
|
filtered_results = results.filtered
|
82
82
|
filtered_results.should be_an_instance_of(Muster::Results)
|
83
|
-
filtered_results.should
|
83
|
+
filtered_results.should eq('name' => [2, 3], 'page' => 1, 'order' => [], 'where' => nil)
|
84
84
|
end
|
85
85
|
end
|
86
86
|
end
|
@@ -93,7 +93,7 @@ describe Muster::Results do
|
|
93
93
|
end
|
94
94
|
|
95
95
|
it 'returns a Hash with method missing dot notation' do
|
96
|
-
data[:pagination] = {:page => 1, :per_page => 10}
|
96
|
+
data[:pagination] = { :page => 1, :per_page => 10 }
|
97
97
|
|
98
98
|
results.pagination.should be_an_kind_of(Hash)
|
99
99
|
results.pagination.page.should eq 1
|
@@ -105,7 +105,7 @@ describe Muster::Results do
|
|
105
105
|
|
106
106
|
context 'without matching key' do
|
107
107
|
it 'returns NoMethodError' do
|
108
|
-
expect{ results.foop }.to raise_error(NoMethodError)
|
108
|
+
expect { results.foop }.to raise_error(NoMethodError)
|
109
109
|
end
|
110
110
|
end
|
111
111
|
|
@@ -6,7 +6,17 @@ describe Muster::Strategies::ActiveRecord do
|
|
6
6
|
|
7
7
|
describe '#parse' do
|
8
8
|
it 'returns a Muster::Results instance' do
|
9
|
-
|
9
|
+
result = {
|
10
|
+
'select' => [],
|
11
|
+
'order' => [],
|
12
|
+
'limit' => 30,
|
13
|
+
'offset' => nil,
|
14
|
+
'where' => {},
|
15
|
+
'joins' => {},
|
16
|
+
'includes' => {},
|
17
|
+
'pagination' => { :page => 1, :per_page => 30 }
|
18
|
+
}
|
19
|
+
subject.parse('').should eq(result)
|
10
20
|
subject.parse('').should be_an_instance_of(Muster::Results)
|
11
21
|
end
|
12
22
|
|
@@ -21,7 +31,6 @@ describe Muster::Strategies::ActiveRecord do
|
|
21
31
|
|
22
32
|
it 'supports comma separated values' do
|
23
33
|
subject.parse('select=id&select=guid,name')[:select].should == ['id', 'guid', 'name']
|
24
|
-
|
25
34
|
end
|
26
35
|
end
|
27
36
|
|
@@ -59,11 +68,11 @@ describe Muster::Strategies::ActiveRecord do
|
|
59
68
|
end
|
60
69
|
|
61
70
|
it 'returns a nested hash of separated values' do
|
62
|
-
subject.parse('joins=author.country.name')[:joins].should eq [{'author' => { 'country' => 'name'}}]
|
71
|
+
subject.parse('joins=author.country.name')[:joins].should eq [{ 'author' => { 'country' => 'name' } }]
|
63
72
|
end
|
64
73
|
|
65
74
|
it 'returns an array of nested hashes' do
|
66
|
-
subject.parse('joins=author.country.name,activity.rule')[:joins].should eq [{'author' => { 'country' => 'name'}}, {'activity' => 'rule'}]
|
75
|
+
subject.parse('joins=author.country.name,activity.rule')[:joins].should eq [{ 'author' => { 'country' => 'name' } }, { 'activity' => 'rule' }]
|
67
76
|
end
|
68
77
|
end
|
69
78
|
|
@@ -77,17 +86,18 @@ describe Muster::Strategies::ActiveRecord do
|
|
77
86
|
end
|
78
87
|
|
79
88
|
it 'returns a nested hash of separated values' do
|
80
|
-
subject.parse('includes=author.country.name')[:includes].should eq [{'author' => { 'country' => 'name'}}]
|
89
|
+
subject.parse('includes=author.country.name')[:includes].should eq [{ 'author' => { 'country' => 'name' } }]
|
81
90
|
end
|
82
91
|
|
83
92
|
it 'returns an array of nested hashes' do
|
84
|
-
|
93
|
+
results = [{ 'author' => { 'country' => 'name' } }, { 'activity' => 'rule' }]
|
94
|
+
subject.parse('includes=author.country.name,activity.rule')[:includes].should eq results
|
85
95
|
end
|
86
96
|
end
|
87
97
|
|
88
98
|
context 'pagination' do
|
89
99
|
it 'returns default will paginate compatible pagination' do
|
90
|
-
subject.parse('')[:pagination].should
|
100
|
+
subject.parse('')[:pagination].should eq(:page => 1, :per_page => 30)
|
91
101
|
end
|
92
102
|
|
93
103
|
it 'returns default limit options' do
|
@@ -100,35 +110,35 @@ describe Muster::Strategies::ActiveRecord do
|
|
100
110
|
|
101
111
|
it 'accepts per_page option' do
|
102
112
|
results = subject.parse('per_page=10')
|
103
|
-
results[:pagination].should
|
113
|
+
results[:pagination].should eq(:page => 1, :per_page => 10)
|
104
114
|
results[:limit].should eq 10
|
105
115
|
results[:offset].should eq nil
|
106
116
|
end
|
107
117
|
|
108
118
|
it 'ensures per_page is positive integer' do
|
109
119
|
results = subject.parse('per_page=-10')
|
110
|
-
results[:pagination].should
|
120
|
+
results[:pagination].should eq(:page => 1, :per_page => 30)
|
111
121
|
results[:limit].should eq 30
|
112
122
|
results[:offset].should eq nil
|
113
123
|
end
|
114
124
|
|
115
125
|
it 'accepts page_size option' do
|
116
126
|
results = subject.parse('page_size=10')
|
117
|
-
results[:pagination].should
|
127
|
+
results[:pagination].should eq(:page => 1, :per_page => 10)
|
118
128
|
results[:limit].should eq 10
|
119
129
|
results[:offset].should eq nil
|
120
130
|
end
|
121
131
|
|
122
132
|
it 'accepts page option' do
|
123
133
|
results = subject.parse('page=2')
|
124
|
-
results[:pagination].should
|
134
|
+
results[:pagination].should eq(:page => 2, :per_page => 30)
|
125
135
|
results[:limit].should eq 30
|
126
136
|
results[:offset].should eq 30
|
127
137
|
end
|
128
138
|
|
129
139
|
it 'ensures page is positive integer' do
|
130
140
|
results = subject.parse('page=a')
|
131
|
-
results[:pagination].should
|
141
|
+
results[:pagination].should eq(:page => 1, :per_page => 30)
|
132
142
|
results[:limit].should eq 30
|
133
143
|
results[:offset].should eq nil
|
134
144
|
end
|
@@ -136,55 +146,54 @@ describe Muster::Strategies::ActiveRecord do
|
|
136
146
|
|
137
147
|
context 'wheres' do
|
138
148
|
it 'returns a single value as a string in a hash' do
|
139
|
-
subject.parse('where=id:1')[:where].should
|
149
|
+
subject.parse('where=id:1')[:where].should eq('id' => '1')
|
140
150
|
end
|
141
151
|
|
142
152
|
it 'returns a single value as nil in a hash' do
|
143
|
-
subject.parse('where=id:null')[:where].should
|
144
|
-
subject.parse('where=id:NULL')[:where].should
|
145
|
-
subject.parse('where=id:Null')[:where].should
|
146
|
-
subject.parse('where=id:nil')[:where].should
|
147
|
-
subject.parse('where=id:NIL')[:where].should
|
148
|
-
subject.parse('where=id:Nil')[:where].should
|
153
|
+
subject.parse('where=id:null')[:where].should eq('id' => nil)
|
154
|
+
subject.parse('where=id:NULL')[:where].should eq('id' => nil)
|
155
|
+
subject.parse('where=id:Null')[:where].should eq('id' => nil)
|
156
|
+
subject.parse('where=id:nil')[:where].should eq('id' => nil)
|
157
|
+
subject.parse('where=id:NIL')[:where].should eq('id' => nil)
|
158
|
+
subject.parse('where=id:Nil')[:where].should eq('id' => nil)
|
149
159
|
end
|
150
160
|
|
151
161
|
it 'returns values as an Array in a hash' do
|
152
|
-
subject.parse('where=id:1&where=id:2')[:where].should
|
162
|
+
subject.parse('where=id:1&where=id:2')[:where].should eq('id' => ['1', '2'])
|
153
163
|
end
|
154
164
|
|
155
165
|
it 'supports pipe for multiple values' do
|
156
|
-
subject.parse('where=id:1|2')[:where].should
|
166
|
+
subject.parse('where=id:1|2')[:where].should eq('id' => ['1', '2'])
|
157
167
|
end
|
158
168
|
end
|
159
169
|
|
160
170
|
context 'the full monty' do
|
161
171
|
it 'returns a hash of all options' do
|
162
|
-
query_string = 'select=id,guid,name&where=name:foop&order=id:desc&order=name&page=3&page_size=5&includes=author.country,comments&joins=activity'
|
172
|
+
query_string = 'select=id,guid,name&where=name:foop&order=id:desc&order=name&page=3&page_size=5&includes=author.country,comments&joins=activity' # rubocop:disable Metrics/LineLength
|
163
173
|
results = subject.parse(query_string)
|
164
174
|
|
165
|
-
results[:select].should
|
166
|
-
results[:where].should
|
167
|
-
results[:order].should
|
168
|
-
results[:includes].should
|
169
|
-
results[:joins].should
|
170
|
-
results[:pagination].should
|
171
|
-
results[:offset].should
|
172
|
-
results[:limit].should
|
175
|
+
results[:select].should eq ['id', 'guid', 'name']
|
176
|
+
results[:where].should eq('name' => 'foop')
|
177
|
+
results[:order].should eq ['id desc', 'name asc']
|
178
|
+
results[:includes].should eq [{ 'author' => 'country' }, 'comments']
|
179
|
+
results[:joins].should eq ['activity']
|
180
|
+
results[:pagination].should eq(:page => 3, :per_page => 5)
|
181
|
+
results[:offset].should eq 10
|
182
|
+
results[:limit].should eq 5
|
173
183
|
end
|
174
184
|
|
175
185
|
it 'supports indifferent access' do
|
176
|
-
query_string = 'select=id,guid,name&where=name:foop&order=id:desc&order=name&page=3&page_size=5&includes=author.country,comments&joins=activity'
|
186
|
+
query_string = 'select=id,guid,name&where=name:foop&order=id:desc&order=name&page=3&page_size=5&includes=author.country,comments&joins=activity' # rubocop:disable Metrics/LineLength
|
177
187
|
results = subject.parse(query_string)
|
178
188
|
|
179
|
-
results['select'].should
|
180
|
-
results['where'].should
|
181
|
-
results['order'].should
|
182
|
-
results['includes'].should
|
183
|
-
results['joins'].should
|
184
|
-
results['pagination'].should
|
185
|
-
results['offset'].should
|
186
|
-
results['limit'].should
|
187
|
-
|
189
|
+
results['select'].should eq ['id', 'guid', 'name']
|
190
|
+
results['where'].should eq('name' => 'foop')
|
191
|
+
results['order'].should eq ['id desc', 'name asc']
|
192
|
+
results['includes'].should eq [{ 'author' => 'country' }, 'comments']
|
193
|
+
results['joins'].should eq ['activity']
|
194
|
+
results['pagination'].should eq(:page => 3, :per_page => 5)
|
195
|
+
results['offset'].should eq 10
|
196
|
+
results['limit'].should eq 5
|
188
197
|
end
|
189
198
|
end
|
190
199
|
end
|
@@ -5,15 +5,14 @@ describe Muster::Strategies::FilterExpression do
|
|
5
5
|
subject { Muster::Strategies::FilterExpression.new(options) }
|
6
6
|
|
7
7
|
describe '#parse' do
|
8
|
-
|
9
8
|
context 'by default' do
|
10
9
|
it 'returns empty hash for empty query string' do
|
11
|
-
subject.parse('').should
|
10
|
+
subject.parse('').should eq({})
|
12
11
|
subject.parse('').should be_an_instance_of(Muster::Results)
|
13
12
|
end
|
14
13
|
|
15
14
|
it 'returns hash of all key/value pairs' do
|
16
|
-
subject.parse('where=id:1&filter=name:foop').should
|
15
|
+
subject.parse('where=id:1&filter=name:foop').should eq('where' => { 'id' => '1' }, 'filter' => { 'name' => 'foop' })
|
17
16
|
end
|
18
17
|
|
19
18
|
it 'hash supports indifferent key access' do
|
@@ -23,19 +22,19 @@ describe Muster::Strategies::FilterExpression do
|
|
23
22
|
end
|
24
23
|
|
25
24
|
it 'combines multiple expressions into an array' do
|
26
|
-
subject.parse('where=id:1&where=id:2').should
|
25
|
+
subject.parse('where=id:1&where=id:2').should eq('where' => { 'id' => ['1', '2'] })
|
27
26
|
end
|
28
27
|
|
29
28
|
it 'support for multiple values using |' do
|
30
|
-
subject.parse('where=id:1|2&where=id:3').should
|
29
|
+
subject.parse('where=id:1|2&where=id:3').should eq('where' => { 'id' => ['1', '2', '3'] })
|
31
30
|
end
|
32
31
|
|
33
32
|
it 'support for multiple expressions using ,' do
|
34
|
-
subject.parse('where=id:1,id:2,id:3').should
|
33
|
+
subject.parse('where=id:1,id:2,id:3').should eq('where' => { 'id' => ['1', '2', '3'] })
|
35
34
|
end
|
36
35
|
|
37
36
|
it 'discards non unique values' do
|
38
|
-
subject.parse('where=id:1&where=id:2&where=id:1').should
|
37
|
+
subject.parse('where=id:1&where=id:2&where=id:1').should eq('where' => { 'id' => ['1', '2'] })
|
39
38
|
end
|
40
39
|
end
|
41
40
|
|
@@ -47,11 +46,11 @@ describe Muster::Strategies::FilterExpression do
|
|
47
46
|
end
|
48
47
|
|
49
48
|
it 'converts comma separated value into Array' do
|
50
|
-
subject.parse('where=id:1,2').should
|
49
|
+
subject.parse('where=id:1,2').should eq('where' => { 'id' => ['1', '2'] })
|
51
50
|
end
|
52
51
|
|
53
52
|
it 'ignores spaces after commas' do
|
54
|
-
subject.parse('where=id:1,+2,%20 3').should
|
53
|
+
subject.parse('where=id:1,+2,%20 3').should eq('where' => { 'id' => ['1', '2', '3'] })
|
55
54
|
end
|
56
55
|
end
|
57
56
|
|
@@ -62,7 +61,7 @@ describe Muster::Strategies::FilterExpression do
|
|
62
61
|
end
|
63
62
|
|
64
63
|
it 'converts comma separated value into Array' do
|
65
|
-
subject.parse('where=id:1,2,3').should
|
64
|
+
subject.parse('where=id:1,2,3').should eq('where' => { 'id' => ['1', '2', '3'] })
|
66
65
|
end
|
67
66
|
end
|
68
67
|
end
|
@@ -72,11 +71,11 @@ describe Muster::Strategies::FilterExpression do
|
|
72
71
|
before { options[:field_separator] = /\s*!\s*/ }
|
73
72
|
|
74
73
|
it 'splits field from values' do
|
75
|
-
subject.parse('where=id!1').should
|
74
|
+
subject.parse('where=id!1').should eq('where' => { 'id' => '1' })
|
76
75
|
end
|
77
76
|
|
78
77
|
it 'ignores spaces after field' do
|
79
|
-
subject.parse('where=id ! 1').should
|
78
|
+
subject.parse('where=id ! 1').should eq('where' => { 'id' => '1' })
|
80
79
|
end
|
81
80
|
end
|
82
81
|
|
@@ -84,7 +83,7 @@ describe Muster::Strategies::FilterExpression do
|
|
84
83
|
before { options[:field_separator] = '!' }
|
85
84
|
|
86
85
|
it 'converts comma separated value into Array' do
|
87
|
-
subject.parse('where=id!1').should
|
86
|
+
subject.parse('where=id!1').should eq('where' => { 'id' => '1' })
|
88
87
|
end
|
89
88
|
end
|
90
89
|
end
|
@@ -94,7 +93,7 @@ describe Muster::Strategies::FilterExpression do
|
|
94
93
|
before { options[:field] = :where }
|
95
94
|
|
96
95
|
it 'fields returns expressions for the key specified' do
|
97
|
-
subject.parse('where=id:1&filters=id:2').should
|
96
|
+
subject.parse('where=id:1&filters=id:2').should eq('where' => { 'id' => '1' })
|
98
97
|
end
|
99
98
|
end
|
100
99
|
|
@@ -102,7 +101,7 @@ describe Muster::Strategies::FilterExpression do
|
|
102
101
|
before { options[:fields] = [:where, :filter] }
|
103
102
|
|
104
103
|
it 'fields returns expressions for the keys specified' do
|
105
|
-
subject.parse('where=id:1&filter=id:2&attribute=id:3').should
|
104
|
+
subject.parse('where=id:1&filter=id:2&attribute=id:3').should eq('where' => { 'id' => '1' }, 'filter' => { 'id' => '2' })
|
106
105
|
end
|
107
106
|
end
|
108
107
|
|
@@ -110,7 +109,7 @@ describe Muster::Strategies::FilterExpression do
|
|
110
109
|
before { options[:field] = 'where' }
|
111
110
|
|
112
111
|
it 'fields returns expressions for the key specified' do
|
113
|
-
subject.parse('where=id:1&filter=id:2').should
|
112
|
+
subject.parse('where=id:1&filter=id:2').should eq('where' => { 'id' => '1' })
|
114
113
|
end
|
115
114
|
end
|
116
115
|
|
@@ -118,10 +117,9 @@ describe Muster::Strategies::FilterExpression do
|
|
118
117
|
before { options[:fields] = ['where', 'filter'] }
|
119
118
|
|
120
119
|
it 'fields returns expressions for the keys specified' do
|
121
|
-
subject.parse('where=id:1&filter=id:2&attribute=id:3').should
|
120
|
+
subject.parse('where=id:1&filter=id:2&attribute=id:3').should eq('where' => { 'id' => '1' }, 'filter' => { 'id' => '2' })
|
122
121
|
end
|
123
122
|
end
|
124
123
|
end
|
125
|
-
|
126
124
|
end
|
127
125
|
end
|
@@ -5,15 +5,14 @@ describe Muster::Strategies::Hash do
|
|
5
5
|
subject { Muster::Strategies::Hash.new(options) }
|
6
6
|
|
7
7
|
describe '#parse' do
|
8
|
-
|
9
8
|
context 'by default' do
|
10
9
|
it 'returns empty hash for empty query string' do
|
11
|
-
subject.parse('').should
|
10
|
+
subject.parse('').should eq({})
|
12
11
|
subject.parse('').should be_an_instance_of(Muster::Results)
|
13
12
|
end
|
14
13
|
|
15
14
|
it 'returns hash of all key/value pairs' do
|
16
|
-
subject.parse('a=1&b=2').should
|
15
|
+
subject.parse('a=1&b=2').should eq('a' => '1', 'b' => '2')
|
17
16
|
end
|
18
17
|
|
19
18
|
it 'hash supports indifferent key access' do
|
@@ -23,11 +22,11 @@ describe Muster::Strategies::Hash do
|
|
23
22
|
end
|
24
23
|
|
25
24
|
it 'combines multiple key values into an array' do
|
26
|
-
subject.parse('a=1&a=2').should
|
25
|
+
subject.parse('a=1&a=2').should eq('a' => ['1', '2'])
|
27
26
|
end
|
28
27
|
|
29
28
|
it 'discards non unique values' do
|
30
|
-
subject.parse('a=1&a=2&a=1').should
|
29
|
+
subject.parse('a=1&a=2&a=1').should eq('a' => ['1', '2'])
|
31
30
|
end
|
32
31
|
end
|
33
32
|
|
@@ -36,11 +35,11 @@ describe Muster::Strategies::Hash do
|
|
36
35
|
before { options[:value_separator] = /,\s*/ }
|
37
36
|
|
38
37
|
it 'converts comma separated value into Array' do
|
39
|
-
subject.parse('a=1,2&a=3').should
|
38
|
+
subject.parse('a=1,2&a=3').should eq('a' => ['1', '2', '3'])
|
40
39
|
end
|
41
40
|
|
42
41
|
it 'ignores spaces after commas' do
|
43
|
-
subject.parse('a=1,+2,%20 3').should
|
42
|
+
subject.parse('a=1,+2,%20 3').should eq('a' => ['1', '2', '3'])
|
44
43
|
end
|
45
44
|
end
|
46
45
|
|
@@ -48,7 +47,7 @@ describe Muster::Strategies::Hash do
|
|
48
47
|
before { options[:value_separator] = '|' }
|
49
48
|
|
50
49
|
it 'converts comma separated value into Array' do
|
51
|
-
subject.parse('a=1|2|3').should
|
50
|
+
subject.parse('a=1|2|3').should eq('a' => ['1', '2', '3'])
|
52
51
|
end
|
53
52
|
end
|
54
53
|
end
|
@@ -58,7 +57,7 @@ describe Muster::Strategies::Hash do
|
|
58
57
|
before { options[:field] = :a }
|
59
58
|
|
60
59
|
it 'fields returns values for the key specified' do
|
61
|
-
subject.parse('a=1&b=2').should
|
60
|
+
subject.parse('a=1&b=2').should eq('a' => '1')
|
62
61
|
end
|
63
62
|
end
|
64
63
|
|
@@ -66,7 +65,7 @@ describe Muster::Strategies::Hash do
|
|
66
65
|
before { options[:fields] = [:a, :b] }
|
67
66
|
|
68
67
|
it 'fields returns values for the keys specified' do
|
69
|
-
subject.parse('a=1&b=2&c=3').should
|
68
|
+
subject.parse('a=1&b=2&c=3').should eq('a' => '1', 'b' => '2')
|
70
69
|
end
|
71
70
|
end
|
72
71
|
|
@@ -74,7 +73,7 @@ describe Muster::Strategies::Hash do
|
|
74
73
|
before { options[:field] = 'a' }
|
75
74
|
|
76
75
|
it 'fields returns values for the key specified' do
|
77
|
-
subject.parse('a=1&b=2').should
|
76
|
+
subject.parse('a=1&b=2').should eq('a' => '1')
|
78
77
|
end
|
79
78
|
end
|
80
79
|
|
@@ -82,10 +81,9 @@ describe Muster::Strategies::Hash do
|
|
82
81
|
before { options[:fields] = ['a', 'b'] }
|
83
82
|
|
84
83
|
it 'fields returns values for the keys specified' do
|
85
|
-
subject.parse('a=1&b=2&c=3').should
|
84
|
+
subject.parse('a=1&b=2&c=3').should eq('a' => '1', 'b' => '2')
|
86
85
|
end
|
87
86
|
end
|
88
87
|
end
|
89
|
-
|
90
88
|
end
|
91
89
|
end
|