From 657f51d5b93db6450a6c976bbc14a0466590ba38 Mon Sep 17 00:00:00 2001 From: Dinshaw Gobhai Date: Sat, 14 Mar 2009 22:41:26 -0400 Subject: [PATCH] Add two methods to template_runner.rb 1. add_observer 2. application_include --- .../generators/applications/app/template_runner.rb | 37 ++++++++++++++++++++ .../test/generators/rails_template_runner_test.rb | 36 ++++++++++++++++++- 2 files changed, 72 insertions(+), 1 deletions(-) diff --git a/railties/lib/rails_generator/generators/applications/app/template_runner.rb b/railties/lib/rails_generator/generators/applications/app/template_runner.rb index 3b49b1f..4a1b488 100644 --- a/railties/lib/rails_generator/generators/applications/app/template_runner.rb +++ b/railties/lib/rails_generator/generators/applications/app/template_runner.rb @@ -118,6 +118,43 @@ module Rails end end + + # Adds an include line tot he top of ApplicationController + # + # ==== Examples + # + # application_include"ExceptionNotifiable" + # + def application_include(data) + sentinel = 'class ApplicationController < ActionController::Base' + in_root do + gsub_file 'app/controllers/application_controller.rb', /(#{Regexp.escape(sentinel)})/mi do |match| + "#{match}\n " << "include #{data}" + end + end + end + + # Adds an observer to the environment.rb + # Assumes you have either the line commented out (new rails app default) + # OR + # you already added some observers and it appends this one + # If the string does not end with "_observer" it will add it + # + # ==== Examples + # + # add_observer "users" + # add_observer "users_observer" + def add_observer(name) + name += "_observer" if !name.match("_observer") + in_root do + # do this one first so it never does both + gsub_file 'config/environment.rb', /[^#]\s*(config.active_record.observers = .*)/i do |match| + "#{match}, :" << name + end + gsub_file 'config/environment.rb', /#\s*(config.active_record.observers =).*/i, ['\1',' :',name].join + end + end + # Run a command in git. # # ==== Examples diff --git a/railties/test/generators/rails_template_runner_test.rb b/railties/test/generators/rails_template_runner_test.rb index 2da6bd5..8bfba42 100644 --- a/railties/test/generators/rails_template_runner_test.rb +++ b/railties/test/generators/rails_template_runner_test.rb @@ -183,7 +183,41 @@ class RailsTemplateRunnerTest < GeneratorTestCase expects_run_with_command("#{ruby_command}script/generate model MyModel") run_template_method(:generate, 'model', 'MyModel') end - + + def test_application_include_should_add_the_include_line_to_app_controller + include_me = 'TestInclude' + run_template_method(:application_include, include_me) + assert_generated_file_with_data 'app/controllers/application_controller.rb', include_me + end + + def test_add_observer_should_uncomment_the_default_observer_line + observe_me = 'users' + run_template_method(:add_observer, observe_me) + assert_generated_file('config/environment.rb') do |file| + assert_match(/[^#]\s*config.active_record.observers = .*/i,file, "observer line should be uncommented in environment.rb") + end + end + + def test_add_observer_should_add_the_first_observer_the_first_time + observe_me = 'users' + run_template_method(:add_observer, observe_me) + assert_generated_file('config/environment.rb') do |file| + assert_match(/[^#]\s*config.active_record.observers = :users_observer/i,file, "observer line should be uncommented in environment.rb") + end + end + + def test_add_observer_should_append_new_observers_after_the_first_time + observe_me1 = 'users' + observe_me2 = 'posts' + observe_me3 = 'tags' + run_template_method(:add_observer, observe_me1) + run_template_method(:add_observer, observe_me2) + run_template_method(:add_observer, observe_me3) + assert_generated_file('config/environment.rb') do |file| + assert_match(/[^#]\s*config.active_record.observers = :users_observer, :posts_observer, :tags_observer/i,file, "observer line should be uncommented in environment.rb") + end + end + protected def run_template_method(method_name, *args, &block) silence_generator do -- 1.5.6