kawaii-core 0.1.0 → 0.1.1
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/.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:
|