rack-app 7.5.1 → 7.5.2
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/README.md +50 -9
- data/VERSION +1 -1
- data/lib/rack/app/middlewares/set_path_params.rb +7 -5
- data/lib/rack/app/router/tree/leaf.rb +0 -1
- data/lib/rack/app/router/tree/vein.rb +3 -3
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 685044ceae379bb1f514e908eec4f1cf747b7410
|
4
|
+
data.tar.gz: 238ae60171c5a954598a548b6daeab3aa37a2595
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f03f8c6bd826cd76337141ae81894555b47a4c327478566df7481643256e11fc1922b9d410476375040371099a0e24881e3e4ed43faf9e35d29b0479fe0cad07
|
7
|
+
data.tar.gz: 1ecea638458f5af0e04659d774680ac7bc2e68def972046332082041198a3dcced104bf0fc91dd789c924ae5fb85743f380c9d23ce3f9270246af27342e10a85
|
data/README.md
CHANGED
@@ -94,6 +94,12 @@ Yes, in fact it's already powering heroku hosted micro-services.
|
|
94
94
|
* note that this is not only memory friendly way pure rack solution, but also 2x faster than the usually solution which includes buffering in memory
|
95
95
|
* params validation with ease
|
96
96
|
|
97
|
+
## Under the hood
|
98
|
+
|
99
|
+
rack-app's router relies on a tree structure which makes heavy use of *common prefixes*,
|
100
|
+
it is basically a *compact* [*prefix tree*](https://en.wikipedia.org/wiki/Trie) (or just [*Radix tree*](https://en.wikipedia.org/wiki/Radix_tree)).
|
101
|
+
Nodes with a common prefix also share a common parent.
|
102
|
+
|
97
103
|
## Contributors
|
98
104
|
|
99
105
|
* **[Daniel Nagy](https://github.com/thilonel)**
|
@@ -112,12 +118,14 @@ Yes, in fact it's already powering heroku hosted micro-services.
|
|
112
118
|
|
113
119
|
* [wrote an awesome article](https://www.sitepoint.com/rack-app-a-performant-and-pragmatic-web-microframework/) about the project
|
114
120
|
|
121
|
+
* **[TheSmartnik](https://github.com/TheSmartnik)**
|
122
|
+
|
123
|
+
* Clarify examples in the documentation
|
124
|
+
|
115
125
|
## [Contributing](CONTRIBUTING.md)
|
116
126
|
|
117
127
|
## Usage
|
118
128
|
|
119
|
-
config.ru
|
120
|
-
|
121
129
|
#### basic
|
122
130
|
|
123
131
|
```ruby
|
@@ -143,8 +151,6 @@ require 'rack/app'
|
|
143
151
|
|
144
152
|
class App < Rack::App
|
145
153
|
|
146
|
-
apply_extensions :front_end
|
147
|
-
|
148
154
|
mount SomeAppClass
|
149
155
|
|
150
156
|
headers 'Access-Control-Allow-Origin' => '*',
|
@@ -158,11 +164,12 @@ class App < Rack::App
|
|
158
164
|
validate_params do
|
159
165
|
required 'words', :class => Array, :of => String, :desc => 'some word', :example => ['pug']
|
160
166
|
optional 'word', :class => String, :desc => 'one word', :example => 'pug'
|
167
|
+
optional 'boolean', :class => :boolean, :desc => 'boolean value', :example => true
|
161
168
|
end
|
162
169
|
get '/hello' do
|
163
|
-
puts(
|
170
|
+
puts(params['words'])
|
164
171
|
|
165
|
-
|
172
|
+
'Hello World!'
|
166
173
|
end
|
167
174
|
|
168
175
|
namespace '/users' do
|
@@ -206,6 +213,40 @@ Rack::Response as response method.
|
|
206
213
|
|
207
214
|
By default if you dont write anything to the response 'body' the endpoint block logic return will be used
|
208
215
|
|
216
|
+
### Frontend Example
|
217
|
+
|
218
|
+
if you don't mind extend your dependency list, than you can use the front_end extension for creating template based web applications.
|
219
|
+
|
220
|
+
```ruby
|
221
|
+
require 'rack/app'
|
222
|
+
require 'rack/app/front_end' # You need to add `gem 'rack-app-front_end'` to your Gemfile
|
223
|
+
|
224
|
+
class App < Rack::App
|
225
|
+
|
226
|
+
apply_extensions :front_end
|
227
|
+
|
228
|
+
helpers do
|
229
|
+
|
230
|
+
def method_that_can_be_used_in_template
|
231
|
+
'hello world!'
|
232
|
+
end
|
233
|
+
|
234
|
+
end
|
235
|
+
|
236
|
+
# use ./app/layout.html.erb as layout, this is optionable
|
237
|
+
layout 'layout.html.erb'
|
238
|
+
|
239
|
+
# at '/' the endpoint will serve (render)
|
240
|
+
# the ./app/index.html content as response body and wrap around with layout if layout is given
|
241
|
+
get '/' do
|
242
|
+
render 'index.html'
|
243
|
+
end
|
244
|
+
|
245
|
+
end
|
246
|
+
```
|
247
|
+
|
248
|
+
this example expects an "app" folder next to the "app.rb" file that included templates being used such as layout.html.erb and index.html.
|
249
|
+
|
209
250
|
## Testing
|
210
251
|
|
211
252
|
for testing use rack/test or the bundled testing module for writing unit test for your rack application
|
@@ -223,7 +264,7 @@ describe App do
|
|
223
264
|
|
224
265
|
describe '/hello' do
|
225
266
|
# example for params and headers and payload use
|
226
|
-
subject{ get(url: '/hello', params: {'dog' => 'meat'}, headers: {'X-Cat' => 'fur'}, payload: 'some string') }
|
267
|
+
subject { get(url: '/hello', params: {'dog' => 'meat'}, headers: {'X-Cat' => 'fur'}, payload: 'some string') }
|
227
268
|
|
228
269
|
it { expect(subject.status).to eq 200 }
|
229
270
|
|
@@ -232,7 +273,7 @@ describe App do
|
|
232
273
|
|
233
274
|
describe '/users/:user_id' do
|
234
275
|
# restful endpoint example
|
235
|
-
subject{ get(url: '/users/1234') }
|
276
|
+
subject { get(url: '/users/1234') }
|
236
277
|
|
237
278
|
it { expect(subject.body).to eq 'hello 1234!'}
|
238
279
|
|
@@ -242,7 +283,7 @@ describe App do
|
|
242
283
|
|
243
284
|
describe '/make_error' do
|
244
285
|
# error handled example
|
245
|
-
subject{ get(url: '/make_error') }
|
286
|
+
subject { get(url: '/make_error') }
|
246
287
|
|
247
288
|
it { expect(subject.body).to eq '{:error=>"error block rescued"}' }
|
248
289
|
end
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
7.5.
|
1
|
+
7.5.2
|
@@ -1,7 +1,7 @@
|
|
1
1
|
class Rack::App::Middlewares::SetPathParams
|
2
2
|
|
3
|
-
def initialize(app,
|
4
|
-
@
|
3
|
+
def initialize(app, build_env)
|
4
|
+
@build_env = build_env
|
5
5
|
@app = app
|
6
6
|
end
|
7
7
|
|
@@ -16,19 +16,21 @@ class Rack::App::Middlewares::SetPathParams
|
|
16
16
|
protected
|
17
17
|
|
18
18
|
def populate_path_params(env)
|
19
|
-
@
|
19
|
+
@build_env.params.each do |index, key|
|
20
20
|
env[E::PATH_SEGMENTS_PARAMS][key] = env[E::SPLITTED_PATH_INFO][index]
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
24
|
def correct_last_value_from_extensions(env)
|
25
|
+
return if @build_env.endpoint.config.serializer.extnames.empty?
|
25
26
|
last_index = env[E::SPLITTED_PATH_INFO].length - 1
|
26
|
-
return if @
|
27
|
-
extless(env[E::PATH_SEGMENTS_PARAMS][@
|
27
|
+
return if @build_env.params[last_index].nil?
|
28
|
+
extless(env[E::PATH_SEGMENTS_PARAMS][@build_env.params[last_index]])
|
28
29
|
end
|
29
30
|
|
30
31
|
def extless(value)
|
31
32
|
extname = File.extname(value)
|
33
|
+
return unless @build_env.endpoint.config.serializer.extnames.include?(extname)
|
32
34
|
value.slice!(/#{Regexp.escape(extname)}$/) unless extname.empty?
|
33
35
|
end
|
34
36
|
|
@@ -21,12 +21,12 @@ class Rack::App::Router::Tree::Vein < ::Hash
|
|
21
21
|
|
22
22
|
def create_app(env)
|
23
23
|
app = env.endpoint.to_app
|
24
|
-
env.params.empty? ? app : wrap(app, env
|
24
|
+
env.params.empty? ? app : wrap(app, env)
|
25
25
|
end
|
26
26
|
|
27
|
-
def wrap(app,
|
27
|
+
def wrap(app, env)
|
28
28
|
builder = Rack::Builder.new
|
29
|
-
builder.use(Rack::App::Middlewares::SetPathParams,
|
29
|
+
builder.use(Rack::App::Middlewares::SetPathParams, env)
|
30
30
|
builder.run(app)
|
31
31
|
builder.to_app
|
32
32
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rack-app
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 7.5.
|
4
|
+
version: 7.5.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adam Luzsi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-07-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -226,7 +226,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
226
226
|
version: '0'
|
227
227
|
requirements: []
|
228
228
|
rubyforge_project:
|
229
|
-
rubygems_version: 2.6.
|
229
|
+
rubygems_version: 2.6.8
|
230
230
|
signing_key:
|
231
231
|
specification_version: 4
|
232
232
|
summary: Your next favourite, performance designed micro framework!
|