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 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: