hanami-router 2.0.0.alpha4 → 2.0.0.alpha5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a855344a3dcd5d256259802c803eae8c7e41aeaeda1f108855d668458ec6c32d
4
- data.tar.gz: 79f333141e1453d4bd4c4f4e09fd41e54bb2cab94d3889268a6a765ec9d52a16
3
+ metadata.gz: d72d9efd8d4b3b0df52796170481b05878e531b2aee3ea09894e6eeccb5562e6
4
+ data.tar.gz: 2078b5956054db900fe4d2f097b62901499ceb1622a57baae326fa921ef62f48
5
5
  SHA512:
6
- metadata.gz: 1dc165c33814c2869852526395de10368b14918b09af6d4dbac56e2610f6ae8dcd8e78eb1034e0b858a48e30d80470976af692e1a235cb58a54561c1dc7393b7
7
- data.tar.gz: a73e23f4d0875143660610be0b8e349be143dcdbed62a258070d0b1973ee876c57b68ae8df90f1fc786bf9e689ec40a16ced52053dbd16f893efe4b62fa70e85
6
+ metadata.gz: 5409a722ae69fc035fcbe54138ecfe504d97d9dcd62f0c3ce04a93f2fa5ca40aa833813b491a3a13d1db972e8e352e9d7e89948dfa3f522d99beafae4908e961
7
+ data.tar.gz: 55505b92589cb74795bd01a6062d32effce16a56d0405b98e726d0ba9d3b54ca301fb464cf0826fdac7e45f1de23a15913a211359c2f908117b1e972684b90d7
data/CHANGELOG.md CHANGED
@@ -1,6 +1,10 @@
1
1
  # Hanami::Router
2
2
  Rack compatible HTTP router for Ruby
3
3
 
4
+ ## v2.0.0.alpha5 - 2021-05-04
5
+ ### Added
6
+ - [Luca Guidi] Introduced `Hanami::Router#to_inspect` which returns a string blob with all the routes formatted for human readability
7
+
4
8
  ## v2.0.0.alpha4 - 2021-01-16
5
9
  ### Added
6
10
  - [Luca Guidi] Official support for MRI 3.0
data/lib/hanami/router.rb CHANGED
@@ -15,6 +15,7 @@ module Hanami
15
15
  require "hanami/router/params"
16
16
  require "hanami/router/trie"
17
17
  require "hanami/router/block"
18
+ require "hanami/router/route"
18
19
  require "hanami/router/url_helpers"
19
20
 
20
21
  # URL helpers for other Hanami integrations
@@ -23,6 +24,12 @@ module Hanami
23
24
  # @since 2.0.0
24
25
  attr_reader :url_helpers
25
26
 
27
+ # Routes for inspection
28
+ #
29
+ # @api private
30
+ # @since 2.0.0
31
+ attr_reader :routes
32
+
26
33
  # Returns the given block as it is.
27
34
  #
28
35
  # @param blk [Proc] a set of route definitions
@@ -61,11 +68,12 @@ module Hanami
61
68
  # Hanami::Router.new do
62
69
  # get "/", to: ->(*) { [200, {}, ["OK"]] }
63
70
  # end
64
- def initialize(base_url: DEFAULT_BASE_URL, prefix: DEFAULT_PREFIX, resolver: DEFAULT_RESOLVER, not_found: NOT_FOUND, block_context: nil, &blk) # rubocop:disable Layout/LineLength
71
+ def initialize(base_url: DEFAULT_BASE_URL, prefix: DEFAULT_PREFIX, resolver: DEFAULT_RESOLVER, not_found: NOT_FOUND, block_context: nil, inspector: nil, &blk) # rubocop:disable Layout/LineLength
65
72
  # TODO: verify if Prefix can handle both name and path prefix
66
73
  @path_prefix = Prefix.new(prefix)
67
74
  @name_prefix = Prefix.new("")
68
75
  @url_helpers = UrlHelpers.new(base_url)
76
+ @base_url = base_url
69
77
  @resolver = resolver
70
78
  @not_found = not_found
71
79
  @block_context = block_context
@@ -73,6 +81,8 @@ module Hanami
73
81
  @variable = {}
74
82
  @globbed = {}
75
83
  @mounted = {}
84
+ @blk = blk
85
+ @inspector = inspector
76
86
  instance_eval(&blk) if blk
77
87
  end
78
88
 
@@ -407,7 +417,11 @@ module Hanami
407
417
  def mount(app, at:, **constraints)
408
418
  path = prefixed_path(at)
409
419
  prefix = Segment.fabricate(path, **constraints)
420
+
410
421
  @mounted[prefix] = @resolver.call(path, app)
422
+ if inspect?
423
+ @inspector.add_route(Route.new(http_method: "*", path: at, to: app, constraints: constraints))
424
+ end
411
425
  end
412
426
 
413
427
  # Generate an relative URL for a specified named route.
@@ -588,6 +602,21 @@ module Hanami
588
602
  )
589
603
  end
590
604
 
