rufus-jig 0.1.23 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (65) hide show
  1. data/.rspec +1 -0
  2. data/CHANGELOG.txt +8 -0
  3. data/README.rdoc +41 -11
  4. data/Rakefile +37 -12
  5. data/TODO.txt +6 -3
  6. data/lib/rufus/jig/adapters/em.rb +21 -24
  7. data/lib/rufus/jig/adapters/net.rb +3 -4
  8. data/lib/rufus/jig/adapters/net_persistent.rb +26 -7
  9. data/lib/rufus/jig/adapters/patron.rb +25 -10
  10. data/lib/rufus/jig/couch.rb +199 -36
  11. data/lib/rufus/jig/http.rb +183 -90
  12. data/lib/rufus/jig/path.rb +4 -4
  13. data/lib/rufus/jig/version.rb +1 -1
  14. data/rufus-jig.gemspec +55 -34
  15. data/spec/couch/attachements_spec.rb +113 -0
  16. data/spec/couch/basic_auth_spec.rb +75 -0
  17. data/spec/couch/conditional_spec.rb +178 -0
  18. data/spec/couch/continuous.rb +97 -0
  19. data/spec/couch/couch_spec.rb +64 -0
  20. data/spec/couch/db_spec.rb +366 -0
  21. data/{test → spec/couch}/tweet.png +0 -0
  22. data/spec/couch/views_spec.rb +326 -0
  23. data/spec/couch_url.txt +2 -0
  24. data/spec/jig/basic_auth_spec.rb +51 -0
  25. data/spec/jig/conditional_spec.rb +76 -0
  26. data/spec/jig/delete_spec.rb +32 -0
  27. data/spec/jig/get_spec.rb +116 -0
  28. data/spec/jig/misc_spec.rb +120 -0
  29. data/spec/jig/new_spec.rb +95 -0
  30. data/spec/jig/parse_uri_spec.rb +139 -0
  31. data/spec/jig/post_spec.rb +79 -0
  32. data/spec/jig/prefix_spec.rb +51 -0
  33. data/spec/jig/put_spec.rb +68 -0
  34. data/spec/jig/timeout_spec.rb +94 -0
  35. data/{test → spec}/server.rb +14 -4
  36. data/spec/spec_helper.rb +61 -0
  37. data/spec/support/couch_helper.rb +14 -0
  38. data/spec/support/server_helper.rb +32 -0
  39. metadata +98 -43
  40. data/lib/rufus/jig/adapters/net_response.rb +0 -42
  41. data/test/base.rb +0 -53
  42. data/test/bm/bm0.rb +0 -49
  43. data/test/bm/bm1.rb +0 -43
  44. data/test/conc/put_vs_delete.rb +0 -28
  45. data/test/couch_base.rb +0 -52
  46. data/test/couch_url.txt +0 -1
  47. data/test/ct_0_couch.rb +0 -64
  48. data/test/ct_1_couchdb.rb +0 -204
  49. data/test/ct_2_couchdb_options.rb +0 -50
  50. data/test/ct_3_couchdb_views.rb +0 -106
  51. data/test/ct_4_attachments.rb +0 -126
  52. data/test/ct_5_couchdb_continuous.rb +0 -92
  53. data/test/cut_0_auth_couch.rb +0 -62
  54. data/test/test.rb +0 -28
  55. data/test/to.sh +0 -25
  56. data/test/tt_0_get_timeout.rb +0 -92
  57. data/test/ut_0_http_get.rb +0 -191
  58. data/test/ut_1_http_post.rb +0 -81
  59. data/test/ut_2_http_delete.rb +0 -42
  60. data/test/ut_3_http_put.rb +0 -105
  61. data/test/ut_4_http_prefix.rb +0 -50
  62. data/test/ut_5_http_misc.rb +0 -65
  63. data/test/ut_6_args.rb +0 -98
  64. data/test/ut_7_parse_uri.rb +0 -79
  65. data/test/ut_8_auth.rb +0 -37
File without changes
@@ -0,0 +1,326 @@
1
+
2
+ #
3
+ # specifying rufus-jig
4
+ #
5
+ # Tue Nov 30 08:40:05 JST 2010
6
+ #
7
+
8
+ require File.join(File.dirname(__FILE__), '..', 'spec_helper.rb')
9
+
10
+
11
+ describe Rufus::Jig::Couch do
12
+
13
+ context 'with views' do
14
+
15
+ before(:each) do
16
+
17
+ h = Rufus::Jig::Http.new(couch_url)
18
+
19
+ begin
20
+ h.delete('/rufus_jig_test')
21
+ rescue Exception => e
22
+ #p e
23
+ end
24
+
25
+ h.put('/rufus_jig_test', '')
26
+
27
+ h.put('/rufus_jig_test/c0', '{"_id":"c0","type":"espresso"}')
28
+ h.put('/rufus_jig_test/c1', '{"_id":"c1","type":"ristretto"}')
29
+ h.put('/rufus_jig_test/c2', '{"_id":"c2","type":"macchiato"}')
30
+ h.put('/rufus_jig_test/c3', '{"_id":"c3","type":"capuccino"}')
31
+ h.put('/rufus_jig_test/c4', '{"_id":"c4","type":"macchiato"}')
32
+ h.put('/rufus_jig_test/c5', '{"_id":"c5","type":"veloce espresso"}')
33
+
34
+ h.put(
35
+ '/rufus_jig_test/_design/my_test',
36
+ {
37
+ '_id' => '_design/my_test',
38
+ 'views' => {
39
+ 'my_view' => {
40
+ 'map' => "function(doc) { emit(doc['type'], null); }"
41
+ },
42
+ 'my_reduced_view' => {
43
+ 'map' => "function(doc) { emit(doc['type'], 1); }",
44
+ 'reduce' => "_count"
45
+ },
46
+ 'my_double_view' => {
47
+ 'map' => "function(doc) { emit(doc['type'], null); emit(doc['type'], null); }"
48
+ }
49
+ }
50
+ },
51
+ :content_type => :json)
52
+
53
+ h.close
54
+
55
+ @c = Rufus::Jig::Couch.new(couch_url, 'rufus_jig_test')
56
+ end
57
+
58
+ after(:each) do
59
+
60
+ @c.close
61
+ end
62
+
63
+ describe '#get from view' do
64
+
65
+ it 'returns the result set' do
66
+
67
+ @c.get('_design/my_test/_view/my_view').should == {
68
+ "total_rows"=>6,
69
+ "offset"=>0,
70
+ "rows"=> [
71
+ {"id"=>"c3", "key"=>"capuccino", "value"=>nil},
72
+ {"id"=>"c0", "key"=>"espresso", "value"=>nil},
73
+ {"id"=>"c2", "key"=>"macchiato", "value"=>nil},
74
+ {"id"=>"c4", "key"=>"macchiato", "value"=>nil},
75
+ {"id"=>"c1", "key"=>"ristretto", "value"=>nil},
76
+ {"id"=>"c5", "key"=>"veloce espresso", "value"=>nil}
77
+ ]
78
+ }
79
+ end
80
+ end
81
+
82
+ describe '#post keys to view' do
83
+
84
+ it 'returns the desired docs' do
85
+
86
+ @c.post(
87
+ '_design/my_test/_view/my_view',
88
+ { 'keys' => [ 'espresso', 'macchiato' ] }
89
+ ).should == {
90
+ "total_rows"=>6,
91
+ "offset"=>1,
92
+ "rows"=> [
93
+ {"id"=>"c0", "key"=>"espresso", "value"=>nil},
94
+ {"id"=>"c2", "key"=>"macchiato", "value"=>nil},
95
+ {"id"=>"c4", "key"=>"macchiato", "value"=>nil}
96
+ ]
97
+ }
98
+ end
99
+
100
+ it 'returns no row when the key points to nothing' do
101
+
102
+ @c.post(
103
+ '_design/my_test/_view/my_view',
104
+ { 'keys' => [ 'espresso', 'macha' ] }
105
+ ).should == {
106
+ "total_rows"=>6,
107
+ "offset"=>1,
108
+ "rows"=> [
109
+ {"id"=>"c0", "key"=>"espresso", "value"=>nil}
110
+ ]
111
+ }
112
+ end
113
+ end
114
+
115
+ describe '#nuke_design_documents' do
116
+
117
+ it 'removes design documents from the db' do
118
+
119
+ @c.nuke_design_documents
120
+
121
+ @c.get('_design/my_test').should == nil
122
+ end
123
+ end
124
+
125
+ describe '#query' do
126
+
127
+ it 'queries with the full path (_design/<id>/_view/<view>' do
128
+
129
+ @c.query('_design/my_test/_view/my_view').should == [
130
+ {"id"=>"c3", "key"=>"capuccino", "value"=>nil},
131
+ {"id"=>"c0", "key"=>"espresso", "value"=>nil},
132
+ {"id"=>"c2", "key"=>"macchiato", "value"=>nil},
133
+ {"id"=>"c4", "key"=>"macchiato", "value"=>nil},
134
+ {"id"=>"c1", "key"=>"ristretto", "value"=>nil},
135
+ {"id"=>"c5", "key"=>"veloce espresso", "value"=>nil}
136
+ ]
137
+ end
138
+
139
+ it 'queries with the short path (<id>:<view>)' do
140
+
141
+ @c.query('my_test:my_view').should == [
142
+ {"id"=>"c3", "key"=>"capuccino", "value"=>nil},
143
+ {"id"=>"c0", "key"=>"espresso", "value"=>nil},
144
+ {"id"=>"c2", "key"=>"macchiato", "value"=>nil},
145
+ {"id"=>"c4", "key"=>"macchiato", "value"=>nil},
146
+ {"id"=>"c1", "key"=>"ristretto", "value"=>nil},
147
+ {"id"=>"c5", "key"=>"veloce espresso", "value"=>nil}
148
+ ]
149
+ end
150
+
151
+ it "returns nil when the view doesn't exist" do
152
+
153
+ @c.query('nemo:nada').should == nil
154
+ end
155
+
156
+ it "returns nil when the view doesn't exist (and passing :keys)" do
157
+
158
+ @c.query('nemo:nada', :keys => %[ x y ]).should == nil
159
+ end
160
+
161
+ it 'returns the complete response on :raw => true' do
162
+
163
+ @c.query('my_test:my_view', :raw => true).should == {
164
+ "total_rows"=>6,
165
+ "offset"=>0,
166
+ "rows"=>
167
+ [{"id"=>"c3", "key"=>"capuccino", "value"=>nil},
168
+ {"id"=>"c0", "key"=>"espresso", "value"=>nil},
169
+ {"id"=>"c2", "key"=>"macchiato", "value"=>nil},
170
+ {"id"=>"c4", "key"=>"macchiato", "value"=>nil},
171
+ {"id"=>"c1", "key"=>"ristretto", "value"=>nil},
172
+ {"id"=>"c5", "key"=>"veloce espresso", "value"=>nil}]
173
+ }
174
+ end
175
+
176
+ it 'accepts parameters' do
177
+
178
+ @c.query('my_test:my_view', :limit => 2).should == [
179
+ {"id"=>"c3", "key"=>"capuccino", "value"=>nil},
180
+ {"id"=>"c0", "key"=>"espresso", "value"=>nil}
181
+ ]
182
+ end
183
+
184
+ it 'is OK with nil parameters' do
185
+
186
+ @c.query('my_test:my_view', :skip => nil, :limit => 2).should == [
187
+ {"id"=>"c3", "key"=>"capuccino", "value"=>nil},
188
+ {"id"=>"c0", "key"=>"espresso", "value"=>nil}
189
+ ]
190
+ end
191
+
192
+ it 'is OK with reduced views' do
193
+
194
+ @c.query('my_test:my_reduced_view', :group => true).should == [
195
+ {"key"=>"capuccino", "value"=>1},
196
+ {"key"=>"espresso", "value"=>1},
197
+ {"key"=>"macchiato", "value"=>2},
198
+ {"key"=>"ristretto", "value"=>1},
199
+ {"key"=>"veloce espresso", "value"=>1}
200
+ ]
201
+ end
202
+
203
+ it 'is OK with reduced views and :key' do
204
+
205
+ @c.query(
206
+ 'my_test:my_reduced_view', :key => 'macchiato', :group => true
207
+ ).should == [
208
+ { 'key' => 'macchiato', 'value' => 2 }
209
+ ]
210
+ end
211
+
212
+ it 'is OK with complex keys (array for example' do
213
+
214
+ lambda {
215
+ @c.query(
216
+ 'my_test:my_reduced_view', :key => [ "a", 2 ], :group => true)
217
+ }.should_not raise_error
218
+ end
219
+
220
+ it 'uses POST when there is a :keys parameter' do
221
+
222
+ @c.query(
223
+ 'my_test:my_view', :keys => %w[ capuccino ristretto ]
224
+ ).should == [
225
+ {"id"=>"c3", "key"=>"capuccino", "value"=>nil},
226
+ {"id"=>"c1", "key"=>"ristretto", "value"=>nil}
227
+ ]
228
+ end
229
+
230
+ it 'caches in case of GET' do
231
+
232
+ @c.query('my_test:my_view')
233
+ s0 = @c.http.last_response.status
234
+ @c.query('my_test:my_view')
235
+ s1 = @c.http.last_response.status
236
+
237
+ s0.should == 200
238
+ s1.should == 304
239
+ @c.http.cache.size.should == 1
240
+ end
241
+
242
+ it 'caches in case of POST' do
243
+
244
+ @c.query('my_test:my_view', :keys => %w[ capuccino ristretto ])
245
+ s0 = @c.http.last_response.status
246
+ @c.query('my_test:my_view', :keys => %w[ capuccino ristretto ])
247
+ s1 = @c.http.last_response.status
248
+
249
+ s0.should == 200
250
+ s1.should == 304
251
+ @c.http.cache.size.should == 1
252
+ end
253
+
254
+ it 'does not cache if :cache => false (GET)' do
255
+
256
+ @c.query('my_test:my_view', :cache => false)
257
+
258
+ @c.http.cache.size.should == 0
259
+ end
260
+
261
+ it 'does not cache if :cache => false (POST)' do
262
+
263
+ @c.query(
264
+ 'my_test:my_view',
265
+ :keys => %w[ capuccino ristretto ], :cache => false)
266
+
267
+ @c.http.cache.size.should == 0
268
+ end
269
+
270
+ it 'escapes :key(s) in the URI' do
271
+
272
+ @c.query('my_test:my_view', :key => 'veloce espresso').should == [
273
+ { 'id' => 'c5', 'key' => 'veloce espresso', 'value' => nil }
274
+ ]
275
+ end
276
+
277
+ it 'leaves the opts hash untouched' do
278
+
279
+ opts = { :skip => 3, :limit => nil }
280
+
281
+ @c.query('my_test:my_view', opts)
282
+
283
+ opts.should == { :skip => 3, :limit => nil }
284
+ end
285
+ end
286
+
287
+ describe '#query_for_docs' do
288
+
289
+ it 'returns documents' do
290
+
291
+ docs = @c.query_for_docs('my_test:my_view')
292
+
293
+ docs.collect { |doc| doc['type'] }.should == %w[
294
+ capuccino espresso macchiato macchiato ristretto
295
+ ] + [ 'veloce espresso' ]
296
+ end
297
+
298
+ it 'accepts :keys' do
299
+
300
+ docs = @c.query_for_docs('my_test:my_view', :keys => %w[ macchiato ])
301
+
302
+ docs.collect { |doc| doc['_id'] }.should == %w[ c2 c4 ]
303
+ end
304
+
305
+ it "doesn't return twice the same doc" do
306
+
307
+ @c.query_for_docs('my_test:my_double_view').size.should == 6
308
+ end
309
+
310
+ it "returns nil when the view doesn't exist" do
311
+
312
+ @c.query_for_docs('nemo:nada').should == nil
313
+ end
314
+
315
+ it 'leaves the opts hash untouched' do
316
+
317
+ opts = { :skip => 3, :limit => nil }
318
+
319
+ @c.query_for_docs('nemo:nada', opts)
320
+
321
+ opts.should == { :skip => 3, :limit => nil }
322
+ end
323
+ end
324
+ end
325
+ end
326
+
@@ -0,0 +1,2 @@
1
+ #http://admin:admin@127.0.0.1:5984
2
+ http://127.0.0.1:5984
@@ -0,0 +1,51 @@
1
+
2
+ #
3
+ # specifiying rufus-jig
4
+ #
5
+ # Wed Dec 1 15:07:42 JST 2010
6
+ #
7
+
8
+ require File.join(File.dirname(__FILE__), '..', 'spec_helper.rb')
9
+
10
+
11
+ describe Rufus::Jig::Http do
12
+
13
+ context 'HTTP basic authorization' do
14
+
15
+ context 'without authorization' do
16
+
17
+ before(:each) do
18
+ purge_server
19
+ @h = Rufus::Jig::Http.new('127.0.0.1', 4567)
20
+ end
21
+ after(:each) do
22
+ @h.close
23
+ end
24
+
25
+ it 'gets denied' do
26
+
27
+ lambda {
28
+ @h.get('/protected')
29
+ }.should raise_error(Rufus::Jig::HttpError)
30
+ end
31
+ end
32
+
33
+ context 'with authorization' do
34
+
35
+ before(:each) do
36
+ purge_server
37
+ @h = Rufus::Jig::Http.new(
38
+ '127.0.0.1', 4567, :basic_auth => %w[ admin nimda ])
39
+ end
40
+ after(:each) do
41
+ @h.close
42
+ end
43
+
44
+ it 'gets through' do
45
+
46
+ @h.get('/protected').should == { 'info' => 'secretive' }
47
+ end
48
+ end
49
+ end
50
+ end
51
+
@@ -0,0 +1,76 @@
1
+
2
+ #
3
+ # specifiying rufus-jig
4
+ #
5
+ # Tue Nov 30 13:03:00 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
+ context 'with conditional requests' do
22
+
23
+ describe '#get' do
24
+
25
+ it "caches the response" do
26
+
27
+ @h.get('/document_with_etag')
28
+
29
+ @h.cache.should == {
30
+ '/document_with_etag' => [ '"123456123456"', { 'car' => 'Peugeot' } ]
31
+ }
32
+ end
33
+
34
+ it "goes 200 then 304" do
35
+
36
+ @h.get('/document_with_etag', :raw => true).status.should == 200
37
+ @h.get('/document_with_etag', :raw => true).status.should == 304
38
+ end
39
+
40
+ it "doesn't cache when :cache => false" do
41
+
42
+ @h.get('/document_with_etag', :cache => false)
43
+
44
+ @h.cache.should == {}
45
+ end
46
+
47
+ it "returns duplicates" do
48
+
49
+ doc0 = @h.get('/document_with_etag', :raw => true)
50
+ doc1 = @h.get('/document_with_etag', :raw => true)
51
+
52
+ doc0.object_id.should_not == doc1.object_id
53
+ end
54
+
55
+ it "goes 200 when the ETag is obsolete" do
56
+
57
+ @h.get('/document_with_etag')
58
+ @h.get('/document_with_etag', :etag => '"nada"')
59
+
60
+ @h.last_response.status.should == 200
61
+ end
62
+ end
63
+
64
+ describe '#cache' do
65
+
66
+ it 'should be clearable' do
67
+
68
+ @h.get('/document_with_etag')
69
+ @h.cache.clear
70
+
71
+ @h.cache.size.should == 0
72
+ end
73
+ end
74
+ end
75
+ end
76
+