sanford-protocol 0.4.1 → 0.5.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/README.md +1 -0
- data/lib/sanford-protocol/connection.rb +8 -0
- data/lib/sanford-protocol/request.rb +34 -13
- data/lib/sanford-protocol/response_status.rb +1 -0
- data/lib/sanford-protocol/test/fake_socket.rb +8 -0
- data/lib/sanford-protocol/version.rb +1 -1
- data/sanford-protocol.gemspec +2 -2
- data/test/unit/connection_tests.rb +6 -1
- data/test/unit/request_tests.rb +24 -24
- metadata +11 -11
data/README.md
CHANGED
@@ -82,6 +82,7 @@ This is the list of defined status codes.
|
|
82
82
|
* `200` - `ok` - The request was successful.
|
83
83
|
* `400` - `bad_request` - The request couldn't be read. This is usually because it was not formed correctly.
|
84
84
|
* `404` - `not_found` - The server couldn't find something requested.
|
85
|
+
* `408` - `timeout` - A client connected but didn't write a request before the server timeod out waiting for one.
|
85
86
|
* `500` - `error` - The server errored responding to the request.
|
86
87
|
|
87
88
|
In addition to these, a service can return custom status codes, but they should use a number greater than or equal to `600` to avoid collisions with Sanford's defined status codes.
|
@@ -33,6 +33,10 @@ module Sanford::Protocol
|
|
33
33
|
@socket.write(msg_version, size, body)
|
34
34
|
end
|
35
35
|
|
36
|
+
def close
|
37
|
+
@socket.close
|
38
|
+
end
|
39
|
+
|
36
40
|
private
|
37
41
|
|
38
42
|
def wait_for_data(timeout)
|
@@ -59,6 +63,10 @@ module Sanford::Protocol
|
|
59
63
|
def write(*binary_strings)
|
60
64
|
tcp_socket.send(binary_strings.join, 0)
|
61
65
|
end
|
66
|
+
|
67
|
+
def close
|
68
|
+
tcp_socket.close rescue false
|
69
|
+
end
|
62
70
|
end
|
63
71
|
|
64
72
|
class TimeoutError < RuntimeError
|
@@ -4,12 +4,21 @@
|
|
4
4
|
|
5
5
|
module Sanford::Protocol
|
6
6
|
|
7
|
-
|
7
|
+
BadRequestError = Class.new(RuntimeError)
|
8
|
+
|
9
|
+
class Request
|
8
10
|
|
9
11
|
def self.parse(body)
|
10
12
|
self.new(body['version'], body['name'], body['params'])
|
11
13
|
end
|
12
14
|
|
15
|
+
attr_reader :version, :name, :params
|
16
|
+
|
17
|
+
def initialize(version, name, params)
|
18
|
+
self.validate!(version, name, params)
|
19
|
+
@version, @name, @params = version, name, self.stringify(params)
|
20
|
+
end
|
21
|
+
|
13
22
|
def to_hash
|
14
23
|
{ 'version' => version,
|
15
24
|
'name' => name,
|
@@ -19,18 +28,6 @@ module Sanford::Protocol
|
|
19
28
|
|
20
29
|
def to_s; "[#{version}] #{name}"; end
|
21
30
|
|
22
|
-
def valid?
|
23
|
-
if !version
|
24
|
-
[ false, "The request doesn't contain a version." ]
|
25
|
-
elsif !name
|
26
|
-
[ false, "The request doesn't contain a name." ]
|
27
|
-
elsif !params.kind_of?(Hash)
|
28
|
-
[ false, "The request's params are not a valid BSON document." ]
|
29
|
-
else
|
30
|
-
[ true ]
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
31
|
def inspect
|
35
32
|
reference = '0x0%x' % (self.object_id << 1)
|
36
33
|
"#<#{self.class}:#{reference}"\
|
@@ -39,6 +36,30 @@ module Sanford::Protocol
|
|
39
36
|
" @params=#{params.inspect}>"
|
40
37
|
end
|
41
38
|
|
39
|
+
protected
|
40
|
+
|
41
|
+
def validate!(version, name, params)
|
42
|
+
problem = if !version
|
43
|
+
"The request doesn't contain a version."
|
44
|
+
elsif !name
|
45
|
+
"The request doesn't contain a name."
|
46
|
+
elsif !params.kind_of?(Hash)
|
47
|
+
"The request's params are not a valid BSON document."
|
48
|
+
end
|
49
|
+
raise(BadRequestError, problem) if problem
|
50
|
+
end
|
51
|
+
|
52
|
+
def stringify(object)
|
53
|
+
case(object)
|
54
|
+
when Hash
|
55
|
+
object.inject({}){|h, (k, v)| h.merge({ k.to_s => self.stringify(v) }) }
|
56
|
+
when Array
|
57
|
+
object.map{|item| self.stringify(item) }
|
58
|
+
else
|
59
|
+
object
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
42
63
|
end
|
43
64
|
|
44
65
|
end
|
data/sanford-protocol.gemspec
CHANGED
@@ -19,6 +19,6 @@ Gem::Specification.new do |gem|
|
|
19
19
|
|
20
20
|
gem.add_dependency("bson", ["~>1.7"])
|
21
21
|
|
22
|
-
gem.add_development_dependency("assert", ["~> 0
|
23
|
-
gem.add_development_dependency("assert-mocha", ["~> 0
|
22
|
+
gem.add_development_dependency("assert", ["~> 1.0"])
|
23
|
+
gem.add_development_dependency("assert-mocha", ["~> 1.0"])
|
24
24
|
end
|
@@ -12,7 +12,7 @@ class Sanford::Protocol::Connection
|
|
12
12
|
end
|
13
13
|
subject{ @connection }
|
14
14
|
|
15
|
-
should have_instance_methods :read, :write
|
15
|
+
should have_instance_methods :read, :write, :close
|
16
16
|
|
17
17
|
should "read messages off the socket with #read" do
|
18
18
|
assert_equal @data, subject.read
|
@@ -22,6 +22,11 @@ class Sanford::Protocol::Connection
|
|
22
22
|
subject.write(@data)
|
23
23
|
assert_equal @msg, @socket.out
|
24
24
|
end
|
25
|
+
|
26
|
+
should "close the socket with #close" do
|
27
|
+
subject.close
|
28
|
+
assert @socket.closed?
|
29
|
+
end
|
25
30
|
end
|
26
31
|
|
27
32
|
class TimeoutTests < BaseTests
|
data/test/unit/request_tests.rb
CHANGED
@@ -10,13 +10,22 @@ class Sanford::Protocol::Request
|
|
10
10
|
end
|
11
11
|
subject{ @request }
|
12
12
|
|
13
|
-
should have_instance_methods :version, :name, :params, :to_hash
|
13
|
+
should have_instance_methods :version, :name, :params, :to_hash
|
14
14
|
should have_class_methods :parse
|
15
15
|
|
16
16
|
should "return it's version and name with #to_s" do
|
17
17
|
assert_equal "[#{subject.version}] #{subject.name}", subject.to_s
|
18
18
|
end
|
19
19
|
|
20
|
+
should "stringify params keys" do
|
21
|
+
request = Sanford::Protocol::Request.new('v1', 'service', {
|
22
|
+
1 => 1,
|
23
|
+
:symbol => :symbol
|
24
|
+
})
|
25
|
+
expected = { "1" => 1, "symbol" => :symbol }
|
26
|
+
assert_equal expected, request.params
|
27
|
+
end
|
28
|
+
|
20
29
|
should "return an instance of a Sanford::Protocol::Request given a hash using #parse" do
|
21
30
|
# using BSON messages are hashes
|
22
31
|
hash = {
|
@@ -45,38 +54,29 @@ class Sanford::Protocol::Request
|
|
45
54
|
end
|
46
55
|
|
47
56
|
class ValidTests < BaseTests
|
48
|
-
desc "valid?"
|
49
|
-
|
50
|
-
should "return true and no message with a valid request" do
|
51
|
-
request = Sanford::Protocol::Request.new('v1', 'name', {})
|
52
|
-
is_valid, message = request.valid?
|
53
57
|
|
54
|
-
|
55
|
-
|
58
|
+
should "not raise an exception with valid request args" do
|
59
|
+
assert_nothing_raised do
|
60
|
+
Sanford::Protocol::Request.new('v1', 'name', {})
|
61
|
+
end
|
56
62
|
end
|
57
63
|
|
58
|
-
should "
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
assert_equal false, is_valid
|
63
|
-
assert_equal "The request doesn't contain a name.", message
|
64
|
+
should "raise an exception when there isn't a name arg" do
|
65
|
+
assert_raises(Sanford::Protocol::BadRequestError) do
|
66
|
+
Sanford::Protocol::Request.new('v1', nil, {})
|
67
|
+
end
|
64
68
|
end
|
65
69
|
|
66
70
|
should "return false and a message when there isn't a version" do
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
assert_equal false, is_valid
|
71
|
-
assert_equal "The request doesn't contain a version.", message
|
71
|
+
assert_raises(Sanford::Protocol::BadRequestError) do
|
72
|
+
Sanford::Protocol::Request.new(nil, 'name', {})
|
73
|
+
end
|
72
74
|
end
|
73
75
|
|
74
76
|
should "return false and a message when the params are not a Hash" do
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
assert_equal false, is_valid
|
79
|
-
assert_equal "The request's params are not a valid BSON document.", message
|
77
|
+
assert_raises(Sanford::Protocol::BadRequestError) do
|
78
|
+
Sanford::Protocol::Request.new('v1', 'name', true)
|
79
|
+
end
|
80
80
|
end
|
81
81
|
end
|
82
82
|
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sanford-protocol
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 11
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 5
|
9
|
+
- 0
|
10
|
+
version: 0.5.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Collin Redding
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2012-11-
|
19
|
+
date: 2012-11-30 00:00:00 Z
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
22
22
|
prerelease: false
|
@@ -40,11 +40,11 @@ dependencies:
|
|
40
40
|
requirements:
|
41
41
|
- - ~>
|
42
42
|
- !ruby/object:Gem::Version
|
43
|
-
hash:
|
43
|
+
hash: 15
|
44
44
|
segments:
|
45
|
+
- 1
|
45
46
|
- 0
|
46
|
-
|
47
|
-
version: "0.8"
|
47
|
+
version: "1.0"
|
48
48
|
requirement: *id002
|
49
49
|
name: assert
|
50
50
|
type: :development
|
@@ -55,11 +55,11 @@ dependencies:
|
|
55
55
|
requirements:
|
56
56
|
- - ~>
|
57
57
|
- !ruby/object:Gem::Version
|
58
|
-
hash:
|
58
|
+
hash: 15
|
59
59
|
segments:
|
60
|
-
- 0
|
61
60
|
- 1
|
62
|
-
|
61
|
+
- 0
|
62
|
+
version: "1.0"
|
63
63
|
requirement: *id003
|
64
64
|
name: assert-mocha
|
65
65
|
type: :development
|