yard-doctest 0.1.1 → 0.1.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.
- checksums.yaml +4 -4
- data/README.md +47 -13
- data/features/yard-doctest.feature +78 -27
- data/lib/yard-doctest.rb +70 -29
- data/lib/yard/doctest/example.rb +32 -15
- data/lib/yard/doctest/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ca18f61aa4d2ab189d9e0edb48011a7423bf7a3c
|
4
|
+
data.tar.gz: 0a84c6dd74503b1abcfe4b5b494725f6af6800ec
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3ff564c3d96544f560d361c385330967844c19d7de10bca805673261b3f36ceb48dcf29b57e24efe83533ff1e360d9da15a4dd61967316ef13a42accdfa14d61
|
7
|
+
data.tar.gz: 63d7ab908736488e14cd50ecbdde1c272d8f25399b00b5b3d340afbe6b3ccc1c65d01ff1bd64542f311e6eb195b261f2e8eeb89b2f773efd2d4a4ffa06421e02
|
data/README.md
CHANGED
@@ -98,11 +98,11 @@ $ bundle exec yard config -a autoload_plugins yard-doctest
|
|
98
98
|
Next, you'll need to create test helper, which will be required before each of your test. Think about it as `spec_helper.rb` in RSpec or `env.rb` in Cucumber. You should require everything necessary for your examples to run there.
|
99
99
|
|
100
100
|
```bash
|
101
|
-
$ touch
|
101
|
+
$ touch doctest_helper.rb
|
102
102
|
```
|
103
103
|
|
104
104
|
```ruby
|
105
|
-
#
|
105
|
+
# doctest_helper.rb
|
106
106
|
require 'lib/cat'
|
107
107
|
require 'lib/dog'
|
108
108
|
```
|
@@ -195,6 +195,8 @@ It is actually delegated to amazing [minitest](https://github.com/seattlerb/mini
|
|
195
195
|
|
196
196
|
## Advanced usage
|
197
197
|
|
198
|
+
### Test helper
|
199
|
+
|
198
200
|
You can define any methods and instance variables in test helper and they will be available in examples.
|
199
201
|
|
200
202
|
For example, if we change the examples for `Cat#can_hunt_dogs?` like that:
|
@@ -224,7 +226,7 @@ NameError: undefined local variable or method `cat' for Object:Class
|
|
224
226
|
If you don't want to create new instance of class each time (or include module if you're testing it), you can fix this by defining a method in test helper:
|
225
227
|
|
226
228
|
```ruby
|
227
|
-
#
|
229
|
+
# doctest_helper.rb
|
228
230
|
require 'lib/cat'
|
229
231
|
require 'lib/dog'
|
230
232
|
|
@@ -233,26 +235,58 @@ def cat
|
|
233
235
|
end
|
234
236
|
```
|
235
237
|
|
238
|
+
### Hooks
|
239
|
+
|
236
240
|
In case you need to do some preparations/cleanup between tests, hooks are at your service to be defined in test helper:
|
237
241
|
|
238
242
|
```ruby
|
239
|
-
YARD::Doctest.
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
+
YARD::Doctest.configure do |doctest|
|
244
|
+
doctest.before do
|
245
|
+
# this is called before each example and
|
246
|
+
# evaluated in the same context as example
|
247
|
+
# (i.e. has access to the same instance variables)
|
248
|
+
end
|
249
|
+
|
250
|
+
doctest.after do
|
251
|
+
# same as `before`, but runs after each example
|
252
|
+
end
|
253
|
+
|
254
|
+
doctest.after_run do
|
255
|
+
# runs after all the examples and
|
256
|
+
# has different context
|
257
|
+
# (i.e. no access to instance variables)
|
258
|
+
end
|
243
259
|
end
|
260
|
+
```
|
261
|
+
|
262
|
+
There is also a way to limit hooks to specific tests based on class/method name:
|
244
263
|
|
245
|
-
|
246
|
-
|
264
|
+
```ruby
|
265
|
+
YARD::Doctest.configure do |doctest|
|
266
|
+
doctest.before('MyClass') do
|
267
|
+
# this will only be called for doctests of `MyClass` class
|
268
|
+
# and all its methods (i.e. `MyClass.foo`, `MyClass#bar`)
|
269
|
+
end
|
270
|
+
|
271
|
+
doctest.after('MyClass#foo') do
|
272
|
+
# this will only be called for doctests of `MyClass#foo`
|
273
|
+
end
|
247
274
|
end
|
275
|
+
```
|
248
276
|
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
277
|
+
### Skip
|
278
|
+
|
279
|
+
You can skip running some of the tests:
|
280
|
+
|
281
|
+
```ruby
|
282
|
+
YARD::Doctest.configure do |doctest|
|
283
|
+
doctest.skip 'MyClass' # will skip doctests for `MyClass` and all its methods
|
284
|
+
doctest.skip 'MyClass#foo' # will skip doctests for `MyClass#foo`
|
253
285
|
end
|
254
286
|
```
|
255
287
|
|
288
|
+
### Rake
|
289
|
+
|
256
290
|
There is also a Rake task for you:
|
257
291
|
|
258
292
|
```ruby
|
@@ -11,7 +11,7 @@ Feature: yard doctest
|
|
11
11
|
Then the output should contain "doctest Doctests from @example tags"
|
12
12
|
|
13
13
|
Scenario: looks for files in app/lib directories by default
|
14
|
-
Given a file named "
|
14
|
+
Given a file named "doctest_helper.rb" with:
|
15
15
|
"""
|
16
16
|
require 'app/app'
|
17
17
|
require 'lib/lib'
|
@@ -36,7 +36,7 @@ Feature: yard doctest
|
|
36
36
|
Then the output should contain "2 runs, 2 assertions, 0 failures, 0 errors, 0 skips"
|
37
37
|
|
38
38
|
Scenario Outline: looks for files only in passed glob
|
39
|
-
Given a file named "
|
39
|
+
Given a file named "doctest_helper.rb" with:
|
40
40
|
"""
|
41
41
|
require 'app/app'
|
42
42
|
require 'lib/lib'
|
@@ -68,7 +68,7 @@ Feature: yard doctest
|
|
68
68
|
| app/app.rb |
|
69
69
|
|
70
70
|
Scenario: generates test names from unit name
|
71
|
-
Given a file named "
|
71
|
+
Given a file named "doctest_helper.rb" with:
|
72
72
|
"""
|
73
73
|
require 'app/app'
|
74
74
|
"""
|
@@ -109,7 +109,7 @@ Feature: yard doctest
|
|
109
109
|
And the output should contain "B#div"
|
110
110
|
|
111
111
|
Scenario: asserts using equality
|
112
|
-
Given a file named "
|
112
|
+
Given a file named "doctest_helper.rb" with:
|
113
113
|
"""
|
114
114
|
require 'app/app'
|
115
115
|
"""
|
@@ -129,7 +129,7 @@ Feature: yard doctest
|
|
129
129
|
"""
|
130
130
|
|
131
131
|
Scenario Outline: properly handles different return values
|
132
|
-
Given a file named "
|
132
|
+
Given a file named "doctest_helper.rb" with:
|
133
133
|
"""
|
134
134
|
require 'app/app'
|
135
135
|
"""
|
@@ -159,7 +159,7 @@ Feature: yard doctest
|
|
159
159
|
| 1.0 |
|
160
160
|
|
161
161
|
Scenario: handles multiple @example tags
|
162
|
-
Given a file named "
|
162
|
+
Given a file named "doctest_helper.rb" with:
|
163
163
|
"""
|
164
164
|
require 'app/app'
|
165
165
|
"""
|
@@ -177,7 +177,7 @@ Feature: yard doctest
|
|
177
177
|
Then the output should contain "2 runs, 2 assertions, 0 failures, 0 errors, 0 skips"
|
178
178
|
|
179
179
|
Scenario: handles multiple return comments
|
180
|
-
Given a file named "
|
180
|
+
Given a file named "doctest_helper.rb" with:
|
181
181
|
"""
|
182
182
|
require 'app/app'
|
183
183
|
"""
|
@@ -195,7 +195,7 @@ Feature: yard doctest
|
|
195
195
|
Then the output should contain "1 runs, 2 assertions, 0 failures, 0 errors, 0 skips"
|
196
196
|
|
197
197
|
Scenario: runs @example tags without return comment
|
198
|
-
Given a file named "
|
198
|
+
Given a file named "doctest_helper.rb" with:
|
199
199
|
"""
|
200
200
|
require 'app/app'
|
201
201
|
"""
|
@@ -211,7 +211,7 @@ Feature: yard doctest
|
|
211
211
|
Then the output should contain "1 runs, 0 assertions, 0 failures, 0 errors, 0 skips"
|
212
212
|
|
213
213
|
Scenario: handles `# =>` return comment
|
214
|
-
Given a file named "
|
214
|
+
Given a file named "doctest_helper.rb" with:
|
215
215
|
"""
|
216
216
|
require 'app/app'
|
217
217
|
"""
|
@@ -227,7 +227,7 @@ Feature: yard doctest
|
|
227
227
|
Then the output should contain "1 runs, 1 assertions, 0 failures, 0 errors, 0 skips"
|
228
228
|
|
229
229
|
Scenario: handles return comment on newline
|
230
|
-
Given a file named "
|
230
|
+
Given a file named "doctest_helper.rb" with:
|
231
231
|
"""
|
232
232
|
require 'app/app'
|
233
233
|
"""
|
@@ -244,7 +244,7 @@ Feature: yard doctest
|
|
244
244
|
Then the output should contain "1 runs, 1 assertions, 0 failures, 0 errors, 0 skips"
|
245
245
|
|
246
246
|
Scenario: handles multiple lines
|
247
|
-
Given a file named "
|
247
|
+
Given a file named "doctest_helper.rb" with:
|
248
248
|
"""
|
249
249
|
require 'app/app'
|
250
250
|
"""
|
@@ -263,7 +263,7 @@ Feature: yard doctest
|
|
263
263
|
Then the output should contain "1 runs, 1 assertions, 0 failures, 0 errors, 0 skips"
|
264
264
|
|
265
265
|
Scenario: names test with example title when it's present
|
266
|
-
Given a file named "
|
266
|
+
Given a file named "doctest_helper.rb" with:
|
267
267
|
"""
|
268
268
|
require 'app/app'
|
269
269
|
"""
|
@@ -279,7 +279,7 @@ Feature: yard doctest
|
|
279
279
|
Then the output should contain "#sum#test_0001_sums two numbers"
|
280
280
|
|
281
281
|
Scenario: doesn't name test when title is not present
|
282
|
-
Given a file named "
|
282
|
+
Given a file named "doctest_helper.rb" with:
|
283
283
|
"""
|
284
284
|
require 'app/app'
|
285
285
|
"""
|
@@ -295,7 +295,7 @@ Feature: yard doctest
|
|
295
295
|
Then the output should contain "#sum#test_0001_"
|
296
296
|
|
297
297
|
Scenario: adds unit definition to backtrace on failures
|
298
|
-
Given a file named "
|
298
|
+
Given a file named "doctest_helper.rb" with:
|
299
299
|
"""
|
300
300
|
require 'app/app'
|
301
301
|
"""
|
@@ -311,7 +311,7 @@ Feature: yard doctest
|
|
311
311
|
Then the output should contain "app/app.rb:3"
|
312
312
|
|
313
313
|
Scenario: has rake task to run the tests
|
314
|
-
Given a file named "
|
314
|
+
Given a file named "doctest_helper.rb" with:
|
315
315
|
"""
|
316
316
|
require 'app/app'
|
317
317
|
"""
|
@@ -335,7 +335,7 @@ Feature: yard doctest
|
|
335
335
|
Then the output should contain "1 runs, 1 assertions, 0 failures, 0 errors, 0 skips"
|
336
336
|
|
337
337
|
Scenario: requires doctest helper
|
338
|
-
Given a file named "
|
338
|
+
Given a file named "doctest_helper.rb" with:
|
339
339
|
"""
|
340
340
|
require 'app/app'
|
341
341
|
|
@@ -359,7 +359,7 @@ Feature: yard doctest
|
|
359
359
|
Then the output should contain "1 runs, 1 assertions, 0 failures, 0 errors, 0 skips"
|
360
360
|
|
361
361
|
Scenario: shares binding between asserts
|
362
|
-
Given a file named "
|
362
|
+
Given a file named "doctest_helper.rb" with:
|
363
363
|
"""
|
364
364
|
require 'app/app'
|
365
365
|
"""
|
@@ -378,7 +378,7 @@ Feature: yard doctest
|
|
378
378
|
Then the output should contain "1 runs, 2 assertions, 0 failures, 0 errors, 0 skips"
|
379
379
|
|
380
380
|
Scenario: does not share binding between examples
|
381
|
-
Given a file named "
|
381
|
+
Given a file named "doctest_helper.rb" with:
|
382
382
|
"""
|
383
383
|
require 'app/app'
|
384
384
|
"""
|
@@ -397,23 +397,67 @@ Feature: yard doctest
|
|
397
397
|
When I run `bundle exec yard doctest`
|
398
398
|
Then the output should contain "NameError: undefined local variable or method `a'"
|
399
399
|
|
400
|
-
Scenario: supports hooks
|
401
|
-
Given a file named "
|
400
|
+
Scenario: supports global hooks
|
401
|
+
Given a file named "doctest_helper.rb" with:
|
402
402
|
"""
|
403
403
|
require 'app/app'
|
404
404
|
|
405
|
-
@flag =
|
405
|
+
YARD::Doctest.before { @flag = false }
|
406
|
+
YARD::Doctest.after { @flag = true }
|
407
|
+
YARD::Doctest.after_run { puts 'Run after all by minitest' }
|
408
|
+
"""
|
409
|
+
And a file named "app/app.rb" with:
|
410
|
+
"""
|
411
|
+
# @example
|
412
|
+
# flag #=> false
|
413
|
+
def flag
|
414
|
+
@flag
|
415
|
+
end
|
416
|
+
"""
|
417
|
+
When I run `bundle exec yard doctest`
|
418
|
+
Then the output should contain "1 runs, 1 assertions, 0 failures, 0 errors, 0 skips"
|
419
|
+
And the output should contain "Run after all by minitest"
|
420
|
+
|
421
|
+
Scenario: supports test-name hooks
|
422
|
+
Given a file named "doctest_helper.rb" with:
|
423
|
+
"""
|
424
|
+
require 'app/app'
|
406
425
|
|
407
426
|
YARD::Doctest.before do
|
427
|
+
@flag = true
|
428
|
+
@foo = true
|
429
|
+
end
|
430
|
+
|
431
|
+
YARD::Doctest.before('#flag') do
|
408
432
|
@flag = false
|
433
|
+
@foo = false
|
434
|
+
end
|
435
|
+
"""
|
436
|
+
And a file named "app/app.rb" with:
|
437
|
+
"""
|
438
|
+
# @example
|
439
|
+
# flag #=> false
|
440
|
+
def flag
|
441
|
+
@flag && @foo
|
409
442
|
end
|
410
443
|
|
411
|
-
|
412
|
-
|
444
|
+
# @example
|
445
|
+
# foo #=> true
|
446
|
+
def foo
|
447
|
+
@foo && @flag
|
413
448
|
end
|
449
|
+
"""
|
450
|
+
When I run `bundle exec yard doctest`
|
451
|
+
Then the output should contain "2 runs, 2 assertions, 0 failures, 0 errors, 0 skips"
|
414
452
|
|
415
|
-
|
416
|
-
|
453
|
+
Scenario: can skip tests
|
454
|
+
Given a file named "doctest_helper.rb" with:
|
455
|
+
"""
|
456
|
+
require 'app/app'
|
457
|
+
|
458
|
+
YARD::Doctest.configure do |doctest|
|
459
|
+
doctest.skip '#flag'
|
460
|
+
doctest.skip 'A.foo'
|
417
461
|
end
|
418
462
|
"""
|
419
463
|
And a file named "app/app.rb" with:
|
@@ -423,7 +467,14 @@ Feature: yard doctest
|
|
423
467
|
def flag
|
424
468
|
@flag
|
425
469
|
end
|
470
|
+
|
471
|
+
class A
|
472
|
+
# @example
|
473
|
+
# A.foo => true
|
474
|
+
def self.foo
|
475
|
+
true
|
476
|
+
end
|
477
|
+
end
|
426
478
|
"""
|
427
479
|
When I run `bundle exec yard doctest`
|
428
|
-
Then the output should contain "
|
429
|
-
And the output should contain "Run after all by minitest"
|
480
|
+
Then the output should contain "0 runs, 0 assertions, 0 failures, 0 errors, 0 skips"
|
data/lib/yard-doctest.rb
CHANGED
@@ -9,38 +9,79 @@ require 'yard/doctest/version'
|
|
9
9
|
|
10
10
|
module YARD
|
11
11
|
module Doctest
|
12
|
+
extend self
|
12
13
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
block_given? ? @before = blk : @before
|
22
|
-
end
|
14
|
+
#
|
15
|
+
# Configures YARD doctest.
|
16
|
+
#
|
17
|
+
# @yield [self]
|
18
|
+
#
|
19
|
+
def configure
|
20
|
+
yield self
|
21
|
+
end
|
23
22
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
23
|
+
#
|
24
|
+
# Passed block called before each example
|
25
|
+
# or specific tests based on passed name.
|
26
|
+
#
|
27
|
+
# It is evaluated in the same context as example.
|
28
|
+
#
|
29
|
+
# @param [String] test
|
30
|
+
# @param [Proc] blk
|
31
|
+
#
|
32
|
+
def before(test = nil, &blk)
|
33
|
+
hooks[:before] << {test: test, block: blk} if block_given?
|
34
|
+
end
|
35
|
+
|
36
|
+
#
|
37
|
+
# Passed block called after each example
|
38
|
+
# or specific tests based on passed name.
|
39
|
+
#
|
40
|
+
# It is evaluated in the same context as example.
|
41
|
+
#
|
42
|
+
# @param [String] test
|
43
|
+
# @param [Proc] blk
|
44
|
+
#
|
45
|
+
def after(test = nil, &blk)
|
46
|
+
hooks[:after] << {test: test, block: blk} if block_given?
|
47
|
+
end
|
48
|
+
|
49
|
+
#
|
50
|
+
# Passed block called after all examples and
|
51
|
+
# evaluated in the different context from examples.
|
52
|
+
#
|
53
|
+
# It actually just sends block to `Minitest.after_run`.
|
54
|
+
#
|
55
|
+
# @param [Proc] blk
|
56
|
+
#
|
57
|
+
def after_run(&blk)
|
58
|
+
Minitest.after_run &blk
|
59
|
+
end
|
60
|
+
|
61
|
+
#
|
62
|
+
# Adds definition of test to be skipped.
|
63
|
+
#
|
64
|
+
# @param [Array<String>] test
|
65
|
+
#
|
66
|
+
def skip(test)
|
67
|
+
skips << test
|
68
|
+
end
|
69
|
+
|
70
|
+
#
|
71
|
+
# Array of tests to be skipped.
|
72
|
+
# @api private
|
73
|
+
#
|
74
|
+
def skips
|
75
|
+
@skips ||= []
|
76
|
+
end
|
33
77
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
#
|
42
|
-
def after_run(&blk)
|
43
|
-
Minitest.after_run &blk
|
78
|
+
#
|
79
|
+
# Returns hash with arrays of before/after hooks.
|
80
|
+
# @api private
|
81
|
+
#
|
82
|
+
def hooks
|
83
|
+
@hooks ||= {}.tap do |hash|
|
84
|
+
hash[:before], hash[:after] = [], []
|
44
85
|
end
|
45
86
|
end
|
46
87
|
|
data/lib/yard/doctest/example.rb
CHANGED
@@ -21,23 +21,24 @@ module YARD
|
|
21
21
|
|
22
22
|
Class.new(this.class).class_eval do
|
23
23
|
require 'minitest/autorun'
|
24
|
-
require '
|
24
|
+
require 'doctest_helper'
|
25
25
|
|
26
|
-
|
27
|
-
|
28
|
-
|
26
|
+
unless YARD::Doctest.skips.any? { |skip| this.definition.include?(skip) }
|
27
|
+
describe this.definition do
|
28
|
+
register_hooks(this.definition, YARD::Doctest.hooks)
|
29
29
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
30
|
+
it this.name do
|
31
|
+
this.asserts.each do |assert|
|
32
|
+
expected, actual = assert[:expected], assert[:actual]
|
33
|
+
actual = context.eval(actual)
|
34
34
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
35
|
+
unless expected.empty?
|
36
|
+
begin
|
37
|
+
assert_equal evaluate(expected), actual
|
38
|
+
rescue Minitest::Assertion => error
|
39
|
+
add_filepath_to_backtrace(error, this.filepath)
|
40
|
+
raise error
|
41
|
+
end
|
41
42
|
end
|
42
43
|
end
|
43
44
|
end
|
@@ -59,12 +60,28 @@ module YARD
|
|
59
60
|
|
60
61
|
def add_filepath_to_backtrace(exception, filepath)
|
61
62
|
backtrace = exception.backtrace
|
62
|
-
line = backtrace.find { |
|
63
|
+
line = backtrace.find { |l| l =~ %r(lib/yard/doctest/example) }
|
63
64
|
index = backtrace.index(line)
|
64
65
|
backtrace = backtrace.insert(index, filepath)
|
65
66
|
exception.set_backtrace backtrace
|
66
67
|
end
|
67
68
|
|
69
|
+
def self.register_hooks(definition, all_hooks)
|
70
|
+
all_hooks.each do |type, hooks|
|
71
|
+
hooks.each do |hook|
|
72
|
+
if hook[:test]
|
73
|
+
# test-name hooks
|
74
|
+
if definition.include?(hook[:test])
|
75
|
+
send(type) { evaluate(hook[:block]) }
|
76
|
+
end
|
77
|
+
else
|
78
|
+
# global hooks
|
79
|
+
send(type) { evaluate(hook[:block]) }
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
68
85
|
end # Example
|
69
86
|
end # Doctest
|
70
87
|
end # YARD
|
data/lib/yard/doctest/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: yard-doctest
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alex Rodionov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-07-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: yard
|