Skip to content

jmettraux/rufus-jig

Repository files navigation

rufus-jig

A HTTP client, greedy with JSON content, GETting conditionally.

Uses Typhoeus (github.com/typhoeus/typhoeus) or Patron (github.com/toland/patron) or em-http-request (github.com/igrigorik/em-http-request) whenever possible, and falls back to Net::HTTP if that’s all we have.

It depends on rufus-json (github.com/jmettraux/rufus-json) for JSON parsing and dumping.

This library also contains some CouchDB helpers.

To select a HTTP transport layer for rufus-jig, just make sure you have loaded the library before loading rufus-jig.

For Typhoeus:

require 'typhoeus'
require 'rufus/jig'

For Patron:

require 'patron'
require 'rufus/jig'

For em-http-request:

require 'em-http'
require 'rufus/jig'

For net-http-persistent:

require 'net/http/persistent'
require 'rufus/jig'

examples

HTTP client

Let’s say we have an hypothetical document server.

getting…

require 'rufus/jig'

h = Rufus::Jig::Http.new('127.0.0.1', 4567)

p h.get('/document/xyz.json')
  #
  # => { "type" => "letter", "title" => "four birds" }
  #
  # if it's JSON, decodes it immediately

p h.get('/document/xyz.txt')
  #
  # => "letter:\n\nfour birds"

j = h.get('/document', :content_type => 'application/json')
j = h.get('/document', :content_type => :json)
  #
  # 'Accepts' JSON

posting…

p h.post(
  '/documents', '<doc>four birds</doc>', :content_type => 'application/xml')
  #
  # => "created."

Couch helpers

For the real thing : github.com/couchrest/couchrest There is also the excellent : github.com/langalex/couch_potato

The class Rufus::Jig::Couch provides a get/put/delete trio that is couch-oriented. Json encoding/decoding is automatically handled as well as

put and delete return nil in case of success and true (conflict) or and exception else.

require 'rufus/jig'

c = Rufus::Jig::Couch.new('127.0.0.1', 5984, 'my_couch_db')

c.put('_id' => 'coffee0', 'category' => 'espresso')
c.put('_id' => 'coffee1', 'category' => 'instantaneous')

doc0 = c.get('coffee0')
doc1 = c.get('coffee1')

c.delete(doc0)

doc1['category'] => 'instant'
c.put(doc1)

c.delete(doc1['_id'], doc1['_rev'])

# ...

c.attach(
  doc0, 'picture', File.read('espresso.jpg'), :content_type => 'image/jpeg')
    # or
c.attach(
  doc0['_id'], doc0['_rev'], 'picture', File.read('espresso.jpg'), :content_type => 'image/jpeg')

picture = c.get('coffe0/picture')

c.detach('coffee0', '1-x-newrevision-whatever', 'picture')

there is also

c.all(:skip => 100, :limit => 100)
c.all(:keys => %w[ doc0 doc1 doc3 ])
  # grabbing multiple docs in one go

c.query('_design/my_design_doc/_view/my_view')
c.query('my_design_doc:my_view')
  # 'querying' a view

c.query_for_docs('my_design_doc:my_view')
  # querying for documents

bulk operations

docs = c.all(:keys => %w[ doc0 doc1 doc3 ])
c.bulk_delete(docs)
  # deleting in one go

docs = c.all(:keys => %w[ doc0 doc1 doc3 ])
docs.each { |doc| doc['status'] = 'copied' }
c.bulk_put(docs)
  # updating in one go

Couch #on_change

Continuous feed with a 20s heartbeat :

db.on_change do |doc_id, deleted|
  puts "doc #{doc_id} has been #{deleted ? 'deleted' : 'changed'}"
end

db.on_change do |doc_id, deleted, doc|
  puts "doc #{doc_id} has been #{deleted ? 'deleted' : 'changed'}"
  p doc
end

Please note the 3 param block, it includes the changed document (Note : this only work with CouchDB >= 0.11).

This is a blocking method (one may want to wrap it in a thread).

Couch #dump and #load

To dump the current content of the Couch database to a ‘backup.dump’ file, one document per line, attachments included:

db.dump("backup.dump")

To load that file later on (or somewhere else):

db.load("backup.dump")

To wipe clean and then load:

db.load("backup.dump", :overwrite => true)

rdoc

rufus.rubyforge.org/rufus-jig/

testing

rake

or

rspec spec/

tests all (plain jig and CouchDB).

rspec spec/jig

only tests the plain jig stuff.

rspec spec/couch

only tests the CouchDB stuff.

By default net/http is used. To test with another HTTP lib :

JIG_LIB=typhoeus rspec spec/

You can specify patron, em, netp or net. Netp corresponds to seattlerb.rubyforge.org/net-http-persistent/

The specs require the json and sinatra gems. You can spot issues in the file server.log (created when running specs).

known issues

  • the EM based client cannot deal with non-ASCII paths

mailing list

On the rufus-ruby list :

groups.google.com/group/rufus-ruby

issue tracker

github.com/jmettraux/rufus-jig/issues

irc

irc.freenode.net #ruote

the rest of Rufus

rufus.rubyforge.org

authors

license

MIT

About

A HTTP client, greedy with JSON content, GETting conditionally.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages