apill 2.7.1 → 2.8.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 +4 -4
- data/lib/apill/middleware/api_request.rb +3 -0
- data/lib/apill/mixins/pageable.rb +4 -4
- data/lib/apill/parameters.rb +21 -0
- data/lib/apill/serializers/json_api.rb +9 -0
- data/lib/apill/version.rb +1 -1
- data/lib/apill.rb +1 -0
- data/spec/apill/middleware/api_request_spec.rb +19 -0
- data/spec/apill/parameters_spec.rb +42 -0
- metadata +7 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ac63789c44dc822312c6aebd4c12726fcd4d4810
|
4
|
+
data.tar.gz: eb5660a665df63b8e1149685cdd6e2d92f455298
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9e8f788f49733b4ac51f389c2041dd6bd7ec2013c000e05fffe721e76de87723aaac8af26485c106bdfa8fdb03eb13258461fc13a93cedf5a26b1015ac785947
|
7
|
+
data.tar.gz: 15c818f83a0e729bb28b4b809cc135a17de8a21ce88f280bbfaaad09e4000ad4d1a7f339737af7aaca4dfdf17f5d67e1466119105c8577bde6325a3b04b73aa8
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'apill/configuration'
|
2
|
+
require 'apill/parameters'
|
2
3
|
require 'apill/matchers/subdomain_matcher'
|
3
4
|
require 'apill/matchers/accept_header_matcher'
|
4
5
|
require 'apill/responses/invalid_api_request_response'
|
@@ -20,6 +21,8 @@ class ApiRequest
|
|
20
21
|
if !subdomain_matcher.matches_api_subdomain? ||
|
21
22
|
Matchers::AcceptHeaderMatcher.new.matches?(env)
|
22
23
|
|
24
|
+
env['QUERY_STRING'] = Parameters.process(env['QUERY_STRING'])
|
25
|
+
|
23
26
|
@app.call(env)
|
24
27
|
else
|
25
28
|
Responses::InvalidApiRequestResponse.call(env)
|
@@ -40,10 +40,10 @@ module Pageable
|
|
40
40
|
|
41
41
|
def pagination_data
|
42
42
|
{
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
43
|
+
'total-pages' => @paginated_resource.total_pages,
|
44
|
+
'current-page' => @paginated_resource.current_page,
|
45
|
+
'previous-page' => @paginated_resource.prev_page,
|
46
|
+
'next-page' => @paginated_resource.next_page,
|
47
47
|
}
|
48
48
|
end
|
49
49
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Apill
|
2
|
+
class Parameters
|
3
|
+
attr_accessor :query_string
|
4
|
+
|
5
|
+
def initialize(query_string)
|
6
|
+
self.query_string = query_string
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.process(query_string)
|
10
|
+
new(query_string).process
|
11
|
+
end
|
12
|
+
|
13
|
+
def process
|
14
|
+
return query_string unless query_string.respond_to? :gsub
|
15
|
+
|
16
|
+
query_string.gsub(/(?<=\A|&|\?)[^=&]+/) do |match|
|
17
|
+
match.gsub!('-', '_')
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/apill/version.rb
CHANGED
data/lib/apill.rb
CHANGED
@@ -131,6 +131,25 @@ describe ApiRequest do
|
|
131
131
|
expect(headers).to eql({})
|
132
132
|
expect(response).to eql 'response'
|
133
133
|
end
|
134
|
+
|
135
|
+
it 'converts JSON API compliant dasherized query params to underscored' do
|
136
|
+
app = ->(env) { [200, env, 'response'] }
|
137
|
+
api_request_middleware = ApiRequest.new(app)
|
138
|
+
|
139
|
+
request = {
|
140
|
+
'HTTP_HOST' => 'api.example.com',
|
141
|
+
'HTTP_ACCEPT' => 'application/vnd.matrix+zion;version=1.0.0',
|
142
|
+
'QUERY_STRING' => 'hello-there=bob-jones&' \
|
143
|
+
'nice-to-meet=you-bob&' \
|
144
|
+
'hows-the-weather=today-bob',
|
145
|
+
}
|
146
|
+
|
147
|
+
_status, headers, _response = api_request_middleware.call(request)
|
148
|
+
|
149
|
+
expect(headers['QUERY_STRING']).to eql 'hello_there=bob-jones&' \
|
150
|
+
'nice_to_meet=you-bob&' \
|
151
|
+
'hows_the_weather=today-bob'
|
152
|
+
end
|
134
153
|
end
|
135
154
|
end
|
136
155
|
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'rspectacular'
|
2
|
+
require 'apill/parameters'
|
3
|
+
|
4
|
+
module Apill
|
5
|
+
describe Parameters do
|
6
|
+
it 'can underscore the first parameter' do
|
7
|
+
query_params = 'hello-there=bob-jones'
|
8
|
+
|
9
|
+
expect(Parameters.process(query_params)).to eql 'hello_there=bob-jones'
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'can underscore a middle parameter and a parameter at the end' do
|
13
|
+
query_params = 'hello-there=bob-jones&nice-to-meet=you-bob&hows-the-weather=today-bob'
|
14
|
+
|
15
|
+
expect(Parameters.process(query_params)).to eql 'hello_there=bob-jones&' \
|
16
|
+
'nice_to_meet=you-bob&' \
|
17
|
+
'hows_the_weather=today-bob'
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'can handle weirdly formatted parameters' do
|
21
|
+
query_params = 'hello-there=bob-jones&nice-to-meet=you-bob&='
|
22
|
+
|
23
|
+
expect(Parameters.process(query_params)).to eql 'hello_there=bob-jones&' \
|
24
|
+
'nice_to_meet=you-bob&='
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'can handle parameters with no values' do
|
28
|
+
query_params = 'hello-there&nice-to-meet=you-bob&='
|
29
|
+
|
30
|
+
expect(Parameters.process(query_params)).to eql 'hello_there&' \
|
31
|
+
'nice_to_meet=you-bob&='
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'can handle values with no parameter name' do
|
35
|
+
query_params = 'hello-there=bob-jones&=you-bob&nice-to-meet=you-bob&='
|
36
|
+
|
37
|
+
expect(Parameters.process(query_params)).to eql 'hello_there=bob-jones&' \
|
38
|
+
'=you-bob&' \
|
39
|
+
'nice_to_meet=you-bob&='
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: apill
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- jfelchner
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-08-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: human_error
|
@@ -89,11 +89,13 @@ files:
|
|
89
89
|
- lib/apill/mixins/pageable.rb
|
90
90
|
- lib/apill/mixins/queryable.rb
|
91
91
|
- lib/apill/mixins/sortable.rb
|
92
|
+
- lib/apill/parameters.rb
|
92
93
|
- lib/apill/requests/base.rb
|
93
94
|
- lib/apill/requests/rack_request.rb
|
94
95
|
- lib/apill/requests/rails_request.rb
|
95
96
|
- lib/apill/responses/invalid_api_request_response.rb
|
96
97
|
- lib/apill/responses/invalid_subdomain_response.rb
|
98
|
+
- lib/apill/serializers/json_api.rb
|
97
99
|
- lib/apill/version.rb
|
98
100
|
- spec/apill/accept_header_spec.rb
|
99
101
|
- spec/apill/errors/invalid_api_request_error_spec.rb
|
@@ -103,6 +105,7 @@ files:
|
|
103
105
|
- spec/apill/matchers/subdomain_matcher_spec.rb
|
104
106
|
- spec/apill/matchers/version_matcher_spec.rb
|
105
107
|
- spec/apill/middleware/api_request_spec.rb
|
108
|
+
- spec/apill/parameters_spec.rb
|
106
109
|
- spec/apill/requests/rack_request_spec.rb
|
107
110
|
- spec/apill/requests/rails_request_spec.rb
|
108
111
|
homepage: https://github.com/jfelchner/apill
|
@@ -125,7 +128,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
125
128
|
version: '0'
|
126
129
|
requirements: []
|
127
130
|
rubyforge_project:
|
128
|
-
rubygems_version: 2.4.
|
131
|
+
rubygems_version: 2.4.8
|
129
132
|
signing_key:
|
130
133
|
specification_version: 4
|
131
134
|
summary: Common API functionality
|
@@ -138,5 +141,6 @@ test_files:
|
|
138
141
|
- spec/apill/matchers/subdomain_matcher_spec.rb
|
139
142
|
- spec/apill/matchers/version_matcher_spec.rb
|
140
143
|
- spec/apill/middleware/api_request_spec.rb
|
144
|
+
- spec/apill/parameters_spec.rb
|
141
145
|
- spec/apill/requests/rack_request_spec.rb
|
142
146
|
- spec/apill/requests/rails_request_spec.rb
|