krack 0.0.2 → 0.0.3
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.
- data/README.md +20 -5
- data/krack.gemspec +1 -0
- data/lib/krack/endpoint.rb +5 -3
- data/lib/krack/error.rb +3 -4
- data/lib/krack/router.rb +2 -2
- data/lib/krack/version.rb +1 -1
- data/spec/endpoint_spec.rb +49 -0
- data/spec/spec_helper.rb +12 -1
- metadata +20 -2
data/README.md
CHANGED
@@ -3,18 +3,33 @@
|
|
3
3
|
Simple JSON APIs on Rack. Like so:
|
4
4
|
|
5
5
|
# config.ru
|
6
|
-
|
7
6
|
require 'krack'
|
8
7
|
|
8
|
+
class Widget # < "ORM"
|
9
|
+
DB = {
|
10
|
+
"1" => {name: "Foo", color: "Black"},
|
11
|
+
"2" => {name: "Bar", color: "White"}
|
12
|
+
}
|
13
|
+
def self.all; DB end
|
14
|
+
def self.find(id); DB[id] end
|
15
|
+
end
|
16
|
+
|
9
17
|
module Widgets
|
10
|
-
class
|
18
|
+
class Index < Krack::Endpoint
|
11
19
|
def respond
|
12
|
-
|
13
|
-
|
20
|
+
{widgets: Widget.all}
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
class Show < Krack::Endpoint
|
25
|
+
def respond
|
26
|
+
widget = Widget.find(params["id"]) or throw :halt, 404
|
27
|
+
{widget: widget}
|
14
28
|
end
|
15
29
|
end
|
16
30
|
end
|
17
|
-
|
31
|
+
|
18
32
|
run Krack::Router.new {
|
33
|
+
get "/widgets", Widgets::Index
|
19
34
|
get "/widgets/:id", Widgets::Show
|
20
35
|
}
|
data/krack.gemspec
CHANGED
data/lib/krack/endpoint.rb
CHANGED
@@ -12,8 +12,8 @@ module Krack
|
|
12
12
|
@response = Rack::Response.new([], 200, {"Content-Type" => "application/json"})
|
13
13
|
@params = env["krack.params"].merge(@request.params)
|
14
14
|
|
15
|
-
on_call
|
16
15
|
data = begin
|
16
|
+
on_call
|
17
17
|
respond_or_halt
|
18
18
|
rescue
|
19
19
|
on_error($!)
|
@@ -31,11 +31,13 @@ module Krack
|
|
31
31
|
def on_call; end
|
32
32
|
|
33
33
|
def on_error(error)
|
34
|
-
|
34
|
+
on_halt(500)
|
35
35
|
end
|
36
36
|
|
37
37
|
def on_halt(halt)
|
38
|
-
Krack::Error.new(halt)
|
38
|
+
e = Krack::Error.new(halt)
|
39
|
+
response.status = e.status
|
40
|
+
e.to_h
|
39
41
|
end
|
40
42
|
|
41
43
|
def output(data)
|
data/lib/krack/error.rb
CHANGED
@@ -1,13 +1,12 @@
|
|
1
1
|
module Krack
|
2
|
-
class Error
|
3
|
-
|
2
|
+
class Error
|
4
3
|
attr_accessor :status
|
5
4
|
|
6
5
|
def initialize(status=500)
|
7
|
-
@status = status
|
6
|
+
@status = Rack::Utils::HTTP_STATUS_CODES.has_key?(status) ? status : 500
|
8
7
|
end
|
9
8
|
|
10
|
-
def
|
9
|
+
def to_h
|
11
10
|
{error: {status: status, message: Rack::Utils::HTTP_STATUS_CODES[status]}}
|
12
11
|
end
|
13
12
|
end
|
data/lib/krack/router.rb
CHANGED
@@ -13,11 +13,11 @@ module Krack
|
|
13
13
|
next unless match = env["PATH_INFO"].match(route)
|
14
14
|
|
15
15
|
env["krack.params"] = Hash[match.names.zip(match.captures)]
|
16
|
-
return app.
|
16
|
+
return app.call(env)
|
17
17
|
end
|
18
18
|
not_found
|
19
19
|
end
|
20
|
-
|
20
|
+
|
21
21
|
def not_found
|
22
22
|
[404, {"Content-Type" => "text/plain"}, ["Not found"]]
|
23
23
|
end
|
data/lib/krack/version.rb
CHANGED
@@ -0,0 +1,49 @@
|
|
1
|
+
require_relative 'spec_helper'
|
2
|
+
|
3
|
+
class TestEndpoint < Krack::Endpoint
|
4
|
+
def respond
|
5
|
+
throw :halt, 400 if params["halt"] == "1"
|
6
|
+
raise if params["error"] == "1"
|
7
|
+
|
8
|
+
{
|
9
|
+
root: {
|
10
|
+
int_key: 1,
|
11
|
+
str_key: "foo bar",
|
12
|
+
arr_key: ["one", "two"],
|
13
|
+
test_param: params["test"]
|
14
|
+
}
|
15
|
+
}
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def app
|
20
|
+
Krack::Router.new { get "/", TestEndpoint }
|
21
|
+
end
|
22
|
+
|
23
|
+
describe TestEndpoint do
|
24
|
+
it "should succeed" do
|
25
|
+
get "/"
|
26
|
+
json = assert_json
|
27
|
+
json["root"]["int_key"].must_equal 1
|
28
|
+
json["root"]["str_key"].must_equal "foo bar"
|
29
|
+
json["root"]["arr_key"].must_equal ["one", "two"]
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should receive parameters" do
|
33
|
+
get "/", :test => "wibble"
|
34
|
+
json = assert_json
|
35
|
+
json["root"]["test_param"].must_equal "wibble"
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should halt" do
|
39
|
+
get "/", :halt => "1"
|
40
|
+
json = assert_json(400)
|
41
|
+
json["root"].must_be_nil
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should catch exceptions" do
|
45
|
+
get "/", :error => "1"
|
46
|
+
json = assert_json(500)
|
47
|
+
json["root"].must_be_nil
|
48
|
+
end
|
49
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,4 +1,15 @@
|
|
1
1
|
require 'minitest/autorun'
|
2
2
|
require 'minitest/spec'
|
3
|
+
require 'rack/test'
|
3
4
|
|
4
|
-
require_relative '../lib/krack'
|
5
|
+
require_relative '../lib/krack'
|
6
|
+
|
7
|
+
include Rack::Test::Methods
|
8
|
+
|
9
|
+
class MiniTest::Spec
|
10
|
+
def assert_json(status=200)
|
11
|
+
last_response.status.must_equal status
|
12
|
+
last_response.content_type.must_equal "application/json"
|
13
|
+
MultiJson.load(last_response.body)
|
14
|
+
end
|
15
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: krack
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-02-
|
12
|
+
date: 2013-02-26 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rack
|
@@ -75,6 +75,22 @@ dependencies:
|
|
75
75
|
- - ! '>='
|
76
76
|
- !ruby/object:Gem::Version
|
77
77
|
version: '0'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: rack-test
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
type: :development
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
78
94
|
description: Simple JSON APIs on Rack
|
79
95
|
email:
|
80
96
|
- team@kovalo.com
|
@@ -92,6 +108,7 @@ files:
|
|
92
108
|
- lib/krack/error.rb
|
93
109
|
- lib/krack/router.rb
|
94
110
|
- lib/krack/version.rb
|
111
|
+
- spec/endpoint_spec.rb
|
95
112
|
- spec/router_spec.rb
|
96
113
|
- spec/spec_helper.rb
|
97
114
|
homepage: https://github.com/kovalo/krack
|
@@ -119,6 +136,7 @@ signing_key:
|
|
119
136
|
specification_version: 3
|
120
137
|
summary: Simple JSON APIs on Rack
|
121
138
|
test_files:
|
139
|
+
- spec/endpoint_spec.rb
|
122
140
|
- spec/router_spec.rb
|
123
141
|
- spec/spec_helper.rb
|
124
142
|
has_rdoc:
|