dietrb 0.5.2 → 0.6.0
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/Rakefile +17 -17
- data/TODO +6 -1
- data/dietrb.gemspec +2 -2
- data/lib/irb/context.rb +19 -6
- data/lib/irb/deprecated.rb +5 -1
- data/lib/irb/driver/tty.rb +19 -2
- data/lib/irb/ext/colorize.rb +2 -2
- data/lib/irb/ext/completion.rb +19 -6
- data/lib/irb/formatter.rb +45 -11
- data/lib/irb/source.rb +1 -1
- data/lib/irb/version.rb +2 -2
- data/spec/context_spec.rb +24 -9
- data/spec/driver/readline_spec.rb +21 -1
- data/spec/driver/tty_spec.rb +39 -8
- data/spec/ext/completion_spec.rb +7 -0
- data/spec/formatter_spec.rb +61 -3
- metadata +5 -5
data/Rakefile
CHANGED
@@ -53,20 +53,20 @@ namespace :macruby do
|
|
53
53
|
end
|
54
54
|
end
|
55
55
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
56
|
+
begin
|
57
|
+
require 'rubygems'
|
58
|
+
require 'jeweler'
|
59
|
+
require File.expand_path('../lib/irb/version', __FILE__)
|
60
|
+
Jeweler::Tasks.new do |gemspec|
|
61
|
+
gemspec.name = "dietrb"
|
62
|
+
gemspec.version = IRB::VERSION::STRING
|
63
|
+
gemspec.summary = gemspec.description = "IRB on a diet, for MacRuby / Ruby 1.9"
|
64
|
+
gemspec.email = "eloy.de.enige@gmail.com"
|
65
|
+
gemspec.homepage = "http://github.com/alloy/dietrb"
|
66
|
+
gemspec.authors = ["Eloy Duran"]
|
67
|
+
|
68
|
+
gemspec.required_ruby_version = ::Gem::Requirement.new("~> 1.9")
|
69
|
+
gemspec.files.reject! { |file| file =~ /^(extensions|\.gitignore|\w+_prototype\.rb)/ }
|
70
|
+
end
|
71
|
+
rescue LoadError
|
72
|
+
end
|
data/TODO
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
* Complete file paths in strings (for require etc).
|
2
1
|
* Write docs for using a as library. Probably right after creating a Cocoa client.
|
3
2
|
* Write a not useless README.
|
4
3
|
* Add specs for irb/driver/socket, and possibly for bin/dietrb.
|
@@ -6,3 +5,9 @@
|
|
6
5
|
* Make sure the following formatters work: hirb, and looksee
|
7
6
|
* Make sure the majority of the utils in utility_belt work
|
8
7
|
* Possibly add copy-paste support as an ext
|
8
|
+
|
9
|
+
= Config
|
10
|
+
|
11
|
+
Add a global config. Modules such as the formatter can register options with it.
|
12
|
+
The modules must always check the global config, unless the option has been
|
13
|
+
explicitely overriden on the module instance. See config_prototype.rb
|
data/dietrb.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{dietrb}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.6.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Eloy Duran"]
|
12
|
-
s.date = %q{2010-
|
12
|
+
s.date = %q{2010-11-02}
|
13
13
|
s.default_executable = %q{dietrb}
|
14
14
|
s.description = %q{IRB on a diet, for MacRuby / Ruby 1.9}
|
15
15
|
s.email = %q{eloy.de.enige@gmail.com}
|
data/lib/irb/context.rb
CHANGED
@@ -11,13 +11,14 @@ module IRB
|
|
11
11
|
class Context
|
12
12
|
IGNORE_RESULT = :irb_ignore_result
|
13
13
|
|
14
|
-
attr_reader :object, :binding, :line, :source
|
14
|
+
attr_reader :object, :binding, :line, :level, :source
|
15
15
|
attr_accessor :formatter
|
16
16
|
|
17
17
|
def initialize(object, explicit_binding = nil)
|
18
18
|
@object = object
|
19
19
|
@binding = explicit_binding || object.instance_eval { binding }
|
20
20
|
@line = 1
|
21
|
+
@level = 0
|
21
22
|
clear_buffer
|
22
23
|
|
23
24
|
@last_result_assigner = __evaluate__("_ = nil; proc { |val| _ = val }")
|
@@ -59,10 +60,17 @@ module IRB
|
|
59
60
|
# But at code block indentation level 0, `quit' means exit the runloop:
|
60
61
|
#
|
61
62
|
# process_line("quit") # => false
|
63
|
+
#
|
64
|
+
# If re-indenting the line results in a new line, the reformatted line and
|
65
|
+
# prompt are yielded to the optional block. This happens *before* the line
|
66
|
+
# is actually processed, so the caller (driver) has the opportunity to
|
67
|
+
# update the last printed line.
|
62
68
|
def process_line(line)
|
63
|
-
@source << line
|
69
|
+
prompt_and_line = formatter.reindent_last_line(self) { @source << line }
|
70
|
+
yield(*prompt_and_line) if prompt_and_line && block_given?
|
71
|
+
|
64
72
|
return false if @source.terminate?
|
65
|
-
|
73
|
+
|
66
74
|
if @source.syntax_error?
|
67
75
|
output(formatter.syntax_error(@line, @source.syntax_error))
|
68
76
|
@source.pop
|
@@ -71,22 +79,27 @@ module IRB
|
|
71
79
|
clear_buffer
|
72
80
|
end
|
73
81
|
@line += 1
|
82
|
+
@level = source.level
|
74
83
|
|
75
84
|
true
|
76
85
|
end
|
77
86
|
|
87
|
+
def driver
|
88
|
+
IRB::Driver.current
|
89
|
+
end
|
90
|
+
|
78
91
|
# Output is directed to the IRB::Driver.current driver’s output if a
|
79
92
|
# current driver is available. Otherwise it’s simply printed to $stdout.
|
80
93
|
def output(string)
|
81
|
-
if driver =
|
94
|
+
if driver = self.driver
|
82
95
|
driver.output.puts(string)
|
83
96
|
else
|
84
97
|
puts(string)
|
85
98
|
end
|
86
99
|
end
|
87
100
|
|
88
|
-
def prompt
|
89
|
-
formatter.prompt(self)
|
101
|
+
def prompt(ignore_auto_indent = false)
|
102
|
+
formatter.prompt(self, ignore_auto_indent)
|
90
103
|
end
|
91
104
|
|
92
105
|
def input_line(line)
|
data/lib/irb/deprecated.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
module IRB
|
2
2
|
def self.deprecated(message, caller)
|
3
|
+
return unless $DEBUG
|
3
4
|
caller = caller.first.split(':')[0..-2].join(':')
|
4
5
|
warn "[!] Deprecation warning from #{caller}: #{message}"
|
5
6
|
end
|
@@ -31,6 +32,9 @@ module IRB
|
|
31
32
|
when :PROMPT_MODE
|
32
33
|
message = "use `IRB.formatter.prompt = :#{value.downcase}'"
|
33
34
|
IRB.formatter.prompt = "#{value.to_s.downcase}".to_sym
|
35
|
+
when :AUTO_INDENT
|
36
|
+
message = "use `IRB.formatter.auto_indent = #{value}'"
|
37
|
+
IRB.formatter.auto_indent = value
|
34
38
|
when :USE_READLINE
|
35
39
|
message = "for now DietRB only has a readline module"
|
36
40
|
when :SAVE_HISTORY
|
@@ -40,4 +44,4 @@ module IRB
|
|
40
44
|
value
|
41
45
|
end
|
42
46
|
end
|
43
|
-
end
|
47
|
+
end
|
data/lib/irb/driver/tty.rb
CHANGED
@@ -3,6 +3,11 @@ require 'irb/driver'
|
|
3
3
|
module IRB
|
4
4
|
module Driver
|
5
5
|
class TTY
|
6
|
+
move_one_line_up = "\e[1A"
|
7
|
+
move_to_begin_of_line = "\r"
|
8
|
+
clear_to_end_of_line = "\e[0K"
|
9
|
+
CLEAR_LAST_LINE = move_one_line_up + move_to_begin_of_line + clear_to_end_of_line
|
10
|
+
|
6
11
|
attr_reader :input, :output, :context_stack
|
7
12
|
|
8
13
|
def initialize(input = $stdin, output = $stdout)
|
@@ -14,7 +19,7 @@ module IRB
|
|
14
19
|
def context
|
15
20
|
@context_stack.last
|
16
21
|
end
|
17
|
-
|
22
|
+
|
18
23
|
def readline
|
19
24
|
@output.print(context.prompt)
|
20
25
|
@input.gets
|
@@ -27,6 +32,17 @@ module IRB
|
|
27
32
|
context.clear_buffer
|
28
33
|
""
|
29
34
|
end
|
35
|
+
|
36
|
+
def update_last_line(prompt, reformatted_line)
|
37
|
+
@output.print CLEAR_LAST_LINE
|
38
|
+
@output.puts("#{prompt}#{reformatted_line}")
|
39
|
+
end
|
40
|
+
|
41
|
+
def process_input(line)
|
42
|
+
context.process_line(line) do |prompt, line|
|
43
|
+
update_last_line(prompt, line)
|
44
|
+
end
|
45
|
+
end
|
30
46
|
|
31
47
|
# Feeds input into a given context.
|
32
48
|
#
|
@@ -35,7 +51,8 @@ module IRB
|
|
35
51
|
def run(context)
|
36
52
|
@context_stack << context
|
37
53
|
while line = consume
|
38
|
-
|
54
|
+
continue = process_input(line)
|
55
|
+
break unless continue
|
39
56
|
end
|
40
57
|
ensure
|
41
58
|
@context_stack.pop
|
data/lib/irb/ext/colorize.rb
CHANGED
@@ -169,7 +169,7 @@ module IRB
|
|
169
169
|
Ripper.lex(str).map { |_, type, token| colorize_token(type, token) }.join
|
170
170
|
end
|
171
171
|
|
172
|
-
def prompt(context)
|
172
|
+
def prompt(context, ignore_auto_indent = false, level = nil)
|
173
173
|
colorize_token(:prompt, super)
|
174
174
|
end
|
175
175
|
|
@@ -183,4 +183,4 @@ module IRB
|
|
183
183
|
end
|
184
184
|
end
|
185
185
|
|
186
|
-
IRB.formatter = IRB::ColoredFormatter.new
|
186
|
+
IRB.formatter = IRB::ColoredFormatter.new
|
data/lib/irb/ext/completion.rb
CHANGED
@@ -113,15 +113,28 @@ module IRB
|
|
113
113
|
end
|
114
114
|
|
115
115
|
result = if call
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
116
|
+
if m = (methods || methods_of_object(root))
|
117
|
+
format_methods(receiver, m, filter)
|
118
|
+
end
|
119
|
+
elsif root[TYPE] == :string_literal && root[VALUE][TYPE] == :string_content
|
120
|
+
# in the form of: "~/code/
|
121
|
+
expand_path(source)
|
122
|
+
else
|
123
|
+
match_methods_vars_or_consts_in_scope(root)
|
124
|
+
end
|
122
125
|
result.sort.uniq if result
|
123
126
|
end
|
124
127
|
end
|
128
|
+
|
129
|
+
def expand_path(source)
|
130
|
+
tokens = Ripper.lex(source)
|
131
|
+
path = tokens[0][2]
|
132
|
+
string_open = tokens[1][2]
|
133
|
+
end_with_slash = path.length > 1 && path.end_with?('/')
|
134
|
+
path = File.expand_path(path)
|
135
|
+
path << '/' if end_with_slash
|
136
|
+
Dir.glob("#{path}*", File::FNM_CASEFOLD).map { |f| "#{string_open}#{f}" }
|
137
|
+
end
|
125
138
|
|
126
139
|
def unwind_callstack(root, stack = [])
|
127
140
|
if root[TYPE] == :call
|
data/lib/irb/formatter.rb
CHANGED
@@ -14,26 +14,35 @@ module IRB
|
|
14
14
|
SIMPLE_PROMPT = ">> "
|
15
15
|
NO_PROMPT = ""
|
16
16
|
RESULT_PREFIX = "=>"
|
17
|
+
INDENTATION = " "
|
17
18
|
SYNTAX_ERROR = "SyntaxError: compile error\n(irb):%d: %s"
|
18
|
-
SOURCE_ROOT =
|
19
|
+
SOURCE_ROOT = Regexp.new("^#{File.expand_path('../../../', __FILE__)}")
|
19
20
|
|
20
21
|
attr_writer :prompt
|
21
22
|
attr_accessor :inspect
|
23
|
+
attr_accessor :auto_indent
|
22
24
|
attr_reader :filter_from_backtrace
|
23
25
|
|
24
26
|
def initialize
|
25
|
-
@prompt
|
26
|
-
@inspect
|
27
|
+
@prompt = :default
|
28
|
+
@inspect = true
|
29
|
+
@auto_indent = true
|
27
30
|
@filter_from_backtrace = [SOURCE_ROOT]
|
28
31
|
end
|
32
|
+
|
33
|
+
def indentation(level)
|
34
|
+
INDENTATION * level
|
35
|
+
end
|
29
36
|
|
30
|
-
def prompt(context)
|
31
|
-
|
32
|
-
|
37
|
+
def prompt(context, ignore_auto_indent = false, level = nil)
|
38
|
+
level ||= context.level
|
39
|
+
prompt = case @prompt
|
40
|
+
when :default then DEFAULT_PROMPT % [context.object.inspect, context.line, level]
|
33
41
|
when :simple then SIMPLE_PROMPT
|
34
42
|
else
|
35
43
|
NO_PROMPT
|
36
44
|
end
|
45
|
+
@auto_indent && !ignore_auto_indent ? "#{prompt}#{indentation(level)}" : prompt
|
37
46
|
end
|
38
47
|
|
39
48
|
def inspect_object(object)
|
@@ -42,12 +51,37 @@ module IRB
|
|
42
51
|
result.strip!
|
43
52
|
result
|
44
53
|
else
|
45
|
-
|
46
|
-
address += 0x100000000 if address < 0
|
47
|
-
"#<#{object.class}:0x%x>" % address
|
54
|
+
minimal_inspect_object(object)
|
48
55
|
end
|
49
56
|
end
|
50
|
-
|
57
|
+
|
58
|
+
def minimal_inspect_object(object)
|
59
|
+
address = object.__id__ * 2
|
60
|
+
address += 0x100000000 if address < 0
|
61
|
+
"#<#{object.class}:0x%x>" % address
|
62
|
+
end
|
63
|
+
|
64
|
+
def reindent_last_line(context)
|
65
|
+
unless @auto_indent
|
66
|
+
yield
|
67
|
+
nil
|
68
|
+
else
|
69
|
+
source = context.source
|
70
|
+
old_level = source.level
|
71
|
+
yield
|
72
|
+
if line = source.buffer[-1]
|
73
|
+
# only if the level raises do we use the new value
|
74
|
+
level = source.level < old_level ? source.level : old_level
|
75
|
+
new_line = "#{indentation(level)}#{line.lstrip}"
|
76
|
+
# don't return anything if the new line and level are the same
|
77
|
+
unless line == new_line && level == old_level
|
78
|
+
source.buffer[-1] = new_line
|
79
|
+
[prompt(context, true, level), new_line]
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
51
85
|
def result(object)
|
52
86
|
"#{RESULT_PREFIX} #{inspect_object(object)}"
|
53
87
|
end
|
@@ -69,4 +103,4 @@ module IRB
|
|
69
103
|
end
|
70
104
|
end
|
71
105
|
|
72
|
-
IRB.formatter = IRB::Formatter.new
|
106
|
+
IRB.formatter = IRB::Formatter.new
|
data/lib/irb/source.rb
CHANGED
data/lib/irb/version.rb
CHANGED
data/spec/context_spec.rb
CHANGED
@@ -117,28 +117,43 @@ describe "IRB::Context, when receiving input" do
|
|
117
117
|
@output = setup_current_driver.output
|
118
118
|
@context = IRB::Context.new(main)
|
119
119
|
@context.extend(InputStubMixin)
|
120
|
+
@context.formatter.auto_indent = true
|
121
|
+
end
|
122
|
+
|
123
|
+
after do
|
124
|
+
@context.formatter.auto_indent = false
|
120
125
|
end
|
121
126
|
|
122
127
|
it "adds the received code to the source buffer" do
|
123
128
|
@context.process_line("def foo")
|
124
129
|
@context.process_line("p :ok")
|
125
|
-
@context.source.to_s.should == "def foo\
|
130
|
+
@context.source.to_s.should == "def foo\n p :ok"
|
126
131
|
end
|
127
132
|
|
128
|
-
it "
|
129
|
-
|
130
|
-
@context.
|
131
|
-
|
133
|
+
it "yields the line if it changed, *after* reindenting" do
|
134
|
+
prompt_and_line = nil
|
135
|
+
@context.process_line("def foo") { |p, l| prompt_and_line = [p, l] }
|
136
|
+
prompt_and_line.should == nil
|
137
|
+
@context.process_line("p :ok") { |p, l| prompt_and_line = [p, l] }
|
138
|
+
prompt_and_line.should == ["irb(main):002:1> ", " p :ok"]
|
132
139
|
end
|
133
|
-
|
134
|
-
it "increases the current line number" do
|
140
|
+
|
141
|
+
it "increases the current line number, *after* yielding the new re-indented line" do
|
135
142
|
@context.line.should == 1
|
136
143
|
@context.process_line("def foo")
|
137
144
|
@context.line.should == 2
|
138
|
-
@context.process_line("p :ok")
|
145
|
+
@context.process_line("p :ok")
|
139
146
|
@context.line.should == 3
|
140
147
|
end
|
141
148
|
|
149
|
+
it "increases the current source level, *after* yielding the new re-indented line" do
|
150
|
+
@context.level.should == 0
|
151
|
+
@context.process_line("def foo")
|
152
|
+
@context.level.should == 1
|
153
|
+
@context.process_line("end") { |_| @context.level.should == 1 }
|
154
|
+
@context.level.should == 0
|
155
|
+
end
|
156
|
+
|
142
157
|
it "evaluates the buffered source once it's a valid code block" do
|
143
158
|
def @context.evaluate(source); @evaled = source; end
|
144
159
|
|
@@ -147,7 +162,7 @@ describe "IRB::Context, when receiving input" do
|
|
147
162
|
@context.process_line("end; p foo")
|
148
163
|
|
149
164
|
source = @context.instance_variable_get(:@evaled)
|
150
|
-
source.to_s.should == "def foo\n:ok\nend; p foo"
|
165
|
+
source.to_s.should == "def foo\n :ok\nend; p foo"
|
151
166
|
end
|
152
167
|
|
153
168
|
it "prints that a syntax error occurred on the last line and reset the buffer to the previous line" do
|
@@ -41,6 +41,11 @@ describe "IRB::Driver::Readline" do
|
|
41
41
|
@driver = IRB::Driver::Readline.new(InputStub.new, OutputStub.new)
|
42
42
|
@context = IRB::Context.new(Object.new)
|
43
43
|
@driver.context_stack << @context
|
44
|
+
Readline.clear_printed!
|
45
|
+
end
|
46
|
+
|
47
|
+
after do
|
48
|
+
@context.formatter.auto_indent = false
|
44
49
|
end
|
45
50
|
|
46
51
|
it "is a subclass of IRB::Driver::TTY" do
|
@@ -57,10 +62,25 @@ describe "IRB::Driver::Readline" do
|
|
57
62
|
end
|
58
63
|
|
59
64
|
it "reads a line through the Readline module" do
|
60
|
-
Readline.stub_input
|
65
|
+
Readline.stub_input("nom nom nom")
|
61
66
|
@driver.readline.should == "nom nom nom"
|
62
67
|
end
|
63
68
|
|
69
|
+
it "prints a prompt" do
|
70
|
+
@context.process_line("def foo")
|
71
|
+
Readline.stub_input("nom nom nom")
|
72
|
+
@driver.readline
|
73
|
+
Readline.printed.should == @context.prompt
|
74
|
+
end
|
75
|
+
|
76
|
+
it "prints a prompt with indentation if it's configured" do
|
77
|
+
@context.formatter.auto_indent = true
|
78
|
+
@context.process_line("def foo")
|
79
|
+
Readline.stub_input("nom nom nom")
|
80
|
+
@driver.readline
|
81
|
+
Readline.printed[-2,2].should == " "
|
82
|
+
end
|
83
|
+
|
64
84
|
it "tells the Readline module to use the history" do
|
65
85
|
Readline.use_history = false
|
66
86
|
Readline.stub_input "nom nom nom"
|
data/spec/driver/tty_spec.rb
CHANGED
@@ -1,21 +1,36 @@
|
|
1
1
|
require File.expand_path('../../spec_helper', __FILE__)
|
2
2
|
require 'irb/driver/tty'
|
3
3
|
|
4
|
+
main = self
|
5
|
+
|
4
6
|
describe "IRB::Driver::TTY" do
|
5
7
|
before do
|
6
8
|
@driver = IRB::Driver::TTY.new(InputStub.new, OutputStub.new)
|
7
|
-
@context = IRB::Context.new(
|
9
|
+
@context = IRB::Context.new(main)
|
8
10
|
@driver.context_stack << @context
|
9
11
|
end
|
10
|
-
|
12
|
+
|
13
|
+
after do
|
14
|
+
@context.formatter.auto_indent = false
|
15
|
+
end
|
16
|
+
|
11
17
|
it "prints the prompt and reads a line of input" do
|
12
|
-
@
|
18
|
+
@context.process_line("def foo")
|
19
|
+
@driver.input.stub_input("calzone")
|
13
20
|
@driver.readline.should == "calzone"
|
14
21
|
@driver.output.printed.should == @context.prompt
|
15
22
|
end
|
23
|
+
|
24
|
+
it "prints a prompt with indentation if it's configured" do
|
25
|
+
@context.formatter.auto_indent = true
|
26
|
+
@context.process_line("def foo")
|
27
|
+
@driver.input.stub_input("calzone")
|
28
|
+
@driver.readline
|
29
|
+
@driver.output.printed[-2,2].should == " "
|
30
|
+
end
|
16
31
|
|
17
32
|
it "consumes input" do
|
18
|
-
@driver.input.stub_input
|
33
|
+
@driver.input.stub_input("calzone")
|
19
34
|
@driver.consume.should == "calzone"
|
20
35
|
end
|
21
36
|
|
@@ -25,6 +40,22 @@ describe "IRB::Driver::TTY" do
|
|
25
40
|
@driver.consume.should == ""
|
26
41
|
@context.source.to_s.should == ""
|
27
42
|
end
|
43
|
+
|
44
|
+
it "feeds the input into the context" do
|
45
|
+
@driver.process_input("def foo")
|
46
|
+
@context.source.to_s.should == "def foo"
|
47
|
+
end
|
48
|
+
|
49
|
+
it "updates the previously printed line on the console, if a change to the input occurs (such as re-indenting)" do
|
50
|
+
@context.formatter.auto_indent = true
|
51
|
+
@driver.process_input("def foo")
|
52
|
+
@driver.process_input("p :ok")
|
53
|
+
@driver.process_input(" end")
|
54
|
+
@driver.output.printed.strip.should == [
|
55
|
+
IRB::Driver::TTY::CLEAR_LAST_LINE + "irb(main):002:1> p :ok",
|
56
|
+
IRB::Driver::TTY::CLEAR_LAST_LINE + "irb(main):003:0> end"
|
57
|
+
].join("\n")
|
58
|
+
end
|
28
59
|
end
|
29
60
|
|
30
61
|
describe "IRB::Driver::TTY, when starting the runloop" do
|
@@ -36,7 +67,7 @@ describe "IRB::Driver::TTY, when starting the runloop" do
|
|
36
67
|
|
37
68
|
it "makes the given context the current one, for this driver, for the duration of the runloop" do
|
38
69
|
$from_context = nil
|
39
|
-
@driver.input.stub_input
|
70
|
+
@driver.input.stub_input("$from_context = IRB::Driver.current.context")
|
40
71
|
@driver.run(@context)
|
41
72
|
$from_context.should == @context
|
42
73
|
IRB::Driver.current.context.should == nil
|
@@ -44,7 +75,7 @@ describe "IRB::Driver::TTY, when starting the runloop" do
|
|
44
75
|
|
45
76
|
it "feeds input into a given context" do
|
46
77
|
$from_context = false
|
47
|
-
@driver.input.stub_input
|
78
|
+
@driver.input.stub_input("$from_context = true", "exit")
|
48
79
|
@driver.run(@context)
|
49
80
|
$from_context.should == true
|
50
81
|
end
|
@@ -52,7 +83,7 @@ describe "IRB::Driver::TTY, when starting the runloop" do
|
|
52
83
|
it "makes sure there's a global output redirector while running a context" do
|
53
84
|
before = $stdout
|
54
85
|
$from_context = nil
|
55
|
-
@driver.input.stub_input
|
86
|
+
@driver.input.stub_input("$from_context = $stdout", "exit")
|
56
87
|
@driver.run(@context)
|
57
88
|
$from_context.class == IRB::Driver::OutputRedirector
|
58
89
|
$stdout.should == before
|
@@ -67,4 +98,4 @@ end
|
|
67
98
|
# irb(o)
|
68
99
|
# IRBRan.should == o
|
69
100
|
# end
|
70
|
-
# end
|
101
|
+
# end
|
data/spec/ext/completion_spec.rb
CHANGED
@@ -249,6 +249,13 @@ describe "IRB::Completion" do
|
|
249
249
|
end
|
250
250
|
end
|
251
251
|
|
252
|
+
it "completes file paths" do
|
253
|
+
complete("'/").should == Dir.glob('/*').sort.map { |f| "'#{f}" }
|
254
|
+
complete("'#{ROOT}/lib/../Ra").should == ["'#{File.join(ROOT, "Rakefile")}"]
|
255
|
+
complete("%{#{ROOT}/li").should == ['LICENSE', 'lib'].map { |f| "%{#{File.join(ROOT, f)}" }
|
256
|
+
complete("\"#{ROOT}/lib/").should == ['irb', 'irb.rb'].map { |f| "\"#{File.join(ROOT, 'lib', f)}" }
|
257
|
+
end
|
258
|
+
|
252
259
|
it "does not crash when trying to complete garbage" do
|
253
260
|
complete("/").should == nil
|
254
261
|
complete("./Rake").should == nil
|
data/spec/formatter_spec.rb
CHANGED
@@ -6,14 +6,15 @@ describe "IRB::Formatter" do
|
|
6
6
|
before do
|
7
7
|
@formatter = IRB::Formatter.new
|
8
8
|
@context = IRB::Context.new(main)
|
9
|
+
@formatter.auto_indent = false
|
9
10
|
end
|
10
11
|
|
11
12
|
it "returns a prompt string, displaying line number and code indentation level" do
|
12
13
|
@formatter.prompt(@context).should == "irb(main):001:0> "
|
13
14
|
@context.instance_variable_set(:@line, 23)
|
14
15
|
@formatter.prompt(@context).should == "irb(main):023:0> "
|
15
|
-
@context.
|
16
|
-
@formatter.prompt(@context).should == "irb(main):
|
16
|
+
@context.process_line("def foo")
|
17
|
+
@formatter.prompt(@context).should == "irb(main):024:1> "
|
17
18
|
end
|
18
19
|
|
19
20
|
it "describes the context's object in the prompt" do
|
@@ -77,4 +78,61 @@ describe "IRB::Formatter" do
|
|
77
78
|
@formatter.syntax_error(2, "syntax error, unexpected '}'").should ==
|
78
79
|
"SyntaxError: compile error\n(irb):2: syntax error, unexpected '}'"
|
79
80
|
end
|
80
|
-
|
81
|
+
|
82
|
+
it "always skips re-indenting the last line in a Source#buffer if `auto_indent' is turned off" do
|
83
|
+
@context.source << "class A"
|
84
|
+
@formatter.reindent_last_line(@context) { @context.source << "def foo" }.should == nil
|
85
|
+
@context.source.buffer.last.should == "def foo"
|
86
|
+
end
|
87
|
+
|
88
|
+
describe "with auto-indentation" do
|
89
|
+
before do
|
90
|
+
@formatter.auto_indent = true
|
91
|
+
end
|
92
|
+
|
93
|
+
it "returns the whitespace to append to the prompt, based on the given level" do
|
94
|
+
@formatter.indentation(0).should == ""
|
95
|
+
@formatter.indentation(1).should == " "
|
96
|
+
@formatter.indentation(2).should == " "
|
97
|
+
end
|
98
|
+
|
99
|
+
it "pads the prompt, based on the source level" do
|
100
|
+
@formatter.prompt(@context).should == "irb(main):001:0> "
|
101
|
+
@context.process_line("class A")
|
102
|
+
@formatter.prompt(@context).should == "irb(main):002:1> "
|
103
|
+
@context.process_line("def foo")
|
104
|
+
@formatter.prompt(@context).should == "irb(main):003:2> "
|
105
|
+
end
|
106
|
+
|
107
|
+
it "does not pad the prompt if it's explicitely specified" do
|
108
|
+
@context.process_line("class A")
|
109
|
+
@formatter.prompt(@context, true).should == "irb(main):002:1> "
|
110
|
+
end
|
111
|
+
|
112
|
+
it "reindents the last line in a Source#buffer after execution of the block, and returns the new line" do
|
113
|
+
# the line number in the prompt is irrelevant for this test
|
114
|
+
lines = [
|
115
|
+
["\tclass A", ["irb(main):001:0> ", "class A"]],
|
116
|
+
["def foo", ["irb(main):001:1> ", " def foo"]],
|
117
|
+
[" end", ["irb(main):001:1> ", " end"]],
|
118
|
+
[" end", ["irb(main):001:0> ", "end"]]
|
119
|
+
]
|
120
|
+
lines.each do |line, expected_prompt_and_line|
|
121
|
+
@formatter.reindent_last_line(@context) do
|
122
|
+
@context.source << line
|
123
|
+
end.should == expected_prompt_and_line
|
124
|
+
end
|
125
|
+
@context.source.to_s.should == lines.map { |x| x[1][1] }.join("\n")
|
126
|
+
end
|
127
|
+
|
128
|
+
it "returns nil if the last line was not reindented and the level didn't change" do
|
129
|
+
@context.source << "class A"
|
130
|
+
@formatter.reindent_last_line(@context) { @context.source << " def foo" }.should == nil
|
131
|
+
@formatter.reindent_last_line(@context) { @context.source << " end" }.should_not == nil
|
132
|
+
end
|
133
|
+
|
134
|
+
it "returns nil if the source buffer is empty" do
|
135
|
+
@formatter.reindent_last_line(@context) {}.should == nil
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dietrb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 7
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 6
|
9
|
+
- 0
|
10
|
+
version: 0.6.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Eloy Duran
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-
|
18
|
+
date: 2010-11-02 00:00:00 +01:00
|
19
19
|
default_executable: dietrb
|
20
20
|
dependencies: []
|
21
21
|
|