lennarb 0.5.0 → 0.5.1

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: 888f84e566de65f5c87013ff56ac3fe485f59acba6f1cc39862178894cf101fa
4
- data.tar.gz: 8703693e316b83f747f927c23b07d56f6dd571f813d8c00901432cf6c941d1f2
3
+ metadata.gz: ff30294350acea0efb5cf2c074d256472f99300d46fee6fe0ea9cadfb375e151
4
+ data.tar.gz: d96ea3d9ade277730f83fa0b011d3396d73be3ba8692229c5ad98cfd72f48ea4
5
5
  SHA512:
6
- metadata.gz: bc83791eb32ad87b5aa772f375b048829d794d35bdea5c5d1d083dc4a2e8b27560b313c79f51ca7a3a7084d73cc4ddeb9fb17a29a33a211bd53db57090af791a
7
- data.tar.gz: a1fb09a73e8610d562cb4f4ea5e2ce1a07ffa68f4574363f07700b0e1004823fb5f1003d6cf6276fec2eb0002894ddf4dce7c7e4c4b55773bbb729a96ec74f4c
6
+ metadata.gz: a5aad4351361de62499992df5f53ac8ec5f8b42f3cd1b207d108ac137404ab6e4e103f394193ae58c847195cc97fe53d475d275e542840360b4d61dfe74474c4
7
+ data.tar.gz: 55661804a4cb178b3365534c5df7a3c7653ecbe07e598b04ae4edfda64f0ada02edcd03ff08cc6f3004a519f5b1df80da4eccc1f4b2a6162d14166e6786f471e
@@ -3,6 +3,8 @@
3
3
  # Released under the MIT License.
4
4
  # Copyright, 2023-2024, by Aristóteles Coutinho.
5
5
 
6
+ require 'colorize'
7
+
6
8
  class Lennarb
7
9
  module Application
8
10
  class Base
@@ -91,39 +93,13 @@ class Lennarb
91
93
  end
92
94
  end
93
95
 
94
- # Call the application
95
- #
96
- # @parameter [Hash] env
97
- #
98
- # @returns [Array] response
99
- #
100
- def self.call(env)
101
- response =
102
- catch(:halt) do
103
- execute_hooks(@_before_hooks, env, :before)
104
-
105
- res = @_route.call(env)
106
-
107
- execute_hooks(@_after_hooks, env, :after)
108
- res
109
- end
110
-
111
- case response
112
- in [404 | 404, _, _] if html_request?(env) && File.exist?('public/404.html')
113
- env['PATH_INFO'] = '/404.html'
114
- Rack::Static.new(-> { response }, urls: ['/404.html'], root: 'public').call(env)
115
- in [404 | 404, _, _] then response
116
- else
117
- response.is_a?(Array) ? response : response.finish
118
- end
119
- end
120
-
121
96
  # Run the Application
122
97
  #
123
98
  # @returns [Base] self
124
99
  #
125
100
  # When you use this method, the application will be frozen. And you can't add more routes after that.
126
- # This method is used to run the application in a Rack server so, you can use the `rackup` command to run the application.
101
+ # This method is used to run the application in a Rack server so, you can use the `rackup` command
102
+ # to run the application.
127
103
  # Ex. rackup -p 3000
128
104
  # This command will use the following middleware:
129
105
  # - Rack::ShowExceptions
@@ -143,34 +119,74 @@ class Lennarb
143
119
  use Rack::ContentLength
144
120
  use Rack::Static,
145
121
  root: 'public',
146
- urls: ['/404.html'],
122
+ urls: ['/404.html', '/500.html'],
147
123
  header_rules: [
148
- [200, %w[html], { 'content-type' => 'text/html; charset=utf-8' }]
124
+ [200, %w[html], { 'content-type' => 'text/html; charset=utf-8' }],
125
+ [400, %w[html], { 'content-type' => 'text/html; charset=utf-8' }],
126
+ [500, %w[html], { 'content-type' => 'text/html; charset=utf-8' }]
149
127
  ]
150
128
 
151
129
  middlewares.each do |(middleware, args, block)|
152
130
  stack.use(middleware, *args, &block)
153
131
  end
154
132
 
