dietrb 0.4.7 → 0.5.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/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
|