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.
Files changed (92) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/lib/drillbit.rb +1 -0
  5. data/lib/drillbit/accept_header.rb +1 -0
  6. data/lib/drillbit/authorizable_resource.rb +61 -60
  7. data/lib/drillbit/authorizers/parameters.rb +1 -0
  8. data/lib/drillbit/authorizers/parameters/filtering.rb +7 -6
  9. data/lib/drillbit/authorizers/parameters/inclusions.rb +6 -9
  10. data/lib/drillbit/authorizers/parameters/resource.rb +20 -19
  11. data/lib/drillbit/authorizers/query.rb +1 -0
  12. data/lib/drillbit/authorizers/scope.rb +5 -4
  13. data/lib/drillbit/compatibility/controllers.rb +1 -0
  14. data/lib/drillbit/configuration.rb +14 -16
  15. data/lib/drillbit/errors/invalid_api_request.rb +1 -0
  16. data/lib/drillbit/errors/invalid_request_body.rb +1 -0
  17. data/lib/drillbit/errors/invalid_subdomain.rb +1 -0
  18. data/lib/drillbit/errors/invalid_token.rb +1 -0
  19. data/lib/drillbit/errors/unpermitted_inclusions.rb +1 -0
  20. data/lib/drillbit/matchers/accept_header.rb +1 -0
  21. data/lib/drillbit/matchers/generic.rb +4 -3
  22. data/lib/drillbit/matchers/subdomain.rb +5 -6
  23. data/lib/drillbit/matchers/version.rb +3 -2
  24. data/lib/drillbit/middleware/api_request_validator.rb +4 -3
  25. data/lib/drillbit/middleware/parameter_parser.rb +1 -0
  26. data/lib/drillbit/middleware/token_processor.rb +1 -0
  27. data/lib/drillbit/parameters/filter.rb +12 -11
  28. data/lib/drillbit/parameters/index.rb +3 -2
  29. data/lib/drillbit/parameters/page.rb +1 -0
  30. data/lib/drillbit/parameters/sort.rb +1 -0
  31. data/lib/drillbit/requests/base.rb +1 -1
  32. data/lib/drillbit/requests/rack.rb +3 -0
  33. data/lib/drillbit/requests/rails.rb +1 -0
  34. data/lib/drillbit/resource.rb +1 -0
  35. data/lib/drillbit/resource/model.rb +5 -4
  36. data/lib/drillbit/resource/naming.rb +11 -10
  37. data/lib/drillbit/resource/processors/filtering.rb +1 -0
  38. data/lib/drillbit/resource/processors/indexing.rb +1 -0
  39. data/lib/drillbit/resource/processors/paging.rb +4 -3
  40. data/lib/drillbit/resource/processors/sorting.rb +1 -0
  41. data/lib/drillbit/responses/invalid_api_request.rb +3 -0
  42. data/lib/drillbit/responses/invalid_request_body.rb +3 -0
  43. data/lib/drillbit/responses/invalid_subdomain.rb +3 -0
  44. data/lib/drillbit/responses/invalid_token.rb +3 -0
  45. data/lib/drillbit/serializers/json_api.rb +12 -11
  46. data/lib/drillbit/tokens/base64.rb +1 -0
  47. data/lib/drillbit/tokens/base64s/invalid.rb +1 -0
  48. data/lib/drillbit/tokens/base64s/null.rb +1 -0
  49. data/lib/drillbit/tokens/invalid.rb +1 -0
  50. data/lib/drillbit/tokens/json_web_token.rb +6 -5
  51. data/lib/drillbit/tokens/json_web_tokens/invalid.rb +1 -0
  52. data/lib/drillbit/tokens/json_web_tokens/null.rb +1 -0
  53. data/lib/drillbit/tokens/json_web_tokens/password_reset.rb +1 -0
  54. data/lib/drillbit/tokens/null.rb +1 -0
  55. data/lib/drillbit/utilities/string.rb +1 -0
  56. data/lib/drillbit/version.rb +2 -1
  57. metadata +28 -94
  58. metadata.gz.sig +0 -0
  59. data/Rakefile +0 -2
  60. data/spec/drillbit/accept_header_spec.rb +0 -119
  61. data/spec/drillbit/authorizers/parameters/filtering_spec.rb +0 -101
  62. data/spec/drillbit/authorizers/parameters/resource_spec.rb +0 -12
  63. data/spec/drillbit/authorizers/parameters_spec.rb +0 -19
  64. data/spec/drillbit/authorizers/query_spec.rb +0 -24
  65. data/spec/drillbit/authorizers/scope_spec.rb +0 -21
  66. data/spec/drillbit/errors/invalid_api_request_spec.rb +0 -31
  67. data/spec/drillbit/errors/invalid_request_body_spec.rb +0 -25
  68. data/spec/drillbit/errors/invalid_subdomain_spec.rb +0 -30
  69. data/spec/drillbit/errors/invalid_token_spec.rb +0 -24
  70. data/spec/drillbit/invalid_subdomain_spec.rb +0 -45
  71. data/spec/drillbit/invalid_token_spec.rb +0 -44
  72. data/spec/drillbit/matchers/accept_header_spec.rb +0 -114
  73. data/spec/drillbit/matchers/subdomain_spec.rb +0 -78
  74. data/spec/drillbit/matchers/version_spec.rb +0 -86
  75. data/spec/drillbit/middleware/api_request_validator_spec.rb +0 -185
  76. data/spec/drillbit/middleware/parameter_parser_spec.rb +0 -200
  77. data/spec/drillbit/middleware/token_processor_spec.rb +0 -27
  78. data/spec/drillbit/requests/base_spec.rb +0 -37
  79. data/spec/drillbit/requests/rack_spec.rb +0 -252
  80. data/spec/drillbit/requests/rails_spec.rb +0 -264
  81. data/spec/drillbit/resource/model_spec.rb +0 -64
  82. data/spec/drillbit/resource/processors/filtering_spec.rb +0 -106
  83. data/spec/drillbit/resource/processors/indexing_spec.rb +0 -45
  84. data/spec/drillbit/resource/processors/paging_spec.rb +0 -74
  85. data/spec/drillbit/resource/processors/sorting_spec.rb +0 -66
  86. data/spec/drillbit/tokens/base64_spec.rb +0 -44
  87. data/spec/drillbit/tokens/json_web_token_spec.rb +0 -231
  88. data/spec/drillbit/tokens/json_web_tokens/password_reset_spec.rb +0 -43
  89. data/spec/fixtures/test_rsa_key +0 -27
  90. data/spec/fixtures/test_rsa_key.pub +0 -9
  91. data/spec/spec_helper.rb +0 -4
  92. data/spec/support/private_keys.rb +0 -42
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'erratum'
3
4
 
4
5
  module Drillbit
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'erratum'
3
4
 
4
5
  module Drillbit
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'erratum'
3
4
 
4
5
  module Drillbit
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'erratum'
3
4
 
4
5
  module Drillbit
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'erratum'
3
4
 
4
5
  module Drillbit
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'drillbit/matchers/generic'
3
4
 
4
5
  module Drillbit
@@ -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 :application,
8
- :accept_header,
9
- :request
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
- :default_version
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
- to_s.
32
- gsub(JSON_API_MIME_TYPE_PATTERN, 'application/json')
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
  require 'json'
3
4
  require 'stringio'
4
5
  require 'drillbit/responses/invalid_request_body'
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'drillbit/requests/base'
3
4
  require 'drillbit/responses/invalid_token'
4
5
 
@@ -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
- name == 'query' ||
33
- value == '' ||
34
- value.nil?
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 = value.match(DATE_RANGE)
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 = value.include? '...'
50
- starting_point = range_points[1].to_f
51
- ending_point = if range_points[2] == 'Infinity'
52
- 9_999_999
53
- else
54
- range_points[2].to_f
55
- end
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
- value == '' ||
26
- value.nil?
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
  module Drillbit
3
4
  class Parameters
4
5
  class Page
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Drillbit
3
4
  class Parameters
4
5
  class Sort
@@ -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'] || ''
@@ -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'
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'drillbit/authorizable_resource'
3
4
  require 'erratum/rescuable_resource'
4
5
  require 'erratum/verifiable_resource'
@@ -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
- :processors
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
- processor.processed(processed_resource, parameters)
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
- metadata.merge processor.meta(processed, parameters)
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
- underscore.
12
- pluralize.
13
- downcase
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
- underscore.
19
- singularize.
20
- downcase
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
- camelize
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/filter'
3
4
 
4
5
  module Drillbit
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'drillbit/parameters/index'
3
4
 
4
5
  module Drillbit
@@ -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
- page(parameters.page_number).
31
- per(parameters.per_page)
30
+ resource
31
+ .page(parameters.page_number)
32
+ .per(parameters.per_page)
32
33
  end
33
34
 
34
35
  def meta
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'drillbit/parameters/sort'
3
4
 
4
5
  module Drillbit
@@ -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