irt 1.1.7 → 1.2.0.p01
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.markdown +33 -1
- data/VERSION +1 -1
- data/bin/irt +13 -41
- data/bin/irt_irb +0 -0
- data/irt.gemspec +2 -2
- data/lib/irt/commands/core.rb +15 -2
- data/lib/irt/commands/edit.rb +13 -14
- data/lib/irt/commands/help.rb +5 -1
- data/lib/irt/commands/test.rb +3 -2
- data/lib/irt/directives/test.rb +2 -3
- data/lib/irt/extensions/irb/commands.rb +15 -1
- data/lib/irt/extensions/irb/context.rb +4 -2
- data/lib/irt/extensions/irb.rb +9 -9
- data/lib/irt/extensions/kernel.rb +1 -0
- data/lib/irt/extensions/method.rb +12 -6
- data/lib/irt/extensions/rails.rb +73 -3
- data/lib/irt/log.rb +2 -2
- data/lib/irt/prompter.rb +32 -0
- data/lib/irt/session.rb +38 -2
- data/lib/irt/utils.rb +48 -7
- data/lib/irt.rb +27 -22
- metadata +44 -8
data/README.markdown
CHANGED
@@ -140,7 +140,10 @@ When you close the session with 'exit' (or 'x' or 'q'), IRT will not pass back a
|
|
140
140
|
|
141
141
|
### Binding Sessions (yellow)
|
142
142
|
|
143
|
-
You can open a binding session from any file
|
143
|
+
You can open a binding session from any file with the directive 'irt binding': you don't even need to use the IRT executable.
|
144
|
+
It works also from the rails code, while the server is running. (See Rails)
|
145
|
+
|
146
|
+
|
144
147
|
The 'self' of the new session will be the 'self' at the line you called it, so you can play with local variables
|
145
148
|
and methods as you would do it at that line.
|
146
149
|
|
@@ -597,6 +600,35 @@ By default IRT will output the rails log (colored in blue) right in the console.
|
|
597
600
|
You can switch the rails log ON or OFF by using the 'rails\_log\_on' (or 'rlo') and 'rails\_log\_off' (or 'rlf')
|
598
601
|
commands in any session, besides you can set the option IRT.rails_log to true or false in the ~/.irtrc file.
|
599
602
|
|
603
|
+
### Rails Server Sessions
|
604
|
+
|
605
|
+
The server sessions are a quick way to interact with your application while your server is running,
|
606
|
+
without the need to launch a the irt executable: you can do almost everything you can from a regular IRT session
|
607
|
+
launched from the irt executable.
|
608
|
+
|
609
|
+
If you want to open a session from your Rails code or from a template while the server is running,
|
610
|
+
you don't have to use the IRT executable: you can just add an 'irt binding' statement where you want
|
611
|
+
(even in a erb template), load the page in the browser and IRT will open a Binding Session right in the server's console.
|
612
|
+
|
613
|
+
# will open an IRT Binding Session in the server window
|
614
|
+
irt binding
|
615
|
+
|
616
|
+
Besides, if you want to open an Interactive Session, you have just to type Ctrl-C in the server console and
|
617
|
+
you will be asked if you want to shutdown the server or open an IRT session.
|
618
|
+
|
619
|
+
=> Booting Mongrel
|
620
|
+
=> Rails 3.0.4 application starting in development on http://0.0.0.0:3000
|
621
|
+
=> Call with -d to detach
|
622
|
+
=> Ctrl-C to shutdown server
|
623
|
+
^C
|
624
|
+
#> Server suspended
|
625
|
+
?> [s]hutdown, [i]rt or [c]ancel? [<enter>=s|i|c]
|
626
|
+
|
627
|
+
Notice that the execution of the web response is halted until you exit from the session.
|
628
|
+
When you exit, the response process will be resumed, and the server will return to its normal behaviour.
|
629
|
+
|
630
|
+
Note: The Server Sessions are known to work with WEBrick and Mongrel (using Rack)
|
631
|
+
|
600
632
|
### Rails 3
|
601
633
|
|
602
634
|
You must add the gem to your Gemfile, to make the bundler happy:
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.2.0.p01
|
data/bin/irt
CHANGED
@@ -2,21 +2,10 @@
|
|
2
2
|
|
3
3
|
require 'rubygems'
|
4
4
|
require 'fileutils'
|
5
|
-
require 'tempfile'
|
6
5
|
require 'optparse'
|
7
|
-
require '
|
8
|
-
require 'dye'
|
6
|
+
require 'irt/utils'
|
9
7
|
|
10
|
-
|
11
|
-
def pr.say_echo(result, opts={})
|
12
|
-
out = sprintf " #> %s", result
|
13
|
-
say out, :style => :yellow
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
version = File.read(File.expand_path('../../VERSION', __FILE__)).strip
|
18
|
-
|
19
|
-
copy = Dye.dye "irt #{version} (c) 2010-2011 Domizio Demichelis", :blue, :bold
|
8
|
+
copy = IRT::Utils.copyright
|
20
9
|
|
21
10
|
options = {}
|
22
11
|
|
@@ -36,7 +25,7 @@ EOB
|
|
36
25
|
end
|
37
26
|
|
38
27
|
options[:irb_options] = nil
|
39
|
-
opts.on( '-b', '--irb-options [OPTIONS]', 'Sets the irb
|
28
|
+
opts.on( '-b', '--irb-options [OPTIONS]', 'Sets the irb or rails console options' ) do |opt|
|
40
29
|
options[:irb_options] = opt
|
41
30
|
end
|
42
31
|
|
@@ -51,7 +40,7 @@ EOB
|
|
51
40
|
end
|
52
41
|
|
53
42
|
opts.on( '-v', '--version', 'Shows the version and exits' ) do
|
54
|
-
puts version
|
43
|
+
puts IRT::Utils.version
|
55
44
|
exit
|
56
45
|
end
|
57
46
|
|
@@ -69,47 +58,34 @@ puts copy
|
|
69
58
|
|
70
59
|
paths = if ARGV.empty?
|
71
60
|
options[:interactive_eof] = true
|
72
|
-
|
73
|
-
tmp_file << "\n" # one empty line makes irb of 1.9.2 happy
|
74
|
-
tmp_file.flush
|
75
|
-
tmp_path = tmp_file.path
|
76
|
-
at_exit do
|
77
|
-
require 'irt/utils'
|
78
|
-
if File.read(tmp_path).length > 1
|
79
|
-
prompter.yes? %(The template file has been modified, do you want to save it?) do
|
80
|
-
prompter.choose %(Enter the file path to save:), /[\w0-9_]/ do |as_file|
|
81
|
-
IRT::Utils.save_as(tmp_path, as_file, prompter){ system(ENV['IRT_COMMAND']) }
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
85
|
-
end
|
86
|
-
[ tmp_path ]
|
61
|
+
[ IRT::Utils.create_tmp_file ]
|
87
62
|
else
|
88
63
|
ARGV.map {|p| File.expand_path(p) }
|
89
64
|
end
|
90
65
|
|
91
66
|
files = paths.map do |path|
|
92
67
|
unless File.exists?(path)
|
93
|
-
next if
|
68
|
+
next if IRT::Prompter.no? %(Do you want to create the file "#{path}"?), :hint => '[<enter=y|n]', :default => 'y'
|
94
69
|
options[:interactive_eof] = true
|
95
70
|
dirname = File.dirname(path)
|
96
71
|
FileUtils.mkdir_p(dirname) unless File.directory?(dirname)
|
97
72
|
File.open(path, 'w') {|f| f.puts "\n" } # one empty line makes irb of 1.9.2 happy
|
98
73
|
end
|
99
74
|
File.directory?(path) ? Dir.glob(File.join(path, '**/*.irt')) : path
|
100
|
-
end.flatten
|
75
|
+
end.flatten.compact
|
101
76
|
|
102
77
|
if files.empty?
|
103
|
-
|
78
|
+
IRT::Prompter.say_notice 'No *.irt files to run'
|
104
79
|
exit
|
105
80
|
end
|
106
81
|
|
107
82
|
cmd_format = if File.exists?('./config/environment.rb') && !options[:no_rails]
|
83
|
+
ENV['RAILS_ENV'] = options[:rails_env]
|
108
84
|
if File.exists?('./script/rails')
|
109
85
|
gemfile = File.read('Gemfile')
|
110
86
|
unless gemfile.match(/\bgem\b.+\birt\b/)
|
111
|
-
|
112
|
-
|
87
|
+
IRT::Prompter.say_warning %(The Gemfile doesn't look to include any 'gem "irt"' statement.\nIRT will probably not work until you add it!)
|
88
|
+
IRT::Prompter.yes?("Do you want to add irt to your Gemfile?", :hint => '[enter=y|n]', :default => 'y') do
|
113
89
|
File.open('Gemfile', 'a') do |f|
|
114
90
|
f.puts %(gem "irt")
|
115
91
|
end
|
@@ -117,20 +93,16 @@ cmd_format = if File.exists?('./config/environment.rb') && !options[:no_rails]
|
|
117
93
|
end
|
118
94
|
'rails c %s %s %s'
|
119
95
|
elsif File.exists?('./script/console')
|
120
|
-
'ruby script/console --irb="irt_rails2 %s"'
|
96
|
+
'ruby script/console --irb="irt_rails2 %2$s" %1$s %3$s'
|
121
97
|
end
|
122
98
|
else
|
123
99
|
'irt_irb %s %s'
|
124
100
|
end
|
125
101
|
|
126
|
-
if cmd_format.match(/^ruby script\/console/)
|
127
|
-
ENV['RAILS_ENV'] ||= options[:rails_env]
|
128
|
-
end
|
129
|
-
|
130
102
|
ENV['IRT_INTERACTIVE_EOF'] = options[:interactive_eof].inspect if options[:interactive_eof]
|
131
103
|
|
132
104
|
files.each do |file|
|
133
|
-
ENV['IRT_COMMAND'] = sprintf cmd_format,
|
105
|
+
ENV['IRT_COMMAND'] = sprintf cmd_format, options[:irb_options], file, options[:rails_env]
|
134
106
|
unless system(ENV['IRT_COMMAND'])
|
135
107
|
puts Dye.sgr(:clear) if Dye.color?
|
136
108
|
exit(1)
|
data/bin/irt_irb
CHANGED
File without changes
|
data/irt.gemspec
CHANGED
@@ -12,8 +12,8 @@ Gem::Specification.new do |s|
|
|
12
12
|
s.description = 'If you use IRT in place of irb or rails console, you will have more tools that will make your life a lot easier.'
|
13
13
|
|
14
14
|
s.add_runtime_dependency('differ', [">= 0.1.1"])
|
15
|
-
s.add_runtime_dependency('dye', [">= 0.1.
|
16
|
-
s.add_runtime_dependency('prompter', [">= 0.1.
|
15
|
+
s.add_runtime_dependency('dye', [">= 0.1.3"])
|
16
|
+
s.add_runtime_dependency('prompter', [">= 0.1.4"])
|
17
17
|
if IRT::RubyVersion >= '1.9.2'
|
18
18
|
s.add_runtime_dependency('bri', [">= 0.1.5"])
|
19
19
|
else
|
data/lib/irt/commands/core.rb
CHANGED
@@ -21,6 +21,7 @@ module IRT
|
|
21
21
|
alias_method :open_session, :irt # legacy method
|
22
22
|
|
23
23
|
def vdiff(a,b)
|
24
|
+
ensure_session
|
24
25
|
puts IRT::Differ.new(a,b, :value, {:a_marker => 'a',
|
25
26
|
:b_marker => 'b',
|
26
27
|
:a_label => '',
|
@@ -29,17 +30,29 @@ module IRT
|
|
29
30
|
alias_method :vd, :vdiff
|
30
31
|
|
31
32
|
# rerun the same shell command
|
32
|
-
def
|
33
|
+
def restart
|
33
34
|
ensure_session
|
35
|
+
ensure_cli
|
34
36
|
IRB.irb_at_exit
|
35
|
-
str = "
|
37
|
+
str = "Restarting: `#{ENV['IRT_COMMAND']}`"
|
36
38
|
puts
|
37
39
|
puts IRT.dye(" #{str} ", "*** #{str} ***", :error_color, :bold, :reversed)
|
38
40
|
puts
|
39
41
|
exec ENV["IRT_COMMAND"]
|
40
42
|
end
|
43
|
+
alias_method :r!, :restart
|
44
|
+
|
45
|
+
def rerun
|
46
|
+
ensure_session
|
47
|
+
IRT::Session.run_file
|
48
|
+
end
|
41
49
|
alias_method :rr, :rerun
|
42
50
|
|
51
|
+
def run(file_path)
|
52
|
+
ensure_session
|
53
|
+
IRT::Session.run_file file_path
|
54
|
+
end
|
55
|
+
|
43
56
|
def sh(*args)
|
44
57
|
system *args
|
45
58
|
end
|
data/lib/irt/commands/edit.rb
CHANGED
@@ -14,20 +14,19 @@ module IRT
|
|
14
14
|
end
|
15
15
|
alias_method :cll, :copy_all_lines
|
16
16
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
EOE
|
17
|
+
[:vi, :nano, :edit].each do |n|
|
18
|
+
|
19
|
+
define_method(n) do |*args|
|
20
|
+
ensure_session
|
21
|
+
run_editor(n, *args)
|
22
|
+
end
|
23
|
+
|
24
|
+
define_method(:"c#{n}") do |*args|
|
25
|
+
ensure_session
|
26
|
+
copy_lines
|
27
|
+
send n, *args
|
28
|
+
end
|
29
|
+
|
31
30
|
end
|
32
31
|
alias_method :nn, :nano
|
33
32
|
alias_method :ed, :edit
|
data/lib/irt/commands/help.rb
CHANGED
@@ -79,7 +79,11 @@ module IRT
|
|
79
79
|
x|q Aliases for exit (from the current session)
|
80
80
|
xx|qq Aliases for abort (abort the irt process)
|
81
81
|
status|ss Prints the session status line
|
82
|
-
|
82
|
+
run file Run an irt file (exiting from the current sessions)
|
83
|
+
rerun|rr Reruns the current irt file (exiting from the
|
84
|
+
current sessions)
|
85
|
+
restart|r! Restart the executable, reload IRT (and Rails) and
|
86
|
+
rerun the current file
|
83
87
|
irt_help|hh Shows this screen
|
84
88
|
sh command Alias for system("command") (no quotes needed)
|
85
89
|
|
data/lib/irt/commands/test.rb
CHANGED
@@ -45,8 +45,9 @@ module IRT
|
|
45
45
|
alias_method :tt, :add_test
|
46
46
|
|
47
47
|
def save_as(path)
|
48
|
-
|
49
|
-
|
48
|
+
IRT::Utils.save_as(path) do
|
49
|
+
IRT::Session.run_file path
|
50
|
+
end
|
50
51
|
end
|
51
52
|
alias_method :sa, :save_as
|
52
53
|
|
data/lib/irt/directives/test.rb
CHANGED
@@ -42,9 +42,8 @@ module IRT
|
|
42
42
|
|
43
43
|
def load_helper_files
|
44
44
|
return unless IRT.autoload_helper_files
|
45
|
-
irt_file_path = Pathname.new($0).realpath
|
46
45
|
container_path = Pathname.getwd.parent
|
47
|
-
down_path =
|
46
|
+
down_path = IRT.irt_file.relative_path_from container_path
|
48
47
|
down_path.dirname.descend do |p|
|
49
48
|
helper_path = container_path.join(p, 'irt_helper.rb')
|
50
49
|
begin
|
@@ -69,7 +68,7 @@ module IRT
|
|
69
68
|
@@diffs += 1
|
70
69
|
puts IRT.dye("#{tno}. DIFFS!", :diff_color, :bold) + IRT.dye(" #{d}\n ", :diff_color) +
|
71
70
|
IRT.dye(" at #{context.irb_path}: #{context.last_line_no} ", :file_color, :reversed, :bold)
|
72
|
-
puts IRT.
|
71
|
+
puts IRT::Differ.new(saved, actual, kind).output
|
73
72
|
IRT::Session.enter(:interactive) if IRT.irt_on_diffs
|
74
73
|
end
|
75
74
|
rescue Exception
|
@@ -19,9 +19,16 @@ module IRB
|
|
19
19
|
|
20
20
|
alias_method :x, :irb_exit
|
21
21
|
alias_method :q, :irb_exit
|
22
|
+
alias_method :irb, :irt
|
23
|
+
|
24
|
+
alias_method :original_abort, :abort
|
25
|
+
def abort
|
26
|
+
ensure_cli
|
27
|
+
IRT::Session.exit_all = true
|
28
|
+
original_abort
|
29
|
+
end
|
22
30
|
alias_method :xx, :abort
|
23
31
|
alias_method :qq, :abort
|
24
|
-
alias_method :irb, :irt
|
25
32
|
|
26
33
|
def method_missing(method, *args, &block)
|
27
34
|
IRB.conf[:MAIN_CONTEXT] && IRB.conf[:MAIN_CONTEXT].irt_mode == :file && IRT::Directives.respond_to?(method) ?
|
@@ -38,5 +45,12 @@ module IRB
|
|
38
45
|
end
|
39
46
|
end
|
40
47
|
|
48
|
+
def ensure_cli
|
49
|
+
unless IRT.cli?
|
50
|
+
m = caller[0].match(/`(\w*)'$/).captures[0]
|
51
|
+
raise IRT::SessionModeError, ":#{m} command not available. IRT didn't start with the CLI"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
41
55
|
end
|
42
56
|
end
|
@@ -103,7 +103,7 @@ private
|
|
103
103
|
bktr = e.backtrace.reject do |m|
|
104
104
|
workspace.filter_backtrace(m).nil? || !IRT.debug && File.expand_path(m).match(/^#{IRT.lib_path}/)
|
105
105
|
end
|
106
|
-
e.set_backtrace
|
106
|
+
e.set_backtrace map_backtrace(bktr)
|
107
107
|
end
|
108
108
|
|
109
109
|
def map_backtrace(bktr)
|
@@ -117,7 +117,9 @@ private
|
|
117
117
|
index = sprintf index_format, " [#{i}]"
|
118
118
|
end
|
119
119
|
mapped_bktr << "#{m}#{index}"
|
120
|
+
break if m.match /^\(irt\#\d+\)/
|
120
121
|
end
|
122
|
+
# mapped_bktr.last << "\n" if mapped_bktr.last && !mapped_bktr.last.match(/\n$/)
|
121
123
|
mapped_bktr
|
122
124
|
end
|
123
125
|
|
@@ -145,7 +147,7 @@ private
|
|
145
147
|
i = -1
|
146
148
|
str.each_line do |l|
|
147
149
|
@last_line_no = line_no + i+=1
|
148
|
-
|
150
|
+
if irt_mode == :file || l !~ /^\s*(#{quoted_option_string(IRT.log.ignored_commands)})\b/
|
149
151
|
IRT.log.add_line l, @last_line_no
|
150
152
|
end
|
151
153
|
end
|
data/lib/irt/extensions/irb.rb
CHANGED
@@ -5,22 +5,22 @@ require 'irt/extensions/irb/commands'
|
|
5
5
|
module IRB #:nodoc:
|
6
6
|
|
7
7
|
class << self
|
8
|
-
alias_method :
|
9
|
-
alias_method :
|
8
|
+
alias_method :original_init_config, :init_config
|
9
|
+
alias_method :original_setup, :setup
|
10
10
|
end
|
11
11
|
|
12
12
|
def IRB.setup(ap_path=nil)
|
13
|
-
|
14
|
-
IRT.
|
13
|
+
original_setup(ap_path)
|
14
|
+
IRT.setup
|
15
15
|
end
|
16
16
|
|
17
17
|
def IRB.init_config(ap_path)
|
18
|
-
|
18
|
+
original_init_config(ap_path)
|
19
19
|
|
20
20
|
@CONF[:AP_NAME] = 'irt'
|
21
21
|
@CONF[:PROMPT][:IRT] = { :PROMPT_I => "%02n >> ",
|
22
22
|
:PROMPT_S => ' "> ',
|
23
|
-
:PROMPT_C => "%02n
|
23
|
+
:PROMPT_C => "%02n .> ",
|
24
24
|
:PROMPT_N => "%02n -> ",
|
25
25
|
:RETURN => " => %s\n",
|
26
26
|
:RETURN_I => " #> %s\n" }
|
@@ -30,12 +30,12 @@ module IRB #:nodoc:
|
|
30
30
|
@CONF[:SAVE_HISTORY] = 100
|
31
31
|
@CONF[:HISTORY_FILE] = File.expand_path '~/.irt-history'
|
32
32
|
@CONF[:AT_EXIT] ||= []
|
33
|
-
@CONF[:AT_EXIT] << proc{ IRT::Session.enter(:interactive)
|
33
|
+
@CONF[:AT_EXIT] << proc{ IRT::Session.enter(:interactive) \
|
34
|
+
if IRB.CurrentContext.irt_mode == :file && !IRT::Session.exit_all?} \
|
35
|
+
if !!ENV['IRT_INTERACTIVE_EOF']
|
34
36
|
@CONF[:AT_EXIT] << proc{ IRT::Directives.test_summary }
|
35
|
-
@CONF[:AT_EXIT] << proc{ print "\e[0m" if Dye.color? } # reset colors
|
36
37
|
@CONF[:RC_NAME_GENERATOR] = proc {|rc| File.expand_path '~/.irtrc' }
|
37
38
|
|
38
|
-
IRT.init_config
|
39
39
|
end
|
40
40
|
|
41
41
|
end
|
@@ -12,16 +12,22 @@ class Method
|
|
12
12
|
end
|
13
13
|
arr = Array.new(n)
|
14
14
|
set_trace_func proc{ |event, file, line, meth_name, binding, classname|
|
15
|
-
if
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
15
|
+
if name == meth_name
|
16
|
+
case event
|
17
|
+
when 'call'
|
18
|
+
f = file
|
19
|
+
l = line
|
20
|
+
throw :method_located
|
21
|
+
when 'c-call'
|
22
|
+
f = "(c-func)"
|
23
|
+
throw :method_located
|
24
|
+
end
|
20
25
|
end
|
21
26
|
}
|
22
27
|
catch(:method_located) { call *arr }
|
23
|
-
set_trace_func nil
|
24
28
|
[f,l]
|
29
|
+
ensure
|
30
|
+
set_trace_func nil
|
25
31
|
end
|
26
32
|
|
27
33
|
def info
|
data/lib/irt/extensions/rails.rb
CHANGED
@@ -4,6 +4,8 @@ class ActiveSupport::BufferedLogger
|
|
4
4
|
|
5
5
|
def add(*args)
|
6
6
|
message = original_add(*args)
|
7
|
+
# no inline log when in rails server and not interactive mode
|
8
|
+
return message if IRB.CurrentContext.nil? || IRT.rails_server && IRB.CurrentContext.irt_mode != :interactive
|
7
9
|
if IRT.rails_log
|
8
10
|
if IRT.dye_rails_log
|
9
11
|
plain_message = Dye.strip_ansi(message).chomp
|
@@ -16,22 +18,90 @@ class ActiveSupport::BufferedLogger
|
|
16
18
|
|
17
19
|
end
|
18
20
|
|
21
|
+
module Kernel
|
22
|
+
|
23
|
+
alias_method :original_irt, :irt
|
24
|
+
def irt(bind)
|
25
|
+
raise IRT::ArgumentTypeError, "You must pass binding instead of #{bind.class.name} object" unless bind.is_a?(Binding)
|
26
|
+
IRT.send(:rails_server_notice_wrap) do
|
27
|
+
IRT::Utils.load_irt
|
28
|
+
IRT::Session.enter :binding, bind
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
require 'rack/server'
|
35
|
+
module Rack
|
36
|
+
class Server
|
37
|
+
alias_method :original_server, :server
|
38
|
+
def server
|
39
|
+
# override the SIGINT trap in the Rack::Server.start method allowing multiple choices
|
40
|
+
# since #server is also called after the Rack::Server.start trap
|
41
|
+
IRT::Utils.load_irt(false)
|
42
|
+
IRT.rails_server_sigint_trap = trap('SIGINT') { IRT.rails_signal_handle }
|
43
|
+
IRT.rails_server = original_server
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
19
48
|
module IRT
|
49
|
+
|
50
|
+
def rails_signal_handle
|
51
|
+
puts
|
52
|
+
rails_server_notice_wrap do
|
53
|
+
trap('SIGINT'){}
|
54
|
+
input = IRT::Prompter.choose " [s]hutdown, [i]rt or [c]ancel?", /^(s|i|c)$/i,
|
55
|
+
:hint => '[<enter>=s|i|c]', :default => 's'
|
56
|
+
trap('SIGINT') { rails_signal_handle }
|
57
|
+
case input
|
58
|
+
when 's'
|
59
|
+
IRT.rails_server_sigint_trap.call
|
60
|
+
when 'i'
|
61
|
+
Session.enter :interactive
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
private
|
67
|
+
|
68
|
+
def rails_server_notice_wrap
|
69
|
+
return yield unless rails_server
|
70
|
+
IRT::Prompter.say_notice "Server suspended"
|
71
|
+
yield
|
72
|
+
IRT::Prompter.say_notice "Server resumed"
|
73
|
+
end
|
74
|
+
|
75
|
+
|
76
|
+
module Session
|
77
|
+
|
78
|
+
alias_method :original_run_file, :run_file
|
79
|
+
def run_file(*args)
|
80
|
+
original_run_file *args
|
81
|
+
ensure
|
82
|
+
if IRT.rails_server
|
83
|
+
IRB.irb_at_exit
|
84
|
+
enter :interactive
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
89
|
+
|
20
90
|
module Commands
|
21
91
|
module Rails
|
22
92
|
|
23
|
-
extend self
|
93
|
+
extend self # ignored_echo_commands
|
24
94
|
|
25
95
|
def rails_log_on
|
26
96
|
IRT.rails_log = true
|
27
|
-
"Rails Log ON"
|
97
|
+
IRT::Prompter.say_notice "Rails Log ON"
|
28
98
|
end
|
29
99
|
alias_method :rlon, :rails_log_on
|
30
100
|
alias_method :rlo, :rails_log_on
|
31
101
|
|
32
102
|
def rails_log_off
|
33
103
|
IRT.rails_log = false
|
34
|
-
"Rails Log OFF"
|
104
|
+
IRT::Prompter.say_notice "Rails Log OFF"
|
35
105
|
end
|
36
106
|
alias_method :rloff, :rails_log_off
|
37
107
|
alias_method :rlf, :rails_log_off
|
data/lib/irt/log.rb
CHANGED
@@ -6,17 +6,17 @@ module IRT
|
|
6
6
|
|
7
7
|
def initialize
|
8
8
|
@ignored_echo_commands = FileUtils.own_methods + [:_]
|
9
|
-
@ignored_echo_commands += IRT::Commands::Rails.own_methods if defined?(IRT::Commands::Rails)
|
10
9
|
@ignored_echo_commands = @ignored_echo_commands.map(&:to_sym)
|
11
10
|
@ignored_commands = @ignored_echo_commands +
|
12
11
|
IRB::ExtendCommandBundle.instance_methods +
|
13
12
|
[ :p, :pp, :ap, :y, :puts, :print, :irt, :irb ]
|
13
|
+
@ignored_commands += IRT::Commands::Rails.own_methods if defined?(IRT::Commands::Rails)
|
14
14
|
@ignored_commands = @ignored_commands.map(&:to_sym)
|
15
15
|
@non_setting_commands = @ignored_commands + IRT::Directives.own_methods
|
16
16
|
@non_setting_commands = @non_setting_commands.map(&:to_sym)
|
17
17
|
@tail_size = tail_size || 10
|
18
18
|
self << FileHunk.new(IRT.irt_file)
|
19
|
-
@status = [[
|
19
|
+
@status = [[IRT.irt_file.basename, :file]]
|
20
20
|
end
|
21
21
|
|
22
22
|
def add_hunk
|
data/lib/irt/prompter.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'prompter'
|
2
|
+
|
3
|
+
module IRT
|
4
|
+
class Prompter
|
5
|
+
|
6
|
+
extend ::Prompter::Methods
|
7
|
+
|
8
|
+
if IRT.respond_to?(:dye_styles)
|
9
|
+
::Prompter.dye_styles[:say_notice_style] = IRT.dye_styles[:ignored_color]
|
10
|
+
::Prompter.dye_styles[:ask_style] = IRT.dye_styles[:interactive_color]
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.say_echo(result, opts={})
|
14
|
+
if defined?(IRB)
|
15
|
+
IRB.CurrentContext.send :output_ignored_echo_value, result
|
16
|
+
else
|
17
|
+
say_notice result
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.say_notice(message="", opts={})
|
22
|
+
opts = { :prefix => ' #> ' }.merge opts
|
23
|
+
super message, opts
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.ask(prompt, opts={})
|
27
|
+
opts = { :prefix => ' ?> ' }.merge opts
|
28
|
+
super prompt, opts
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
data/lib/irt/session.rb
CHANGED
@@ -2,6 +2,14 @@ module IRT
|
|
2
2
|
module Session
|
3
3
|
extend self
|
4
4
|
|
5
|
+
@@exit_all = false
|
6
|
+
def exit_all?
|
7
|
+
@@exit_all
|
8
|
+
end
|
9
|
+
def exit_all=(bool)
|
10
|
+
@@exit_all = bool
|
11
|
+
end
|
12
|
+
|
5
13
|
def enter(mode, obj=nil)
|
6
14
|
IRT.log.print if IRT.tail_on_irt
|
7
15
|
ws = obj ? IRB::WorkSpace.new(obj) : IRB.CurrentContext.workspace
|
@@ -26,23 +34,51 @@ module IRT
|
|
26
34
|
IRT.log.add_hunk
|
27
35
|
IRT.log.status << [new_context.irb_name, mode]
|
28
36
|
IRT.log.print_status unless mode == :file
|
37
|
+
old_trap = trap('SIGINT'){new_context.irb.signal_handle}
|
29
38
|
catch(:IRB_EXIT) { new_context.irb.eval_input }
|
39
|
+
# rethrow if there is a parent context, and it is a reading file
|
40
|
+
begin throw(:IRB_EXIT) ; rescue ArgumentError ; end if @@exit_all
|
30
41
|
ensure
|
31
|
-
IRT::Session.exit
|
42
|
+
IRT::Session.exit unless @@exit_all
|
43
|
+
trap 'SIGINT', old_trap if old_trap
|
32
44
|
end
|
33
45
|
|
34
46
|
def exit
|
35
47
|
exiting_context = IRB.conf[:MAIN_CONTEXT]
|
36
48
|
resuming_context = exiting_context.parent_context
|
49
|
+
return unless resuming_context
|
37
50
|
exiting_mode = exiting_context.irt_mode
|
38
51
|
resuming_context.set_last_value( exiting_context.last_value ) \
|
39
52
|
unless (exiting_mode == :inspect || exiting_mode == :binding)
|
53
|
+
IRB.conf[:MAIN_CONTEXT] = resuming_context
|
40
54
|
IRT.log.pop_status
|
41
55
|
IRT.log.print_status unless resuming_context.irt_mode == :file
|
42
|
-
IRB.conf[:MAIN_CONTEXT] = resuming_context
|
43
56
|
IRT.log.add_hunk
|
44
57
|
end
|
45
58
|
|
59
|
+
def run_file(file_path=IRT.irt_file)
|
60
|
+
raise Errno::ENOENT, "No such file or directory - #{file_path}" unless File.exist?(file_path)
|
61
|
+
openfile = proc do
|
62
|
+
@@exit_all = false
|
63
|
+
IRB.conf[:AT_EXIT].pop
|
64
|
+
IRT.init_file(file_path)
|
65
|
+
irb = IRB::Irb.new(nil, IRT.irt_file.to_s)
|
66
|
+
irb.context.irt_mode = :file
|
67
|
+
irb.context.irb_path = IRT.irt_file.to_s
|
68
|
+
irb.context.irb_name = IRT.irt_file.basename
|
69
|
+
IRB.conf[:MAIN_CONTEXT] = irb.context
|
70
|
+
begin
|
71
|
+
catch(:IRB_EXIT) { irb.eval_input }
|
72
|
+
ensure
|
73
|
+
IRB.irb_at_exit
|
74
|
+
end
|
75
|
+
end
|
76
|
+
IRB.conf[:AT_EXIT].push(openfile)
|
77
|
+
@@exit_all = true
|
78
|
+
throw(:IRB_EXIT)
|
79
|
+
end
|
80
|
+
|
81
|
+
|
46
82
|
private
|
47
83
|
|
48
84
|
# used for open the last file for editing
|
data/lib/irt/utils.rb
CHANGED
@@ -1,21 +1,62 @@
|
|
1
|
+
require 'irt/prompter'
|
2
|
+
|
1
3
|
module IRT
|
2
4
|
module Utils
|
3
5
|
|
4
6
|
extend self
|
5
7
|
|
6
|
-
|
8
|
+
# this will create a tmp file and start IRB
|
9
|
+
# but it will be left in file mode at EOF (sort of irt-standby)
|
10
|
+
def load_irt(run=true)
|
11
|
+
return if IRT.initialized
|
12
|
+
puts IRT::Utils.copyright
|
13
|
+
ARGV.clear
|
14
|
+
tmp_path = create_tmp_file run
|
15
|
+
ARGV.push tmp_path
|
16
|
+
IRB.start
|
17
|
+
end
|
18
|
+
|
19
|
+
def create_tmp_file(run=true)
|
20
|
+
require 'tempfile'
|
21
|
+
tmp_file = Tempfile.new(['', '.irt'])
|
22
|
+
tmp_file << "\n" # one empty line makes irb of 1.9.2 happy
|
23
|
+
tmp_file.flush
|
24
|
+
tmp_path = tmp_file.path
|
25
|
+
at_exit { check_save_tmp_file(tmp_file, run) }
|
26
|
+
tmp_path
|
27
|
+
end
|
28
|
+
|
29
|
+
def save_as(as_file_local, run=true)
|
7
30
|
as_file = File.expand_path(as_file_local)
|
8
31
|
if File.exists?(as_file)
|
9
|
-
return false if
|
32
|
+
return false if IRT::Prompter.no? %(Do you want to overwrite "#{as_file}"?), :hint => '[y|<enter=n]', :default => 'n'
|
10
33
|
end
|
11
34
|
dirname = File.dirname(as_file)
|
12
35
|
FileUtils.mkdir_p(dirname) unless File.directory?(dirname)
|
13
|
-
FileUtils.cp
|
14
|
-
if
|
15
|
-
|
16
|
-
|
36
|
+
FileUtils.cp IRT.irt_file, as_file
|
37
|
+
if run && IRT::Prompter.yes?( %(Do you want to run the file "#{as_file_local}" now?) )
|
38
|
+
IRT::Session.run_file as_file
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def version
|
43
|
+
@version ||= File.read(File.expand_path('../../../VERSION', __FILE__)).strip
|
44
|
+
end
|
45
|
+
|
46
|
+
def copyright
|
47
|
+
@copyrignt ||= Dye.dye "irt #{version} (c) 2010-2011 Domizio Demichelis", :blue, :bold
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
def check_save_tmp_file(tmp_file, run)
|
53
|
+
if tmp_file.size > 1
|
54
|
+
IRT::Prompter.yes? %(The template file has been modified, do you want to save it?) do
|
55
|
+
IRT::Prompter.choose %(Enter the file path to save:), /[\w0-9_]/ do |as_file|
|
56
|
+
save_as(as_file, run)
|
57
|
+
end
|
58
|
+
end
|
17
59
|
end
|
18
|
-
true
|
19
60
|
end
|
20
61
|
|
21
62
|
end
|
data/lib/irt.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
at_exit{ Dye.print_reset_colors }
|
2
|
+
|
1
3
|
require 'rubygems'
|
2
4
|
|
3
5
|
require 'pp'
|
@@ -16,6 +18,7 @@ require 'irt/differ'
|
|
16
18
|
require 'irt/directives'
|
17
19
|
require 'irt/session'
|
18
20
|
require 'irt/ruby_version'
|
21
|
+
require 'irt/utils'
|
19
22
|
|
20
23
|
module IRT
|
21
24
|
|
@@ -41,18 +44,21 @@ module IRT
|
|
41
44
|
|
42
45
|
extend self
|
43
46
|
|
44
|
-
attr_accessor :irt_on_diffs, :tail_on_irt, :fix_readline_prompt, :debug,
|
45
|
-
:
|
47
|
+
attr_accessor :irt_on_diffs, :tail_on_irt, :fix_readline_prompt, :debug,
|
48
|
+
:rails_log, :dye_rails_log, :rails_server, :rails_server_sigint_trap,
|
49
|
+
:full_exit, :session_no, :autoload_helper_files, :dye_styles,
|
46
50
|
:copy_to_clipboard_command, :nano_command_format, :vi_command_format, :edit_command_format, :ri_command_format
|
47
|
-
attr_reader :log, :irt_file, :
|
51
|
+
attr_reader :log, :irt_file, :initialized
|
52
|
+
|
53
|
+
def cli?
|
54
|
+
!!ENV['IRT_COMMAND']
|
55
|
+
end
|
48
56
|
|
49
57
|
def force_color=(bool)
|
50
58
|
Dye.color = bool
|
51
59
|
end
|
52
60
|
|
53
61
|
def init_config
|
54
|
-
@session_no = 0
|
55
|
-
@differ = IRT::Differ
|
56
62
|
@irt_on_diffs = true
|
57
63
|
@tail_on_irt = false
|
58
64
|
@fix_readline_prompt = false
|
@@ -97,12 +103,7 @@ module IRT
|
|
97
103
|
@debug = false
|
98
104
|
end
|
99
105
|
|
100
|
-
def
|
101
|
-
@irt_file = IRB.conf[:SCRIPT]
|
102
|
-
require 'irt/extensions/rails' if defined?(ActiveSupport::BufferedLogger)
|
103
|
-
@log = Log.new
|
104
|
-
@log.print_running_file
|
105
|
-
IRT::Directives.load_helper_files
|
106
|
+
def setup
|
106
107
|
IRB::ExtendCommandBundle.class_eval do
|
107
108
|
[:p, :y, :pp, :ap].each do |m|
|
108
109
|
next unless begin
|
@@ -115,6 +116,17 @@ module IRT
|
|
115
116
|
end
|
116
117
|
end
|
117
118
|
end
|
119
|
+
@initialized = true
|
120
|
+
init_file
|
121
|
+
end
|
122
|
+
|
123
|
+
def init_file(file = nil)
|
124
|
+
@session_no = 0
|
125
|
+
irt_file = file.nil? ? IRB.conf[:SCRIPT] : (IRB.conf[:SCRIPT] = file)
|
126
|
+
@irt_file = Pathname.new(irt_file).realpath
|
127
|
+
@log = Log.new
|
128
|
+
IRT::Directives.load_helper_files
|
129
|
+
@log.print_running_file
|
118
130
|
end
|
119
131
|
|
120
132
|
def lib_path
|
@@ -128,15 +140,8 @@ module IRT
|
|
128
140
|
yml.gsub(/ +\n/, "\n")
|
129
141
|
end
|
130
142
|
|
131
|
-
def prompter
|
132
|
-
@prompter ||= begin
|
133
|
-
require 'prompter'
|
134
|
-
Prompter.new do |pr|
|
135
|
-
def pr.say_echo(result, opts={})
|
136
|
-
IRB.CurrentContext.send :output_ignored_echo_value, result
|
137
|
-
end
|
138
|
-
end
|
139
|
-
end
|
140
|
-
end
|
141
|
-
|
142
143
|
end
|
144
|
+
|
145
|
+
IRT.init_config
|
146
|
+
require 'irt/prompter'
|
147
|
+
require 'irt/extensions/rails' if defined?(ActiveSupport::BufferedLogger)
|
metadata
CHANGED
@@ -1,8 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: irt
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
|
4
|
+
hash: 957451098
|
5
|
+
prerelease: true
|
6
|
+
segments:
|
7
|
+
- 1
|
8
|
+
- 2
|
9
|
+
- 0
|
10
|
+
- p01
|
11
|
+
version: 1.2.0.p01
|
6
12
|
platform: ruby
|
7
13
|
authors:
|
8
14
|
- Domizio Demichelis
|
@@ -10,7 +16,7 @@ autorequire:
|
|
10
16
|
bindir: bin
|
11
17
|
cert_chain: []
|
12
18
|
|
13
|
-
date: 2011-02-
|
19
|
+
date: 2011-02-17 00:00:00 -04:00
|
14
20
|
default_executable:
|
15
21
|
dependencies:
|
16
22
|
- !ruby/object:Gem::Dependency
|
@@ -21,6 +27,11 @@ dependencies:
|
|
21
27
|
requirements:
|
22
28
|
- - ">="
|
23
29
|
- !ruby/object:Gem::Version
|
30
|
+
hash: 25
|
31
|
+
segments:
|
32
|
+
- 0
|
33
|
+
- 1
|
34
|
+
- 1
|
24
35
|
version: 0.1.1
|
25
36
|
type: :runtime
|
26
37
|
version_requirements: *id001
|
@@ -32,7 +43,12 @@ dependencies:
|
|
32
43
|
requirements:
|
33
44
|
- - ">="
|
34
45
|
- !ruby/object:Gem::Version
|
35
|
-
|
46
|
+
hash: 29
|
47
|
+
segments:
|
48
|
+
- 0
|
49
|
+
- 1
|
50
|
+
- 3
|
51
|
+
version: 0.1.3
|
36
52
|
type: :runtime
|
37
53
|
version_requirements: *id002
|
38
54
|
- !ruby/object:Gem::Dependency
|
@@ -43,18 +59,29 @@ dependencies:
|
|
43
59
|
requirements:
|
44
60
|
- - ">="
|
45
61
|
- !ruby/object:Gem::Version
|
46
|
-
|
62
|
+
hash: 19
|
63
|
+
segments:
|
64
|
+
- 0
|
65
|
+
- 1
|
66
|
+
- 4
|
67
|
+
version: 0.1.4
|
47
68
|
type: :runtime
|
48
69
|
version_requirements: *id003
|
49
70
|
- !ruby/object:Gem::Dependency
|
50
|
-
name:
|
71
|
+
name: fastri
|
51
72
|
prerelease: false
|
52
73
|
requirement: &id004 !ruby/object:Gem::Requirement
|
53
74
|
none: false
|
54
75
|
requirements:
|
55
76
|
- - ">="
|
56
77
|
- !ruby/object:Gem::Version
|
57
|
-
|
78
|
+
hash: 81
|
79
|
+
segments:
|
80
|
+
- 0
|
81
|
+
- 3
|
82
|
+
- 1
|
83
|
+
- 1
|
84
|
+
version: 0.3.1.1
|
58
85
|
type: :runtime
|
59
86
|
version_requirements: *id004
|
60
87
|
description: If you use IRT in place of irb or rails console, you will have more tools that will make your life a lot easier.
|
@@ -101,6 +128,7 @@ files:
|
|
101
128
|
- lib/irt/hunks.rb
|
102
129
|
- lib/irt/init.rb
|
103
130
|
- lib/irt/log.rb
|
131
|
+
- lib/irt/prompter.rb
|
104
132
|
- lib/irt/ruby_version.rb
|
105
133
|
- lib/irt/session.rb
|
106
134
|
- lib/irt/utils.rb
|
@@ -118,17 +146,25 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
118
146
|
requirements:
|
119
147
|
- - ">="
|
120
148
|
- !ruby/object:Gem::Version
|
149
|
+
hash: 3
|
150
|
+
segments:
|
151
|
+
- 0
|
121
152
|
version: "0"
|
122
153
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
123
154
|
none: false
|
124
155
|
requirements:
|
125
156
|
- - ">="
|
126
157
|
- !ruby/object:Gem::Version
|
158
|
+
hash: 23
|
159
|
+
segments:
|
160
|
+
- 1
|
161
|
+
- 3
|
162
|
+
- 6
|
127
163
|
version: 1.3.6
|
128
164
|
requirements: []
|
129
165
|
|
130
166
|
rubyforge_project:
|
131
|
-
rubygems_version: 1.
|
167
|
+
rubygems_version: 1.3.7
|
132
168
|
signing_key:
|
133
169
|
specification_version: 3
|
134
170
|
summary: Interactive Ruby Tools - Improved irb and rails console with a lot of easy and powerful tools.
|