jimson 0.1.0 → 0.2.0

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/CHANGELOG.rdoc CHANGED
@@ -0,0 +1,5 @@
1
+ == 0.2.0 / 2011-07-20
2
+
3
+ * Major enhancements
4
+
5
+ * Replace patron with rest-client for JRuby compatibility in the client
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0
1
+ 0.2.0
data/lib/jimson.rb CHANGED
@@ -1,11 +1,6 @@
1
1
  require 'rubygems'
2
- require 'jimson/request'
3
- require 'jimson/response'
4
- require 'jimson/server_error'
5
2
  require 'jimson/server'
6
- require 'jimson/client_error'
7
3
  require 'jimson/client'
8
4
 
9
5
  module Jimson
10
- JSON_RPC_VERSION = '2.0'
11
6
  end
data/lib/jimson/client.rb CHANGED
@@ -1,17 +1,20 @@
1
- require 'patron'
1
+ require 'rest-client'
2
+ require 'jimson/server_error'
3
+ require 'jimson/client_error'
4
+ require 'jimson/request'
5
+ require 'jimson/response'
2
6
 
3
7
  module Jimson
4
8
  class ClientHelper
9
+ JSON_RPC_VERSION = '2.0'
5
10
 
6
11
  def self.make_id
7
12
  rand(10**12)
8
13
  end
9
14
 
10
15
  def initialize(url)
11
- @http = Patron::Session.new
12
- uri = URI(url)
13
- @path = uri.path
14
- @http.base_url = "#{uri.scheme}://#{uri.host}:#{uri.port}"
16
+ @url = url
17
+ URI.parse(@url) # for the sake of validating the url
15
18
  @batch = []
16
19
  end
17
20
 
@@ -29,12 +32,12 @@ module Jimson
29
32
 
30
33
  def send_single_request(method, args)
31
34
  post_data = {
32
- 'jsonrpc' => '2.0',
35
+ 'jsonrpc' => JSON_RPC_VERSION,
33
36
  'method' => method,
34
37
  'params' => args,
35
38
  'id' => self.class.make_id
36
39
  }.to_json
37
- resp = @http.post(@path, post_data)
40
+ resp = RestClient.post(@url, post_data, :content_type => 'application/json')
38
41
  if resp.nil? || resp.body.nil? || resp.body.empty?
39
42
  raise Jimson::ClientError::InvalidResponse.new
40
43
  end
@@ -47,7 +50,7 @@ module Jimson
47
50
 
48
51
  def send_batch_request(batch)
49
52
  post_data = batch.to_json
50
- resp = @http.post(@path, post_data)
53
+ resp = RestClient.post(@url, post_data, :content_type => 'application/json')
51
54
  if resp.nil? || resp.body.nil? || resp.body.empty?
52
55
  raise Jimson::ClientError::InvalidResponse.new
53
56
  end
@@ -84,7 +87,7 @@ module Jimson
84
87
  def valid_response?(data)
85
88
  return false if !data.is_a?(Hash)
86
89
 
87
- return false if data['jsonrpc'] != '2.0'
90
+ return false if data['jsonrpc'] != JSON_RPC_VERSION
88
91
 
89
92
  return false if !data.has_key?('id')
90
93
 
data/lib/jimson/server.rb CHANGED
@@ -2,11 +2,14 @@ require 'eventmachine'
2
2
  require 'evma_httpserver'
3
3
  require 'logger'
4
4
  require 'json'
5
+ require 'jimson/server_error'
5
6
 
6
7
  module Jimson
7
8
  class HttpServer < EM::Connection
8
9
  include EM::HttpServer
9
10
 
11
+ JSON_RPC_VERSION = '2.0'
12
+
10
13
  def self.handler=(handler)
11
14
  @@handler = handler
12
15
  end
@@ -76,7 +79,7 @@ module Jimson
76
79
  return false if request.has_key?(key) && !types.any? { |type| request[key].is_a?(type) }
77
80
  end
78
81
 
79
- return false if request['jsonrpc'] != '2.0'
82
+ return false if request['jsonrpc'] != JSON_RPC_VERSION
80
83
 
81
84
  true
82
85
  end
@@ -93,6 +96,8 @@ module Jimson
93
96
  raise Jimson::ServerError::MethodNotFound.new
94
97
  rescue ArgumentError
95
98
  raise Jimson::ServerError::InvalidParams.new
99
+ rescue
100
+ raise Jimson::ServerError::ApplicationError.new($!)
96
101
  end
