rcodetools 0.5.0.0 → 0.7.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +14 -0
- data/README +63 -0
- data/README.TDC +158 -0
- data/README.ja +84 -0
- data/README.vim +11 -0
- data/Rakefile +15 -2
- data/THANKS +5 -0
- data/bin/rct-complete +4 -2
- data/bin/rct-doc +4 -2
- data/bin/rct-meth-args +1 -1
- data/bin/xmpfilter +7 -1
- data/icicles-rcodetools.el +2 -1
- data/lib/rcodetools/completion.rb +36 -18
- data/lib/rcodetools/doc.rb +3 -0
- data/lib/rcodetools/fork.rb +222 -0
- data/lib/rcodetools/fork_config.rb +26 -0
- data/lib/rcodetools/options.rb +34 -1
- data/lib/rcodetools/xmpfilter.rb +106 -18
- data/lib/rcodetools/xmptestunitfilter.rb +116 -55
- data/lib/ruby_toggle_file.rb +99 -0
- data/rcodetools.el +64 -9
- data/rcodetools.vim +41 -6
- data/test/data/completion_class_info-input.rb +1 -0
- data/test/data/completion_class_info-output.rb +10 -0
- data/test/data/completion_class_info_no_candidates-input.rb +1 -0
- data/test/data/completion_class_info_no_candidates-output.rb +1 -0
- data/test/data/completion_detect_rbtest-input.rb +7 -0
- data/test/data/completion_detect_rbtest-output.rb +2 -0
- data/test/data/completion_detect_rbtest2-input.rb +1 -0
- data/test/data/completion_detect_rbtest2-output.rb +2 -0
- data/test/data/completion_in_method-input.rb +3 -0
- data/test/data/completion_in_method-output.rb +1 -0
- data/test/data/completion_in_method-test.rb +6 -0
- data/test/data/completion_rbtest-input.rb +7 -0
- data/test/data/completion_rbtest-output.rb +2 -0
- data/test/data/doc_detect_rbtest-input.rb +1 -0
- data/test/data/doc_detect_rbtest-output.rb +1 -0
- data/test/data/doc_detect_rbtest2-input.rb +7 -0
- data/test/data/doc_detect_rbtest2-output.rb +1 -0
- data/test/data/doc_rbtest-input.rb +7 -0
- data/test/data/doc_rbtest-output.rb +1 -0
- data/test/data/rspec-input.rb +9 -9
- data/test/data/rspec-output.rb +21 -21
- data/test/data/rspec_poetry-input.rb +9 -9
- data/test/data/rspec_poetry-output.rb +21 -21
- data/test/data/sample_test_script.rb +9 -0
- data/test/data/unit_test_detect_rbtest-input.rb +50 -0
- data/test/data/unit_test_detect_rbtest-output.rb +52 -0
- data/test/data/unit_test_detect_rbtest2-input.rb +6 -0
- data/test/data/unit_test_detect_rbtest2-output.rb +6 -0
- data/test/data/unit_test_rbtest-input.rb +6 -0
- data/test/data/unit_test_rbtest-output.rb +6 -0
- data/test/test_completion.rb +37 -3
- data/test/test_doc.rb +2 -0
- data/test/test_functional.rb +75 -14
- data/test/test_options.rb +1 -0
- data/test/test_ruby_toggle_file.rb +125 -0
- data/test/test_run.rb +7 -3
- data/test/test_xmpfilter.rb +132 -5
- data/test/test_xmptestunitfilter.rb +1 -0
- metadata +76 -43
data/rcodetools.el
CHANGED
@@ -4,15 +4,20 @@
|
|
4
4
|
;;;
|
5
5
|
;;; Use and distribution subject to the terms of the Ruby license.
|
6
6
|
|
7
|
-
(defvar xmpfilter-command-name "ruby -S xmpfilter --dev"
|
7
|
+
(defvar xmpfilter-command-name "ruby -S xmpfilter --dev --detect-rbtest"
|
8
8
|
"The xmpfilter command name.")
|
9
|
-
(defvar rct-doc-command-name "ruby -S rct-doc --dev"
|
9
|
+
(defvar rct-doc-command-name "ruby -S rct-doc --dev --fork --detect-rbtest"
|
10
10
|
"The rct-doc command name.")
|
11
|
-
(defvar rct-complete-command-name "ruby -S rct-complete --dev"
|
11
|
+
(defvar rct-complete-command-name "ruby -S rct-complete --dev --fork --detect-rbtest"
|
12
12
|
"The rct-complete command name.")
|
13
|
+
(defvar ruby-toggle-file-command-name "ruby -S ruby-toggle-file"
|
14
|
+
"The ruby-toggle-file command name.")
|
13
15
|
(defvar rct-option-history nil) ;internal
|
14
16
|
(defvar rct-option-local nil) ;internal
|
15
17
|
(make-variable-buffer-local 'rct-option-local)
|
18
|
+
(defvar rct-debug nil
|
19
|
+
"If non-nil, output debug message into *Messages*.")
|
20
|
+
;; (setq rct-debug t)
|
16
21
|
|
17
22
|
(defadvice comment-dwim (around rct-hack activate)
|
18
23
|
"If comment-dwim is successively called, add => mark."
|
@@ -55,7 +60,7 @@
|
|
55
60
|
See also `rct-interactive'. "
|
56
61
|
(interactive (rct-interactive))
|
57
62
|
(rct-save-position
|
58
|
-
(lambda () (shell-command-on-region (point-min) (point-max) (xmpfilter-command option) t t))))
|
63
|
+
(lambda () (shell-command-on-region (point-min) (point-max) (xmpfilter-command option) t t " *rct-error*"))))
|
59
64
|
|
60
65
|
(defun xmpfilter-command (&optional option)
|
61
66
|
"The xmpfilter command line, DWIM."
|
@@ -76,6 +81,8 @@ See also `rct-interactive'. "
|
|
76
81
|
(defvar rct-complete-symbol-function 'rct-complete-symbol--normal
|
77
82
|
"Function to use rct-complete-symbol.")
|
78
83
|
;; (setq rct-complete-symbol-function 'rct-complete-symbol--icicles)
|
84
|
+
(defvar rct-use-test-script t
|
85
|
+
"Whether rct-complete/rct-doc use test scripts.")
|
79
86
|
|
80
87
|
(defun rct-complete-symbol (&optional option)
|
81
88
|
"Perform ruby method and class completion on the text around point.
|
@@ -113,20 +120,60 @@ See also `rct-interactive'."
|
|
113
120
|
|
114
121
|
;; (define-key ruby-mode-map "\M-\C-i" 'rct-complete-symbol)
|
115
122
|
|
123
|
+
(defun rct-debuglog (logmsg)
|
124
|
+
"if `rct-debug' is non-nil, output LOGMSG into *Messages*. Returns LOGMSG."
|
125
|
+
(if rct-debug
|
126
|
+
(message "%s" logmsg))
|
127
|
+
logmsg)
|
128
|
+
|
116
129
|
(defun rct-exec-and-eval (command opt)
|
117
130
|
"Execute rct-complete/rct-doc and evaluate the output."
|
118
131
|
(let ((eval-buffer (get-buffer-create " *rct-eval*")))
|
119
132
|
;; copy to temporary buffer to do completion at non-EOL.
|
120
133
|
(shell-command-on-region
|
121
134
|
(point-min) (point-max)
|
122
|
-
(format "%s %s %s --line=%d --column=%d"
|
123
|
-
|
124
|
-
|
125
|
-
|
135
|
+
(rct-debuglog (format "%s %s %s --line=%d --column=%d %s"
|
136
|
+
command opt (or rct-option-local "")
|
137
|
+
(rct-current-line) (current-column)
|
138
|
+
(if rct-use-test-script (rct-test-script-option-string) "")))
|
139
|
+
eval-buffer nil " *rct-error*")
|
126
140
|
(message "")
|
127
141
|
(eval (with-current-buffer eval-buffer
|
128
142
|
(goto-char 1)
|
129
|
-
(
|
143
|
+
(unwind-protect
|
144
|
+
(read (current-buffer))
|
145
|
+
(unless rct-debug (kill-buffer eval-buffer)))))))
|
146
|
+
|
147
|
+
(defun rct-test-script-option-string ()
|
148
|
+
(if (null buffer-file-name)
|
149
|
+
""
|
150
|
+
(let ((test-buf (rct-find-test-script-buffer))
|
151
|
+
(bfn buffer-file-name)
|
152
|
+
t-opt test-filename)
|
153
|
+
(if test-buf
|
154
|
+
;; pass test script's filename and lineno
|
155
|
+
(with-current-buffer test-buf
|
156
|
+
(setq t-opt (format "%s@%s" buffer-file-name (rct-current-line)))
|
157
|
+
(format "-t %s --filename=%s" t-opt bfn))
|
158
|
+
""))))
|
159
|
+
|
160
|
+
(require 'cl)
|
161
|
+
|
162
|
+
(defun rct-find-test-script-buffer (&optional buffer-list)
|
163
|
+
"Find the latest used Ruby test script buffer."
|
164
|
+
(setq buffer-list (or buffer-list (buffer-list)))
|
165
|
+
(dolist (buf buffer-list)
|
166
|
+
(with-current-buffer buf
|
167
|
+
(if (and buffer-file-name (string-match "test.*\.rb$" buffer-file-name))
|
168
|
+
(return buf)))))
|
169
|
+
|
170
|
+
;; (defun rct-find-test-method (buffer)
|
171
|
+
;; "Find test method on point on BUFFER."
|
172
|
+
;; (with-current-buffer buffer
|
173
|
+
;; (save-excursion
|
174
|
+
;; (forward-line 1)
|
175
|
+
;; (if (re-search-backward "^ *def *\\(test_[A-Za-z0-9?!_]+\\)" nil t)
|
176
|
+
;; (match-string 1)))))
|
130
177
|
|
131
178
|
(defun rct-try-completion ()
|
132
179
|
"Evaluate the output of rct-complete."
|
@@ -159,4 +206,12 @@ See also `rct-interactive'. "
|
|
159
206
|
(error
|
160
207
|
(ri fullname)))))
|
161
208
|
|
209
|
+
;;;;
|
210
|
+
(defun ruby-toggle-buffer ()
|
211
|
+
"Open a related file to the current buffer. test<=>impl."
|
212
|
+
(interactive)
|
213
|
+
(find-file (shell-command-to-string
|
214
|
+
(format "%s %s" ruby-toggle-file-command-name buffer-file-name))))
|
215
|
+
|
216
|
+
|
162
217
|
(provide 'rcodetools)
|
data/rcodetools.vim
CHANGED
@@ -46,19 +46,36 @@ endfunction
|
|
46
46
|
|
47
47
|
|
48
48
|
"{{{ RCT_completion function
|
49
|
+
|
50
|
+
let s:last_test_file = ""
|
51
|
+
let s:last_test_lineno = 0
|
52
|
+
|
49
53
|
let s:rct_completion_col = 0
|
50
54
|
let s:rct_tmpfile = ""
|
51
55
|
|
56
|
+
function! <SID>RCT_command_with_test_options(cmd)
|
57
|
+
if s:last_test_file != ""
|
58
|
+
return a:cmd .
|
59
|
+
\ "-" . "-filename='" . expand("%:p") . "' " .
|
60
|
+
\ "-t '" . s:last_test_file . "@" . s:last_test_lineno . "' "
|
61
|
+
endif
|
62
|
+
return a:cmd
|
63
|
+
endfunction
|
64
|
+
|
52
65
|
function! <SID>RCT_completion(findstart, base)
|
53
66
|
if a:findstart
|
54
67
|
let s:rct_completion_col = col('.') - 1
|
55
|
-
let s:rct_tmpfile = "tmp-rcodetools" . strftime("Y-%m-%d-%
|
68
|
+
let s:rct_tmpfile = "tmp-rcodetools" . strftime("Y-%m-%d-%H-%M-%S.rb")
|
56
69
|
silent exec ":w " . s:rct_tmpfile
|
57
70
|
return strridx(getline('.'), '.', col('.')) + 1
|
58
71
|
else
|
59
72
|
let line = line('.')
|
60
73
|
let column = s:rct_completion_col
|
61
|
-
|
74
|
+
|
75
|
+
let command = "rct-complete --completion-class-info --dev --fork --line=" .
|
76
|
+
\ line . " --column=" . column . " "
|
77
|
+
let command = <SID>RCT_command_with_test_options(command) . s:rct_tmpfile
|
78
|
+
|
62
79
|
let data = split(system(command), '\n')
|
63
80
|
|
64
81
|
for dline in data
|
@@ -116,23 +133,41 @@ function! RCT_find_tag_or_ri(fullname)
|
|
116
133
|
endfunction
|
117
134
|
|
118
135
|
function! <SID>RCT_smart_ri()
|
119
|
-
let tmpfile = "tmp-rcodetools" . strftime("Y-%m-%d-%
|
136
|
+
let tmpfile = "tmp-rcodetools" . strftime("Y-%m-%d-%H-%M-%S.rb")
|
120
137
|
silent exec ":w " . tmpfile
|
121
138
|
|
122
139
|
let line = line('.')
|
123
140
|
let column = col('.') - 1
|
124
|
-
let command = "rct-doc --ri-vim --line=" . line . " --column=" . column . " "
|
141
|
+
let command = "rct-doc --ri-vim --line=" . line . " --column=" . column . " "
|
142
|
+
let command = <SID>RCT_command_with_test_options(command) . tmpfile
|
125
143
|
"let term = matchstr(system(command), "\\v[^\n]+")
|
126
144
|
exec system(command)
|
127
145
|
call delete(tmpfile)
|
128
146
|
"call RCT_find_tag_or_ri(term)
|
129
147
|
endfunction
|
130
148
|
|
149
|
+
function! <SID>RCT_ruby_toggle()
|
150
|
+
let curr_file = expand("%:p")
|
151
|
+
let cmd = "ruby -S ruby-toggle-file " . curr_file
|
152
|
+
if match(curr_file, '\v_test|test_') != -1
|
153
|
+
let s:last_test_file = curr_file
|
154
|
+
let s:last_test_lineno = line(".")
|
155
|
+
endif
|
156
|
+
let dest = system(cmd)
|
157
|
+
silent exec ":w"
|
158
|
+
exec ("edit " . dest)
|
159
|
+
silent! normal g;
|
160
|
+
endfunction
|
161
|
+
|
131
162
|
"{{{ bindings and au
|
132
163
|
|
133
|
-
|
164
|
+
if v:version >= 700
|
165
|
+
execute "au Filetype ruby setlocal completefunc=" . s:sid . "RCT_completion"
|
166
|
+
endif
|
134
167
|
execute 'au Filetype ruby nmap <buffer><silent> <C-]> :exec "call ' .
|
135
168
|
\ 'RCT_find_tag_or_ri(''" . expand("<cword>") . "'')"<cr>'
|
136
|
-
execute 'au Filetype ruby nmap <buffer><silent>' . s:GetOption("RCT_ri_binding", "<LocalLeader>r") .
|
169
|
+
execute 'au Filetype ruby nmap <buffer><silent>' . s:GetOption("RCT_ri_binding", "<LocalLeader>r") .
|
137
170
|
\ ' :call ' . s:sid . 'RCT_smart_ri()<cr>'
|
171
|
+
execute 'au Filetype ruby nmap <buffer><silent>' . s:GetOption("RCT_toggle_binding", "<LocalLeader>t") .
|
172
|
+
\ ' :call ' . s:sid . 'RCT_ruby_toggle()<cr>'
|
138
173
|
let &cpo = s:save_cpo
|
@@ -0,0 +1 @@
|
|
1
|
+
Array.new(3).s
|
@@ -0,0 +1 @@
|
|
1
|
+
Array.new(3).nonexisten
|
@@ -0,0 +1 @@
|
|
1
|
+
|
@@ -0,0 +1 @@
|
|
1
|
+
Array.new(3).uni
|
@@ -0,0 +1 @@
|
|
1
|
+
length
|
@@ -0,0 +1 @@
|
|
1
|
+
[].length
|
@@ -0,0 +1 @@
|
|
1
|
+
Array#length
|
@@ -0,0 +1 @@
|
|
1
|
+
String#upcase
|
@@ -0,0 +1 @@
|
|
1
|
+
String#upcase
|
data/test/data/rspec-input.rb
CHANGED
@@ -11,36 +11,36 @@ class X
|
|
11
11
|
end
|
12
12
|
|
13
13
|
|
14
|
-
|
15
|
-
|
14
|
+
describe "xmpfilter's expectation expansion" do
|
15
|
+
before do
|
16
16
|
@o = X.new
|
17
17
|
end
|
18
18
|
|
19
|
-
|
19
|
+
it "should expand should == expectations" do
|
20
20
|
@o.foo(true) # =>
|
21
21
|
@o.foo(true).a # =>
|
22
22
|
@o.foo(false) # =>
|
23
23
|
end
|
24
24
|
|
25
|
-
|
25
|
+
it "should expand should raise_error expectations" do
|
26
26
|
@o.bar # =>
|
27
27
|
end
|
28
28
|
|
29
|
-
|
29
|
+
it "should expand should be_nil expectations" do
|
30
30
|
@o.baz # =>
|
31
31
|
end
|
32
32
|
|
33
|
-
|
33
|
+
it "should expand correct expectations for complex values" do
|
34
34
|
@o.babar # =>
|
35
35
|
end
|
36
36
|
|
37
|
-
|
37
|
+
it "should expand should be_close expectations" do
|
38
38
|
@o.fubar(10) # =>
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
42
|
-
|
43
|
-
|
42
|
+
describe "xmpfilter's automagic binding detection" do
|
43
|
+
it "should expand should == expectations" do
|
44
44
|
a = b = c = 1
|
45
45
|
d = a
|
46
46
|
d # =>
|
data/test/data/rspec-output.rb
CHANGED
@@ -11,42 +11,42 @@ class X
|
|
11
11
|
end
|
12
12
|
|
13
13
|
|
14
|
-
|
15
|
-
|
14
|
+
describe "xmpfilter's expectation expansion" do
|
15
|
+
before do
|
16
16
|
@o = X.new
|
17
17
|
end
|
18
18
|
|
19
|
-
|
20
|
-
(@o.foo(true)).
|
21
|
-
(@o.foo(true).inspect).
|
22
|
-
(@o.foo(true).a).
|
23
|
-
(@o.foo(false)).
|
19
|
+
it "should expand should == expectations" do
|
20
|
+
(@o.foo(true)).should be_a_kind_of(X::Y)
|
21
|
+
(@o.foo(true).inspect).should == ("#<struct X::Y a=2>")
|
22
|
+
(@o.foo(true).a).should == (2)
|
23
|
+
(@o.foo(false)).should == (2)
|
24
24
|
end
|
25
25
|
|
26
|
-
|
27
|
-
lambda{@o.bar}.
|
26
|
+
it "should expand should raise_error expectations" do
|
27
|
+
lambda{@o.bar}.should raise_error(RuntimeError)
|
28
28
|
end
|
29
29
|
|
30
|
-
|
31
|
-
(@o.baz).
|
30
|
+
it "should expand should be_nil expectations" do
|
31
|
+
(@o.baz).should be_nil
|
32
32
|
end
|
33
33
|
|
34
|
-
|
35
|
-
(@o.babar).
|
34
|
+
it "should expand correct expectations for complex values" do
|
35
|
+
(@o.babar).should == ([1, 2])
|
36
36
|
end
|
37
37
|
|
38
|
-
|
39
|
-
(@o.fubar(10)).
|
38
|
+
it "should expand should be_close expectations" do
|
39
|
+
(@o.fubar(10)).should be_close(101.0, 0.0001)
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
43
|
-
|
44
|
-
|
43
|
+
describe "xmpfilter's automagic binding detection" do
|
44
|
+
it "should expand should == expectations" do
|
45
45
|
a = b = c = 1
|
46
46
|
d = a
|
47
|
-
(d).
|
48
|
-
(d).
|
49
|
-
(d).
|
50
|
-
(d).
|
47
|
+
(d).should == (a)
|
48
|
+
(d).should == (b)
|
49
|
+
(d).should == (c)
|
50
|
+
(d).should == (1)
|
51
51
|
end
|
52
52
|
end
|
@@ -11,36 +11,36 @@ class X
|
|
11
11
|
end
|
12
12
|
|
13
13
|
|
14
|
-
|
15
|
-
|
14
|
+
describe "xmpfilter's expectation expansion" do
|
15
|
+
before do
|
16
16
|
@o = X.new
|
17
17
|
end
|
18
18
|
|
19
|
-
|
19
|
+
it "should expand should == expectations" do
|
20
20
|
@o.foo(true) # =>
|
21
21
|
@o.foo(true).a # =>
|
22
22
|
@o.foo(false) # =>
|
23
23
|
end
|
24
24
|
|
25
|
-
|
25
|
+
it "should expand should raise_error expectations" do
|
26
26
|
@o.bar # =>
|
27
27
|
end
|
28
28
|
|
29
|
-
|
29
|
+
it "should expand should be_nil expectations" do
|
30
30
|
@o.baz # =>
|
31
31
|
end
|
32
32
|
|
33
|
-
|
33
|
+
it "should expand correct expectations for complex values" do
|
34
34
|
@o.babar # =>
|
35
35
|
end
|
36
36
|
|
37
|
-
|
37
|
+
it "should expand should be_close expectations" do
|
38
38
|
@o.fubar(10) # =>
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
42
|
-
|
43
|
-
|
42
|
+
describe "xmpfilter's automagic binding detection" do
|
43
|
+
it "should expand should == expectations" do
|
44
44
|
a = b = c = 1
|
45
45
|
d = a
|
46
46
|
d # =>
|