No commit activity in last 3 years
No release in over 3 years
collection of utilities for datamapper: optimistic get, conditional get, use-utc timestampt, tag model as immutable, etc
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Development

Runtime

 Project Readme

Ixtlan DataMapper

  • Build Status
  • Dependency Status
  • Code Climate

it adds optimistic persistence support to DataMapper and ActveRecord using the updated_at property/attribute which is automatically updated on any change of the model (for datamapper you need dm-timestamps for that). to load a model use optimistic_get/optimistic_get!/optimistic_find respectively where the first argument is the last updated_at value which the client has. if the client data is uptodate then the optimistic_XYZ method will return the database entity otherwise raise an exception or return nil respectively.

optimistic/conditional get

just include require 'ixtlan/datamapper/optimistic' and have model like:

class User
  include DataMapper::Resource

  property :id, Serial
  property :name, String

  timestamps :at
end

you need the timestamps to get it to work since the updated_at property will be used to determine if the object is stale or not.

now you get the object in an optimistic manner

User.optimistic_get!( updated_at, id )
User.optimistic_get( updated_at, id )

if will raise an Ixtlan::DataMapper::StaleObjectException in case the object with the given id exists but does carry a different updated_at timestamp. otherwise the optimistic_get and optimistic_get! behave the same as get and get!.

now you get the object in an conditional manner

User.conditinal_get!( updated_at, id )
User.conditional_get( updated_at, id )

it the User when the updated_at does not match. when it matches it returns false. in case the id does not exist, it will return either nil of DataMapper::ObjectNotFoundError. this allows constructs like

if u = User.conditinal_get!( request.last_modified, id )
  response.last_modified = u.updated_at
  response.write ....
else
  # in case request.last_modified was nil
  response.last_modified = u.updated_at	  
end

Ixtlan::DataMapper::Immutable

class Group
  include DataMapper::Resource
  include Ixtlan::DataMapper::Immutable

  property :id, Serial
  property :name, String
end

you can create and delete those object but any attempt to change it the name ends in validation error.

require 'ixtlan/datamapper/use_utc'

just convenient file to setup datamapper to use UTC timestamps

Ixtlan::DataMapper:Collection

the collection is virtus object which helps to transport collections of DataMapper objects around. it has the total_count and an offset along an accessor for the list. the contructor deals with offset and limit on the datamapper query.

class UserCollection < Ixtlan::DataMapper::Collection
  attribute :users, Array[User]
  def data=( d )
    self.users = d
  end
end

this

UserCollection.new( User.all( :name.like => 'a%' ), 20, 10 )

will return 10 users starting with 'a' starting with 20th user from all possible users (with 'a').

Contributing

  1. Fork it
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Added some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create new Pull Request

meta-fu

enjoy :)