hanami-router 1.3.0.beta1 → 1.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 55265d04629210abb763c78a81bd4507cbe271cb0a5da1662bb938a3fca9d409
4
- data.tar.gz: c11974f4d0f047d1ae21342d936faba59125080e1ce093ef9d63ce7a0cf672a9
3
+ metadata.gz: e727bfc99155018c990faf3ad9621cc547413259bee1cedbe632b9c1d7695247
4
+ data.tar.gz: 768a8bf1afd0c5b97a3d2fd2011502d42bb3655f5978343f6c486ce4fbc30e6c
5
5
  SHA512:
6
- metadata.gz: 75ca87dadac5a3eb8c099aa4a1977c271f1b24dcdd55cfd16a8fdf77c4e990ac074a84e651ad347bad9d202b2bed5e53f7dc43a64feaea96a8cb09adefd9428c
7
- data.tar.gz: 685771d96a9c584a6bfee63ee90916648bf851c94b2dd1c1be69513b2f9b8b2ab6975b321fe4454047216e05a99c6431dc0c354309812ad260f2c8af058c86f9
6
+ metadata.gz: 5a5934e82c544acbb3cb44e78955b8863a61341a8a1fef0208ad4b3e8d0a5303480b160e10fdbc4326a58276d21c2a9b5a79b4819047139a4a477ce97937b9fb
7
+ data.tar.gz: ea8369f2333217e336f525f0826db1212b0d42398b1b0c8fa8c70a011a1461e71dce54b59be0703e14bd55c990f1ffb8ca88491916fe1ec6f5f0016440164129
@@ -1,6 +1,10 @@
1
1
  # Hanami::Router
2
2
  Rack compatible HTTP router for Ruby
3
3
 
4
+ ## v1.3.0 - 2018-10-24
5
+ ### Fixed
6
+ - [Tim Riley] Skip attempting to parse unknown types in `Hanami::Middleware::BodyParser`
7
+
4
8
  ## v1.3.0.beta1 - 2018-08-08
5
9
  ### Added
6
10
  - [Luca Guidi] Official support for JRuby 9.2.0.0
@@ -21,7 +21,7 @@ Gem::Specification.new do |spec|
21
21
 
22
22
  spec.add_dependency 'rack', '~> 2.0'
23
23
  spec.add_dependency 'http_router', '0.11.2'
24
- spec.add_dependency 'hanami-utils', '~> 1.3.beta'
24
+ spec.add_dependency 'hanami-utils', '~> 1.3'
25
25
 
26
26
  spec.add_development_dependency 'bundler', '~> 1.5'
27
27
  spec.add_development_dependency 'rake', '~> 12'
@@ -1,5 +1,5 @@
1
- require 'hanami/middleware/body_parser/parser'
2
1
  require 'hanami/utils/hash'
2
+ require_relative 'body_parser/class_interface'
3
3
 
4
4
  module Hanami
5
5
  module Middleware
@@ -8,7 +8,7 @@ module Hanami
8
8
  class BodyParser
9
9
  # @since 1.3.0
10
10
  # @api private
11
- CONTENT_TYPE = 'CONTENT_TYPE'.freeze
11
+ CONTENT_TYPE = 'CONTENT_TYPE'.freeze
12
12
 
13
13
  # @since 1.3.0
14
14
  # @api private
@@ -16,7 +16,7 @@ module Hanami
16
16
 
17
17
  # @since 1.3.0
18
18
  # @api private
19
- RACK_INPUT = 'rack.input'.freeze
19
+ RACK_INPUT = 'rack.input'.freeze
20
20
 
21
21
  # @since 1.3.0
22
22
  # @api private
@@ -26,7 +26,9 @@ module Hanami
26
26
  ROUTER_PARSED_BODY = 'router.parsed_body'.freeze
27
27
 
28
28
  # @api private
29
- FALLBACK_KEY = '_'.freeze
29
+ FALLBACK_KEY = '_'.freeze
30
+
31
+ extend ClassInterface
30
32
 
