request_handler 2.0.0 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c6f03be51da1bccf44ba08a55724d6cd68c8dd43817e5b1e74f427b9ae1164f7
4
- data.tar.gz: 942131e22d64ee316f7e7c690c9c1a6af0d5c589459d2bc77786e86a940fe342
3
+ metadata.gz: 84a7da676c652eb23c13f36d57e89b8808909c404a6874fb76b2f7c56a72b8f7
4
+ data.tar.gz: 8aeea4b06cfacba6ef4553974c07e705b6482753cd49bb3322d18c1a86faeb1b
5
5
  SHA512:
6
- metadata.gz: f50ec83b0dc218d07d9f9703f929696f761dfd812e2a1dd5230d2e901f20ac1c4141d8674a332d08ecf3297dd7e3a3af4514e7330e37d341db92efc1dc660714
7
- data.tar.gz: 7e0b0d58b1f0fd697432c9e3f0fb4447b983510bc643acde7713db1c3bc8de23a4209bd45e80ce9f255458ba0c83c5dbd9f22eca672280c98363e85a6cd3c429
6
+ metadata.gz: f9ac556ccfe78a670a5733cae9cb1ca2b3030119150feab16b73953336621e25657f6f9598c8e50d93cd9fcae05c633d65a9c96f6002c6fd09d3789706a92b24
7
+ data.tar.gz: f1d9f617c904954c7029d3d065ddeb2ab19f6a232b9f54bc2e03d528f0be02e77edec90971002c003bad1bfbd8fc4f01094c562526c3baa80c7bc54ea8fcb2f0
data/.circleci/config.yml CHANGED
@@ -19,7 +19,6 @@ common_steps: &common_steps
19
19
  - vendor/bundle
20
20
 
21
21
  - run: ruby -v
22
- - run: bundle exec danger
23
22
  - run:
24
23
  name: run tests
25
24
  command: |
@@ -42,24 +41,24 @@ common_steps: &common_steps
42
41
 
43
42
  version: 2
44
43
  jobs:
45
- ruby-2.4:
44
+ ruby-2.6:
46
45
  docker:
47
- - image: circleci/ruby:2.4
46
+ - image: circleci/ruby:2.6
48
47
  steps:
49
48
  *common_steps
50
- ruby-2.5:
49
+ ruby-2.7:
51
50
  docker:
52
- - image: circleci/ruby:2.5
51
+ - image: circleci/ruby:2.7
53
52
  steps:
54
53
  *common_steps
55
- jruby-9.2:
54
+ jruby-9.3:
56
55
  docker:
57
- - image: circleci/jruby:9.2
56
+ - image: circleci/jruby:9.3
58
57
  steps:
59
58
  *common_steps
60
- jruby-9.2-indy:
59
+ jruby-9.3-indy:
61
60
  docker:
62
- - image: circleci/jruby:9.2
61
+ - image: circleci/jruby:9.3
63
62
  environment:
64
63
  JRUBY_OPTS: '-Xcompile.invokedynamic=true'
65
64
  steps:
@@ -69,7 +68,7 @@ workflows:
69
68
  version: 2
70
69
  build:
71
70
  jobs:
72
- - ruby-2.4
73
- - ruby-2.5
74
- - jruby-9.2
75
- - jruby-9.2-indy
71
+ - ruby-2.6
72
+ - ruby-2.7
73
+ - jruby-9.3
74
+ - jruby-9.3-indy
data/CHANGELOG.md CHANGED
@@ -4,6 +4,20 @@ All notable changes to this project will be documented in this file.
4
4
  The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
5
5
  and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
6
6
 
7
+ ## [Unreleased]
8
+
9
+ ## [2.2.0] - 2022-02-25
10
+ ### Changed
11
+ - The definition engine now makes use of the translated error messages to return more useful messages
12
+
13
+ ## [2.1.1] - 2021-06-14
14
+ ### Fixed
15
+ - Change error object's source attribute from `param` to `parameters` to align with JSONAPI specification
16
+
17
+ ## [2.1.0] - 2020-04-01
18
+ ### Added
19
+ - Headers validation
20
+
7
21
  ## [2.0.0] - 2019-11-19
8
22
  ### Changed
9
23
  - BREAKING: Required configuration of validation engine
