elucid-merb_activerecord 1.1.0.pre

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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,20 @@
1
+ Copyright (c) 2007 Duane Johnson
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README ADDED
@@ -0,0 +1,7 @@
1
+ merb_active_record
2
+ =================
3
+
4
+ A plugin for the Merb framework that provides active record access
5
+
6
+ After you install the plugin, you have access to the ar_migration generator in your merb projects
7
+ example: /merb/root/script/generate ar_migration new_migration
data/Rakefile ADDED
@@ -0,0 +1,55 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ # Load this library's version information
5
+ require File.expand_path('../lib/merb_activerecord/version', __FILE__)
6
+
7
+ begin
8
+
9
+ gem 'jeweler', '~> 1.4'
10
+ require 'jeweler'
11
+
12
+ Jeweler::Tasks.new do |gemspec|
13
+
14
+ gemspec.version = Merb::ActiveRecord::VERSION
15
+
16
+ gemspec.name = "elucid-merb_activerecord"
17
+ gemspec.description = "Merb plugin that provides ActiveRecord support"
18
+ gemspec.summary = "This plugin allows seamless integration of the ActiveRecord ORM with merb"
19
+
20
+ gemspec.authors = [ "Duane Johnson" ]
21
+ gemspec.email = "canadaduane@gmail.com"
22
+ gemspec.homepage = "http://github.com/merb/merb_activerecord"
23
+
24
+ gemspec.files = %w(Generators LICENSE Rakefile README TODO) + Dir['{lib,spec}/**/*']
25
+
26
+ # Runtime dependencies
27
+ gemspec.add_dependency 'merb-core', '~> 1.1.1'
28
+ gemspec.add_dependency 'activerecord', '>= 2.3.2'
29
+
30
+ # Development dependencies
31
+ gemspec.add_development_dependency 'rspec', '>= 1.2.9'
32
+
33
+ end
34
+
35
+ Jeweler::GemcutterTasks.new
36
+
37
+ rescue LoadError
38
+ puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
39
+ end
40
+
41
+ require 'spec/rake/spectask'
42
+ Spec::Rake::SpecTask.new(:spec) do |spec|
43
+ spec.spec_opts << '--options' << 'spec/spec.opts' if File.exists?('spec/spec.opts')
44
+ spec.libs << 'lib' << 'spec'
45
+ spec.spec_files = FileList['spec/**/*_spec.rb']
46
+ end
47
+
48
+ Spec::Rake::SpecTask.new(:rcov) do |spec|
49
+ spec.libs << 'lib' << 'spec'
50
+ spec.pattern = 'spec/**/*_spec.rb'
51
+ spec.rcov = true
52
+ end
53
+
54
+ desc 'Default: run spec examples'
55
+ task :default => 'spec'
data/TODO ADDED
@@ -0,0 +1,5 @@
1
+ TODO:
2
+ Fix LICENSE with your name
3
+ Fix Rakefile with your name and contact info
4
+ Add your code to lib/merb_active_record.rb
5
+ Add your Merb rake tasks to lib/merb_active_record/merbtasks.rb
@@ -0,0 +1,342 @@
1
+ namespace :db do
2
+
3
+ task :merb_start do
4
+ Merb.start :adapter => 'runner', :environment => ENV['MERB_ENV'] || 'development', :log_file => Merb::Config[:log_file]
5
+ end
6
+
7
+ namespace :create do
8
+ desc 'Create all the local databases defined in config/database.yml'
9
+ task :all => :merb_start do
10
+ Merb::Orms::ActiveRecord.configurations.each_value do |config|
11
+ create_local_database(config)
12
+ end
13
+ end
14
+ end
15
+
16
+ desc 'Create the local database defined in config/database.yml for the current Merb.environment'
17
+ task :create => :merb_start do
18
+ create_local_database(Merb::Orms::ActiveRecord.configurations[Merb.environment.to_sym])
19
+ end
20
+
21
+ def create_local_database(config)
22
+ # Only connect to local databases
23
+ if config[:host] == 'localhost' || config[:host].blank?
24
+ begin
25
+ ActiveRecord::Base.establish_connection(config)
26
+ ActiveRecord::Base.connection
27
+ rescue
28
+ case config[:adapter]
29
+ when 'mysql'
30
+ @charset = ENV['CHARSET'] || 'utf8'
31
+ @collation = ENV['COLLATION'] || 'utf8_general_ci'
32
+ begin
33
+ ActiveRecord::Base.establish_connection(config.merge({:database => nil}))
34
+ ActiveRecord::Base.connection.create_database(config[:database], {:charset => (config[:charset] || @charset), :collation => (config[:collation] || @collation)})
35
+ ActiveRecord::Base.establish_connection(config)
36
+ puts "MySQL #{config[:database]} database successfully created"
37
+ rescue
38
+ $stderr.puts "Couldn't create database for #{config.inspect}, charset: #{config[:charset] || @charset}, collation: #{config[:collation] || @collation} (if you set the charset manually, make sure you have a matching collation)"
39
+ end
40
+ when 'postgresql'
41
+ `createdb "#{config[:database]}" -E utf8`
42
+ when 'sqlite'
43
+ `sqlite "#{config[:database]}"`
44
+ when 'sqlite3'
45
+ `sqlite3 "#{config[:database]}"`
46
+ end
47
+ else
48
+ puts "#{config[:database]} already exists"
49
+ end
50
+ else
51
+ puts "This task only creates local databases. #{config[:database]} is on a remote host."
52
+ end
53
+ end
54
+
55
+ def drop_database(config)
56
+ begin
57
+ ActiveRecord::Base.establish_connection(config)
58
+ ActiveRecord::Base.connection
59
+ rescue
60
+ puts "could not connect to #{config[:database]}, database not dropped"
61
+ else
62
+ case config[:adapter]
63
+ when 'mysql'
64
+ ActiveRecord::Base.connection.drop_database config[:database]
65
+ when /^sqlite/
66
+ FileUtils.rm(File.join(Merb.root, config[:database]))
67
+ when 'postgresql'
68
+ ActiveRecord::Base.clear_active_connections!
69
+ `dropdb "#{config[:database]}"`
70
+ end
71
+ end
72
+ end
73
+
74
+ def local_database?(config, &block)
75
+ if %w( 127.0.0.1 localhost ).include?(config[:host]) || config[:host].blank?
76
+ yield
77
+ else
78
+ puts "This task only modifies local databases. #{config[:database]} is on a remote host."
79
+ end
80
+ end
81
+
82
+ namespace :drop do
83
+ desc 'Drops all the local databases defined in config/database.yml'
84
+ task :all => :merb_start do
85
+ Merb::Orms::ActiveRecord.configurations.each_value do |config|
86
+ # Skip entries that don't have a database key
87
+ next unless config[:database]
88
+ # Only connect to local databases
89
+ local_database?(config) { drop_database(config) }
90
+ end
91
+ end
92
+ end
93
+
94
+ desc 'Drops the database for the current environment (set MERB_ENV to target another environment)'
95
+ task :drop => :merb_start do
96
+ config = Merb::Orms::ActiveRecord.configurations[Merb.environment.to_sym]
97
+ begin
98
+ drop_database(config)
99
+ rescue Exception => e
100
+ puts "#{e.inspect} - #{config['database']} might have been already dropped"
101
+ end
102
+ end
103
+
104
+ desc "Migrate the database through scripts in schema/migrations. Target specific version with VERSION=x"
105
+ task :migrate => :merb_start do
106
+ config = Merb::Orms::ActiveRecord.configurations[Merb.environment.to_sym]
107
+ ActiveRecord::Base.establish_connection(config)
108
+ ActiveRecord::Migrator.migrate("schema/migrations/", ENV["VERSION"] ? ENV["VERSION"].to_i : nil)
109
+ Rake::Task["db:schema:dump"].invoke if ActiveRecord::Base.schema_format == :ruby
110
+ end
111
+
112
+ namespace :migrate do
113
+ desc 'Rollbacks the database one migration and re migrate up. If you want to rollback more than one step, define STEP=x'
114
+ task :redo => [ 'db:rollback', 'db:migrate' ]
115
+
116
+ desc 'Resets your database using your migrations for the current environment'
117
+ task :reset => ["db:drop", "db:create", "db:migrate"]
118
+ end
119
+
120
+ desc 'Drops and recreates the database from db/schema.rb for the current environment.'
121
+ task :reset => ['db:drop', 'db:create', 'db:schema:load']
122
+
123
+ desc 'Rolls the schema back to the previous version. Specify the number of steps with STEP=n'
124
+ task :rollback => :merb_start do
125
+ step = ENV['STEP'] ? ENV['STEP'].to_i : 1
126
+ version = ActiveRecord::Migrator.current_version - step
127
+ ActiveRecord::Migrator.migrate('schema/migrations/', version)
128
+ end
129
+
130
+ desc "Raises an error if there are pending migrations"
131
+ task :abort_if_pending_migrations => :merb_start do
132
+ if defined? ActiveRecord
133
+ pending_migrations = ActiveRecord::Migrator.new(:up, 'schema/migrations').pending_migrations
134
+
135
+ if pending_migrations.any?
136
+ puts "You have #{pending_migrations.size} pending migrations:"
137
+ pending_migrations.each do |pending_migration|
138
+ puts ' %4d %s' % [pending_migration.version, pending_migration.name]
139
+ end
140
+ abort "Run `rake db:migrate` to update your database then try again."
141
+ end
142
+ end
143
+ end
144
+
145
+ desc "Retrieves the charset for the current environment's database"
146
+ task :charset => :merb_start do
147
+ config = Merb::Orms::ActiveRecord.configurations[Merb.environment.to_sym]
148
+ case config[:adapter]
149
+ when 'mysql'
150
+ ActiveRecord::Base.establish_connection(config)
151
+ puts ActiveRecord::Base.connection.charset
152
+ else
153
+ puts 'sorry, your database adapter is not supported yet, feel free to submit a patch'
154
+ end
155
+ end
156
+
157
+ desc "Retrieves the collation for the current environment's database"
158
+ task :collation => :merb_start do
159
+ config = Merb::Orms::ActiveRecord.configurations[Merb.environment.to_sym]
160
+ case config[:adapter]
161
+ when 'mysql'
162
+ ActiveRecord::Base.establish_connection(config)
163
+ puts ActiveRecord::Base.connection.collation
164
+ else
165
+ puts 'sorry, your database adapter is not supported yet, feel free to submit a patch'
166
+ end
167
+ end
168
+
169
+ desc "Retrieves the current schema version number"
170
+ task :version => :merb_start do
171
+ puts "Current version: #{ActiveRecord::Migrator.current_version}"
172
+ end
173
+
174
+ namespace :fixtures do
175
+ desc "Load fixtures into the current environment's database. Load specific fixtures using FIXTURES=x,y"
176
+ task :load => :merb_start do
177
+ require 'active_record/fixtures'
178
+ config = Merb::Orms::ActiveRecord.configurations[Merb.environment.to_sym]
179
+ ActiveRecord::Base.establish_connection(config)
180
+ test_folder = (Merb.test_framework_generator_scope == :rspec) ? 'spec' : 'test'
181
+ (ENV['FIXTURES'] ? ENV['FIXTURES'].split(/,/) : Dir.glob(File.join(Merb.root, test_folder, 'fixtures', '*.{yml,csv}'))).each do |fixture_file|
182
+ Fixtures.create_fixtures(File.join(test_folder, 'fixtures'), File.basename(fixture_file, '.*'))
183
+ end
184
+ end
185
+ end
186
+
187
+ namespace :schema do
188
+ desc 'Create a schema/schema.rb file that can be portably used against any DB supported by AR'
189
+ task :dump => :merb_start do
190
+ require 'active_record/schema_dumper'
191
+ File.open(ENV['SCHEMA'] || "schema/schema.rb", "w") do |file|
192
+ ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, file)
193
+ end
194
+ end
195
+
196
+ desc "Load a schema.rb file into the database"
197
+ task :load => :merb_start do
198
+ config = Merb::Orms::ActiveRecord.configurations[Merb.environment.to_sym]
199
+ ActiveRecord::Base.establish_connection(config)
200
+ file = ENV['SCHEMA'] || "schema/schema.rb"
201
+ load(file)
202
+ end
203
+ end
204
+
205
+ namespace :structure do
206
+ desc "Dump the database structure to a SQL file"
207
+ task :dump => :merb_start do
208
+ config = Merb::Orms::ActiveRecord.configurations[Merb.environment.to_sym]
209
+ case config[:adapter]
210
+ when "mysql", "oci", "oracle"
211
+ ActiveRecord::Base.establish_connection(config)
212
+ File.open("schema/#{Merb.environment}_structure.sql", "w+") { |f| f << ActiveRecord::Base.connection.structure_dump }
213
+ when "postgresql"
214
+ ENV['PGHOST'] = config[:host] if config[:host]
215
+ ENV['PGPORT'] = config[:port].to_s if config[:port]
216
+ ENV['PGPASSWORD'] = config[:password].to_s if config[:password]
217
+ search_path = config[:schema_search_path]
218
+ search_path = "--schema=#{search_path}" if search_path
219
+ `pg_dump -i -U "#{config[:username]}" -s -x -O -f schema/#{Merb.environment}_structure.sql #{search_path} #{config[:database]}`
220
+ raise "Error dumping database" if $?.exitstatus == 1
221
+ when "sqlite", "sqlite3"
222
+ dbfile = config[:database] || config[:dbfile]
223
+ `#{config[:adapter]} #{dbfile} .schema > schema/#{Merb.environment}_structure.sql`
224
+ when "sqlserver"
225
+ `scptxfr /s #{config[:host]} /d #{config[:database]} /I /f schema\\#{Merb.environment}_structure.sql /q /A /r`
226
+ `scptxfr /s #{config[:host]} /d #{config[:database]} /I /F schema\ /q /A /r`
227
+ when "firebird"
228
+ set_firebird_env(config)
229
+ db_string = firebird_db_string(config)
230
+ sh "isql -a #{db_string} > schema/#{Merb.environment}_structure.sql"
231
+ else
232
+ raise "Task not supported by '#{config[:adapter]}'"
233
+ end
234
+
235
+ if ActiveRecord::Base.connection.supports_migrations?
236
+ File.open("schema/#{Merb.environment}_structure.sql", "a") { |f| f << ActiveRecord::Base.connection.dump_schema_information }
237
+ end
238
+ end
239
+ end
240
+
241
+ namespace :test do
242
+
243
+ desc "Recreate the test database from the current environment's database schema"
244
+ task :clone => %w(db:schema:dump db:test:purge) do
245
+ ActiveRecord::Base.establish_connection(Merb::Orms::ActiveRecord.configurations[:test])
246
+ ActiveRecord::Schema.verbose = false
247
+ Merb.environment = 'test'
248
+ Rake::Task["db:schema:load"].invoke
249
+ end
250
+
251
+ desc "Recreate the test databases from the development structure"
252
+ task :clone_structure => [ "db:structure:dump", "db:test:purge" ] do
253
+ config = Merb::Orms::ActiveRecord.configurations[:test]
254
+ case config[:adapter]
255
+ when "mysql"
256
+ ActiveRecord::Base.establish_connection(config)
257
+ ActiveRecord::Base.connection.execute('SET foreign_key_checks = 0')
258
+ IO.readlines("schema/#{Merb.environment}_structure.sql").join.split("\n\n").each do |table|
259
+ ActiveRecord::Base.connection.execute(table)
260
+ end
261
+ when "postgresql"
262
+ ENV['PGHOST'] = config[:host] if config[:host]
263
+ ENV['PGPORT'] = config[:port].to_s if config[:port]
264
+ ENV['PGPASSWORD'] = config[:password].to_s if config[:password]
265
+ `psql -U "#{config[:username]}" -f schema/#{Merb.environment}_structure.sql #{config[:database]}`
266
+ when "sqlite", "sqlite3"
267
+ dbfile = config[:database] ||config[:dbfile]
268
+ `#{config[:adapter]} #{dbfile} < schema/#{Merb.environment}_structure.sql`
269
+ when "sqlserver"
270
+ `osql -E -S #{config[:host]} -d #{config[:database]} -i schema\\#{Merb.environment}_structure.sql`
271
+ when "oci", "oracle"
272
+ ActiveRecord::Base.establish_connection(:test)
273
+ IO.readlines("schema/#{Merb.environment}_structure.sql").join.split(";\n\n").each do |ddl|
274
+ ActiveRecord::Base.connection.execute(ddl)
275
+ end
276
+ when "firebird"
277
+ set_firebird_env(config)
278
+ db_string = firebird_db_string(config)
279
+ sh "isql -i schema/#{Merb.environment}_structure.sql #{db_string}"
280
+ else
281
+ raise "Task not supported by '#{config[:adapter]}'"
282
+ end
283
+ end
284
+
285
+ desc "Empty the test database"
286
+ task :purge => :merb_start do
287
+ config = Merb::Orms::ActiveRecord.configurations[:test]
288
+ puts "config => #{config.inspect}"
289
+ case config[:adapter]
290
+ when "mysql"
291
+ ActiveRecord::Base.establish_connection(config)
292
+ ActiveRecord::Base.connection.recreate_database(config[:database])
293
+ when "postgresql"
294
+ ENV['PGHOST'] = config[:host] if config[:host]
295
+ ENV['PGPORT'] = config[:port].to_s if config[:port]
296
+ ENV['PGPASSWORD'] = config[:password].to_s if config[:password]
297
+ enc_option = "-E #{config[:encoding]}" if config[:encoding]
298
+ ActiveRecord::Base.clear_active_connections!
299
+ `dropdb -U "#{config[:username]}" #{config[:database]}`
300
+ `createdb #{enc_option} -U "#{config[:username]}" #{config[:database]}`
301
+ when "sqlite","sqlite3"
302
+ dbfile = config[:database] || config[:dbfile]
303
+ File.delete(dbfile) if File.exist?(dbfile)
304
+ when "sqlserver"
305
+ config ActiveRecord::Base.establish_connection(:test)
306
+ ActiveRecord::Base.connection.structure_drop.split(";\n\n").each do |ddl|
307
+ ActiveRecord::Base.connection.execute(ddl)
308
+ end
309
+ when "firebird"
310
+ ActiveRecord::Base.establish_connection(:test)
311
+ ActiveRecord::Base.connection.recreate_database!
312
+ else
313
+ raise "Task not supported by '#{config[:adapter]}'"
314
+ end
315
+ end
316
+
317
+ desc "Prepare the test database and load the schema"
318
+ task :prepare do
319
+ if defined?(ActiveRecord::Base) && !Merb::Orms::ActiveRecord.configurations.blank?
320
+ Rake::Task[{ :sql => "db:test:clone_structure", :ruby => "db:test:clone" }[ActiveRecord::Base.schema_format]].invoke
321
+ end
322
+ end
323
+ end
324
+
325
+ namespace :sessions do
326
+ desc "Clear the sessions table"
327
+ task :clear => :merb_start do
328
+ session_table = 'session'
329
+ session_table = Inflector.pluralize(session_table) if ActiveRecord::Base.pluralize_table_names
330
+ ActiveRecord::Base.connection.execute "DELETE FROM #{session_table}"
331
+ end
332
+ end
333
+ end
334
+
335
+ def set_firebird_env(config)
336
+ ENV["ISC_USER"] = config["username"].to_s if config["username"]
337
+ ENV["ISC_PASSWORD"] = config["password"].to_s if config["password"]
338
+ end
339
+
340
+ def firebird_db_string(config)
341
+ FireRuby::Database.db_string_for(config.symbolize_keys)
342
+ end
@@ -0,0 +1,4 @@
1
+ Merb::Generators::MigrationGenerator.template :migration_activerecord, :orm => :activerecord 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_activerecord, :orm => :activerecord 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 => :activerecord 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_activerecord, :orm => :activerecord 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}_activerecord".to_sym,
8
+ :orm => :activerecord, :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_activerecord, :orm => :activerecord do |t|
2
+ t.source = File.dirname(__FILE__) / 'templates/session_migration/schema/migrations/%version%_database_sessions.rb'
3
+ t.destination = "schema/migrations/#{version}_database_sessions.rb"
4
+ end
@@ -0,0 +1,19 @@
1
+ class <%= class_name %> < ActiveRecord::Migration
2
+ def self.up
3
+ <% if model -%>
4
+ create_table :<%= table_name %> do |t|
5
+ <% attributes.each do |type, name| -%>
6
+ t.<%= name %> :<%= type %>
7
+ <% end -%>
8
+
9
+ t.timestamps
10
+ end
11
+ <% end -%>
12
+ end
13
+
14
+ def self.down
15
+ <% if model -%>
16
+ drop_table :<%= table_name %>
17
+ <% end -%>
18
+ end
19
+ end
@@ -0,0 +1,4 @@
1
+ <% with_modules(modules) do -%>
2
+ class <%= class_name %> < ActiveRecord::Base
3
+ end
4
+ <% end -%>
@@ -0,0 +1,64 @@
1
+ class <%= class_name %> < Application
2
+ # provides :xml, :yaml, :js
3
+
4
+ # GET /<%= resource_path %>
5
+ def index
6
+ @<%= plural_model %> = <%= model_class_name %>.find(:all)
7
+ display @<%= plural_model %>
8
+ end
9
+
10
+ # GET /<%= resource_path %>/:id
11
+ def show
12
+ @<%= singular_model %> = <%= model_class_name %>.find_by_id(params[:id])
13
+ raise NotFound unless @<%= singular_model %>
14
+ display @<%= singular_model %>
15
+ end
16
+
17
+ # GET /<%= resource_path %>/new
18
+ def new
19
+ only_provides :html
20
+ @<%= singular_model %> = <%= model_class_name %>.new(params[:<%= singular_model %>])
21
+ render
22
+ end
23
+
24
+ # POST /<%= resource_path %>
25
+ def create
26
+ @<%= singular_model %> = <%= model_class_name %>.new(params[:<%= singular_model %>])
27
+ if @<%= singular_model %>.save
28
+ redirect url(:<%= (modules.collect{|m| m.downcase} << singular_model).join("_") %>, @<%= singular_model %>)
29
+ else
30
+ render :new
31
+ end
32
+ end
33
+
34
+ # GET /<%= resource_path %>/:id/edit
35
+ def edit
36
+ only_provides :html
37
+ @<%= singular_model %> = <%= model_class_name %>.find_by_id(params[:id])
38
+ raise NotFound unless @<%= singular_model %>
39
+ render
40
+ end
41
+
42
+ # PUT /<%= resource_path %>/:id
43
+ def update
44
+ @<%= singular_model %> = <%= model_class_name %>.find_by_id(params[:id])
45
+ raise NotFound unless @<%= singular_model %>
46
+ if @<%= singular_model %>.update_attributes(params[:<%= singular_model %>])
47
+ redirect url(:<%= (modules.collect{|m| m.downcase} << singular_model).join("_") %>, @<%= singular_model %>)
48
+ else
49
+ raise BadRequest
50
+ end
51
+ end
52
+
53
+ # DELETE /<%= resource_path %>/:id
54
+ def destroy
55
+ @<%= singular_model %> = <%= model_class_name %>.find_by_id(params[:id])
56
+ raise NotFound unless @<%= singular_model %>
57
+ if @<%= singular_model %>.destroy
58
+ redirect url(:<%= (modules.collect{|m| m.downcase} << plural_model).join("_") %>)
59
+ else
60
+ raise BadRequest
61
+ end
62
+ end
63
+
64
+ 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,15 @@
1
+ class DatabaseSessions < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :sessions do |t|
4
+ t.column :session_id, :string
5
+ t.column :data, :text
6
+ t.column :created_at, :datetime
7
+ end
8
+ add_index :sessions, :session_id
9
+ end
10
+
11
+ def self.down
12
+ remove_index :sessions, :session_id
13
+ drop_table :sessions
14
+ end
15
+ end
@@ -0,0 +1,6 @@
1
+ # This is the default behavior for ActiveRecord when used
2
+ # in conjunction with ActionPack's request handling cycle.
3
+ # TODO write test
4
+ Merb::Controller.after do
5
+ ActiveRecord::Base.clear_active_connections!
6
+ end
@@ -0,0 +1,77 @@
1
+ require 'fileutils'
2
+
3
+ module Merb
4
+ module Orms
5
+ module ActiveRecord
6
+
7
+ # Start a transaction.
8
+ #
9
+ # Used by Merb::Rack::Console#open_sandbox!
10
+ def self.open_sandbox!
11
+ ::ActiveRecord::Base.send :increment_open_transactions
12
+ ::ActiveRecord::Base.connection.begin_db_transaction
13
+ end
14
+
15
+ # Rollback a transaction.
16
+ #
17
+ # Used by Merb::Rack::Console#close_sandbox!
18
+ def self.close_sandbox!
19
+ ::ActiveRecord::Base.connection.rollback_db_transaction
20
+ ::ActiveRecord::Base.send :decrement_open_transactions
21
+ end
22
+
23
+ class << self
24
+ def config_file() Merb.dir_for(:config) / "database.yml" end
25
+ def sample_dest() Merb.dir_for(:config) / "database.yml.sample" end
26
+ def sample_source() File.dirname(__FILE__) / "database.yml.sample" end
27
+
28
+ def copy_sample_config
29
+ FileUtils.cp sample_source, sample_dest unless File.exists?(sample_dest)
30
+ end
31
+
32
+ def config
33
+ #If Merb#runs_like specifies a differnt db env, use it.
34
+ env_sym = (Merb.environment_info.nil?) ?
35
+ Merb.environment.to_sym :
36
+ Merb.environment_info[:db_env].to_sym
37
+
38
+ raise ArgumentError, "missing environment :#{Merb.environment} in config file #{config_file}" unless configurations.key?(env_sym)
39
+ @config ||= (Merb::Plugins.config[:merb_active_record] = configurations[env_sym])
40
+ end
41
+
42
+ def configurations
43
+ @configurations ||=
44
+ begin
45
+ #A proc that will recursively intern(a.k.a symbolize) the keys of the hash
46
+ intern_keys = lambda { |x|
47
+ x.inject({}) do |y, (k,v)|
48
+ y[k.to_sym || k] = v.is_a?(Hash) ? intern_keys.call(v) : v
49
+ y
50
+ end
51
+ }
52
+ intern_keys.call(Erubis.load_yaml_file(config_file))
53
+ end
54
+ end
55
+
56
+ # Database connects as soon as the gem is loaded
57
+ def connect
58
+ if File.exists?(config_file)
59
+ Merb.logger.info!("Connecting to database...")
60
+
61
+ Thread.new{ loop{ sleep(60*60); ::ActiveRecord::Base.verify_active_connections! } }
62
+
63
+ ::ActiveRecord::Base.logger = Merb.logger
64
+ ::ActiveRecord::Base.configurations = configurations
65
+ ::ActiveRecord::Base.establish_connection config
66
+ else
67
+ copy_sample_config
68
+ Merb.logger.error! "No database.yml file found in #{Merb.root}/config."
69
+ Merb.logger.error! "A sample file was created called database.yml.sample for you to copy and edit."
70
+ exit(1)
71
+ end
72
+ end
73
+
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,21 @@
1
+ ---
2
+ # This is a sample database file for the ActiveRecord 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
19
+
20
+ :rake:
21
+ <<: *defaults
@@ -0,0 +1,65 @@
1
+ require 'merb-core/dispatch/session'
2
+ require 'active_record'
3
+ require 'base64'
4
+
5
+ module Merb
6
+
7
+ # Sessions stored in ActiveRecord model.
8
+ #
9
+ # To use ActiveRecord based sessions add the following to config/init.rb:
10
+ #
11
+ # Merb::Config[:session_store] = 'activerecord'
12
+
13
+ class ActiveRecordSessionStore < ::ActiveRecord::Base
14
+
15
+ table_name = (Merb::Plugins.config[:merb_active_record][:session_table_name] || "sessions")
16
+
17
+ set_table_name table_name
18
+
19
+ serialize :data
20
+
21
+ class << self
22
+
23
+ # ==== Parameters
24
+ # session_id<String>:: ID of the session to retrieve.
25
+ #
26
+ # ==== Returns
27
+ # ContainerSession:: The session corresponding to the ID.
28
+ def retrieve_session(session_id)
29
+ if item = find_by_session_id(session_id)
30
+ item.data
31
+ end
32
+ end
33
+
34
+ # ==== Parameters
35
+ # session_id<String>:: ID of the session to set.
36
+ # data<ContainerSession>:: The session to set.
37
+ def store_session(session_id, data)
38
+ if item = find_by_session_id(session_id)
39
+ item.update_attributes!(:data => data)
40
+ else
41
+ create(:session_id => session_id, :data => data)
42
+ end
43
+ end
44
+
45
+ # ==== Parameters
46
+ # session_id<String>:: ID of the session to delete.
47
+ def delete_session(session_id)
48
+ delete_all(["#{connection.quote_column_name('session_id')} IN (?)", session_id])
49
+ end
50
+
51
+ end
52
+
53
+ end
54
+
55
+ class ActiveRecordSession < SessionStoreContainer
56
+
57
+ # The session store type
58
+ self.session_store_type = :activerecord
59
+
60
+ # The store object is the model class itself
61
+ self.store = ActiveRecordSessionStore
62
+
63
+ end
64
+
65
+ end
@@ -0,0 +1,41 @@
1
+ if defined?(Merb::Plugins)
2
+
3
+ dependency "activerecord" unless defined?(ActiveRecord)
4
+
5
+ require File.join(File.dirname(__FILE__) / "merb" / "orms" / "active_record" / "cleanup" )
6
+ require File.join(File.dirname(__FILE__) / "merb" / "orms" / "active_record" / "connection")
7
+ Merb::Plugins.add_rakefiles(File.join(File.dirname(__FILE__) / "active_record" / "merbtasks"))
8
+
9
+ class Merb::Orms::ActiveRecord::Connect < Merb::BootLoader
10
+ after BeforeAppLoads
11
+
12
+ def self.run
13
+ Merb::Orms::ActiveRecord.connect
14
+ if Merb::Config.session_stores.include?(:activerecord)
15
+ Merb.logger.debug "Using ActiveRecord sessions"
16
+ require File.join(File.dirname(__FILE__) / "merb" / "session" / "active_record_session")
17
+ end
18
+ # The default identify is :id instead of :to_param so that the identify
19
+ # can be used as the default resource key
20
+ Merb::Router.root_behavior = Merb::Router.root_behavior.identify(ActiveRecord::Base => :id)
21
+ end
22
+
23
+ end
24
+
25
+ class Merb::Orms::ActiveRecord::DisconnectBeforeFork < Merb::BootLoader
26
+ after AfterAppLoads
27
+
28
+ def self.run
29
+ Merb.logger.debug "Disconnecting database connection before forking."
30
+ ::ActiveRecord::Base.clear_active_connections!
31
+ end
32
+ end
33
+
34
+
35
+ generators = File.join(File.dirname(__FILE__), 'generators')
36
+ Merb.add_generators generators / :migration
37
+ Merb.add_generators generators / :model
38
+ Merb.add_generators generators / :resource_controller
39
+ Merb.add_generators generators / :session_migration
40
+
41
+ end
@@ -0,0 +1,5 @@
1
+ module Merb
2
+ module ActiveRecord
3
+ VERSION = '1.1.0.pre'.freeze
4
+ end
5
+ end
metadata ADDED
@@ -0,0 +1,142 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: elucid-merb_activerecord
3
+ version: !ruby/object:Gem::Version
4
+ hash: 961915996
5
+ prerelease: true
6
+ segments:
7
+ - 1
8
+ - 1
9
+ - 0
10
+ - pre
11
+ version: 1.1.0.pre
12
+ platform: ruby
13
+ authors:
14
+ - Duane Johnson
15
+ autorequire:
16
+ bindir: bin
17
+ cert_chain: []
18
+
19
+ date: 2010-10-22 00:00:00 -04:00
20
+ default_executable:
21
+ dependencies:
22
+ - !ruby/object:Gem::Dependency
23
+ name: merb-core
24
+ prerelease: false
25
+ requirement: &id001 !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ~>
29
+ - !ruby/object:Gem::Version
30
+ hash: 17
31
+ segments:
32
+ - 1
33
+ - 1
34
+ - 1
35
+ version: 1.1.1
36
+ type: :runtime
37
+ version_requirements: *id001
38
+ - !ruby/object:Gem::Dependency
39
+ name: activerecord
40
+ prerelease: false
41
+ requirement: &id002 !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ hash: 7
47
+ segments:
48
+ - 2
49
+ - 3
50
+ - 2
51
+ version: 2.3.2
52
+ type: :runtime
53
+ version_requirements: *id002
54
+ - !ruby/object:Gem::Dependency
55
+ name: rspec
56
+ prerelease: false
57
+ requirement: &id003 !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ hash: 13
63
+ segments:
64
+ - 1
65
+ - 2
66
+ - 9
67
+ version: 1.2.9
68
+ type: :development
69
+ version_requirements: *id003
70
+ description: Merb plugin that provides ActiveRecord support
71
+ email: canadaduane@gmail.com
72
+ executables: []
73
+
74
+ extensions: []
75
+
76
+ extra_rdoc_files:
77
+ - LICENSE
78
+ - README
79
+ - TODO
80
+ files:
81
+ - Generators
82
+ - LICENSE
83
+ - README
84
+ - Rakefile
85
+ - TODO
86
+ - lib/active_record/merbtasks.rb
87
+ - lib/generators/migration.rb
88
+ - lib/generators/model.rb
89
+ - lib/generators/resource_controller.rb
90
+ - lib/generators/session_migration.rb
91
+ - lib/generators/templates/migration/schema/migrations/%file_name%.rb
92
+ - lib/generators/templates/model/app/models/%file_name%.rb
93
+ - lib/generators/templates/resource_controller/app/controllers/%file_name%.rb
94
+ - lib/generators/templates/resource_controller/app/views/%file_name%/edit.html.erb
95
+ - lib/generators/templates/resource_controller/app/views/%file_name%/index.html.erb
96
+ - lib/generators/templates/resource_controller/app/views/%file_name%/new.html.erb
97
+ - lib/generators/templates/resource_controller/app/views/%file_name%/show.html.erb
98
+ - lib/generators/templates/session_migration/schema/migrations/%version%_database_sessions.rb
99
+ - lib/merb/orms/active_record/cleanup.rb
100
+ - lib/merb/orms/active_record/connection.rb
101
+ - lib/merb/orms/active_record/database.yml.sample
102
+ - lib/merb/session/active_record_session.rb
103
+ - lib/merb_activerecord.rb
104
+ - lib/merb_activerecord/version.rb
105
+ has_rdoc: true
106
+ homepage: http://github.com/merb/merb_activerecord
107
+ licenses: []
108
+
109
+ post_install_message:
110
+ rdoc_options:
111
+ - --charset=UTF-8
112
+ require_paths:
113
+ - lib
114
+ required_ruby_version: !ruby/object:Gem::Requirement
115
+ none: false
116
+ requirements:
117
+ - - ">="
118
+ - !ruby/object:Gem::Version
119
+ hash: 3
120
+ segments:
121
+ - 0
122
+ version: "0"
123
+ required_rubygems_version: !ruby/object:Gem::Requirement
124
+ none: false
125
+ requirements:
126
+ - - ">"
127
+ - !ruby/object:Gem::Version
128
+ hash: 25
129
+ segments:
130
+ - 1
131
+ - 3
132
+ - 1
133
+ version: 1.3.1
134
+ requirements: []
135
+
136
+ rubyforge_project:
137
+ rubygems_version: 1.3.7
138
+ signing_key:
139
+ specification_version: 3
140
+ summary: This plugin allows seamless integration of the ActiveRecord ORM with merb
141
+ test_files: []
142
+