155
- stack.run @_route
133
+ stack.run ->(env) do
134
+ catch(:halt) do
135
+ begin
136
+ execute_hooks(@_before_hooks, env, :before)
137
+ res = @_route.call(env)
138
+ execute_hooks(@_after_hooks, env, :after)
139
+ res
140
+ rescue StandardError => e
141
+ render_error if production?
142
+
143
+ puts e.message.red
144
+ puts e.backtrace
145
+ raise e
146
+ end.then do |response|
147
+ case response
148
+ in [400..499, _, _] then render_not_found
149
+ else response
150
+ end
151
+ end
152
+ end
153
+ end
156
154
 
157
155
  @_route.freeze!
158
156
 
159
- @_route = stack.to_app.freeze
157
+ stack.to_app
158
+ end
159
+
160
+ def self.test? = ENV['RACK_ENV'] == 'test' || ENV['LENNARB_ENV'] == 'test'
161
+ def self.production? = ENV['RACK_ENV'] == 'production' || ENV['LENNARB_ENV'] == 'production'
162
+ def self.development? = ENV['RACK_ENV'] == 'development' || ENV['LENNARB_ENV'] == 'development'
163
+
164
+ # Render a not found
165
+ #
166
+ # @returns [void]
167
+ #
168
+ def self.render_not_found(content = nil)
169
+ default = File.exist?('public/404.html')
170
+ body = content || default || 'Not Found'
171
+ throw :halt, [404, { 'content-type' => 'text/html' }, [body]]
172
+ end
160
173
 
161
- self
174
+ # Render an error
175
+ #
176
+ # @returns [void]
177
+ #
178
+ def self.render_error(content = nil)
179
+ default = File.exist?('public/500.html')
180
+ body = content || default || 'Internal Server Error'
181
+ throw :halt, [500, { 'content-type' => 'text/html' }, [body]]
162
182
  end
163
183
 
164
184
  # Redirect to a path
165
185
  #
166
186
  # @parameter [String] path
167
187
  # @parameter [Integer] status default is 302
168
- # @parameter [Hash] env (optional)
169
188
  #
170
- def self.redirect(path, status = 302, _env = nil)
171
- response = Rack::Response.new([], status, 'location' => path)
172
- throw :halt, response.finish
173
- end
189
+ def self.redirect(path, status = 302) = throw :halt, [status, { 'location' => path }, []]
174
190
 
175
191
  # Execute the hooks
176
192
  #
@@ -4,7 +4,7 @@
4
4
  # Copyright, 2023-2024, by Aristóteles Coutinho.
5
5
 
6
6
  class Lennarb
7
- VERSION = '0.5.0'
7
+ VERSION = '0.5.1'
8
8
 
9
9
  public_constant :VERSION
10
10
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lennarb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aristóteles Coutinho
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-05-03 00:00:00.000000000 Z
11
+ date: 2024-05-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: colorize
@@ -44,34 +44,6 @@ dependencies:
44
44
  - - ">="
45
45
  - !ruby/object:Gem::Version
46
46
  version: 3.0.8
47
- - !ruby/object:Gem::Dependency
48
- name: rack-protection
49
- requirement: !ruby/object:Gem::Requirement
50
- requirements:
51
- - - "~>"
52
- - !ruby/object:Gem::Version
53
- version: '4.0'
54
- type: :runtime
55
- prerelease: false
56
- version_requirements: !ruby/object:Gem::Requirement
57
- requirements:
58
- - - "~>"
59
- - !ruby/object:Gem::Version
60
- version: '4.0'
61
- - !ruby/object:Gem::Dependency
62
- name: rack-session
63
- requirement: !ruby/object:Gem::Requirement
64
- requirements:
65
- - - "~>"
66
- - !ruby/object:Gem::Version
67
- version: '2.0'
68
- type: :runtime
69
- prerelease: false
70
- version_requirements: !ruby/object:Gem::Requirement
71
- requirements:
72
- - - "~>"
73
- - !ruby/object:Gem::Version
74
- version: '2.0'
75
47
  - !ruby/object:Gem::Dependency
76
48
  name: bake
77
49
  requirement: !ruby/object:Gem::Requirement