pa 1.1.4 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/spec/pa/path_spec.rb CHANGED
@@ -1,72 +1,32 @@
1
- require 'spec_helper'
2
-
3
- class T_FakePath
4
- def path
5
- "hello"
6
- end
7
- end
1
+ require "spec_helper"
8
2
 
9
3
  describe Pa do
10
- context 'dir and dir2' do
11
- it '#dir => Pa' do
12
- Pa.dir('/home/guten').should be_an_instance_of Pa
4
+ describe ".absolute?" do
5
+ it "is true if path is a absolute path" do
6
+ Pa.absolute?("/").should == true
13
7
  end
14
8
 
15
- it '#dir2 => Pa' do
16
- Pa.dir2('/home/guten').should be_an_instance_of String
9
+ it "is false if path is a relative path" do
10
+ Pa.absolute?(".").should == false
17
11
  end
18
12
  end
19
13
 
20
- describe 'NAME_EXT_PAT' do
21
- it 'matchs `foo.bar`' do
22
- 'foo.bar'.match(Pa::NAME_EXT_PAT).captures.should == %w(foo bar)
23
- end
24
-
25
- it 'matchs `foo`' do
26
- 'foo'.match(Pa::NAME_EXT_PAT).captures.should == ['foo', nil]
27
- end
28
- end
29
-
30
- describe '.get' do
31
- it 'get path from a path object' do
32
- Pa.get(T_FakePath.new).should == 'hello'
33
- end
34
-
35
- it 'get path from a string' do
36
- Pa.get('foo').should == 'foo'
37
- end
38
-
39
- it 'get nil from nil' do
40
- Pa.get(nil).should == nil
41
- end
42
-
43
- it 'otherwise raise ArgumentError' do
44
- lambda { Pa.get([]) }.should raise_error(ArgumentError)
45
- end
14
+ it ".dir2 => String" do
15
+ Pa.dir2("/home/guten").should be_an_instance_of String
46
16
  end
47
17
 
48
- describe '.absolute?' do
49
- it 'is true if path is a absolute path' do
50
- Pa.absolute?('/').should == true
51
- end
52
-
53
- it 'is false if path is a relative path' do
54
- Pa.absolute?('.').should == false
55
- end
56
- end
57
-
58
- describe '.dangling?' do
59
- it 'works' do
18
+ describe ".dangling?" do
19
+ it "works" do
60
20
  olddir=Dir.pwd
61
21
  Dir.chdir("#{$specdir}/data/tmp")
62
22
 
63
23
  begin
64
- File.open('fa', 'w'){|f| f.puts "guten" }
65
- File.symlink('fa', 'symlink')
66
- File.symlink('fb', 'dangling')
24
+ File.open("fa", "w"){|f| f.puts "guten" }
25
+ File.symlink("fa", "symlink")
26
+ File.symlink("fb", "dangling")
67
27
 
68
- Pa.dangling?('symlink').should be_false
69
- Pa.dangling?('dangling').should be_true
28
+ Pa.dangling?("symlink").should be_false
29
+ Pa.dangling?("dangling").should be_true
70
30
  ensure
71
31
  FileUtils.rm_r Dir.glob("*")
72
32
  Dir.chdir(olddir)
@@ -74,175 +34,113 @@ describe Pa do
74
34
  end
75
35
  end
76
36
 
77
- describe '.pwd2' do
37
+ describe ".pwd2" do
78
38
  olddir = Dir.getwd
79
- Dir.chdir('/tmp')
39
+ Dir.chdir("/tmp")
80
40
  begin
81
- Pa.pwd2.should == '/tmp'
41
+ Pa.pwd2.should == "/tmp"
82
42
  ensure
83
43
  Dir.chdir(olddir)
84
44
  end
85
45
  end
86
46
 
87
- describe '.dir2' do
47
+ describe ".dir2" do
88
48
  it "get a path's directory name" do
89
- Pa.dir2('/home/guten').should == '/home'
49
+ Pa.dir2("/home/guten").should == "/home"
90
50
  end
91
51
  end
92
52
 
