0.0
Repository is archived
No commit activity in last 3 years
No release in over 3 years
something at the intersection of Rails3, CouchDB and rufus-jig
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Development

>= 0

Runtime

~> 3.0.0
>= 1.16
>= 0.1.23
 Project Readme

rufus-doric¶ ↑

some Ruby lib at the intersection of Rails3, CouchDB and rufus-jig.

how does rufus-doric determine which Couch database to use ?¶ ↑

At first it determines which CouchDB server to use via this code :

def self.couch_url

  if defined?(Rails) # rails config/couch_url.txt
    return File.read(Rails.root.join('config', 'couch_url.txt')).strip
  end
  if File.exist?('couch_url.txt') # current working directory
    return File.read('couch_url.txt').strip
  end

  'http://127.0.0.1:5984' # the default
end

Then the database is determined by calling Rufus::Doric.db(name)

p Rufus::Doric.db('mydb', :url_only => true)
  # => "http://127.0.0.1:5984/mydb_test"

p Rufus::Doric.db('mydb', :env => 'camelia', :url_only => true)
  # => "http://127.0.0.1:5984/mydb_camelia"

p Rufus::Doric.db('mydb', :env => 'camelia')
  # => #<Rufus::Jig::Couch:0x00000102325120
  #      @http=#<Rufus::Jig::Http:0x00000102324908 @host="127.0.0.1",
  #        @port=5984, @path="/toot_test", ...>...>

In summary, you only have to create a couch_url.txt file that contains the http:://{host}:{port} of your couch server. The rest is taken care of.

Rufus::Doric::Model usage¶ ↑

One document per instance.

class Item < Rufus::Doric::Model

  db :doric
    # in which db it goes (remember that an _env suffix is added)

  doric_type :items
    # 'doric_type' field

  _id_field :name
    # _id field is determined from field 'name'

  h_accessor :name
  h_accessor :supplier

  validates :supplier, :presence => true
end

There is more, please look at the test/ directory to discover Model.

Rufus::Doric::OneDocModel usage¶ ↑

I use this for ‘users’ models.

class User < Rufus::Doric::OneDocModel

  db 'doric'
  doc_id :users

  h_accessor :locale
  h_accessor :email
  h_reader :password

  validates :password, :presence => true
end

It places all the users in one document (whereas Rufus::Doric::Model has 1 document per instance/record).

Look at the test/ directory to learn more about OneDocModel.

Rufus::Doric::Value usage¶ ↑

Value is about Couch documents containing a single ‘value’ field (apart from _id and _rev)

Given

class Tuples < Rufus::Doric::Value

  doc_id :tuples
  db :doric

  def to_s
    value.sort.join(' ')
  end
end

and a document ‘tuples’ in the database ‘doric’ :

{
  "_id": "tuples",
  "value": [ "alpha", "bravo", "charly" ]
}

this can be done :

p Tuples.load.to_s
  # => "alpha bravo charly"

tuples = Tuples.load
tuples.value << 'borneo'
tuples.save!

p Tuples.load.to_s
  # => "alpha borneo bravo charly"

Also :

tuples = Tuples.new(
  '_id' => 'tuples', 'value' => %w[ alpha beta delta gamma ]).save!

p Tuples.load.to_s
  # => "alpha beta delta gamma"

Rufus::Doric::Value and h_shortcut¶ ↑

Most of the time, I use Rufus::Doric::Value to store a hash of things :

class Misc < Rufus::Doric::Value

  doc_id :misc
  db :doric

  h_shortcut :product_lines
  h_shortcut :purposes
end

with :

{
  "_id": "misc",
  "value": {
    "product_lines" : [
      "blue_coat", "ulticom", "znyx"
    ],
    "purposes": [
      "stock", "non_stock", "replace", "rma", "loan"
    ]
  }
}

then in my app, I just do

p Misc.product_lines
  # => [ "blue_coat", "ulticom", "znyx" ]

p Misc.purposes
  # => [ "stock", "non_stock", "replace", "rma", "loan" ]

‘fixtures’ usage¶ ↑

Given a fixture tree

fixtures
`-- test
    `-- doric
        |-- 69247b__picture.jpg
        |-- 69249__picture.jpg
        |-- product0.json
        |-- product1.json
        |-- users.json
        |-- users__jami.png
            `-- users__john.jpg

this

require 'rufus/doric/fixtures'
Rufus::Doric::Fixtures.load('http://127.0.0.1:5984', 'fixtures/test')

will load the documents (and their attachements) into 127.0.0.1:5984/doric_test

credits¶ ↑

Claudio Petasecca Donati - for all his help Austin Ziegler @halostatue - for the mime-types gem

license¶ ↑

MIT