hanami-router 1.3.2 → 2.0.0.alpha1

Sign up to get free protection for your applications and to get access to all the features.
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