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
Copyright © 2009 kematzy. Released under the MIT License.
See LICENSE for details.