pk-merb_sequel 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/Generators ADDED
@@ -0,0 +1,4 @@
1
+ scope 'merb-gen' do
2
+ dir = File.join(File.dirname(__FILE__), 'lib', 'generators/')
3
+ Merb.add_generators dir + 'migration', dir + 'model', dir + 'resource_controller', dir + 'session_migration'
4
+ end
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ Copyright (c) 2007-2008,
2
+ Duane Johnson, Wayne E. Seguin, Lance Carlson, Michael S. Klishin.
3
+
4
+ Permission is hereby granted, free of charge, to any person obtaining
5
+ a copy of this software and associated documentation files (the
6
+ "Software"), to deal in the Software without restriction, including
7
+ without limitation the rights to use, copy, modify, merge, publish,
8
+ distribute, sublicense, and/or sell copies of the Software, and to
9
+ permit persons to whom the Software is furnished to do so, subject to
10
+ the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be
13
+ included in all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,85 @@
1
+ = merb_sequel
2
+
3
+ A plug-in for the Merb framework that provides support for Sequel models.
4
+
5
+ This is fork of the code in the official merb-plugins
6
+ (http://github.com/wycats/merb-plugins) repository. I did separate repository
7
+ and Gem to allow faster and more independent release cycle to keep up with the
8
+ Sequel monthly releases.
9
+
10
+ Plug-in should be compatible with Merb 0.9.9 and higher and Sequel 1.4.0 and
11
+ higher including 2.x and incoming <b>3.x</b>.
12
+
13
+ <b>Any issues please report to http://github.com/pk/merb_sequel/issues</b>.
14
+
15
+
16
+ == Install
17
+
18
+ gem install pk-merb_sequel --source http://gems.github.com
19
+
20
+ In Merb, add it as a dependency to your config/dependencies.rb:
21
+
22
+ dependency 'pk-merb_sequel', :require_as => 'merb_sequel'
23
+
24
+ == Compatibility
25
+
26
+ ===Ruby 1.8.7:
27
+ Sequel 2.11.0:: All pass
28
+ Sequel 2.12.0:: All pass
29
+ Sequel 3.:: All pass
30
+
31
+ ===Ruby 1.9.1:
32
+ Sequel 2.11.0:: All pass except session spec failing due to Marshall issues.
33
+ Sequel 2.12.0:: All pass except session spec failing due to Marshall issues.
34
+ Sequel 3.:: All pass except session spec failing due to Marshall issues.
35
+
36
+
37
+ == Connection options
38
+
39
+ Merb Sequel plug-in uses config/database.yml for connection configuration.
40
+
41
+ Options are:
42
+
43
+ * adapter. :sqlite is assumed by default.
44
+ * database, default is "hey_dude_configure_your_database". This should be
45
+ either :memory: or file path for SQLite.
46
+ * db_type: default is nil. Use "mssql" to connect to MSSQL using ODBC.
47
+ * encoding or charset, default is utf8.
48
+ * host. localhost is assumed by default.
49
+ * logger default is Merb.logger
50
+ * password. WARNING: default password is an empty string.
51
+ * socket Use socket to connect to DB.
52
+ * username or user, default is an empty string
53
+
54
+
55
+ == Generators
56
+
57
+ After you install the plug-in, merb-gen can generate Sequel models for you:
58
+
59
+ merb-gen model --orm=sequel Article
60
+
61
+ same with the resources
62
+
63
+ merb-gen resource --orm=sequel Article
64
+
65
+
66
+ <b>Note that if you have specified that you use Sequel in init.rb or environment
67
+ specific init file (for instance, environments/development.rb)
68
+ via use_orm :sequel, you don't need to specify --orm option explicitly when
69
+ using merb-gen</b>.
70
+
71
+
72
+ == Contributors
73
+
74
+ Originally written by Duane Johnson (canadaduane at gmail.com).
75
+
76
+ Contributions by:
77
+ * Wayne E. Seguin
78
+ * Lance Carlson
79
+ * Jacob Dunphy
80
+ * Lori Holden
81
+ * Pavel Kunc
82
+ * e-mac
83
+ * Piotr Usewicz
84
+
85
+ Maintained by Pavel Kunc (pavel.kunc at gmail.com)
data/Rakefile ADDED
@@ -0,0 +1,75 @@
1
+ require 'rubygems'
2
+ require 'rake/gempackagetask'
3
+ require "rake/rdoctask"
4
+ require 'merb-core/tasks/merb_rake_helper'
5
+ require "spec/rake/spectask"
6
+
7
+ ##############################################################################
8
+ # Package && release
9
+ ##############################################################################
10
+ RUBY_FORGE_PROJECT = "merb"
11
+ PROJECT_URL = "http://merbivore.com"
12
+ PROJECT_SUMMARY = "Merb plugin that provides support for Sequel and Sequel::Model"
13
+ PROJECT_DESCRIPTION = PROJECT_SUMMARY
14
+
15
+ GEM_AUTHOR = "Wayne E. Seguin, Lance Carlson, Lori Holden"
16
+ GEM_EMAIL = "wayneeseguin@gmail.com, lancecarlson@gmail.com, email@loriholden.com"
17
+
18
+ GEM_NAME = "merb_sequel"
19
+ PKG_BUILD = ENV['PKG_BUILD'] ? '.' + ENV['PKG_BUILD'] : ''
20
+ GEM_VERSION = (Merb::MORE_VERSION rescue "1.0.1") + PKG_BUILD
21
+
22
+ RELEASE_NAME = "REL #{GEM_VERSION}"
23
+
24
+ spec = Gem::Specification.new do |s|
25
+ s.rubyforge_project = RUBY_FORGE_PROJECT
26
+ s.name = GEM_NAME
27
+ s.version = GEM_VERSION
28
+ s.platform = Gem::Platform::RUBY
29
+ s.has_rdoc = true
30
+ s.extra_rdoc_files = ["README.rdoc", "LICENSE", 'TODO']
31
+ s.summary = PROJECT_SUMMARY
32
+ s.description = PROJECT_DESCRIPTION
33
+ s.author = GEM_AUTHOR
34
+ s.email = GEM_EMAIL
35
+ s.homepage = PROJECT_URL
36
+ s.add_dependency("merb-core", ">= 0.9.9")
37
+ s.add_dependency("sequel", ">= 1.4.0")
38
+ s.files = %w(LICENSE README.rdoc Rakefile TODO Generators) + Dir.glob("{lib}/**/*")
39
+ end
40
+
41
+ Rake::GemPackageTask.new(spec) do |pkg|
42
+ pkg.gem_spec = spec
43
+ end
44
+
45
+ desc "Install the gem"
46
+ task :install do
47
+ Merb::RakeHelper.install(GEM_NAME, :version => GEM_VERSION)
48
+ end
49
+
50
+ desc "Uninstall the gem"
51
+ task :uninstall do
52
+ Merb::RakeHelper.uninstall(GEM_NAME, :version => GEM_VERSION)
53
+ end
54
+
55
+ desc "Create a gemspec file"
56
+ task :gemspec do
57
+ File.open("#{GEM_NAME}.gemspec", "w") do |file|
58
+ file.puts spec.to_ruby
59
+ end
60
+ end
61
+
62
+ desc "Run all examples (or a specific spec with TASK=xxxx)"
63
+ Spec::Rake::SpecTask.new('spec') do |t|
64
+ t.spec_opts = ["-cfs"]
65
+ t.spec_files = begin
66
+ if ENV["TASK"]
67
+ ENV["TASK"].split(',').map { |task| "spec/**/#{task}_spec.rb" }
68
+ else
69
+ FileList['spec/**/*_spec.rb']
70
+ end
71
+ end
72
+ end
73
+
74
+ desc 'Default: run spec examples'
75
+ task :default => 'spec'
data/TODO ADDED
@@ -0,0 +1,2 @@
1
+ TODO:
2
+ * Figure out why using a sqlite3 memory store for the session bombs with stream errors.
@@ -0,0 +1,4 @@
1
+ Merb::Generators::MigrationGenerator.template :migration_sequel, :orm => :sequel do |t|
2
+ t.source = File.dirname(__FILE__) / 'templates/migration/schema/migrations/%file_name%.rb'
3
+ t.destination = "#{destination_directory}/#{file_name}.rb"
4
+ end
@@ -0,0 +1,8 @@
1
+ Merb::Generators::ModelGenerator.template :model_sequel, :orm => :sequel do |t|
2
+ t.source = File.dirname(__FILE__) / "templates/model/app/models/%file_name%.rb"
3
+ t.destination = "app/models" / base_path / "#{file_name}.rb"
4
+ end
5
+
6
+ Merb::Generators::ModelGenerator.invoke :migration, :orm => :sequel do |generator|
7
+ generator.new(destination_root, options.merge(:model => true), file_name, attributes)
8
+ end
@@ -0,0 +1,12 @@
1
+ Merb::Generators::ResourceControllerGenerator.template :controller_sequel, :orm => :sequel do |t|
2
+ t.source = File.dirname(__FILE__) / "templates/resource_controller/app/controllers/%file_name%.rb"
3
+ t.destination = "app/controllers" / base_path / "#{file_name}.rb"
4
+ end
5
+
6
+ [:index, :show, :edit, :new].each do |view|
7
+ Merb::Generators::ResourceControllerGenerator.template "view_#{view}_sequel".to_sym,
8
+ :orm => :sequel, :template_engine => :erb do |t|
9
+ t.source = File.dirname(__FILE__) / "templates/resource_controller/app/views/%file_name%/#{view}.html.erb"
10
+ t.destination = "app/views" / base_path / "#{file_name}/#{view}.html.erb"
11
+ end
12
+ end
@@ -0,0 +1,4 @@
1
+ Merb::Generators::SessionMigrationGenerator.template :session_migration_sequel, :orm => :sequel do |t|
2
+ t.source = File.dirname(__FILE__) / 'templates/session_migration/schema/migrations/%version%_sessions.rb'
3
+ t.destination = "schema/migrations/#{version}_sessions.rb"
4
+ end
@@ -0,0 +1,24 @@
1
+ # For details on Sequel migrations see
2
+ # http://sequel.rubyforge.org/
3
+ # http://sequel.rubyforge.org/rdoc/classes/Sequel/Database.html#M000607
4
+
5
+ class <%= class_name %> < Sequel::Migration
6
+
7
+ def up
8
+ <% if model -%>
9
+ create_table :<%= table_name -%> do
10
+ primary_key :id
11
+ <% attributes.each do |name, type| -%>
12
+ <%= type %> :<%= name %>
13
+ <% end -%>
14
+ end
15
+ <% end -%>
16
+ end
17
+
18
+ def down
19
+ <% if model -%>
20
+ drop_table :<%= table_name %>
21
+ <% end -%>
22
+ end
23
+
24
+ end
@@ -0,0 +1,4 @@
1
+ <% with_modules(modules) do -%>
2
+ class <%= class_name %> < Sequel::Model
3
+ end
4
+ <% end -%>
@@ -0,0 +1,66 @@
1
+ <% with_modules(modules) do -%>
2
+ class <%= class_name %> < Application
3
+ # provides :xml, :yaml, :js
4
+
5
+ # GET /<%= resource_path %>
6
+ def index
7
+ @<%= plural_model %> = <%= model_class_name %>.all
8
+ display @<%= plural_model %>
9
+ end
10
+
11
+ # GET /<%= resource_path %>/:id
12
+ def show
13
+ @<%= singular_model %> = <%= model_class_name %>[params[:id]]
14
+ raise NotFound unless @<%= singular_model %>
15
+ display @<%= singular_model %>
16
+ end
17
+
18
+ # GET /<%= resource_path %>/new
19
+ def new
20
+ only_provides :html
21
+ @<%= singular_model %> = <%= model_class_name %>.new(params[:<%= singular_model %>])
22
+ render
23
+ end
24
+
25
+ # POST /<%= resource_path %>
26
+ def create
27
+ @<%= singular_model %> = <%= model_class_name %>.new(params[:<%= singular_model %>])
28
+ if @<%= singular_model %>.save
29
+ redirect url(:<%= (modules.collect{|m| m.downcase} << singular_model).join("_") %>, @<%= singular_model %>)
30
+ else
31
+ render :new
32
+ end
33
+ end
34
+
35
+ # GET /<%= resource_path %>/:id/edit
36
+ def edit
37
+ only_provides :html
38
+ @<%= singular_model %> = <%= model_class_name %>[params[:id]]
39
+ raise NotFound unless @<%= singular_model %>
40
+ render
41
+ end
42
+
43
+ # PUT /<%= resource_path %>/:id
44
+ def update
45
+ @<%= singular_model %> = <%= model_class_name %>[params[:id]]
46
+ raise NotFound unless @<%= singular_model %>
47
+ if @<%= singular_model %>.update(params[:<%= singular_model %>])
48
+ redirect url(:<%= (modules.collect{|m| m.downcase} << singular_model).join("_") %>, @<%= singular_model %>)
49
+ else
50
+ raise BadRequest
51
+ end
52
+ end
53
+
54
+ # DELETE /<%= resource_path %>/:id
55
+ def destroy
56
+ @<%= singular_model %> = <%= model_class_name %>[params[:id]]
57
+ raise NotFound unless @<%= singular_model %>
58
+ if @<%= singular_model %>.destroy
59
+ redirect url(:<%= (modules.collect{|m| m.downcase} << singular_model).join("_") %>s)
60
+ else
61
+ raise BadRequest
62
+ end
63
+ end
64
+
65
+ end
66
+ <% end -%>
@@ -0,0 +1,3 @@
1
+ <h1><%= class_name %> controller, edit action</h1>
2
+
3
+ <p>Edit this file in <tt>app/views/<%= file_name %>/edit.html.erb</tt></p>
@@ -0,0 +1,3 @@
1
+ <h1><%= class_name %> controller, index action</h1>
2
+
3
+ <p>Edit this file in <tt>app/views/<%= file_name %>/index.html.erb</tt></p>
@@ -0,0 +1,3 @@
1
+ <h1><%= class_name %> controller, new action</h1>
2
+
3
+ <p>Edit this file in <tt>app/views/<%= file_name %>/new.html.erb</tt></p>
@@ -0,0 +1,3 @@
1
+ <h1><%= class_name %> controller, show action</h1>
2
+
3
+ <p>Edit this file in <tt>app/views/<%= file_name %>/show.html.erb</tt></p>
@@ -0,0 +1,16 @@
1
+ class AddSessionsTable < Sequel::Migration
2
+
3
+ def up
4
+ create_table :sessions do
5
+ primary_key :id
6
+ varchar :session_id, :size => 64, :unique => true
7
+ timestamp :created_at
8
+ text :data
9
+ end
10
+ end
11
+
12
+ def down
13
+ drop_table :sessions
14
+ end
15
+
16
+ end
@@ -0,0 +1,80 @@
1
+ require "fileutils"
2
+ require "sequel"
3
+
4
+ module Merb
5
+ module Orms
6
+ module Sequel
7
+
8
+ class << self
9
+
10
+ def config_file() Merb.dir_for(:config) / "database.yml" end
11
+ def sample_dest() Merb.dir_for(:config) / "database.yml.sample" end
12
+ def sample_source() File.dirname(__FILE__) / "database.yml.sample" end
13
+
14
+ def copy_sample_config
15
+ FileUtils.cp sample_source, sample_dest unless File.exists?(sample_dest)
16
+ end
17
+
18
+ def config
19
+ @config ||= begin
20
+ # Convert string keys to symbols
21
+ full_config = Erubis.load_yaml_file(config_file)
22
+ config = (Merb::Plugins.config[:merb_sequel] = {})
23
+ (full_config[Merb.environment.to_sym] || full_config[Merb.environment] || full_config[:development]).each do |key, value|
24
+ config[key.to_sym] = value
25
+ end
26
+ config
27
+ end
28
+ end
29
+
30
+ # Database connects as soon as the gem is loaded
31
+ def connect
32
+ if File.exists?(config_file)
33
+ Merb.logger.info!("Connecting to the '#{config[:database]}' database on '#{config[:host]}' using '#{config[:adapter]}' ...")
34
+ connection = ::Sequel.connect(config_options(config))
35
+ begin
36
+ connection.test_connection
37
+ rescue => e
38
+ Merb.logger.error!("Connection Error: #{e}")
39
+ exit(1)
40
+ end
41
+ connection
42
+ else
43
+ copy_sample_config
44
+ Merb.logger.set_log(STDERR)
45
+ Merb.logger.error! "No database.yml file found at #{config_file}."
46
+ Merb.logger.error! "A sample file was created called #{sample_dest} for you to copy and edit."
47
+ exit(1)
48
+ end
49
+ end
50
+
51
+ def config_options(config = {})
52
+ options = {}
53
+
54
+ # Use SQLite by default
55
+ options[:adapter] = (config[:adapter] || "sqlite")
56
+ # Use localhost as default host
57
+ options[:host] = (config[:host] || "localhost")
58
+ # Default user is an empty string. Both username and user keys are supported.
59
+ options[:user] = (config[:username] || config[:user] || "")
60
+
61
+ options[:password] = config[:password] || ""
62
+
63
+ # Both encoding and charset options are supported, default is utf8
64
+ options[:encoding] = (config[:encoding] || config[:charset] || "utf8")
65
+ # Default database is hey_dude_configure_your_database
66
+ options[:database] = config[:database] || "hey_dude_configure_your_database"
67
+ # MSSQL support
68
+ options[:db_type] = config[:db_type] if config[:db_type]
69
+ options[:socket] = config[:socket] if config[:socket]
70
+ options[:logger] = Merb.logger
71
+ options
72
+ end
73
+
74
+ end
75
+
76
+ end
77
+
78
+ end
79
+
80
+ end
@@ -0,0 +1,18 @@
1
+ ---
2
+ # This is a sample database file for the Sequel ORM
3
+ :development: &defaults
4
+ :adapter: mysql
5
+ :database: sample_development
6
+ :username: the_user
7
+ :password: secrets
8
+ :host: localhost
9
+ :socket: /tmp/mysql.sock
10
+ :encoding: utf8
11
+
12
+ :test:
13
+ <<: *defaults
14
+ :database: sample_test
15
+
16
+ :production:
17
+ <<: *defaults
18
+ :database: sample_production
@@ -0,0 +1,131 @@
1
+ require 'sequel'
2
+ # Load extensions if we use new versions of Sequel
3
+ require 'sequel/extensions/migration' if /^(2.12|3)/ =~ Sequel.version
4
+ require 'merb-core/dispatch/session'
5
+ require 'base64'
6
+
7
+ module Merb
8
+
9
+ Merb::Plugins.config[:merb_sequel][:session_table_name] ||= "sessions"
10
+
11
+ # Default session migration run if a sessions table does not yet exist.
12
+ #
13
+ # Will create a table with a name of 'sessions' by default, or as
14
+ # set by Merb::Plugins.config[:merb_sequel][:session_table_name]
15
+
16
+ class CreateSessionMigration < Sequel::Migration
17
+ def up
18
+ table_name = Merb::Plugins.config[:merb_sequel][:session_table_name].to_sym
19
+ unless table_exists?(table_name)
20
+ puts "Warning: The database did not contain a '#{table_name}' table for sessions."
21
+
22
+ create_table table_name do
23
+ primary_key :id
24
+ varchar :session_id
25
+ text :data
26
+ timestamp :created_at
27
+ end
28
+
29
+ puts "Created '#{table_name}' session table."
30
+ end
31
+ end
32
+ end
33
+
34
+ CreateSessionMigration.apply(Sequel::Model.db, :up)
35
+
36
+ # Sessions stored in Sequel model.
37
+ #
38
+ # To use Sequel based sessions add the following to config/init.rb:
39
+ #
40
+ # Merb::Config[:session_store] = 'sequel'
41
+
42
+ class SequelSessionStore < Sequel::Model(Merb::Plugins.config[:merb_sequel][:session_table_name].to_sym)
43
+
44
+ class << self
45
+
46
+ # ==== Parameters
47
+ # session_id<String>:: ID of the session to retrieve.
48
+ #
49
+ # ==== Returns
50
+ # ContainerSession:: The session corresponding to the ID.
51
+ def retrieve_session(session_id)
52
+ if item = find(:session_id => session_id)
53
+ item.data
54
+ end
55
+ end
56
+
57
+ # ==== Parameters
58
+ # session_id<String>:: ID of the session to set.
59
+ # data<ContainerSession>:: The session to set.
60
+ def store_session(session_id, data)
61
+ if item = find(:session_id => session_id)
62
+ item.update(:data => data)
63
+ else
64
+ create(:session_id => session_id, :data => data, :created_at => Time.now)
65
+ end
66
+ end
67
+
68
+ # ==== Parameters
69
+ # session_id<String>:: ID of the session to delete.
70
+ def delete_session(session_id)
71
+ if item = find(:session_id => session_id)
72
+ item.delete
73
+ end
74
+ end
75
+
76
+ # ==== Returns
77
+ # Integer:: The maximum length of the 'data' column.
78
+ def data_column_size_limit
79
+ 512 # TODO - figure out how much space we actually have
80
+ end
81
+
82
+ alias :create_table! :create_table
83
+ alias :drop_table! :drop_table
84
+ end
85
+
86
+ # Lazy-unserialize session state.
87
+ def data
88
+ @data ||= (@values[:data] ? Marshal.load(@values[:data]) : {})
89
+ end
90
+
91
+ # Virtual attribute writer - override.
92
+ def data=(hsh)
93
+ @data = hsh if hsh.is_a?(Hash)
94
+ end
95
+
96
+ # Has the session been loaded yet?
97
+ def loaded?
98
+ !!@data
99
+ end
100
+
101
+ private
102
+
103
+ def prepare_data_to_save
104
+ @values[:data] = Marshal.dump(self.data)
105
+ if @values[:data].size > self.class.data_column_size_limit
106
+ raise Merb::SessionMixin::SessionOverflow
107
+ end
108
+ end
109
+
110
+ if /^(2.12|3)/ =~ Sequel.version
111
+ def before_save
112
+ super
113
+ prepare_data_to_save
114
+ end
115
+ else
116
+ before_save :prepare_data_to_save
117
+ end
118
+
119
+ end
120
+
121
+ class SequelSession < SessionStoreContainer
122
+
123
+ # The session store type
124
+ self.session_store_type = :sequel
125
+
126
+ # The store object is the model class itself
127
+ self.store = SequelSessionStore
128
+
129
+ end
130
+
131
+ end
@@ -0,0 +1,50 @@
1
+ if defined?(Merb::Plugins)
2
+ Merb::Plugins.config[:merb_sequel] = {}
3
+ require File.join(File.dirname(__FILE__) / "sequel_ext" / "model")
4
+ require File.join(File.dirname(__FILE__) / "merb" / "orms" / "sequel" / "connection")
5
+ Merb::Plugins.add_rakefiles "merb_sequel" / "merbtasks"
6
+
7
+ # Connects to the database and handles session
8
+ #
9
+ # Connects to the database and loads sequel sessions if we use them.
10
+ # Sets router to identify models using Model.pk.
11
+ class Merb::Orms::Sequel::Connect < Merb::BootLoader
12
+ after BeforeAppLoads
13
+
14
+ def self.run
15
+ Merb::Orms::Sequel.connect
16
+ if Merb::Config.session_stores.include?(:sequel)
17
+ Merb.logger.debug "Using Sequel sessions"
18
+ require File.join(File.dirname(__FILE__) / "merb" / "session" / "sequel_session")
19
+ end
20
+
21
+ Merb::Router.root_behavior = Merb::Router.root_behavior.identify(Sequel::Model => :pk)
22
+ end
23
+
24
+ end
25
+
26
+ # Disconnects from DB before starting reloading classes
27
+ #
28
+ # There is a problem with the pg gem driver wich causes infinite loop
29
+ # duing reloading process.
30
+ #
31
+ # Disconnect only when fork_for_class_relaod is set and we're not in
32
+ # testing mode.
33
+ class Merb::BootLoader::DisconnectBeforeStartTransaction < Merb::BootLoader
34
+ before LoadClasses
35
+
36
+ def self.run
37
+ if Merb::Config[:fork_for_class_load] && !Merb.testing?
38
+ Merb.logger.debug "Disconnecting database connection before starting transaction."
39
+ ::Sequel::DATABASES.each { |db| db.disconnect }
40
+ end
41
+ end
42
+ end
43
+
44
+ # Load generators
45
+ generators = File.join(File.dirname(__FILE__), 'generators')
46
+ Merb.add_generators generators / :migration
47
+ Merb.add_generators generators / :model
48
+ Merb.add_generators generators / :resource_controller
49
+ Merb.add_generators generators / :session_migration
50
+ end
@@ -0,0 +1,83 @@
1
+ require "fileutils"
2
+
3
+ namespace :sequel do
4
+
5
+ desc "Minimalistic Sequel environment"
6
+ task :sequel_env do
7
+ Merb::Orms::Sequel.connect
8
+ end
9
+
10
+ namespace :db do
11
+
12
+ desc "Perform migration using migrations in schema/migrations"
13
+ task :migrate => :sequel_env do
14
+ require 'sequel/extensions/migration' if /^(2.12|3)/ =~ Sequel.version
15
+ Sequel::Migrator.apply(Sequel::Model.db, "schema/migrations", ENV["VERSION"] ? ENV["VERSION"].to_i : nil)
16
+ end
17
+
18
+ desc "Drop all tables"
19
+ task :drop_tables => :sequel_env do
20
+ Sequel::Model.db.drop_table *Sequel::Model.db.tables
21
+ end
22
+
23
+ desc "Drop all tables and perform migrations"
24
+ task :reset => [:sequel_env, :drop_tables, :migrate]
25
+
26
+ desc "Truncate all tables in database"
27
+ task :truncate => :sequel_env do
28
+ Sequel::Model.db << "TRUNCATE #{db.tables.join(', ')} CASCADE;"
29
+ end
30
+
31
+ desc "Create the database according to the config from the database.yaml. Use [username,password] if you need another user to connect to DB than in config."
32
+ task :create, :username, :password do |t,args|
33
+ config = Merb::Orms::Sequel.config
34
+ puts "Creating database '#{config[:database]}'"
35
+ case config[:adapter]
36
+ when 'postgres'
37
+ if args.username.nil?
38
+ `createdb -U #{config[:username]} #{config[:database]}`
39
+ else
40
+ `createdb -U #{args.username} -O #{config[:username]} #{config[:database]}`
41
+ end
42
+ when 'mysql'
43
+ `mysqladmin -u #{config[:username]} #{config[:password] ? "-p'#{config[:password]}'" : ''} create #{config[:database]}`
44
+ else
45
+ raise "Adapter #{config[:adapter]} not supported for creating databases yet."
46
+ end
47
+ end
48
+
49
+ desc "Drop the database for enviroment from database.yaml (postgres only). Use [username,password] if you need another user to connect to DB than in config."
50
+ task :drop, :username, :password do |t,args|
51
+ config = Merb::Orms::Sequel.config
52
+ user = args.username.nil? ? config[:username]: args.username
53
+ puts "Droping database '#{config[:database]}'"
54
+ case config[:adapter]
55
+ when 'postgres'
56
+ `dropdb -U #{user} #{config[:database]}`
57
+ else
58
+ raise "Adapter #{config[:adapter]} not supported for dropping databases yet."
59
+ end
60
+ end
61
+ end
62
+
63
+ namespace :sessions do
64
+
65
+ desc "Creates session migration"
66
+ task :create => :sequel_env do
67
+ migration_exists = Dir[File.join(Merb.root,"schema", "migrations", "*.rb")].detect{ |f| f =~ /database_sessions\.rb/ }
68
+ if migration_exists
69
+ puts "\nThe Session Migration File already exists\n\n"
70
+ else
71
+ sh %{merb-gen session_migration}
72
+ end
73
+ end
74
+
75
+ desc "Clears sessions"
76
+ task :clear => :sequel_env do
77
+ table_name = ((Merb::Plugins.config[:sequel] || {})[:session_table_name] || "sessions")
78
+ Sequel::Model.db.connect.execute("DELETE FROM #{table_name}")
79
+ end
80
+
81
+ end
82
+
83
+ end
@@ -0,0 +1,7 @@
1
+ module Sequel
2
+ class Model
3
+ def new_record?
4
+ self.new?
5
+ end
6
+ end
7
+ end
metadata ADDED
@@ -0,0 +1,118 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pk-merb_sequel
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Wayne E. Seguin, Lance Carlson, Lori Holden
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-05-04 00:00:00 -07:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: merb-core
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 0.9.9
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: sequel
27
+ type: :runtime
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 1.4.0
34
+ version:
35
+ description: Merb plugin that provides support for Sequel and Sequel::Model
36
+ email: wayneeseguin@gmail.com, lancecarlson@gmail.com, email@loriholden.com
37
+ executables: []
38
+
39
+ extensions: []
40
+
41
+ extra_rdoc_files:
42
+ - README.rdoc
43
+ - LICENSE
44
+ - TODO
45
+ files:
46
+ - LICENSE
47
+ - README.rdoc
48
+ - Rakefile
49
+ - TODO
50
+ - Generators
51
+ - lib/generators
52
+ - lib/generators/migration.rb
53
+ - lib/generators/model.rb
54
+ - lib/generators/resource_controller.rb
55
+ - lib/generators/session_migration.rb
56
+ - lib/generators/templates
57
+ - lib/generators/templates/migration
58
+ - lib/generators/templates/migration/schema
59
+ - lib/generators/templates/migration/schema/migrations
60
+ - lib/generators/templates/migration/schema/migrations/%file_name%.rb
61
+ - lib/generators/templates/model
62
+ - lib/generators/templates/model/app
63
+ - lib/generators/templates/model/app/models
64
+ - lib/generators/templates/model/app/models/%file_name%.rb
65
+ - lib/generators/templates/resource_controller
66
+ - lib/generators/templates/resource_controller/app
67
+ - lib/generators/templates/resource_controller/app/controllers
68
+ - lib/generators/templates/resource_controller/app/controllers/%file_name%.rb
69
+ - lib/generators/templates/resource_controller/app/views
70
+ - lib/generators/templates/resource_controller/app/views/%file_name%
71
+ - lib/generators/templates/resource_controller/app/views/%file_name%/edit.html.erb
72
+ - lib/generators/templates/resource_controller/app/views/%file_name%/index.html.erb
73
+ - lib/generators/templates/resource_controller/app/views/%file_name%/new.html.erb
74
+ - lib/generators/templates/resource_controller/app/views/%file_name%/show.html.erb
75
+ - lib/generators/templates/session_migration
76
+ - lib/generators/templates/session_migration/schema
77
+ - lib/generators/templates/session_migration/schema/migrations
78
+ - lib/generators/templates/session_migration/schema/migrations/%version%_sessions.rb
79
+ - lib/merb
80
+ - lib/merb/orms
81
+ - lib/merb/orms/sequel
82
+ - lib/merb/orms/sequel/connection.rb
83
+ - lib/merb/orms/sequel/database.yml.sample
84
+ - lib/merb/session
85
+ - lib/merb/session/sequel_session.rb
86
+ - lib/merb_sequel
87
+ - lib/merb_sequel/merbtasks.rb
88
+ - lib/merb_sequel.rb
89
+ - lib/sequel_ext
90
+ - lib/sequel_ext/model.rb
91
+ has_rdoc: true
92
+ homepage: http://merbivore.com
93
+ post_install_message:
94
+ rdoc_options: []
95
+
96
+ require_paths:
97
+ - lib
98
+ required_ruby_version: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: "0"
103
+ version:
104
+ required_rubygems_version: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - ">="
107
+ - !ruby/object:Gem::Version
108
+ version: "0"
109
+ version:
110
+ requirements: []
111
+
112
+ rubyforge_project: merb
113
+ rubygems_version: 1.2.0
114
+ signing_key:
115
+ specification_version: 3
116
+ summary: Merb plugin that provides support for Sequel and Sequel::Model
117
+ test_files: []
118
+