bond 0.1.3 → 0.1.4
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/CHANGELOG.rdoc +7 -0
- data/README.rdoc +2 -0
- data/VERSION.yml +2 -2
- data/ext/readline_line_buffer/extconf.rb +2 -1
- data/ext/readline_line_buffer/readline_line_buffer.c +2 -0
- data/lib/bond.rb +17 -11
- data/lib/bond/actions.rb +6 -2
- data/lib/bond/agent.rb +31 -3
- data/lib/bond/completion.rb +1 -1
- data/lib/bond/mission.rb +4 -0
- data/lib/bond/missions/method_mission.rb +4 -0
- data/lib/bond/missions/object_mission.rb +4 -0
- data/test/agent_test.rb +55 -0
- data/test/bond_test.rb +0 -23
- metadata +3 -3
data/CHANGELOG.rdoc
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
== 0.1.4
|
2
|
+
* Added Bond.recomplete to make redefinition of completion missions easy.
|
3
|
+
* Added flag to readline extension building so that installing bond doesn't fail for
|
4
|
+
users without readline.
|
5
|
+
* bond/completion allows require to autocomplete gems and within gems.
|
6
|
+
|
1
7
|
== 0.1.3
|
2
8
|
* Fixing deployment mistake
|
3
9
|
|
@@ -9,6 +15,7 @@
|
|
9
15
|
* Fixed irb's completion inconsistencies
|
10
16
|
* Added ability to specify :default_search for Bond.debrief
|
11
17
|
* Added placement of completions with :place for Bond.complete
|
18
|
+
|
12
19
|
== 0.1.1
|
13
20
|
* Added Bond.spy to debug completions
|
14
21
|
* Fixed object completion failing in irbrc
|
data/README.rdoc
CHANGED
@@ -190,6 +190,8 @@ this Readline enhancement to ruby.
|
|
190
190
|
|
191
191
|
== Links
|
192
192
|
* http://tagaholic.me/2009/07/16/bond-from-irb-with-completion-love.html
|
193
|
+
* http://tagaholic.me/2009/07/22/better-irb-completion-with-bond.html
|
194
|
+
* http://tagaholic.me/2009/07/23/mini-irb-and-mini-script-console.html
|
193
195
|
|
194
196
|
== Todo
|
195
197
|
* Allow usage of prefined Bond::Actions in action procs.
|
data/VERSION.yml
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
Copyright (C) 1997-2001 Shugo Maeda */
|
3
3
|
/* body of line_buffer() from irb enhancements at http://www.creo.hu/~csaba/ruby/ */
|
4
4
|
|
5
|
+
#ifdef HAVE_READLINE_READLINE_H
|
5
6
|
#include "ruby.h"
|
6
7
|
#include <errno.h>
|
7
8
|
#include <stdio.h>
|
@@ -20,3 +21,4 @@ void Init_readline_line_buffer() {
|
|
20
21
|
c = rb_const_get(c, rb_intern("Readline"));
|
21
22
|
rb_define_singleton_method(c, "line_buffer", (VALUE(*)(ANYARGS))line_buffer, -1);
|
22
23
|
}
|
24
|
+
#endif
|
data/lib/bond.rb
CHANGED
@@ -54,17 +54,23 @@ module Bond
|
|
54
54
|
# Bond.complete(:object=>ActiveRecord::Base) {|input| input.object.class.instance_methods(false) }
|
55
55
|
# Bond.complete(:method=>'you', :search=>proc {|input, list| list.grep(/#{input}/i)} ) {|input| %w{Only Live Twice} }
|
56
56
|
def complete(options={}, &block)
|
57
|
-
agent.complete(options, &block)
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
57
|
+
if (result = agent.complete(options, &block)).is_a?(String)
|
58
|
+
$stderr.puts result
|
59
|
+
false
|
60
|
+
else
|
61
|
+
true
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
# Redefines an existing completion mission. Takes same options as Bond.complete. This is useful when wanting to override existing
|
66
|
+
# completions or when wanting to toggle between multiple definitions or modes of a completion.
|
67
|
+
def recomplete(options={}, &block)
|
68
|
+
if (result = agent.recomplete(options, &block)).is_a?(String)
|
69
|
+
$stderr.puts result
|
70
|
+
false
|
71
|
+
else
|
72
|
+
true
|
73
|
+
end
|
68
74
|
end
|
69
75
|
|
70
76
|
# Resets Bond so that next time Bond.complete is called, a new set of completion missions are created. This does not
|
data/lib/bond/actions.rb
CHANGED
@@ -11,7 +11,7 @@ module Bond
|
|
11
11
|
def current_eval(string)
|
12
12
|
Missions::ObjectMission.current_eval(string)
|
13
13
|
rescue Exception
|
14
|
-
|
14
|
+
[]
|
15
15
|
end
|
16
16
|
|
17
17
|
# Completes backtick and Kernel#system with shell commands available in ENV['PATH']
|
@@ -50,7 +50,7 @@ module Bond
|
|
50
50
|
File.directory?(File.join(dir,f)) ? f+fs : f } }
|
51
51
|
input_regex = /^#{Regexp.escape(input)}/
|
52
52
|
|
53
|
-
|
53
|
+
require_paths.select {|e| File.directory?(e)}.inject([]) do |t,dir|
|
54
54
|
if input[/.$/] == fs && File.directory?(File.join(dir,input))
|
55
55
|
matches = dir_entries.call(File.join(dir,input)).select {|e| e =~ extensions_regex }.map {|e| input + e }
|
56
56
|
else
|
@@ -61,5 +61,9 @@ module Bond
|
|
61
61
|
t += matches
|
62
62
|
end
|
63
63
|
end
|
64
|
+
|
65
|
+
def require_paths
|
66
|
+
$: + Gem.path.map {|e| Dir["#{e}/gems/*/lib"] }.flatten.uniq rescue $:
|
67
|
+
end
|
64
68
|
end
|
65
69
|
end
|
data/lib/bond/agent.rb
CHANGED
@@ -14,10 +14,38 @@ module Bond
|
|
14
14
|
@missions = []
|
15
15
|
end
|
16
16
|
|
17
|
-
def complete(options={}, &block)
|
17
|
+
def complete(options={}, &block)
|
18
|
+
if (mission = create_mission(options, &block)).is_a?(Mission)
|
19
|
+
mission.place.is_a?(Integer) ? @missions.insert(mission.place - 1, mission).compact! : @missions << mission
|
20
|
+
sort_last_missions
|
21
|
+
end
|
22
|
+
mission
|
23
|
+
end
|
24
|
+
|
25
|
+
def create_mission(options, &block) #:nodoc:
|
18
26
|
options[:action] ||= block
|
19
|
-
|
20
|
-
|
27
|
+
Mission.create(options.merge(:eval_binding=>@eval_binding))
|
28
|
+
rescue InvalidMissionError
|
29
|
+
"Invalid mission given. Mission needs an action and a condition."
|
30
|
+
rescue InvalidMissionActionError
|
31
|
+
"Invalid mission action given. Make sure action responds to :call or refers to a predefined action that does."
|
32
|
+
rescue
|
33
|
+
"Mission setup failed with:\n#{$!}"
|
34
|
+
end
|
35
|
+
|
36
|
+
def recomplete(options={}, &block)
|
37
|
+
if (mission = create_mission(options, &block)).is_a?(Mission)
|
38
|
+
if (existing_mission = @missions.find {|e| e.unique_id == mission.unique_id })
|
39
|
+
@missions[@missions.index(existing_mission)] = mission
|
40
|
+
sort_last_missions
|
41
|
+
else
|
42
|
+
return "No existing mission found to recomplete."
|
43
|
+
end
|
44
|
+
end
|
45
|
+
mission
|
46
|
+
end
|
47
|
+
|
48
|
+
def sort_last_missions #:nodoc:
|
21
49
|
@missions.replace @missions.partition {|e| e.place != :last }.flatten
|
22
50
|
end
|
23
51
|
|
data/lib/bond/completion.rb
CHANGED
@@ -21,7 +21,7 @@ Bond.complete(:on=>/(\$[^\s.]*)$/, :search=>false) {|e|
|
|
21
21
|
global_variables.grep(/^#{Regexp.escape(e.matched[1])}/)
|
22
22
|
}
|
23
23
|
# Completes files
|
24
|
-
Bond.complete(:on
|
24
|
+
Bond.complete(:on=>/[\s(]["']([^'"]*)$/, :search=>false, :action=>:quoted_files, :place=>:last)
|
25
25
|
# Completes any object's methods
|
26
26
|
Bond.complete(:object=>"Object", :place=>:last)
|
27
27
|
# Completes method completion anywhere in the line
|
data/lib/bond/mission.rb
CHANGED
data/test/agent_test.rb
CHANGED
@@ -42,6 +42,61 @@ class Bond::AgentTest < Test::Unit::TestCase
|
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
45
|
+
context "complete" do
|
46
|
+
test "prints error if no action given" do
|
47
|
+
capture_stderr { complete :on=>/blah/ }.should =~ /Invalid mission/
|
48
|
+
end
|
49
|
+
|
50
|
+
test "prints error if no condition given" do
|
51
|
+
capture_stderr { complete {|e| []} }.should =~ /Invalid mission/
|
52
|
+
end
|
53
|
+
|
54
|
+
test "prints error if invalid condition given" do
|
55
|
+
capture_stderr { complete(:on=>'blah') {|e| []} }.should =~ /Invalid mission/
|
56
|
+
end
|
57
|
+
|
58
|
+
test "prints error if invalid symbol action given" do
|
59
|
+
capture_stderr { complete(:on=>/blah/, :action=>:bling) }.should =~ /Invalid mission action/
|
60
|
+
end
|
61
|
+
|
62
|
+
test "prints error if setting mission fails unpredictably" do
|
63
|
+
Bond::Mission.expects(:create).raises(RuntimeError)
|
64
|
+
capture_stderr { complete(:on=>/blah/) {|e| [] } }.should =~ /Mission setup failed/
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
context "recomplete" do
|
69
|
+
before(:each) {|e| Bond.agent.reset }
|
70
|
+
|
71
|
+
test "recompletes a mission" do
|
72
|
+
Bond.complete(:on=>/man/) { %w{1 2 3}}
|
73
|
+
Bond.recomplete(:on=>/man/) { %w{4 5 6}}
|
74
|
+
tabtab('man ').should == %w{4 5 6}
|
75
|
+
end
|
76
|
+
|
77
|
+
test "recompletes a method mission" do
|
78
|
+
Bond.complete(:method=>'blah') { %w{1 2 3}}
|
79
|
+
Bond.recomplete(:method=>'blah') { %w{4 5 6}}
|
80
|
+
tabtab('blah ').should == %w{4 5 6}
|
81
|
+
end
|
82
|
+
|
83
|
+
test "recompletes an object mission" do
|
84
|
+
Bond.complete(:object=>'String') { %w{1 2 3}}
|
85
|
+
Bond.recomplete(:object=>'String') { %w{4 5 6}}
|
86
|
+
tabtab('"blah".').should == %w{.4 .5 .6}
|
87
|
+
end
|
88
|
+
|
89
|
+
test "prints error if no existing mission" do
|
90
|
+
Bond.complete(:object=>'String') { %w{1 2 3}}
|
91
|
+
capture_stderr { Bond.recomplete(:object=>'Array') { %w{4 5 6}}}.should =~ /No existing mission/
|
92
|
+
tabtab('[].').should == []
|
93
|
+
end
|
94
|
+
|
95
|
+
test "prints error if invalid condition given" do
|
96
|
+
capture_stderr { Bond.recomplete}.should =~ /Invalid mission/
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
45
100
|
context "spy" do
|
46
101
|
before(:all) {
|
47
102
|
Bond.reset; complete(:on=>/end$/) { [] }; complete(:method=>'the') { %w{spy who loved me} }
|
data/test/bond_test.rb
CHANGED
@@ -31,29 +31,6 @@ class BondTest < Test::Unit::TestCase
|
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
34
|
-
context "complete" do
|
35
|
-
test "prints error if no action given" do
|
36
|
-
capture_stderr { complete :on=>/blah/ }.should =~ /Invalid mission/
|
37
|
-
end
|
38
|
-
|
39
|
-
test "prints error if no condition given" do
|
40
|
-
capture_stderr { complete {|e| []} }.should =~ /Invalid mission/
|
41
|
-
end
|
42
|
-
|
43
|
-
test "prints error if invalid condition given" do
|
44
|
-
capture_stderr { complete(:on=>'blah') {|e| []} }.should =~ /Invalid mission/
|
45
|
-
end
|
46
|
-
|
47
|
-
test "prints error if invalid symbol action given" do
|
48
|
-
capture_stderr { complete(:on=>/blah/, :action=>:bling) }.should =~ /Invalid mission action/
|
49
|
-
end
|
50
|
-
|
51
|
-
test "prints error if setting mission fails unpredictably" do
|
52
|
-
Bond.agent.expects(:complete).raises(ArgumentError)
|
53
|
-
capture_stderr { complete(:on=>/blah/) {|e| [] } }.should =~ /Mission setup failed/
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
34
|
test "reset clears existing missions" do
|
58
35
|
complete(:on=>/blah/) {[]}
|
59
36
|
Bond.agent.missions.size.should_not == 0
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bond
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gabriel Horner
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-07-
|
12
|
+
date: 2009-07-30 00:00:00 -04:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -72,7 +72,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
72
72
|
requirements: []
|
73
73
|
|
74
74
|
rubyforge_project: tagaholic
|
75
|
-
rubygems_version: 1.3.
|
75
|
+
rubygems_version: 1.3.5
|
76
76
|
signing_key:
|
77
77
|
specification_version: 3
|
78
78
|
summary: "Mission: Easy custom autocompletion for arguments, methods and beyond. Accomplished for irb and any other readline-like console environments."
|