lennarb 0.1.7 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/changelog.md +48 -0
- data/exe/lenna +2 -4
- data/lib/lennarb/request.rb +37 -0
- data/lib/lennarb/response.rb +138 -0
- data/lib/lennarb/route_node.rb +73 -0
- data/lib/lennarb/version.rb +3 -3
- data/lib/lennarb.rb +120 -27
- data/license.md +2 -1
- data/readme.md +34 -13
- metadata +42 -57
- data/lib/lenna/application.rb +0 -53
- data/lib/lenna/cli/app.rb +0 -39
- data/lib/lenna/cli/commands/create_project.rb +0 -125
- data/lib/lenna/cli/commands/interface.rb +0 -20
- data/lib/lenna/cli/commands/start_server.rb +0 -143
- data/lib/lenna/cli/templates/application.erb +0 -11
- data/lib/lenna/cli/templates/config.ru.erb +0 -5
- data/lib/lenna/cli/templates/gemfile.erb +0 -14
- data/lib/lenna/middleware/app.rb +0 -118
- data/lib/lenna/middleware/default/error_handler.rb +0 -243
- data/lib/lenna/middleware/default/logging.rb +0 -93
- data/lib/lenna/middleware/default/reload.rb +0 -97
- data/lib/lenna/router/builder.rb +0 -124
- data/lib/lenna/router/cache.rb +0 -52
- data/lib/lenna/router/namespace_stack.rb +0 -77
- data/lib/lenna/router/request.rb +0 -141
- data/lib/lenna/router/response.rb +0 -509
- data/lib/lenna/router/route_matcher.rb +0 -68
- data/lib/lenna/router.rb +0 -206
- data/lib/lennarb/array_extensions.rb +0 -31
data/lib/lenna/router/cache.rb
DELETED
@@ -1,52 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# Released under the MIT License.
|
4
|
-
# Copyright, 2023, by Aristóteles Coutinho.
|
5
|
-
|
6
|
-
module Lenna
|
7
|
-
class Router
|
8
|
-
# This class is used to cache the routes.
|
9
|
-
#
|
10
|
-
# @private
|
11
|
-
#
|
12
|
-
class Cache
|
13
|
-
def initialize = @cache = {}
|
14
|
-
|
15
|
-
# This method is used to generate a key for the cache.
|
16
|
-
#
|
17
|
-
# @parameter [String] method
|
18
|
-
# @parameter [String] path
|
19
|
-
#
|
20
|
-
# @return [String]
|
21
|
-
#
|
22
|
-
def cache_key(method, path) = "#{method} #{path}"
|
23
|
-
|
24
|
-
# This method is used to add a route to the cache.
|
25
|
-
#
|
26
|
-
# @parameter route_key [String] The key for the route.
|
27
|
-
# @parameter node [Lenna::Route::Node] The node for the route.
|
28
|
-
#
|
29
|
-
# @return [Lenna::Route::Node]
|
30
|
-
#
|
31
|
-
def add(route_key, node) = @cache[route_key] = node
|
32
|
-
|
33
|
-
# This method is used to get a route from the cache.
|
34
|
-
#
|
35
|
-
# @parameter route_key [String] The key for the route.
|
36
|
-
#
|
37
|
-
# @return [Lenna::Route::Node]
|
38
|
-
#
|
39
|
-
def get(route_key) = @cache[route_key]
|
40
|
-
|
41
|
-
# This method is used to check if a route is in the cache.
|
42
|
-
#
|
43
|
-
# @api public
|
44
|
-
#
|
45
|
-
# @parameter route_key [String] The key for the route.
|
46
|
-
#
|
47
|
-
# @return [Boolean]
|
48
|
-
#
|
49
|
-
def exist?(route_key) = @cache.key?(route_key)
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
@@ -1,77 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# Released under the MIT License.
|
4
|
-
# Copyright, 2023, by Aristóteles Coutinho.
|
5
|
-
|
6
|
-
module Lenna
|
7
|
-
class Router
|
8
|
-
# This class is used to manage the namespaces.
|
9
|
-
#
|
10
|
-
# @private `Since v0.1.0`
|
11
|
-
#
|
12
|
-
class NamespaceStack
|
13
|
-
# @return [Array] The stack of namespaces
|
14
|
-
#
|
15
|
-
# @private
|
16
|
-
#
|
17
|
-
attr_reader :stack
|
18
|
-
|
19
|
-
# The initialize method is used to initialize the stack of namespaces.
|
20
|
-
#
|
21
|
-
# @private
|
22
|
-
#
|
23
|
-
# @attibute stack [Array] The stack of namespaces
|
24
|
-
#
|
25
|
-
# @return [void]
|
26
|
-
#
|
27
|
-
def initialize = @stack = ['']
|
28
|
-
|
29
|
-
# This method is used to push a prefix to the stack.
|
30
|
-
#
|
31
|
-
# @parameter prefix [String] The prefix to be pushed
|
32
|
-
#
|
33
|
-
# @return [void]
|
34
|
-
#
|
35
|
-
# ex.
|
36
|
-
#
|
37
|
-
# stack = NamespaceStack.new
|
38
|
-
# stack.push('/users')
|
39
|
-
# stack.current_prefix # => '/users'
|
40
|
-
#
|
41
|
-
# @see #resolve_prefix
|
42
|
-
#
|
43
|
-
def push(prefix)
|
44
|
-
@stack.push(resolve_prefix(prefix))
|
45
|
-
end
|
46
|
-
|
47
|
-
# This method is used to remove the last prefix from the stack.
|
48
|
-
#
|
49
|
-
# @return [String] The popped prefix
|
50
|
-
#
|
51
|
-
def pop
|
52
|
-
@stack.pop unless @stack.size == 1
|
53
|
-
end
|
54
|
-
|
55
|
-
# @return [String] The current prefix
|
56
|
-
#
|
57
|
-
def current_prefix = @stack.last
|
58
|
-
|
59
|
-
# The to_s method is used to return the current prefix.
|
60
|
-
#
|
61
|
-
# @return [String] The current prefix
|
62
|
-
#
|
63
|
-
def to_s = current_prefix
|
64
|
-
|
65
|
-
private
|
66
|
-
|
67
|
-
# The resolve_prefix method is used to resolve the prefix.
|
68
|
-
#
|
69
|
-
# @parameter prefix [String] The prefix to be resolved
|
70
|
-
# @return [String] The resolved prefix
|
71
|
-
#
|
72
|
-
def resolve_prefix(prefix)
|
73
|
-
current_prefix + prefix
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
data/lib/lenna/router/request.rb
DELETED
@@ -1,141 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# Released under the MIT License.
|
4
|
-
# Copyright, 2023, by Aristóteles Coutinho.
|
5
|
-
|
6
|
-
module Lenna
|
7
|
-
class Router
|
8
|
-
# The Request class is responsible for managing the request.
|
9
|
-
#
|
10
|
-
# @attr headers [Hash] the request headers
|
11
|
-
# @attr body [Hash] the request body
|
12
|
-
# @attr params [Hash] the request params
|
13
|
-
#
|
14
|
-
# @public `Since v0.1.0`
|
15
|
-
#
|
16
|
-
class Request < ::Rack::Request
|
17
|
-
# This method is used to set the request headers.
|
18
|
-
#
|
19
|
-
# @parameter name [String] the header name
|
20
|
-
# @parameter value [String] the header value
|
21
|
-
#
|
22
|
-
# @return [String] the header value
|
23
|
-
#
|
24
|
-
# @public
|
25
|
-
#
|
26
|
-
# ex.
|
27
|
-
# request.put_header('Foo', 'bar')
|
28
|
-
#
|
29
|
-
# request.headers
|
30
|
-
# # => { 'Foo' => 'bar' }
|
31
|
-
#
|
32
|
-
def put_header(name, value) = headers[name] = value
|
33
|
-
|
34
|
-
# This method is used to set the request params.
|
35
|
-
#
|
36
|
-
# @parameter params [Hash] the request params
|
37
|
-
#
|
38
|
-
# @return [Hash] the request params
|
39
|
-
#
|
40
|
-
# @public
|
41
|
-
#
|
42
|
-
def assign_params(params) = @params = params
|
43
|
-
|
44
|
-
# This method is used to parse the body params.
|
45
|
-
#
|
46
|
-
# @return [Hash] the request params
|
47
|
-
#
|
48
|
-
# @public
|
49
|
-
#
|
50
|
-
def params = super.merge(parse_body_params)
|
51
|
-
|
52
|
-
# This method rewinds the body
|
53
|
-
#
|
54
|
-
# @return [String] the request body content
|
55
|
-
#
|
56
|
-
# @public
|
57
|
-
#
|
58
|
-
def body
|
59
|
-
super.rewind
|
60
|
-
super.read
|
61
|
-
end
|
62
|
-
|
63
|
-
# This method returns the headers in a normalized way.
|
64
|
-
#
|
65
|
-
# @public
|
66
|
-
#
|
67
|
-
# @return [Hash] the request headers
|
68
|
-
#
|
69
|
-
# ex.
|
70
|
-
# Turn this:
|
71
|
-
# HTTP_FOO=bar Foo=bar
|
72
|
-
#
|
73
|
-
def headers
|
74
|
-
content_type = env['CONTENT_TYPE']
|
75
|
-
@headers ||= env.select { |k, _| k.start_with?('HTTP_') }
|
76
|
-
.transform_keys { |k| format_header_name(k) }
|
77
|
-
|
78
|
-
@headers['Content-Type'] = content_type if content_type
|
79
|
-
@headers
|
80
|
-
end
|
81
|
-
|
82
|
-
# This method returns the request body like a json.
|
83
|
-
#
|
84
|
-
# @return [Hash] the request body
|
85
|
-
#
|
86
|
-
def json_body = @json_body ||= parse_body_params
|
87
|
-
|
88
|
-
private
|
89
|
-
|
90
|
-
# This method returns the media type.
|
91
|
-
#
|
92
|
-
# @return [String] the request media type
|
93
|
-
#
|
94
|
-
def media_type = headers['Content-Type']
|
95
|
-
|
96
|
-
# This method parses the json body.
|
97
|
-
#
|
98
|
-
# @return [Hash] the request json body
|
99
|
-
#
|
100
|
-
def parse_json_body
|
101
|
-
@parsed_json_body ||= ::JSON.parse(body)
|
102
|
-
rescue ::JSON::ParserError
|
103
|
-
{}
|
104
|
-
end
|
105
|
-
|
106
|
-
# This method parses the body params.
|
107
|
-
#
|
108
|
-
# @return [Hash] the request body params
|
109
|
-
#
|
110
|
-
def parse_body_params
|
111
|
-
case media_type
|
112
|
-
in 'application/json' then parse_json_body
|
113
|
-
else post_params
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
# This method parses the post params.
|
118
|
-
#
|
119
|
-
# @return [Hash] the request post params
|
120
|
-
#
|
121
|
-
def post_params
|
122
|
-
@post_params ||=
|
123
|
-
if body.empty?
|
124
|
-
{}
|
125
|
-
else
|
126
|
-
::Rack::Utils.parse_nested_query(body)
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
130
|
-
# This method formats the header name.
|
131
|
-
#
|
132
|
-
# @parameter name [String] the header name
|
133
|
-
#
|
134
|
-
# @return [String] the formatted header name
|
135
|
-
#
|
136
|
-
def format_header_name(name)
|
137
|
-
name.sub(/^HTTP_/, '').split('_').map(&:capitalize).join('-')
|
138
|
-
end
|
139
|
-
end
|
140
|
-
end
|
141
|
-
end
|