specdown 0.3.0 → 0.4.0.beta.1
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/CHANGELOG.markdown +7 -0
- data/README.markdown +84 -8
- data/VERSION +1 -1
- data/features/command.feature +3 -1
- data/features/config.feature +3 -3
- data/features/fixtures/codeblocks_and_implicits.markdown +7 -0
- data/features/implicit_parser.feature +113 -0
- data/features/implicit_specs.feature +135 -0
- data/features/parser.feature +69 -1
- data/features/pending_specs.feature +49 -0
- data/features/report_summary.feature +1 -1
- data/features/specdown_examples/complete_implicit/specdown/implicit.specdown +4 -0
- data/features/specdown_examples/complete_implicit/specdown/test.markdown +3 -0
- data/features/specdown_examples/no_implicit/specdown/test.markdown +3 -0
- data/features/specdown_examples/pending_implicit/specdown/implicit.specdown +4 -0
- data/features/specdown_examples/pending_implicit/specdown/test.markdown +3 -0
- data/features/specdown_examples/pending_specs/specdown/test.markdown +7 -0
- data/features/step_definitions/command.rb +7 -3
- data/features/step_definitions/implicit_parser.rb +19 -0
- data/features/step_definitions/implicit_specs.rb +18 -0
- data/features/step_definitions/parser.rb +24 -0
- data/features/step_definitions/pending_specs.rb +7 -0
- data/features/support/env.rb +6 -0
- data/lib/specdown.rb +6 -0
- data/lib/specdown/config.rb +12 -1
- data/lib/specdown/event_handlers/test_pending.rb +3 -0
- data/lib/specdown/event_handlers/test_undefined.rb +3 -0
- data/lib/specdown/implicit_parser.rb +47 -0
- data/lib/specdown/node.rb +2 -1
- data/lib/specdown/parser.rb +40 -6
- data/lib/specdown/pending.rb +7 -0
- data/lib/specdown/pending_exception.rb +4 -0
- data/lib/specdown/reporter.rb +8 -0
- data/lib/specdown/reporters/color_terminal_reporter.rb +12 -0
- data/lib/specdown/reporters/terminal_reporter.rb +16 -0
- data/lib/specdown/reporters/text_reporter.rb +8 -0
- data/lib/specdown/runner.rb +25 -16
- data/lib/specdown/runner/report_summary.rb +8 -0
- data/lib/specdown/runner/stats.rb +13 -2
- data/lib/specdown/sandbox_decorators/pending.rb +3 -0
- data/lib/specdown/templates/color_summary.erb +20 -4
- data/lib/specdown/templates/summary.erb +17 -0
- metadata +45 -9
data/CHANGELOG.markdown
CHANGED
@@ -1,5 +1,12 @@
|
|
1
1
|
## CHANGELOG
|
2
2
|
|
3
|
+
## 0.4.0.beta.1
|
4
|
+
|
5
|
+
First beta release with implicit specs support. See the "Implicit Specs"
|
6
|
+
section in the README for details!
|
7
|
+
|
8
|
+
Also, output format now defaults to "condensed".
|
9
|
+
|
3
10
|
## 0.3.0
|
4
11
|
|
5
12
|
NOTICE: Non-backwards compatible release.
|
data/README.markdown
CHANGED
@@ -166,10 +166,15 @@ raise "WTF?" unless 1 == 1
|
|
166
166
|
raise "name in scope" if defined? name
|
167
167
|
```
|
168
168
|
|
169
|
-
## Non-
|
169
|
+
## Non-executable code blocks
|
170
170
|
|
171
|
-
|
172
|
-
|
171
|
+
As of version `0.3.0`, you must surround any codeblocks you
|
172
|
+
want specdown to execute with a github-flavored backtick fence. This
|
173
|
+
change is not backwards-compatible with previous versions; you'll need
|
174
|
+
to update your tests if you want to upgrade to this version.
|
175
|
+
|
176
|
+
I made this change because it's likely that in the process of writing your
|
177
|
+
specdown, you'll want to add some code into your markdown that you don't want executed.
|
173
178
|
Perhaps it's code in a different language, or perhaps you're showing off
|
174
179
|
some command line functionality.
|
175
180
|
|
@@ -177,7 +182,7 @@ Specdown only executes fenced codeblocks specifically flagged as `ruby`.
|
|
177
182
|
Thus, if you want to add some code to your markdown that shouldn't be
|
178
183
|
executed, then just don't specifically flag it as Ruby:
|
179
184
|
|
180
|
-
# Non-
|
185
|
+
# Non-Executable Code Blocks
|
181
186
|
|
182
187
|
Here's an example of a non-executing code block:
|
183
188
|
|
@@ -195,7 +200,7 @@ executed, then just don't specifically flag it as Ruby:
|
|
195
200
|
I'm not flagged as anything, so I won't execute.
|
196
201
|
```
|
197
202
|
|
198
|
-
##
|
203
|
+
## Executable codeblocks
|
199
204
|
|
200
205
|
The only way to make a code block execute is to specifically flag it as Ruby
|
201
206
|
|
@@ -203,6 +208,73 @@ executed, then just don't specifically flag it as Ruby:
|
|
203
208
|
puts "I execute!"
|
204
209
|
```
|
205
210
|
|
211
|
+
## Implicit Specs
|
212
|
+
|
213
|
+
In all of the examples so far, we've made all code that we want executed
|
214
|
+
explicit within the markdown. Sometimes, however, it's advantageous to
|
215
|
+
simply state a specification, and then map that to code
|
216
|
+
behind-the-scenes. They're conceptually equivalent to cucumber step
|
217
|
+
definitions.
|
218
|
+
|
219
|
+
Imagine we've written the following markdown for an imaginary `Article`
|
220
|
+
model:
|
221
|
+
|
222
|
+
# Deleting an article from the database
|
223
|
+
|
224
|
+
Imagine we create the following article:
|
225
|
+
|
226
|
+
```ruby
|
227
|
+
article = Article.create :title => "Specdown"
|
228
|
+
```
|
229
|
+
|
230
|
+
We can delete the article by simply using the `delete!` method:
|
231
|
+
|
232
|
+
```ruby
|
233
|
+
article.delete!
|
234
|
+
```
|
235
|
+
|
236
|
+
**The article should now be deleted from the database.**
|
237
|
+
|
238
|
+
Notice the emphasis around the last sentence. If we execute this with
|
239
|
+
`specdown`, we'll recieve the following result:
|
240
|
+
|
241
|
+
$ specdown
|
242
|
+
|
243
|
+
1 markdown
|
244
|
+
1 test
|
245
|
+
0 passing
|
246
|
+
0 failing
|
247
|
+
1 undefined
|
248
|
+
|
249
|
+
|
250
|
+
Now add the following implicit spec definition to a file suffixed with ".specdown":
|
251
|
+
|
252
|
+
The article should now be deleted from the database.
|
253
|
+
----------------------------------------------------
|
254
|
+
|
255
|
+
pending # replace this with the code you want
|
256
|
+
|
257
|
+
If we do as it says and rerun the `specdown` command, we'll receive a
|
258
|
+
notice that we now have a pending implicit spec. Thus, we could
|
259
|
+
implement the pending spec like so (assuming we were using RSpec
|
260
|
+
expectations):
|
261
|
+
|
262
|
+
```markdown
|
263
|
+
The article should now be deleted from the database.
|
264
|
+
----------------------------------------------------
|
265
|
+
|
266
|
+
Article.all.should be_empty
|
267
|
+
```
|
268
|
+
|
269
|
+
The ".specdown" file is simply a markdown file with a different
|
270
|
+
extension. It should consist of an unordered list of spec / definition pairs.
|
271
|
+
|
272
|
+
Note that we didn't surround our code with a github-flavored backtick
|
273
|
+
fence. Since ".specdown" files are solely used for defining implicit
|
274
|
+
specifications, it's assumed that all code blocks (unless they're
|
275
|
+
spefically marked as something other than ruby) will be executed.
|
276
|
+
|
277
|
+
|
206
278
|
## Setting up your test environment
|
207
279
|
|
208
280
|
Similar to the cucumber testing framework: if you put a ruby file somewhere inside your "specdown" directory, `specdown` will find it and load it.
|
@@ -341,15 +413,19 @@ You can also configure this in your env.rb by setting
|
|
341
413
|
`Specdown::Config.format` to either `:short` or `:condensed`:
|
342
414
|
|
343
415
|
```ruby
|
344
|
-
Specdown::Config.format = :
|
416
|
+
Specdown::Config.format = :short
|
345
417
|
```
|
346
418
|
|
347
|
-
The default is `:
|
419
|
+
The default is `:condensed`.
|
348
420
|
|
349
421
|
## TODO
|
350
422
|
|
351
|
-
This library is
|
423
|
+
This library is quite new, but I am rapidly adding features to it. Here's what is on the immediate horizon:
|
352
424
|
|
353
425
|
* allow flagged text in the markdown to execute code, like a cucumber step definition
|
354
426
|
* offer the option of outputing the actual markdown while it executes, instead of "..F....FF......"
|
355
427
|
* Better stack traces / reporting
|
428
|
+
|
429
|
+
## LICENSE
|
430
|
+
|
431
|
+
This software is [public domain](http://en.wikipedia.org/wiki/Public_domain). GO WILD
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.4.0.beta.1
|
data/features/command.feature
CHANGED
data/features/config.feature
CHANGED
@@ -50,7 +50,7 @@ Feature: Specdown::Config
|
|
50
50
|
* Specdown::Config.expectations #==> nil
|
51
51
|
* Specdown::Config.reporter #==> Specdown::ColorTerminalReporter
|
52
52
|
* Specdown::Config.root #==> "specdown"
|
53
|
-
* Specdown::Config.format #==> :
|
53
|
+
* Specdown::Config.format #==> :condensed
|
54
54
|
|
55
55
|
Scenario: Reset the Specdown::Config
|
56
56
|
Given I have configured Specdown:
|
@@ -58,7 +58,7 @@ Feature: Specdown::Config
|
|
58
58
|
Specdown::Config.expectations = :rspec
|
59
59
|
Specdown::Config.reporter = Specdown::TerminalReporter
|
60
60
|
Specdown::Config.root = "dir/"
|
61
|
-
Specdown::Config.format = :
|
61
|
+
Specdown::Config.format = :short
|
62
62
|
"""
|
63
63
|
|
64
64
|
When I reset Specdown:
|
@@ -70,7 +70,7 @@ Feature: Specdown::Config
|
|
70
70
|
* Specdown::Config.expectations #==> nil
|
71
71
|
* Specdown::Config.reporter #==> Specdown::ColorTerminalReporter
|
72
72
|
* Specdown::Config.root #==> "specdown"
|
73
|
-
* Specdown::Config.format #==> :
|
73
|
+
* Specdown::Config.format #==> :condensed
|
74
74
|
|
75
75
|
|
76
76
|
|
@@ -0,0 +1,113 @@
|
|
1
|
+
Feature: Specdown::ImplicitParser
|
2
|
+
|
3
|
+
The Specdown::ImplicitParser will parse ".specdown" files.
|
4
|
+
|
5
|
+
Imagine the following file "implicits.specdown":
|
6
|
+
|
7
|
+
|
8
|
+
some text
|
9
|
+
==================
|
10
|
+
|
11
|
+
some code
|
12
|
+
|
13
|
+
|
14
|
+
|
15
|
+
some more text
|
16
|
+
==================
|
17
|
+
|
18
|
+
some more code
|
19
|
+
|
20
|
+
|
21
|
+
We can pass it off to the Specdown::ImplicitParser as a string:
|
22
|
+
|
23
|
+
result = Specdown::ImplicitParser File.read("implicits.specdown")
|
24
|
+
|
25
|
+
The result will be a hash lookup for the definitions:
|
26
|
+
|
27
|
+
result.should == {
|
28
|
+
"some text" => "some code",
|
29
|
+
"some more text" => "some more code"
|
30
|
+
}
|
31
|
+
|
32
|
+
|
33
|
+
Note that, unlike a regular markdown file that you ask specdown to execute, specdown does not care about the header levels inside your ".specdown" files.
|
34
|
+
|
35
|
+
|
36
|
+
Scenario: Multiple Implicits
|
37
|
+
|
38
|
+
Given the following implicit specification:
|
39
|
+
"""
|
40
|
+
@implicits = <<-SPECDOWN.undent
|
41
|
+
a
|
42
|
+
-----------------
|
43
|
+
|
44
|
+
a code
|
45
|
+
|
46
|
+
|
47
|
+
b
|
48
|
+
===================
|
49
|
+
|
50
|
+
b code
|
51
|
+
|
52
|
+
|
53
|
+
c
|
54
|
+
------------------
|
55
|
+
|
56
|
+
here's the c code:
|
57
|
+
|
58
|
+
c code
|
59
|
+
|
60
|
+
plus some more c code:
|
61
|
+
|
62
|
+
more c code
|
63
|
+
|
64
|
+
SPECDOWN
|
65
|
+
"""
|
66
|
+
|
67
|
+
When I parse it with the implicit parser:
|
68
|
+
"""
|
69
|
+
@result = Specdown::ImplicitParser.parse @implicits
|
70
|
+
"""
|
71
|
+
|
72
|
+
Then I should receive a hash lookup of implicit definitions:
|
73
|
+
"""
|
74
|
+
@result.should == {
|
75
|
+
"a" => "a code",
|
76
|
+
"b" => "b code",
|
77
|
+
"c" => "c code\nmore c code"
|
78
|
+
}
|
79
|
+
"""
|
80
|
+
|
81
|
+
Scenario: Several implicit specification strings
|
82
|
+
|
83
|
+
Given two implicit specification strings:
|
84
|
+
"""
|
85
|
+
@implicits_1 = <<-SPECDOWN.undent
|
86
|
+
a
|
87
|
+
---------------
|
88
|
+
|
89
|
+
a code
|
90
|
+
SPECDOWN
|
91
|
+
|
92
|
+
@implicits_2 = <<-SPECDOWN.undent
|
93
|
+
b
|
94
|
+
--------------
|
95
|
+
|
96
|
+
```ruby
|
97
|
+
b code
|
98
|
+
```
|
99
|
+
SPECDOWN
|
100
|
+
"""
|
101
|
+
|
102
|
+
When I pass both off to the Specdown::ImplicitParser:
|
103
|
+
"""
|
104
|
+
@results = Specdown::ImplicitParser.parse @implicits_1, @implicits_2
|
105
|
+
"""
|
106
|
+
|
107
|
+
Then I should receive a hash lookup of implicit definitions:
|
108
|
+
"""
|
109
|
+
@results.should == {
|
110
|
+
"a" => "a code",
|
111
|
+
"b" => "b code"
|
112
|
+
}
|
113
|
+
"""
|
@@ -0,0 +1,135 @@
|
|
1
|
+
Feature: Implicit Specs
|
2
|
+
|
3
|
+
In all of the examples so far, we've made all code that we want executed
|
4
|
+
explicit within the markdown. Sometimes, however, it's advantageous to
|
5
|
+
simply state a specification, and then map that to code
|
6
|
+
behind-the-scenes. They're conceptually equivalent to cucumber step
|
7
|
+
definitions.
|
8
|
+
|
9
|
+
Imagine we've written the following markdown for an imaginary `Article`
|
10
|
+
model:
|
11
|
+
|
12
|
+
\# Deleting an article from the database
|
13
|
+
|
14
|
+
Imagine we create the following article:
|
15
|
+
|
16
|
+
```ruby
|
17
|
+
article = Article.create :title => "Specdown"
|
18
|
+
```
|
19
|
+
|
20
|
+
We can delete the article by simply using the `delete!` method:
|
21
|
+
|
22
|
+
```ruby
|
23
|
+
article.delete!
|
24
|
+
```
|
25
|
+
|
26
|
+
**The article should now be deleted from the database.**
|
27
|
+
|
28
|
+
Notice the emphasis around the last sentence. If we execute this with
|
29
|
+
`specdown`, we'll recieve the following result:
|
30
|
+
|
31
|
+
```sh
|
32
|
+
$ specdown
|
33
|
+
|
34
|
+
1 markdown
|
35
|
+
1 test
|
36
|
+
0 passing
|
37
|
+
0 failing
|
38
|
+
1 undefined
|
39
|
+
|
40
|
+
|
41
|
+
Now add the following implicit spec definition to a file suffixed with ".specdown":
|
42
|
+
|
43
|
+
The article should now be deleted from the database.
|
44
|
+
------------------------------------------------------
|
45
|
+
|
46
|
+
pending # replace this with the code you want
|
47
|
+
```
|
48
|
+
|
49
|
+
If we do as it says and rerun the `specdown` command, we'll receive a
|
50
|
+
notice that we now have a pending implicit spec. Thus, we could
|
51
|
+
implement the pending spec like so (assuming we were using RSpec
|
52
|
+
expectations):
|
53
|
+
|
54
|
+
```markdown
|
55
|
+
The article should now be deleted from the database.
|
56
|
+
--------------------------------------------------------
|
57
|
+
|
58
|
+
Article.all.should be_empty
|
59
|
+
```
|
60
|
+
|
61
|
+
The ".specdown" file is simply a markdown file with a different
|
62
|
+
extension. It should consist of an unordered list of spec / definition pairs.
|
63
|
+
|
64
|
+
Note that, according to the [markdown specification](http://daringfireball.net/projects/markdown/syntax#list), codeblocks within list items must be indented twice (two tabs or 8 spaces).
|
65
|
+
|
66
|
+
|
67
|
+
Scenario: No implicit specification
|
68
|
+
|
69
|
+
Given a markdown file with an implicit spec:
|
70
|
+
"""
|
71
|
+
# Heading
|
72
|
+
|
73
|
+
**An implicit spec.**
|
74
|
+
"""
|
75
|
+
But no implicit specification
|
76
|
+
When I run the `specdown` command
|
77
|
+
Then I should see the following output:
|
78
|
+
"""
|
79
|
+
1 undefined
|
80
|
+
|
81
|
+
Now add the following implicit spec definition to a file suffixed with ".specdown":
|
82
|
+
|
83
|
+
An implicit spec.
|
84
|
+
------------------------------------------------------
|
85
|
+
|
86
|
+
pending # replace this with the code you wish you had
|
87
|
+
"""
|
88
|
+
|
89
|
+
Scenario: Pending implicit specification
|
90
|
+
Given a markdown file with an implicit spec:
|
91
|
+
"""
|
92
|
+
# Heading
|
93
|
+
|
94
|
+
**An implicit spec.**
|
95
|
+
"""
|
96
|
+
|
97
|
+
And a specdown file with a pending specification:
|
98
|
+
"""
|
99
|
+
An implicit spec.
|
100
|
+
---------------------
|
101
|
+
|
102
|
+
pending
|
103
|
+
"""
|
104
|
+
|
105
|
+
When I run the `specdown` command
|
106
|
+
Then I should see the following output:
|
107
|
+
"""
|
108
|
+
1 pending
|
109
|
+
"""
|
110
|
+
|
111
|
+
Scenario: Complete implicit specification
|
112
|
+
Given a markdown file with an implicit spec:
|
113
|
+
"""
|
114
|
+
# Heading
|
115
|
+
|
116
|
+
**An implicit spec.**
|
117
|
+
"""
|
118
|
+
|
119
|
+
And a specdown file with a complete specification:
|
120
|
+
"""
|
121
|
+
An implicit spec.
|
122
|
+
----------------------
|
123
|
+
|
124
|
+
raise "oops!" unless 1 == 1
|
125
|
+
"""
|
126
|
+
|
127
|
+
When I run the `specdown` command
|
128
|
+
|
129
|
+
Then I should see the following output:
|
130
|
+
"""
|
131
|
+
1 success
|
132
|
+
0 failures
|
133
|
+
"""
|
134
|
+
|
135
|
+
|