97
102
 
98
103
  response = success_response(request, result)
@@ -47,6 +47,12 @@ module Jimson
47
47
  end
48
48
  end
49
49
 
50
+ class ApplicationError < Generic
51
+ def initialize(err)
52
+ super(-32099, "The application being served raised an error: #{err}")
53
+ end
54
+ end
55
+
50
56
  CODES = {
51
57
  -32700 => ParseError,
52
58
  -32600 => InvalidRequest,
data/spec/client_spec.rb CHANGED
@@ -3,9 +3,6 @@ module Jimson
3
3
  BOILERPLATE = {'jsonrpc' => '2.0', 'id' => 1}
4
4
 
5
5
  before(:each) do
6
- @http_mock = mock('http')
7
- Patron::Session.stub!(:new).and_return(@http_mock)
8
- @http_mock.should_receive(:base_url=).with(SPEC_URL)
9
6
  @resp_mock = mock('http_response')
10
7
  ClientHelper.stub!(:make_id).and_return(1)
11
8
  end
@@ -25,7 +22,7 @@ module Jimson
25
22
  end
26
23
  it "sends a valid JSON-RPC request and returns the result" do
27
24
  response = BOILERPLATE.merge({'result' => 42}).to_json
28
- @http_mock.should_receive(:post).with('', @expected).and_return(@resp_mock)
25
+ RestClient.should_receive(:post).with(SPEC_URL, @expected, {:content_type => 'application/json'}).and_return(@resp_mock)
29
26
  @resp_mock.should_receive(:body).at_least(:once).and_return(response)
30
27
  client = Client.new(SPEC_URL)
31
28
  client.foo(1,2,3).should == 42
@@ -50,7 +47,7 @@ module Jimson
50
47
  ].to_json
51
48
 
52
49
  ClientHelper.stub!(:make_id).and_return('1', '2', '5', '9')
53
- @http_mock.should_receive(:post).with('', batch).and_return(@resp_mock)
50
+ RestClient.should_receive(:post).with(SPEC_URL, batch, {:content_type => 'application/json'}).and_return(@resp_mock)
54
51
  @resp_mock.should_receive(:body).at_least(:once).and_return(response)
55
52
  client = Client.new(SPEC_URL)
56
53
 
data/spec/server_spec.rb CHANGED
@@ -12,8 +12,7 @@ module Jimson
12
12
  'id' => nil
13
13
  }
14
14
  before(:each) do
15
- @sess = Patron::Session.new
16
- @sess.base_url = SPEC_URL
15
+ @url = SPEC_URL
17
16
  end
18
17
 
19
18
  describe "receiving a request with positional parameters" do
@@ -25,7 +24,7 @@ module Jimson
25
24
  'params' => [24, 20],
26
25
  'id' => 1
27
26
  }
28
- resp = JSON.parse(@sess.post('/', req.to_json).body)
27
+ resp = JSON.parse(RestClient.post(@url, req.to_json).body)
29
28
  resp.should == {
30
29
  'jsonrpc' => '2.0',
31
30
  'result' => 4,
@@ -44,7 +43,7 @@ module Jimson
44
43
  'params' => {'subtrahend'=> 20, 'minuend' => 24},
45
44
  'id' => 1
46
45
  }
47
- resp = JSON.parse(@sess.post('/', req.to_json).body)
46
+ resp = JSON.parse(RestClient.post(@url, req.to_json).body)
48
47
  resp.should == {
49
48
  'jsonrpc' => '2.0',
50
49
  'result' => 4,
@@ -62,7 +61,7 @@ module Jimson
62
61
  'method' => 'update',
63
62
  'params' => [1,2,3,4,5]
64
63
  }
65
- resp = @sess.post('/', req.to_json).body
64
+ resp = RestClient.post(@url, req.to_json).body
66
65
  resp.should be_empty
67
66
  end
68
67
  end
@@ -75,7 +74,7 @@ module Jimson
75
74
  'method' => 'foobar',
76
75
  'id' => 1
77
76
  }
