mirror of
https://github.com/github/rails.git
synced 2026-04-26 03:00:59 -04:00
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:
committed by
Michael Koziarski
parent
eaf8fe7708
commit
2cb60abfec
@@ -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
|
||||
@@ -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
|
||||
@@ -0,0 +1,3 @@
|
||||
class <%= class_name %> < <%= parent_class_name %>
|
||||
|
||||
end
|
||||
@@ -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
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user