Skip to content

Commit 0c2898a

Browse files
committed
Create IRBConsole to encapsulate IRB-specific setup
Add Rails-specific IRB prompt Update changelog
1 parent 2ddbca3 commit 0c2898a

File tree

4 files changed

+122
-14
lines changed

4 files changed

+122
-14
lines changed

railties/CHANGELOG.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,18 @@
1+
* Rails console now indicates the current Rails environment:
2+
3+
```txt
4+
dev:001> # for RAILS_ENV=development
5+
test:001> # for RAILS_ENV=test
6+
prod:001> # for RAILS_ENV=production
7+
my_env:001> # for RAILS_ENV=my_env
8+
```
9+
10+
The environment name will also be colorized when the environment is
11+
`development` (green), `test` (green), or `production` (red), if your
12+
terminal supports it.
13+
14+
*Stan Lo*
15+
116
* `bin/rails` now prints its help message when given an unrecognized bare
217
option.
318

railties/lib/rails/commands/console/console_command.rb

Lines changed: 48 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,53 @@ def filter_backtrace(bt)
1212
end
1313
end
1414

15+
class IRBConsole
16+
def initialize
17+
require "irb"
18+
require "irb/completion"
19+
IRB::WorkSpace.prepend(BacktraceCleaner)
20+
21+
if !Rails.env.local?
22+
# Use env var here so users can override them with env var too
23+
ENV["IRB_USE_AUTOCOMPLETE"] ||= "false"
24+
end
25+
end
26+
27+
def name
28+
"IRB"
29+
end
30+
31+
def start
32+
IRB.setup(nil)
33+
34+
env = colorized_env
35+
36+
IRB.conf[:PROMPT][:RAILS_PROMPT] = {
37+
PROMPT_I: "#{env}:%03n> ",
38+
PROMPT_S: "#{env}:%03n%l ",
39+
PROMPT_C: "#{env}:%03n* ",
40+
RETURN: "=> %s\n"
41+
}
42+
43+
# Respect user's choice of prompt mode.
44+
IRB.conf[:PROMPT_MODE] = :RAILS_PROMPT if IRB.conf[:PROMPT_MODE] == :DEFAULT
45+
IRB::Irb.new.run(IRB.conf)
46+
end
47+
48+
def colorized_env
49+
case Rails.env
50+
when "development"
51+
IRB::Color.colorize("dev", [:GREEN])
52+
when "test"
53+
IRB::Color.colorize("test", [:GREEN])
54+
when "production"
55+
IRB::Color.colorize("prod", [:RED])
56+
else
57+
Rails.env
58+
end
59+
end
60+
end
61+
1562
def self.start(*args)
1663
new(*args).start
1764
end
@@ -31,18 +78,7 @@ def initialize(app, options = {})
3178

3279
app.load_console
3380

34-
@console = app.config.console || begin
35-
require "irb"
36-
require "irb/completion"
37-
38-
IRB::WorkSpace.prepend(BacktraceCleaner)
39-
40-
if !Rails.env.local?
41-
ENV["IRB_USE_AUTOCOMPLETE"] ||= "false"
42-
end
43-
44-
IRB
45-
end
81+
@console = app.config.console || IRBConsole.new
4682
end
4783

4884
def sandbox?

railties/test/application/console_test.rb

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
# frozen_string_literal: true
22

3+
require "tempfile"
4+
35
require "isolation/abstract_unit"
46
require "console_helpers"
57

@@ -123,9 +125,9 @@ def write_prompt(command, expected_output = nil)
123125
assert_output "> ", @primary
124126
end
125127

126-
def spawn_console(options, wait_for_prompt: true)
128+
def spawn_console(options, wait_for_prompt: true, env: {})
127129
pid = Process.spawn(
128-
{ "TERM" => "dumb" },
130+
{ "TERM" => "dumb" }.merge(env),
129131
"#{app_path}/bin/rails console #{options}",
130132
in: @replica, out: @replica, err: @replica
131133
)
@@ -209,4 +211,40 @@ def test_environment_option_and_irb_option
209211
write_prompt "puts Rails.env", "puts Rails.env\r\ntest"
210212
@primary.puts "quit"
211213
end
214+
215+
def test_production_console_prompt
216+
options = "-e production -- --nocolorize"
217+
spawn_console(options)
218+
219+
write_prompt "123", "prod:001> 123"
220+
end
221+
222+
def test_development_console_prompt
223+
options = "-e development -- --nocolorize"
224+
spawn_console(options)
225+
226+
write_prompt "123", "dev:001> 123"
227+
end
228+
229+
def test_test_console_prompt
230+
options = "-e test -- --nocolorize"
231+
spawn_console(options)
232+
233+
write_prompt "123", "test:001> 123"
234+
end
235+
236+
def test_console_respects_user_defined_prompt_mode
237+
irbrc = Tempfile.new("irbrc")
238+
irbrc.write <<-RUBY
239+
IRB.conf[:PROMPT_MODE] = :SIMPLE
240+
RUBY
241+
irbrc.close
242+
243+
options = "-e test -- --nocolorize"
244+
spawn_console(options, env: { "IRBRC" => irbrc.path })
245+
246+
write_prompt "123", ">> 123"
247+
ensure
248+
File.unlink(irbrc)
249+
end
212250
end

railties/test/commands/console_test.rb

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,25 @@ def test_console_doesnt_disable_IRB_auto_completion_in_local
9999
ENV["IRB_USE_AUTOCOMPLETE"] = original_use_autocomplete
100100
end
101101

102+
def test_prompt_env_colorization
103+
irb_console = Rails::Console::IRBConsole.new
104+
red = "\e[31m"
105+
green = "\e[32m"
106+
clear = "\e[0m"
107+
108+
Rails.env = "development"
109+
assert_equal("#{green}dev#{clear}", irb_console.colorized_env)
110+
111+
Rails.env = "test"
112+
assert_equal("#{green}test#{clear}", irb_console.colorized_env)
113+
114+
Rails.env = "production"
115+
assert_equal("#{red}prod#{clear}", irb_console.colorized_env)
116+
117+
Rails.env = "custom_env"
118+
assert_equal("custom_env", irb_console.colorized_env)
119+
end
120+
102121
def test_default_environment_with_no_rails_env
103122
with_rails_env nil do
104123
start

0 commit comments

Comments
 (0)