Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

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>
  • Loading branch information...
commit 2cb60abfecbad78046b0afde156c72a9ae766cf0 1 parent eaf8fe7
@jakimowicz jakimowicz authored NZKoz committed
View
13 railties/lib/rails_generator/generators/components/model_subclass/USAGE
@@ -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
32 railties/lib/rails_generator/generators/components/model_subclass/model_subclass_generator.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
View
3  railties/lib/rails_generator/generators/components/model_subclass/templates/model.rb
@@ -0,0 +1,3 @@
+class <%= class_name %> < <%= parent_class_name %>
+
+end
View
8 railties/lib/rails_generator/generators/components/model_subclass/templates/unit_test.rb
@@ -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
15 railties/test/generators/rails_model_subclass_generator_test.rb
@@ -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

1 comment on commit 2cb60ab

@apacala

Someone misspelled "inherit" in USAGE

Please sign in to comment.
Something went wrong with that request. Please try again.