78
- resp = JSON.parse(@sess.post('/', req.to_json).body)
77
+ resp = JSON.parse(RestClient.post(@url, req.to_json).body)
79
78
  resp.should == {
80
79
  'jsonrpc' => '2.0',
81
80
  'error' => {
@@ -95,7 +94,7 @@ module Jimson
95
94
  'params' => [1,2,3],
96
95
  'id' => 1
97
96
  }
98
- resp = JSON.parse(@sess.post('/', req.to_json).body)
97
+ resp = JSON.parse(RestClient.post(@url, req.to_json).body)
99
98
  resp.should == {
100
99
  'jsonrpc' => '2.0',
101
100
  'error' => {
@@ -115,7 +114,7 @@ module Jimson
115
114
  'id' => 1
116
115
  }.to_json
117
116
  req += '}' # make the json invalid
118
- resp = JSON.parse(@sess.post('/', req).body)
117
+ resp = JSON.parse(RestClient.post(@url, req).body)
119
118
  resp.should == {
120
119
  'jsonrpc' => '2.0',
121
120
  'error' => {
@@ -134,7 +133,7 @@ module Jimson
134
133
  'jsonrpc' => '2.0',
135
134
  'method' => 1 # method as int is invalid
136
135
  }.to_json
137
- resp = JSON.parse(@sess.post('/', req).body)
136
+ resp = JSON.parse(RestClient.post(@url, req).body)
138
137
  resp.should == INVALID_RESPONSE_EXPECTATION
139
138
  end
140
139
  end
@@ -142,7 +141,7 @@ module Jimson
142
141
  context "when the request is an empty batch" do
143
142
  it "returns an error response" do
144
143
  req = [].to_json
145
- resp = JSON.parse(@sess.post('/', req).body)
144
+ resp = JSON.parse(RestClient.post(@url, req).body)
146
145
  resp.should == INVALID_RESPONSE_EXPECTATION
147
146
  end
148
147
  end
@@ -150,7 +149,7 @@ module Jimson
150
149
  context "when the request is an invalid batch" do
151
150
  it "returns an error response" do
152
151
  req = [1,2].to_json
153
- resp = JSON.parse(@sess.post('/', req).body)
152
+ resp = JSON.parse(RestClient.post(@url, req).body)
154
153
  resp.should == [INVALID_RESPONSE_EXPECTATION, INVALID_RESPONSE_EXPECTATION]
155
154
  end
156
155
  end
@@ -167,7 +166,7 @@ module Jimson
167
166
  {'jsonrpc' => '2.0', 'method' => 'foo.get', 'params' => {'name' => 'myself'}, 'id' => '5'},
168
167
  {'jsonrpc' => '2.0', 'method' => 'get_data', 'id' => '9'}
169
168
  ].to_json
170
- resp = JSON.parse(@sess.post('/', reqs).body)
169
+ resp = JSON.parse(RestClient.post(@url, reqs).body)
171
170
  resp.should == [
172
171
  {'jsonrpc' => '2.0', 'result' => 7, 'id' => '1'},
173
172
  {'jsonrpc' => '2.0', 'result' => 19, 'id' => '2'},
@@ -192,7 +191,7 @@ module Jimson
192
191
  'params' => [1,2,3,4,5]
193
192
  }
194
193
  ]
195
- resp = @sess.post('/', req.to_json).body
194
+ resp = RestClient.post(@url, req.to_json).body
196
195
  resp.should be_empty
197
196
  end
198
197
  end
data/spec/spec_helper.rb CHANGED
@@ -1,18 +1,12 @@
1
1
  require 'rubygems'
2
2
  $:.unshift(File.dirname(__FILE__) + '/../lib/')
3
- require 'jimson'
3
+ require 'jimson/server'
4
+ require 'jimson/client'
4
5
  require 'open-uri'
5
6
  require 'json'
6
- require 'patron'
7
- require 'fakeweb'
8
7
 
9
8
  SPEC_URL = 'http://localhost:8999'
10
9
 
11
-
12
- def fake_response(json)
13
- FakeWeb.register_uri(:post, SPEC_URL, :body => json)
14
- end
15
-
16
10
  pid = Process.spawn(File.dirname(__FILE__) + '/em_helper.rb')
17
11
 
18
12
  RSpec.configure do |config|
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: jimson
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.1.0
5
+ version: 0.2.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - Chris Kite
@@ -10,18 +10,18 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-07-19 00:00:00 -05:00
13
+ date: 2011-07-20 00:00:00 -05:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
- name: patron
17
+ name: rest-client
18
18
  prerelease: false
19
19
  requirement: &id001 !ruby/object:Gem::Requirement
20
20
  none: false
21
21
  requirements:
22
22
  - - ">="
23
23
  - !ruby/object:Gem::Version
24
- version: 0.4.12
24
+ version: 1.6.3
25
25
  type: :runtime
26
26
  version_requirements: *id001
27
27
  - !ruby/object:Gem::Dependency