data/README.md CHANGED
@@ -82,7 +82,7 @@ the abstract class `RequestHandler::Validation::Engine`
82
82
  To set up a handler, you need create a class which inherits from
83
83
  `RequestHandler::Base`, providing at least the options block and a `to_dto`
84
84
  method with the parts you want to use. To use it, create a new instance of the
85
- handler passing in the request, after that you can use the handler.dto method to
85
+ handler passing in the request, after that you can use the handler.to_dto method to
86
86
  process and access the data. Here is a short example, check
87
87
  `spec/integration/request_handler_spec.rb` for a detailed one.
88
88
 
@@ -249,7 +249,7 @@ class CreateQuestionHandler < RequestHandler::Base
249
249
  end
250
250
  ```
251
251
 
252
- Assuming that the request consists of a json file `question.json` containing
252
+ Assuming that the request consists of a json file `question.json` containing
253
253
  ``` json
254
254
  {
255
255
  "id": "1",
@@ -472,6 +472,8 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/runtas
472
472
  This project is intended to be a safe, welcoming space for collaboration, and
473
473
  contributors are expected to adhere to the [code of conduct][cc].
474
474
 
475
+ Check out our [career page](https://www.runtastic.com/career/) if you'd like to work with us.
476
+
475
477
  ## License
476
478
  The gem is available as open source under [the terms of the MIT License][mit].
477
479
 
@@ -51,7 +51,7 @@ module RequestHandler
51
51
  end
52
52
 
53
53
  def headers
54
- @headers ||= HeaderParser.new(env: request.env).run
54
+ @headers ||= parse_headers
55
55
  end
56
56
 
57
57
  def body_params
@@ -105,6 +105,21 @@ module RequestHandler
105
105
  result.empty? ? defaults : result
106
106
  end
107
107
 
108
+ def parse_headers
109
+ HeaderParser.new(header_parser_params).run
110
+ end
111
+
112
+ def header_parser_params
113
+ params = { env: request.env }
114
+
115
+ return params if config.nil?
116
+
117
+ params.merge(
118
+ schema: config.lookup('headers.schema'),
119
+ schema_options: execute_options(config.lookup('headers.options'))
120
+ )
121
+ end
122
+
108
123
  def parse_body_params
109
124
  BodyParser.new(
110
125
  request: request,
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "request_handler/builder/base"
3
+ require 'request_handler/builder/base'
4
4
 
5
5
  module RequestHandler
6
6
  module Builder
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'request_handler/builder/base'
4
+
5
+ module RequestHandler
6
+ module Builder
7
+ class HeadersBuilder < Base
8
+ Headers = Struct.new(:schema, :options)
9
+
10
+ def create_klass_struct
11
+ @result = Headers.new
12
+ end
13
+
14
+ def schema(value)
15
+ @result.schema = value
16
+ end
17
+
18
+ def options(value)
19
+ @result.options = value
20
+ end
21
+ end
22
+ end
23
+ end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'request_handler/builder/base'
4
+ require 'request_handler/builder/headers_builder'
4
5
  require 'request_handler/builder/page_builder'
5
6
  require 'request_handler/builder/include_options_builder'
6
7
  require 'request_handler/builder/sort_options_builder'
@@ -14,7 +15,7 @@ module RequestHandler
14
15
  module Builder
15
16
  class OptionsBuilder < Base
16
17
  Options = Struct.new(:page, :include_options, :sort_options, :filter, :query, :body,
17
- :multipart, :fieldsets)
18
+ :multipart, :fieldsets, :headers)
18
19
 
19
20
  def create_klass_struct
20
21
  @result = Options.new
@@ -52,6 +53,10 @@ module RequestHandler
52
53
  @result.fieldsets = build_fieldsets(&block)
53
54
  end
54
55
 
56
+ def headers(&block)
57
+ @result.headers = build_headers(&block)
58
+ end
59
+
55
60
  def build_page(&block)
56
61
  Docile.dsl_eval(PageBuilder.new, &block).build
57
62
  end
@@ -83,6 +88,10 @@ module RequestHandler
83
88
  def build_fieldsets(&block)
84
89
  Docile.dsl_eval(FieldsetsBuilder.new, &block).build
85
90
  end
91
+
92
+ def build_headers(&block)
93
+ Docile.dsl_eval(HeadersBuilder.new, &block).build
94
+ end
86
95
  end
87
96
  end
88
97
  end
@@ -46,7 +46,7 @@ module RequestHandler
46
46
  raise FieldsetsParamsError, [{ code: 'INVALID_QUERY_PARAMETER',
47
47
  status: '400',
48
48
  detail: "allowed fieldset does not include '#{option}'",
49
- source: { param: "fields[#{type}]" } }]
49
+ source: { parameter: "fields[#{type}]" } }]
50
50
  end
51
51
 
52
52
  def check_required_fieldsets_types(fieldsets)
@@ -62,7 +62,7 @@ module RequestHandler
62
62
  code: 'INVALID_QUERY_PARAMETER',
63
63
  status: '400',
64
64
  detail: "fieldset for '#{type}' not allowed",
65
- source: { param: "fields[#{type}]" }
65
+ source: { parameter: "fields[#{type}]" }
66
66
  }
67
67
  ]
68
68
  end
@@ -77,7 +77,7 @@ module RequestHandler
77
77
  {
78
78
  code: 'MISSING_QUERY_PARAMETER',
79
79
  status: '400',
80
- source: { param: '' },
80
+ source: { parameter: '' },
81
81
  detail: "missing required parameter fields[#{type}]"
82
82
  }
83
83
  end
@@ -37,7 +37,7 @@ module RequestHandler
37
37
  {
38
38
  status: '400',
39
39
  code: 'INVALID_QUERY_PARAMETER',
40
- source: { param: source_param }
40
+ source: { parameter: source_param }
41
41
  }
42
42
  end
43
43
 
@@ -1,9 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'request_handler/schema_parser'
3
4
  require 'request_handler/error'
5
+
4
6
  module RequestHandler
5
- class HeaderParser
6
- def initialize(env:)
7
+ class HeaderParser < SchemaParser
8
+ def initialize(env:, schema: nil, schema_options: {})
9
+ super(schema: schema, schema_options: schema_options) unless schema.nil?
10
+
7
11
  raise MissingArgumentError, env: 'is missing' if env.nil?
8
12
  @headers = Helper.deep_transform_keys_in_object(env.select { |k, _v| k.start_with?('HTTP_') }) do |k|
9
13
  k[5..-1].downcase.to_sym
@@ -11,11 +15,34 @@ module RequestHandler
11
15
  end
12
16
 
13
17
  def run
14
- headers
18
+ return headers if schema.nil?
19
+
20
+ validate_headers!
15
21
  end
16
22
 
17
23
  private
18
24
 
25
+ def validate_headers!
26
+ validate_schema(headers)
27
+ rescue SchemaValidationError => e
28
+ raise ExternalArgumentError, external_argument_error_params(e)
29
+ end
30
+
31
+ def external_argument_error_params(error)
32
+ error.errors.map do |schema_error|
33
+ header = schema_error[:source][:pointer]
34
+ {
35
+ status: '400',
36
+ code: "#{headers[header.to_sym] ? 'INVALID' : 'MISSING'}_HEADER",
37
+ detail: "#{format_header_name(header)} #{schema_error[:detail]}"
38
+ }
39
+ end
40
+ end
41
+
42
+ def format_header_name(name)
43
+ name.split('_').map(&:capitalize).join('-')
44
+ end
45
+
19
46
  attr_reader :headers
20
47
  end
21
48
  end
@@ -35,7 +35,7 @@ module RequestHandler
35
35
  status: '400',
36
36
  code: code,
37
37
  detail: detail,
38
- source: { param: 'include' }
38
+ source: { parameter: 'include' }
39
39
  }
40
40
  ]
41
41
  end
@@ -79,7 +79,7 @@ module RequestHandler
79
79
  code: 'INVALID_QUERY_PARAMETER',
80
80
  status: '400',
81
81
  detail: 'must be a positive integer',
82
- source: { param: "page[#{param}]" }
82
+ source: { parameter: "page[#{param}]" }
83
83
  }]
84
84
  end
85
85
 
