From: "Florian Aßmann" Date: 2009-08-21T01:52:07+09:00 Subject: Help Wanted - Chambermaid Hi folks, I'm working on a lib called Chambermaid that creates snapshots of ruby objects and stores them in a git repository. The main objective of Chambermaid is not to mess with your classes or objects. Instead Chambermaid should provide a simple but powerful API. You work with browsers which will give you access to specific diaries (repos) and diaries which will give you access to specific pages (commits). These pages contain snapshots of your ruby object. Still neither documentation nor write support is available. I'm currently struggling on how to snapshot files. So here is my question: __Do you have an idea how I should treat files and other more complex types?__ P.S.: *Maybe at some point I can Chambermaid keep a diary on herself... :D* Resources: http://github.com/boof/chambermaid ### ./example.rb require 'chambermaid' require 'person' PeopleBrowser = Chambermaid.browser Person # => a Browser foo_master_page = PeopleBrowser[1].last_page # => a Page person_foo = foo_master_page.target # => a Person # method missing binds a Context to the method called returning the value # returned by method person_foo.id == foo_master_page.id ### ./person.rb: class Person attr_accessor :id, :firstname, :lastname, :email # tell Chambermaid where to find the repositories Chambermaid.keed_diary self, :in => File.join(File.dirname(__FILE__), 'people'), :as => :id end ### ./people/init.rb Chambermaid.ascribe Person do |has| # tell chambermaid where attributes should be read from and write to # tell Chambermaid that the id is located in 'id.*' which reads # the value like: # # 1. a Context tries to find the correct filename => id.int.1 # 2. the filename is divided based on '.' => id, int, '1' # 3. the last n-1 parts are filters that manipulate the value => int, '1' # 4. filters are applied in reverse order => '1', int # 5. unrecognized filters, like '1', return itself as value => '1' # 6. the int filter calls to_i on '1' => 1 # 7. the result is assigned to the attribute id has.attribute :id, 'int.%i', :id # tell Chambermaid the meta.yml file contains the attributes :firstname and # :lastname where .map adds the yml filter chain if not defined. has.map :meta do |meta| meta.reads(:firstname) { |meta| meta['firstname'] } meta.reads(:lastname) { |meta| meta['lastname'] } end has.attribute :email, 'uri' end ### ./people/1/id.int.1 1 ### ./people/1/meta.yml --- firstname: Foo lastname: Bar ... ### ./people/1/email.uri mailto:foo@bar.url Florian Aßmann Fork Unstable Media | Hamburg www.fork.de