dietrb 0.5.1 → 0.5.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -49,16 +49,8 @@ The original IRB will still work when you uninstall the DietRB gem, though.
49
49
 
50
50
  * Kernel#clear_history! will clear the history and the history file.
51
51
 
52
- * irb/ext/macruby.rb, adds support for Cocoa development by starting an
53
- NSRunloop. Loaded by default on MacRuby.
54
-
55
52
  == Differences
56
53
 
57
- * This IRB version specifically targets MacRuby, for now, and allows Cocoa
58
- development to be done from the command-line. Dietrb will automatically
59
- override the normal runloop to be ran in a thread and start a NSRunLoop on
60
- the main thread.
61
-
62
54
  * Dietrb will try to warn about syntax errors as soon as a line is entered and
63
55
  only reset the buffer to the previous line. This means that you don't need to
64
56
  loose any previous work:
@@ -112,29 +104,3 @@ Normal usage:
112
104
  irb(#<#<Class:…>::A:…>):002:0> quit
113
105
  => nil
114
106
  irb(main):007:0> quit
115
-
116
- Or on MacRuby, try:
117
-
118
- irb(main):001:0> win = NSWindow.alloc.initWithContentRect([200, 300, 250, 100],
119
- irb(main):002:0> styleMask: NSTitledWindowMask|NSResizableWindowMask,
120
- irb(main):003:0> backing: NSBackingStoreBuffered,
121
- irb(main):004:0> defer: false)
122
- => #<NSWindow:0x20023eb00>
123
- irb(main):005:0> win.orderFrontRegardless
124
- => #<NSWindow:0x20023eb00>
125
- irb(main):006:0> win.title = 'Hello World'
126
- => "Hello World"
127
- irb(main):007:0> bye = NSButton.alloc.initWithFrame([10, 10, 80, 80])
128
- => #<NSButton:0x20027f820>
129
- irb(main):008:0> win.contentView.addSubview(bye)
130
- => #<NSView:0x200210320>
131
- irb(main):009:0> bye.bezelStyle = NSThickerSquareBezelStyle
132
- => 4
133
- irb(main):010:0> bye.title = 'Goodbye!'
134
- => "Goodbye!"
135
- irb(main):011:0> bye.target = NSApp
136
- => #<NSApplication:0x200257fe0>
137
- irb(main):012:0> bye.action = 'terminate:'
138
- => "terminate:"
139
- irb(main):013:0> bye.sound = NSSound.soundNamed('Basso')
140
- => #<NSSound:0x200248b20>
data/Rakefile CHANGED
@@ -53,20 +53,20 @@ namespace :macruby do
53
53
  end
54
54
  end
55
55
 
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)/ }
70
- end
71
- rescue LoadError
72
- end
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)/ }
70
+ # end
71
+ # rescue LoadError
72
+ # end
data/TODO CHANGED
@@ -1,6 +1,8 @@
1
- * Add specs for irb/driver/socket, and possibly for bin/dietrb
1
+ * Complete file paths in strings (for require etc).
2
+ * Write docs for using a as library. Probably right after creating a Cocoa client.
3
+ * Write a not useless README.
4
+ * Add specs for irb/driver/socket, and possibly for bin/dietrb.
2
5
  * Configurable history file? (:HISTORY_FILE) Configurable number of saved history lines? (:SAVE_HISTORY)
3
- * Make sure the following formatters work: hirb, awesome_print, and looksee
6
+ * Make sure the following formatters work: hirb, and looksee
4
7
  * Make sure the majority of the utils in utility_belt work
5
8
  * Possibly add copy-paste support as an ext
6
- * Decide whether or not we need more control for colorizing which could be done with Ripper::SexpBuilder
data/bin/dietrb CHANGED
@@ -39,18 +39,25 @@ module IRB
39
39
  IRB.formatter.filter_from_backtrace << /^#{__FILE__}/
40
40
 
41
41
  if ARGV.empty?