605
+ # Returns formatted routes
606
+ #
607
+ # @return [String] formatted routes
608
+ #
609
+ # @since 2.0.0
610
+ # @api private
611
+ def to_inspect
612
+ require "hanami/router/inspector"
613
+
614
+ inspector = Inspector.new
615
+ with(inspector: inspector)
616
+
617
+ inspector.call
618
+ end
619
+
591
620
  # @since 2.0.0
592
621
  # @api private
593
622
  def fixed(env)
@@ -728,6 +757,12 @@ module Hanami
728
757
  end
729
758
 
730
759
  add_named_route(path, as, constraints) if as
760
+
761
+ if inspect?
762
+ @inspector.add_route(
763
+ Route.new(http_method: http_method, path: path, to: to, as: as, constraints: constraints, blk: blk)
764
+ )
765
+ end
731
766
  end
732
767
 
733
768
  # @since 2.0.0
@@ -778,6 +813,12 @@ module Hanami
778
813
  /\*/.match?(path)
779
814
  end
780
815
 
816
+ # @since 2.0.0
817
+ # @api private
818
+ def inspect?
819
+ !@inspector.nil?
820
+ end
821
+
781
822
  # @since 2.0.0
782
823
  # @api private
783
824
  def prefixed_path(path)
@@ -790,6 +831,27 @@ module Hanami
790
831
  @name_prefix.relative_join(name, "_").to_sym
791
832
  end
792
833
 
834
+ # Returns a new instance of Hanami::Router with the modified options.
835
+ #
836
+ # @return [Hanami::Route] a new instance of Hanami::Router
837
+ #
838
+ # @see Hanami::Router#initialize
839
+ #
840
+ # @since 2.0.0
841
+ # @api private
842
+ def with(**new_options, &blk)
843
+ options = {
844
+ base_url: @base_url,
845
+ prefix: @path_prefix.to_s,
846
+ resolver: @resolver,
847
+ not_found: @not_found,
848
+ block_context: @block_context,
849
+ inspector: @inspector
850
+ }
851
+
852
+ self.class.new(**options.merge(new_options), &(blk || @blk))
853
+ end
854
+
793
855
  # @since 2.0.0
794
856
  # @api private
795
857
  def _redirect(to, code)
@@ -798,7 +860,7 @@ module Hanami
798
860
  end
799
861
 
800
862
  destination = prefixed_path(to)
801
- Redirect.new(destination, ->(*) { [code, {"Location" => destination}, [body]] })
863
+ Redirect.new(destination, code, ->(*) { [code, {"Location" => destination}, [body]] })
802
864
  end
803
865
 
804
866
  # @since 2.0.0
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Hanami
4
+ class Router
5
+ # Routes inspector
6
+ #
7
+ # @api private
8
+ # @since 2.0.0
9
+ class Inspector
10
+ # @api private
11
+ # @since 2.0.0
12
+ def initialize(routes: [])
13
+ @routes = routes
14
+ end
15
+
16
+ # @param route [Hash] serialized route
17
+ #
18
+ # @api private
19
+ # @since 2.0.0
20
+ def add_route(route)
21
+ @routes.push(route)
22
+ end
23
+
24
+ # @return [String] The inspected routes
25
+ #
26
+ # @api private
27
+ # @since 2.0.0
28
+ def call(*)
29
+ @routes.map(&:to_inspect).join(NEW_LINE)
30
+ end
31
+
32
+ # @api private
33
+ # @since 2.0.0
34
+ NEW_LINE = $/
35
+ private_constant :NEW_LINE
36
+ end
37
+ end
38
+ end
@@ -13,8 +13,13 @@ module Hanami
13
13
 
14
14
  # @since 2.0.0
15
15
  # @api private
16
- def initialize(destination, endpoint)
16
+ attr_reader :code
17
+
18
+ # @since 2.0.0
19
+ # @api private
20
+ def initialize(destination, code, endpoint)
17
21
  @destination = destination
22
+ @code = code
18
23
  @endpoint = endpoint
19
24
  end
20
25
 
@@ -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
@@ -4,6 +4,6 @@ module Hanami
4
4
  class Router
5
5
  # @since 0.1.0
6
6
  # @api public
7
- VERSION = "2.0.0.alpha4"
7
+ VERSION = "2.0.0.alpha5"
8
8
  end
9
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: 2.0.0.alpha4
4
+ version: 2.0.0.alpha5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Luca Guidi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-01-16 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
@@ -162,11 +162,13 @@ files:
162
162
  - lib/hanami/router.rb
163
163
  - lib/hanami/router/block.rb
164
164
  - lib/hanami/router/error.rb
165
+ - lib/hanami/router/inspector.rb
165
166
  - lib/hanami/router/node.rb
166
167
  - lib/hanami/router/params.rb
167
168
  - lib/hanami/router/prefix.rb
168
169
  - lib/hanami/router/recognized_route.rb
169
170
  - lib/hanami/router/redirect.rb
171
+ - lib/hanami/router/route.rb
170
172
  - lib/hanami/router/segment.rb
171
173
  - lib/hanami/router/trie.rb
172
174
  - lib/hanami/router/url_helpers.rb