Sinatra::DM

A Sinatra Extension that makes working with DataMapper easier.

Installation

#  Add Gemcutter to your RubyGems sources 
$  gem sources -a http://gemcutter.com

$  (sudo)? gem install sinatra-dm

Dependencies

This Gem depends upon the following:

Runtime:

  • sinatra ( >= 0.10.1 )

  • dm-core ( >= 0.10.1 )

And a constant named ::APP_ROOT defined in your App, pointing to the root of your app.

# set the root of the whole app
APP_ROOT = Dir.pwd

Question:

Do you know how I can avoid this APP_ROOT constant inside the Extension, but still use full paths ? If so, please let me know.

Development & Tests:

  • rspec (>= 1.2.7 )

  • rack-test (>= 0.4.1)

  • rspec_hpricot_matchers (>= 0.1.0)

  • sinatra-tests (>= 0.1.5)

Optional:

  • kematzy-tasks (>= 0.1.5) # handy Rake tasks for working with SQLite3 DB’s

Getting Started

In your Sinatra app code base,

require 'sinatra/dm'

then in your App declaration,

class YourApp < Sinatra::Base 
  register(Sinatra::DataMapperExtension)  # NOTE:: the extension name

  # NOTE:: need to ensure this is set this for the logger to function
  set :environment, ENV['RACK_ENV'].to_sym || :test

  # NOTE:: The database configuration must be set so 
  # the DataMapper.auto_migrate! / .auto_upgrade! migrations work
  set :database, dm_database_url

  ## ROUTES 
  get '/posts' do
    @posts = Post.all
  end

end

Most of the above is obvious, but this line…

set :database, dm_database_url

…is perhaps a bit confusing, so let’s clarify it.

#dm_database_url is an Extension setting - (see below) - that contains the whole SQLite3 DSN string.

"sqlite3:///path/2/your/app/root/db/db.test.db"

In real terms, you could just as well have written this:

set :database, "sqlite3:///path/2/your/app/root/db/db.test.db"

or

set :database, "mysql://username:password@dbhost/db_name"

# if you have MySQL set up **insecurely** on your local workstation
set :database, "mysql://root:@dbhost/db_name"

Configuration Options

The following options are available for you to configure your DataMapper setup

  • :db_dir – sets the path to where your SQLite3 DBs should be. (Default: [/full/path/2/your/app/db] )

  • :dm_logger_level – sets the level at which DataMapper.Logger should log. (Default: [:debug] )

  • :dm_logger_path – sets the path to the log file where DataMapper.Logger should log. (Default: [/full/path/2/your/app/log/dm.environment.log] )

  • :dm_setup_context – sets the DataMapper Setup context. (Default: [:default] )

  • :dm_database_url – sets the DSN. (Default: ENV || “sqlite3://#db_dir/db.#environment.db” )

There are many ways in which you can use the above configurations in YourApp.

Here are a few examples:

class YourApp < Sinatra::Base
  register(Sinatra::DataMapperExtension)  # NOTE:: the extension name

  <snip...>

  # set the db path to outside of your app root
  set :db_dir, "/home/USERNAME/SQLite3-dbs/"

  # to only log :warn and above
  set :dm_logger_level, :warn

  # set the path to your log files outside of your app root
  set :dm_logger_path, "/var/log/dm.your_app.log"

  # use a different Setup context than :default
  set :dm_setup_context, :custom

  <snip...>

  # NB! Don't forget to set the database configuration
  set :database, dm_database_url

end

RTFM

If the above is NOT clear enough, please check the Specs for a better understanding.

TODOs

There are a number of things I’d love to have help with through a fork:

  • Enabling DataMapper Migrations to work flawlessly.

  • Decide if there should be a :dm_logger_status (On/Off) switch for turning off DM logger

  • Test it with a PostgreSQL db (although I’m sure it would work fine there as is)

  • Any other improvements you can think of.

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 © 2009 kematzy. Released under the MIT License.

See LICENSE for details.