krack 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
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 Show
18
+ class Index < Krack::Endpoint
11
19
  def respond
12
- widget = Widget.find(params["id"])
13
- {widget: widget.as_json}
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
@@ -22,4 +22,5 @@ Gem::Specification.new do |gem|
22
22
 
23
23
  gem.add_development_dependency 'rake'
24
24
  gem.add_development_dependency 'minitest'
25
+ gem.add_development_dependency 'rack-test'
25
26
  end
@@ -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
- Krack::Error.new(500).respond
34
+ on_halt(500)
35
35
  end
36
36
 
37
37
  def on_halt(halt)
38
- Krack::Error.new(halt).respond
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 < StandardError
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 respond
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.dup.call(env)
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
@@ -1,3 +1,3 @@
1
1
  module Krack
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -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.2
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-20 00:00:00.000000000 Z
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: