drillbit 2.11.0 → 3.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 +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/lib/drillbit.rb +1 -0
- data/lib/drillbit/accept_header.rb +1 -0
- data/lib/drillbit/authorizable_resource.rb +61 -60
- data/lib/drillbit/authorizers/parameters.rb +1 -0
- data/lib/drillbit/authorizers/parameters/filtering.rb +7 -6
- data/lib/drillbit/authorizers/parameters/inclusions.rb +6 -9
- data/lib/drillbit/authorizers/parameters/resource.rb +20 -19
- data/lib/drillbit/authorizers/query.rb +1 -0
- data/lib/drillbit/authorizers/scope.rb +5 -4
- data/lib/drillbit/compatibility/controllers.rb +1 -0
- data/lib/drillbit/configuration.rb +14 -16
- data/lib/drillbit/errors/invalid_api_request.rb +1 -0
- data/lib/drillbit/errors/invalid_request_body.rb +1 -0
- data/lib/drillbit/errors/invalid_subdomain.rb +1 -0
- data/lib/drillbit/errors/invalid_token.rb +1 -0
- data/lib/drillbit/errors/unpermitted_inclusions.rb +1 -0
- data/lib/drillbit/matchers/accept_header.rb +1 -0
- data/lib/drillbit/matchers/generic.rb +4 -3
- data/lib/drillbit/matchers/subdomain.rb +5 -6
- data/lib/drillbit/matchers/version.rb +3 -2
- data/lib/drillbit/middleware/api_request_validator.rb +4 -3
- data/lib/drillbit/middleware/parameter_parser.rb +1 -0
- data/lib/drillbit/middleware/token_processor.rb +1 -0
- data/lib/drillbit/parameters/filter.rb +12 -11
- data/lib/drillbit/parameters/index.rb +3 -2
- data/lib/drillbit/parameters/page.rb +1 -0
- data/lib/drillbit/parameters/sort.rb +1 -0
- data/lib/drillbit/requests/base.rb +1 -1
- data/lib/drillbit/requests/rack.rb +3 -0
- data/lib/drillbit/requests/rails.rb +1 -0
- data/lib/drillbit/resource.rb +1 -0
- data/lib/drillbit/resource/model.rb +5 -4
- data/lib/drillbit/resource/naming.rb +11 -10
- data/lib/drillbit/resource/processors/filtering.rb +1 -0
- data/lib/drillbit/resource/processors/indexing.rb +1 -0
- data/lib/drillbit/resource/processors/paging.rb +4 -3
- data/lib/drillbit/resource/processors/sorting.rb +1 -0
- data/lib/drillbit/responses/invalid_api_request.rb +3 -0
- data/lib/drillbit/responses/invalid_request_body.rb +3 -0
- data/lib/drillbit/responses/invalid_subdomain.rb +3 -0
- data/lib/drillbit/responses/invalid_token.rb +3 -0
- data/lib/drillbit/serializers/json_api.rb +12 -11
- data/lib/drillbit/tokens/base64.rb +1 -0
- data/lib/drillbit/tokens/base64s/invalid.rb +1 -0
- data/lib/drillbit/tokens/base64s/null.rb +1 -0
- data/lib/drillbit/tokens/invalid.rb +1 -0
- data/lib/drillbit/tokens/json_web_token.rb +6 -5
- data/lib/drillbit/tokens/json_web_tokens/invalid.rb +1 -0
- data/lib/drillbit/tokens/json_web_tokens/null.rb +1 -0
- data/lib/drillbit/tokens/json_web_tokens/password_reset.rb +1 -0
- data/lib/drillbit/tokens/null.rb +1 -0
- data/lib/drillbit/utilities/string.rb +1 -0
- data/lib/drillbit/version.rb +2 -1
- metadata +28 -94
- metadata.gz.sig +0 -0
- data/Rakefile +0 -2
- data/spec/drillbit/accept_header_spec.rb +0 -119
- data/spec/drillbit/authorizers/parameters/filtering_spec.rb +0 -101
- data/spec/drillbit/authorizers/parameters/resource_spec.rb +0 -12
- data/spec/drillbit/authorizers/parameters_spec.rb +0 -19
- data/spec/drillbit/authorizers/query_spec.rb +0 -24
- data/spec/drillbit/authorizers/scope_spec.rb +0 -21
- data/spec/drillbit/errors/invalid_api_request_spec.rb +0 -31
- data/spec/drillbit/errors/invalid_request_body_spec.rb +0 -25
- data/spec/drillbit/errors/invalid_subdomain_spec.rb +0 -30
- data/spec/drillbit/errors/invalid_token_spec.rb +0 -24
- data/spec/drillbit/invalid_subdomain_spec.rb +0 -45
- data/spec/drillbit/invalid_token_spec.rb +0 -44
- data/spec/drillbit/matchers/accept_header_spec.rb +0 -114
- data/spec/drillbit/matchers/subdomain_spec.rb +0 -78
- data/spec/drillbit/matchers/version_spec.rb +0 -86
- data/spec/drillbit/middleware/api_request_validator_spec.rb +0 -185
- data/spec/drillbit/middleware/parameter_parser_spec.rb +0 -200
- data/spec/drillbit/middleware/token_processor_spec.rb +0 -27
- data/spec/drillbit/requests/base_spec.rb +0 -37
- data/spec/drillbit/requests/rack_spec.rb +0 -252
- data/spec/drillbit/requests/rails_spec.rb +0 -264
- data/spec/drillbit/resource/model_spec.rb +0 -64
- data/spec/drillbit/resource/processors/filtering_spec.rb +0 -106
- data/spec/drillbit/resource/processors/indexing_spec.rb +0 -45
- data/spec/drillbit/resource/processors/paging_spec.rb +0 -74
- data/spec/drillbit/resource/processors/sorting_spec.rb +0 -66
- data/spec/drillbit/tokens/base64_spec.rb +0 -44
- data/spec/drillbit/tokens/json_web_token_spec.rb +0 -231
- data/spec/drillbit/tokens/json_web_tokens/password_reset_spec.rb +0 -43
- data/spec/fixtures/test_rsa_key +0 -27
- data/spec/fixtures/test_rsa_key.pub +0 -9
- data/spec/spec_helper.rb +0 -4
- data/spec/support/private_keys.rb +0 -42
@@ -1,12 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'drillbit/requests/base'
|
3
4
|
|
4
5
|
module Drillbit
|
5
6
|
module Matchers
|
6
7
|
module Generic
|
7
|
-
attr_accessor :
|
8
|
-
|
9
|
-
:
|
8
|
+
attr_accessor :request
|
9
|
+
attr_writer :application,
|
10
|
+
:accept_header
|
10
11
|
|
11
12
|
def initialize(**args)
|
12
13
|
args.each do |variable, value|
|
@@ -1,7 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module Drillbit
|
3
4
|
module Matchers
|
4
5
|
class Subdomain
|
6
|
+
attr_accessor :allowed_api_subdomains,
|
7
|
+
:allowed_subdomains,
|
8
|
+
:request
|
9
|
+
|
5
10
|
def initialize(allowed_subdomains: Drillbit.configuration.allowed_subdomains,
|
6
11
|
allowed_api_subdomains: Drillbit.configuration.allowed_api_subdomains)
|
7
12
|
|
@@ -20,12 +25,6 @@ class Subdomain
|
|
20
25
|
|
21
26
|
allowed_api_subdomains.include? request.subdomain
|
22
27
|
end
|
23
|
-
|
24
|
-
protected
|
25
|
-
|
26
|
-
attr_accessor :allowed_subdomains,
|
27
|
-
:allowed_api_subdomains,
|
28
|
-
:request
|
29
28
|
end
|
30
29
|
end
|
31
30
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'drillbit/configuration'
|
3
4
|
require 'drillbit/matchers/generic'
|
4
5
|
|
@@ -7,8 +8,8 @@ module Matchers
|
|
7
8
|
class Version
|
8
9
|
include Generic
|
9
10
|
|
10
|
-
attr_accessor :version_constraint
|
11
|
-
|
11
|
+
attr_accessor :version_constraint
|
12
|
+
attr_writer :default_version
|
12
13
|
|
13
14
|
def matches?(request)
|
14
15
|
super
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'drillbit/configuration'
|
3
4
|
require 'drillbit/matchers/subdomain'
|
4
5
|
require 'drillbit/matchers/accept_header'
|
@@ -27,9 +28,9 @@ class ApiRequestValidator
|
|
27
28
|
return Responses::InvalidApiRequest.call(env) if subdomain_matcher.matches_api_subdomain?(request) &&
|
28
29
|
!accept_header_matcher.matches?(request)
|
29
30
|
|
30
|
-
env['CONTENT_TYPE'] = env['CONTENT_TYPE']
|
31
|
-
|
32
|
-
|
31
|
+
env['CONTENT_TYPE'] = env['CONTENT_TYPE']
|
32
|
+
.to_s
|
33
|
+
.gsub(JSON_API_MIME_TYPE_PATTERN, 'application/json')
|
33
34
|
|
34
35
|
@app.call(env)
|
35
36
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module Drillbit
|
3
4
|
class Parameters
|
4
5
|
class Filter
|
@@ -29,9 +30,9 @@ class Filter
|
|
29
30
|
|
30
31
|
def compacted_parameters
|
31
32
|
@compacted_parameters ||= raw_parameters.reject do |name, value|
|
32
|
-
|
33
|
-
|
34
|
-
|
33
|
+
name == 'query' ||
|
34
|
+
value == '' ||
|
35
|
+
value.nil?
|
35
36
|
end
|
36
37
|
end
|
37
38
|
|
@@ -39,20 +40,20 @@ class Filter
|
|
39
40
|
def format_value(value)
|
40
41
|
return value unless value.is_a?(String)
|
41
42
|
|
42
|
-
if range_points
|
43
|
+
if range_points = value.match(DATE_RANGE)
|
43
44
|
exclusive = value.include? '...'
|
44
45
|
starting_point = Time.iso8601(range_points[1])
|
45
46
|
ending_point = Time.iso8601(range_points[2])
|
46
47
|
|
47
48
|
Range.new(starting_point, ending_point, exclusive)
|
48
49
|
elsif range_points = value.match(NUMERICAL_RANGE)
|
49
|
-
exclusive
|
50
|
-
starting_point
|
51
|
-
ending_point
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
50
|
+
exclusive = value.include? '...'
|
51
|
+
starting_point = range_points[1].to_f
|
52
|
+
ending_point = if range_points[2] == 'Infinity'
|
53
|
+
9_999_999
|
54
|
+
else
|
55
|
+
range_points[2].to_f
|
56
|
+
end
|
56
57
|
|
57
58
|
Range.new(starting_point, ending_point, exclusive)
|
58
59
|
else
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module Drillbit
|
3
4
|
class Parameters
|
4
5
|
class Index
|
@@ -22,8 +23,8 @@ class Index
|
|
22
23
|
|
23
24
|
def compacted_parameters
|
24
25
|
@compacted_parameters ||= raw_parameters.reject do |_name, value|
|
25
|
-
|
26
|
-
|
26
|
+
value == '' ||
|
27
|
+
value.nil?
|
27
28
|
end
|
28
29
|
end
|
29
30
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'drillbit/tokens/json_web_tokens/invalid'
|
3
4
|
require 'drillbit/tokens/json_web_token'
|
4
5
|
|
@@ -32,7 +33,6 @@ class Base
|
|
32
33
|
end
|
33
34
|
end
|
34
35
|
|
35
|
-
# rubocop:disable Style/ClosingParenthesisIndentation
|
36
36
|
def authorization_token
|
37
37
|
if (
|
38
38
|
!authorization_token_from_header.blank? &&
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'drillbit/configuration'
|
3
4
|
require 'drillbit/requests/base'
|
4
5
|
require 'drillbit/accept_header'
|
@@ -35,9 +36,11 @@ class Rack < Base
|
|
35
36
|
request['HTTP_ACCEPT']
|
36
37
|
end
|
37
38
|
|
39
|
+
# rubocop:disable Lint/UriEscapeUnescape
|
38
40
|
def raw_accept_header_from_params
|
39
41
|
URI.unescape(request['QUERY_STRING'][ACCEPT_PARAM_PATTERN, 1] || '')
|
40
42
|
end
|
43
|
+
# rubocop:enable Lint/UriEscapeUnescape
|
41
44
|
|
42
45
|
def raw_authorization_header
|
43
46
|
request['HTTP_AUTHORIZATION'] || ''
|
data/lib/drillbit/resource.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'drillbit/resource/processors/filtering'
|
3
4
|
require 'drillbit/resource/processors/sorting'
|
4
5
|
require 'drillbit/resource/processors/paging'
|
@@ -10,8 +11,8 @@ class Model
|
|
10
11
|
DEFAULT_PROCESSORS = %w{filtering sorting paging indexing}.freeze
|
11
12
|
|
12
13
|
attr_accessor :resource,
|
13
|
-
:parameters
|
14
|
-
|
14
|
+
:parameters
|
15
|
+
attr_reader :processors
|
15
16
|
|
16
17
|
def initialize(resource:, parameters:, **options)
|
17
18
|
self.resource = resource
|
@@ -21,13 +22,13 @@ class Model
|
|
21
22
|
|
22
23
|
def processed
|
23
24
|
@processed ||= processors.inject(resource) do |processed_resource, processor|
|
24
|
-
|
25
|
+
processor.processed(processed_resource, parameters)
|
25
26
|
end
|
26
27
|
end
|
27
28
|
|
28
29
|
def meta
|
29
30
|
@meta ||= processors.inject({}) do |metadata, processor|
|
30
|
-
|
31
|
+
metadata.merge processor.meta(processed, parameters)
|
31
32
|
end
|
32
33
|
end
|
33
34
|
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
# rubocop:disable Metrics/LineLength
|
3
4
|
module Drillbit
|
4
5
|
module Resource
|
@@ -7,22 +8,22 @@ module Naming
|
|
7
8
|
|
8
9
|
module ClassMethods
|
9
10
|
def plural_resource_name
|
10
|
-
@plural_resource_name ||= name[CONTROLLER_RESOURCE_NAME_PATTERN, 3]
|
11
|
-
|
12
|
-
|
13
|
-
|
11
|
+
@plural_resource_name ||= name[CONTROLLER_RESOURCE_NAME_PATTERN, 3]
|
12
|
+
.underscore
|
13
|
+
.pluralize
|
14
|
+
.downcase
|
14
15
|
end
|
15
16
|
|
16
17
|
def singular_resource_name
|
17
|
-
@singular_resource_name ||= name[CONTROLLER_RESOURCE_NAME_PATTERN, 3]
|
18
|
-
|
19
|
-
|
20
|
-
|
18
|
+
@singular_resource_name ||= name[CONTROLLER_RESOURCE_NAME_PATTERN, 3]
|
19
|
+
.underscore
|
20
|
+
.singularize
|
21
|
+
.downcase
|
21
22
|
end
|
22
23
|
|
23
24
|
def resource_class_name
|
24
|
-
@resource_class_name ||= singular_resource_name
|
25
|
-
|
25
|
+
@resource_class_name ||= singular_resource_name
|
26
|
+
.camelize
|
26
27
|
end
|
27
28
|
end
|
28
29
|
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'drillbit/parameters/page'
|
3
4
|
|
4
5
|
module Drillbit
|
@@ -26,9 +27,9 @@ class Paging
|
|
26
27
|
def processed
|
27
28
|
return resource unless parameters.present?
|
28
29
|
|
29
|
-
resource
|
30
|
-
|
31
|
-
|
30
|
+
resource
|
31
|
+
.page(parameters.page_number)
|
32
|
+
.per(parameters.per_page)
|
32
33
|
end
|
33
34
|
|
34
35
|
def meta
|
@@ -1,9 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'drillbit/errors/invalid_api_request'
|
3
4
|
|
4
5
|
module Drillbit
|
5
6
|
module Responses
|
6
7
|
class InvalidApiRequest
|
8
|
+
# rubocop:disable Style/InlineComment
|
7
9
|
def self.call(env)
|
8
10
|
error = Drillbit::Errors::InvalidApiRequest.new(accept_header: env['HTTP_ACCEPT'])
|
9
11
|
|
@@ -13,6 +15,7 @@ class InvalidApiRequest
|
|
13
15
|
["{\"errors\": [#{error.to_json}]}"], # Message
|
14
16
|
]
|
15
17
|
end
|
18
|
+
# rubocop:enable Style/InlineComment
|
16
19
|
end
|
17
20
|
end
|
18
21
|
end
|
@@ -1,9 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'drillbit/errors/invalid_request_body'
|
3
4
|
|
4
5
|
module Drillbit
|
5
6
|
module Responses
|
6
7
|
class InvalidRequestBody
|
8
|
+
# rubocop:disable Style/InlineComment
|
7
9
|
def self.call(env)
|
8
10
|
error = Drillbit::Errors::InvalidRequestBody.new(request_body: env['RACK_INPUT'])
|
9
11
|
|
@@ -13,6 +15,7 @@ class InvalidRequestBody
|
|
13
15
|
["{\"errors\": [#{error.to_json}]}"], # Message
|
14
16
|
]
|
15
17
|
end
|
18
|
+
# rubocop:enable Style/InlineComment
|
16
19
|
end
|
17
20
|
end
|
18
21
|
end
|
@@ -1,9 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'drillbit/errors/invalid_subdomain'
|
3
4
|
|
4
5
|
module Drillbit
|
5
6
|
module Responses
|
6
7
|
class InvalidSubdomain
|
8
|
+
# rubocop:disable Style/InlineComment
|
7
9
|
def self.call(env)
|
8
10
|
error = Drillbit::Errors::InvalidSubdomain.new(http_host: env['HTTP_HOST'])
|
9
11
|
|
@@ -13,6 +15,7 @@ class InvalidSubdomain
|
|
13
15
|
["{\"errors\": [#{error.to_json}]}"], # Message
|
14
16
|
]
|
15
17
|
end
|
18
|
+
# rubocop:enable Style/InlineComment
|
16
19
|
end
|
17
20
|
end
|
18
21
|
end
|
@@ -1,9 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'drillbit/errors/invalid_token'
|
3
4
|
|
4
5
|
module Drillbit
|
5
6
|
module Responses
|
6
7
|
class InvalidToken
|
8
|
+
# rubocop:disable Style/InlineComment
|
7
9
|
def self.call(_env, application_name:)
|
8
10
|
error = Drillbit::Errors::InvalidToken.new
|
9
11
|
|
@@ -15,6 +17,7 @@ class InvalidToken
|
|
15
17
|
["{\"errors\": [#{error.to_json}]}"], # Message
|
16
18
|
]
|
17
19
|
end
|
20
|
+
# rubocop:enable Style/InlineComment
|
18
21
|
end
|
19
22
|
end
|
20
23
|
end
|