rink 1.0.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/.document +5 -0
- data/.gitignore +22 -0
- data/LICENSE +20 -0
- data/README.rdoc +135 -0
- data/Rakefile +47 -0
- data/VERSION +1 -0
- data/bin/rink +66 -0
- data/lib/core_ext/object.rb +15 -0
- data/lib/rink/console.rb +335 -0
- data/lib/rink/delegation.rb +139 -0
- data/lib/rink/input_method/base.rb +41 -0
- data/lib/rink/input_method/file.rb +24 -0
- data/lib/rink/input_method/io.rb +34 -0
- data/lib/rink/input_method/readline.rb +49 -0
- data/lib/rink/io_methods.rb +44 -0
- data/lib/rink/lexer.rb +58 -0
- data/lib/rink/line_processor/base.rb +23 -0
- data/lib/rink/line_processor/pure_ruby.rb +180 -0
- data/lib/rink/output_method/base.rb +31 -0
- data/lib/rink/output_method/io.rb +22 -0
- data/lib/rink.rb +12 -0
- data/rink.gemspec +83 -0
- data/spec/lib/core_ext/object_spec.rb +19 -0
- data/spec/lib/rink/console_spec.rb +129 -0
- data/spec/lib/rink/io_methods_spec.rb +39 -0
- data/spec/lib/rink/pure_ruby_line_processor_spec.rb +33 -0
- data/spec/lib/rink_spec.rb +5 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +12 -0
- metadata +110 -0
data/rink.gemspec
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{rink}
|
8
|
+
s.version = "1.0.0"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Colin MacKenzie IV"]
|
12
|
+
s.date = %q{2010-08-06}
|
13
|
+
s.default_executable = %q{rink}
|
14
|
+
s.description = %q{Makes interactive consoles awesome.}
|
15
|
+
s.email = %q{sinisterchipmunk@gmail.com}
|
16
|
+
s.executables = ["rink"]
|
17
|
+
s.extra_rdoc_files = [
|
18
|
+
"LICENSE",
|
19
|
+
"README.rdoc"
|
20
|
+
]
|
21
|
+
s.files = [
|
22
|
+
".document",
|
23
|
+
".gitignore",
|
24
|
+
"LICENSE",
|
25
|
+
"README.rdoc",
|
26
|
+
"Rakefile",
|
27
|
+
"VERSION",
|
28
|
+
"bin/rink",
|
29
|
+
"lib/core_ext/object.rb",
|
30
|
+
"lib/rink.rb",
|
31
|
+
"lib/rink/console.rb",
|
32
|
+
"lib/rink/delegation.rb",
|
33
|
+
"lib/rink/input_method/base.rb",
|
34
|
+
"lib/rink/input_method/file.rb",
|
35
|
+
"lib/rink/input_method/io.rb",
|
36
|
+
"lib/rink/input_method/readline.rb",
|
37
|
+
"lib/rink/io_methods.rb",
|
38
|
+
"lib/rink/lexer.rb",
|
39
|
+
"lib/rink/line_processor/base.rb",
|
40
|
+
"lib/rink/line_processor/pure_ruby.rb",
|
41
|
+
"lib/rink/output_method/base.rb",
|
42
|
+
"lib/rink/output_method/io.rb",
|
43
|
+
"rink.gemspec",
|
44
|
+
"spec/lib/core_ext/object_spec.rb",
|
45
|
+
"spec/lib/rink/console_spec.rb",
|
46
|
+
"spec/lib/rink/io_methods_spec.rb",
|
47
|
+
"spec/lib/rink/pure_ruby_line_processor_spec.rb",
|
48
|
+
"spec/lib/rink_spec.rb",
|
49
|
+
"spec/spec.opts",
|
50
|
+
"spec/spec_helper.rb"
|
51
|
+
]
|
52
|
+
s.homepage = %q{http://github.com/sinisterchipmunk/rink}
|
53
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
54
|
+
s.require_paths = ["lib"]
|
55
|
+
s.rubygems_version = %q{1.3.6}
|
56
|
+
s.summary = %q{Makes interactive consoles awesome.}
|
57
|
+
s.test_files = [
|
58
|
+
"spec/lib",
|
59
|
+
"spec/lib/core_ext",
|
60
|
+
"spec/lib/core_ext/object_spec.rb",
|
61
|
+
"spec/lib/rink",
|
62
|
+
"spec/lib/rink/console_spec.rb",
|
63
|
+
"spec/lib/rink/io_methods_spec.rb",
|
64
|
+
"spec/lib/rink/pure_ruby_line_processor_spec.rb",
|
65
|
+
"spec/lib/rink_spec.rb",
|
66
|
+
"spec/spec.opts",
|
67
|
+
"spec/spec_helper.rb"
|
68
|
+
]
|
69
|
+
|
70
|
+
if s.respond_to? :specification_version then
|
71
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
72
|
+
s.specification_version = 3
|
73
|
+
|
74
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
75
|
+
s.add_development_dependency(%q<rspec>, [">= 1.3.0"])
|
76
|
+
else
|
77
|
+
s.add_dependency(%q<rspec>, [">= 1.3.0"])
|
78
|
+
end
|
79
|
+
else
|
80
|
+
s.add_dependency(%q<rspec>, [">= 1.3.0"])
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
@@ -0,0 +1,19 @@
|
|
1
|
+
describe Object do
|
2
|
+
context "#instance_exec" do
|
3
|
+
class Dummy
|
4
|
+
def value
|
5
|
+
:dummy_value
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
subject { Dummy.new }
|
10
|
+
|
11
|
+
it "should work with args" do
|
12
|
+
# Block returns the value passed to it and the value of #value from the Dummy, in whose context
|
13
|
+
# it will be eval'd.
|
14
|
+
block = lambda { |a| [a, value] }
|
15
|
+
|
16
|
+
subject.instance_exec(:arg_value, &block).should == [:arg_value, :dummy_value]
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,129 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Rink::Console do
|
4
|
+
class ExampleObject
|
5
|
+
def inspect
|
6
|
+
"#<example>"
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def console(*input)
|
11
|
+
if input.last.kind_of?(Hash)
|
12
|
+
options = input.pop
|
13
|
+
else options = {}
|
14
|
+
end
|
15
|
+
input = input.flatten.join("\n")
|
16
|
+
subject.run(input, options.merge(:output => @output, :silent => false))
|
17
|
+
end
|
18
|
+
|
19
|
+
before(:each) { @input = ""; @output = "" }
|
20
|
+
subject { Rink::Console.new(:input => "", :silent => true) }
|
21
|
+
|
22
|
+
it "should provide an option to not execute Ruby code" do
|
23
|
+
console("x = 5", :allow_ruby => false)
|
24
|
+
@output.should match(/I don't know the word \"x.\"/)
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should not raise a NameError when invoking a dynamically-defined method" do
|
28
|
+
console("def a; 5; end; a", :rescue_errors => false).should == 5
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should retain local variables" do
|
32
|
+
subject.run("x = 5\nx", :rescue_errors => false)
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should be able to set itself as the namespace" do
|
36
|
+
subject.run("self", :namespace => :self).should == subject
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should return the last value executed" do
|
40
|
+
console("1").should == 1
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should not have a nil namespace!" do
|
44
|
+
console("self").should_not be_nil
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should be able to span ruby code over 2 lines" do
|
48
|
+
proc { console("3.times do\nend", :rescue_errors => false) }.should_not raise_error
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should not output multiple prompts" do
|
52
|
+
console("3.times do |i|\nx = i\nend")
|
53
|
+
@output.should == ">> Interactive Console <<\nRink::Console > 3.times do |i|\nRink::Console > x = i\nRink::Console > end\n => 3\nRink::Console > "
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should be able to span ruby code over 3 lines" do
|
57
|
+
proc { console("3.times do |i|\nx = i\nend", :rescue_errors => false) }.should_not raise_error
|
58
|
+
|
59
|
+
# this illustrates a totally different prob: losing scope over multiple inputs.
|
60
|
+
# proc { console("x = 0\n3.times do |i|\nx += i\nend\nraise unless x == 3", :rescue_errors => false) }.
|
61
|
+
# should_not raise_error
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
# May need a better way to test this.
|
66
|
+
it "should be able to add hooks custom commands" do
|
67
|
+
# Create a subclass of Rink::Console so we don't contaminate the environment
|
68
|
+
klass = Class.new(Rink::Console)
|
69
|
+
klass.command(:help) { |*args| puts 'how may I help you?' }
|
70
|
+
k = klass.new(:input => "help", :output => @output, :rescue_errors => false)
|
71
|
+
@output.should =~ /how may I help you\?/
|
72
|
+
end
|
73
|
+
|
74
|
+
it "should be able to exit" do
|
75
|
+
# yeah, it was an oversight. Catching all Exceptions resulted in catching SystemExit, so the app couldn't be
|
76
|
+
# stopped. Whoops.
|
77
|
+
#proc { console("exit") }.should raise_error(SystemExit)
|
78
|
+
|
79
|
+
# now an honest-to-goodness 'exit' command exists, so SystemExit doesn't get raised.
|
80
|
+
# instead we'll just make sure that exit doesn't execute any further code.
|
81
|
+
console("exit\n1").should_not == 1
|
82
|
+
end
|
83
|
+
|
84
|
+
it "should show a banner" do
|
85
|
+
console
|
86
|
+
@output.should =~ /\A>> Interactive Console <</
|
87
|
+
end
|
88
|
+
|
89
|
+
it "should have a prompt" do
|
90
|
+
console
|
91
|
+
prompt = Regexp::escape(subject.send(:prompt))
|
92
|
+
@output.should =~ /^#{prompt}$/
|
93
|
+
end
|
94
|
+
|
95
|
+
it "should print return value, inspected" do
|
96
|
+
console("ExampleObject.new")
|
97
|
+
@output.should =~ / => #<example>$/
|
98
|
+
end
|
99
|
+
|
100
|
+
it "should not raise exceptions" do
|
101
|
+
proc { console("test") }.should_not raise_error
|
102
|
+
end
|
103
|
+
|
104
|
+
it "should print exceptions" do
|
105
|
+
console("test")
|
106
|
+
@output.should =~ /ArgumentError: /
|
107
|
+
end
|
108
|
+
|
109
|
+
it "should ignore blank lines" do
|
110
|
+
console("\n")
|
111
|
+
prompt = Regexp::escape(subject.send(:prompt))
|
112
|
+
@output.should =~ /^#{prompt}[\n\r]+#{prompt}$/
|
113
|
+
end
|
114
|
+
|
115
|
+
it "should allow setting namespace" do
|
116
|
+
obj = ExampleObject.new
|
117
|
+
subject.namespace = obj
|
118
|
+
console("self").should == obj
|
119
|
+
end
|
120
|
+
|
121
|
+
it "should allow presetting namespace" do
|
122
|
+
obj = ExampleObject.new
|
123
|
+
console("self", :namespace => obj).should == obj
|
124
|
+
end
|
125
|
+
|
126
|
+
it "should allow lazily presetting namespace" do
|
127
|
+
console("self", :namespace => proc { ExampleObject.new }).should be_kind_of(ExampleObject)
|
128
|
+
end
|
129
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Rink::IOMethods do
|
4
|
+
include Rink::IOMethods
|
5
|
+
|
6
|
+
shared_examples_for "an input method" do
|
7
|
+
it "should gets" do
|
8
|
+
inln = @input.gets
|
9
|
+
inln.should_not be_nil
|
10
|
+
inln.length.should_not == 0
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
context "input should be set up" do
|
15
|
+
context "from a File" do
|
16
|
+
before(:each) { setup_input_method(File.new(__FILE__, "r")).should be_kind_of(Rink::InputMethod::Base) }
|
17
|
+
|
18
|
+
it_should_behave_like "an input method"
|
19
|
+
end
|
20
|
+
|
21
|
+
context "from a String" do
|
22
|
+
before(:each) { setup_input_method("a string").should be_kind_of(Rink::InputMethod::Base) }
|
23
|
+
|
24
|
+
it_should_behave_like "an input method"
|
25
|
+
end
|
26
|
+
|
27
|
+
context "from a StringIO" do
|
28
|
+
before(:each) { setup_input_method(StringIO.new("a string")).should be_kind_of(Rink::InputMethod::Base) }
|
29
|
+
|
30
|
+
it_should_behave_like "an input method"
|
31
|
+
end
|
32
|
+
|
33
|
+
context "from an InputMethod" do
|
34
|
+
before(:each) { setup_input_method(setup_input_method("a string")).should be_kind_of(Rink::InputMethod::Base) }
|
35
|
+
|
36
|
+
it_should_behave_like "an input method"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Rink::LineProcessor::PureRuby do
|
4
|
+
it "should autocomplete" do
|
5
|
+
subject.autocomplete('insp', Object.new).should == ["inspect"]
|
6
|
+
end
|
7
|
+
|
8
|
+
# probably don't need to test this directly since readline does it (and we know it works) ...
|
9
|
+
# maybe test that autocomplete and whatnot are processed correctly, instead.
|
10
|
+
# def console(*input)
|
11
|
+
# input = input.flatten.join("\n")
|
12
|
+
# subject.run(input, :output => @output, :silent => false)
|
13
|
+
# end
|
14
|
+
#
|
15
|
+
# before(:each) { @input = ""; @output = "" }
|
16
|
+
# subject { Rink::Console.new(:input => "", :silent => true) }
|
17
|
+
#
|
18
|
+
#
|
19
|
+
# it "should autocomplete 'help'" do
|
20
|
+
# console("h\t")
|
21
|
+
# @output.should =~ /> help/
|
22
|
+
# end
|
23
|
+
#
|
24
|
+
# it "should not autocomplete 'help' from 'd'" do
|
25
|
+
# console("d\t")
|
26
|
+
# @output.should_not =~ /> dh?elp/
|
27
|
+
# end
|
28
|
+
#
|
29
|
+
# it "should recall backward" do
|
30
|
+
# console("1\n" + ANSI::move_up)
|
31
|
+
# @output.should =~ / => 1$/
|
32
|
+
# end
|
33
|
+
end
|
data/spec/spec.opts
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'tmpdir'
|
3
|
+
|
4
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
5
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
6
|
+
require 'rink'
|
7
|
+
require 'spec'
|
8
|
+
require 'spec/autorun'
|
9
|
+
|
10
|
+
Spec::Runner.configure do |config|
|
11
|
+
|
12
|
+
end
|
metadata
ADDED
@@ -0,0 +1,110 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rink
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 1
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
version: 1.0.0
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Colin MacKenzie IV
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2010-08-06 00:00:00 -04:00
|
18
|
+
default_executable: rink
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: rspec
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 1
|
29
|
+
- 3
|
30
|
+
- 0
|
31
|
+
version: 1.3.0
|
32
|
+
type: :development
|
33
|
+
version_requirements: *id001
|
34
|
+
description: Makes interactive consoles awesome.
|
35
|
+
email: sinisterchipmunk@gmail.com
|
36
|
+
executables:
|
37
|
+
- rink
|
38
|
+
extensions: []
|
39
|
+
|
40
|
+
extra_rdoc_files:
|
41
|
+
- LICENSE
|
42
|
+
- README.rdoc
|
43
|
+
files:
|
44
|
+
- .document
|
45
|
+
- .gitignore
|
46
|
+
- LICENSE
|
47
|
+
- README.rdoc
|
48
|
+
- Rakefile
|
49
|
+
- VERSION
|
50
|
+
- bin/rink
|
51
|
+
- lib/core_ext/object.rb
|
52
|
+
- lib/rink.rb
|
53
|
+
- lib/rink/console.rb
|
54
|
+
- lib/rink/delegation.rb
|
55
|
+
- lib/rink/input_method/base.rb
|
56
|
+
- lib/rink/input_method/file.rb
|
57
|
+
- lib/rink/input_method/io.rb
|
58
|
+
- lib/rink/input_method/readline.rb
|
59
|
+
- lib/rink/io_methods.rb
|
60
|
+
- lib/rink/lexer.rb
|
61
|
+
- lib/rink/line_processor/base.rb
|
62
|
+
- lib/rink/line_processor/pure_ruby.rb
|
63
|
+
- lib/rink/output_method/base.rb
|
64
|
+
- lib/rink/output_method/io.rb
|
65
|
+
- rink.gemspec
|
66
|
+
- spec/lib/core_ext/object_spec.rb
|
67
|
+
- spec/lib/rink/console_spec.rb
|
68
|
+
- spec/lib/rink/io_methods_spec.rb
|
69
|
+
- spec/lib/rink/pure_ruby_line_processor_spec.rb
|
70
|
+
- spec/lib/rink_spec.rb
|
71
|
+
- spec/spec.opts
|
72
|
+
- spec/spec_helper.rb
|
73
|
+
has_rdoc: true
|
74
|
+
homepage: http://github.com/sinisterchipmunk/rink
|
75
|
+
licenses: []
|
76
|
+
|
77
|
+
post_install_message:
|
78
|
+
rdoc_options:
|
79
|
+
- --charset=UTF-8
|
80
|
+
require_paths:
|
81
|
+
- lib
|
82
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
83
|
+
requirements:
|
84
|
+
- - ">="
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
segments:
|
87
|
+
- 0
|
88
|
+
version: "0"
|
89
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
90
|
+
requirements:
|
91
|
+
- - ">="
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
segments:
|
94
|
+
- 0
|
95
|
+
version: "0"
|
96
|
+
requirements: []
|
97
|
+
|
98
|
+
rubyforge_project:
|
99
|
+
rubygems_version: 1.3.6
|
100
|
+
signing_key:
|
101
|
+
specification_version: 3
|
102
|
+
summary: Makes interactive consoles awesome.
|
103
|
+
test_files:
|
104
|
+
- spec/lib/core_ext/object_spec.rb
|
105
|
+
- spec/lib/rink/console_spec.rb
|
106
|
+
- spec/lib/rink/io_methods_spec.rb
|
107
|
+
- spec/lib/rink/pure_ruby_line_processor_spec.rb
|
108
|
+
- spec/lib/rink_spec.rb
|
109
|
+
- spec/spec.opts
|
110
|
+
- spec/spec_helper.rb
|