Add an model_subclass generator.

This generator creates a new model as a subclass of an existing model and the unit test for that model.  Lets users avoid having to manually delete the fixtures and migration or remember to pass those arguments.

[#2702 state:committed]

Signed-off-by: Michael Koziarski <michael@koziarski.com>
This commit is contained in:
Fabien Jakimowicz
2009-05-24 02:32:04 +02:00
committed by Michael Koziarski
parent eaf8fe7708
commit 2cb60abfec
5 changed files with 71 additions and 0 deletions

View File

@@ -0,0 +1,13 @@
Description:
Create a model subclass of parent, used for Single Table Inheritance.
Both subclass and parent name can be either CamelCased or under_scored.
This generates a model class in app/models and a unit test in test/unit.
Examples:
`./script/generate model_subclass admin user`
creates an Admin model, which will inheritate from User model, test:
Model: app/models/admin.rb
Test: test/unit/admin_test.rb

View File

@@ -0,0 +1,32 @@
class ModelSubclassGenerator < Rails::Generator::NamedBase
default_options :skip_unit_test => false
def manifest
record do |m|
# Check for class naming collisions.
m.class_collisions class_name, "#{class_name}Test"
# Model and test directories.
m.directory File.join('app/models', class_path)
m.directory File.join('test/unit', class_path)
# Model class and unit test
m.template 'model.rb', File.join('app/models', class_path, "#{file_name}.rb"), :assigns => assigns
m.template 'unit_test.rb', File.join('test/unit', class_path, "#{file_name}_test.rb"), :assigns => assigns
end
end
protected
def banner
"Usage: #{$0} #{spec.name} Subclass Parent"
end
def assigns
{:parent_class_name => parent_class_name}
end
def parent_class_name
@args.first.try(:camelize) || usage
end
end

View File

@@ -0,0 +1,3 @@
class <%= class_name %> < <%= parent_class_name %>
end

View File

@@ -0,0 +1,8 @@
require 'test_helper'
class <%= class_name %>Test < ActiveSupport::TestCase
# Replace this with your real tests.
test "the truth" do
assert true
end
end

View File

@@ -0,0 +1,15 @@
require 'generators/generator_test_helper'
class RailsModelSubclassGeneratorTest < GeneratorTestCase
def test_model_subclass_generates_resources
run_generator('model_subclass', %w(Car Product))
assert_generated_model_for :car, "Product"
assert_generated_unit_test_for :car
end
def test_model_subclass_must_have_a_parent_class_name
assert_raise(Rails::Generator::UsageError) { run_generator('model_subclass', %w(Car)) }
end
end