DataMapper 0.9 is Released

DataMapper 0.9 is ready for the world. It brings with it a massive overhaul of the internals of DataMapper, a shift in terminology, a dramatic bump in speed, improved code-base organization, and support for more than just database data-stores.

To install it:

sudo gem install addressable english rspec
sudo gem install data_objects do_mysql do_postgres do_sqlite3
sudo gem install dm-core

This is NOT a backwards compatible release. Code written for DataMapper 0.3 will not function with DataMapper 0.9.* due to syntactical changes and library improvements.

REPEAT: This is NOT a backwards compatible release.

  DataMapper 0.3 DataMapper 0.9
Creating a class
class Post < DataMapper::Base
end
class Post
  include DataMapper::Resource
end
Keys
# Key was not mandatory
# Automatically added +id+ if missing
#
# Natural Key
property :name, :string, :key => true
#
# Composite Key
property :id, :integer,  :key => true
property :slug, :string, :key => true
# keys are now mandatory
property :id,   Serial
#
# Natural Key
property :slug, String,  :key => true
#
# Composite Key
property :id,   Integer, :key => true
property :slug, String,  :key => true
Properties
property :title,     :string
property :body,      :text
property :posted_on, :datetime
property :active,    :boolean
property :title,     String
property :body,      Text
property :posted_on, DateTime
property :active,    Boolean
Associations
has_many :comments
belongs_to :blog
has_and_belongs_to_many :categories
has_one :author
has n, :comments
belongs_to :blog
has n, :categories => Resource
has 1, :author
Finders
Post.first :order => 'created_at DESC'
Post.all
  :conditions => [ 'active = ?', true ]

database.query 'SELECT 1'
database.execute 'UPDATE posts...'
        
Post.first :order => [ :created_at.desc ]
Post.all
  :conditions => [ 'active = ?', true ]

repository(:default).adapter.query 'SELECT 1'
repository(:default).adapter.execute 'UPDATE posts...'
        
Validations
validates_presence_of     :title
validates_numericality_of :rating
validates_format_of       :email,   :with => :email_address
validates_length_of       :summary, :within => 1..100
validates_uniqueness_of   :slug
        
validates_present   :title
validates_is_number :rating
validates_format    :email,   :as => :email_address
validates_length    :summary, :in => 1..100
validates_is_unique :slug
        
Callbacks
before_save :categorize

before_create do |post|
  # do stuff with post
end

# return false to abort
before :save, :categorize

before :create do
  # do stuff with self
end

# throw :halt to abort