rdoctest 0.0.1 → 0.0.2
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/README.rdoc +30 -6
- data/bin/rdoctest +9 -1
- data/lib/rdoctest.rb +2 -0
- data/lib/rdoctest/runner.rb +18 -34
- data/lib/rdoctest/task.rb +1 -1
- data/lib/rdoctest/test_case.rb +19 -0
- data/lib/rdoctest/version.rb +3 -2
- metadata +4 -3
data/README.rdoc
CHANGED
@@ -25,7 +25,7 @@ Use the CLI:
|
|
25
25
|
.
|
26
26
|
Finished in ... seconds.
|
27
27
|
|
28
|
-
1 tests,
|
28
|
+
1 tests, 6 assertions, 0 failures, 0 errors, 0 skips
|
29
29
|
|
30
30
|
|
31
31
|
== Examples
|
@@ -64,7 +64,7 @@ Rdoctest expects well-formatted RDoc. This means:
|
|
64
64
|
# >> 1 + 1
|
65
65
|
# => 2
|
66
66
|
#
|
67
|
-
# More complex:
|
67
|
+
# More complex, testing output:
|
68
68
|
#
|
69
69
|
# >> def hello_world
|
70
70
|
# >> puts "Hello, world!"
|
@@ -88,6 +88,7 @@ Rdoctest's CLI works a lot like Ruby's.
|
|
88
88
|
Usage: rdoctest [options] [file ...]
|
89
89
|
-Idirectory
|
90
90
|
-rlibrary
|
91
|
+
-f Don't automatically require files
|
91
92
|
...
|
92
93
|
|
93
94
|
If you're testing a complex project, make sure you prepare necessary libraries
|
@@ -96,6 +97,12 @@ and load paths:
|
|
96
97
|
% rdoctest -Ilib -rmylibrary lib/**/*.rb
|
97
98
|
|
98
99
|
|
100
|
+
If your application handles the loading of files, suppress Rdoctest's autoload
|
101
|
+
mechanism:
|
102
|
+
|
103
|
+
$ rdoctest -f -r./config/environment app/**/*.rb
|
104
|
+
|
105
|
+
|
99
106
|
=== Rake
|
100
107
|
|
101
108
|
Rdoctest comes with a Rake task that you can load in your Rakefile.
|
@@ -104,12 +111,12 @@ Rdoctest comes with a Rake task that you can load in your Rakefile.
|
|
104
111
|
Rdoctest::Task.new
|
105
112
|
|
106
113
|
|
107
|
-
|
114
|
+
Running it is simple.
|
108
115
|
|
109
116
|
% rake doctest
|
110
117
|
|
111
118
|
|
112
|
-
It
|
119
|
+
It implements a configuration similar to Rake's TestTask.
|
113
120
|
|
114
121
|
Rdoctest::Task.new :test do |t|
|
115
122
|
t.libs << 'lib' # The 'lib' directory is loaded by default,
|
@@ -117,17 +124,34 @@ It comes with a similar configuration to Rake's TestTask.
|
|
117
124
|
end
|
118
125
|
|
119
126
|
|
127
|
+
=== Rails
|
128
|
+
|
129
|
+
I haven't done much testing in Rails yet, but the following should work:
|
130
|
+
|
131
|
+
First, update your Gemfile to include the gem in your test group.
|
132
|
+
|
133
|
+
group :test do
|
134
|
+
gem 'rdoctest'
|
135
|
+
end
|
136
|
+
|
137
|
+
|
138
|
+
Run <tt>bundle install</tt>, and you can immediately invoke the CLI.
|
139
|
+
|
140
|
+
% rdoctest -f -r./config/environment app/**/*.rb lib/**/*.rb
|
141
|
+
|
142
|
+
|
120
143
|
== Roadmap
|
121
144
|
|
122
|
-
* Better detection of code blocks (the
|
145
|
+
* Better detection of code blocks (the 2-space indent is too restrictive).
|
123
146
|
* Test plain text files (READMEs, for example).
|
124
147
|
* Autotest integration?
|
148
|
+
* Better Rails support?
|
125
149
|
* Test shell snippets (beginning with <tt>$</tt> and <tt>%</tt>)?
|
126
150
|
|
127
151
|
|
128
152
|
== Prior Art
|
129
153
|
|
130
|
-
{rubydoctest}[http://github.com/tablatom/rubydoctest]
|
154
|
+
{rubydoctest}[http://github.com/tablatom/rubydoctest]
|
131
155
|
|
132
156
|
|
133
157
|
== License
|
data/bin/rdoctest
CHANGED
@@ -3,14 +3,21 @@ require 'optparse'
|
|
3
3
|
lib = File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib'))
|
4
4
|
$LOAD_PATH.unshift lib
|
5
5
|
|
6
|
+
config = { :load_path => [] }
|
7
|
+
|
6
8
|
options = OptionParser.new do |option|
|
7
9
|
option.banner = "Usage: #{basename = File.basename $0} [options] [file ...]"
|
8
10
|
option.on('-Idirectory') { |v|
|
9
|
-
|
11
|
+
directories = v.split File::PATH_SEPARATOR
|
12
|
+
$LOAD_PATH.concat directories
|
13
|
+
config[:load_path].concat directories
|
10
14
|
}
|
11
15
|
option.on('-rlibrary') { |v|
|
12
16
|
require v
|
13
17
|
}
|
18
|
+
option.on('-f', "Don't automatically require files") { |v|
|
19
|
+
config[:force] = v
|
20
|
+
}
|
14
21
|
option.on('--version') {
|
15
22
|
require 'rdoctest/version'
|
16
23
|
puts "#{basename} #{Rdoctest::Version::VERSION}"
|
@@ -29,3 +36,4 @@ if ARGF.argv.empty?
|
|
29
36
|
end
|
30
37
|
|
31
38
|
load 'rdoctest/runner.rb'
|
39
|
+
Rdoctest::Runner.new(config).run
|
data/lib/rdoctest.rb
CHANGED
data/lib/rdoctest/runner.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'stringio'
|
2
2
|
require 'strscan'
|
3
|
-
require '
|
3
|
+
require 'rdoctest/test_case'
|
4
4
|
|
5
5
|
module Rdoctest
|
6
6
|
# The Runner takes RDoc example text and creates tests for them.
|
@@ -29,15 +29,17 @@ module Rdoctest
|
|
29
29
|
#
|
30
30
|
# Use ellipses for partial matches.
|
31
31
|
#
|
32
|
-
# >>
|
32
|
+
# >> ok
|
33
33
|
# NameError: undefined local variable or method `a'...
|
34
34
|
class Runner
|
35
35
|
@@ruby = /(.+?)# =>([^\n]+\n)/m
|
36
36
|
@@irb = /((?:^>> [^\n]+\n)+)((?:(?!^(?:>>|=>))[^\n]+\n)*)(^=> [^\n]+)?/m
|
37
37
|
|
38
|
-
attr_reader :files
|
38
|
+
attr_reader :files, :options
|
39
|
+
|
40
|
+
def initialize options = {}
|
41
|
+
@options = options
|
39
42
|
|
40
|
-
def initialize
|
41
43
|
@files = {}
|
42
44
|
end
|
43
45
|
|
@@ -56,15 +58,10 @@ module Rdoctest
|
|
56
58
|
lineno += 1
|
57
59
|
|
58
60
|
next in_comment = nil unless line.sub! /^ *# ?/, ''
|
59
|
-
in_comment
|
61
|
+
in_comment = lineno if line =~ /^={1,6} \S/
|
60
62
|
in_comment ||= lineno
|
61
63
|
|
62
|
-
|
63
|
-
in_test = false if line !~ /^(?: {2,}|$)/
|
64
|
-
else
|
65
|
-
in_test = true if line =~ /^ {2}\S/
|
66
|
-
end
|
67
|
-
|
64
|
+
in_test = in_test ? line =~ (/^(?: {2,}|$)/) : line =~ /^ {2}\S/
|
68
65
|
line = "\n" unless in_test
|
69
66
|
((files[filename] ||= {})[in_comment] ||= '') << line if in_comment
|
70
67
|
end
|
@@ -78,25 +75,12 @@ module Rdoctest
|
|
78
75
|
class_name = 'Rdoctest' if class_name.empty?
|
79
76
|
require_filename filename
|
80
77
|
|
81
|
-
test_class = Class.new
|
78
|
+
test_class = Class.new Rdoctest::TestCase do
|
82
79
|
lineno_and_lines.each_pair do |lineno, lines|
|
83
80
|
next unless lines =~ /\S/ # /(?:^|# )=>/
|
84
81
|
lines.gsub! /^ /, ''
|
85
82
|
|
86
|
-
define_method "assert_eval" do |expected, result, filename, lineno|
|
87
|
-
if expected.gsub!(/\.{3,}/, '.*')
|
88
|
-
assertion, expected = 'match', /#{expected}/
|
89
|
-
else
|
90
|
-
assertion = 'equal'
|
91
|
-
end
|
92
|
-
|
93
|
-
instance_eval <<ASSERTION, filename, lineno
|
94
|
-
assert_#{assertion} #{expected.inspect}, #{result.inspect}
|
95
|
-
ASSERTION
|
96
|
-
end
|
97
|
-
|
98
83
|
define_method "test_line_#{lineno}" do
|
99
|
-
assertions = []
|
100
84
|
scanner = StringScanner.new lines
|
101
85
|
|
102
86
|
binding = send :binding
|
@@ -104,13 +88,12 @@ ASSERTION
|
|
104
88
|
code_lineno = lineno + scanner.pre_match.count("\n")
|
105
89
|
expected_lineno = code_lineno + scanner[1].count("\n")
|
106
90
|
|
107
|
-
result = eval scanner[1], binding
|
91
|
+
result = eval scanner[1], binding
|
108
92
|
assert_eval scanner[2].strip, result.inspect, filename,
|
109
93
|
expected_lineno
|
110
94
|
end
|
111
|
-
|
112
95
|
scanner.pos = 0
|
113
|
-
|
96
|
+
|
114
97
|
while scanner.skip_until(@@irb)
|
115
98
|
code_lineno = lineno + scanner.pre_match.count("\n")
|
116
99
|
output_lineno = code_lineno + scanner[2].to_s.count("\n")
|
@@ -125,9 +108,10 @@ ASSERTION
|
|
125
108
|
$stdout, stdout = stdout, $stdout
|
126
109
|
end
|
127
110
|
|
128
|
-
stdout.rewind
|
129
|
-
output
|
130
|
-
|
111
|
+
stdout.rewind and output = stdout.read
|
112
|
+
unless output.empty?
|
113
|
+
assert_eval scanner[2], output, filename, output_lineno
|
114
|
+
end
|
131
115
|
|
132
116
|
if scanner[3]
|
133
117
|
expected = scanner[3].sub(/^=> /, '').strip
|
@@ -144,9 +128,9 @@ ASSERTION
|
|
144
128
|
end
|
145
129
|
|
146
130
|
def require_filename filename
|
147
|
-
|
131
|
+
return if options[:force] || filename == '-'
|
132
|
+
load_path = options[:load_path].join '|'
|
133
|
+
require filename.gsub(%r{^(?:#{load_path})/|.rb$}, '')
|
148
134
|
end
|
149
135
|
end
|
150
136
|
end
|
151
|
-
|
152
|
-
Rdoctest::Runner.new.run
|
data/lib/rdoctest/task.rb
CHANGED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
|
3
|
+
module Rdoctest
|
4
|
+
class TestCase < Test::Unit::TestCase
|
5
|
+
private
|
6
|
+
|
7
|
+
def assert_eval expected, result, filename, lineno
|
8
|
+
if expected.gsub!(/\.{3,}/, '.*')
|
9
|
+
assertion, expected = 'match', /#{expected}/
|
10
|
+
else
|
11
|
+
assertion = 'equal'
|
12
|
+
end
|
13
|
+
|
14
|
+
instance_eval <<ASSERTION, filename, lineno
|
15
|
+
assert_#{assertion} #{expected.inspect}, #{result.inspect}
|
16
|
+
ASSERTION
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/rdoctest/version.rb
CHANGED
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: 0.0.
|
8
|
+
- 2
|
9
|
+
version: 0.0.2
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Stephen Celis
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-12-
|
17
|
+
date: 2010-12-08 00:00:00 -06:00
|
18
18
|
default_executable: rdoctest
|
19
19
|
dependencies: []
|
20
20
|
|
@@ -31,6 +31,7 @@ files:
|
|
31
31
|
- Rakefile
|
32
32
|
- lib/rdoctest/runner.rb
|
33
33
|
- lib/rdoctest/task.rb
|
34
|
+
- lib/rdoctest/test_case.rb
|
34
35
|
- lib/rdoctest/version.rb
|
35
36
|
- lib/rdoctest.rb
|
36
37
|
- bin/rdoctest
|