Yuki

a model wrapper for key-value objects around tokyo products (cabinet/tyrant)

Play with Ninjas

class Ninja
  include Yuki
  store :cabinet, :path => "path/to/ninja.tct"
  has :color,     :string, :default => "black"
  has :name,      :string
  has :mp,        :numeric
  has :last_kill, :timestamp
end

# Tyrant requires tokyo tyrant to be started
#   ttserver -port 45002 data.tct
class Ninja
  include Yuki
  store :tyrant, :host => "localhost", :port => 45002
  # ...
end

class Ninja
  include Yuki
  store :cabinet, :path => "/path/to/ninja.tct"
  has :color, :default => "black"
  has :name, :string, :default => "unknown"
  has :mp, :numeric
  has :last_kill, :timestamp

  # object will remain in the store after deletion
  # with 'deleted' # => Time of deletion
  soft_delete!

  def before_save
    puts "kick"
  end

  def after_save
    puts "young blood..."
  end

  def before_delete
    puts "stabs murderer"
  end

  def after_delete
    puts "fights as ghost"
  end

  def validate!
    puts "ensure ninjatude"
  end

  # hook for serialization
  # (green ninjas get more mp with serialized)
  def to_h
    if color == "green"
      super.to_h.merge({
        "mp" => (mp + 1000).to_s
      })
    else
      super
    end
  end
end

# queryable attributes
Ninja.new.mp? # false

ninja = Ninja.new(:mp => 700, :last_kill => Time.now)

ninja.mp? # true

# crud
ninja.save!
ninja.update!
ninja.delete!

Ninja.filter({
  :color => [:eq, 'red'],
  :mp => [:gt, 40],
  :order => :last_kill
}) # => all red ninjas with mp > 40

Ninja.union([{
  :color => [:eq, 'red'],
  :mp => [:gt, 40],
}, {
    :color => [:eq, 'black']
}]) # => all black ninjas mixed with red ninjas with mp > 20

Ninja.first

Ninja.last

Ninja.keys

Ninja.any?

Ninja.empty?

Ninja.build([
  { ... },
  { ... },
  { ... }
]) # 3 ninjas built from 3 hashes

Install

> make sure to have the following tokyo products installed
  - tokyocabinet-1.4.36 or greater
  - tokyotyrant-1.1.37 or greater
  - [install tokyo products]:(@ http://openwferu.rubyforge.org/tokyo.html)

> rip install git://github.com/softprops/yuki      

> include Yuki in your model

> run with it

2009 Doug Tangren (softprops)