@@ -20,7 +20,7 @@ module RequestHandler
20
20
  { status: '400',
21
21
  code: "#{query[param] ? 'INVALID' : 'MISSING'}_QUERY_PARAMETER",
22
22
  detail: schema_error[:detail],
23
- source: { param: param } }
23
+ source: { parameter: param } }
24
24
  end)
25
25
  end
26
26
 
@@ -51,7 +51,7 @@ module RequestHandler
51
51
  {
52
52
  code: 'INVALID_QUERY_PARAMETER',
53
53
  status: '400',
54
- source: { param: 'sort' },
54
+ source: { parameter: 'sort' },
55
55
  detail: detail
56
56
  }
57
57
  end
@@ -24,7 +24,7 @@ module RequestHandler
24
24
  end
25
25
 
26
26
  def self.error_message(validation_error)
27
- validation_error.message
27
+ validation_error.translated_error
28
28
  end
29
29
 
30
30
  def self.error_pointer(validation_error)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RequestHandler
4
- VERSION = '2.0.0'.freeze
4
+ VERSION = '2.2.0'.freeze
5
5
  end
@@ -14,7 +14,7 @@ Gem::Specification.new do |spec|
14
14
  spec.description = 'shared base for request_handler using dry-* gems'
15
15
  spec.homepage = 'https://github.com/runtastic/request_handler'
16
16
  spec.license = 'MIT'
17
- spec.required_ruby_version = '~> 2.4'
17
+ spec.required_ruby_version = '~> 2.6'
18
18
 
19
19
  spec.files = `git ls-files -z`.split("\x0").reject do |f|
20
20
  f.match(%r{^(test|spec|features)/})
@@ -44,5 +44,5 @@ Gem::Specification.new do |spec|
44
44
 
45
45
  spec.add_development_dependency 'rack'
46
46
 
47
- spec.add_development_dependency 'definition', '~> 0.5'
47
+ spec.add_development_dependency 'definition', '~> 0.7'
48
48
  end
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: request_handler
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andreas Eger
8
8
  - Dominik Goltermann
9
- autorequire:
9
+ autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2019-11-19 00:00:00.000000000 Z
12
+ date: 2022-03-11 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: docile
@@ -241,14 +241,14 @@ dependencies:
241
241
  requirements:
242
242
  - - "~>"
243
243
  - !ruby/object:Gem::Version
244
- version: '0.5'
244
+ version: '0.7'
245
245
  type: :development
246
246
  prerelease: false
247
247
  version_requirements: !ruby/object:Gem::Requirement
248
248
  requirements:
249
249
  - - "~>"
250
250
  - !ruby/object:Gem::Version
251
- version: '0.5'
251
+ version: '0.7'
252
252
  description: shared base for request_handler using dry-* gems
253
253
  email:
254
254
  - andreas.eger@runtastic.com
@@ -281,6 +281,7 @@ files:
281
281
  - lib/request_handler/builder/fieldsets_builder.rb
282
282
  - lib/request_handler/builder/fieldsets_resource_builder.rb
283
283
  - lib/request_handler/builder/filter_builder.rb
284
+ - lib/request_handler/builder/headers_builder.rb
284
285
  - lib/request_handler/builder/include_options_builder.rb
285
286
  - lib/request_handler/builder/multipart_builder.rb
286
287
  - lib/request_handler/builder/multipart_resource_builder.rb
@@ -318,7 +319,7 @@ homepage: https://github.com/runtastic/request_handler
318
319
  licenses:
319
320
  - MIT
320
321
  metadata: {}
321
- post_install_message:
322
+ post_install_message:
322
323
  rdoc_options: []
323
324
  require_paths:
324
325
  - lib
@@ -326,15 +327,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
326
327
  requirements:
327
328
  - - "~>"
328
329
  - !ruby/object:Gem::Version
329
- version: '2.4'
330
+ version: '2.6'
330
331
  required_rubygems_version: !ruby/object:Gem::Requirement
331
332
  requirements:
332
333
  - - ">="
333
334
  - !ruby/object:Gem::Version
334
335
  version: '0'
335
336
  requirements: []
336
- rubygems_version: 3.0.3
337
- signing_key:
337
+ rubygems_version: 3.1.2
338
+ signing_key:
338
339
  specification_version: 4
339
340
  summary: shared base for request_handler using dry-* gems
340
341
  test_files: []