93
- describe '.base2' do
94
- it 'get name, ext with :ext => true' do
95
- Pa.base2('/home/foo.bar', ext: true).should == ['foo', 'bar']
53
+ describe ".base2" do
54
+ it "get name, ext with :ext => true" do
55
+ Pa.base2("/home/foo.bar", ext: true).should == ["foo", "bar"]
96
56
  end
97
57
  end
98
58
 
99
- describe '.ext2' do
59
+ describe ".base" do
60
+ it "works" do
61
+ Pa.base("/home/foo.bar", ext: true).should == [Pa("foo"), "bar"]
62
+ end
63
+ end
64
+
65
+ describe ".ext2" do
100
66
  it "get a path's extension" do
101
- Pa.ext2('/home/a.txt').should == 'txt'
67
+ Pa.ext2("/home/a.txt").should == "txt"
102
68
  end
103
69
 
104
- it 'return nil when don extension' do
105
- Pa.ext2('/home/a').should == nil
70
+ it "return nil when don extension" do
71
+ Pa.ext2("/home/a").should == nil
106
72
  end
107
73
 
108
- it 'with complex' do
109
- Pa.ext2('/home/a.b.c.txt').should == 'txt'
74
+ it "with complex" do
75
+ Pa.ext2("/home/a.b.c.txt").should == "txt"
110
76
  end
111
77
  end
112
78
 
113
- describe '.absolute2' do
114
- it 'returns absolute_path' do
115
- Pa.absolute2('.').should == File.absolute_path('.')
79
+ describe ".absolute2" do
80
+ it "returns absolute_path" do
81
+ Pa.absolute2(".").should == File.absolute_path(".")
116
82
  end
117
83
  end
118
84
 
119
- describe '.expand2' do
120
- it 'expand_path' do
121
- Pa.expand2('~').should == File.expand_path('~')
85
+ describe ".expand2" do
86
+ it "expand_path" do
87
+ Pa.expand2("~").should == File.expand_path("~")
122
88
  end
123
89
  end
124
90
 
125
- describe '.shorten2' do
126
- it 'short /home/usr/file into ~/file' do
127
- ENV['HOME'] = '/home/foo'
128
- Pa.shorten2('/home/foo/file').should == '~/file'
91
+ describe ".shorten2" do
92
+ it "short /home/usr/file into ~/file" do
93
+ ENV["HOME"] = "/home/foo"
94
+ Pa.shorten2("/home/foo/file").should == "~/file"
129
95
  end
130
96
 
131
- it 'not short /home/other-user/file' do
132
- ENV['HOME'] = '/home/foo'
133
- Pa.shorten2('/home/bar/file').should == '/home/bar/file'
97
+ it "not short /home/other-user/file" do
98
+ ENV["HOME"] = "/home/foo"
99
+ Pa.shorten2("/home/bar/file").should == "/home/bar/file"
134
100
  end
135
101
  end
136
102
 
137
- describe '.real2' do
138
- Pa.real2('.').should == File.realpath('.')
103
+ describe ".real2" do
104
+ Pa.real2(".").should == File.realpath(".")
139
105
  end
140
106
 
141
- describe '.parent2' do
107
+ describe ".parent2" do
142
108
  before :each do
143
- @path = '/home/foo/a.txt'
109
+ @path = "/home/foo/a.txt"
144
110
  end
145
111
 
146
- it 'return parent path' do
147
- Pa.parent2(@path).should == '/home/foo'
112
+ it "return parent path" do
113
+ Pa.parent2(@path).should == "/home/foo"
148
114
  end
149
115
 
150
- it 'return parent upto 2 level path' do
151
- Pa.parent2(@path, 2).should == '/home'
116
+ it "return parent upto 2 level path" do
117
+ Pa.parent2(@path, 2).should == "/home"
152
118
  end
153
119
  end
154
120
 
155
- describe 'split2' do
156
- it 'split a path into two part: dirname and basename' do
157
- Pa.split2('/home/b/a.txt').should == ['/home/b', 'a.txt']
158
- end
121
+ describe "class DELEGATE_METHODS" do
122
+ it "works" do
123
+ Pa.should_receive(:pwd2).with(1,2)
159
124
 
160
- it 'with :all options: split all parts' do
161
- Pa.split2('/home/b/a.txt', :all => true).should == ['/', 'home', 'b', 'a.txt']
125
+ Pa.pwd(1,2)
162
126
  end
