roozer_client 0.1 → 0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +1 -0
- data/Manifest +1 -1
- data/README +6 -2
- data/lib/roozer_client.rb +7 -18
- data/roozer_client.gemspec +3 -3
- data/test/test_all.rb +51 -10
- data/test/test_helper.rb +19 -16
- metadata +3 -3
data/CHANGELOG
CHANGED
data/Manifest
CHANGED
data/README
CHANGED
@@ -1,7 +1,12 @@
|
|
1
1
|
|
2
2
|
require 'roozer_client'
|
3
3
|
|
4
|
-
|
4
|
+
# Connect to a roozer server. Multiple servers can be listed seperated by
|
5
|
+
# semicolons. Client uses round robin until it finds a server that responds
|
6
|
+
# to its requests.
|
7
|
+
|
8
|
+
rc = RoozerClient.new(url: 'http://orch1:2987;http://orch2:2987', path: 'rootpath')
|
9
|
+
|
5
10
|
rc['subpath'] = { data: "abc" }
|
6
11
|
|
7
12
|
rc.list
|
@@ -11,4 +16,3 @@ rc['subpath']
|
|
11
16
|
=> { "data" => "abc" }
|
12
17
|
|
13
18
|
rc.request(:delete, 'subpath/data')
|
14
|
-
|
data/lib/roozer_client.rb
CHANGED
@@ -6,26 +6,25 @@ class RoozerClient
|
|
6
6
|
def initialize(options={})
|
7
7
|
opts = options.dup
|
8
8
|
@urls = (opts.delete(:url) || ENV['ROOZER_URL'] || 'http://127.0.0.1:2987/').split(/;/).map(&:strip)
|
9
|
-
@path =
|
9
|
+
@path = opts.delete(:path)
|
10
10
|
@timeout = opts.delete(:timeout) || 10
|
11
11
|
@opts = {timeout: @timeout, open_timeout: @timeout}.merge(opts)
|
12
12
|
end
|
13
|
-
|
14
13
|
|
15
14
|
def get(path)
|
16
15
|
begin
|
17
16
|
res = request(:get, path)
|
18
|
-
res['
|
17
|
+
res['value'] if res['type'] == 'file'
|
19
18
|
rescue RestClient::Exception => e
|
20
19
|
raise unless e.http_code == 404
|
21
20
|
end
|
22
21
|
end
|
23
22
|
alias :[] :get
|
24
23
|
|
25
|
-
def list(path=
|
24
|
+
def list(path=nil)
|
26
25
|
begin
|
27
26
|
res = request(:get, path)
|
28
|
-
res['
|
27
|
+
res['value'] if res['type'] == 'dir'
|
29
28
|
rescue RestClient::Exception => e
|
30
29
|
raise unless e.http_code == 404
|
31
30
|
end
|
@@ -37,13 +36,14 @@ class RoozerClient
|
|
37
36
|
alias :[]= :put
|
38
37
|
|
39
38
|
def request(method, path, data=nil)
|
40
|
-
|
41
39
|
begin
|
42
40
|
url = @urls.first
|
43
41
|
resource = RestClient::Resource.new(url, @opts)
|
44
|
-
|
42
|
+
fullpath = [@path,path].compact.map(&:to_s).join('/')
|
43
|
+
response = resource["/#{fullpath}"].send(method, *[({value: data}.to_json if data), {content_type: :json, accept: :json}].compact)
|
45
44
|
JSON.parse(response) rescue {}
|
46
45
|
rescue Errno::ECONNREFUSED, RestClient::RequestTimeout
|
46
|
+
puts "#{$!.class}, retrying..."
|
47
47
|
@urls.rotate!
|
48
48
|
sleep 5
|
49
49
|
retry
|
@@ -52,14 +52,3 @@ class RoozerClient
|
|
52
52
|
|
53
53
|
end
|
54
54
|
|
55
|
-
|
56
|
-
=begin
|
57
|
-
|
58
|
-
rc = RoozerClient.new(url: 'http://orch1:2988;http://orch1:2987', path: 'bigcloud')
|
59
|
-
rc.list
|
60
|
-
rc['x'] = { a: 'b' }
|
61
|
-
rc['x']
|
62
|
-
rc.request(:delete, 'x')
|
63
|
-
|
64
|
-
|
65
|
-
=end
|
data/roozer_client.gemspec
CHANGED
@@ -2,15 +2,15 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = "roozer_client"
|
5
|
-
s.version = "0.
|
5
|
+
s.version = "0.2"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Andrew Snow"]
|
9
|
-
s.date = "
|
9
|
+
s.date = "2013-01-03"
|
10
10
|
s.description = "Ruby client for Roozer server"
|
11
11
|
s.email = "andrew@modulus.org"
|
12
12
|
s.extra_rdoc_files = ["CHANGELOG", "README", "lib/roozer_client.rb"]
|
13
|
-
s.files = ["CHANGELOG", "README", "Rakefile", "lib/roozer_client.rb", "test/test_all.rb", "test/test_helper.rb", "
|
13
|
+
s.files = ["CHANGELOG", "Manifest", "README", "Rakefile", "lib/roozer_client.rb", "test/test_all.rb", "test/test_helper.rb", "roozer_client.gemspec"]
|
14
14
|
s.homepage = "https://github.com/andys/roozer-client"
|
15
15
|
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Roozer_client", "--main", "README"]
|
16
16
|
s.require_paths = ["lib"]
|
data/test/test_all.rb
CHANGED
@@ -1,19 +1,60 @@
|
|
1
|
-
require "#{File.dirname(__FILE__)}/../lib/
|
1
|
+
require "#{File.dirname(__FILE__)}/../lib/roozer_client"
|
2
2
|
require 'test/unit'
|
3
3
|
require "#{File.dirname(__FILE__)}/test_helper"
|
4
4
|
|
5
5
|
class TestRoozerClient < Test::Unit::TestCase
|
6
6
|
|
7
7
|
def setup
|
8
|
-
setup_webserver
|
8
|
+
@url = setup_webserver
|
9
|
+
@client = RoozerClient.new(url: @url, path: 'test')
|
9
10
|
end
|
10
11
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
12
|
+
def test_list
|
13
|
+
result = nil
|
14
|
+
response = accept_request(200, {name:"/test",type:"dir",value:["sub1","sub2"]}.to_json) do
|
15
|
+
result = @client.list
|
16
|
+
end
|
17
|
+
assert response
|
18
|
+
assert_equal 'GET', response.request_method
|
19
|
+
assert_equal '/test', response.path
|
20
|
+
assert_equal ["sub1","sub2"], result
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_get
|
24
|
+
result = nil
|
25
|
+
datahash = {'a' => 'b'}
|
26
|
+
response = accept_request(200, {name:"/test/sub1",type:"file",value:datahash}.to_json) do
|
27
|
+
result = @client.get('sub1')
|
28
|
+
end
|
29
|
+
assert response
|
30
|
+
assert_equal 'GET', response.request_method
|
31
|
+
assert_equal '/test/sub1', response.path
|
32
|
+
assert_equal datahash, result
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_put
|
36
|
+
response = accept_request(204, '') do
|
37
|
+
@client.put('sub2', x1: 'x2')
|
38
|
+
end
|
39
|
+
assert response
|
40
|
+
assert_equal 'PUT', response.request_method
|
41
|
+
assert_equal '/test/sub2', response.path
|
42
|
+
assert_equal '{"value":{"x1":"x2"}}', response.body
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_get_404
|
46
|
+
result = nil
|
47
|
+
response = accept_request(404, {error: 'not found'}.to_json) do
|
48
|
+
result = @client.get('xxx')
|
49
|
+
end
|
50
|
+
assert response
|
51
|
+
assert_equal '/test/xxx', response.path
|
52
|
+
assert_nil result
|
53
|
+
end
|
54
|
+
|
55
|
+
# def test_failover
|
56
|
+
# @client = RoozerClient.new(url: "http://127.0.0.1:7997;#{@url}", path: 'test')
|
57
|
+
# test_list
|
58
|
+
# end
|
59
|
+
|
19
60
|
end
|
data/test/test_helper.rb
CHANGED
@@ -1,37 +1,40 @@
|
|
1
1
|
require 'webrick'
|
2
2
|
|
3
|
-
class NewRequestException < Exception
|
4
|
-
end
|
5
|
-
|
6
3
|
class TestServlet < WEBrick::HTTPServlet::AbstractServlet
|
7
4
|
class << self
|
8
|
-
attr_accessor :request, :response
|
5
|
+
attr_accessor :request, :response #, :wakeupthread
|
9
6
|
end
|
10
7
|
def service(request, response)
|
8
|
+
# Save the request
|
9
|
+
body = request.body # this is needed to read the chunks from the other side before duping
|
11
10
|
self.class.request = request.dup
|
11
|
+
|
12
|
+
# return the canned response
|
12
13
|
response.status = self.class.response.first
|
13
14
|
response.body = self.class.response.last
|
14
|
-
TestServlet.wakeupthread.raise NewRequestException.new
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
18
|
def accept_request(*response)
|
19
19
|
TestServlet.request = nil
|
20
20
|
TestServlet.response = response
|
21
|
-
|
22
|
-
TestServlet.wakeupthread = Thread.current
|
23
|
-
yield
|
24
|
-
$webserver_timeout.times { sleep 1 }
|
25
|
-
rescue NewRequestException
|
26
|
-
end
|
21
|
+
yield
|
27
22
|
TestServlet.request
|
28
23
|
end
|
29
24
|
|
30
|
-
def setup_webserver(timeout=
|
25
|
+
def setup_webserver(timeout=5)
|
26
|
+
port = 7999
|
31
27
|
$webserver_timeout = timeout
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
28
|
+
Thread.abort_on_exception = true
|
29
|
+
|
30
|
+
if !$webserver
|
31
|
+
newflag = true
|
32
|
+
$webserver = WEBrick::HTTPServer.new :BindAddress => '127.0.0.1', :Port => port, :DocumentRoot => File.dirname(__FILE__), :Logger => WEBrick::Log.new("/dev/null"), :AccessLog => [nil, nil]
|
33
|
+
$webserver.mount '/', TestServlet
|
34
|
+
$webserverthread ||= Thread.new do
|
35
|
+
$webserver.start
|
36
|
+
end
|
36
37
|
end
|
38
|
+
sleep 3 if newflag
|
39
|
+
"http://127.0.0.1:#{port}/"
|
37
40
|
end
|
metadata
CHANGED
@@ -2,14 +2,14 @@
|
|
2
2
|
name: roozer_client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: '0.
|
5
|
+
version: '0.2'
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Andrew Snow
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-01-03 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
@@ -53,12 +53,12 @@ extra_rdoc_files:
|
|
53
53
|
- lib/roozer_client.rb
|
54
54
|
files:
|
55
55
|
- CHANGELOG
|
56
|
+
- Manifest
|
56
57
|
- README
|
57
58
|
- Rakefile
|
58
59
|
- lib/roozer_client.rb
|
59
60
|
- test/test_all.rb
|
60
61
|
- test/test_helper.rb
|
61
|
-
- Manifest
|
62
62
|
- roozer_client.gemspec
|
63
63
|
homepage: https://github.com/andys/roozer-client
|
64
64
|
licenses: []
|