From d7518851d0494c1fe1ad74686ecd4c8601de9e9d Mon Sep 17 00:00:00 2001 From: Carlos Paramio Date: Mon, 9 Feb 2009 13:27:47 +0100 Subject: [PATCH] support for custom environments with gem command on template runner --- .../generators/applications/app/template_runner.rb | 26 ++++++++++++++----- .../test/generators/rails_template_runner_test.rb | 26 ++++++++++++++++---- 2 files changed, 40 insertions(+), 12 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 84e36ec..90269eb 100644 --- a/railties/lib/rails_generator/generators/applications/app/template_runner.rb +++ b/railties/lib/rails_generator/generators/applications/app/template_runner.rb @@ -88,23 +88,30 @@ module Rails gems_code = "config.gem '#{name}'" + custom_env = :global + if options.any? + custom_env = options.delete(:env) || options.delete('env') || custom_env opts = options.inject([]) {|result, h| result << [":#{h[0]} => '#{h[1]}'"] }.sort.join(", ") gems_code << ", #{opts}" end - environment gems_code + environment gems_code, custom_env end # Adds a line inside the Initializer block for config/environment.rb. Used by #gem - def environment(data = nil, &block) - sentinel = 'Rails::Initializer.run do |config|' - + def environment(data = nil, env = :global, &block) data = block.call if !data && block_given? - in_root do - gsub_file 'config/environment.rb', /(#{Regexp.escape(sentinel)})/mi do |match| - "#{match}\n " << data + in_root do + if env.to_sym == :global + sentinel = 'Rails::Initializer.run do |config|' + + gsub_file 'config/environment.rb', /(#{Regexp.escape(sentinel)})/mi do |match| + "#{match}\n " << data + end + else + append_to_file "config/environments/#{env}.rb", data end end end @@ -349,6 +356,11 @@ module Rails content = File.read(path).gsub(regexp, *args, &block) File.open(path, 'wb') { |file| file.write(content) } end + + def append_to_file(relative_destination, content) + path = destination_path(relative_destination) + File.open(path, 'a') { |file| file.write(content) } + end def destination_path(relative_destination) File.join(root, relative_destination) diff --git a/railties/test/generators/rails_template_runner_test.rb b/railties/test/generators/rails_template_runner_test.rb index fcc0206..27cd563 100644 --- a/railties/test/generators/rails_template_runner_test.rb +++ b/railties/test/generators/rails_template_runner_test.rb @@ -72,15 +72,25 @@ class RailsTemplateRunnerTest < GeneratorTestCase run_template_method(:plugin, 'rest_auth', {}) end - def test_gem_should_put_gem_dependency_in_enviroment + def test_gem_should_put_gem_dependency_in_common_enviroment run_template_method(:gem, 'will-paginate') assert_rails_initializer_includes("config.gem 'will-paginate'") end - def test_gem_with_options_should_include_options_in_gem_dependency_in_environment + def test_gem_with_options_should_include_options_in_gem_dependency_in_common_environment run_template_method(:gem, 'mislav-will-paginate', :lib => 'will-paginate', :source => 'http://gems.github.com') assert_rails_initializer_includes("config.gem 'mislav-will-paginate', :lib => 'will-paginate', :source => 'http://gems.github.com'") end + + def test_gem_should_put_gem_dependency_in_custom_enviroment + run_template_method(:gem, 'will-paginate', :env => :test) + assert_custom_rails_initializer_includes(:test, "config.gem 'will-paginate'") + end + + def test_gem_with_options_should_include_options_in_gem_dependency_in_custom_environment + run_template_method(:gem, 'mislav-will-paginate', :lib => 'will-paginate', :source => 'http://gems.github.com', :env => :test) + assert_custom_rails_initializer_includes(:test, "config.gem 'mislav-will-paginate', :lib => 'will-paginate', :source => 'http://gems.github.com'") + end def test_environment_should_include_data_in_environment_initializer_block load_paths = 'config.load_paths += %w["#{RAILS_ROOT}/app/extras"]' @@ -175,9 +185,15 @@ class RailsTemplateRunnerTest < GeneratorTestCase end def assert_rails_initializer_includes(data, message = nil) - message ||= "Rails::Initializer should include #{data}" - assert_generated_file 'config/environment.rb' do |body| - assert_match(/#{Regexp.escape("Rails::Initializer.run do |config|")}.+#{Regexp.escape(data)}.+end/m, body, message) + assert_custom_rails_initializer_includes(:global, data, message) + end + + def assert_custom_rails_initializer_includes(env_name, data, message = nil) + path_to_initializer = env_name.to_sym == :global ? "config/environment.rb" : "config/environments/#{env_name}.rb" + regexp = env_name.to_sym == :global ? /#{Regexp.escape("Rails::Initializer.run do |config|")}.+#{Regexp.escape(data)}.+end/m : /#{Regexp.escape(data)}/m + message ||= "Rails::Initializer should include #{data} in environment file #{path_to_initializer}" + assert_generated_file path_to_initializer do |body| + assert_match(regexp, body, message) end end -- 1.6.1