Seedlings

A little project to make seeding data easier to deal with across multiple ORMs.

N.B. This is early-release code that writes data to your database. While it is extracted from a live app, there may be cases where it blows up still :). Please test first. I don't want to hear about lost production data because you didn't try it in development first :).

Usage

gem "seedlings"

Install the gem.

There are two methods of note: .plant and .plant_and_return. They take 3 parameters:

  • the Class to use (must support ActiveModelish interface, like MongoMapper, Mongoid, ActiveRecord)
  • options you want Seedlings to respect, of which there are two:
    • :constrain which takes a column name or array of column names that will be used to find the records, and
    • :update_existing, which, if set to false, will cause Seedlings to skip updating existing records. By default Seedlings always updates.
  • the third parameter is that data you want seeded. .plant takes however many attribute hashes you give it. .plant_and_return takes only a single hash, but returns the resulting object.

Here's some examples:

Seedlings.plant(Widget, { :constrain => :name }, 
  # your seed data goes here, as a bunch of hashes.
  # Make sure you include values for any constraint columns you've specified!
  { :name => "Gizwidget", :context => "science!" },
  { :name => "Somoflange", :context => "80s cartoons" },
  # ...
)

If some of your seed data depends on other records, switch up to Seedlings.plant_and_return, which only takes one attribute hash but returns the object so you can use it in other hashes later, e.g.

parent_thing = Seedlings.plant_and_return(Thing, {}, { :name => "I'm a Parent!" })

Seedlings.plant(ChildThing, {}, 
  { :name => "Child Bit", :context => "docco", :parent => parent_thing },
  # ...
)

Rails? Rails.

"Integration" with rails is as simple as sticking the gem in your Gemfile and calling Seedlings.plant(...) in db/seeds.rb. Then you use rake per normal: rake db:seed. Yep.

Of Note

This is early code, ripped out from an upcoming project. It probably has some rough edges.

TODO:

  • more and better integration tests
  • a logging system that isn't puts-based :)
  • rake tasks
  • more options, etc, as desired

Note on Patches/Pull Requests

  • Fork the project.
  • Make your feature addition or bug fix.
  • Add tests for it. This is important so I don't break it in a future version unintentionally.
  • Commit, do not mess with rakefile, version, or history. (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
  • Send me a pull request. Bonus points for topic branches.

Copyright (c) 2011 Matt Wilson. See LICENSE for details.