raindeer 0.9.9 → 0.9.10
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/lib/raindeer/boot.rb +2 -0
- data/lib/raindeer/integrations.rb +7 -0
- data/lib/router/{route_event.rb → events/route_event.rb} +2 -2
- data/lib/router/{wildcard_route_event.rb → events/wildcard_event.rb} +1 -1
- data/lib/router/http.rb +14 -0
- data/lib/router/route.rb +20 -1
- data/lib/router/router.rb +24 -20
- data/lib/router/trie.rb +17 -10
- data/lib/system/system_routes.rb +3 -3
- data/lib/version.rb +1 -1
- metadata +5 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: a6acad3a557af79fc084ff7e8eddc2e0db5595ba7980dbf67b1ddbfbb702fd5d
|
|
4
|
+
data.tar.gz: 71af14856b712fed992b81b5ea38ee097bacf06ed5385b018edb424530ce1dd0
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: b23946d114027b0da1f7e4d4c685676d96a44c5fbfe345365e97f1963c805cde33613e8f67a79d67aed768b08592ed5faf7a67fe817713b170337c84cb8861a6
|
|
7
|
+
data.tar.gz: 123024ebe02083e5bb0092d50b52946585f59df8e17da19bd4ab46725659ef827e3621d0ad5469f5feb77d0b2f24a4850f486812569e26550fef65e21df583e3
|
data/lib/raindeer/boot.rb
CHANGED
|
@@ -4,6 +4,7 @@ require 'low_event'
|
|
|
4
4
|
require 'low_node'
|
|
5
5
|
require 'low_type'
|
|
6
6
|
require 'observers'
|
|
7
|
+
require 'plugs'
|
|
7
8
|
require 'providers'
|
|
8
9
|
|
|
9
10
|
# File paths are relative to the directory where the process is run from, so the app can just require this boot file.
|
|
@@ -45,6 +46,7 @@ end
|
|
|
45
46
|
# FRAMEWORK EXTERNAL API
|
|
46
47
|
#################################################
|
|
47
48
|
|
|
49
|
+
require_relative 'integrations'
|
|
48
50
|
require_relative 'raindeer'
|
|
49
51
|
|
|
50
52
|
#################################################
|
|
@@ -6,8 +6,8 @@ module Rain
|
|
|
6
6
|
class RouteEvent < ::LowEvent
|
|
7
7
|
attr_reader :route, :params
|
|
8
8
|
|
|
9
|
-
def initialize(route:,
|
|
10
|
-
super(key: route.path,
|
|
9
|
+
def initialize(route:, actions: [], params: Hash | nil)
|
|
10
|
+
super(key: route.path, actions:)
|
|
11
11
|
|
|
12
12
|
@route = route
|
|
13
13
|
@params = params
|
data/lib/router/http.rb
ADDED
data/lib/router/route.rb
CHANGED
|
@@ -1,14 +1,33 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require_relative 'http'
|
|
4
|
+
|
|
3
5
|
module Rain
|
|
4
6
|
class Route
|
|
5
7
|
include LowType
|
|
6
8
|
|
|
7
9
|
attr_reader :path, :verbs
|
|
8
10
|
|
|
9
|
-
def initialize(path: String, verbs: Array[
|
|
11
|
+
def initialize(path: String, verbs: Array[Symbol] | [])
|
|
10
12
|
@path = path
|
|
11
13
|
@verbs = verbs
|
|
12
14
|
end
|
|
15
|
+
|
|
16
|
+
class << self
|
|
17
|
+
# Route[] is used as a value object to access existing routes.
|
|
18
|
+
# Create new routes with new() instead... collection syntax is misused too frequently for instantiation.
|
|
19
|
+
def [](value)
|
|
20
|
+
path, verbs = decode(value:)
|
|
21
|
+
new(path:, verbs:)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def decode(value: String | Hash)
|
|
25
|
+
if value.is_a?(Hash)
|
|
26
|
+
return [value.values.first, [*value.keys.first]]
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
[value, HTTP::VERBS]
|
|
30
|
+
end
|
|
31
|
+
end
|
|
13
32
|
end
|
|
14
33
|
end
|
data/lib/router/router.rb
CHANGED
|
@@ -1,73 +1,77 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
require 'low_event'
|
|
4
|
-
require 'providers'
|
|
5
4
|
|
|
5
|
+
require_relative 'events/route_event'
|
|
6
|
+
require_relative 'events/wildcard_event'
|
|
7
|
+
require_relative 'http'
|
|
6
8
|
require_relative 'route'
|
|
7
|
-
require_relative 'route_event'
|
|
8
9
|
require_relative 'trie'
|
|
9
|
-
require_relative 'wildcard_route_event'
|
|
10
10
|
|
|
11
11
|
module Rain
|
|
12
|
+
# Defines routes and routes requests to a matching route event.
|
|
12
13
|
class Router
|
|
13
14
|
include LowType
|
|
14
15
|
include Observers
|
|
16
|
+
include Low::Events
|
|
17
|
+
include Low::Types
|
|
18
|
+
include Rain::HTTP
|
|
15
19
|
|
|
16
20
|
attr_reader :routes, :trie
|
|
17
21
|
|
|
18
22
|
def initialize
|
|
19
|
-
@
|
|
23
|
+
@current_level = []
|
|
20
24
|
@routes = {}
|
|
21
25
|
@trie = Trie.new
|
|
22
26
|
end
|
|
23
27
|
|
|
24
|
-
def route(
|
|
25
|
-
|
|
26
|
-
path = @breadcrumbs.join
|
|
28
|
+
def route(value, &block)
|
|
29
|
+
path, verbs = Route.decode(value:)
|
|
27
30
|
|
|
28
|
-
|
|
31
|
+
@current_level << path
|
|
32
|
+
path = @current_level.join
|
|
33
|
+
|
|
34
|
+
route = Route.new(path:, verbs:)
|
|
29
35
|
@routes[path] = route
|
|
30
36
|
@trie.merge(route:)
|
|
31
37
|
|
|
32
38
|
block.call if block_given?
|
|
33
39
|
|
|
34
|
-
@
|
|
40
|
+
@current_level.pop
|
|
35
41
|
end
|
|
36
42
|
|
|
37
43
|
def get(path, &block)
|
|
38
|
-
route(path,
|
|
44
|
+
route(GET => path, &block)
|
|
39
45
|
end
|
|
40
46
|
|
|
41
47
|
def post(path, &block)
|
|
42
|
-
route(path,
|
|
48
|
+
route(POST => path, &block)
|
|
43
49
|
end
|
|
44
50
|
|
|
45
51
|
def update(path, &block)
|
|
46
|
-
route(path,
|
|
52
|
+
route(UPDATE => path, &block)
|
|
47
53
|
end
|
|
48
54
|
|
|
49
55
|
def delete(path, &block)
|
|
50
|
-
route(path,
|
|
56
|
+
route(DELETE => path, &block)
|
|
51
57
|
end
|
|
52
58
|
|
|
53
|
-
|
|
54
|
-
# You can override any route/status simply by adding your own observer.
|
|
55
|
-
def handle(event:)
|
|
59
|
+
def request(event: RequestEvent)
|
|
56
60
|
response_event = nil
|
|
57
61
|
|
|
58
62
|
# The last route event will render a response event which we want to return to the request event.
|
|
59
|
-
@trie.match(
|
|
60
|
-
response_event = route_event.
|
|
63
|
+
@trie.match(request: event.request).each do |route_event|
|
|
64
|
+
response_event = route_event.take
|
|
61
65
|
end
|
|
62
66
|
return response_event if response_event
|
|
63
67
|
|
|
64
68
|
if @routes['/*']
|
|
65
69
|
route = Route.new(path: event.request.path, verbs: @routes['/*'].verbs)
|
|
66
|
-
wildcard_event =
|
|
70
|
+
wildcard_event = WildcardEvent.take(key: '/*', action: :render, route:)
|
|
67
71
|
return wildcard_event if wildcard_event
|
|
68
72
|
end
|
|
69
73
|
|
|
70
|
-
|
|
74
|
+
StatusEvent.take(status: Status[404], request: event.request)
|
|
71
75
|
end
|
|
72
76
|
end
|
|
73
77
|
end
|
data/lib/router/trie.rb
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require_relative 'events/route_event'
|
|
3
4
|
require_relative 'route'
|
|
4
|
-
require_relative 'route_event'
|
|
5
5
|
require_relative 'trie_node'
|
|
6
6
|
|
|
7
7
|
module Rain
|
|
@@ -39,15 +39,17 @@ module Rain
|
|
|
39
39
|
current_node.route = route
|
|
40
40
|
end
|
|
41
41
|
|
|
42
|
-
def match(
|
|
42
|
+
def match(request:, current_node: @root_node, current_index: 0, params: {})
|
|
43
|
+
path = request.path
|
|
44
|
+
|
|
43
45
|
return [] if (key = path[current_index]).nil?
|
|
44
46
|
|
|
45
47
|
route_events = []
|
|
46
48
|
|
|
47
49
|
# Static request path segment.
|
|
48
50
|
if (child_node = current_node.child(key:))
|
|
49
|
-
route_events << route_event(next_index: current_index + 1, params:,
|
|
50
|
-
route_events = [*route_events, *match(
|
|
51
|
+
route_events << route_event(next_index: current_index + 1, params:, request:, route: child_node.route) if child_node.route
|
|
52
|
+
route_events = [*route_events, *match(request:, current_node: child_node, current_index: current_index + 1, params:)]
|
|
51
53
|
end
|
|
52
54
|
|
|
53
55
|
# Dynamic request path segment.
|
|
@@ -57,8 +59,8 @@ module Rain
|
|
|
57
59
|
arg, next_index = capture_arg(arg_start_index: current_index, path:)
|
|
58
60
|
params[param.delete_prefix(':').to_sym] = arg
|
|
59
61
|
|
|
60
|
-
route_events << route_event(next_index:, params:,
|
|
61
|
-
route_events = [*route_events, *match(
|
|
62
|
+
route_events << route_event(next_index:, params:, request:, route: child_node.route) if child_node.route
|
|
63
|
+
route_events = [*route_events, *match(request:, current_node: child_node, current_index: next_index, params:)]
|
|
62
64
|
end
|
|
63
65
|
|
|
64
66
|
route_events
|
|
@@ -66,10 +68,15 @@ module Rain
|
|
|
66
68
|
|
|
67
69
|
private
|
|
68
70
|
|
|
69
|
-
# Mid nodes
|
|
70
|
-
def route_event(next_index:, params:,
|
|
71
|
-
action = path[next_index].nil? ? :render : :
|
|
72
|
-
|
|
71
|
+
# Mid nodes side_effect, end nodes render.
|
|
72
|
+
def route_event(next_index:, params:, request:, route:)
|
|
73
|
+
action = request.path[next_index].nil? ? :render : :side_effect
|
|
74
|
+
action = receive if action == :render && request.body
|
|
75
|
+
|
|
76
|
+
actions = [action]
|
|
77
|
+
actions << request.method.downcase.to_sym unless action == :side_effect
|
|
78
|
+
|
|
79
|
+
RouteEvent.new(actions:, route:, params:)
|
|
73
80
|
end
|
|
74
81
|
|
|
75
82
|
def capture_param(current_index:, path:)
|
data/lib/system/system_routes.rb
CHANGED
data/lib/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: raindeer
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.9.
|
|
4
|
+
version: 0.9.10
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- maedi
|
|
@@ -288,13 +288,15 @@ files:
|
|
|
288
288
|
- lib/pages/raindown/raindown.rb
|
|
289
289
|
- lib/raindeer/boot.rb
|
|
290
290
|
- lib/raindeer/cli.rb
|
|
291
|
+
- lib/raindeer/integrations.rb
|
|
291
292
|
- lib/raindeer/raindeer.rb
|
|
293
|
+
- lib/router/events/route_event.rb
|
|
294
|
+
- lib/router/events/wildcard_event.rb
|
|
295
|
+
- lib/router/http.rb
|
|
292
296
|
- lib/router/route.rb
|
|
293
|
-
- lib/router/route_event.rb
|
|
294
297
|
- lib/router/router.rb
|
|
295
298
|
- lib/router/trie.rb
|
|
296
299
|
- lib/router/trie_node.rb
|
|
297
|
-
- lib/router/wildcard_route_event.rb
|
|
298
300
|
- lib/support/config_loader.rb
|
|
299
301
|
- lib/system/dashboard_node.rbx
|
|
300
302
|
- lib/system/events_node.rbx
|