rufus-jig 0.1.23 → 1.0.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/.rspec +1 -0
- data/CHANGELOG.txt +8 -0
- data/README.rdoc +41 -11
- data/Rakefile +37 -12
- data/TODO.txt +6 -3
- data/lib/rufus/jig/adapters/em.rb +21 -24
- data/lib/rufus/jig/adapters/net.rb +3 -4
- data/lib/rufus/jig/adapters/net_persistent.rb +26 -7
- data/lib/rufus/jig/adapters/patron.rb +25 -10
- data/lib/rufus/jig/couch.rb +199 -36
- data/lib/rufus/jig/http.rb +183 -90
- data/lib/rufus/jig/path.rb +4 -4
- data/lib/rufus/jig/version.rb +1 -1
- data/rufus-jig.gemspec +55 -34
- data/spec/couch/attachements_spec.rb +113 -0
- data/spec/couch/basic_auth_spec.rb +75 -0
- data/spec/couch/conditional_spec.rb +178 -0
- data/spec/couch/continuous.rb +97 -0
- data/spec/couch/couch_spec.rb +64 -0
- data/spec/couch/db_spec.rb +366 -0
- data/{test → spec/couch}/tweet.png +0 -0
- data/spec/couch/views_spec.rb +326 -0
- data/spec/couch_url.txt +2 -0
- data/spec/jig/basic_auth_spec.rb +51 -0
- data/spec/jig/conditional_spec.rb +76 -0
- data/spec/jig/delete_spec.rb +32 -0
- data/spec/jig/get_spec.rb +116 -0
- data/spec/jig/misc_spec.rb +120 -0
- data/spec/jig/new_spec.rb +95 -0
- data/spec/jig/parse_uri_spec.rb +139 -0
- data/spec/jig/post_spec.rb +79 -0
- data/spec/jig/prefix_spec.rb +51 -0
- data/spec/jig/put_spec.rb +68 -0
- data/spec/jig/timeout_spec.rb +94 -0
- data/{test → spec}/server.rb +14 -4
- data/spec/spec_helper.rb +61 -0
- data/spec/support/couch_helper.rb +14 -0
- data/spec/support/server_helper.rb +32 -0
- metadata +98 -43
- data/lib/rufus/jig/adapters/net_response.rb +0 -42
- data/test/base.rb +0 -53
- data/test/bm/bm0.rb +0 -49
- data/test/bm/bm1.rb +0 -43
- data/test/conc/put_vs_delete.rb +0 -28
- data/test/couch_base.rb +0 -52
- data/test/couch_url.txt +0 -1
- data/test/ct_0_couch.rb +0 -64
- data/test/ct_1_couchdb.rb +0 -204
- data/test/ct_2_couchdb_options.rb +0 -50
- data/test/ct_3_couchdb_views.rb +0 -106
- data/test/ct_4_attachments.rb +0 -126
- data/test/ct_5_couchdb_continuous.rb +0 -92
- data/test/cut_0_auth_couch.rb +0 -62
- data/test/test.rb +0 -28
- data/test/to.sh +0 -25
- data/test/tt_0_get_timeout.rb +0 -92
- data/test/ut_0_http_get.rb +0 -191
- data/test/ut_1_http_post.rb +0 -81
- data/test/ut_2_http_delete.rb +0 -42
- data/test/ut_3_http_put.rb +0 -105
- data/test/ut_4_http_prefix.rb +0 -50
- data/test/ut_5_http_misc.rb +0 -65
- data/test/ut_6_args.rb +0 -98
- data/test/ut_7_parse_uri.rb +0 -79
- data/test/ut_8_auth.rb +0 -37
@@ -0,0 +1,79 @@
|
|
1
|
+
|
2
|
+
#
|
3
|
+
# specifiying rufus-jig
|
4
|
+
#
|
5
|
+
# Tue Nov 30 21:09:24 JST 2010
|
6
|
+
#
|
7
|
+
|
8
|
+
require File.join(File.dirname(__FILE__), '..', 'spec_helper.rb')
|
9
|
+
|
10
|
+
|
11
|
+
describe Rufus::Jig::Http do
|
12
|
+
|
13
|
+
before(:each) do
|
14
|
+
purge_server
|
15
|
+
@h = Rufus::Jig::Http.new('127.0.0.1', 4567)
|
16
|
+
end
|
17
|
+
after(:each) do
|
18
|
+
@h.close
|
19
|
+
end
|
20
|
+
|
21
|
+
def location
|
22
|
+
l = @h.last_response.headers['Location']
|
23
|
+
l.match(/^http:\/\//) ? l = '/' + l.split('/')[3..-1].join('/') : l
|
24
|
+
end
|
25
|
+
|
26
|
+
describe '#post' do
|
27
|
+
|
28
|
+
it 'returns the body of the server response' do
|
29
|
+
|
30
|
+
@h.post('/documents', 'nada').should == 'created.'
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'encodes hashes as JSON by default' do
|
34
|
+
|
35
|
+
@h.post('/documents', { 'hello' => 'world' })
|
36
|
+
|
37
|
+
@h.get(location, :accept => :json).should == { 'hello' => 'world' }
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'encodes arrays as JSON by default' do
|
41
|
+
|
42
|
+
@h.post('/documents', %w[ a b c ])
|
43
|
+
|
44
|
+
@h.get(location, :accept => :json).should == %w[ a b c ]
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'passes strings as text/plain by default' do
|
48
|
+
|
49
|
+
@h.post('/documents', 'nada')
|
50
|
+
|
51
|
+
@h.get(location, :accept => :json).should == 'nada'
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'decodes the body of the server response' do
|
55
|
+
|
56
|
+
b = @h.post(
|
57
|
+
'/documents?mirror=true',
|
58
|
+
'{"msg":"hello world"}',
|
59
|
+
:content_type => :json)
|
60
|
+
|
61
|
+
b.should == { 'msg' => 'hello world' }
|
62
|
+
end
|
63
|
+
|
64
|
+
it "by default, doesn't cache" do
|
65
|
+
|
66
|
+
@h.post('/documents?etag=true', 'nada')
|
67
|
+
|
68
|
+
@h.cache.size.should == 0
|
69
|
+
end
|
70
|
+
|
71
|
+
it 'caches when :cache => true' do
|
72
|
+
|
73
|
+
@h.post('/documents?etag=true', 'nada', :cache => true)
|
74
|
+
|
75
|
+
@h.cache.size.should == 1
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
@@ -0,0 +1,51 @@
|
|
1
|
+
|
2
|
+
#
|
3
|
+
# specifiying rufus-jig
|
4
|
+
#
|
5
|
+
# Wed Dec 1 09:36:50 JST 2010
|
6
|
+
#
|
7
|
+
|
8
|
+
require File.join(File.dirname(__FILE__), '..', 'spec_helper.rb')
|
9
|
+
|
10
|
+
|
11
|
+
describe Rufus::Jig::Http do
|
12
|
+
|
13
|
+
before(:each) do
|
14
|
+
purge_server
|
15
|
+
@h = Rufus::Jig::Http.new('127.0.0.1', 4567, :prefix => '/a/b/')
|
16
|
+
end
|
17
|
+
after(:each) do
|
18
|
+
@h.close
|
19
|
+
end
|
20
|
+
|
21
|
+
context "with :prefix => '/a/b'" do
|
22
|
+
|
23
|
+
it 'gets' do
|
24
|
+
|
25
|
+
@h.get('c').should == 'C'
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'caches the full path' do
|
29
|
+
|
30
|
+
@h.get('c')
|
31
|
+
|
32
|
+
@h.cache.should == { '/a/b/c' => [ '"123456123456"', 'C' ] }
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'posts' do
|
36
|
+
|
37
|
+
@h.post('c', 'X').should == 'post'
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'puts' do
|
41
|
+
|
42
|
+
@h.put('c', 'X').should == 'put'
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'deletes' do
|
46
|
+
|
47
|
+
@h.delete('c').should == 'delete'
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
@@ -0,0 +1,68 @@
|
|
1
|
+
|
2
|
+
#
|
3
|
+
# specifiying rufus-jig
|
4
|
+
#
|
5
|
+
# Wed Dec 1 09:12:40 JST 2010
|
6
|
+
#
|
7
|
+
|
8
|
+
require File.join(File.dirname(__FILE__), '..', 'spec_helper.rb')
|
9
|
+
|
10
|
+
|
11
|
+
describe Rufus::Jig::Http do
|
12
|
+
|
13
|
+
before(:each) do
|
14
|
+
purge_server
|
15
|
+
@h = Rufus::Jig::Http.new('127.0.0.1', 4567)
|
16
|
+
end
|
17
|
+
after(:each) do
|
18
|
+
@h.close
|
19
|
+
end
|
20
|
+
|
21
|
+
describe '#put' do
|
22
|
+
|
23
|
+
it "puts" do
|
24
|
+
|
25
|
+
@h.put(
|
26
|
+
'/documents/1234',
|
27
|
+
'{"msg":"hello"}',
|
28
|
+
:content_type => 'application/json')
|
29
|
+
|
30
|
+
@h.get('/documents/1234').should == { 'msg' => 'hello' }
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'puts and decodes the JSON reply' do
|
34
|
+
|
35
|
+
b = @h.put(
|
36
|
+
'/documents/yyyy?mirror=true',
|
37
|
+
'{"msg":"hello world"}',
|
38
|
+
:content_type => :json)
|
39
|
+
|
40
|
+
b.should == { 'msg' => 'hello world' }
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'returns true in case of conflict' do
|
44
|
+
|
45
|
+
@h.put('/conflict', '').should == true
|
46
|
+
end
|
47
|
+
|
48
|
+
it "by default, doesn't cache" do
|
49
|
+
|
50
|
+
@h.put(
|
51
|
+
'/documents/1234',
|
52
|
+
'{"msg":"hello"}',
|
53
|
+
:content_type => 'application/json')
|
54
|
+
|
55
|
+
@h.cache.size.should == 0
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'caches when :cache => true' do
|
59
|
+
|
60
|
+
@h.put(
|
61
|
+
'/documents/yyyy?etag=true',
|
62
|
+
'{"msg":"hello world"}', :cache => true)
|
63
|
+
|
64
|
+
@h.cache.size.should == 1
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
@@ -0,0 +1,94 @@
|
|
1
|
+
|
2
|
+
#
|
3
|
+
# specifiying rufus-jig
|
4
|
+
#
|
5
|
+
# Wed Dec 1 16:13:45 JST 2010
|
6
|
+
#
|
7
|
+
|
8
|
+
require File.join(File.dirname(__FILE__), '..', 'spec_helper.rb')
|
9
|
+
|
10
|
+
|
11
|
+
describe Rufus::Jig::Http do
|
12
|
+
|
13
|
+
after(:each) do
|
14
|
+
@h.close
|
15
|
+
end
|
16
|
+
|
17
|
+
context 'with a timeout of 1 second' do
|
18
|
+
|
19
|
+
before(:each) do
|
20
|
+
@h = Rufus::Jig::Http.new('127.0.0.1', 4567, :timeout => 1)
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'times out' do
|
24
|
+
|
25
|
+
lambda { @h.get('/later') }.should raise_error(Rufus::Jig::TimeoutError)
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'times out after 1 second' do
|
29
|
+
|
30
|
+
t = Time.now
|
31
|
+
|
32
|
+
@h.get('/later') rescue nil
|
33
|
+
|
34
|
+
(Time.now - t).should be < (@h.variant == :em ? 4.0 : 3.0)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
context 'with a timeout of -1' do
|
39
|
+
|
40
|
+
before(:each) do
|
41
|
+
@h = Rufus::Jig::Http.new('127.0.0.1', 4567, :timeout => -1)
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'does not time out' do
|
45
|
+
|
46
|
+
@h.get('/later').should == 'later'
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
context 'with the default timeout' do
|
51
|
+
|
52
|
+
before(:each) do
|
53
|
+
@h = Rufus::Jig::Http.new('127.0.0.1', 4567)
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'times out' do
|
57
|
+
|
58
|
+
lambda { @h.get('/later') }.should raise_error(Rufus::Jig::TimeoutError)
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'times out after 5s' do
|
62
|
+
|
63
|
+
t = Time.now
|
64
|
+
|
65
|
+
@h.get('/later') rescue nil
|
66
|
+
|
67
|
+
(Time.now - t).should be < (@h.variant == :em ? 7.0 : 6.0)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
context 'with a request defined timeout' do
|
72
|
+
|
73
|
+
before(:each) do
|
74
|
+
@h = Rufus::Jig::Http.new('127.0.0.1', 4567, :timeout => 15)
|
75
|
+
end
|
76
|
+
|
77
|
+
it 'times out' do
|
78
|
+
|
79
|
+
lambda {
|
80
|
+
@h.get('/later', :timeout => 1)
|
81
|
+
}.should raise_error(Rufus::Jig::TimeoutError)
|
82
|
+
end
|
83
|
+
|
84
|
+
it 'times out after 1 second' do
|
85
|
+
|
86
|
+
t = Time.now
|
87
|
+
|
88
|
+
@h.get('/later', :timeout => 1) rescue nil
|
89
|
+
|
90
|
+
(Time.now - t).should be < (@h.variant == :em ? 4.0 : 3.0)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
data/{test → spec}/server.rb
RENAMED
@@ -1,5 +1,10 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
+
log = File.open('server.log', 'wb')
|
4
|
+
STDOUT.reopen(log)
|
5
|
+
STDERR.reopen(log)
|
6
|
+
|
7
|
+
|
3
8
|
# a test sinata server
|
4
9
|
|
5
10
|
require 'rubygems'
|
@@ -7,6 +12,11 @@ require 'sinatra'
|
|
7
12
|
require 'json'
|
8
13
|
|
9
14
|
|
15
|
+
# change the port here if needed
|
16
|
+
|
17
|
+
set :port, 4567
|
18
|
+
|
19
|
+
|
10
20
|
#
|
11
21
|
# BASIC
|
12
22
|
#
|
@@ -106,7 +116,7 @@ post '/documents' do
|
|
106
116
|
|
107
117
|
if params[:mirror] || params[:etag]
|
108
118
|
response['Etag'] = "\"#{did}\"" if params[:etag]
|
109
|
-
content_type request.content_type
|
119
|
+
content_type request.content_type || 'text/plain'
|
110
120
|
doc
|
111
121
|
else
|
112
122
|
'created.'
|
@@ -125,7 +135,7 @@ put '/documents/:id' do
|
|
125
135
|
|
126
136
|
if params[:mirror] || params[:etag]
|
127
137
|
response['Etag'] = "\"#{params[:id]}\"" if params[:etag]
|
128
|
-
content_type request.content_type
|
138
|
+
content_type request.content_type || 'text/plain'
|
129
139
|
doc
|
130
140
|
else
|
131
141
|
'created.'
|
@@ -143,7 +153,7 @@ get '/documents/:id' do
|
|
143
153
|
|
144
154
|
if doc = DOCS[params[:id]]
|
145
155
|
|
146
|
-
content_type
|
156
|
+
content_type(doc.first || 'text/plain')
|
147
157
|
|
148
158
|
doc.last
|
149
159
|
else
|
@@ -212,7 +222,7 @@ end
|
|
212
222
|
|
213
223
|
get '/later' do
|
214
224
|
|
215
|
-
sleep
|
225
|
+
sleep(7)
|
216
226
|
'later'
|
217
227
|
end
|
218
228
|
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
|
2
|
+
# Our default
|
3
|
+
lib = ENV['JIG_LIB'] || 'net/http'
|
4
|
+
|
5
|
+
lib = case lib
|
6
|
+
when 'net' then 'net/http'
|
7
|
+
when 'em' then 'em-http'
|
8
|
+
when 'netp' then 'net/http/persistent'
|
9
|
+
when 'patron' then 'patron'
|
10
|
+
else lib
|
11
|
+
end
|
12
|
+
|
13
|
+
require('openssl') if lib == 'em-http'
|
14
|
+
require(lib)
|
15
|
+
|
16
|
+
unless $advertised
|
17
|
+
|
18
|
+
if lib == 'em-http'
|
19
|
+
Thread.new { EM.run {} }
|
20
|
+
Thread.pass until EM.reactor_running?
|
21
|
+
end
|
22
|
+
|
23
|
+
puts
|
24
|
+
puts "JIG_LIB lib is '#{lib}' (net/netp/patron/em)"
|
25
|
+
$advertised = true
|
26
|
+
end
|
27
|
+
|
28
|
+
$:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
29
|
+
|
30
|
+
require 'yajl'
|
31
|
+
require 'rufus/jig'
|
32
|
+
|
33
|
+
|
34
|
+
# Requires supporting ruby files with custom matchers and macros, etc,
|
35
|
+
# in spec/support/ and its subdirectories.
|
36
|
+
#
|
37
|
+
Dir[File.join(File.dirname(__FILE__), 'support/**/*.rb')].each { |pa|
|
38
|
+
require(pa)
|
39
|
+
}
|
40
|
+
|
41
|
+
|
42
|
+
RSpec.configure do |config|
|
43
|
+
|
44
|
+
# == Mock Framework
|
45
|
+
#
|
46
|
+
# If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
|
47
|
+
#
|
48
|
+
# config.mock_with :mocha
|
49
|
+
# config.mock_with :flexmock
|
50
|
+
# config.mock_with :rr
|
51
|
+
config.mock_with :rspec
|
52
|
+
|
53
|
+
config.include ServerHelper
|
54
|
+
config.include CouchHelper
|
55
|
+
end
|
56
|
+
|
57
|
+
unless $server
|
58
|
+
ServerHelper.fork_server
|
59
|
+
Kernel.at_exit { ServerHelper.kill_server }
|
60
|
+
end
|
61
|
+
|
@@ -0,0 +1,32 @@
|
|
1
|
+
|
2
|
+
module ServerHelper
|
3
|
+
|
4
|
+
def purge_server
|
5
|
+
|
6
|
+
Rufus::Jig::Http.new('127.0.0.1', 4567).delete('/documents') rescue nil
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.fork_server
|
10
|
+
|
11
|
+
server = File.expand_path(
|
12
|
+
File.join(File.dirname(__FILE__), '..', 'server.rb'))
|
13
|
+
|
14
|
+
$server = Process.fork do
|
15
|
+
exec 'ruby', server
|
16
|
+
end
|
17
|
+
|
18
|
+
sleep 1.0
|
19
|
+
|
20
|
+
$server
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.kill_server
|
24
|
+
|
25
|
+
Process.kill('SIGINT', $server) #rescue nil
|
26
|
+
Process.wait($server)
|
27
|
+
$server = nil
|
28
|
+
|
29
|
+
nil
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|