163
127
  end
164
128
 
165
- describe 'split' do
166
- it 'is a special case' do
167
- Pa.split('/home/b/a.txt').should == [Pa('/home/b'), 'a.txt']
168
- end
169
- end
129
+ describe "instance DELEGATE_METHODS2" do
130
+ it "works" do
131
+ Pa.should_receive(:parent2).with("foo", 1, 2)
170
132
 
171
- describe '.join2' do
172
- it 'join a path' do
173
- Pa.join2('/a', 'b').should == '/a/b'
133
+ Pa.new("foo").parent2(1, 2)
174
134
  end
135
+ end
175
136
 
176
- it 'skip nil values' do
177
- Pa.join2('/a', 'b', nil).should == '/a/b'
178
- end
137
+ describe "instance DELEGATE_METHODS" do
138
+ it "works" do
139
+ p = Pa.new("foo")
179
140
 
180
- it 'skip empty values' do
181
- Pa.join2('/a', 'b', '').should == '/a/b'
141
+ p.should_receive(:parent2).with(1,2)
142
+ ret = p.parent(1,2)
143
+ ret.should be_an_instance_of(Pa)
182
144
  end
183
145
  end
184
-
185
- describe '#==' do
186
- it 'runs ok' do
187
- (Pa('/home') == Pa('/home')).should be_true
188
- end
189
- end
190
-
191
- describe '#+' do
192
- it 'runs ok' do
193
- (Pa('/home')+'~').should == Pa('/home~')
194
- end
195
- end
196
-
197
- describe '#sub2' do
198
- it 'runs ok' do
199
- Pa('/home/foo').sub2(/o/,'').should == '/hme/foo'
200
- end
201
- end
202
-
203
- describe '#sub!' do
204
- it 'runs ok' do
205
- pa = Pa('/home/foo')
206
- pa.sub!(/o/,'')
207
- pa.should == Pa('/hme/foo')
208
- end
209
- end
210
-
211
- describe '#gsub2' do
212
- it 'runs ok' do
213
- Pa('/home/foo').gsub2(/o/,'').should == '/hme/f'
214
- end
215
- end
216
-
217
- describe '#gsub!' do
218
- it 'runs ok' do
219
- pa = Pa('/home/foo')
220
- pa.gsub!(/o/,'')
221
- pa.should == Pa('/hme/f')
222
- end
223
- end
224
-
225
- describe '#match' do
226
- it 'runs ok' do
227
- Pa('/home/foo').match(/foo/)[0].should == 'foo'
228
- end
229
- end
230
-
231
- describe '#start_with?' do
232
- it 'runs ok' do
233
- Pa('/home/foo').start_with?('/home').should be_true
234
- end
235
- end
236
-
237
- describe '#end_with?' do
238
- it 'runs ok' do
239
- Pa('/home/foo').end_with?('foo').should be_true
240
- end
241
- end
242
-
243
- describe '#=~' do
244
- it 'runs ok' do
245
- (Pa('/home/foo') =~ /foo/).should be_true
246
- end
247
- end
248
146
  end
@@ -1,7 +1,13 @@
1
1
  require "spec_helper"
2
2
 
3
3
  describe Pa do
4
- describe "#chmod" do
5
- #Pa("path_doesn't_exists").chmod(777)
6
- end
4
+ it ".exists?" do
5
+ File.should_receive(:exists?).with("foo")
6
+ Pa.exists?("foo")
7
+ end
8
+
9
+ it "#exists?" do
10
+ File.should_receive(:exists?).with("foo")
11
+ Pa.new("foo").exists?
12
+ end
7
13
  end
data/spec/pa_spec.rb CHANGED
@@ -1,9 +1,269 @@
1
1
  require "spec_helper"
2
2
 
3
+ class Pa
4
+ class <<self
5
+ public :_wrap, :build_path2
6
+ end
7
+ end
8
+
3
9
  describe Pa do
