hanami-router 1.3.2 → 2.0.0.alpha1
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 +14 -3
- data/README.md +192 -154
- data/hanami-router.gemspec +23 -20
- data/lib/hanami/middleware/body_parser.rb +17 -13
- data/lib/hanami/middleware/body_parser/class_interface.rb +56 -56
- data/lib/hanami/middleware/body_parser/errors.rb +7 -4
- data/lib/hanami/middleware/body_parser/json_parser.rb +5 -3
- data/lib/hanami/middleware/error.rb +16 -0
- data/lib/hanami/router.rb +262 -149
- data/lib/hanami/router/version.rb +3 -1
- data/lib/hanami/routing.rb +193 -0
- data/lib/hanami/routing/endpoint.rb +122 -104
- data/lib/hanami/routing/endpoint_resolver.rb +20 -16
- data/lib/hanami/routing/prefix.rb +102 -0
- data/lib/hanami/routing/recognized_route.rb +40 -26
- data/lib/hanami/routing/resource.rb +9 -7
- data/lib/hanami/routing/resource/action.rb +58 -33
- data/lib/hanami/routing/resource/nested.rb +4 -1
- data/lib/hanami/routing/resource/options.rb +3 -1
- data/lib/hanami/routing/resources.rb +6 -4
- data/lib/hanami/routing/resources/action.rb +11 -6
- data/lib/hanami/routing/routes_inspector.rb +22 -20
- data/lib/hanami/routing/scope.rb +112 -0
- metadata +47 -25
- data/lib/hanami-router.rb +0 -1
- data/lib/hanami/routing/error.rb +0 -7
- data/lib/hanami/routing/force_ssl.rb +0 -212
- data/lib/hanami/routing/http_router.rb +0 -220
- data/lib/hanami/routing/http_router_monkey_patch.rb +0 -38
- data/lib/hanami/routing/namespace.rb +0 -98
- data/lib/hanami/routing/parsers.rb +0 -113
- data/lib/hanami/routing/parsing/json_parser.rb +0 -33
- data/lib/hanami/routing/parsing/parser.rb +0 -61
- data/lib/hanami/routing/route.rb +0 -71
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Hanami
|
2
4
|
module Routing
|
3
5
|
class Resource
|
@@ -8,7 +10,7 @@ module Hanami
|
|
8
10
|
class Nested
|
9
11
|
# @api private
|
10
12
|
# @since 0.4.0
|
11
|
-
SEPARATOR =
|
13
|
+
SEPARATOR = "/"
|
12
14
|
|
13
15
|
# @api private
|
14
16
|
# @since 0.4.0
|
@@ -32,6 +34,7 @@ module Hanami
|
|
32
34
|
# @since 0.4.0
|
33
35
|
def _calculate(param_wildcard, resource = nil)
|
34
36
|
return if resource.nil?
|
37
|
+
|
35
38
|
@path << resource.wildcard_param(param_wildcard.pop)
|
36
39
|
_calculate(param_wildcard, resource.parent)
|
37
40
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Hanami
|
2
4
|
module Routing
|
3
5
|
class Resource
|
@@ -39,7 +41,7 @@ module Hanami
|
|
39
41
|
def initialize(actions, options = {})
|
40
42
|
only = Array(options.delete(:only) || actions)
|
41
43
|
except = Array(options.delete(:except))
|
42
|
-
@actions = (
|
44
|
+
@actions = (actions & only) - except
|
43
45
|
|
44
46
|
@options = options
|
45
47
|
end
|
@@ -1,5 +1,7 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "hanami/routing/resource"
|
4
|
+
require "hanami/routing/resources/action"
|
3
5
|
|
4
6
|
module Hanami
|
5
7
|
module Routing
|
@@ -16,7 +18,7 @@ module Hanami
|
|
16
18
|
#
|
17
19
|
# @api private
|
18
20
|
# @since 0.1.0
|
19
|
-
self.actions = [
|
21
|
+
self.actions = %i[index new create show edit update destroy]
|
20
22
|
|
21
23
|
# Action class
|
22
24
|
#
|
@@ -41,7 +43,7 @@ module Hanami
|
|
41
43
|
# @api private
|
42
44
|
# @since 0.4.0
|
43
45
|
def wildcard_param(route_param = nil)
|
44
|
-
"/:#{
|
46
|
+
"/:#{@router.inflector.singularize(route_param)}_id/"
|
45
47
|
end
|
46
48
|
end
|
47
49
|
end
|
@@ -1,6 +1,7 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "hanami/utils/path_prefix"
|
4
|
+
require "hanami/routing/resource"
|
4
5
|
|
5
6
|
module Hanami
|
6
7
|
module Routing
|
@@ -24,7 +25,7 @@ module Hanami
|
|
24
25
|
# @since 0.2.0
|
25
26
|
# @api private
|
26
27
|
class_attribute :identifier
|
27
|
-
self.identifier =
|
28
|
+
self.identifier = ":id"
|
28
29
|
end
|
29
30
|
|
30
31
|
# Pluralize concrete actions
|
@@ -33,12 +34,13 @@ module Hanami
|
|
33
34
|
# @since 0.4.0
|
34
35
|
module PluralizedAction
|
35
36
|
private
|
37
|
+
|
36
38
|
# The name of the RESTful action.
|
37
39
|
#
|
38
40
|
# @api private
|
39
41
|
# @since 0.4.0
|
40
42
|
def as
|
41
|
-
|
43
|
+
@router.inflector.pluralize(super).to_sym
|
42
44
|
end
|
43
45
|
end
|
44
46
|
|
@@ -50,7 +52,7 @@ module Hanami
|
|
50
52
|
# @see Hanami::Router#resources
|
51
53
|
class CollectionAction < Resource::CollectionAction
|
52
54
|
def as(action_name)
|
53
|
-
|
55
|
+
@router.inflector.pluralize(super(action_name)).to_sym
|
54
56
|
end
|
55
57
|
end
|
56
58
|
|
@@ -62,6 +64,7 @@ module Hanami
|
|
62
64
|
# @see Hanami::Router#resources
|
63
65
|
class MemberAction < Resource::MemberAction
|
64
66
|
private
|
67
|
+
|
65
68
|
# @since 0.1.0
|
66
69
|
# @api private
|
67
70
|
def path(action_name)
|
@@ -75,6 +78,7 @@ module Hanami
|
|
75
78
|
# @since 0.1.0
|
76
79
|
module DefaultMemberAction
|
77
80
|
private
|
81
|
+
|
78
82
|
# @since 0.1.0
|
79
83
|
# @api private
|
80
84
|
def path
|
@@ -127,6 +131,7 @@ module Hanami
|
|
127
131
|
include DefaultMemberAction
|
128
132
|
|
129
133
|
private
|
134
|
+
|
130
135
|
# @since 0.1.0
|
131
136
|
# @api private
|
132
137
|
def path
|
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "hanami/utils/path_prefix"
|
2
4
|
|
3
5
|
module Hanami
|
4
6
|
module Routing
|
@@ -10,36 +12,36 @@ module Hanami
|
|
10
12
|
#
|
11
13
|
# @since 0.2.0
|
12
14
|
# @api private
|
13
|
-
FORMATTER = "%<name>20s %<methods>-10s %<path>-30s %<endpoint>-30s\n"
|
15
|
+
FORMATTER = "%<name>20s %<methods>-10s %<path>-30s %<endpoint>-30s\n"
|
14
16
|
|
15
17
|
# Default HTTP methods separator
|
16
18
|
#
|
17
19
|
# @since 0.2.0
|
18
20
|
# @api private
|
19
|
-
HTTP_METHODS_SEPARATOR =
|
21
|
+
HTTP_METHODS_SEPARATOR = ", "
|
20
22
|
|
21
23
|
# Default inspector header hash values
|
22
24
|
#
|
23
25
|
# @since 0.5.0
|
24
26
|
# @api private
|
25
|
-
INSPECTOR_HEADER_HASH =
|
26
|
-
name:
|
27
|
-
methods:
|
28
|
-
path:
|
29
|
-
endpoint:
|
27
|
+
INSPECTOR_HEADER_HASH = ::Hash[
|
28
|
+
name: "Name",
|
29
|
+
methods: "Method",
|
30
|
+
path: "Path",
|
31
|
+
endpoint: "Action"
|
30
32
|
].freeze
|
31
33
|
|
32
34
|
# Default inspector header name values
|
33
35
|
#
|
34
36
|
# @since 0.5.0
|
35
37
|
# @api private
|
36
|
-
INSPECTOR_HEADER_NAME =
|
38
|
+
INSPECTOR_HEADER_NAME = "Name"
|
37
39
|
|
38
40
|
# Empty line string
|
39
41
|
#
|
40
42
|
# @since 0.5.0
|
41
43
|
# @api private
|
42
|
-
EMPTY_LINE = "\n"
|
44
|
+
EMPTY_LINE = "\n"
|
43
45
|
|
44
46
|
# Instantiate a new inspector
|
45
47
|
#
|
@@ -155,17 +157,17 @@ module Hanami
|
|
155
157
|
# @see Hanami::Routing::RoutesInspector#FORMATTER
|
156
158
|
# @see Hanami::Routing::RoutesInspector#to_s
|
157
159
|
def inspect_routes(formatter, base_path)
|
158
|
-
result =
|
160
|
+
result = ""
|
159
161
|
|
160
|
-
# TODO refactoring: replace conditional with polymorphism
|
162
|
+
# TODO: refactoring: replace conditional with polymorphism
|
161
163
|
# We're exposing too much knowledge from Routing::Route:
|
162
164
|
# #path_for_generation and #base_path
|
163
165
|
@routes.each do |route|
|
164
|
-
result << if router = route.nested_router
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
166
|
+
result << if (router = route.nested_router)
|
167
|
+
inspect_router(formatter, router, route, base_path)
|
168
|
+
else
|
169
|
+
inspect_route(formatter, route, base_path)
|
170
|
+
end
|
169
171
|
end
|
170
172
|
|
171
173
|
result
|
@@ -192,9 +194,9 @@ module Hanami
|
|
192
194
|
# @see Hanami::Routing::RoutesInspector#to_s
|
193
195
|
def inspect_route(formatter, route, base_path)
|
194
196
|
formatter % Hash[
|
195
|
-
name:
|
196
|
-
methods:
|
197
|
-
path:
|
197
|
+
name: route.name,
|
198
|
+
methods: route.request_methods.to_a.join(HTTP_METHODS_SEPARATOR),
|
199
|
+
path: base_path.join(route.path_for_generation),
|
198
200
|
endpoint: route.dest.inspect
|
199
201
|
]
|
200
202
|
end
|
@@ -0,0 +1,112 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "delegate"
|
4
|
+
require "hanami/utils/path_prefix"
|
5
|
+
|
6
|
+
module Hanami
|
7
|
+
module Routing
|
8
|
+
# Prefix for routes.
|
9
|
+
# Implementation of Hanami::Router#prefix
|
10
|
+
#
|
11
|
+
# @since 2.0.0
|
12
|
+
# @api private
|
13
|
+
#
|
14
|
+
# @see Hanami::Router#prefix
|
15
|
+
class Scope < SimpleDelegator
|
16
|
+
# @api private
|
17
|
+
# @since 2.0.0
|
18
|
+
def initialize(router, prefix, namespace, configuration, &blk)
|
19
|
+
@router = router
|
20
|
+
@namespace = namespace
|
21
|
+
@configuration = configuration
|
22
|
+
@prefix = Utils::PathPrefix.new(prefix)
|
23
|
+
__setobj__(@router)
|
24
|
+
instance_eval(&blk)
|
25
|
+
end
|
26
|
+
|
27
|
+
def root(to:, as: :root, **, &blk)
|
28
|
+
super(to: to, as: route_name(as), prefix: @prefix, namespace: @namespace, configuration: @configuration, &blk)
|
29
|
+
end
|
30
|
+
|
31
|
+
# @api private
|
32
|
+
# @since 2.0.0
|
33
|
+
def get(path, as: nil, **options, &endpoint)
|
34
|
+
super(@prefix.join(path), options.merge(as: route_name(as), namespace: @namespace, configuration: @configuration), &endpoint)
|
35
|
+
end
|
36
|
+
|
37
|
+
# @api private
|
38
|
+
# @since 2.0.0
|
39
|
+
def post(path, as: nil, **options, &endpoint)
|
40
|
+
super(@prefix.join(path), options.merge(as: route_name(as), namespace: @namespace, configuration: @configuration), &endpoint)
|
41
|
+
end
|
42
|
+
|
43
|
+
# @api private
|
44
|
+
# @since 2.0.0
|
45
|
+
def put(path, as: nil, **options, &endpoint)
|
46
|
+
super(@prefix.join(path), options.merge(as: route_name(as), namespace: @namespace, configuration: @configuration), &endpoint)
|
47
|
+
end
|
48
|
+
|
49
|
+
# @api private
|
50
|
+
# @since 2.0.0
|
51
|
+
def patch(path, as: nil, **options, &endpoint)
|
52
|
+
super(@prefix.join(path), options.merge(as: route_name(as), namespace: @namespace, configuration: @configuration), &endpoint)
|
53
|
+
end
|
54
|
+
|
55
|
+
# @api private
|
56
|
+
# @since 2.0.0
|
57
|
+
def delete(path, as: nil, **options, &endpoint)
|
58
|
+
super(@prefix.join(path), options.merge(as: route_name(as), namespace: @namespace, configuration: @configuration), &endpoint)
|
59
|
+
end
|
60
|
+
|
61
|
+
# @api private
|
62
|
+
# @since 2.0.0
|
63
|
+
def trace(path, as: nil, **options, &endpoint)
|
64
|
+
super(@prefix.join(path), options.merge(as: route_name(as), namespace: @namespace, configuration: @configuration), &endpoint)
|
65
|
+
end
|
66
|
+
|
67
|
+
# @api private
|
68
|
+
# @since 2.0.0
|
69
|
+
def options(path, as: nil, **options, &endpoint)
|
70
|
+
super(@prefix.join(path), options.merge(as: route_name(as), namespace: @namespace, configuration: @configuration), &endpoint)
|
71
|
+
end
|
72
|
+
|
73
|
+
# @api private
|
74
|
+
# @since 2.0.0
|
75
|
+
def resource(name, options = {})
|
76
|
+
super(name, options.merge(prefix: @prefix.relative_join(options[:prefix]), namespace: @namespace, configuration: @configuration))
|
77
|
+
end
|
78
|
+
|
79
|
+
# @api private
|
80
|
+
# @since 2.0.0
|
81
|
+
def resources(name, options = {})
|
82
|
+
super(name, options.merge(prefix: @prefix.relative_join(options[:prefix]), namespace: @namespace, configuration: @configuration))
|
83
|
+
end
|
84
|
+
|
85
|
+
# @api private
|
86
|
+
# @since 2.0.0
|
87
|
+
def redirect(path, options = {}, &endpoint)
|
88
|
+
super(@prefix.join(path), options.merge(to: @prefix.join(options[:to])), &endpoint)
|
89
|
+
end
|
90
|
+
|
91
|
+
# @api private
|
92
|
+
# @since 2.0.0
|
93
|
+
def mount(app, options)
|
94
|
+
super(app, options.merge(at: @prefix.join(options[:at])))
|
95
|
+
end
|
96
|
+
|
97
|
+
# @api private
|
98
|
+
# @since 2.0.0
|
99
|
+
def prefix(path, &blk)
|
100
|
+
super(@prefix.join(path), namespace: @namespace, configuration: @configuration, &blk)
|
101
|
+
end
|
102
|
+
|
103
|
+
private
|
104
|
+
|
105
|
+
ROUTE_NAME_SEPARATOR = "_"
|
106
|
+
|
107
|
+
def route_name(as)
|
108
|
+
@prefix.relative_join(as, ROUTE_NAME_SEPARATOR).to_sym unless as.nil?
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
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:
|
4
|
+
version: 2.0.0.alpha1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Luca Guidi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-01-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rack
|
@@ -25,33 +25,61 @@ dependencies:
|
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '2.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: mustermann
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0
|
33
|
+
version: '1.0'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 0
|
40
|
+
version: '1.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: mustermann-contrib
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.0'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: hanami-utils
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
44
58
|
requirements:
|
45
59
|
- - "~>"
|
46
60
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
61
|
+
version: 2.0.alpha
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 2.0.alpha
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: dry-inflector
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0.1'
|
48
76
|
type: :runtime
|
49
77
|
prerelease: false
|
50
78
|
version_requirements: !ruby/object:Gem::Requirement
|
51
79
|
requirements:
|
52
80
|
- - "~>"
|
53
81
|
- !ruby/object:Gem::Version
|
54
|
-
version: '1
|
82
|
+
version: '0.1'
|
55
83
|
- !ruby/object:Gem::Dependency
|
56
84
|
name: bundler
|
57
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -78,14 +106,14 @@ dependencies:
|
|
78
106
|
requirements:
|
79
107
|
- - "~>"
|
80
108
|
- !ruby/object:Gem::Version
|
81
|
-
version: '
|
109
|
+
version: '12'
|
82
110
|
type: :development
|
83
111
|
prerelease: false
|
84
112
|
version_requirements: !ruby/object:Gem::Requirement
|
85
113
|
requirements:
|
86
114
|
- - "~>"
|
87
115
|
- !ruby/object:Gem::Version
|
88
|
-
version: '
|
116
|
+
version: '12'
|
89
117
|
- !ruby/object:Gem::Dependency
|
90
118
|
name: rack-test
|
91
119
|
requirement: !ruby/object:Gem::Requirement
|
@@ -125,23 +153,17 @@ files:
|
|
125
153
|
- LICENSE.md
|
126
154
|
- README.md
|
127
155
|
- hanami-router.gemspec
|
128
|
-
- lib/hanami-router.rb
|
129
156
|
- lib/hanami/middleware/body_parser.rb
|
130
157
|
- lib/hanami/middleware/body_parser/class_interface.rb
|
131
158
|
- lib/hanami/middleware/body_parser/errors.rb
|
132
159
|
- lib/hanami/middleware/body_parser/json_parser.rb
|
160
|
+
- lib/hanami/middleware/error.rb
|
133
161
|
- lib/hanami/router.rb
|
134
162
|
- lib/hanami/router/version.rb
|
163
|
+
- lib/hanami/routing.rb
|
135
164
|
- lib/hanami/routing/endpoint.rb
|
136
165
|
- lib/hanami/routing/endpoint_resolver.rb
|
137
|
-
- lib/hanami/routing/
|
138
|
-
- lib/hanami/routing/force_ssl.rb
|
139
|
-
- lib/hanami/routing/http_router.rb
|
140
|
-
- lib/hanami/routing/http_router_monkey_patch.rb
|
141
|
-
- lib/hanami/routing/namespace.rb
|
142
|
-
- lib/hanami/routing/parsers.rb
|
143
|
-
- lib/hanami/routing/parsing/json_parser.rb
|
144
|
-
- lib/hanami/routing/parsing/parser.rb
|
166
|
+
- lib/hanami/routing/prefix.rb
|
145
167
|
- lib/hanami/routing/recognized_route.rb
|
146
168
|
- lib/hanami/routing/resource.rb
|
147
169
|
- lib/hanami/routing/resource/action.rb
|
@@ -149,8 +171,8 @@ files:
|
|
149
171
|
- lib/hanami/routing/resource/options.rb
|
150
172
|
- lib/hanami/routing/resources.rb
|
151
173
|
- lib/hanami/routing/resources/action.rb
|
152
|
-
- lib/hanami/routing/route.rb
|
153
174
|
- lib/hanami/routing/routes_inspector.rb
|
175
|
+
- lib/hanami/routing/scope.rb
|
154
176
|
homepage: http://hanamirb.org
|
155
177
|
licenses:
|
156
178
|
- MIT
|
@@ -163,14 +185,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
163
185
|
requirements:
|
164
186
|
- - ">="
|
165
187
|
- !ruby/object:Gem::Version
|
166
|
-
version: 2.
|
188
|
+
version: 2.5.0
|
167
189
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
168
190
|
requirements:
|
169
|
-
- - "
|
191
|
+
- - ">"
|
170
192
|
- !ruby/object:Gem::Version
|
171
|
-
version:
|
193
|
+
version: 1.3.1
|
172
194
|
requirements: []
|
173
|
-
rubygems_version: 3.
|
195
|
+
rubygems_version: 3.0.2
|
174
196
|
signing_key:
|
175
197
|
specification_version: 4
|
176
198
|
summary: Rack compatible HTTP router for Ruby and Hanami
|