Your friends at Viget present Extend, a Code & Technology Blog

Rails 3 Generators: The Unusuals (part 2)

After the first two installments of the Rails 3 generator tour, you may be asking yourself, “Hey, what about session_migration? Or performance_test? I use that one all the time!” Well, wait no longer! Here are four more of the generators that have been held over from Rails 2.

Session Migration

[rails2] > ./script/generate session_migration
      exists  db/migrate
      create  db/migrate/20100221180822_add_session_table.rb

[rails3] > rails generate session_migration
      invoke  active_record
      create    db/migrate/20100221180822_add_sessions_table.rb

If you’re a fan of storing sessions in the database, you’ll be interested to know that the only difference in Rails 3’s session_migration generator is the name of the file - they pluralized it. Otherwise, everything’s identical.

Integration Test

[rails2] > ./script/generate integration_test login
      exists  test/integration/
      create  test/integration/login_test.rb

[rails3] > rails generate integration_test login
      invoke  test_unit
      create    test/integration/login_test.rb

The integration test generator hasn’t changed much – by default, it’s identical to Rails 2. There is a new option in Rails 3, however:

Options:
  [--integration-tool=NAME]  # Integration tool to be invoked
                             # Default: test_unit

With the --integration-tool option, you can specify a new set of generators to run – cucumber, for instance?

Performance Test

[rails2] > ./script/generate performance_test homepage
      exists  test/performance/
      create  test/performance/homepage_test.rb

[rails3] > rails generate performance_test homepage
      invoke  test_unit
      create    test/performance/homepage_test.rb

Like the integration test generator, the default case for performance tests is unchanged from Rails 2 to 3. Also like integration tests, though, there’s another new option:

Options:
  [--performance-tool=NAME]  # Performance tool to be invoked
                             # Default: test_unit

If you prefer to use a performance tool other than Test::Unit, you can now do so. I’m not aware of any specific performance testing libraries, though, so for the immediate future the alternatives here will be general-purpose testing frameworks like RSpec. (This points to a possible niche for a new open source project, though.)

Plugin

[rails2] > ./script/generate plugin obsolete
      create  vendor/plugins/obsolete/lib
      create  vendor/plugins/obsolete/tasks
      create  vendor/plugins/obsolete/test
      create  vendor/plugins/obsolete/README
      create  vendor/plugins/obsolete/MIT-LICENSE
      create  vendor/plugins/obsolete/Rakefile
      create  vendor/plugins/obsolete/init.rb
      create  vendor/plugins/obsolete/install.rb
      create  vendor/plugins/obsolete/uninstall.rb
      create  vendor/plugins/obsolete/lib/obsolete.rb
      create  vendor/plugins/obsolete/tasks/obsolete_tasks.rake
      create  vendor/plugins/obsolete/test/obsolete_test.rb
      create  vendor/plugins/obsolete/test/test_helper.rb

[rails3] > rails generate plugin obsolete
      create  vendor/plugins/obsolete
      create  vendor/plugins/obsolete/init.rb
      create  vendor/plugins/obsolete/install.rb
      create  vendor/plugins/obsolete/MIT-LICENSE
      create  vendor/plugins/obsolete/Rakefile
      create  vendor/plugins/obsolete/README
      create  vendor/plugins/obsolete/uninstall.rb
      create  vendor/plugins/obsolete/lib
      create  vendor/plugins/obsolete/lib/obsolete.rb
      invoke  test_unit
      inside    vendor/plugins/obsolete
      create      test
      create      test/obsolete_test.rb
      create      test/test_helper.rb

There aren’t a lot of changes in the plugin generator in Rails 3, either. The biggest difference, in fact, is that the generated Rakefile has slimmed down a little bit (the documentation task has vanished), and the stub rake task file is gone.

There is one other new line in the output: inside vendor/plugins/obsolete. This is just a flag that the following lines will take effect within a different subdirectory. Without it, you'd get your plugin tests in the top-level test directory, which wouldn't make a lot of sense.

The default case hides some deeper updates, however, as you can see from the options available to the Rails 3 generator:

Options:
  -t, [--test-framework=NAME]  # Test framework to be invoked
                               # Default: test_unit
  -g, [--generator]            # Indicates when to generate generator
  -r, [--tasks=TASKS]          # When supplied creates tasks base files.

We’ve seen the --test-framework option before, so we can ignore it for now. Starting from the bottom, the --tasks option brings back that missing stub tasks file (though the documentation task is gone from the Rakefile forever, I’m afraid). The --generator option is our first look at the functionality Rails 3 gives you to create your own generators – it adds template code for your plugin to define its own generator, which we’ll be exploring more in a later post.

Next Time

That about does it for the generators that’ve been ported over from Rails 2*. Next time, we’ll start to look at the generators that are fresh and new in Rails 3: generator, model_subclass, and stylesheets. I can’t wait!

* OK, that’s kind of a lie. The scaffold generator has moved over, too, and it’s been joined by a new scaffold_controller generator, as well. These create a lot of files, though, so they’ll get a full post of their own later in the series.