10
+ it "._wrap" do
11
+ Pa._wrap("foo").should == Pa("foo")
12
+ Pa._wrap(["guten", "tag"]).should == [Pa("guten"), Pa("tag")]
13
+ end
14
+
15
+ describe ".build_path2" do
16
+ it "works" do
17
+ Pa.build_path2(path: "foo/bar.avi").should == "foo/bar.avi"
18
+ Pa.build_path2(dir: "foo", name: "bar", ext: "avi").should == "foo/bar.avi"
19
+ end
20
+
21
+ it "complex examples" do
22
+ Pa.build_path2(dir: "foo").should == "foo"
23
+ Pa.build_path2(fname: "bar.avi").should == "bar.avi"
24
+ Pa.build_path2(base: "bar.avi").should == "bar.avi"
25
+ Pa.build_path2(name: "bar").should == "bar"
26
+ Pa.build_path2(fext: ".avi").should == ".avi"
27
+ Pa.build_path2(ext: "avi").should == ".avi"
28
+ Pa.build_path2(dir: "", fname: "bar.avi").should == "bar.avi"
29
+ end
30
+
31
+ it "percedure" do
32
+ Pa.build_path2(path: "foo", fname: "bar").should == "foo"
33
+ Pa.build_path2(fname: "foo", name: "bar").should == "foo"
34
+ Pa.build_path2(fname: "foo", ext: "bar").should == "foo"
35
+ Pa.build_path2(fname: "foo", fext: ".bar").should == "foo"
36
+ Pa.build_path2(fext: "foo", ext: "bar").should == "foo"
37
+ end
38
+ end
39
+
40
+ describe ".get" do
41
+ it "get path from a path object" do
42
+ path = Object.new
43
+ def path.path
44
+ "hello"
45
+ end
46
+ Pa.get(path).should == "hello"
47
+ end
48
+
49
+ it "get path from a string" do
50
+ Pa.get("foo").should == "foo"
51
+ end
52
+
53
+ it "get nil from nil" do
54
+ Pa.get(nil).should == nil
55
+ end
56
+
57
+ it "otherwise raise ArgumentError" do
58
+ lambda { Pa.get([]) }.should raise_error(ArgumentError)
59
+ end
60
+ end
61
+
62
+ describe "split2" do
63
+ it "split a path into two part: dirname and basename" do
64
+ Pa.split2("/home/b/a.txt").should == ["/home/b", "a.txt"]
65
+ end
66
+
67
+ it "with :all options: split all parts" do
68
+ Pa.split2("/home/b/a.txt", :all => true).should == ["/", "home", "b", "a.txt"]
69
+ end
70
+ end
71
+
72
+ describe "split" do
73
+ it "is a special case" do
74
+ Pa.split("/home/b/a.txt").should == [Pa("/home/b"), "a.txt"]
75
+ end
76
+ end
77
+
78
+ describe ".join2" do
79
+ it "join a path" do
80
+ Pa.join2("/a", "b").should == "/a/b"
81
+ end
82
+
83
+ it "skip nil values" do
84
+ Pa.join2("/a", "b", nil).should == "/a/b"
85
+ end
86
+
87
+ it "skip empty values" do
88
+ Pa.join2("/a", "b", "").should == "/a/b"
89
+ end
90
+ end
91
+
92
+ describe ".build2" do
93
+ it "works" do
94
+ Pa.build2("/home/guten.avi"){ |p| "#{p.dir}/foo.#{p.ext}" }.should == "/home/foo.avi"
95
+ Pa.build2(dir: "/home", name: "guten", ext: "avi").should == "/home/guten.avi"
96
+ Pa.build2(path: "/home/guten.avi"){ |p| "#{p.dir}/foo.#{p.ext}" }.should == "/home/foo.avi"
97
+ end
98
+ end
99
+
100
+ describe "class DELEGATE_METHODS" do
101
+ it "works" do
102
+ Pa.stub(:build2){|arg| arg }
103
+
104
+ Pa.build("foo").should == Pa("foo")
105
+ end
106
+ end
107
+
108
+ describe "#initilaize" do
109
+ it "support ~/foo path" do
110
+ Pa.new("~/foo").should == Pa("#{ENV['HOME']}/foo")
111
+ end
112
+ end
113
+
114
+ it "#absolute2" do
115
+ Pa.new("foo.avi").absolute2.should == File.join(File.absolute_path("."), "foo.avi")
116
+ end
117
+
118
+ it "#dir2" do
119
+ Pa.new("foo.avi").dir2.should == "."
120
+ end
121
+
122
+ it "#dir_strict2" do
123
+ Pa.new("foo.avi").dir_strict2.should == ""
124
+ Pa.new("./foo.avi").dir_strict2.should == "."
125
+ Pa.new("../foo.avi").dir_strict2.should == ".."
126
+ Pa.new("/foo.avi").dir_strict2.should == "/"
127
+ end
128
+
129
+ it "#base2" do
130
+ Pa.new("foo.avi").base2.should == "foo.avi"
131
+ end
132
+
133
+ it "#name2" do
134
+ Pa.new("foo.avi").name2.should == "foo"
135
+ end
136
+
137
+ it "#ext2" do
138
+ Pa.new("foo.avi").ext2.should == "avi"
139
+ Pa.new("foo").ext2.should == ""
140
+ end
141
+
142
+ it "#fext2" do
143
+ Pa.new("foo.avi").fext2.should == ".avi"
144
+ Pa.new("foo").ext2.should == ""
145
+ end
146
+
147
+ it "#inspect" do
148
+ Pa.new("/foo/bar.avi").inspect.should =~ /path|absolute/
149
+ end
150
+
151
+ it "#to_s" do
152
+ Pa.new("bar.avi").to_s.should == "bar.avi"
153
+ end
154
+
155
+ it "#replace" do
156
+ a = Pa.new("/home/guten")
157
+ a.replace "/bar/foo.avi"
158
+
159
+ a.path.should == "/bar/foo.avi"
160
+ a.absolute2.should == "/bar/foo.avi"
161
+ a.dir2.should == "/bar"
162
+ a.fname2.should == "foo.avi"
163
+ a.base2.should == "foo.avi"
164
+ a.name2.should == "foo"
165
+ a.ext2.should == "avi"
166
+ a.fext2.should == ".avi"
167
+ end
168
+
4
169
  describe "#<=>" do
