hanami-router 1.0.0.beta2 → 1.0.0.beta3
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/CHANGELOG.md +2 -0
- data/LICENSE.md +1 -1
- data/README.md +1 -1
- data/lib/hanami/router.rb +9 -0
- data/lib/hanami/router/version.rb +1 -1
- data/lib/hanami/routing/endpoint.rb +5 -0
- data/lib/hanami/routing/endpoint_resolver.rb +9 -0
- data/lib/hanami/routing/http_router.rb +3 -0
- data/lib/hanami/routing/http_router_monkey_patch.rb +3 -0
- data/lib/hanami/routing/parsers.rb +28 -0
- data/lib/hanami/routing/parsing/json_parser.rb +5 -0
- data/lib/hanami/routing/parsing/parser.rb +3 -0
- data/lib/hanami/routing/resource.rb +3 -0
- data/lib/hanami/routing/resource/action.rb +14 -0
- data/lib/hanami/routing/resource/nested.rb +2 -0
- data/lib/hanami/routing/resources/action.rb +6 -0
- data/lib/hanami/routing/route.rb +2 -0
- data/lib/hanami/routing/routes_inspector.rb +1 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4b0aa788bc3fdc570860f8dc2f41635320dd08ea
|
4
|
+
data.tar.gz: 77ecacea1b2c3741f6957f528cd327a3a4304a13
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 716ec8875095f22614fac285b27e0548695abc8e8f233abcc01928a8d6a9a096f2634883c5dd8c7ffb0a6758e6573f179c92b0dfe8d4f1b9342281b25ecdea91
|
7
|
+
data.tar.gz: 864a3ba5e664f1a18397b6417e805c70449816e5bd0d9101a20e1a111471ac55474fb38da4b687d57c262579311b4fa948cc26a7cc1a8d22b1345004d17f2257
|
data/CHANGELOG.md
CHANGED
data/LICENSE.md
CHANGED
data/README.md
CHANGED
@@ -703,6 +703,6 @@ Thanks to Joshua Hull ([@joshbuddy](https://github.com/joshbuddy)) for his
|
|
703
703
|
|
704
704
|
## Copyright
|
705
705
|
|
706
|
-
Copyright © 2014-
|
706
|
+
Copyright © 2014-2017 Luca Guidi – Released under MIT License
|
707
707
|
|
708
708
|
This project was formerly known as Lotus (`lotus-router`).
|
data/lib/hanami/router.rb
CHANGED
@@ -5,6 +5,9 @@ require 'hanami/routing/resource'
|
|
5
5
|
require 'hanami/routing/resources'
|
6
6
|
require 'hanami/routing/error'
|
7
7
|
|
8
|
+
# Hanami
|
9
|
+
#
|
10
|
+
# @since 0.1.0
|
8
11
|
module Hanami
|
9
12
|
# Rack compatible, lightweight and fast HTTP Router.
|
10
13
|
#
|
@@ -83,9 +86,15 @@ module Hanami
|
|
83
86
|
# @see Hanami::Routing::RecognizedRoute#call
|
84
87
|
# @see Hanami::Routing::RecognizedRoute#routable?
|
85
88
|
class NotRoutableEndpointError < Hanami::Routing::Error
|
89
|
+
# @since 0.5.0
|
90
|
+
# @api private
|
86
91
|
REQUEST_METHOD = 'REQUEST_METHOD'.freeze
|
92
|
+
|
93
|
+
# @since 0.5.0
|
94
|
+
# @api private
|
87
95
|
PATH_INFO = 'PATH_INFO'.freeze
|
88
96
|
|
97
|
+
# @since 0.5.0
|
89
98
|
def initialize(env)
|
90
99
|
super %(Cannot find routable endpoint for #{ env[REQUEST_METHOD] } "#{ env[PATH_INFO] }")
|
91
100
|
end
|
@@ -32,6 +32,7 @@ module Hanami
|
|
32
32
|
# end
|
33
33
|
class Endpoint < SimpleDelegator
|
34
34
|
# @since 0.2.0
|
35
|
+
# @api private
|
35
36
|
def inspect
|
36
37
|
case __getobj__
|
37
38
|
when Proc
|
@@ -84,6 +85,7 @@ module Hanami
|
|
84
85
|
# Rack interface
|
85
86
|
#
|
86
87
|
# @since 0.1.0
|
88
|
+
# @api private
|
87
89
|
def call(env)
|
88
90
|
__getobj__.new.call(env)
|
89
91
|
end
|
@@ -112,6 +114,7 @@ module Hanami
|
|
112
114
|
# Initialize the lazy endpoint
|
113
115
|
#
|
114
116
|
# @since 0.1.0
|
117
|
+
# @api private
|
115
118
|
def initialize(name, namespace)
|
116
119
|
@name, @namespace = name, namespace
|
117
120
|
end
|
@@ -121,11 +124,13 @@ module Hanami
|
|
121
124
|
# @raise [EndpointNotFound] when the endpoint can't be found.
|
122
125
|
#
|
123
126
|
# @since 0.1.0
|
127
|
+
# @api private
|
124
128
|
def call(env)
|
125
129
|
obj.call(env)
|
126
130
|
end
|
127
131
|
|
128
132
|
# @since 0.2.0
|
133
|
+
# @api private
|
129
134
|
def inspect
|
130
135
|
# TODO review this implementation once the namespace feature will be
|
131
136
|
# cleaned up.
|
@@ -58,6 +58,7 @@ module Hanami
|
|
58
58
|
# @return [Hanami::Routing::EndpointResolver] self
|
59
59
|
#
|
60
60
|
# @since 0.1.0
|
61
|
+
# @api private
|
61
62
|
#
|
62
63
|
# @example Specify custom endpoint class
|
63
64
|
# require 'hanami/router'
|
@@ -117,6 +118,7 @@ module Hanami
|
|
117
118
|
# passed to #initialize
|
118
119
|
#
|
119
120
|
# @since 0.1.0
|
121
|
+
# @api private
|
120
122
|
#
|
121
123
|
# @see #initialize
|
122
124
|
# @see #find
|
@@ -173,6 +175,7 @@ module Hanami
|
|
173
175
|
# @option options [String] :namespace an optional namespace
|
174
176
|
#
|
175
177
|
# @since 0.1.0
|
178
|
+
# @api private
|
176
179
|
#
|
177
180
|
# @return [Object]
|
178
181
|
def find(options)
|
@@ -180,12 +183,14 @@ module Hanami
|
|
180
183
|
end
|
181
184
|
|
182
185
|
protected
|
186
|
+
# @api private
|
183
187
|
def default
|
184
188
|
@endpoint_class.new(
|
185
189
|
->(env) { DEFAULT_RESPONSE }
|
186
190
|
)
|
187
191
|
end
|
188
192
|
|
193
|
+
# @api private
|
189
194
|
def constantize(string)
|
190
195
|
klass = Utils::Class.load!(string, @namespace)
|
191
196
|
if klass.respond_to?(:call)
|
@@ -197,11 +202,13 @@ module Hanami
|
|
197
202
|
LazyEndpoint.new(string, @namespace)
|
198
203
|
end
|
199
204
|
|
205
|
+
# @api private
|
200
206
|
def classify(string)
|
201
207
|
Utils::String.new(string).underscore.classify
|
202
208
|
end
|
203
209
|
|
204
210
|
private
|
211
|
+
# @api private
|
205
212
|
def resolve_callable(callable)
|
206
213
|
if callable.respond_to?(:call)
|
207
214
|
@endpoint_class.new(callable)
|
@@ -210,6 +217,7 @@ module Hanami
|
|
210
217
|
end
|
211
218
|
end
|
212
219
|
|
220
|
+
# @api private
|
213
221
|
def resolve_matchable(matchable)
|
214
222
|
if matchable.respond_to?(:match)
|
215
223
|
constantize(
|
@@ -218,6 +226,7 @@ module Hanami
|
|
218
226
|
end
|
219
227
|
end
|
220
228
|
|
229
|
+
# @api private
|
221
230
|
def resolve_action(string)
|
222
231
|
if string.match(action_separator)
|
223
232
|
controller, action = string.split(action_separator).map {|token| classify(token) }
|
@@ -192,6 +192,7 @@ module Hanami
|
|
192
192
|
|
193
193
|
private
|
194
194
|
|
195
|
+
# @api private
|
195
196
|
def _rescue_url_recognition
|
196
197
|
yield
|
197
198
|
rescue ::HttpRouter::InvalidRouteException,
|
@@ -199,10 +200,12 @@ module Hanami
|
|
199
200
|
raise Routing::InvalidRouteException.new("#{ e.message } - please check given arguments")
|
200
201
|
end
|
201
202
|
|
203
|
+
# @api private
|
202
204
|
def add_with_request_method(path, method, opts = {}, &app)
|
203
205
|
super.generate(@resolver, opts, &app)
|
204
206
|
end
|
205
207
|
|
208
|
+
# @api private
|
206
209
|
def _custom_path(uri_string)
|
207
210
|
uri = URI.parse(uri_string)
|
208
211
|
uri.path = @prefix.join(uri.path)
|
@@ -3,8 +3,11 @@
|
|
3
3
|
# This monkey patches http_router to make it Rack 2.0 compatible.
|
4
4
|
# Details see: https://github.com/hanami/router/issues/136
|
5
5
|
#
|
6
|
+
# @api private
|
6
7
|
class HttpRouter
|
8
|
+
# @api private
|
7
9
|
class Node
|
10
|
+
# @api private
|
8
11
|
class Path < Node
|
9
12
|
def to_code
|
10
13
|
path_ivar = inject_root_ivar(self)
|
@@ -3,25 +3,47 @@ require 'hanami/utils/hash'
|
|
3
3
|
|
4
4
|
module Hanami
|
5
5
|
module Routing
|
6
|
+
# @since 0.2.0
|
7
|
+
# @api private
|
6
8
|
class Parsers
|
9
|
+
# @since 0.2.0
|
10
|
+
# @api private
|
7
11
|
CONTENT_TYPE = 'CONTENT_TYPE'.freeze
|
12
|
+
|
13
|
+
# @since 0.2.0
|
14
|
+
# @api private
|
8
15
|
MEDIA_TYPE_MATCHER = /\s*[;,]\s*/.freeze
|
9
16
|
|
17
|
+
# @since 0.2.0
|
18
|
+
# @api private
|
10
19
|
RACK_INPUT = 'rack.input'.freeze
|
20
|
+
|
21
|
+
# @since 0.2.0
|
22
|
+
# @api private
|
11
23
|
ROUTER_PARAMS = 'router.params'.freeze
|
24
|
+
|
25
|
+
# @api private
|
12
26
|
ROUTER_PARSED_BODY = 'router.parsed_body'.freeze
|
27
|
+
|
28
|
+
# @api private
|
13
29
|
FALLBACK_KEY = '_'.freeze
|
14
30
|
|
31
|
+
# @since 0.2.0
|
32
|
+
# @api private
|
15
33
|
def initialize(parsers)
|
16
34
|
@parsers = prepare(parsers)
|
17
35
|
_redefine_call
|
18
36
|
end
|
19
37
|
|
38
|
+
# @since 0.2.0
|
39
|
+
# @api private
|
20
40
|
def call(env)
|
21
41
|
env
|
22
42
|
end
|
23
43
|
|
24
44
|
private
|
45
|
+
# @since 0.2.0
|
46
|
+
# @api private
|
25
47
|
def prepare(args)
|
26
48
|
result = Hash.new
|
27
49
|
args = Array(args)
|
@@ -39,6 +61,8 @@ module Hanami
|
|
39
61
|
result
|
40
62
|
end
|
41
63
|
|
64
|
+
# @since 0.2.0
|
65
|
+
# @api private
|
42
66
|
def _redefine_call
|
43
67
|
return if @parsers.empty?
|
44
68
|
|
@@ -56,6 +80,7 @@ module Hanami
|
|
56
80
|
end
|
57
81
|
end
|
58
82
|
|
83
|
+
# @api private
|
59
84
|
def _symbolize(body)
|
60
85
|
if body.is_a?(Hash)
|
61
86
|
Utils::Hash.new(body).deep_dup.deep_symbolize!.to_h
|
@@ -64,18 +89,21 @@ module Hanami
|
|
64
89
|
end
|
65
90
|
end
|
66
91
|
|
92
|
+
# @api private
|
67
93
|
def _parse(env, body)
|
68
94
|
@parsers[
|
69
95
|
media_type(env)
|
70
96
|
].parse(body)
|
71
97
|
end
|
72
98
|
|
99
|
+
# @api private
|
73
100
|
def media_type(env)
|
74
101
|
if ct = content_type(env)
|
75
102
|
ct.split(MEDIA_TYPE_MATCHER, 2).first.downcase
|
76
103
|
end
|
77
104
|
end
|
78
105
|
|
106
|
+
# @api private
|
79
107
|
def content_type(env)
|
80
108
|
content_type = env[CONTENT_TYPE]
|
81
109
|
content_type.nil? || content_type.empty? ? nil : content_type
|
@@ -3,7 +3,11 @@ require 'hanami/utils/json'
|
|
3
3
|
module Hanami
|
4
4
|
module Routing
|
5
5
|
module Parsing
|
6
|
+
# @since 0.2.0
|
7
|
+
# @api private
|
6
8
|
class JsonParser < Parser
|
9
|
+
# @since 0.2.0
|
10
|
+
# @api private
|
7
11
|
def mime_types
|
8
12
|
['application/json', 'application/vnd.api+json']
|
9
13
|
end
|
@@ -17,6 +21,7 @@ module Hanami
|
|
17
21
|
# @raise [Hanami::Routing::Parsing::BodyParsingError] when the body can't be parsed.
|
18
22
|
#
|
19
23
|
# @since 0.2.0
|
24
|
+
# @api private
|
20
25
|
def parse(body)
|
21
26
|
Hanami::Utils::Json.parse(body)
|
22
27
|
rescue Hanami::Utils::Json::ParserError => e
|
@@ -14,6 +14,8 @@ module Hanami
|
|
14
14
|
|
15
15
|
# @since 0.2.0
|
16
16
|
class UnknownParserError < Hanami::Routing::Error
|
17
|
+
# @since 0.2.0
|
18
|
+
# @api private
|
17
19
|
def initialize(parser)
|
18
20
|
super("Unknown Parser: `#{ parser }'")
|
19
21
|
end
|
@@ -22,6 +24,7 @@ module Hanami
|
|
22
24
|
# @since 0.2.0
|
23
25
|
class Parser
|
24
26
|
# @since 0.2.0
|
27
|
+
# @api private
|
25
28
|
def self.for(parser)
|
26
29
|
case parser
|
27
30
|
when String, Symbol
|
@@ -96,6 +96,7 @@ module Hanami
|
|
96
96
|
klass.new(@router, [@name, name].join(NESTED_ROUTES_SEPARATOR), options, self, &blk)
|
97
97
|
end
|
98
98
|
|
99
|
+
# @api private
|
99
100
|
def generate(&blk)
|
100
101
|
instance_eval(&blk) if block_given?
|
101
102
|
|
@@ -104,10 +105,12 @@ module Hanami
|
|
104
105
|
end
|
105
106
|
end
|
106
107
|
|
108
|
+
# @api private
|
107
109
|
def member(&blk)
|
108
110
|
self.class.member.new(@router, @options, self, &blk)
|
109
111
|
end
|
110
112
|
|
113
|
+
# @api private
|
111
114
|
def collection(&blk)
|
112
115
|
self.class.collection.new(@router, @options, self, &blk)
|
113
116
|
end
|
@@ -280,11 +280,15 @@ module Hanami
|
|
280
280
|
# @since 0.1.0
|
281
281
|
# @see Hanami::Router#resource
|
282
282
|
class CollectionAction < Action
|
283
|
+
# @since 0.1.0
|
284
|
+
# @api private
|
283
285
|
def generate(&blk)
|
284
286
|
instance_eval(&blk) if block_given?
|
285
287
|
end
|
286
288
|
|
287
289
|
protected
|
290
|
+
# @since 0.1.0
|
291
|
+
# @api private
|
288
292
|
def method_missing(m, *args)
|
289
293
|
verb = m
|
290
294
|
action_name = Utils::PathPrefix.new(args.first).relative_join(nil)
|
@@ -294,14 +298,20 @@ module Hanami
|
|
294
298
|
end
|
295
299
|
|
296
300
|
private
|
301
|
+
# @since 0.1.0
|
302
|
+
# @api private
|
297
303
|
def path(action_name)
|
298
304
|
rest_path.join(action_name)
|
299
305
|
end
|
300
306
|
|
307
|
+
# @since 0.1.0
|
308
|
+
# @api private
|
301
309
|
def endpoint(action_name)
|
302
310
|
[ controller_name, action_name ].join separator
|
303
311
|
end
|
304
312
|
|
313
|
+
# @since 0.1.0
|
314
|
+
# @api private
|
305
315
|
def as(action_name)
|
306
316
|
[ action_name, super() ].join(self.class.named_route_separator).to_sym
|
307
317
|
end
|
@@ -322,10 +332,14 @@ module Hanami
|
|
322
332
|
# @since 0.1.0
|
323
333
|
module DefaultMemberAction
|
324
334
|
private
|
335
|
+
# @since 0.1.0
|
336
|
+
# @api private
|
325
337
|
def path
|
326
338
|
rest_path.join(action_name)
|
327
339
|
end
|
328
340
|
|
341
|
+
# @since 0.1.0
|
342
|
+
# @api private
|
329
343
|
def as
|
330
344
|
[ action_name, super ].join(self.class.named_route_separator).to_sym
|
331
345
|
end
|
@@ -62,6 +62,8 @@ module Hanami
|
|
62
62
|
# @see Hanami::Router#resources
|
63
63
|
class MemberAction < Resource::MemberAction
|
64
64
|
private
|
65
|
+
# @since 0.1.0
|
66
|
+
# @api private
|
65
67
|
def path(action_name)
|
66
68
|
rest_path.join(Action.identifier, action_name)
|
67
69
|
end
|
@@ -73,6 +75,8 @@ module Hanami
|
|
73
75
|
# @since 0.1.0
|
74
76
|
module DefaultMemberAction
|
75
77
|
private
|
78
|
+
# @since 0.1.0
|
79
|
+
# @api private
|
76
80
|
def path
|
77
81
|
rest_path.join(Action.identifier)
|
78
82
|
end
|
@@ -123,6 +127,8 @@ module Hanami
|
|
123
127
|
include DefaultMemberAction
|
124
128
|
|
125
129
|
private
|
130
|
+
# @since 0.1.0
|
131
|
+
# @api private
|
126
132
|
def path
|
127
133
|
super.join(action_name)
|
128
134
|
end
|
data/lib/hanami/routing/route.rb
CHANGED
@@ -7,6 +7,7 @@ module Hanami
|
|
7
7
|
# @api private
|
8
8
|
#
|
9
9
|
# @since 0.1.0
|
10
|
+
# @api private
|
10
11
|
#
|
11
12
|
# @see http://rdoc.info/gems/http_router/HttpRouter/Route
|
12
13
|
#
|
@@ -61,6 +62,7 @@ module Hanami
|
|
61
62
|
end
|
62
63
|
|
63
64
|
private
|
65
|
+
# @api private
|
64
66
|
def to=(dest = nil, &blk)
|
65
67
|
self.to dest, &blk
|
66
68
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hanami-router
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.0.
|
4
|
+
version: 1.0.0.beta3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Luca Guidi
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2017-03-
|
13
|
+
date: 2017-03-17 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rack
|