docspec 0.0.3 → 0.0.4
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 +31 -10
- data/bin/docspec +5 -2
- data/lib/docspec/document.rb +12 -2
- data/lib/docspec/example.rb +22 -12
- data/lib/docspec/testable.rb +4 -29
- data/lib/docspec/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3084cbb5bf7c1a0d99ec73d0e3a505b0690d44f28a5ec8e8cdcd8b74ab325bdf
|
4
|
+
data.tar.gz: 4f3dc9b69fb2ed4a0a32d52f4aeb2e25f3245c0734fa78362fd0f97279369884
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ce61cf2c337223fcbaff45694209c9259922f3148f06dac163e647a8ac559fb597dc48096cc9c6c6f789491aca35087cf676b37af1d7f317e87720d2c761296a
|
7
|
+
data.tar.gz: 1044d67ab45478ca2e3bbe632bbc220e475a99b1269278f9364c2e4acd4183b59cd7a53e87fdfc86bdd1b6df94eae522b72e6fa96d54e8d052096d472dbc602a
|
data/README.md
CHANGED
@@ -26,8 +26,8 @@ test.
|
|
26
26
|
Code snippets should be enclosed in a `ruby` or `shell` code fence:
|
27
27
|
|
28
28
|
```ruby
|
29
|
-
|
30
|
-
#=>
|
29
|
+
puts "code to test (should output something)"
|
30
|
+
#=> code to test (should output something)
|
31
31
|
```
|
32
32
|
|
33
33
|
This document itself serves as the test suite for this gem, so you can take a
|
@@ -75,8 +75,8 @@ string of that exception:
|
|
75
75
|
|
76
76
|
```ruby
|
77
77
|
# Exceptions are captured
|
78
|
-
|
79
|
-
#=> #<
|
78
|
+
puts "hello".camel_case
|
79
|
+
#=> #<NoMethodError: undefined method `camel_case' for "hello":String>
|
80
80
|
```
|
81
81
|
|
82
82
|
Your code and expected output can contain multiple lines of code:
|
@@ -103,6 +103,13 @@ puts 2 - 3
|
|
103
103
|
#=> -1
|
104
104
|
```
|
105
105
|
|
106
|
+
or have the expected output in the same line as its code:
|
107
|
+
|
108
|
+
```ruby
|
109
|
+
puts 2 * 3 #=> 6
|
110
|
+
puts 'works' #=> works
|
111
|
+
```
|
112
|
+
|
106
113
|
The first line of the example may contain specially formatted flags. Flags
|
107
114
|
are always formatted like this: `[:flag_name]`.
|
108
115
|
|
@@ -128,27 +135,29 @@ this will not be executed
|
|
128
135
|
|
129
136
|
Sometimes it is useful to build the example over several different code
|
130
137
|
blocks. To help achieve this, docspec will treat any example that does not
|
131
|
-
output
|
132
|
-
examples:
|
138
|
+
expect any output (no `#=> markers`) as a code that needs to be executed
|
139
|
+
before all subsequent examples:
|
133
140
|
|
134
141
|
```ruby
|
135
|
-
# Define
|
142
|
+
# Define functions or variables for later use
|
136
143
|
def create_caption(text)
|
137
144
|
[text.upcase, ("=" * text.length)].join "\n"
|
138
145
|
end
|
146
|
+
|
147
|
+
message = 'tada!'
|
139
148
|
```
|
140
149
|
|
141
150
|
All the examples below this line, will have the above function available:
|
142
151
|
|
143
152
|
```ruby
|
144
|
-
# Use a previously defined function
|
145
|
-
puts create_caption
|
153
|
+
# Use a previously defined function or variable
|
154
|
+
puts create_caption message
|
146
155
|
#=> TADA!
|
147
156
|
#=> =====
|
148
157
|
```
|
149
158
|
|
150
159
|
|
151
|
-
|
160
|
+
Examples marked with a `shell` code fence will be executed by the
|
152
161
|
shell, and not by ruby:
|
153
162
|
|
154
163
|
```shell
|
@@ -157,4 +166,16 @@ echo hello world
|
|
157
166
|
#=> hello world
|
158
167
|
```
|
159
168
|
|
169
|
+
and they also support chaining of examples:
|
170
|
+
|
171
|
+
```shell
|
172
|
+
# Prepend shell example to all subsequent shell examples
|
173
|
+
# (since this example does not define an expected output)
|
174
|
+
SOME_ENV_VAR=yes
|
175
|
+
```
|
176
|
+
|
177
|
+
```shell
|
178
|
+
echo $SOME_ENV_VAR
|
179
|
+
#=> yes
|
180
|
+
```
|
160
181
|
|
data/bin/docspec
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
require 'simplecov'
|
3
|
+
SimpleCov.configure do
|
4
|
+
command_name 'Docspec'
|
5
|
+
end
|
3
6
|
SimpleCov.start
|
4
7
|
|
5
8
|
require 'docspec'
|
@@ -14,10 +17,10 @@ document.test
|
|
14
17
|
say ''
|
15
18
|
|
16
19
|
if document.success?
|
17
|
-
say "!txtgrn!#{document.
|
20
|
+
say "!txtgrn!#{document.examples.count} tests, #{document.failed_examples.count} failed\n"
|
18
21
|
exit 0
|
19
22
|
else
|
20
|
-
say "!txtred!#{document.
|
23
|
+
say "!txtred!#{document.examples.count} tests, #{document.failed_examples.count} failed\n"
|
21
24
|
exit 1
|
22
25
|
end
|
23
26
|
|
data/lib/docspec/document.rb
CHANGED
@@ -15,13 +15,23 @@ module Docspec
|
|
15
15
|
@examples ||= examples!
|
16
16
|
end
|
17
17
|
|
18
|
+
def before
|
19
|
+
@before ||= {}
|
20
|
+
end
|
21
|
+
|
18
22
|
protected
|
19
23
|
|
20
24
|
def examples!
|
21
25
|
result = []
|
22
26
|
markdown.scan(/```(ruby|shell)\s*\n(.*?)```/m) do |type, code|
|
23
|
-
example = Example.new(code, type)
|
24
|
-
|
27
|
+
example = Example.new(type: type, code: code, before: before[type])
|
28
|
+
|
29
|
+
next if example.skip?
|
30
|
+
|
31
|
+
before[type] ||= []
|
32
|
+
before[type] << example.code if example.empty?
|
33
|
+
|
34
|
+
result << example
|
25
35
|
end
|
26
36
|
result
|
27
37
|
end
|
data/lib/docspec/example.rb
CHANGED
@@ -3,29 +3,36 @@ require 'diffy'
|
|
3
3
|
module Docspec
|
4
4
|
class Example
|
5
5
|
include OutputCapturer
|
6
|
-
attr_reader :code, :type, :
|
6
|
+
attr_reader :code, :type, :before
|
7
7
|
|
8
|
-
def initialize(code
|
9
|
-
@code, @type = code, type
|
10
|
-
@full_code = @code
|
8
|
+
def initialize(type:, code:, before: nil)
|
9
|
+
@code, @type, @before = code, type, before
|
11
10
|
end
|
12
11
|
|
13
12
|
def actual
|
14
13
|
@actual ||= actual!
|
15
14
|
end
|
16
15
|
|
16
|
+
def consider_failed?
|
17
|
+
failed? and !ignore_failure?
|
18
|
+
end
|
19
|
+
|
17
20
|
def diff
|
18
21
|
@diff ||= Diffy::Diff.new("#{expected}\n", "#{actual}\n", context: 2).to_s :color
|
19
22
|
end
|
20
23
|
|
21
24
|
def empty?
|
22
|
-
|
25
|
+
expected.empty?
|
23
26
|
end
|
24
27
|
|
25
28
|
def expected
|
26
29
|
@expected ||= code.scan(/#=>\s*(.*)/).map { |match| match.first.strip }.join "\n"
|
27
30
|
end
|
28
31
|
|
32
|
+
def failed?
|
33
|
+
!success?
|
34
|
+
end
|
35
|
+
|
29
36
|
def first_line
|
30
37
|
@first_line ||= code.split("\n").first
|
31
38
|
end
|
@@ -34,6 +41,10 @@ module Docspec
|
|
34
41
|
@flags ||= first_line.scan(/\[:(.+?)\]/).map { |f| f.first.to_sym }
|
35
42
|
end
|
36
43
|
|
44
|
+
def full_code
|
45
|
+
@full_code ||= full_code!
|
46
|
+
end
|
47
|
+
|
37
48
|
def ignore_failure?
|
38
49
|
flags.include? :ignore_failure
|
39
50
|
end
|
@@ -42,12 +53,6 @@ module Docspec
|
|
42
53
|
@label ||= label!
|
43
54
|
end
|
44
55
|
|
45
|
-
def prepend(codes)
|
46
|
-
codes = [codes] unless codes.is_a? Array
|
47
|
-
codes = codes.join "\n\n"
|
48
|
-
@full_code = "#{codes}\n#{@full_code}"
|
49
|
-
end
|
50
|
-
|
51
56
|
def skip?
|
52
57
|
flags.include? :skip
|
53
58
|
end
|
@@ -64,11 +69,16 @@ module Docspec
|
|
64
69
|
when 'ruby'
|
65
70
|
eval full_code
|
66
71
|
when 'shell'
|
67
|
-
puts `#{
|
72
|
+
puts `#{full_code}`
|
68
73
|
end
|
69
74
|
end.strip
|
70
75
|
end
|
71
76
|
|
77
|
+
def full_code!
|
78
|
+
return code unless before
|
79
|
+
[before.join("\n\n"), code].join "\n"
|
80
|
+
end
|
81
|
+
|
72
82
|
def label!
|
73
83
|
first_line.gsub(/^#\s*/, '').strip
|
74
84
|
end
|
data/lib/docspec/testable.rb
CHANGED
@@ -3,34 +3,17 @@ require 'colsole'
|
|
3
3
|
module Docspec
|
4
4
|
module Testable
|
5
5
|
include Colsole
|
6
|
-
attr_reader :failed_examples, :total_examples
|
7
|
-
|
8
|
-
def before_codes
|
9
|
-
@before_codes ||= []
|
10
|
-
end
|
11
6
|
|
12
7
|
def success?
|
13
|
-
failed_examples == 0
|
8
|
+
failed_examples.count == 0
|
14
9
|
end
|
15
10
|
|
16
|
-
def
|
17
|
-
|
18
|
-
|
19
|
-
examples.each do |example|
|
20
|
-
if example.empty?
|
21
|
-
before_codes << example.code
|
22
|
-
else
|
23
|
-
@total_examples += 1
|
24
|
-
example.prepend before_codes
|
25
|
-
@failed_examples += 1 unless example.success? or example.ignore_failure?
|
26
|
-
end
|
27
|
-
|
28
|
-
yield example
|
29
|
-
end
|
11
|
+
def failed_examples
|
12
|
+
@failed_examples ||= examples.select(&:consider_failed?)
|
30
13
|
end
|
31
14
|
|
32
15
|
def test
|
33
|
-
|
16
|
+
examples.each do |example|
|
34
17
|
if example.empty?
|
35
18
|
say "!txtpur!void :!txtrst! #{example.label}"
|
36
19
|
elsif example.success?
|
@@ -44,14 +27,6 @@ module Docspec
|
|
44
27
|
end
|
45
28
|
end
|
46
29
|
|
47
|
-
protected
|
48
|
-
|
49
|
-
def reset_counters
|
50
|
-
@before_codes = nil
|
51
|
-
@failed_examples = 0
|
52
|
-
@total_examples = 0
|
53
|
-
end
|
54
|
-
|
55
30
|
end
|
56
31
|
end
|
57
32
|
|
data/lib/docspec/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: docspec
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Danny Ben Shitrit
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-10-
|
11
|
+
date: 2019-10-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: colsole
|