31
33
  def initialize(app, parsers)
32
34
  @app = app
@@ -37,32 +39,29 @@ module Hanami
37
39
  body = env[RACK_INPUT].read
38
40
  return @app.call(env) if body.empty?
39
41
 
40
- env[RACK_INPUT].rewind # somebody might try to read this stream
42
+ env[RACK_INPUT].rewind # somebody might try to read this stream
41
43
 
42
- env[ROUTER_PARAMS] ||= {} # prepare params
43
- env[ROUTER_PARSED_BODY] = _parse(env, body)
44
- env[ROUTER_PARAMS] = _symbolize(env[ROUTER_PARSED_BODY]).merge(env[ROUTER_PARAMS])
44
+ if (parser = @parsers[media_type(env)])
45
+ env[ROUTER_PARSED_BODY] = parser.parse(body)
46
+ env[ROUTER_PARAMS] = _symbolize(env[ROUTER_PARSED_BODY])
47
+ end
45
48
 
46
49
  @app.call(env)
47
50
  end
48
51
 
49
52
  private
50
53
 
51
- def build_parsers(parsers)
52
- result = Hash.new
53
- args = Array(parsers)
54
- return result if args.empty?
54
+ def build_parsers(parser_names)
55
+ parser_names = Array(parser_names)
56
+ return {} if parser_names.empty?
55
57
 
56
- args.each do |arg|
57
- parser = Parser.for(arg)
58
+ parser_names.each_with_object({}) { |name, parsers|
59
+ parser = self.class.for(name)
58
60
 
59
61
  parser.mime_types.each do |mime|
60
- result[mime] = parser
62
+ parsers[mime] = parser
61
63
  end
62
- end
63
-
64
- result.default = Parser.new
65
- result
64
+ }
66
65
  end
67
66
 
68
67
  # @api private
@@ -0,0 +1,56 @@
1
+ require 'hanami/utils/class'
2
+ require 'hanami/utils/string'
3
+ require_relative 'errors'
4
+
5
+ module Hanami
6
+ module Middleware
7
+ class BodyParser
8
+ # @api private
9
+ # @since 1.3.0
10
+ module ClassInterface
11
+ # @api private
12
+ # @since 1.3.0
13
+ def for(parser)
14
+ parser =
15
+ case parser
16
+ when String, Symbol
17
+ require_parser(parser)
18
+ when Class
19
+ parser.new
20
+ else
21
+ parser
22
+ end
23
+
24
+ ensure_parser parser
25
+
26
+ parser
27
+ end
28
+
29
+ private
30
+
31
+ # @api private
32
+ # @since 1.3.0
33
+ PARSER_METHODS = %i[mime_types parse].freeze
34
+
35
+ # @api private
36
+ # @since 1.3.0
37
+ def ensure_parser(parser)
38
+ unless PARSER_METHODS.all? { |method| parser.respond_to?(method) }
39
+ raise InvalidParserError.new(parser)
40
+ end
41
+ end
42
+
43
+ # @api private
44
+ # @since 1.3.0
45
+ def require_parser(parser)
46
+ require "hanami/middleware/body_parser/#{parser}_parser"
47
+
48
+ parser = Utils::String.classify(parser)
49
+ Utils::Class.load!("Hanami::Middleware::BodyParser::#{parser}Parser").new
50
+ rescue LoadError, NameError
51
+ raise UnknownParserError.new(parser)
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,23 @@
1
+ require 'hanami/routing/error'
2
+
3
+ module Hanami
4
+ module Middleware
5
+ # @since 1.3.0
6
+ # @api private
7
+ class BodyParser
8
+ # Body parsing error
9
+ # This is raised when parser fails to parse the body
10
+ #
11
+ # @since 1.3.0
12
+ class BodyParsingError < Hanami::Routing::Parsing::BodyParsingError
13
+ end
14
+
15
+ # @since 1.3.0
16
+ class UnknownParserError < Hanami::Routing::Parsing::UnknownParserError
17
+ end
18
+
19
+ class InvalidParserError < Hanami::Routing::Error
20
+ end
21
+ end
22
+ end
23
+ end
@@ -1,11 +1,12 @@
1
1
  require 'hanami/utils/json'
