rufus-jig 0.1.0 → 0.1.1

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/CREDITS.txt CHANGED
@@ -1,3 +1,6 @@
1
1
 
2
- nothing here for now
2
+ == authors
3
+
4
+ John Mettraux - http://github.com/jmettraux
5
+ Kenneth Kalmer - http://github.com/kennethkalmer
3
6
 
data/README.rdoc CHANGED
@@ -3,10 +3,27 @@
3
3
 
4
4
  A HTTP client, greedy with JSON content, GETting conditionally.
5
5
 
6
- Uses Patron (http://github.com/toland/patron) and Yajl-ruby (http://github.com/brianmario/yajl-ruby) whenever possible.
6
+ Uses Patron (http://github.com/toland/patron) or em-http-request (http://github.com/igrigorik/em-http-request)
7
+ and Yajl-ruby (http://github.com/brianmario/yajl-ruby) whenever possible.
7
8
 
8
9
  This library also contains some CouchDB helpers.
9
10
 
11
+ To select a HTTP transport layer for rufus-jig, just make sure you have loaded
12
+ the library before loading rufus-jig.
13
+
14
+ For Patron:
15
+
16
+ require 'patron'
17
+ require 'rufus/jig'
18
+
19
+ For em-http-request:
20
+
21
+ require 'em-http'
22
+ require 'rufus/jig'
23
+
24
+ Please not that em-http-request-0.2.2 and earlier don't support the PUT and DELETE
25
+ verbs. Until a newer gem is released you'll need to build the em-http-request gem
26
+ from source.
10
27
 
11
28
  == examples
12
29
 
@@ -52,6 +69,7 @@ posting...
52
69
  === Couch helpers
53
70
 
54
71
  For the real thing : http://github.com/couchrest/couchrest
72
+ There is also the excellent : http://github.com/langalex/couch_potato
55
73
 
56
74
  require 'patron'
57
75
  require 'yajl'
@@ -142,6 +160,10 @@ To test the CouchDB helpers, make you have a running Couch on http:/127.0.0.1:59
142
160
 
143
161
  ruby test/test.rb --couch
144
162
 
163
+ To test the em-http-request HTTP transport, make sure the sinatra server is running and then do:
164
+
165
+ ruby test/test.rb -- --em
166
+
145
167
 
146
168
  == mailing list
147
169
 
@@ -52,6 +52,12 @@ module Rufus::Jig
52
52
  end
53
53
  end
54
54
 
55
+ class HttpResponse
56
+
57
+ attr_reader :status, :headers, :body
58
+ attr_reader :original
59
+ end
60
+
55
61
  # The base for the Rufus::Jig::Http class.
56
62
  #
57
63
  class HttpCore
@@ -197,13 +203,22 @@ module Rufus::Jig
197
203
 
198
204
  def add_prefix (path, opts)
199
205
 
200
- elts = [ path ]
206
+ uri = URI.parse( path )
201
207
 
202
- if path.match(/^[^\/]/) && prefix = @options[:prefix]
203
- elts.unshift(prefix)
204
- end
208
+ if !uri.host.nil?
209
+ return uri.to_s
210
+
211
+ else
212
+ uri.host.nil?
213
+
214
+ elts = [ path ]
205
215
 
206
- Path.join(*elts)
216
+ if path.match(/^[^\/]/) && prefix = @options[:prefix]
217
+ elts.unshift(prefix)
218
+ end
219
+
220
+ return Path.join(*elts)
221
+ end
207
222
  end
208
223
 
209
224
  def add_params (path, opts)
@@ -258,6 +273,17 @@ end
258
273
 
259
274
  if defined?(Patron) # gem install patron
260
275
 
276
+ class Rufus::Jig::HttpResponse
277
+
278
+ def initialize (patron_res)
279
+
280
+ @original = patron_res
281
+ @status = patron_res.status
282
+ @headers = patron_res.headers
283
+ @body = patron_res.body
284
+ end
285
+ end
286
+
261
287
  class Rufus::Jig::Http < Rufus::Jig::HttpCore
262
288
 
263
289
  def initialize (host, port, opts={})
@@ -268,7 +294,8 @@ if defined?(Patron) # gem install patron
268
294
  @patron.base_url = "#{host}:#{port}"
269
295
 
270
296
  @patron.headers['User-Agent'] =
271
- opts[:user_agent] || "#{self.class} #{Rufus::Jig::VERSION}"
297
+ opts[:user_agent] ||
298
+ "#{self.class} #{Rufus::Jig::VERSION} (patron)"
272
299
  end
273
300
 
274
301
  protected
@@ -285,6 +312,8 @@ if defined?(Patron) # gem install patron
285
312
 
286
313
  def do_put (path, data, opts)
287
314
 
315
+ opts['Expect'] = '' unless @options[:expect]
316
+
288
317
  @patron.put(path, data, opts)
289
318
  end
290
319
 
@@ -294,11 +323,175 @@ if defined?(Patron) # gem install patron
294
323
  end
295
324
  end
296
325
 
326
+ elsif defined?( EventMachine::HttpRequest )
327
+
328
+ class Rufus::Jig::HttpResponse
329
+
330
+ def initialize( em_client )
331
+
332
+ @original = [ em_client, em_client.response ]
333
+
334
+ @status = em_client.response_header.status
335
+ @headers = response_headers( em_client.response_header )
336
+ @body = em_client.response
337
+ end
338
+
339
+ protected
340
+
341
+ def response_headers( hash )
342
+ hash.inject({}) do |headers, (key, value)|
343
+ key = key.downcase.split('_').map { |c| c.capitalize }.join('-')
344
+ headers[ key ] = value
345
+ headers
346
+ end
347
+ end
348
+ end
349
+
350
+ class Rufus::Jig::Http < Rufus::Jig::HttpCore
351
+
352
+ def initialize (host, port, opts={})
353
+
354
+ super(host, port, opts)
355
+
356
+ @em_host = host
357
+ @em_port = port
358
+
359
+ @em_ua = opts[:user_agent] || "#{self.class} #{Rufus::Jig::VERSION} (em)"
360
+ end
361
+
362
+ protected
363
+
364
+ def do_get( path, data, opts )
365
+ http = em_request( path ).get( :head => request_headers(opts) )
366
+
367
+ em_response( http )
368
+ end
369
+
370
+ def do_post( path, data, opts )
371
+ http = em_request( path ).post( :body => data, :head => request_headers(opts) )
372
+
373
+ em_response( http )
374
+ end
375
+
376
+ def do_delete( path, data, opts )
377
+ http = em_request( path ).delete( :head => request_headers( opts ) )
378
+
379
+ em_response( http )
380
+ end
381
+
382
+ def do_put( path, data, opts )
383
+ http = em_request( path ).put( :body => data, :head => request_headers( opts ) )
384
+
385
+ em_response( http )
386
+ end
387
+
388
+ def em_request( uri = '/' )
389
+ uri = URI.parse( uri )
390
+ uri = URI::HTTP.build(
391
+ :host => ( uri.host || @em_host ),
392
+ :port => ( uri.port || @em_port ),
393
+ :path => uri.path,
394
+ :query => uri.query
395
+ )
396
+
397
+ EventMachine::HttpRequest.new( uri.to_s )
398
+ end
399
+
400
+ def em_response( em_client )
401
+ th = Thread.current
402
+
403
+ em_client.callback {
404
+ th.wakeup
405
+ }
406
+
407
+ Thread.stop
408
+
409
+ Rufus::Jig::HttpResponse.new( em_client )
410
+ end
411
+
412
+ def request_headers( options )
413
+ headers = { 'user-agent' => @em_ua }
414
+
415
+ %w[ Accept If-None-Match Content-Type ].each do |k|
416
+ headers[k] = options[k] if options.has_key?( k )
417
+ end
418
+
419
+ headers
420
+ end
421
+ end
422
+
297
423
  else
298
424
 
299
- # TODO : use Net:HTTP
425
+ require 'net/http'
426
+
427
+ class Rufus::Jig::HttpResponse
428
+
429
+ def initialize (nh_res)
430
+
431
+ @original = nh_res
432
+ @status = nh_res.code.to_i
433
+ @body = nh_res.body
434
+ @headers = {}
435
+ nh_res.each { |k, v|
436
+ @headers[k.split('-').collect { |s| s.capitalize }.join('-')] = v
437
+ }
438
+ end
439
+ end
440
+
441
+ class Rufus::Jig::Http < Rufus::Jig::HttpCore
442
+
443
+ def initialize (host, port, opts={})
444
+
445
+ super(host, port, opts)
446
+
447
+ @http = Net::HTTP.new(host, port)
448
+
449
+ to = opts[:timeout]
450
+ if to
451
+ to = to.to_i
452
+ @http.open_timeout = to
453
+ @http.read_timeout = to
454
+ end
455
+
456
+ @options[:user_agent] =
457
+ opts[:user_agent] ||
458
+ "#{self.class} #{Rufus::Jig::VERSION} (net/http)"
459
+ end
460
+
461
+ protected
462
+
463
+ def do_get (path, data, opts)
464
+
465
+ do_request(:get, path, data, opts)
466
+ end
467
+
468
+ def do_post (path, data, opts)
469
+
470
+ do_request(:post, path, data, opts)
471
+ end
472
+
473
+ def do_put (path, data, opts)
474
+
475
+ do_request(:put, path, data, opts)
476
+ end
477
+
478
+ def do_delete (path, data, opts)
479
+
480
+ do_request(:delete, path, data, opts)
481
+ end
300
482
 
301
- raise "alternative to Patron not yet integrated :( gem install patron"
483
+ def do_request (method, path, data, opts)
484
+
485
+ req = eval("Net::HTTP::#{method.to_s.capitalize}").new(path)
486
+
487
+ req['User-Agent'] = options[:user_agent]
488
+ opts.each { |k, v| req[k] = v if k.is_a?(String) }
489
+
490
+ req.body = data ? data : ''
491
+
492
+ Rufus::Jig::HttpResponse.new(@http.start { @http.request(req) })
493
+ end
494
+ end
302
495
 
303
496
  end
304
497
 
data/lib/rufus/jig.rb CHANGED
@@ -29,7 +29,7 @@ module Jig
29
29
  require 'rufus/jig/http'
30
30
  require 'rufus/jig/json'
31
31
 
32
- VERSION = '0.0.1'
32
+ VERSION = '0.1.1'
33
33
 
34
34
  autoload :Couch, 'rufus/jig/couch'
35
35
  autoload :CouchError, 'rufus/jig/couch'
metadata CHANGED
@@ -1,15 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rufus-jig
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Mettraux
8
+ - Kenneth Kalmer
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
12
 
12
- date: 2009-11-09 00:00:00 +09:00
13
+ date: 2009-12-04 00:00:00 +09:00
13
14
  default_executable:
14
15
  dependencies: []
15
16