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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dd04746632169d1c9898fe5f95552c13660f45ae76f039b4863a2eb58eb000bb
4
- data.tar.gz: 1582e33cd80570a8d8a2164c3d8236515738f75e7a63204fbc50c7edcf195e4d
3
+ metadata.gz: a6acad3a557af79fc084ff7e8eddc2e0db5595ba7980dbf67b1ddbfbb702fd5d
4
+ data.tar.gz: 71af14856b712fed992b81b5ea38ee097bacf06ed5385b018edb424530ce1dd0
5
5
  SHA512:
6
- metadata.gz: 7d5770cbfc5d25cefb54ae0273c89acac0220b516ae41014741b6d9bedb1515806ae198c60e41e694a10823e694766b7fb841c588e16fa1a1326bcc381493d48
7
- data.tar.gz: 557024f64d7dd9c40c5c1ce1d19f803995aa28db1d9ce5381b25499135e2aef0e2b42e8ffb479313bc2172d8b1b851db5edf4cc89b0a5925dbd9d3bae75d3621
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
  #################################################
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../router/http'
4
+
5
+ class LowNode
6
+ include Rain::HTTP
7
+ end
@@ -6,8 +6,8 @@ module Rain
6
6
  class RouteEvent < ::LowEvent
7
7
  attr_reader :route, :params
8
8
 
9
- def initialize(route:, action: :render, params: Hash | nil)
10
- super(key: route.path, action:)
9
+ def initialize(route:, actions: [], params: Hash | nil)
10
+ super(key: route.path, actions:)
11
11
 
12
12
  @route = route
13
13
  @params = params
@@ -3,7 +3,7 @@
3
3
  require 'low_event'
4
4
 
5
5
  module Rain
6
- class WildcardRouteEvent < ::LowEvent
6
+ class WildcardEvent < ::LowEvent
7
7
  attr_reader :route, :params
8
8
 
9
9
  def initialize(key:, route:, action: :render)
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rain
4
+ module HTTP
5
+ GET = :get
6
+ QUERY = :query
7
+ POST = :post
8
+ PUT = :put
9
+ PATCH = :patch
10
+ DELETE = :delete
11
+
12
+ VERBS = [GET, QUERY, POST, PUT, PATCH, DELETE]
13
+ end
14
+ end
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[String | nil] | [])
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
- @breadcrumbs = []
23
+ @current_level = []
20
24
  @routes = {}
21
25
  @trie = Trie.new
22
26
  end
23
27
 
24
- def route(path, verbs = [], &block)
25
- @breadcrumbs << path
26
- path = @breadcrumbs.join
28
+ def route(value, &block)
29
+ path, verbs = Route.decode(value:)
27
30
 
28
- route = Route.new(path:, verbs: [*verbs])
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
- @breadcrumbs.pop
40
+ @current_level.pop
35
41
  end
36
42
 
37
43
  def get(path, &block)
38
- route(path, 'GET', &block)
44
+ route(GET => path, &block)
39
45
  end
40
46
 
41
47
  def post(path, &block)
42
- route(path, 'POST', &block)
48
+ route(POST => path, &block)
43
49
  end
44
50
 
45
51
  def update(path, &block)
46
- route(path, 'UPDATE', &block)
52
+ route(UPDATE => path, &block)
47
53
  end
48
54
 
49
55
  def delete(path, &block)
50
- route(path, 'DELETE', &block)
56
+ route(DELETE => path, &block)
51
57
  end
52
58
 
53
- # TODO: Define type: ::Low::Events::RequestEvent
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(path: event.request.path).each do |route_event|
60
- response_event = route_event.trigger
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 = WildcardRouteEvent.trigger(key: '/*', action: :render, route:)
70
+ wildcard_event = WildcardEvent.take(key: '/*', action: :render, route:)
67
71
  return wildcard_event if wildcard_event
68
72
  end
69
73
 
70
- Low::Events::StatusEvent.trigger(status: Low::Types::Status[404], request: event.request)
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(path:, current_node: @root_node, current_index: 0, params: {})
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:, path:, route: child_node.route) if child_node.route
50
- route_events = [*route_events, *match(path:, current_node: child_node, current_index: current_index + 1, params:)]
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:, path:, route: child_node.route) if child_node.route
61
- route_events = [*route_events, *match(path:, current_node: child_node, current_index: next_index, params:)]
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 handle events, end nodes render events.
70
- def route_event(next_index:, params:, path:, route:)
71
- action = path[next_index].nil? ? :render : :handle
72
- RouteEvent.new(action:, route:, params:)
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:)
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  Raindeer.router do
4
- get '/system' do
5
- get '/events'
6
- get '/routes'
4
+ route :get => '/system' do
5
+ route :get => '/events'
6
+ route :get => '/routes'
7
7
  end
8
8
  end
data/lib/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Raindeer
4
- VERSION = '0.9.9'
4
+ VERSION = '0.9.10'
5
5
  end
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.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