Create a merb slice with jeweler

A slice is just a gem so we can create and manage our slice by starting with jeweler.

Jeweler

gem sources -a http://gems.github.com
      sudo gem install technicalpickles-jeweler
      git config --global user.email johndoe@example.com
      git config --global user.name 'John Doe'
      git config --global github.user johndoe
      git config --global github.token 55555555555555
      
      jeweler --create-repo --summary "Sandy Koufax Slice" sandy_koufax_slice
      

Slice

Because jeweler is a bit opinionated and creates a structure for us, create your slice in a tmp directory and then copy the app, config, spec, etc files over to our sand_koufax_slice jeweler structure. Yep, a bit sloppy, and there is a more elegant way, but for now copy and paste worked well for me.

Be careful with the Rakefile. It should look something like this:

Once you’ve got standard files copied over let’s start creating the slice. To do so, we first need to set the slice up to work in development mode (this bit of hackery will eventually go away in Merb 1.2 with embeddable apps. I’m excited for that.).

1. Add the following to config/init.rb

require 'config/dependencies.rb'
       
      use_orm :datamapper
      use_test :rspec
      use_template_engine :erb
      

2. Create config/dependencies.rb

# dependencies are generated using a strict version, don't forget to edit the dependency versions when upgrading.
      merb_gems_version = "1.0.10"
      dm_gems_version   = "0.9.10"
      do_gems_version   = "0.9.11"
      
      # For more information about each component, please read http://wiki.merbivore.com/faqs/merb_components
      dependency "merb-core", merb_gems_version 
      dependency "merb-action-args", merb_gems_version
      dependency "merb-assets", merb_gems_version  
      dependency("merb-cache", merb_gems_version) do
        Merb::Cache.setup do
          register(Merb::Cache::FileStore) unless Merb.cache
        end
      end
      dependency "merb-helpers", merb_gems_version 
      dependency "merb-mailer", merb_gems_version  
      dependency "merb-slices", merb_gems_version  
      dependency "merb-auth-core", merb_gems_version
      dependency "merb-auth-more", merb_gems_version
      dependency "merb-auth-slice-password", merb_gems_version
      dependency "merb-param-protection", merb_gems_version
      dependency "merb-exceptions", merb_gems_version
      
      dependency "data_objects", do_gems_version
      dependency "do_mysql", do_gems_version # If using another database, replace this
      dependency "dm-core", dm_gems_version         
      dependency "dm-aggregates", dm_gems_version   
      dependency "dm-migrations", dm_gems_version   
      dependency "dm-timestamps", dm_gems_version   
      dependency "dm-types", dm_gems_version        
      dependency "dm-validations", dm_gems_version  
      dependency "dm-serializer", dm_gems_version   
      
      dependency "merb_datamapper", merb_gems_version
      

3. Bundle the dependencies

This turned out to be a big headache when it came to installing the gem. Just use the gems on your machine and install with sudo gem install merb as necessary.

Bundling our dependencies makes development easier – especially if we want someone else to work on our slice. But the only way to bundle is to get thor in our slice, and it is not there by default like in a merb app. So let’s add it.

To get the thor tasks go into a tmp directory and generate a fresh merb application, then just use copy and paste to move /tasks folder and its contents into your slice. It should look something like this:
- tasks/
doc.thor
merb.thor/
app_script.rb
common.rb
gem_ext.rb
main.thor
ops.rb
utils.rb

thor merb:gem:install
      

Now you should be able to run bin/slice and bin/rake to run and test your slice.

4. Development and Test Database

Create config/database.yml and put in the following content

development:
        adapter:  sqlite3
        database: sample_development.db
      test:
        adapter:  sqlite3
        database: sample_test.db
      production:
        adapter:  sqlite3
        database: production.db
      

development:
adapter: sqlite3
database: sample_development.db
test:
adapter: sqlite3
database: sample_test.db
production:
adapter: sqlite3
database: production.db

Create a model and then rake the database

slice -i
      DataMapper.auto_migrate!
      

slice -i
DataMapper.auto_migrate!

In spec_helper.rb add the before(:all) auto_migrate line for datamapper

Spec::Runner.configure do |config|
        config.include(Merb::Test::ViewHelper)
        config.include(Merb::Test::RouteHelper)
        config.include(Merb::Test::ControllerHelper)
        config.include(Merb::Test::SliceHelper

Spec::Runner.configure do |config|
config.include(Merb::Test::ViewHelper)
config.include(Merb::Test::RouteHelper)
config.include(Merb::Test::ControllerHelper)
config.include(Merb::Test::SliceHelper)

config.before(:all) do DataMapper.auto_migrate! if Merb.orm == :datamapper end

end

Then you just have to start building your slice – which is tricky. That’s all I’ve got for now.

Picture of Scott Motte

delicious facebook rss twitter

Spitfire Sky | github | archives | resume