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
@@ -5,15 +5,14 @@ describe Muster::Strategies::JoinsExpression do
|
|
5
5
|
subject { Muster::Strategies::JoinsExpression.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('joins=author,author.foop').should eq(
|
15
|
+
subject.parse('joins=author,author.foop').should eq('joins' => ['author', { 'author' => 'foop' }])
|
17
16
|
end
|
18
17
|
|
19
18
|
it 'hash supports indifferent key access' do
|
@@ -23,11 +22,11 @@ describe Muster::Strategies::JoinsExpression do
|
|
23
22
|
end
|
24
23
|
|
25
24
|
it 'combines multiple expressions into an array' do
|
26
|
-
subject.parse('joins=author,activity').should
|
25
|
+
subject.parse('joins=author,activity').should eq('joins' => ['author', 'activity'])
|
27
26
|
end
|
28
27
|
|
29
28
|
it 'discards non unique values' do
|
30
|
-
subject.parse('joins=author&joins=author').should
|
29
|
+
subject.parse('joins=author&joins=author').should eq('joins' => ['author'])
|
31
30
|
end
|
32
31
|
end
|
33
32
|
|
@@ -38,11 +37,11 @@ describe Muster::Strategies::JoinsExpression do
|
|
38
37
|
end
|
39
38
|
|
40
39
|
it 'converts comma separated value into Array' do
|
41
|
-
subject.parse('joins=author|activity').should
|
40
|
+
subject.parse('joins=author|activity').should eq('joins' => ['author', 'activity'])
|
42
41
|
end
|
43
42
|
|
44
43
|
it 'ignores spaces after a separator' do
|
45
|
-
subject.parse('joins=author|%20 activity').should
|
44
|
+
subject.parse('joins=author|%20 activity').should eq('joins' => ['author', 'activity'])
|
46
45
|
end
|
47
46
|
end
|
48
47
|
|
@@ -52,7 +51,7 @@ describe Muster::Strategies::JoinsExpression do
|
|
52
51
|
end
|
53
52
|
|
54
53
|
it 'converts comma separated value into Array' do
|
55
|
-
subject.parse('joins=author|activity|rule').should
|
54
|
+
subject.parse('joins=author|activity|rule').should eq('joins' => ['author', 'activity', 'rule'])
|
56
55
|
end
|
57
56
|
end
|
58
57
|
end
|
@@ -62,11 +61,11 @@ describe Muster::Strategies::JoinsExpression do
|
|
62
61
|
before { options[:field_separator] = /\s*:\s*/ }
|
63
62
|
|
64
63
|
it 'splits field from values' do
|
65
|
-
subject.parse('joins=author:country:name').should
|
64
|
+
subject.parse('joins=author:country:name').should eq('joins' => [{ 'author' => { 'country' => 'name' } }])
|
66
65
|
end
|
67
66
|
|
68
67
|
it 'ignores spaces after field' do
|
69
|
-
subject.parse('joins=author : country').should
|
68
|
+
subject.parse('joins=author : country').should eq('joins' => [{ 'author' => 'country' }])
|
70
69
|
end
|
71
70
|
end
|
72
71
|
|
@@ -74,7 +73,7 @@ describe Muster::Strategies::JoinsExpression do
|
|
74
73
|
before { options[:field_separator] = ':' }
|
75
74
|
|
76
75
|
it 'converts comma separated value into Array' do
|
77
|
-
subject.parse('joins=author:country').should
|
76
|
+
subject.parse('joins=author:country').should eq('joins' => [{ 'author' => 'country' }])
|
78
77
|
end
|
79
78
|
end
|
80
79
|
end
|
@@ -84,7 +83,7 @@ describe Muster::Strategies::JoinsExpression do
|
|
84
83
|
before { options[:field] = :includes }
|
85
84
|
|
86
85
|
it 'fields returns expressions for the key specified' do
|
87
|
-
subject.parse('includes=author').should
|
86
|
+
subject.parse('includes=author').should eq('includes' => ['author'])
|
88
87
|
end
|
89
88
|
end
|
90
89
|
|
@@ -92,7 +91,7 @@ describe Muster::Strategies::JoinsExpression do
|
|
92
91
|
before { options[:fields] = [:includes, :joins] }
|
93
92
|
|
94
93
|
it 'fields returns expressions for the keys specified' do
|
95
|
-
subject.parse('joins=author&includes=activity').should
|
94
|
+
subject.parse('joins=author&includes=activity').should eq('joins' => ['author'], 'includes' => ['activity'])
|
96
95
|
end
|
97
96
|
end
|
98
97
|
|
@@ -100,7 +99,7 @@ describe Muster::Strategies::JoinsExpression do
|
|
100
99
|
before { options[:field] = 'includes' }
|
101
100
|
|
102
101
|
it 'fields returns expressions for the key specified' do
|
103
|
-
subject.parse('includes=author').should
|
102
|
+
subject.parse('includes=author').should eq('includes' => ['author'])
|
104
103
|
end
|
105
104
|
end
|
106
105
|
|
@@ -108,11 +107,9 @@ describe Muster::Strategies::JoinsExpression do
|
|
108
107
|
before { options[:fields] = ['includes', 'joins'] }
|
109
108
|
|
110
109
|
it 'fields returns expressions for the keys specified' do
|
111
|
-
subject.parse('includes=author&joins=activity').should
|
110
|
+
subject.parse('includes=author&joins=activity').should eq('includes' => ['author'], 'joins' => ['activity'])
|
112
111
|
end
|
113
112
|
end
|
114
113
|
end
|
115
|
-
|
116
114
|
end
|
117
115
|
end
|
118
|
-
|
@@ -6,25 +6,25 @@ describe Muster::Strategies::Pagination do
|
|
6
6
|
|
7
7
|
describe '#parse' do
|
8
8
|
it 'returns a Muster::Results instance' do
|
9
|
-
subject.parse('').should
|
9
|
+
subject.parse('').should eq('pagination' => { 'page' => 1, 'per_page' => 30 }, 'limit' => 30, 'offset' => nil)
|
10
10
|
subject.parse('').should be_an_instance_of(Muster::Results)
|
11
11
|
end
|
12
12
|
|
13
13
|
context 'by default' do
|
14
14
|
it 'returns default hash for empty query string' do
|
15
|
-
subject.parse('').should
|
15
|
+
subject.parse('').should eq('pagination' => { 'page' => 1, 'per_page' => 30 }, 'offset' => nil, 'limit' => 30)
|
16
16
|
end
|
17
17
|
|
18
18
|
it 'ensures page is positive integer' do
|
19
|
-
subject.parse('page=foop')[:pagination].should
|
19
|
+
subject.parse('page=foop')[:pagination].should eq('page' => 1, 'per_page' => 30)
|
20
20
|
end
|
21
21
|
|
22
22
|
it 'ensures per_page is positive integer' do
|
23
|
-
subject.parse('per_page=foop')[:pagination].should
|
23
|
+
subject.parse('per_page=foop')[:pagination].should eq('page' => 1, 'per_page' => 30)
|
24
24
|
end
|
25
25
|
|
26
26
|
it 'accepts page_size instead of per_page' do
|
27
|
-
subject.parse('page_size=10')[:pagination].should
|
27
|
+
subject.parse('page_size=10')[:pagination].should eq('page' => 1, 'per_page' => 10)
|
28
28
|
end
|
29
29
|
|
30
30
|
it 'calculates offset from pagination' do
|
@@ -47,7 +47,7 @@ describe Muster::Strategies::Pagination do
|
|
47
47
|
before { options[:field] = :limit }
|
48
48
|
|
49
49
|
it 'fields returns values for the key specified' do
|
50
|
-
subject.parse('per_page=10').should
|
50
|
+
subject.parse('per_page=10').should eq('limit' => 10)
|
51
51
|
end
|
52
52
|
end
|
53
53
|
|
@@ -55,7 +55,7 @@ describe Muster::Strategies::Pagination do
|
|
55
55
|
before { options[:fields] = [:limit, :offset] }
|
56
56
|
|
57
57
|
it 'fields returns values for the keys specified' do
|
58
|
-
subject.parse('per_page=10&page=2').should
|
58
|
+
subject.parse('per_page=10&page=2').should eq('limit' => 10, 'offset' => 10)
|
59
59
|
end
|
60
60
|
end
|
61
61
|
|
@@ -63,7 +63,7 @@ describe Muster::Strategies::Pagination do
|
|
63
63
|
before { options[:field] = 'limit' }
|
64
64
|
|
65
65
|
it 'fields returns values for the key specified' do
|
66
|
-
subject.parse('per_page=10').should
|
66
|
+
subject.parse('per_page=10').should eq('limit' => 10)
|
67
67
|
end
|
68
68
|
end
|
69
69
|
|
@@ -71,7 +71,7 @@ describe Muster::Strategies::Pagination do
|
|
71
71
|
before { options[:fields] = ['limit', 'offset'] }
|
72
72
|
|
73
73
|
it 'fields returns values for the keys specified' do
|
74
|
-
subject.parse('per_page=10&page=2').should
|
74
|
+
subject.parse('per_page=10&page=2').should eq('limit' => 10, 'offset' => 10)
|
75
75
|
end
|
76
76
|
end
|
77
77
|
end
|
@@ -5,15 +5,14 @@ describe Muster::Strategies::SortExpression do
|
|
5
5
|
subject { Muster::Strategies::SortExpression.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('sort=id&order=name').should
|
15
|
+
subject.parse('sort=id&order=name').should eq('sort' => 'id asc', 'order' => 'name asc')
|
17
16
|
end
|
18
17
|
|
19
18
|
it 'hash supports indifferent key access' do
|
@@ -33,7 +32,7 @@ describe Muster::Strategies::SortExpression do
|
|
33
32
|
it 'supports comma separated expressions without directions' do
|
34
33
|
subject.parse('sort=id,name').should == { 'sort' => ['id asc', 'name asc'] }
|
35
34
|
end
|
36
|
-
|
35
|
+
|
37
36
|
it 'discards non unique values' do
|
38
37
|
subject.parse('sort=id&sort=name&sort=id').should == { 'sort' => ['id asc', 'name asc'] }
|
39
38
|
end
|
@@ -90,6 +89,5 @@ describe Muster::Strategies::SortExpression do
|
|
90
89
|
end
|
91
90
|
end
|
92
91
|
end
|
93
|
-
|
94
92
|
end
|
95
93
|
end
|
metadata
CHANGED
@@ -1,111 +1,125 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: muster
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Christopher H. Laco
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-08-
|
11
|
+
date: 2015-08-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ! '>='
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '3.0'
|
20
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
26
|
version: '3.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rack
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ~>
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '1.4'
|
34
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
40
|
version: '1.4'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: pry
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ! '>='
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ! '>='
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rspec
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - ~>
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: 2.11.0
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
66
|
+
- - ~>
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: 2.11.0
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: redcarpet
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- -
|
73
|
+
- - ~>
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: '2.1'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- -
|
80
|
+
- - ~>
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '2.1'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rubocop
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ~>
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 0.33.0
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ~>
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 0.33.0
|
83
97
|
- !ruby/object:Gem::Dependency
|
84
98
|
name: simplecov
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|
86
100
|
requirements:
|
87
|
-
- -
|
101
|
+
- - ! '>='
|
88
102
|
- !ruby/object:Gem::Version
|
89
103
|
version: '0'
|
90
104
|
type: :development
|
91
105
|
prerelease: false
|
92
106
|
version_requirements: !ruby/object:Gem::Requirement
|
93
107
|
requirements:
|
94
|
-
- -
|
108
|
+
- - ! '>='
|
95
109
|
- !ruby/object:Gem::Version
|
96
110
|
version: '0'
|
97
111
|
- !ruby/object:Gem::Dependency
|
98
112
|
name: yard
|
99
113
|
requirement: !ruby/object:Gem::Requirement
|
100
114
|
requirements:
|
101
|
-
- -
|
115
|
+
- - ~>
|
102
116
|
- !ruby/object:Gem::Version
|
103
117
|
version: 0.8.2
|
104
118
|
type: :development
|
105
119
|
prerelease: false
|
106
120
|
version_requirements: !ruby/object:Gem::Requirement
|
107
121
|
requirements:
|
108
|
-
- -
|
122
|
+
- - ~>
|
109
123
|
- !ruby/object:Gem::Version
|
110
124
|
version: 0.8.2
|
111
125
|
description: Muster is a gem that turns query strings of varying formats into data
|
@@ -116,9 +130,10 @@ executables: []
|
|
116
130
|
extensions: []
|
117
131
|
extra_rdoc_files: []
|
118
132
|
files:
|
119
|
-
-
|
120
|
-
-
|
121
|
-
-
|
133
|
+
- .gitignore
|
134
|
+
- .rspec
|
135
|
+
- .rubocop.yml
|
136
|
+
- .yardopts
|
122
137
|
- Authors
|
123
138
|
- Changes
|
124
139
|
- Gemfile
|
@@ -156,17 +171,17 @@ require_paths:
|
|
156
171
|
- lib
|
157
172
|
required_ruby_version: !ruby/object:Gem::Requirement
|
158
173
|
requirements:
|
159
|
-
- -
|
174
|
+
- - ! '>='
|
160
175
|
- !ruby/object:Gem::Version
|
161
176
|
version: '0'
|
162
177
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
163
178
|
requirements:
|
164
|
-
- -
|
179
|
+
- - ! '>='
|
165
180
|
- !ruby/object:Gem::Version
|
166
181
|
version: '0'
|
167
182
|
requirements: []
|
168
183
|
rubyforge_project:
|
169
|
-
rubygems_version: 2.4.
|
184
|
+
rubygems_version: 2.4.8
|
170
185
|
signing_key:
|
171
186
|
specification_version: 4
|
172
187
|
summary: Muster various query string formats into a more reusable data structure.
|