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.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +14 -3
  3. data/README.md +192 -154
  4. data/hanami-router.gemspec +23 -20
  5. data/lib/hanami/middleware/body_parser.rb +17 -13
  6. data/lib/hanami/middleware/body_parser/class_interface.rb +56 -56
  7. data/lib/hanami/middleware/body_parser/errors.rb +7 -4
  8. data/lib/hanami/middleware/body_parser/json_parser.rb +5 -3
  9. data/lib/hanami/middleware/error.rb +16 -0
  10. data/lib/hanami/router.rb +262 -149
  11. data/lib/hanami/router/version.rb +3 -1
  12. data/lib/hanami/routing.rb +193 -0
  13. data/lib/hanami/routing/endpoint.rb +122 -104
  14. data/lib/hanami/routing/endpoint_resolver.rb +20 -16
  15. data/lib/hanami/routing/prefix.rb +102 -0
  16. data/lib/hanami/routing/recognized_route.rb +40 -26
  17. data/lib/hanami/routing/resource.rb +9 -7
  18. data/lib/hanami/routing/resource/action.rb +58 -33
  19. data/lib/hanami/routing/resource/nested.rb +4 -1
  20. data/lib/hanami/routing/resource/options.rb +3 -1
  21. data/lib/hanami/routing/resources.rb +6 -4
  22. data/lib/hanami/routing/resources/action.rb +11 -6
  23. data/lib/hanami/routing/routes_inspector.rb +22 -20
  24. data/lib/hanami/routing/scope.rb +112 -0
  25. metadata +47 -25
  26. data/lib/hanami-router.rb +0 -1
  27. data/lib/hanami/routing/error.rb +0 -7
  28. data/lib/hanami/routing/force_ssl.rb +0 -212
  29. data/lib/hanami/routing/http_router.rb +0 -220
  30. data/lib/hanami/routing/http_router_monkey_patch.rb +0 -38
  31. data/lib/hanami/routing/namespace.rb +0 -98
  32. data/lib/hanami/routing/parsers.rb +0 -113
  33. data/lib/hanami/routing/parsing/json_parser.rb +0 -33
  34. data/lib/hanami/routing/parsing/parser.rb +0 -61
  35. 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 = '/'.freeze
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 = ( actions & only ) - except
44
+ @actions = (actions & only) - except
43
45
 
44
46
  @options = options
45
47
  end
@@ -1,5 +1,7 @@
1
- require 'hanami/routing/resource'
2
- require 'hanami/routing/resources/action'
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 = [:index, :new, :create, :show, :edit, :update, :destroy]
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
- "/:#{ Hanami::Utils::String.singularize(route_param) }_id/"
46
+ "/:#{@router.inflector.singularize(route_param)}_id/"
45
47
  end
46
48
  end
47
49
  end
@@ -1,6 +1,7 @@
1
- require 'hanami/utils/string'
2
- require 'hanami/utils/path_prefix'
3
- require 'hanami/routing/resource'
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 = ':id'.freeze
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
- Hanami::Utils::String.pluralize(super)
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
- Hanami::Utils::String.pluralize(super(action_name))
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
- require 'hanami/utils/path_prefix'
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".freeze
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 = ', '.freeze
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 = Hash[
26
- name: 'Name',
27
- methods: 'Method',
28
- path: 'Path',
29
- endpoint: 'Action'
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 = 'Name'.freeze
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".freeze
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
- inspect_router(formatter, router, route, base_path)
166
- else
167
- inspect_route(formatter, route, base_path)
168
- end
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: route.name,
196
- methods: route.request_methods.to_a.join(HTTP_METHODS_SEPARATOR),
197
- path: base_path.join(route.path_for_generation),
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: 1.3.2
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: 2020-01-13 00:00:00.000000000 Z
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: http_router
28
+ name: mustermann
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '='
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 0.11.2
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.11.2
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: '1.3'
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.3'
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: '13'
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: '13'
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/error.rb
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.3.0
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: '0'
193
+ version: 1.3.1
172
194
  requirements: []
173
- rubygems_version: 3.1.2
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