apill 2.2.0 → 2.3.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/Rakefile +1 -1
- data/lib/apill/accept_header.rb +1 -1
- data/lib/apill/errors/invalid_api_request_error.rb +2 -1
- data/lib/apill/matchers/generic_matcher.rb +1 -1
- data/lib/apill/middleware/api_request.rb +1 -2
- data/lib/apill/mixins/pageable.rb +51 -0
- data/lib/apill/mixins/queryable.rb +54 -0
- data/lib/apill/mixins/sortable.rb +49 -0
- data/lib/apill/requests/base.rb +0 -2
- data/lib/apill/requests/rack_request.rb +1 -1
- data/lib/apill/responses/invalid_api_request_response.rb +1 -1
- data/lib/apill/responses/invalid_subdomain_response.rb +1 -1
- data/lib/apill/version.rb +1 -1
- data/lib/apill.rb +5 -1
- data/spec/apill/accept_header_spec.rb +34 -32
- data/spec/apill/errors/invalid_api_request_error_spec.rb +5 -2
- data/spec/apill/invalid_subdomain_response_spec.rb +8 -5
- data/spec/apill/matchers/accept_header_matcher_spec.rb +2 -1
- data/spec/apill/middleware/api_request_spec.rb +24 -18
- data/spec/apill/requests/rack_request_spec.rb +2 -2
- metadata +20 -6
- data/lib/apill/matchers/invalid_api_request_matcher.rb +0 -11
- data/spec/apill/matchers/invalid_api_request_matcher_spec.rb +0 -21
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c80e6572755af69fbfa5998dabbf1231921a72c9
|
4
|
+
data.tar.gz: 2727edeb979c451907dbd1e3ef15cc1bf4fb98b5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a92ed1e2312cfca05317328b48c3e5e5b8bd93c2c246aefed7f479775744b9ab1ca31ea24d74d7a4de0c4421ac31848b50838089449f3ce503f80da441963ca1
|
7
|
+
data.tar.gz: 5c6262450fcbd115923654bd86658e0378d566c98bdb46620df70f45129827e40aab6f74f86aba553217c1f8d56eb181a1e70614f4670be050e28c7d0ace3004
|
data/Rakefile
CHANGED
@@ -1 +1 @@
|
|
1
|
-
require
|
1
|
+
require 'bundler/gem_tasks'
|
data/lib/apill/accept_header.rb
CHANGED
@@ -10,7 +10,8 @@ class InvalidApiRequestError < HumanError::Errors::RequestError
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def developer_message
|
13
|
-
'The accept header that you passed in the request cannot be parsed,
|
13
|
+
'The accept header that you passed in the request cannot be parsed, ' \
|
14
|
+
'please refer to the documentation to verify.'
|
14
15
|
end
|
15
16
|
|
16
17
|
def developer_details
|
@@ -1,7 +1,6 @@
|
|
1
|
-
require 'json'
|
2
1
|
require 'apill/configuration'
|
3
2
|
require 'apill/matchers/subdomain_matcher'
|
4
|
-
require 'apill/matchers/
|
3
|
+
require 'apill/matchers/accept_header_matcher'
|
5
4
|
require 'apill/responses/invalid_api_request_response'
|
6
5
|
require 'apill/responses/invalid_subdomain_response'
|
7
6
|
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module Apill
|
2
|
+
module Mixins
|
3
|
+
module Pageable
|
4
|
+
module ClassMethods
|
5
|
+
def paginate(model)
|
6
|
+
define_method(:paginated_model_name) do
|
7
|
+
model
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.included(base)
|
13
|
+
base.extend ClassMethods
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def filtered_resource
|
19
|
+
@filtered_resource ||= begin
|
20
|
+
page_number = params[:page]
|
21
|
+
items_per_page = params[:per_page]
|
22
|
+
|
23
|
+
resource = if defined? super
|
24
|
+
super
|
25
|
+
else
|
26
|
+
send(paginated_model_name)
|
27
|
+
end
|
28
|
+
|
29
|
+
resource.
|
30
|
+
page(page_number).
|
31
|
+
per(items_per_page)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def filter_data
|
36
|
+
filter_data = defined?(super) ? super : {}
|
37
|
+
|
38
|
+
filter_data.merge(pagination_data)
|
39
|
+
end
|
40
|
+
|
41
|
+
def pagination_data
|
42
|
+
{
|
43
|
+
total_pages: filtered_resource.total_pages,
|
44
|
+
current_page: filtered_resource.current_page,
|
45
|
+
previous_page: filtered_resource.prev_page,
|
46
|
+
next_page: filtered_resource.next_page,
|
47
|
+
}
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module Apill
|
2
|
+
module Mixins
|
3
|
+
module Queryable
|
4
|
+
module ClassMethods
|
5
|
+
def query(model)
|
6
|
+
define_method(:queryed_model_name) do
|
7
|
+
model
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.included(base)
|
13
|
+
base.extend ClassMethods
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def filtered_resource
|
19
|
+
@filtered_resource ||= begin
|
20
|
+
resource = if defined? super
|
21
|
+
super
|
22
|
+
else
|
23
|
+
send(queryed_model_name)
|
24
|
+
end
|
25
|
+
|
26
|
+
sanitized_query_params.reduce(resource) do |query_resource, query_param|
|
27
|
+
key, value = query_param
|
28
|
+
|
29
|
+
query_resource.public_send(query_method_name_for(key, query_resource), value)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def query_params
|
35
|
+
@query_params ||= params.fetch(:query_params, {})
|
36
|
+
end
|
37
|
+
|
38
|
+
def sanitized_query_params
|
39
|
+
query_attrs = respond_to?(:queryable_attributes) ? queryable_attributes : {}
|
40
|
+
|
41
|
+
query_params.
|
42
|
+
slice(*query_attrs)
|
43
|
+
end
|
44
|
+
|
45
|
+
def query_method_name_for(query_item, resource)
|
46
|
+
if resource.respond_to? "for_#{query_item}"
|
47
|
+
"for_#{query_item}"
|
48
|
+
elsif resource.respond_to? query_item
|
49
|
+
query_item
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module Apill
|
2
|
+
module Mixins
|
3
|
+
module Sortable
|
4
|
+
module ClassMethods
|
5
|
+
def sort(model)
|
6
|
+
define_method(:sorted_model_name) do
|
7
|
+
model
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.included(base)
|
13
|
+
base.extend ClassMethods
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def filtered_resource
|
19
|
+
@filtered_resource ||= begin
|
20
|
+
resource = if defined? super
|
21
|
+
super
|
22
|
+
else
|
23
|
+
send(sorted_model_name)
|
24
|
+
end
|
25
|
+
|
26
|
+
resource.
|
27
|
+
order(sorting_arguments)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def sorting_arguments
|
32
|
+
sorting_data.values.join(' ')
|
33
|
+
end
|
34
|
+
|
35
|
+
def filter_data
|
36
|
+
filter_data = defined?(super) ? super : {}
|
37
|
+
|
38
|
+
filter_data.merge(sorting_data)
|
39
|
+
end
|
40
|
+
|
41
|
+
def sorting_data
|
42
|
+
{
|
43
|
+
sort: params.fetch(:sort, 'created_at'),
|
44
|
+
direction: params.fetch(:direction, 'DESC'),
|
45
|
+
}
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/lib/apill/requests/base.rb
CHANGED
data/lib/apill/version.rb
CHANGED
data/lib/apill.rb
CHANGED
@@ -1,10 +1,14 @@
|
|
1
|
+
require 'kaminari'
|
2
|
+
|
1
3
|
require 'apill/version'
|
2
4
|
|
3
5
|
require 'apill/configuration'
|
4
6
|
require 'apill/matchers/accept_header_matcher'
|
5
|
-
require 'apill/matchers/invalid_api_request_matcher'
|
6
7
|
require 'apill/matchers/subdomain_matcher'
|
7
8
|
require 'apill/matchers/version_matcher'
|
9
|
+
require 'apill/mixins/sortable'
|
10
|
+
require 'apill/mixins/queryable'
|
11
|
+
require 'apill/mixins/pageable'
|
8
12
|
|
9
13
|
require 'apill/middleware/api_request'
|
10
14
|
|
@@ -4,101 +4,103 @@ require 'apill/accept_header'
|
|
4
4
|
module Apill
|
5
5
|
describe AcceptHeader do
|
6
6
|
it 'can validate an accept header with all the pieces of information' do
|
7
|
-
header = AcceptHeader.new(application:
|
8
|
-
header:
|
7
|
+
header = AcceptHeader.new(application: 'matrix',
|
8
|
+
header: 'application/vnd.matrix+zion;version=1.0.0')
|
9
9
|
|
10
10
|
expect(header).to be_valid
|
11
11
|
end
|
12
12
|
|
13
13
|
it 'does not validate an accept header without passing an application' do
|
14
|
-
header = AcceptHeader.new(application:
|
15
|
-
header:
|
14
|
+
header = AcceptHeader.new(application: '',
|
15
|
+
header: 'application/vnd.matrix+zion;version=1.0.0')
|
16
16
|
|
17
17
|
expect(header).not_to be_valid
|
18
18
|
end
|
19
19
|
|
20
20
|
it 'does not validate an accept header if it is not passed in' do
|
21
|
-
header = AcceptHeader.new(application:
|
22
|
-
header:
|
21
|
+
header = AcceptHeader.new(application: '',
|
22
|
+
header: '')
|
23
23
|
|
24
24
|
expect(header).not_to be_valid
|
25
25
|
|
26
|
-
header = AcceptHeader.new(application:
|
27
|
-
header:
|
26
|
+
header = AcceptHeader.new(application: '',
|
27
|
+
header: nil)
|
28
28
|
|
29
29
|
expect(header).not_to be_valid
|
30
30
|
end
|
31
31
|
|
32
32
|
it 'does not validate an accept header without an application in the header' do
|
33
|
-
header = AcceptHeader.new(application:
|
34
|
-
header:
|
33
|
+
header = AcceptHeader.new(application: 'matrix',
|
34
|
+
header: 'application/vnd.+zion;version=1.0.0')
|
35
35
|
|
36
36
|
expect(header).not_to be_valid
|
37
37
|
|
38
|
-
header = AcceptHeader.new(application:
|
39
|
-
header:
|
38
|
+
header = AcceptHeader.new(application: 'matrix',
|
39
|
+
header: 'application/+zion;version=1.0.0')
|
40
40
|
|
41
41
|
expect(header).not_to be_valid
|
42
42
|
|
43
|
-
header = AcceptHeader.new(application:
|
44
|
-
header:
|
43
|
+
header = AcceptHeader.new(application: 'matrix',
|
44
|
+
header: 'application/matrix+zion;version=1.0.0')
|
45
45
|
|
46
46
|
expect(header).not_to be_valid
|
47
47
|
end
|
48
48
|
|
49
49
|
it 'does not validate an accept header with an invalid version' do
|
50
|
-
header = AcceptHeader.new(application:
|
51
|
-
header:
|
50
|
+
header = AcceptHeader.new(application: 'matrix',
|
51
|
+
header: 'application/vnd.matrix+zion;version=10..0')
|
52
52
|
|
53
53
|
expect(header).not_to be_valid
|
54
54
|
|
55
|
-
header = AcceptHeader.new(application:
|
56
|
-
header:
|
55
|
+
header = AcceptHeader.new(application: 'matrix',
|
56
|
+
header: 'application/vnd.matrix+zion;version=neo')
|
57
57
|
|
58
58
|
expect(header).not_to be_valid
|
59
59
|
|
60
|
-
header = AcceptHeader.new(application:
|
61
|
-
header:
|
60
|
+
header = AcceptHeader.new(application: 'matrix',
|
61
|
+
header: 'application/vnd.matrix+zion;version=')
|
62
62
|
|
63
63
|
expect(header).not_to be_valid
|
64
64
|
|
65
|
-
header = AcceptHeader.new(application:
|
66
|
-
header:
|
65
|
+
header = AcceptHeader.new(application: 'matrix',
|
66
|
+
header: 'application/vnd.matrix+zion;10.0')
|
67
67
|
|
68
68
|
expect(header).not_to be_valid
|
69
69
|
end
|
70
70
|
|
71
71
|
it 'does validate an accept header even with a missing content type' do
|
72
|
-
header = AcceptHeader.new(application:
|
73
|
-
header:
|
72
|
+
header = AcceptHeader.new(application: 'matrix',
|
73
|
+
header: 'application/vnd.matrix;version=10.0')
|
74
74
|
|
75
75
|
expect(header).to be_valid
|
76
76
|
end
|
77
77
|
|
78
78
|
it 'does validate an accept header with only the minimal information' do
|
79
|
-
header = AcceptHeader.new(application:
|
80
|
-
header:
|
79
|
+
header = AcceptHeader.new(application: 'matrix',
|
80
|
+
header: 'application/vnd.matrix')
|
81
81
|
|
82
82
|
expect(header).to be_valid
|
83
83
|
end
|
84
84
|
|
85
85
|
it 'does validate an accept header with only a content type but no version' do
|
86
|
-
header = AcceptHeader.new(application:
|
87
|
-
header:
|
86
|
+
header = AcceptHeader.new(application: 'matrix',
|
87
|
+
header: 'application/vnd.matrix+zion')
|
88
88
|
|
89
89
|
expect(header).to be_valid
|
90
90
|
end
|
91
91
|
|
92
92
|
it 'can extract version information from an accept header' do
|
93
|
-
header = AcceptHeader.new(
|
94
|
-
|
93
|
+
header = AcceptHeader.new(
|
94
|
+
application: 'matrix',
|
95
|
+
header: 'application/vnd.matrix+zion;version=10.0.0beta1')
|
95
96
|
|
96
97
|
expect(header.version).to eql '10.0.0beta1'
|
97
98
|
end
|
98
99
|
|
99
100
|
it 'can extract the content type from an accept header' do
|
100
|
-
header = AcceptHeader.new(
|
101
|
-
|
101
|
+
header = AcceptHeader.new(
|
102
|
+
application: 'matrix',
|
103
|
+
header: 'application/vnd.matrix+zion;version=10.0.0beta1')
|
102
104
|
|
103
105
|
expect(header.content_type).to eql 'zion'
|
104
106
|
end
|
@@ -19,7 +19,9 @@ describe InvalidApiRequestError do
|
|
19
19
|
end
|
20
20
|
|
21
21
|
it 'can output the developer message' do
|
22
|
-
expect(error.developer_message).to eql 'The accept header that you passed in the
|
22
|
+
expect(error.developer_message).to eql 'The accept header that you passed in the ' \
|
23
|
+
'request cannot be parsed, please refer to ' \
|
24
|
+
'the documentation to verify.'
|
23
25
|
end
|
24
26
|
|
25
27
|
it 'can output the developer details' do
|
@@ -29,7 +31,8 @@ describe InvalidApiRequestError do
|
|
29
31
|
end
|
30
32
|
|
31
33
|
it 'can output the friendly message' do
|
32
|
-
expect(error.friendly_message).to eql "Sorry! We couldn't understand what you were
|
34
|
+
expect(error.friendly_message).to eql "Sorry! We couldn't understand what you were " \
|
35
|
+
'trying to ask us to do.'
|
33
36
|
end
|
34
37
|
end
|
35
38
|
end
|
@@ -27,17 +27,20 @@ describe InvalidSubdomainResponse do
|
|
27
27
|
'"developer_documentation_uri":"http://error.com/1010?version=1",' \
|
28
28
|
'"customer_support_uri":"http://knowledge.com/1234567890",' \
|
29
29
|
'"developer_message_key":"errors.invalid.subdomain.error.developer",' \
|
30
|
-
'"developer_message":"The resource you attempted to access is either not
|
30
|
+
'"developer_message":"The resource you attempted to access is either not ' \
|
31
|
+
'authorized for the authenticated user or does not ' \
|
32
|
+
'exist.",' \
|
31
33
|
'"developer_details":' \
|
32
34
|
'{' \
|
33
35
|
'"http_host":"api.example.com"' \
|
34
36
|
'},' \
|
35
37
|
'"friendly_message_key":"errors.invalid.subdomain.error.friendly",' \
|
36
|
-
'"friendly_message":"Sorry! The resource you tried to access does not
|
38
|
+
'"friendly_message":"Sorry! The resource you tried to access does not ' \
|
39
|
+
'exist."' \
|
37
40
|
'}' \
|
38
|
-
'}'
|
39
|
-
]
|
40
|
-
]
|
41
|
+
'}',
|
42
|
+
],
|
43
|
+
],
|
41
44
|
)
|
42
45
|
end
|
43
46
|
end
|
@@ -32,7 +32,8 @@ describe AcceptHeaderMatcher do
|
|
32
32
|
'secondary parameter' do
|
33
33
|
|
34
34
|
request = {
|
35
|
-
'QUERY_STRING' => 'first=my_param&accept=application/vnd.matrix+zion;
|
35
|
+
'QUERY_STRING' => 'first=my_param&accept=application/vnd.matrix+zion;' \
|
36
|
+
'version=1.0.0',
|
36
37
|
'HTTP_X_APPLICATION_NAME' => 'matrix',
|
37
38
|
}
|
38
39
|
|
@@ -4,7 +4,7 @@ require 'apill/middleware/api_request'
|
|
4
4
|
module Apill
|
5
5
|
module Middleware
|
6
6
|
describe ApiRequest do
|
7
|
-
let(:app) {
|
7
|
+
let(:app) { ->(_env) { [200, {}, 'response'] } }
|
8
8
|
|
9
9
|
before(:each) do
|
10
10
|
HumanError.configure do |config|
|
@@ -23,9 +23,9 @@ describe ApiRequest do
|
|
23
23
|
api_request_middleware = ApiRequest.new(app)
|
24
24
|
|
25
25
|
request = {
|
26
|
-
'HTTP_HOST'
|
27
|
-
'HTTP_ACCEPT'
|
28
|
-
'QUERY_STRING'
|
26
|
+
'HTTP_HOST' => 'notvalid.example.com',
|
27
|
+
'HTTP_ACCEPT' => '',
|
28
|
+
'QUERY_STRING' => 'first=my_param&accept=application/vnd.silent+zion;version=1.0.0',
|
29
29
|
}
|
30
30
|
|
31
31
|
status, headers, response = api_request_middleware.call(request)
|
@@ -42,16 +42,19 @@ describe ApiRequest do
|
|
42
42
|
'"developer_documentation_uri":"http://error.com/1010?version=1",' \
|
43
43
|
'"customer_support_uri":"http://knowledge.com/1234567890",' \
|
44
44
|
'"developer_message_key":"errors.invalid.subdomain.error.developer",' \
|
45
|
-
'"developer_message":"The resource you attempted to access is either not
|
45
|
+
'"developer_message":"The resource you attempted to access is either not ' \
|
46
|
+
'authorized for the authenticated user or does not ' \
|
47
|
+
'exist.",' \
|
46
48
|
'"developer_details":' \
|
47
49
|
'{' \
|
48
50
|
'"http_host":"notvalid.example.com"' \
|
49
51
|
'},' \
|
50
52
|
'"friendly_message_key":"errors.invalid.subdomain.error.friendly",' \
|
51
|
-
'"friendly_message":"Sorry! The resource you tried to access does not
|
53
|
+
'"friendly_message":"Sorry! The resource you tried to access does not ' \
|
54
|
+
'exist."' \
|
52
55
|
'}' \
|
53
|
-
'}'
|
54
|
-
]
|
56
|
+
'}',
|
57
|
+
],
|
55
58
|
)
|
56
59
|
end
|
57
60
|
|
@@ -61,9 +64,9 @@ describe ApiRequest do
|
|
61
64
|
api_request_middleware = ApiRequest.new(app)
|
62
65
|
|
63
66
|
request = {
|
64
|
-
'HTTP_HOST'
|
65
|
-
'HTTP_ACCEPT'
|
66
|
-
'QUERY_STRING'
|
67
|
+
'HTTP_HOST' => 'api.example.com',
|
68
|
+
'HTTP_ACCEPT' => '',
|
69
|
+
'QUERY_STRING' => 'first=my_param&accept=application/vnd.silent+zion;version=1.0.0',
|
67
70
|
}
|
68
71
|
|
69
72
|
status, headers, response = api_request_middleware.call(request)
|
@@ -80,16 +83,19 @@ describe ApiRequest do
|
|
80
83
|
'"developer_documentation_uri":"http://error.com/1007?version=1",' \
|
81
84
|
'"customer_support_uri":"http://knowledge.com/1234567890",' \
|
82
85
|
'"developer_message_key":"errors.invalid.api.request.error.developer",' \
|
83
|
-
'"developer_message":"The accept header that you passed in the request
|
86
|
+
'"developer_message":"The accept header that you passed in the request ' \
|
87
|
+
'cannot be parsed, please refer to the documentation ' \
|
88
|
+
'to verify.",' \
|
84
89
|
'"developer_details":' \
|
85
90
|
'{' \
|
86
91
|
'"accept_header":""' \
|
87
92
|
'},' \
|
88
93
|
'"friendly_message_key":"errors.invalid.api.request.error.friendly",' \
|
89
|
-
'"friendly_message":"Sorry! We couldn\'t understand what you were trying
|
94
|
+
'"friendly_message":"Sorry! We couldn\'t understand what you were trying ' \
|
95
|
+
'to ask us to do."' \
|
90
96
|
'}' \
|
91
|
-
'}'
|
92
|
-
]
|
97
|
+
'}',
|
98
|
+
],
|
93
99
|
)
|
94
100
|
end
|
95
101
|
|
@@ -97,9 +103,9 @@ describe ApiRequest do
|
|
97
103
|
api_request_middleware = ApiRequest.new(app)
|
98
104
|
|
99
105
|
request = {
|
100
|
-
'HTTP_HOST'
|
101
|
-
'HTTP_ACCEPT'
|
102
|
-
'QUERY_STRING'
|
106
|
+
'HTTP_HOST' => 'api.example.com',
|
107
|
+
'HTTP_ACCEPT' => 'application/vnd.matrix+zion;version=1.0.0',
|
108
|
+
'QUERY_STRING' => 'first=my_param&accept=application/vnd.matrix+zion;version=1.0.0',
|
103
109
|
}
|
104
110
|
|
105
111
|
status, headers, response = api_request_middleware.call(request)
|
@@ -45,8 +45,8 @@ describe RackRequest do
|
|
45
45
|
Apill.configuration.application_name = 'zion'
|
46
46
|
|
47
47
|
raw_request = {
|
48
|
-
'HTTP_ACCEPT'
|
49
|
-
'QUERY_STRING'
|
48
|
+
'HTTP_ACCEPT' => '',
|
49
|
+
'QUERY_STRING' => 'accept=application/vnd.zion+zion;version=10.0',
|
50
50
|
}
|
51
51
|
request = RackRequest.new(raw_request)
|
52
52
|
|
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.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- jfelchner
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-01-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: human_error
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.13'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: kaminari
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.16.2
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.16.2
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: rspec
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -82,10 +96,12 @@ files:
|
|
82
96
|
- lib/apill/errors/invalid_subdomain_error.rb
|
83
97
|
- lib/apill/matchers/accept_header_matcher.rb
|
84
98
|
- lib/apill/matchers/generic_matcher.rb
|
85
|
-
- lib/apill/matchers/invalid_api_request_matcher.rb
|
86
99
|
- lib/apill/matchers/subdomain_matcher.rb
|
87
100
|
- lib/apill/matchers/version_matcher.rb
|
88
101
|
- lib/apill/middleware/api_request.rb
|
102
|
+
- lib/apill/mixins/pageable.rb
|
103
|
+
- lib/apill/mixins/queryable.rb
|
104
|
+
- lib/apill/mixins/sortable.rb
|
89
105
|
- lib/apill/requests/base.rb
|
90
106
|
- lib/apill/requests/rack_request.rb
|
91
107
|
- lib/apill/requests/rails_request.rb
|
@@ -97,7 +113,6 @@ files:
|
|
97
113
|
- spec/apill/errors/invalid_subdomain_error_spec.rb
|
98
114
|
- spec/apill/invalid_subdomain_response_spec.rb
|
99
115
|
- spec/apill/matchers/accept_header_matcher_spec.rb
|
100
|
-
- spec/apill/matchers/invalid_api_request_matcher_spec.rb
|
101
116
|
- spec/apill/matchers/subdomain_matcher_spec.rb
|
102
117
|
- spec/apill/matchers/version_matcher_spec.rb
|
103
118
|
- spec/apill/middleware/api_request_spec.rb
|
@@ -123,7 +138,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
123
138
|
version: '0'
|
124
139
|
requirements: []
|
125
140
|
rubyforge_project:
|
126
|
-
rubygems_version: 2.
|
141
|
+
rubygems_version: 2.2.2
|
127
142
|
signing_key:
|
128
143
|
specification_version: 4
|
129
144
|
summary: Common API functionality
|
@@ -133,7 +148,6 @@ test_files:
|
|
133
148
|
- spec/apill/errors/invalid_subdomain_error_spec.rb
|
134
149
|
- spec/apill/invalid_subdomain_response_spec.rb
|
135
150
|
- spec/apill/matchers/accept_header_matcher_spec.rb
|
136
|
-
- spec/apill/matchers/invalid_api_request_matcher_spec.rb
|
137
151
|
- spec/apill/matchers/subdomain_matcher_spec.rb
|
138
152
|
- spec/apill/matchers/version_matcher_spec.rb
|
139
153
|
- spec/apill/middleware/api_request_spec.rb
|
@@ -1,21 +0,0 @@
|
|
1
|
-
require 'ostruct'
|
2
|
-
require 'rspectacular'
|
3
|
-
require 'apill/matchers/invalid_api_request_matcher'
|
4
|
-
|
5
|
-
module Apill
|
6
|
-
module Matchers
|
7
|
-
describe InvalidApiRequestMatcher do
|
8
|
-
it 'is the inverse of whether the accept header matches' do
|
9
|
-
request = {
|
10
|
-
'HTTP_HOST' => 'api.example.com',
|
11
|
-
'HTTP_ACCEPT' => 'application/vnd.matrix+zion;version=1.0.0',
|
12
|
-
'HTTP_X_APPLICATION_NAME' => 'matrix',
|
13
|
-
}
|
14
|
-
|
15
|
-
matcher = InvalidApiRequestMatcher.new
|
16
|
-
|
17
|
-
expect(matcher.matches?(request)).to be_a FalseClass
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|