2
+ require_relative 'errors'
2
3
 
3
4
  module Hanami
4
5
  module Middleware
5
6
  class BodyParser
6
7
  # @since 1.3.0
7
8
  # @api private
8
- class JsonParser < Parser
9
+ class JsonParser
9
10
  # @since 1.3.0
10
11
  # @api private
11
12
  def mime_types
@@ -1,6 +1,6 @@
1
1
  module Hanami
2
2
  class Router
3
3
  # @since 0.1.0
4
- VERSION = '1.3.0.beta1'.freeze
4
+ VERSION = '1.3.0'.freeze
5
5
  end
6
6
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hanami-router
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0.beta1
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Luca Guidi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-08-08 00:00:00.000000000 Z
11
+ date: 2018-10-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -44,14 +44,14 @@ dependencies:
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 1.3.beta
47
+ version: '1.3'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: 1.3.beta
54
+ version: '1.3'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: bundler
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -121,8 +121,9 @@ files:
121
121
  - hanami-router.gemspec
122
122
  - lib/hanami-router.rb
123
123
  - lib/hanami/middleware/body_parser.rb
124
+ - lib/hanami/middleware/body_parser/class_interface.rb
125
+ - lib/hanami/middleware/body_parser/errors.rb
124
126
  - lib/hanami/middleware/body_parser/json_parser.rb
125
- - lib/hanami/middleware/body_parser/parser.rb
126
127
  - lib/hanami/router.rb
127
128
  - lib/hanami/router/version.rb
128
129
  - lib/hanami/routing/endpoint.rb
@@ -159,9 +160,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
159
160
  version: 2.3.0
160
161
  required_rubygems_version: !ruby/object:Gem::Requirement
161
162
  requirements:
162
- - - ">"
163
+ - - ">="
163
164
  - !ruby/object:Gem::Version
164
- version: 1.3.1
165
+ version: '0'
165
166
  requirements: []
166
167
  rubyforge_project:
167
168
  rubygems_version: 2.7.7
@@ -1,61 +0,0 @@
1
- require 'hanami/utils/class'
2
- require 'hanami/utils/string'
3
- require 'hanami/routing/parsing/parser'
4
-
5
- module Hanami
6
- module Middleware
7
- class BodyParser
8
- # Body parsing error
9
- # This is raised when parser fails to parse the body
10
- #
11
- # @since 1.3.0
12
- class BodyParsingError < Hanami::Routing::Parsing::BodyParsingError
13
- end
14
-
15
- # @since 1.3.0
16
- class UnknownParserError < Hanami::Routing::Parsing::UnknownParserError
17
- end
18
-
19
- # @since 1.3.0
20
- class Parser
21
- # @since 1.3.0
22
- # @api private
23
- def self.for(parser)
24
- case parser
25
- when String, Symbol
26
- require_parser(parser)
27
- else
28
- raise UnknownParserError.new(parser) unless parser?(parser)
29
- parser.new
30
- end
31
- end
32
-
33
- # @since 1.3.0
34
- def mime_types
35
- raise NotImplementedError
36
- end
37
-
38
- # @since 1.3.0
39
- def parse(body)
40
- body
41
- end
42
-
43
- private
44
- # @since 1.3.0
45
- # @api private
46
- def self.require_parser(parser)
47
- require "hanami/middleware/body_parser/#{ parser }_parser"
48
-
49
- parser = Utils::String.classify(parser)
50
- Utils::Class.load!("Hanami::Middleware::BodyParser::#{ parser }Parser").new
51
- rescue LoadError, NameError
52
- raise UnknownParserError.new(parser)
53
- end
54
-
55
- def self.parser?(parser)
56
- parser.is_a?(Class) && parser < Parser
57
- end
58
- end
59
- end
60
- end
61
- end