dietrb 0.4.7 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +11 -5
- data/Rakefile +13 -9
- data/TODO +1 -0
- data/bin/dietrb +49 -35
- data/dietrb.gemspec +21 -11
- data/lib/irb.rb +0 -3
- data/lib/irb/completion.rb +1 -1
- data/lib/irb/context.rb +21 -58
- data/lib/irb/driver.rb +61 -0
- data/lib/irb/driver/readline.rb +26 -0
- data/lib/irb/driver/socket.rb +44 -0
- data/lib/irb/driver/tty.rb +58 -0
- data/lib/irb/ext/completion.rb +13 -12
- data/lib/irb/ext/history.rb +53 -58
- data/lib/irb/formatter.rb +3 -1
- data/lib/irb/version.rb +2 -2
- data/spec/context_spec.rb +29 -107
- data/spec/driver/readline_spec.rb +70 -0
- data/spec/driver/tty_spec.rb +70 -0
- data/spec/driver_spec.rb +65 -0
- data/spec/{colorize_spec.rb → ext/colorize_spec.rb} +1 -1
- data/spec/{completion_spec.rb → ext/completion_spec.rb} +12 -8
- data/spec/{history_spec.rb → ext/history_spec.rb} +42 -45
- data/spec/formatter_spec.rb +5 -3
- data/spec/regression/context_spec.rb +1 -1
- data/spec/source_spec.rb +25 -29
- data/spec/spec_helper.rb +69 -5
- metadata +21 -24
data/LICENSE
CHANGED
@@ -1,10 +1,16 @@
|
|
1
1
|
Copyright (c) <2010> Eloy Duran, <eloy.de.enige@gmail.com>
|
2
2
|
|
3
|
-
Portions Copyright (c)
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
3
|
+
Portions Copyright (c):
|
4
|
+
* 2006-2010 Ben Bleything <ben@bleything.net> (history utils)
|
5
|
+
* 2006-2010 Paul Duncan <pabs@pablotron.org> (Wirble)
|
6
|
+
* 2009-2010 Jens Wille <jens.wille@gmail.com> (Wirble)
|
7
|
+
* 2006-2010 Giles Bowkett (light background color scheme)
|
8
|
+
* 2006-2010 Revieworld Ltd. <http://github.com/floehopper/mocha>
|
9
|
+
(class/address object inspect)
|
10
|
+
* 2008-2010 Vincent Isambart <http://github.com/vincentisambart/hotconsole>
|
11
|
+
(output redirection on different threads)
|
12
|
+
* 2010 James Tucker <http://github.com/raggi/ir>
|
13
|
+
(basis of driver code and inspiration)
|
8
14
|
|
9
15
|
This software is available under the Ruby license:
|
10
16
|
|
data/Rakefile
CHANGED
@@ -7,12 +7,12 @@ task :default => :run
|
|
7
7
|
|
8
8
|
desc "Run the specs (run it with a rake installed on the Ruby version you want to run the specs on)"
|
9
9
|
task :spec do
|
10
|
-
sh "
|
10
|
+
sh "mspec -t #{ruby_bin} spec"
|
11
11
|
end
|
12
12
|
|
13
13
|
desc "Run dietrb"
|
14
14
|
task :run do
|
15
|
-
sh "#{ruby_bin} -I lib ./bin/dietrb -r irb/ext/colorize -r pp"
|
15
|
+
sh "#{ruby_bin} -I lib ./bin/dietrb -d -r irb/ext/colorize -r pp"
|
16
16
|
end
|
17
17
|
|
18
18
|
namespace :macruby do
|
@@ -33,16 +33,19 @@ namespace :macruby do
|
|
33
33
|
desc "Merge source into the MacRuby repo"
|
34
34
|
task :merge do
|
35
35
|
if (repo = ENV['macruby_repo']) && File.exist?(repo)
|
36
|
-
bin
|
37
|
-
lib
|
36
|
+
bin = File.join(repo, 'bin/irb')
|
37
|
+
lib = File.join(repo, 'lib')
|
38
|
+
spec = File.join(repo, 'spec/dietrb')
|
38
39
|
|
39
|
-
rm_f
|
40
|
-
rm_f
|
40
|
+
rm_f bin
|
41
|
+
rm_f File.join(lib, 'irb.rb')
|
41
42
|
rm_rf File.join(lib, 'irb')
|
43
|
+
rm_rf spec
|
42
44
|
|
43
|
-
cp
|
44
|
-
cp
|
45
|
-
cp_r 'lib/irb',
|
45
|
+
cp 'bin/dietrb', bin
|
46
|
+
cp 'lib/irb.rb', lib
|
47
|
+
cp_r 'lib/irb', lib
|
48
|
+
cp_r 'spec', spec
|
46
49
|
else
|
47
50
|
puts "[!] Set the `macruby_repo' env variable to point to the MacRuby repo checkout"
|
48
51
|
exit 1
|
@@ -51,6 +54,7 @@ namespace :macruby do
|
|
51
54
|
end
|
52
55
|
|
53
56
|
begin
|
57
|
+
require 'rubygems'
|
54
58
|
require 'jeweler'
|
55
59
|
require File.expand_path('../lib/irb/version', __FILE__)
|
56
60
|
Jeweler::Tasks.new do |gemspec|
|
data/TODO
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
* Make puts/print use the proper IO when used from user code
|
1
2
|
* Configurable history file? (:HISTORY_FILE) Configurable number of saved history lines? (:SAVE_HISTORY)
|
2
3
|
* Make sure the following formatters work: hirb, awesome_print, and looksee
|
3
4
|
* Make sure the majority of the utils in utility_belt work
|
data/bin/dietrb
CHANGED
@@ -2,41 +2,55 @@
|
|
2
2
|
|
3
3
|
require 'irb'
|
4
4
|
|
5
|
-
|
6
|
-
require 'optparse'
|
7
|
-
|
8
|
-
ignore_irbrc = false
|
9
|
-
|
10
|
-
OptionParser.new do |opt|
|
11
|
-
bin = File.basename($0)
|
12
|
-
opt.banner = "Usage: #{bin} [options] [programfile] [arguments]"
|
13
|
-
opt.on("-f", "Ignore ~/.irbrc") { |ignore| ignore_irbrc = ignore }
|
14
|
-
opt.on("-r load-lib", "Loads the given library (same as `ruby -r')") { |lib| require lib }
|
15
|
-
opt.on("-d", "Set $DEBUG to true (same as `ruby -d')") { $DEBUG = true }
|
16
|
-
opt.on("-I path", "Add path to $LOAD_PATH") { |path| $LOAD_PATH.unshift(path) }
|
17
|
-
opt.on("--noinspect", "Don't use inspect for output") { IRB.formatter.inspect = false }
|
18
|
-
opt.on("--simple-prompt", "Simple prompt mode") { IRB.formatter.prompt = :simple }
|
19
|
-
opt.on("--noprompt", "No prompt mode") { IRB.formatter.prompt = nil }
|
20
|
-
opt.on("-v", "--version", "Print the version of #{bin}") do
|
21
|
-
puts IRB::VERSION::DESCRIPTION
|
22
|
-
exit
|
23
|
-
end
|
24
|
-
end.parse!(ARGV)
|
25
|
-
end
|
26
|
-
|
27
|
-
unless ignore_irbrc
|
28
|
-
irbrc = File.expand_path("~/.irbrc")
|
29
|
-
load(irbrc) if File.exist?(irbrc)
|
30
|
-
end
|
31
|
-
|
32
|
-
IRB.formatter.filter_from_backtrace << /^#{__FILE__}/
|
5
|
+
IRB_CONTEXT_TOPLEVEL_ARGS = [self, TOPLEVEL_BINDING.dup]
|
33
6
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
7
|
+
module IRB
|
8
|
+
# Just a namespace so not to pollute the toplevel namespace with lvars.
|
9
|
+
module Bin
|
10
|
+
unless ARGV.empty?
|
11
|
+
require 'optparse'
|
12
|
+
|
13
|
+
driver = nil
|
14
|
+
ignore_irbrc = false
|
15
|
+
|
16
|
+
OptionParser.new do |opt|
|
17
|
+
bin = File.basename($0)
|
18
|
+
opt.banner = "Usage: #{bin} [options] [programfile] [arguments]"
|
19
|
+
opt.on("-f", "Ignore ~/.irbrc") { |i| ignore_irbrc = i }
|
20
|
+
opt.on("-r load-lib", "Loads the given library (same as `ruby -r')") { |l| require l }
|
21
|
+
opt.on("-d", "Set $DEBUG to true (same as `ruby -d')") { $DEBUG = true }
|
22
|
+
opt.on("-I path", "Add path to $LOAD_PATH") { |p| $LOAD_PATH.unshift(p) }
|
23
|
+
opt.on("--driver name", "As driver, use one of: tty, readline, or socket") { |d| driver = d }
|
24
|
+
opt.on("--noinspect", "Don't use inspect for output") { IRB.formatter.inspect = false }
|
25
|
+
opt.on("--simple-prompt", "Simple prompt mode") { IRB.formatter.prompt = :simple }
|
26
|
+
opt.on("--noprompt", "No prompt mode") { IRB.formatter.prompt = nil }
|
27
|
+
opt.on("-v", "--version", "Print the version of #{bin}") do
|
28
|
+
$stdout.puts IRB::VERSION::DESCRIPTION
|
29
|
+
exit
|
30
|
+
end
|
31
|
+
end.parse!(ARGV)
|
32
|
+
end
|
33
|
+
|
34
|
+
unless ignore_irbrc
|
35
|
+
irbrc = File.expand_path("~/.irbrc")
|
36
|
+
load(irbrc) if File.exist?(irbrc)
|
37
|
+
end
|
38
|
+
|
39
|
+
IRB.formatter.filter_from_backtrace << /^#{__FILE__}/
|
40
|
+
|
41
|
+
if ARGV.empty?
|
42
|
+
driver ||= begin
|
43
|
+
require 'readline'
|
44
|
+
'readline'
|
45
|
+
rescue LoadError
|
46
|
+
'tty'
|
47
|
+
end
|
48
|
+
require "irb/driver/#{driver}"
|
49
|
+
irb(*IRB_CONTEXT_TOPLEVEL_ARGS)
|
50
|
+
else
|
51
|
+
path = ARGV.shift
|
52
|
+
context = IRB::Context.new(*IRB_CONTEXT_TOPLEVEL_ARGS)
|
53
|
+
File.open(path, 'r') { |f| f.each_line { |line| context.input_line(line) } }
|
54
|
+
end
|
41
55
|
end
|
42
56
|
end
|
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.5.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-07-
|
12
|
+
s.date = %q{2010-07-24}
|
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}
|
@@ -30,6 +30,10 @@ Gem::Specification.new do |s|
|
|
30
30
|
"lib/irb/completion.rb",
|
31
31
|
"lib/irb/context.rb",
|
32
32
|
"lib/irb/deprecated.rb",
|
33
|
+
"lib/irb/driver.rb",
|
34
|
+
"lib/irb/driver/readline.rb",
|
35
|
+
"lib/irb/driver/socket.rb",
|
36
|
+
"lib/irb/driver/tty.rb",
|
33
37
|
"lib/irb/ext/colorize.rb",
|
34
38
|
"lib/irb/ext/completion.rb",
|
35
39
|
"lib/irb/ext/history.rb",
|
@@ -37,11 +41,14 @@ Gem::Specification.new do |s|
|
|
37
41
|
"lib/irb/formatter.rb",
|
38
42
|
"lib/irb/source.rb",
|
39
43
|
"lib/irb/version.rb",
|
40
|
-
"spec/colorize_spec.rb",
|
41
|
-
"spec/completion_spec.rb",
|
42
44
|
"spec/context_spec.rb",
|
45
|
+
"spec/driver/readline_spec.rb",
|
46
|
+
"spec/driver/tty_spec.rb",
|
47
|
+
"spec/driver_spec.rb",
|
48
|
+
"spec/ext/colorize_spec.rb",
|
49
|
+
"spec/ext/completion_spec.rb",
|
50
|
+
"spec/ext/history_spec.rb",
|
43
51
|
"spec/formatter_spec.rb",
|
44
|
-
"spec/history_spec.rb",
|
45
52
|
"spec/regression/context_spec.rb",
|
46
53
|
"spec/source_spec.rb",
|
47
54
|
"spec/spec_helper.rb"
|
@@ -50,14 +57,17 @@ Gem::Specification.new do |s|
|
|
50
57
|
s.rdoc_options = ["--charset=UTF-8"]
|
51
58
|
s.require_paths = ["lib"]
|
52
59
|
s.required_ruby_version = Gem::Requirement.new("~> 1.9")
|
53
|
-
s.rubygems_version = %q{1.3.
|
60
|
+
s.rubygems_version = %q{1.3.5}
|
54
61
|
s.summary = %q{IRB on a diet, for MacRuby / Ruby 1.9}
|
55
62
|
s.test_files = [
|
56
|
-
"spec/
|
57
|
-
"spec/
|
58
|
-
"spec/
|
63
|
+
"spec/context_spec.rb",
|
64
|
+
"spec/driver/readline_spec.rb",
|
65
|
+
"spec/driver/tty_spec.rb",
|
66
|
+
"spec/driver_spec.rb",
|
67
|
+
"spec/ext/colorize_spec.rb",
|
68
|
+
"spec/ext/completion_spec.rb",
|
69
|
+
"spec/ext/history_spec.rb",
|
59
70
|
"spec/formatter_spec.rb",
|
60
|
-
"spec/history_spec.rb",
|
61
71
|
"spec/regression/context_spec.rb",
|
62
72
|
"spec/source_spec.rb",
|
63
73
|
"spec/spec_helper.rb"
|
@@ -67,7 +77,7 @@ Gem::Specification.new do |s|
|
|
67
77
|
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
68
78
|
s.specification_version = 3
|
69
79
|
|
70
|
-
if Gem::Version.new(Gem::
|
80
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
71
81
|
else
|
72
82
|
end
|
73
83
|
else
|
data/lib/irb.rb
CHANGED
data/lib/irb/completion.rb
CHANGED
@@ -1 +1 @@
|
|
1
|
-
IRB.deprecated "The file `irb/completion' has moved to `irb/ext/
|
1
|
+
IRB.deprecated "The file `irb/completion' has moved to `irb/ext/completion' and is loaded by default.", caller
|
data/lib/irb/context.rb
CHANGED
@@ -5,28 +5,13 @@
|
|
5
5
|
# Copyright (C) 2009-2010, Eloy Duran <eloy.de.enige@gmail.com>
|
6
6
|
|
7
7
|
require 'irb/formatter'
|
8
|
-
require 'readline'
|
9
8
|
|
10
9
|
module IRB
|
11
10
|
class Context
|
12
|
-
|
13
|
-
attr_accessor :current
|
14
|
-
|
15
|
-
def make_current(context)
|
16
|
-
# Messing with a current context is gonna bite me in the ass when we
|
17
|
-
# get to multi-threading, but we'll it when we get there.
|
18
|
-
before, @current = @current, context
|
19
|
-
yield
|
20
|
-
ensure
|
21
|
-
@current = before
|
22
|
-
end
|
23
|
-
|
24
|
-
def processors
|
25
|
-
@processors ||= []
|
26
|
-
end
|
27
|
-
end
|
11
|
+
IGNORE_RESULT = :irb_ignore_result
|
28
12
|
|
29
|
-
attr_reader :object, :binding, :line, :source
|
13
|
+
attr_reader :object, :binding, :line, :source
|
14
|
+
attr_accessor :formatter
|
30
15
|
|
31
16
|
def initialize(object, explicit_binding = nil)
|
32
17
|
@object = object
|
@@ -34,8 +19,8 @@ module IRB
|
|
34
19
|
@line = 1
|
35
20
|
clear_buffer
|
36
21
|
|
37
|
-
@
|
38
|
-
@
|
22
|
+
@last_result_assigner = __evaluate__("_ = nil; proc { |val| _ = val }")
|
23
|
+
@exception_assigner = __evaluate__("e = exception = nil; proc { |ex| e = exception = ex }")
|
39
24
|
end
|
40
25
|
|
41
26
|
def __evaluate__(source, file = __FILE__, line = __LINE__)
|
@@ -44,31 +29,14 @@ module IRB
|
|
44
29
|
|
45
30
|
def evaluate(source)
|
46
31
|
result = __evaluate__(source.to_s, '(irb)', @line - @source.buffer.size + 1)
|
47
|
-
|
48
|
-
|
49
|
-
|
32
|
+
unless result == IGNORE_RESULT
|
33
|
+
store_result(result)
|
34
|
+
puts(formatter.result(result))
|
35
|
+
result
|
36
|
+
end
|
50
37
|
rescue Exception => e
|
51
38
|
store_exception(e)
|
52
|
-
puts
|
53
|
-
end
|
54
|
-
|
55
|
-
# Reads input and passes it to all processors.
|
56
|
-
def readline
|
57
|
-
input = Readline.readline(formatter.prompt(self), true)
|
58
|
-
@processors.each { |processor| input = processor.input(input) }
|
59
|
-
input
|
60
|
-
rescue Interrupt
|
61
|
-
clear_buffer
|
62
|
-
""
|
63
|
-
end
|
64
|
-
|
65
|
-
def run
|
66
|
-
self.class.make_current(self) do
|
67
|
-
while line = readline
|
68
|
-
continue = process_line(line)
|
69
|
-
break unless continue
|
70
|
-
end
|
71
|
-
end
|
39
|
+
puts(formatter.exception(e))
|
72
40
|
end
|
73
41
|
|
74
42
|
# Returns whether or not the user wants to continue the current runloop.
|
@@ -88,7 +56,7 @@ module IRB
|
|
88
56
|
return false if @source.terminate?
|
89
57
|
|
90
58
|
if @source.syntax_error?
|
91
|
-
puts
|
59
|
+
puts(formatter.syntax_error(@line, @source.syntax_error))
|
92
60
|
@source.pop
|
93
61
|
elsif @source.code_block?
|
94
62
|
evaluate(@source)
|
@@ -99,13 +67,17 @@ module IRB
|
|
99
67
|
true
|
100
68
|
end
|
101
69
|
|
70
|
+
def prompt
|
71
|
+
formatter.prompt(self)
|
72
|
+
end
|
73
|
+
|
102
74
|
def input_line(line)
|
103
|
-
puts
|
75
|
+
puts(formatter.prompt(self) + line)
|
104
76
|
process_line(line)
|
105
77
|
end
|
106
78
|
|
107
79
|
def formatter
|
108
|
-
IRB.formatter
|
80
|
+
@formatter ||= IRB.formatter
|
109
81
|
end
|
110
82
|
|
111
83
|
def clear_buffer
|
@@ -113,20 +85,11 @@ module IRB
|
|
113
85
|
end
|
114
86
|
|
115
87
|
def store_result(result)
|
116
|
-
@
|
88
|
+
@last_result_assigner.call(result)
|
117
89
|
end
|
118
90
|
|
119
91
|
def store_exception(exception)
|
120
|
-
|
92
|
+
@exception_assigner.call(exception)
|
121
93
|
end
|
122
94
|
end
|
123
|
-
end
|
124
|
-
|
125
|
-
module Kernel
|
126
|
-
# Creates a new IRB::Context with the given +object+ and runs it.
|
127
|
-
def irb(object, binding = nil)
|
128
|
-
IRB::Context.new(object, binding).run
|
129
|
-
end
|
130
|
-
|
131
|
-
private :irb
|
132
|
-
end
|
95
|
+
end
|
data/lib/irb/driver.rb
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
module IRB
|
2
|
+
module Driver
|
3
|
+
class << self
|
4
|
+
def current=(driver)
|
5
|
+
ThreadGroup.new.add(Thread.current)
|
6
|
+
Thread.current[:irb_driver] = driver
|
7
|
+
end
|
8
|
+
|
9
|
+
def current
|
10
|
+
current_thread = Thread.current
|
11
|
+
current_thread[:irb_driver] ||= begin
|
12
|
+
if group = current_thread.group
|
13
|
+
driver = nil
|
14
|
+
group.list.each do |thread|
|
15
|
+
break if driver = thread[:irb_driver]
|
16
|
+
end
|
17
|
+
driver
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
class OutputRedirector
|
24
|
+
def self.target
|
25
|
+
if driver = IRB::Driver.current
|
26
|
+
driver.output
|
27
|
+
else
|
28
|
+
$stderr
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# A standard output object has only one mandatory method: write.
|
33
|
+
# It returns the number of characters written
|
34
|
+
def write(object)
|
35
|
+
string = object.respond_to?(:to_str) ? object : object.to_s
|
36
|
+
send_to_target :write, string
|
37
|
+
string.length
|
38
|
+
end
|
39
|
+
|
40
|
+
# if puts is not there, Ruby will automatically use the write
|
41
|
+
# method when calling Kernel#puts, but defining it has 2 advantages:
|
42
|
+
# - if puts is not defined, you cannot of course use $stdout.puts directly
|
43
|
+
# - (objc) when Ruby emulates puts, it calls write twice
|
44
|
+
# (once for the string and once for the carriage return)
|
45
|
+
# but here we send the calls to another thread so it's nice
|
46
|
+
# to be able to save up one (slow) interthread call
|
47
|
+
def puts(*args)
|
48
|
+
send_to_target :puts, *args
|
49
|
+
nil
|
50
|
+
end
|
51
|
+
|
52
|
+
# Override this if for your situation you need to dispatch from a thread
|
53
|
+
# in a special manner.
|
54
|
+
#
|
55
|
+
# TODO: for macruby send to main thread
|
56
|
+
def send_to_target(method, *args)
|
57
|
+
self.class.target.__send__(method, *args)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|