hanami-router 1.3.2 → 2.0.0.alpha5

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 (46) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +43 -0
  3. data/LICENSE.md +1 -1
  4. data/README.md +98 -444
  5. data/hanami-router.gemspec +23 -19
  6. data/lib/hanami/middleware/body_parser.rb +21 -15
  7. data/lib/hanami/middleware/body_parser/class_interface.rb +62 -56
  8. data/lib/hanami/middleware/body_parser/errors.rb +7 -4
  9. data/lib/hanami/middleware/body_parser/json_parser.rb +9 -7
  10. data/lib/hanami/middleware/body_parser/parser.rb +58 -0
  11. data/lib/hanami/middleware/error.rb +16 -0
  12. data/lib/hanami/router.rb +608 -955
  13. data/lib/hanami/router/block.rb +88 -0
  14. data/lib/hanami/router/error.rb +67 -0
  15. data/lib/hanami/router/inspector.rb +38 -0
  16. data/lib/hanami/router/node.rb +91 -0
  17. data/lib/hanami/router/params.rb +35 -0
  18. data/lib/hanami/router/prefix.rb +67 -0
  19. data/lib/hanami/router/recognized_route.rb +92 -0
  20. data/lib/hanami/router/redirect.rb +33 -0
  21. data/lib/hanami/router/route.rb +130 -0
  22. data/lib/hanami/router/segment.rb +19 -0
  23. data/lib/hanami/router/trie.rb +63 -0
  24. data/lib/hanami/router/url_helpers.rb +40 -0
  25. data/lib/hanami/router/version.rb +4 -1
  26. metadata +61 -39
  27. data/lib/hanami-router.rb +0 -1
  28. data/lib/hanami/routing/endpoint.rb +0 -195
  29. data/lib/hanami/routing/endpoint_resolver.rb +0 -238
  30. data/lib/hanami/routing/error.rb +0 -7
  31. data/lib/hanami/routing/force_ssl.rb +0 -212
  32. data/lib/hanami/routing/http_router.rb +0 -220
  33. data/lib/hanami/routing/http_router_monkey_patch.rb +0 -38
  34. data/lib/hanami/routing/namespace.rb +0 -98
  35. data/lib/hanami/routing/parsers.rb +0 -113
  36. data/lib/hanami/routing/parsing/json_parser.rb +0 -33
  37. data/lib/hanami/routing/parsing/parser.rb +0 -61
  38. data/lib/hanami/routing/recognized_route.rb +0 -219
  39. data/lib/hanami/routing/resource.rb +0 -119
  40. data/lib/hanami/routing/resource/action.rb +0 -402
  41. data/lib/hanami/routing/resource/nested.rb +0 -41
  42. data/lib/hanami/routing/resource/options.rb +0 -74
  43. data/lib/hanami/routing/resources.rb +0 -48
  44. data/lib/hanami/routing/resources/action.rb +0 -156
  45. data/lib/hanami/routing/route.rb +0 -71
  46. data/lib/hanami/routing/routes_inspector.rb +0 -221
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Hanami
4
+ class Router
5
+ # HTTP Redirect
6
+ #
7
+ # @since 2.0.0
8
+ # @api private
9
+ class Redirect
10
+ # @since 2.0.0
11
+ # @api private
12
+ attr_reader :destination
13
+
14
+ # @since 2.0.0
15
+ # @api private
16
+ attr_reader :code
17
+
18
+ # @since 2.0.0
19
+ # @api private
20
+ def initialize(destination, code, endpoint)
21
+ @destination = destination
22
+ @code = code
23
+ @endpoint = endpoint
24
+ end
25
+
26
+ # @since 2.0.0
27
+ # @api private
28
+ def call(env)
29
+ @endpoint.call(env)
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,130 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "hanami/router/redirect"
4
+ require "hanami/router/block"
5
+
6
+ module Hanami
7
+ class Router
8
+ class Route
9
+ # @api private
10
+ # @since 2.0.0
11
+ attr_reader :http_method
12
+
13
+ # @api private
14
+ # @since 2.0.0
15
+ attr_reader :path
16
+
17
+ # @api private
18
+ # @since 2.0.0
19
+ attr_reader :to
20
+
21
+ # @api private
22
+ # @since 2.0.0
23
+ attr_reader :as
24
+
25
+ # @api private
26
+ # @since 2.0.0
27
+ attr_reader :constraints
28
+
29
+ # @api private
30
+ # @since 2.0.0
31
+ def initialize(http_method:, path:, to:, as: nil, constraints: {}, blk: nil) # rubocop:disable Metrics/ParameterLists
32
+ @http_method = http_method
33
+ @path = path
34
+ @to = to
35
+ @as = as
36
+ @constraints = constraints
37
+ @blk = blk
38
+ freeze
39
+ end
40
+
41
+ # @api private
42
+ # @since 2.0.0
43
+ def to_inspect
44
+ return EMPTY_ROUTE if head?
45
+
46
+ result = http_method.to_s.ljust(SMALL_STRING_JUSTIFY_AMOUNT)
47
+ result += path.ljust(LARGE_STRING_JUSTIFY_AMOUNT)
48
+ result += inspect_to(to).ljust(LARGE_STRING_JUSTIFY_AMOUNT)
49
+ result += "as #{as.inspect}".ljust(MEDIUM_STRING_JUSTIFY_AMOUNT) if as
50
+
51
+ if constraints?
52
+ result += "(#{inspect_constraints(constraints)})".ljust(EXTRA_LARGE_STRING_JUSTIFY_AMOUNT)
53
+ end
54
+
55
+ result
56
+ end
57
+
58
+ private
59
+
60
+ # @api private
61
+ # @since 2.0.0
62
+ EMPTY_ROUTE = ""
63
+ private_constant :EMPTY_ROUTE
64
+
65
+ # @api private
66
+ # @since 2.0.0
67
+ ROUTE_CONSTRAINT_SEPARATOR = ", "
68
+ private_constant :ROUTE_CONSTRAINT_SEPARATOR
69
+
70
+ # @api private
71
+ # @since 2.0.0
72
+ SMALL_STRING_JUSTIFY_AMOUNT = 8
73
+ private_constant :SMALL_STRING_JUSTIFY_AMOUNT
74
+
75
+ # @api private
76
+ # @since 2.0.0
77
+ MEDIUM_STRING_JUSTIFY_AMOUNT = 20
78
+ private_constant :MEDIUM_STRING_JUSTIFY_AMOUNT
79
+
80
+ # @api private
81
+ # @since 2.0.0
82
+ LARGE_STRING_JUSTIFY_AMOUNT = 30
83
+ private_constant :LARGE_STRING_JUSTIFY_AMOUNT
84
+
85
+ # @api private
86
+ # @since 2.0.0
87
+ EXTRA_LARGE_STRING_JUSTIFY_AMOUNT = 40
88
+ private_constant :EXTRA_LARGE_STRING_JUSTIFY_AMOUNT
89
+
90
+ # @api private
91
+ # @since 2.0.0
92
+ def head?
93
+ http_method == "HEAD"
94
+ end
95
+
96
+ # @api private
97
+ # @since 2.0.0
98
+ def constraints?
99
+ constraints.any?
100
+ end
101
+
102
+ # @api private
103
+ # @since 2.0.0
104
+ def inspect_to(to)
105
+ case to
106
+ when String
107
+ to
108
+ when Proc
109
+ "(proc)"
110
+ when Class
111
+ to.name || "(class)"
112
+ when Block
113
+ "(block)"
114
+ when Redirect
115
+ "#{to.destination} (HTTP #{to.code})"
116
+ else
117
+ inspect_to(to.class)
118
+ end
119
+ end
120
+
121
+ # @api private
122
+ # @since 2.0.0
123
+ def inspect_constraints(constraints)
124
+ constraints.map do |key, value|
125
+ "#{key}: #{value.inspect}"
126
+ end.join(ROUTE_CONSTRAINT_SEPARATOR)
127
+ end
128
+ end
129
+ end
130
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "mustermann/rails"
4
+
5
+ module Hanami
6
+ class Router
7
+ # Route path
8
+ #
9
+ # @since 2.0.0
10
+ # @api private
11
+ class Segment
12
+ # @since 2.0.0
13
+ # @api private
14
+ def self.fabricate(segment, **constraints)
15
+ Mustermann.new(segment, type: :rails, version: "5.0", capture: constraints)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "hanami/router/node"
4
+
5
+ module Hanami
6
+ class Router
7
+ # Trie data structure to store routes
8
+ #
9
+ # @api private
10
+ # @since 2.0.0
11
+ class Trie
12
+ # @api private
13
+ # @since 2.0.0
14
+ attr_reader :root
15
+
16
+ # @api private
17
+ # @since 2.0.0
18
+ def initialize
19
+ @root = Node.new
20
+ end
21
+
22
+ # @api private
23
+ # @since 2.0.0
24
+ def add(path, to, constraints)
25
+ node = @root
26
+ for_each_segment(path) do |segment|
27
+ node = node.put(segment, constraints)
28
+ end
29
+
30
+ node.leaf!(to)
31
+ end
32
+
33
+ # @api private
34
+ # @since 2.0.0
35
+ def find(path)
36
+ node = @root
37
+ params = {}
38
+
39
+ for_each_segment(path) do |segment|
40
+ break unless node
41
+
42
+ child, captures = node.get(segment)
43
+ params.merge!(captures) if captures
44
+
45
+ node = child
46
+ end
47
+
48
+ return [node.to, params] if node&.leaf?
49
+
50
+ nil
51
+ end
52
+
53
+ private
54
+
55
+ # @api private
56
+ # @since 2.0.0
57
+ def for_each_segment(path, &blk)
58
+ _, *segments = path.split(/\//)
59
+ segments.each(&blk)
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "hanami/router/error"
4
+ require "mustermann/error"
5
+
6
+ module Hanami
7
+ class Router
8
+ # URL Helpers
9
+ class UrlHelpers
10
+ # @since 2.0.0
11
+ # @api private
12
+ def initialize(base_url)
13
+ @base_url = base_url
14
+ @named = {}
15
+ end
16
+
17
+ # @since 2.0.0
18
+ # @api private
19
+ def add(name, segment)
20
+ @named[name] = segment
21
+ end
22
+
23
+ # @since 2.0.0
24
+ # @api public
25
+ def path(name, variables = {})
26
+ @named.fetch(name.to_sym) do
27
+ raise InvalidRouteException.new(name)
28
+ end.expand(:append, variables)
29
+ rescue Mustermann::ExpandError => exception
30
+ raise InvalidRouteExpansionException.new(name, exception.message)
31
+ end
32
+
33
+ # @since 2.0.0
34
+ # @api public
35
+ def url(name, variables = {})
36
+ @base_url + path(name, variables)
37
+ end
38
+ end
39
+ end
40
+ end
@@ -1,6 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Hanami
2
4
  class Router
3
5
  # @since 0.1.0
4
- VERSION = '1.3.2'.freeze
6
+ # @api public
7
+ VERSION = "2.0.0.alpha5"
5
8
  end
6
9
  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.alpha5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Luca Guidi
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-01-13 00:00:00.000000000 Z
11
+ date: 2021-05-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -25,33 +25,33 @@ 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
41
  - !ruby/object:Gem::Dependency
42
- name: hanami-utils
42
+ name: mustermann-contrib
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '1.3'
47
+ version: '1.0'
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'
54
+ version: '1.0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: bundler
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -106,14 +106,42 @@ dependencies:
106
106
  requirements:
107
107
  - - "~>"
108
108
  - !ruby/object:Gem::Version
109
- version: '3.7'
109
+ version: '3.8'
110
110
  type: :development
111
111
  prerelease: false
112
112
  version_requirements: !ruby/object:Gem::Requirement
113
113
  requirements:
114
114
  - - "~>"
115
115
  - !ruby/object:Gem::Version
116
- version: '3.7'
116
+ version: '3.8'
117
+ - !ruby/object:Gem::Dependency
118
+ name: rubocop
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - '='
122
+ - !ruby/object:Gem::Version
123
+ version: '0.91'
124
+ type: :development
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - '='
129
+ - !ruby/object:Gem::Version
130
+ version: '0.91'
131
+ - !ruby/object:Gem::Dependency
132
+ name: rubocop-performance
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - '='
136
+ - !ruby/object:Gem::Version
137
+ version: 1.8.1
138
+ type: :development
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - '='
143
+ - !ruby/object:Gem::Version
144
+ version: 1.8.1
117
145
  description: Rack compatible HTTP router for Ruby
118
146
  email:
119
147
  - me@lucaguidi.com
@@ -125,37 +153,31 @@ 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/body_parser/parser.rb
161
+ - lib/hanami/middleware/error.rb
133
162
  - lib/hanami/router.rb
163
+ - lib/hanami/router/block.rb
164
+ - lib/hanami/router/error.rb
165
+ - lib/hanami/router/inspector.rb
166
+ - lib/hanami/router/node.rb
167
+ - lib/hanami/router/params.rb
168
+ - lib/hanami/router/prefix.rb
169
+ - lib/hanami/router/recognized_route.rb
170
+ - lib/hanami/router/redirect.rb
171
+ - lib/hanami/router/route.rb
172
+ - lib/hanami/router/segment.rb
173
+ - lib/hanami/router/trie.rb
174
+ - lib/hanami/router/url_helpers.rb
134
175
  - lib/hanami/router/version.rb
135
- - lib/hanami/routing/endpoint.rb
136
- - 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
145
- - lib/hanami/routing/recognized_route.rb
146
- - lib/hanami/routing/resource.rb
147
- - lib/hanami/routing/resource/action.rb
148
- - lib/hanami/routing/resource/nested.rb
149
- - lib/hanami/routing/resource/options.rb
150
- - lib/hanami/routing/resources.rb
151
- - lib/hanami/routing/resources/action.rb
152
- - lib/hanami/routing/route.rb
153
- - lib/hanami/routing/routes_inspector.rb
154
176
  homepage: http://hanamirb.org
155
177
  licenses:
156
178
  - MIT
157
179
  metadata: {}
158
- post_install_message:
180
+ post_install_message:
159
181
  rdoc_options: []
160
182
  require_paths:
161
183
  - lib
@@ -163,15 +185,15 @@ 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.6.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
174
- signing_key:
195
+ rubygems_version: 3.2.4
196
+ signing_key:
175
197
  specification_version: 4
176
198
  summary: Rack compatible HTTP router for Ruby and Hanami
177
199
  test_files: []