diff options
Diffstat (limited to 'railties')
-rw-r--r-- | railties/lib/rails/commands/console.rb | 71 | ||||
-rw-r--r-- | railties/test/commands/console_test.rb | 84 |
2 files changed, 130 insertions, 25 deletions
diff --git a/railties/lib/rails/commands/console.rb b/railties/lib/rails/commands/console.rb index e2956bbef6..86376ac7e6 100644 --- a/railties/lib/rails/commands/console.rb +++ b/railties/lib/rails/commands/console.rb @@ -4,48 +4,69 @@ require 'irb/completion' module Rails class Console - def self.start(app) - new(app).start + attr_reader :options, :app, :console, :arguments + + def self.start(*args) + new(*args).start end - def initialize(app) - @app = app + def initialize(app, arguments = ARGV) + @app = app + @arguments = arguments + app.load_console + @console = app.config.console || IRB end - def start - options = {} + def options + @options ||= begin + options = {} + + OptionParser.new do |opt| + opt.banner = "Usage: console [environment] [options]" + opt.on('-s', '--sandbox', 'Rollback database modifications on exit.') { |v| options[:sandbox] = v } + opt.on("--debugger", 'Enable ruby-debugging for the console.') { |v| options[:debugger] = v } + opt.parse!(arguments) + end - OptionParser.new do |opt| - opt.banner = "Usage: console [environment] [options]" - opt.on('-s', '--sandbox', 'Rollback database modifications on exit.') { |v| options[:sandbox] = v } - opt.on("--debugger", 'Enable ruby-debugging for the console.') { |v| options[:debugger] = v } - opt.parse!(ARGV) + options end + end - @app.sandbox = options[:sandbox] - @app.load_console + def sandbox? + options[:sandbox] + end - if options[:debugger] - begin - require 'ruby-debug' - puts "=> Debugger enabled" - rescue Exception - puts "You need to install ruby-debug19 to run the console in debugging mode. With gems, use 'gem install ruby-debug19'" - exit - end - end + def debugger? + options[:debugger] + end + + def start + app.sandbox = sandbox? + + require_debugger if debugger? - if options[:sandbox] + if sandbox? puts "Loading #{Rails.env} environment in sandbox (Rails #{Rails.version})" puts "Any modifications you make will be rolled back on exit" else puts "Loading #{Rails.env} environment (Rails #{Rails.version})" end - console = Rails.application.config.console || IRB - console::ExtendCommandBundle.send :include, Rails::ConsoleMethods + if defined?(console::ExtendCommandBundle) + console::ExtendCommandBundle.send :include, Rails::ConsoleMethods + end console.start end + + def require_debugger + begin + require 'ruby-debug' + puts "=> Debugger enabled" + rescue Exception + puts "You need to install ruby-debug19 to run the console in debugging mode. With gems, use 'gem install ruby-debug19'" + exit + end + end end end diff --git a/railties/test/commands/console_test.rb b/railties/test/commands/console_test.rb new file mode 100644 index 0000000000..eb0a29d84a --- /dev/null +++ b/railties/test/commands/console_test.rb @@ -0,0 +1,84 @@ +require 'abstract_unit' +require 'rails/commands/console' + +class Rails::ConsoleTest < ActiveSupport::TestCase + class FakeConsole + end + + def test_sandbox_option + console = Rails::Console.new(app, ["--sandbox"]) + assert console.sandbox? + end + + def test_short_version_of_sandbox_option + console = Rails::Console.new(app, ["-s"]) + assert console.sandbox? + end + + def test_debugger_option + console = Rails::Console.new(app, ["--debugger"]) + assert console.debugger? + end + + def test_no_options + console = Rails::Console.new(app, []) + assert !console.debugger? + assert !console.sandbox? + end + + def test_start + app.expects(:sandbox=).with(nil) + FakeConsole.expects(:start) + + start + + assert_match /Loading development environment \(Rails/, output + end + + def test_start_with_debugger + app.expects(:sandbox=).with(nil) + rails_console.expects(:require_debugger).returns(nil) + FakeConsole.expects(:start) + + start ["--debugger"] + end + + def test_start_with_sandbox + app.expects(:sandbox=).with(true) + FakeConsole.expects(:start) + + start ["--sandbox"] + + assert_match /Loading development environment in sandbox \(Rails/, output + end + + def test_console_defaults_to_IRB + config = mock("config", :console => nil) + app = mock("app", :config => config) + app.expects(:load_console).returns(nil) + + assert_equal IRB, Rails::Console.new(app).console + end + + private + + attr_reader :output + + def rails_console + @rails_console ||= Rails::Console.new(app) + end + + def start(argv = []) + rails_console.stubs(:arguments => argv) + @output = output = capture(:stdout) { rails_console.start } + end + + def app + @app ||= begin + config = mock("config", :console => FakeConsole) + app = mock("app", :config => config) + app.expects(:load_console) + app + end + end +end |