42
- driver ||= begin
43
- require 'readline'
44
- 'readline'
45
- rescue LoadError
46
- 'tty'
42
+ if driver == 'socket'
43
+ require "irb/driver/socket"
44
+ IRB::Driver.redirect_output! do
45
+ irb(*IRB_CONTEXT_TOPLEVEL_ARGS)
46
+ end
47
+ else
48
+ driver ||= begin
49
+ require 'readline'
50
+ 'readline'
51
+ rescue LoadError
52
+ 'tty'
53
+ end
54
+ require "irb/driver/#{driver}"
55
+ irb(*IRB_CONTEXT_TOPLEVEL_ARGS)
47
56
  end
48
- require "irb/driver/#{driver}"
49
- irb(*IRB_CONTEXT_TOPLEVEL_ARGS)
50
57
  else
51
58
  path = ARGV.shift
52
59
  context = IRB::Context.new(*IRB_CONTEXT_TOPLEVEL_ARGS)
53
60
  File.open(path, 'r') { |f| f.each_line { |line| context.input_line(line) } }
54
61
  end
55
62
  end
56
- end
63
+ end
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{dietrb}
8
- s.version = "0.5.1"
8
+ s.version = "0.5.2"
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-07-24}
12
+ s.date = %q{2010-10-28}
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}
@@ -37,7 +37,6 @@ Gem::Specification.new do |s|
37
37
  "lib/irb/ext/colorize.rb",
38
38
  "lib/irb/ext/completion.rb",
39
39
  "lib/irb/ext/history.rb",
40
- "lib/irb/ext/macruby.rb",
41
40
  "lib/irb/formatter.rb",
42
41
  "lib/irb/source.rb",
43
42
  "lib/irb/version.rb",
@@ -57,7 +56,7 @@ Gem::Specification.new do |s|
57
56
  s.rdoc_options = ["--charset=UTF-8"]
58
57
  s.require_paths = ["lib"]
59
58
  s.required_ruby_version = Gem::Requirement.new("~> 1.9")
60
- s.rubygems_version = %q{1.3.5}
59
+ s.rubygems_version = %q{1.3.7}
61
60
  s.summary = %q{IRB on a diet, for MacRuby / Ruby 1.9}
62
61
  s.test_files = [
63
62
  "spec/context_spec.rb",
@@ -77,7 +76,7 @@ Gem::Specification.new do |s|
77
76
  current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
78
77
  s.specification_version = 3
79
78
 
80
- if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
79
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
81
80
  else
82
81
  end
83
82
  else
data/lib/irb.rb CHANGED
@@ -5,15 +5,12 @@
5
5
  # Copyright (C) 2009-2010, Eloy Duran <eloy.de.enige@gmail.com>
6
6
 
7
7
  require 'irb/context'
8
+ require 'irb/driver'
8
9
  require 'irb/source'
9
10
  require 'irb/version'
10
11
 
11
12
  require 'irb/deprecated'
12
13
 
13
- # if !ENV['SPECCING'] && defined?(RUBY_ENGINE) && RUBY_ENGINE == "macruby"
14
- # require 'irb/ext/macruby'
15
- # end
16
-
17
14
  module IRB
18
15
  class << self
19
16
  # This is just here for so the ruby 1.9 IRB will seemingly work, but actually
@@ -26,4 +23,4 @@ module IRB
26
23
  end
27
24
  alias_method :setup, :start
28
25
  end
29
- end
26
+ end
@@ -5,6 +5,7 @@
5
5
  # Copyright (C) 2009-2010, Eloy Duran <eloy.de.enige@gmail.com>
6
6
 
7
7
  require 'irb/formatter'
8
+ require 'irb/source'
8
9
 
9
10
  module IRB
10
11
  class Context
@@ -26,17 +27,24 @@ module IRB
26
27
  def __evaluate__(source, file = __FILE__, line = __LINE__)
27
28
  eval(source, @binding, file, line)
28
29
  end
30
+
31
+ def to_s
32
+ object_description = "`#{object.inspect}'"
33
+ object_description = "of class `#{object.class.name}'" if object_description.length > 32
34
+ "#<IRB::Context for object #{object_description}>"
35
+ end
36
+ alias_method :inspect, :to_s
29
37
 
30
38
  def evaluate(source)
31
39
  result = __evaluate__(source.to_s, '(irb)', @line - @source.buffer.size + 1)
32
40
  unless result == IGNORE_RESULT
33
41
  store_result(result)
34
- puts(formatter.result(result))
42
+ output(formatter.result(result))
35
43
  result
36
44
  end
37
45
  rescue Exception => e
38
46
  store_exception(e)
39
- puts(formatter.exception(e))
47
+ output(formatter.exception(e))
40
48
  end
41
49
 
42
50
  # Returns whether or not the user wants to continue the current runloop.
@@ -56,7 +64,7 @@ module IRB
56
64
  return false if @source.terminate?
57
65
 
58
66
  if @source.syntax_error?
59
- puts(formatter.syntax_error(@line, @source.syntax_error))
67
+ output(formatter.syntax_error(@line, @source.syntax_error))
60
68
  @source.pop
61
69
  elsif @source.code_block?
62
70
  evaluate(@source)
@@ -67,12 +75,22 @@ module IRB
67
75
  true
68
76
  end
69
77
 
78
+ # Output is directed to the IRB::Driver.current driver’s output if a
79
+ # current driver is available. Otherwise it’s simply printed to $stdout.
80
+ def output(string)
81
+ if driver = IRB::Driver.current
82
+ driver.output.puts(string)
83
+ else
84
+ puts(string)
85
+ end
86
+ end
87
+
70
88
  def prompt
71
89
  formatter.prompt(self)
72
90
  end
73
91
 
74
92
  def input_line(line)
75
- puts(formatter.prompt(self) + line)
93
+ output(formatter.prompt(self) + line)
76
94
  process_line(line)
77
95
  end
78
96
 
@@ -92,4 +110,4 @@ module IRB
92
110
  @exception_assigner.call(exception)
93
111
  end
94
112
  end
95
- end
113
+ end
@@ -18,6 +18,13 @@ module IRB
18
18
  end
19
19
  end
20
20
  end
21
+
22
+ def redirect_output!(redirector = OutputRedirector.new)
23
+ before, $stdout = $stdout, redirector unless $stdout.is_a?(redirector.class)
24
+ yield
25
+ ensure
26
+ $stdout = before if before
27
+ end
21
28
  end
22
29
 
23
30
  class OutputRedirector
@@ -58,4 +65,4 @@ module IRB
58
65
  end
59
66
  end
60
67
  end
61
- end
68
+ end
@@ -34,13 +34,11 @@ module IRB
34
34
  # subclass thereof.
35
35
  def run(context)
36
36
  @context_stack << context
37
- before, $stdout = $stdout, OutputRedirector.new unless $stdout.is_a?(OutputRedirector)
38
37
  while line = consume
39
38
  break unless context.process_line(line)
40
39
  end
41
40
  ensure
42
41
  @context_stack.pop
43
- $stdout = before if before
44
42
  end
45
43
  end
46
44
  end
@@ -59,6 +59,14 @@ module IRB
59
59
  evaluate('local_variables').map(&:to_s)
60
60
  end
61
61
 
62
+ def instance_variables
63
+ context.object.instance_variables.map(&:to_s)
64
+ end
65
+
66
+ def global_variables
67
+ super.map(&:to_s)
68
+ end
69
+
62
70
  def instance_methods
63
71
  context.object.methods.map(&:to_s)
64
72
  end
@@ -81,11 +89,10 @@ module IRB
81
89
  call = (source[-1,1] == '.')
82
90
  receiver = source = source[0..-2] if call
83
91
 
84
- if sexp = Ripper::SexpBuilder.new(source).parse
85
- # [:program, [:stmts_add, [:stmts_new], [x, …]]]
86
- # ^
87
- root = sexp[1][2]
88
-
92
+ # root node:
93
+ # [:program, [:stmts_add, [:stmts_new], [x, …]]]
94
+ # ^
95
+ if (sexp = Ripper::SexpBuilder.new(source).parse) && root = sexp[1][2]
89
96
  # [:call, [:hash, nil], :".", [:@ident, x, …]]
90
97
  if root[TYPE] == :call
91
98
  call = true
@@ -105,11 +112,14 @@ module IRB
105
112
  end
106
113
  end
107
114
 
108
- if call
109
- format_methods(receiver, methods || methods_of_object(root), filter)
110
- else
111
- match_methods_vars_or_consts_in_scope(root)
112
- end.sort.uniq
115
+ result = if call
116
+ if m = (methods || methods_of_object(root))
117
+ format_methods(receiver, m, filter)
118
+ end
119
+ else
120
+ match_methods_vars_or_consts_in_scope(root)
121
+ end
122
+ result.sort.uniq if result
113
123
  end
114
124
  end
115
125
 
@@ -126,11 +136,13 @@ module IRB
126
136
  def match_methods_vars_or_consts_in_scope(symbol)
127
137
  var = symbol[VALUE]
128
138
  filter = var[VALUE]
129
- case var[TYPE]
139
+ result = case var[TYPE]
130
140
  when :@ident
131
141
  local_variables + instance_methods + RESERVED_DOWNCASE_WORDS
142
+ when :@ivar
143
+ instance_variables
132
144
  when :@gvar
133
- global_variables.map(&:to_s)
145
+ global_variables
134
146
  when :@const
135
147
  if symbol[TYPE] == :top_const_ref
136
148
  filter = "::#{filter}"
@@ -138,7 +150,8 @@ module IRB
138
150
  else
139
151
  constants + RESERVED_UPCASE_WORDS
140
152
  end
141
- end.grep(/^#{Regexp.quote(filter)}/)
153
+ end
154
+ (result && filter) ? result.grep(/^#{Regexp.quote(filter)}/) : result
142
155
  end
143
156
 
144
157
  def format_methods(receiver, methods, filter)
@@ -174,8 +187,10 @@ module IRB
174
187
  case type
175
188
  when :@ident
176
189
  evaluate(name).methods if local_variables.include?(name)
190
+ when :@ivar
191
+ evaluate(name).methods if instance_variables.include?(name)
177
192
  when :@gvar
178
- eval(name).methods if global_variables.include?(name.to_sym)
193
+ eval(name).methods if global_variables.include?(name)
179
194
  when :@const
180
195
  evaluate(name).methods if constants.include?(name)
181
196
  end
@@ -89,4 +89,4 @@ end
89
89
 
90
90
  IRB::History.file = File.expand_path("~/.irb_history")
91
91
  IRB::History.max_entries_in_overview = 50
92
- IRB::History.setup
92
+ IRB::History.setup if defined?(Readline)
@@ -72,7 +72,7 @@ module IRB
72
72
  def initialize(source)
73
73
  super
74
74
  @level = 0
75
- @code_block = !parse.nil?
75
+ @code_block = !parse.nil? && !@in_string && !@in_regexp && !@in_array
76
76
  end
77
77
 
78
78
  # Returns the code block indentation level.
@@ -183,6 +183,66 @@ module IRB
183
183
  @level -= 1
184
184
  super
185
185
  end
186
+
187
+ def on_tstring_beg(token)
188
+ @in_string = token
189
+ @level += 1
190
+ super
191
+ end
192
+
193
+ def on_tstring_end(token)
194
+ if @in_string && tokens_match?(@in_string, token)
195
+ @in_string = nil
196
+ @level -= 1
197
+ end
198
+ super
199
+ end
200
+
201
+ def on_qwords_beg(token)
202
+ @in_array = token.strip
203
+ @level += 1
204
+ super
205
+ end
206
+ alias_method :on_words_beg, :on_qwords_beg
207
+
208
+ def on_words_sep(token)
209
+ if tokens_match?(@in_array, token)
210
+ @in_array = false
211
+ @level -= 1
212
+ end
213
+ super
214
+ end
215
+
216
+ def on_regexp_beg(token)
217
+ @in_regexp = token
218
+ @level += 1
219
+ super
220
+ end
221
+
222
+ def on_regexp_end(token)
223
+ token_without_regexp_options = token[0,1]
224
+ if tokens_match?(@in_regexp, token_without_regexp_options)
225
+ @in_regexp = false
226
+ @level -= 1
227
+ end
228
+ super
229
+ end
230
+
231
+ def tokens_match?(open_token, close_token)
232
+ last_char_open_token = open_token[-1, 1]
233
+ last_char_close_token = close_token[-1, 1]
234
+ if last_char_open_token == last_char_close_token
235
+ true
236
+ else
237
+ case last_char_open_token
238
+ when '{' then last_char_close_token == '}'
239
+ when '(' then last_char_close_token == ')'
240
+ when '[' then last_char_close_token == ']'
241
+ else
242
+ false
243
+ end
244
+ end
245
+ end
186
246
  end
187
247
  end
188
248
  end
@@ -9,7 +9,7 @@ module IRB
9
9
  NAME = 'DietRB'
10
10
  MAJOR = 0
11
11
  MINOR = 5
12
- TINY = 1
12
+ TINY = 2
13
13
 
14
14
  STRING = [MAJOR, MINOR, TINY].join('.')
15
15
  DESCRIPTION = "#{NAME} (#{STRING})"
@@ -1,16 +1,11 @@
1
1
  require File.expand_path('../spec_helper', __FILE__)
2
2
  require 'tempfile'
3
3
 
4
- class TestProcessor
5
- def input(s)
6
- s * 2
7
- end
8
- end
9
-
10
4
  main = self
11
5
 
12
6
  describe "IRB::Context" do
13
7
  before do
8
+ @output = setup_current_driver.output
14
9
  @context = IRB::Context.new(main)
15
10
  @context.extend(OutputStubMixin)
16
11
  end
@@ -38,12 +33,25 @@ describe "IRB::Context" do
38
33
  it "does not use the same binding copy of the top level object" do
39
34
  lambda { eval("x", @context.binding) }.should raise_error(NameError)
40
35
  end
36
+
37
+ it "prints to the output object of the current driver" do
38
+ @context.output("croque monsieur")
39
+ @output.printed.should == "croque monsieur\n"
40
+ @context.printed.should == ""
41
+ end
42
+
43
+ it "prints as normal when no current driver is available" do
44
+ IRB::Driver.current = nil
45
+ @context.output("croque monsieur")
46
+ @output.printed.should == ""
47
+ @context.printed.should == "croque monsieur\n"
48
+ end
41
49
  end
42
50
 
43
51
  describe "IRB::Context, when evaluating source" do
44
52
  before do
53
+ @output = setup_current_driver.output
45
54
  @context = IRB::Context.new(main)
46
- @context.extend(OutputStubMixin)
47
55
  IRB.formatter = IRB::Formatter.new
48
56
  end
49
57
 
@@ -53,7 +61,7 @@ describe "IRB::Context, when evaluating source" do
53
61
 
54
62
  it "prints the result" do
55
63
  @context.evaluate("Hash[:foo, :foo]")
56
- @context.printed.should == "=> {:foo=>:foo}\n"
64
+ @output.printed.should == "=> {:foo=>:foo}\n"
57
65
  end
58
66
 
59
67
  it "assigns the result to the local variable `_'" do
@@ -84,31 +92,31 @@ describe "IRB::Context, when evaluating source" do
84
92
 
85
93
  it "prints the exception that occurs" do
86
94
  @context.evaluate("DoesNotExist")
87
- @context.printed.should =~ /^NameError:.+DoesNotExist/
95
+ @output.printed.should =~ /^NameError:.+DoesNotExist/
88
96
  end
89
97
 
90
98
  it "uses the line number of the *first* line in the buffer, for the line parameter of eval" do
91
99
  @context.process_line("DoesNotExist")
92
- @context.printed.should =~ /\(irb\):1:in/
100
+ @output.printed.should =~ /\(irb\):1:in/
93
101
  @context.process_line("class A")
94
102
  @context.process_line("DoesNotExist")
95
103
  @context.process_line("end")
96
- @context.printed.should =~ /\(irb\):3:in.+\(irb\):2:in/m
104
+ @output.printed.should =~ /\(irb\):3:in.+\(irb\):2:in/m
97
105
  end
98
106
 
99
107
  it "ignores the result if it's IRB::Context::IGNORE_RESULT" do
100
108
  @context.evaluate(":bananas")
101
109
  @context.evaluate("IRB::Context::IGNORE_RESULT").should == nil
102
- @context.printed.should == "=> :bananas\n"
110
+ @output.printed.should == "=> :bananas\n"
103
111
  @context.evaluate("_").should == :bananas
104
112
  end
105
113
  end
106
114
 
107
115
  describe "IRB::Context, when receiving input" do
108
116
  before do
117
+ @output = setup_current_driver.output
109
118
  @context = IRB::Context.new(main)
110
119
  @context.extend(InputStubMixin)
111
- @context.extend(OutputStubMixin)
112
120
  end
113
121
 
114
122
  it "adds the received code to the source buffer" do
@@ -147,7 +155,7 @@ describe "IRB::Context, when receiving input" do
147
155
  @context.process_line(" };")
148
156
 
149
157
  @context.source.to_s.should == "def foo"
150
- @context.printed.should == "SyntaxError: compile error\n(irb):2: syntax error, unexpected '}'\n"
158
+ @output.printed.should == "SyntaxError: compile error\n(irb):2: syntax error, unexpected '}'\n"
151
159
  end
152
160
 
153
161
  it "returns whether or not the runloop should continue, but only if the level is 0" do
@@ -161,6 +169,6 @@ describe "IRB::Context, when receiving input" do
161
169
  it "inputs a line to be processed" do
162
170
  expected = "#{@context.formatter.prompt(@context)}2 * 21\n=> 42\n"
163
171
  @context.input_line("2 * 21")
164
- @context.printed.should == expected
172
+ @output.printed.should == expected
165
173
  end
166
174
  end
@@ -58,6 +58,11 @@ describe "IRB::Completion" do
58
58
  complete('foo.').should include('foo.singleton_method')
59
59
  end
60
60
 
61
+ it "matches as an instance variable" do
62
+ @context.__evaluate__('@an_instance_variable = ::CompletionStub.new')
63
+ complete('@an_instance_variable.').should == imethods(::CompletionStub, '@an_instance_variable')
64
+ end
65
+
61
66
  it "matches as a global variable" do
62
67
  complete('$a_completion_stub.').should == imethods(::CompletionStub, '$a_completion_stub')
63
68
  end
@@ -193,9 +198,10 @@ describe "IRB::Completion" do
193
198
  end
194
199
 
195
200
  it "filters the methods, of the variable receiver, by the given method name" do
196
- @context.__evaluate__('foo = ::CompletionStub.new')
201
+ @context.__evaluate__('foo = @an_instance_variable = ::CompletionStub.new')
197
202
  complete('foo.an_im').should == %w{ foo.an_imethod }
198
203
  complete('$a_completion_stub.an_im').should == %w{ $a_completion_stub.an_imethod }
204
+ complete('@an_instance_variable.an_im').should == %w{ @an_instance_variable.an_imethod }
199
205
  # TODO: fix
200
206
  # complete('CompletionStub.a_sing').should == %w{ CompletionStub.a_singleton_method }
201
207
  end
@@ -204,7 +210,7 @@ describe "IRB::Completion" do
204
210
 
205
211
  describe "when *not* doing a method call on an explicit receiver" do
206
212
  before do
207
- @context.__evaluate__("a_local_variable = :ok")
213
+ @context.__evaluate__("a_local_variable = @an_instance_variable = :ok")
208
214
  end
209
215
 
210
216
  it "matches local variables" do
@@ -219,6 +225,10 @@ describe "IRB::Completion" do
219
225
  complete("a_loc").should == %w{ a_local_method a_local_variable }
220
226
  end
221
227
 
228
+ it "matches instance variables" do
229
+ complete("@an_inst").should == %w{ @an_instance_variable }
230
+ end
231
+
222
232
  it "matches global variables" do
223
233
  complete("$a_completion_s").should == %w{ $a_completion_stub }
224
234
  end
@@ -238,4 +248,9 @@ describe "IRB::Completion" do
238
248
  complete(word[0..-2]).should include(word)
239
249
  end
240
250
  end
241
- end
251
+
252
+ it "does not crash when trying to complete garbage" do
253
+ complete("/").should == nil
254
+ complete("./Rake").should == nil
255
+ end
256
+ end
@@ -69,7 +69,7 @@ describe "IRB::Formatter" do
69
69
  def object.inspect; @inspected = true; "Never called!"; end
70
70
  def object.__id__; 2158110700; end
71
71
 
72
- @formatter.result(object).should == "=> #<Object:0x101444fd8>"
72
+ @formatter.result(object).should == "=> #<#{object.class.name}:0x101444fd8>"
73
73
  object.instance_variable_get(:@inspected).should_not == true
74
74
  end
75
75
 
@@ -140,11 +140,14 @@ describe "IRB::Source::Reflector" do
140
140
  it "returns whether or not the source contains a syntax error, except a code block not ending" do
141
141
  reflect("def;").syntax_error?.should == true
142
142
  reflect("def;").syntax_error?.should == true
143
+ reflect("{ [ } ]").syntax_error?.should == true
143
144
  reflect("def foo").syntax_error?.should == false
144
145
  reflect("class A; }").syntax_error?.should == true
145
146
  reflect("class A; {" ).syntax_error?.should == false
147
+ reflect("class A; def {").syntax_error?.should == true
146
148
  reflect("class A def foo").syntax_error?.should == true
147
149
  reflect("class A; def foo" ).syntax_error?.should == false
150
+ reflect("def foo; {; end; }").syntax_error?.should == true
148
151
  end
149
152
 
150
153
  it "returns the actual syntax error message if one occurs" do
@@ -185,12 +188,72 @@ describe "IRB::Source::Reflector" do
185
188
  it "correctly increases and decreases the code block indentation level for literals" do
186
189
  [
187
190
  ["lambda { |x|", "}"],
188
- ["{", "}"],
189
- ['"#{', '}"'],
190
- ["[", "]"]
191
+ ["{ :foo => ", " :bar }"],
192
+ ["[ 1", ", 2 ]"],
193
+
194
+ ["'", "'"],
195
+ ["' ", " '"],
196
+ ["'foo ", " bar'"],
197
+ ["' foo ", " bar '"],
198
+
199
+ ['"', '"'],
200
+ ['" ', ' "'],
201
+ ['"foo ', ' bar"'],
202
+ ['" foo ', ' bar "'],
203
+
204
+ ["%{", "}"],
205
+ ["%{ ", " }"],
206
+ ["%{foo ", " bar}"],
207
+ ["%{ foo ", " bar }"],
208
+ ["%(foo ", " bar)"],
209
+ ["%( foo ", " bar )"],
210
+ ["%[ foo ", " bar ]"],
211
+ ["%[foo ", " bar]"],
212
+
213
+ #["%w{ ", " }"], fails on 1.9
214
+ ["%w{foo ", " bar}"],
215
+ ["%w{ foo ", " bar }"],
216
+ ["%w(foo ", " bar)"],
217
+ ["%w( foo ", " bar )"],
218
+ ["%w[foo ", " bar]"],
219
+ ["%w[ foo ", " bar ]"],
220
+
221
+ ["%W{foo ", " bar}"],
222
+ ["%W{ foo ", " bar }"],
223
+ ["%W(foo ", " bar)"],
224
+ ["%W( foo ", " bar )"],
225
+ ["%W[foo ", " bar]"],
226
+ ["%W[ foo ", " bar ]"],
227
+
228
+ ["%r{foo ", " bar}"],
229
+ ["%r{ foo ", " bar }"],
230
+ ["%r{ foo ", " bar}i"],
231
+ ["%r(foo ", " bar)"],
232
+ ["%r( foo ", " bar )"],
233
+ ["%r( foo ", " bar)i"],
234
+ ["%r[foo ", " bar]"],
235
+ ["%r[ foo ", " bar ]"],
236
+ ["%r[ foo ", " bar]i"],
237
+
238
+ ["/foo ", " bar/"],
239
+ ["/ foo ", " bar /"],
240
+ ["/ foo ", " bar/iu"], # macruby ticket 965
191
241
  ].each do |open, close|
192
242
  reflect(open).level.should == 1
243
+ reflect(open).code_block?.should == false
193
244
  reflect("#{open}\n#{close}").level.should == 0
245
+ reflect("#{open}\n#{close}").code_block?.should == true
246
+ end
247
+ end
248
+
249
+ it "handles cases that contain backspaces" do
250
+ [
251
+ ["%{", "\b"],
252
+ ["%w{", "\b"],
253
+ ["%r{", "\b"],
254
+ ].each do |open, close|
255
+ reflect("#{open}\n#{close}").level.should == 1
256
+ reflect("#{open}\n#{close}").code_block?.should == false
194
257
  end
195
258
  end
196
259
  end
@@ -72,4 +72,14 @@ class StubDriver
72
72
  def output
73
73
  @output || $stdout
74
74
  end
75
+
76
+ def printed
77
+ @output.printed
78
+ end
79
+ end
80
+
81
+ def setup_current_driver
82
+ driver = StubDriver.new
83
+ driver.output = OutputStub.new
84
+ IRB::Driver.current = driver
75
85
  end
metadata CHANGED
@@ -1,7 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dietrb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.1
4
+ hash: 15
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 5
9
+ - 2
10
+ version: 0.5.2
5
11
  platform: ruby
6
12
  authors:
7
13
  - Eloy Duran
@@ -9,7 +15,7 @@ autorequire:
9
15
  bindir: bin
10
16
  cert_chain: []
11
17
 
12
- date: 2010-07-24 00:00:00 +02:00
18
+ date: 2010-10-28 00:00:00 +02:00
13
19
  default_executable: dietrb
14
20
  dependencies: []
15
21
 
@@ -41,7 +47,6 @@ files:
41
47
  - lib/irb/ext/colorize.rb
42
48
  - lib/irb/ext/completion.rb
43
49
  - lib/irb/ext/history.rb
44
- - lib/irb/ext/macruby.rb
45
50
  - lib/irb/formatter.rb
46
51
  - lib/irb/source.rb
47
52
  - lib/irb/version.rb
@@ -66,21 +71,28 @@ rdoc_options:
66
71
  require_paths:
67
72
  - lib
68
73
  required_ruby_version: !ruby/object:Gem::Requirement
74
+ none: false
69
75
  requirements:
70
76
  - - ~>
71
77
  - !ruby/object:Gem::Version
78
+ hash: 29
79
+ segments:
80
+ - 1
81
+ - 9
72
82
  version: "1.9"
73
- version:
74
83
  required_rubygems_version: !ruby/object:Gem::Requirement
84
+ none: false
75
85
  requirements:
76
86
  - - ">="
77
87
  - !ruby/object:Gem::Version
88
+ hash: 3
89
+ segments:
90
+ - 0
78
91
  version: "0"
79
- version:
80
92
  requirements: []
81
93
 
82
94
  rubyforge_project:
83
- rubygems_version: 1.3.5
95
+ rubygems_version: 1.3.7
84
96
  signing_key:
85
97
  specification_version: 3
86
98
  summary: IRB on a diet, for MacRuby / Ruby 1.9
@@ -1,25 +0,0 @@
1
- # MacRuby implementation of IRB.
2
- #
3
- # This file is covered by the Ruby license. See COPYING for more details.
4
- #
5
- # Copyright (C) 2009-2010, Eloy Duran <eloy.de.enige@gmail.com>
6
-
7
- framework 'AppKit'
8
-
9
- module IRB
10
- class Context
11
- alias_method :_run, :run
12
-
13
- def run
14
- if NSApplication.sharedApplication.running?
15
- _run
16
- else
17
- Thread.new do
18
- _run
19
- NSApplication.sharedApplication.terminate(self)
20
- end
21
- NSApplication.sharedApplication.run
22
- end
23
- end
24
- end
25
- end