rcodetools 0.5.0.0 → 0.7.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/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 # =>
|