kawaii-core 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/README.md +121 -52
- data/kawaii-core.gemspec +5 -4
- data/lib/kawaii/base.rb +32 -8
- data/lib/kawaii/controller.rb +1 -1
- data/lib/kawaii/matchers.rb +2 -2
- data/lib/kawaii/method_chain.rb +1 -1
- data/lib/kawaii/render_methods.rb +2 -1
- data/lib/kawaii/routing_methods.rb +1 -1
- data/lib/kawaii/version.rb +1 -1
- metadata +18 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d81d0ba32a44a5b7eceec6b3979cd33f58970ec3
|
4
|
+
data.tar.gz: 8da2f45e4fc4e5291372f5f5c46edfb1139e849e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4b583cd1e65bbbc8b8f73ea402fde6e5a706d31778ebfdfd801590af617ee74dd2b3cd8985f1eaa3c42c562610f7f47b181b27a8a45fce7d53c595a9f425f1fb
|
7
|
+
data.tar.gz: 368d2864fe554d1923dea8e4cb438694c522eb618316d8feca27554ba3f25578eac98dbf884463bd1e1117cce89017d70697d7a74f108b28e57d431830328294
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
|
4
4
|
Kawaii is a simple web framework based on Rack.
|
5
5
|
|
6
|
-
**
|
6
|
+
**This is work in progress. The API is subject to change.**
|
7
7
|
|
8
8
|
## Installation
|
9
9
|
|
@@ -23,26 +23,34 @@ Or install it yourself as:
|
|
23
23
|
|
24
24
|
## Running examples
|
25
25
|
|
26
|
-
The
|
26
|
+
Clone the Kawaii project to run the examples. The [/examples directory](https://github.com/bilus/kawaii/tree/master/examples) contains various basic usage examples.
|
27
|
+
|
28
|
+
```
|
29
|
+
$ git clone https://github.com/bilus/kawaii.git
|
30
|
+
$ cd kawaii
|
31
|
+
```
|
27
32
|
|
28
33
|
Run the examples using rackup or directly:
|
29
34
|
|
30
35
|
```
|
31
36
|
$ cd examples
|
32
|
-
$ rackup -
|
37
|
+
$ rackup -I ../lib modular.ru
|
33
38
|
```
|
34
39
|
|
35
40
|
Many examples can also be run directly without rackup, e.g.:
|
36
41
|
|
37
|
-
```
|
42
|
+
```ruby
|
38
43
|
$ cd examples
|
39
|
-
$ ruby -
|
44
|
+
$ ruby -I ../lib hello_world.rb
|
45
|
+
```
|
40
46
|
|
41
47
|
## Getting started
|
42
48
|
|
49
|
+
Note: In addition to this Readme, there's also an online [API reference](http://bilus.github.io/kawaii/Kawaii.html).
|
50
|
+
|
43
51
|
Kawaii's basic usage is very similar how you'd use Sinatra. You can define route handlers at the file scope. Here's an example:
|
44
52
|
|
45
|
-
```
|
53
|
+
```ruby
|
46
54
|
require 'kawaii'
|
47
55
|
|
48
56
|
get '/' do
|
@@ -62,7 +70,7 @@ Then navigate to `http://localhost:8088` to see the greeting.
|
|
62
70
|
|
63
71
|
To run the app you created in the "Getting started" section above using rackup, create the following `hello.ru` file:
|
64
72
|
|
65
|
-
```
|
73
|
+
```ruby
|
66
74
|
require 'kawaii'
|
67
75
|
require_relative 'hello'
|
68
76
|
|
@@ -79,7 +87,7 @@ There are several methods you can use to build your routes, handle passed parame
|
|
79
87
|
|
80
88
|
The basic way to add a route handler is to invoke a method corresponding to the given HTTP verb, e.g.:
|
81
89
|
|
82
|
-
```
|
90
|
+
```ruby
|
83
91
|
post '/users' do
|
84
92
|
# Some response
|
85
93
|
end
|
@@ -110,7 +118,7 @@ For example `get '/users/?'` matches both `/users/` and `/users` while `get '/us
|
|
110
118
|
|
111
119
|
Route patterns may contain named parameters, prefixed with a colon. Parameters are accessible through the `params` hash in handler:
|
112
120
|
|
113
|
-
```
|
121
|
+
```ruby
|
114
122
|
get '/users/:id' do
|
115
123
|
params[:id]
|
116
124
|
end
|
@@ -122,7 +130,7 @@ end
|
|
122
130
|
|
123
131
|
Route patterns may contain regular expressions. Example:
|
124
132
|
|
125
|
-
```
|
133
|
+
```ruby
|
126
134
|
get %r{/users/.*} do
|
127
135
|
'Hello, world'
|
128
136
|
end
|
@@ -132,7 +140,7 @@ end
|
|
132
140
|
|
133
141
|
Routes may be nested using the `context` method. Example:
|
134
142
|
|
135
|
-
```
|
143
|
+
```ruby
|
136
144
|
context '/api' do
|
137
145
|
get '/users' do
|
138
146
|
'Hello'
|
@@ -146,13 +154,13 @@ Will above handler will be accessible through `/api/users`.
|
|
146
154
|
|
147
155
|
If string patterns and regular expression are not flexible enough, you can create a custom matcher.
|
148
156
|
|
149
|
-
A matcher instance responds to `match` method and returns either a `Match` instance or nil if there's no match. See documentation for {Matcher#match} for more details.
|
157
|
+
A matcher instance responds to `match` method and returns either a `Match` instance or nil if there's no match. See documentation for {Kawaii::Matcher#match} for more details.
|
150
158
|
|
151
159
|
### Request object
|
152
160
|
|
153
161
|
Handlers can access the `Rack::Request` instance corresponding to the current request:
|
154
162
|
|
155
|
-
```
|
163
|
+
```ruby
|
156
164
|
get '/' do
|
157
165
|
request.host
|
158
166
|
end
|
@@ -162,7 +170,7 @@ end
|
|
162
170
|
|
163
171
|
View templates must currently be stored in `views/` directory of the project using Kawaii. They can be rendered using the `render` method:
|
164
172
|
|
165
|
-
```
|
173
|
+
```ruby
|
166
174
|
get '/' do
|
167
175
|
render('index.html.erb')
|
168
176
|
end
|
@@ -170,7 +178,7 @@ end
|
|
170
178
|
|
171
179
|
You can set instance variables and use them in the templates.
|
172
180
|
|
173
|
-
```
|
181
|
+
```ruby
|
174
182
|
get '/' do
|
175
183
|
@title = 'Hello, world'
|
176
184
|
render('index.html.erb')
|
@@ -179,7 +187,7 @@ end
|
|
179
187
|
|
180
188
|
Let's say `views/index.html.erb` looks like this:
|
181
189
|
|
182
|
-
```
|
190
|
+
```html
|
183
191
|
<h1><%= @title %></h1>
|
184
192
|
```
|
185
193
|
|
@@ -311,10 +319,40 @@ describe MyApp
|
|
311
319
|
end
|
312
320
|
```
|
313
321
|
|
322
|
+
## Custom 404 handler
|
323
|
+
|
324
|
+
By default Kawaii will respond with 404 'Not found' if no matching routes can be found.
|
325
|
+
|
326
|
+
You can define your own 404 handler:
|
327
|
+
|
328
|
+
```ruby
|
329
|
+
not_found do
|
330
|
+
[404, {Rack::CONTENT_TYPE => 'text/plain'}, ['No matching routes found']]
|
331
|
+
end
|
332
|
+
```
|
333
|
+
|
334
|
+
Notice that it needs to respond with a valid Rack response Array.
|
335
|
+
|
336
|
+
## Custom exception handler
|
337
|
+
|
338
|
+
You can define your own 500 handler for unhandled exception:
|
339
|
+
|
340
|
+
```ruby
|
341
|
+
get '/' do
|
342
|
+
fail 'Ooops!'
|
343
|
+
end
|
344
|
+
on_error do |e|
|
345
|
+
[500, {Rack::CONTENT_TYPE => 'text/plain'}, [e.to_s]]
|
346
|
+
end
|
347
|
+
```
|
348
|
+
|
349
|
+
Just like with `not_found`, you need to return a well-formed Rack response Array.
|
350
|
+
|
314
351
|
## Resources
|
315
352
|
|
316
|
-
|
317
|
-
|
353
|
+
1. [API reference](http://bilus.github.io/kawaii/Kawaii.html).
|
354
|
+
2. See [examples](https://github.com/bilus/kawaii/tree/master/examples) of basic usage of Kawaii.
|
355
|
+
3. Small [example project](https://github.com/bilus/kawaii-sample) using the gem.
|
318
356
|
|
319
357
|
## Contributing
|
320
358
|
|
@@ -328,43 +366,74 @@ The gem is available as open source under the terms of the [MIT License](http://
|
|
328
366
|
|
329
367
|
## TODO
|
330
368
|
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
369
|
+
X Hello world app.
|
370
|
+
|
371
|
+
X Specs for the app.
|
372
|
+
|
373
|
+
X GET routes inside a class deriving from Base.
|
374
|
+
|
375
|
+
X Support for running apps without config.ru (ruby -I ./lib examples/hello_world.rb
|
376
|
+
|
377
|
+
X Top-level routes.
|
378
|
+
|
379
|
+
X Example for top-level routes.
|
380
|
+
|
381
|
+
X Nested routes.
|
382
|
+
|
383
|
+
X Modular apps (multiple modules via config.ru).
|
384
|
+
|
385
|
+
X Matchers.
|
386
|
+
|
387
|
+
X Wildcard regex routes, e.g. '/foo/bar/?'.
|
388
|
+
|
389
|
+
X Parameter-based routes. Unsupported in 'context'.
|
390
|
+
|
391
|
+
X Request object.
|
392
|
+
|
393
|
+
X Merge Rack Request params.
|
394
|
+
|
395
|
+
X String responses.
|
396
|
+
|
397
|
+
X Other HTTP verbs.
|
398
|
+
|
399
|
+
X Refactor & create individual files.
|
400
|
+
|
401
|
+
X Views (via `render` method in handlers) using Tilt.
|
402
|
+
|
403
|
+
X Rack route test helpers work.
|
404
|
+
|
405
|
+
X API reference.
|
406
|
+
|
407
|
+
X Check: References to methods defined in contexts and at class scope.
|
408
|
+
|
409
|
+
X Controllers - 'hello_world#index'
|
410
|
+
|
411
|
+
X 'route' to controllers (via class name or symbol references).
|
412
|
+
|
413
|
+
X Controllers - render.
|
414
|
+
|
415
|
+
X Push gem.
|
416
|
+
|
417
|
+
X Readme - description and tutorial.
|
418
|
+
|
419
|
+
X Example project using the gem and controllers (with views).
|
420
|
+
|
421
|
+
X Custom error handling (intercept exceptions, 404 what else?).
|
422
|
+
|
423
|
+
X Rubocop-compliant.
|
424
|
+
|
425
|
+
O Update and push.
|
426
|
+
|
427
|
+
O Code review
|
428
|
+
|
429
|
+
O Rack/custom global middleware.
|
430
|
+
|
431
|
+
O Route-specific middleware.
|
365
432
|
|
366
433
|
## Known issues
|
367
434
|
|
435
|
+
**There are many missing features and glitches are inevitable. The library hasn't been used in production yet. Please report them to `gyamtso at gmail dot com`.**
|
436
|
+
|
368
437
|
### Rubocop
|
369
438
|
|
370
439
|
`lib/kawaii/routing_methods.rb:46:1: C: Extra blank line detected.`
|
data/kawaii-core.gemspec
CHANGED
@@ -9,10 +9,10 @@ Gem::Specification.new do |spec|
|
|
9
9
|
spec.authors = ['Marcin Bilski']
|
10
10
|
spec.email = ['gyamtso@gmail.com']
|
11
11
|
|
12
|
-
spec.summary = '
|
13
|
-
spec.description = 'Kawaii is a
|
14
|
-
|
15
|
-
spec.homepage =
|
12
|
+
spec.summary = 'A simple web framework based on Rack'
|
13
|
+
spec.description = 'Kawaii is a simple web framework based on Rack'
|
14
|
+
|
15
|
+
spec.homepage = 'https://github.com/bilus/kawaii'
|
16
16
|
spec.license = 'MIT'
|
17
17
|
|
18
18
|
spec.files = `git ls-files -z`.split("\x0").reject { |f|
|
@@ -31,4 +31,5 @@ Gem::Specification.new do |spec|
|
|
31
31
|
spec.add_development_dependency 'guard-rspec', '~>4.6'
|
32
32
|
spec.add_development_dependency 'rack-test', '~>0.6'
|
33
33
|
spec.add_development_dependency 'yard', '~> 0.8'
|
34
|
+
spec.add_development_dependency 'rubocop', '~> 0.35'
|
34
35
|
end
|
data/lib/kawaii/base.rb
CHANGED
@@ -20,29 +20,53 @@ module Kawaii
|
|
20
20
|
|
21
21
|
# Instances of classes derived from [Kawaii::Base] are Rack applications.
|
22
22
|
def call(env)
|
23
|
-
matching = self.class.match(env)
|
23
|
+
matching = self.class.match(env)
|
24
24
|
matching.call(env)
|
25
|
+
rescue => e
|
26
|
+
self.class.handle_error(e)
|
25
27
|
end
|
26
28
|
|
27
29
|
class << self
|
28
30
|
include ServerMethods
|
29
31
|
include RoutingMethods
|
30
32
|
|
33
|
+
# Define 404 handler. Has to return a valid Rack response.
|
34
|
+
def not_found(&block)
|
35
|
+
@not_found_handler = block
|
36
|
+
end
|
37
|
+
|
38
|
+
# Define an unhandled exception handler. Has to return a valid Rack
|
39
|
+
# response.
|
40
|
+
def on_error(&block)
|
41
|
+
@error_handler = block
|
42
|
+
end
|
43
|
+
|
44
|
+
def match(env)
|
45
|
+
super(env) || not_found_handler
|
46
|
+
end
|
47
|
+
|
31
48
|
# Make it runnable via `run MyApp`.
|
32
49
|
def call(env)
|
33
50
|
@app ||= new
|
34
51
|
@app.call(env)
|
35
52
|
end
|
36
|
-
end
|
37
53
|
|
38
|
-
|
54
|
+
def handle_error(e)
|
55
|
+
handler = @error_handler || ->(ex) { fail ex }
|
56
|
+
handler.call(e)
|
57
|
+
end
|
39
58
|
|
40
|
-
|
41
|
-
@downstream_app || ->(_env) { text(404, 'Not found') }
|
42
|
-
end
|
59
|
+
protected
|
43
60
|
|
44
|
-
|
45
|
-
|
61
|
+
def not_found_handler
|
62
|
+
@downstream_app ||
|
63
|
+
@not_found_handler ||
|
64
|
+
->(_env) { text(404, 'Not found') }
|
65
|
+
end
|
66
|
+
|
67
|
+
def text(status, s)
|
68
|
+
[status, { Rack::CONTENT_TYPE => 'text/plain' }, [s]]
|
69
|
+
end
|
46
70
|
end
|
47
71
|
end
|
48
72
|
end
|
data/lib/kawaii/controller.rb
CHANGED
data/lib/kawaii/matchers.rb
CHANGED
@@ -43,7 +43,7 @@ module Kawaii
|
|
43
43
|
end
|
44
44
|
|
45
45
|
# Tries to match the actual path.
|
46
|
-
# @param
|
46
|
+
# @param _path [String] the actual path from Rack env
|
47
47
|
# @return {Match} if the beginning of path does match or nil if there is
|
48
48
|
# no match.
|
49
49
|
def match(_path)
|
@@ -100,7 +100,7 @@ module Kawaii
|
|
100
100
|
# get /\/users.*/ do ... end
|
101
101
|
class RegexpMatcher
|
102
102
|
# Creates a {RegexpMatcher}
|
103
|
-
# @param
|
103
|
+
# @param rx [Regexp] path specification regex
|
104
104
|
# @todo Support parameters based on named capture groups.
|
105
105
|
def initialize(rx)
|
106
106
|
@rx = rx
|
data/lib/kawaii/method_chain.rb
CHANGED
@@ -2,7 +2,8 @@ module Kawaii
|
|
2
2
|
# Template rendering based on Tilt.
|
3
3
|
module RenderMethods
|
4
4
|
# Renders a template.
|
5
|
-
# @param tmpl [String] file name or path to template, relative to /views in
|
5
|
+
# @param tmpl [String] file name or path to template, relative to /views in
|
6
|
+
# project dir
|
6
7
|
# @example Rendering html erb file
|
7
8
|
# render('index.html.erb')
|
8
9
|
# @todo Layouts.
|
data/lib/kawaii/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kawaii-core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Marcin Bilski
|
@@ -122,7 +122,21 @@ dependencies:
|
|
122
122
|
- - "~>"
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: '0.8'
|
125
|
-
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: rubocop
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0.35'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "~>"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0.35'
|
139
|
+
description: Kawaii is a simple web framework based on Rack
|
126
140
|
email:
|
127
141
|
- gyamtso@gmail.com
|
128
142
|
executables: []
|
@@ -185,9 +199,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
185
199
|
version: '0'
|
186
200
|
requirements: []
|
187
201
|
rubyforge_project:
|
188
|
-
rubygems_version: 2.
|
202
|
+
rubygems_version: 2.4.8
|
189
203
|
signing_key:
|
190
204
|
specification_version: 4
|
191
|
-
summary:
|
205
|
+
summary: A simple web framework based on Rack
|
192
206
|
test_files: []
|
193
207
|
has_rdoc:
|