From 8fb1e9f4e8c845f70e475be2c3c6b6457b2c9921 Mon Sep 17 00:00:00 2001 From: Jeremy McAnally Date: Tue, 2 Feb 2010 18:55:50 -0600 Subject: [PATCH] Add new generator for generating an application.rb from your existing environment.rb code --- lib/new_configuration_generator.rb | 51 +++++++++++++++++++ tasks/rails_upgrade_tasks.rake | 9 ++++ test/new_configuration_generator_test.rb | 63 ++++++++++++++++++++++++ 3 files changed, 123 insertions(+) create mode 100644 lib/new_configuration_generator.rb create mode 100644 test/new_configuration_generator_test.rb diff --git a/lib/new_configuration_generator.rb b/lib/new_configuration_generator.rb new file mode 100644 index 0000000..8d90590 --- /dev/null +++ b/lib/new_configuration_generator.rb @@ -0,0 +1,51 @@ +module Rails + module Upgrading + class NewConfigurationGenerator + def generate_new_configurations + if has_environment? + generate_new_application_rb + else + raise FileNotFoundError, "Can't find environment.rb [config/environment.rb]!" + end + end + + def has_environment? + File.exists?("config/environment.rb") + end + + def environment_code + File.open("config/environment.rb").read + end + + def generate_new_application_rb + environment_file = environment_code + + initializer_code = "" + if matches = environment_file.match(/Rails\:\:Initializer\.run do \|config\|\n(.*)\nend/m) + initializer_code = matches[1] + else + raise "There doesn't seem to be a real environment.rb in your app. Are you sure config/environment.rb has the right contents?" + end + + frame = "# Put this in config/application.rb +require File.expand_path('../boot', __FILE__) + +module #{app_name.classify} + class Application < Rails::Application +%s + end +end" + + frame % [indent(initializer_code)] + end + + def indent(text) + text.split("\n").map {|l| " #{l}"}.join("\n") + end + + def app_name + File.basename(Dir.pwd) + end + end + end +end \ No newline at end of file diff --git a/tasks/rails_upgrade_tasks.rake b/tasks/rails_upgrade_tasks.rake index 4e66a1b..812d002 100644 --- a/tasks/rails_upgrade_tasks.rake +++ b/tasks/rails_upgrade_tasks.rake @@ -2,6 +2,7 @@ $:.unshift(File.dirname(__FILE__) + "/../lib") require 'routes_upgrader' require 'gemfile_generator' require 'application_checker' +require 'new_configuration_generator' namespace :rails do namespace :upgrade do @@ -26,5 +27,13 @@ namespace :rails do puts new_routes end + + desc "Extracts your configuration code so you can create a new config/application.rb" + task :configuration do + upgrader = Rails::Upgrading::NewConfigurationGenerator.new + new_config = upgrader.generate_new_application_rb + + puts new_config + end end end \ No newline at end of file diff --git a/test/new_configuration_generator_test.rb b/test/new_configuration_generator_test.rb new file mode 100644 index 0000000..16756d9 --- /dev/null +++ b/test/new_configuration_generator_test.rb @@ -0,0 +1,63 @@ +require 'test_helper' +require 'new_configuration_generator' + +# Stub out methods on upgrader class +module Rails + module Upgrading + class NewConfigurationGenerator + attr_writer :environment_code + + def has_environment? + true + end + + def environment_code + @environment_code + end + + def app_name + "my_application" + end + end + end +end + +class NewConfigurationGeneratorTest < ActiveSupport::TestCase + FRAME = "# Put this in config/application.rb +require File.expand_path('../boot', __FILE__) + +module MyApplication + class Application < Rails::Application +%s + end +end" + + CONFIG = " config.what_have_you = 'thing' + config.action_controller = 'what'" + + CODE = "require 'w/e' + +this_happens_before_the(code) +more_before_the_code! + +Rails::Initializer.run do |config| +%s +end + +this_is_after_the_code +" + + def test_raises_error_with_no_code + generator = Rails::Upgrading::NewConfigurationGenerator.new + generator.environment_code = "" + + assert_raises(RuntimeError) { generator.generate_new_application_rb } + end + + def test_generates_with_code + generator = Rails::Upgrading::NewConfigurationGenerator.new + generator.environment_code = CODE % [CONFIG] + + assert_equal FRAME % [generator.indent(CONFIG)], generator.generate_new_application_rb + end +end \ No newline at end of file