5
170
  it "runs ok" do
6
- (Pa('/home/b') <=> Pa('/home/a')).should == 1
171
+ (Pa("/home/b") <=> Pa("/home/a")).should == 1
7
172
  end
8
173
  end
174
+
175
+ describe "#+" do
176
+ it "runs ok" do
177
+ (Pa("/home")+"~").should == Pa("/home~")
178
+ end
179
+ end
180
+
181
+ describe "#sub2" do
182
+ it "runs ok" do
183
+ Pa("/home/foo").sub2(/o/,"").should == "/hme/foo"
184
+ end
185
+ end
186
+
187
+ describe "#sub!" do
188
+ it "runs ok" do
189
+ pa = Pa("/home/foo")
190
+ pa.sub!(/o/,"")
191
+ pa.should == Pa("/hme/foo")
192
+ end
193
+ end
194
+
195
+ describe "#gsub2" do
196
+ it "runs ok" do
197
+ Pa("/home/foo").gsub2(/o/,"").should == "/hme/f"
198
+ end
199
+ end
200
+
201
+ describe "#gsub!" do
202
+ it "runs ok" do
203
+ pa = Pa("/home/foo")
204
+ pa.gsub!(/o/,"")
205
+ pa.should == Pa("/hme/f")
206
+ end
207
+ end
208
+
209
+ describe "#match" do
210
+ it "runs ok" do
211
+ Pa("/home/foo").match(/foo/)[0].should == "foo"
212
+ end
213
+ end
214
+
215
+ describe "#start_with?" do
216
+ it "runs ok" do
217
+ Pa("/home/foo").start_with?("/home").should be_true
218
+ end
219
+ end
220
+
221
+ describe "#end_with?" do
222
+ it "runs ok" do
223
+ Pa("/home/foo").end_with?("foo").should be_true
224
+ end
225
+ end
226
+
227
+ describe "#=~" do
228
+ it "runs ok" do
229
+ (Pa("/home/foo") =~ /foo/).should be_true
230
+ end
231
+ end
232
+
233
+ describe "#build2" do
234
+ it "works" do
235
+ Pa.new("/home/guten.avi").build2(path: "/foo/bar.avi").should == "/foo/bar.avi"
236
+ Pa.new("/home/guten.avi").build2(dir: "foo").should == "foo/guten.avi"
237
+ Pa.new("/home/guten.avi").build2(fname: "bar").should == "/home/bar"
238
+ Pa.new("/home/guten.avi").build2(base: "bar").should == "/home/bar"
239
+ Pa.new("/home/guten.avi").build2(name: "bar").should == "/home/bar.avi"
240
+ Pa.new("/home/guten.avi").build2(ext: "ogg").should == "/home/guten.ogg"
241
+ Pa.new("/home/guten.avi").build2(fext: ".ogg").should == "/home/guten.ogg"
242
+ Pa.new("/home/guten.avi").build2(dir: "foo", name: "bar", ext: "ogg").should == "foo/bar.ogg"
243
+ end
244
+
245
+ it "percedure" do
246
+ Pa.new("/home/guten.avi").build2(path: "foo", fname: "bar").should == "foo"
247
+ Pa.new("/home/guten.avi").build2(fname: "foo", name: "bar").should == "/home/foo"
248
+ Pa.new("/home/guten.avi").build2(fname: "foo", ext: "ogg").should == "/home/foo"
249
+ Pa.new("/home/guten.avi").build2(fname: "foo", fext: ".ogg").should == "/home/foo"
250
+ Pa.new("/home/guten.avi").build2(fext: ".ogg", ext: "mp3").should == "/home/guten.ogg"
251
+ end
252
+ end
253
+
254
+ describe "instance DELEGATE_METHODS2" do
255
+ it "works" do
256
+ Pa.stub(:join2) { "foo" }
257
+ Pa.new("foo").join2.should == "foo"
258
+ end
259
+ end
260
+
261
+ describe "instance DELEGATE_METHODS" do
262
+ it "works" do
263
+ Pa.stub(:build2) { "foo" }
264
+
265
+ Pa.new("foo").build.should == Pa("foo")
266
+ end
267
+ end
268
+
9
269
  end
data/spec/spec_helper.rb CHANGED
@@ -1,3 +1,42 @@
1
1
  require "pa"
2
2
 
3
3
  $specdir = Pa.dir(__FILE__)
4
+
5
+ RSpec.configure do |config|
6
+ def capture(stream)
7
+ begin
8
+ stream = stream.to_s
9
+ eval "$#{stream} = StringIO.new"
10
+ yield
11
+ result = eval("$#{stream}").string
12
+ ensure
13
+ eval("$#{stream} = #{stream.upcase}")
14
+ end
15
+
16
+ result
17
+ end
18
+
19
+ alias :silence :capture
20
+ end
21
+
22
+ module Kernel
23
+ private
24
+
25
+ def xdescribe(*args, &blk)
26
+ describe *args do
27
+ pending "xxxxxxxxx"
28
+ end
29
+ end
30
+
31
+ def xcontext(*args, &blk)
32
+ context *args do
33
+ pending "xxxxxxxxx"
34
+ end
35
+ end
36
+
37
+ def xit(*args, &blk)
38
+ it *args do
39
+ pending "xxxxxxxx"
40
+ end
41
+ end
42
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pa
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.4
4
+ version: 1.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-12-08 00:00:00.000000000 Z
12
+ date: 2012-02-02 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: ! 'a path library for Ruby
15
15
 
@@ -53,12 +53,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
53
53
  - - ! '>='
54
54
  - !ruby/object:Gem::Version
55
55
  version: '0'
56
+ segments:
57
+ - 0
58
+ hash: -4359841082193627011
56
59
  required_rubygems_version: !ruby/object:Gem::Requirement
57
60
  none: false
58
61
  requirements:
59
62
  - - ! '>='
60
63
  - !ruby/object:Gem::Version
61
64
  version: '0'
65
+ segments:
66
+ - 0
67
+ hash: -4359841082193627011
62
68
  requirements: []
63
69
  rubyforge_project: xx
64
70
  rubygems_version: 1.8.11
@@ -66,3 +72,4 @@ signing_key:
66
72
  specification_version: 3
67
73
  summary: a path library for Ruby
68
74
  test_files: []
75
+ has_rdoc: