riot 0.12.5 → 0.12.6
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/.gitignore +2 -0
- data/.travis.yml +10 -0
- data/CHANGELOG +286 -245
- data/Gemfile +4 -0
- data/README.markdown +284 -217
- data/lib/riot/context.rb +14 -3
- data/lib/riot/message.rb +1 -1
- data/lib/riot/middleware.rb +20 -20
- data/lib/riot/reporter.rb +5 -4
- data/lib/riot/reporter/io.rb +6 -14
- data/lib/riot/reporter/pretty_dot_matrix.rb +0 -1
- data/lib/riot/rr.rb +5 -0
- data/lib/riot/runnable.rb +2 -0
- data/lib/riot/situation.rb +1 -1
- data/lib/riot/version.rb +1 -1
- data/test/core/assertion_macros/raises_kind_of_test.rb +1 -1
- data/test/core/assertion_macros/raises_test.rb +1 -1
- data/test/core/middleware/context_middleware_test.rb +20 -0
- data/test/core/reports/basic_reporter_test.rb +6 -0
- data/test/core/reports/dot_matrix_reporter_test.rb +7 -1
- data/test/core/reports/story_reporter_test.rb +4 -6
- data/test/core/runnable/erroring_gracefully_test.rb +47 -0
- data/test/teststrap.rb +3 -1
- metadata +40 -39
data/.gitignore
CHANGED
data/.travis.yml
ADDED
data/CHANGELOG
CHANGED
@@ -1,328 +1,369 @@
|
|
1
|
-
|
1
|
+
# @markup markdown
|
2
2
|
|
3
|
-
|
3
|
+
# 0.12.6
|
4
4
|
|
5
|
-
|
5
|
+
* Catch and report on errors that occur while running middleware. Context with error in middleware will not run.
|
6
|
+
* Errors that occur during a setup, hookup, or teardown are handled gracefully
|
7
|
+
* close #31 - RR seems to carry over some latent varification state between situations
|
6
8
|
|
7
|
-
|
9
|
+
# 0.12.5
|
8
10
|
|
9
|
-
|
11
|
+
* Remove doc for some deprecated macros: not, exists, any [charlietanskley]
|
12
|
+
* Deprecate two more macros [charlietanskley]
|
13
|
+
* make riot run -w clean. None of those pesky warnings [achiu]
|
14
|
+
* Use #inspect for printing arguments in error results [Mon-Ouie]
|
15
|
+
* Move BlankSlate into Riot namespace [Mon-Ouie]
|
16
|
+
* Setting options in a sub-context don't leak back into the parent context [skade]
|
17
|
+
* Remove deprecated `not!` macro [charlietanksley]
|
18
|
+
* Fix all warnings so riot runs `-w` clean
|
10
19
|
|
11
|
-
|
20
|
+
# 0.12.4
|
12
21
|
|
13
|
-
|
14
|
-
|
15
|
-
==== Remove deprecated `not!` macro [charlietanksley]
|
16
|
-
|
17
|
-
==== Fix all warnings so riot runs `-w` clean
|
18
|
-
|
19
|
-
== 0.12.4
|
20
|
-
|
21
|
-
==== Adding Riot.plain! option for not printing output in color [c00lryguy,
|
22
|
+
* Adding Riot.plain! option for not printing output in color [c00lryguy,
|
22
23
|
jaknowlden]
|
23
24
|
|
24
|
-
|
25
|
+
# 0.12.3
|
25
26
|
|
26
|
-
|
27
|
+
* Going nuts with context helpers: should_not, asserts/denies_topic arguments [achiu]
|
27
28
|
|
28
29
|
This works now: `should_not("do something")` as an alias for `denies`
|
29
30
|
|
30
31
|
You can now pass arguments to `asserts`, `denies`, `should`, and `should_not`.
|
31
32
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
33
|
+
```
|
34
|
+
context "Playing with hashes" do
|
35
|
+
setup do
|
36
|
+
{ "foo" => "bar" }
|
37
|
+
end
|
36
38
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
39
|
+
asserts(:[], "foo").equals("bar")
|
40
|
+
should(:[], "foo").equals("bar")
|
41
|
+
denies(:[], "foo").equals("goo")
|
42
|
+
should_not(:[], "foo").equals("goo")
|
43
|
+
end # Playing with hashes
|
44
|
+
```
|
42
45
|
|
43
|
-
|
46
|
+
* Exit gracefully if a child process exited with failing status [timgaleckas]
|
44
47
|
|
45
48
|
No tests will run in this situation.
|
46
49
|
|
47
|
-
|
48
|
-
|
49
|
-
==== Adding a `denies_topic` macro to Context [Mon-Ouie]
|
50
|
-
|
51
|
-
== 0.12.2
|
52
|
-
|
53
|
-
==== RDoc'ed the hell out of everything [jaknowlden]
|
50
|
+
* No status displayed if no tests run [timgaleckas]
|
51
|
+
* Adding a `denies_topic` macro to Context [Mon-Ouie]
|
54
52
|
|
55
|
-
|
53
|
+
# 0.12.2
|
56
54
|
|
57
|
-
|
55
|
+
* RDoc'ed the hell out of everything [jaknowlden]
|
56
|
+
* Deprecating the not! assertion macro. It may just be gone by 0.13.0 [jaknowlden]
|
57
|
+
* Remove ANSI-color dependency [achiu]
|
58
|
+
* Switch from Jeweler to Bundler [achiu]
|
59
|
+
* Add PrettyDotMatrixReporter [achiu]
|
58
60
|
|
59
|
-
|
61
|
+
# 0.12.1
|
60
62
|
|
61
|
-
|
63
|
+
* Error reporting now filters the backtrace to include only meaningful line items. [mbriggs]
|
64
|
+
* Added ability to pass method arguments to asserts. [sirupsen]
|
62
65
|
|
63
|
-
|
66
|
+
# 0.12.0
|
64
67
|
|
65
|
-
|
68
|
+
* Negative tests are finally here! Added support for `denies` and adjusted macros to care about it with `devaluate`. [jaknowlden, achiu]
|
66
69
|
|
67
|
-
|
70
|
+
```
|
71
|
+
denies("my name") { "Rumplestiltzkin" }.equals("Henry")
|
72
|
+
```
|
68
73
|
|
69
|
-
|
74
|
+
# 0.11.4
|
70
75
|
|
71
|
-
|
72
|
-
|
73
|
-
denies("my name") { "Rumplestiltzkin" }.equals("Henry")
|
74
|
-
|
75
|
-
== 0.11.4
|
76
|
-
|
77
|
-
==== [skade] Passing Proc's instead of lambdas to `instance_eval` to comply with ruby 1.9.2.
|
78
|
-
|
79
|
-
==== [nu7hatch] Added `describe` alias for `context` for easier rspec porting. Useful at the top level and within a context.
|
76
|
+
* [skade] Passing Proc's instead of lambdas to `instance_eval` to comply with ruby 1.9.2.
|
77
|
+
* [nu7hatch] Added `describe` alias for `context` for easier rspec porting. Useful at the top level and within a context.
|
80
78
|
|
81
79
|
Who can argue with porting from rspec to riot? Not me.
|
82
80
|
|
83
|
-
|
84
|
-
|
85
|
-
|
81
|
+
```
|
82
|
+
describe "My thing" do
|
83
|
+
asserts(:size).equals(:small)
|
84
|
+
end # My thing
|
85
|
+
```
|
86
86
|
|
87
87
|
The following also works:
|
88
88
|
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
89
|
+
```
|
90
|
+
context "Another thing is"
|
91
|
+
describe "my" do
|
92
|
+
asserts_topic.equals("marshmallow") # this test will fail ... because it will ... because it's wrong
|
93
|
+
end # my
|
94
|
+
end # Another thing is
|
95
|
+
```
|
94
96
|
|
95
|
-
|
97
|
+
# 0.11.3
|
96
98
|
|
97
|
-
|
99
|
+
* [jaknowlden] Modified `matches` assertion macro to treat actual as a string before executing regular expression comparison.
|
98
100
|
|
99
|
-
|
100
|
-
|
101
|
-
|
101
|
+
```
|
102
|
+
asserts("a number") { 42 }.matches(/\d+/)
|
103
|
+
# same as
|
104
|
+
asserts("a number as string") { "42" }.matches(/\d+/)
|
105
|
+
```
|
102
106
|
|
103
|
-
|
107
|
+
# 0.11.2
|
104
108
|
|
105
|
-
|
109
|
+
* [jaknowlden] [ISSUE] Options were not nesting. Now fixed.
|
106
110
|
|
107
|
-
|
111
|
+
# 0.11.1
|
108
112
|
|
109
|
-
|
113
|
+
* [jaknowlden] Middleware can now acts more like you would expect. Middleware now know the next neighbor in the chain and can do stuff to the context before and after the user-defined context is prepared. Removes support for the handle? method. Now we act more like a Rack app.
|
110
114
|
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
115
|
+
```
|
116
|
+
class MyMiddleware < Riot::ContextMiddleware
|
117
|
+
register
|
118
|
+
|
119
|
+
def call(context)
|
120
|
+
context.setup { "fooberries" }
|
116
121
|
|
117
|
-
|
122
|
+
middleware.call(context)
|
118
123
|
|
119
|
-
|
120
|
-
|
121
|
-
|
124
|
+
context.hookup { "furberries" } if context.option(:barns)
|
125
|
+
end
|
126
|
+
end
|
127
|
+
```
|
122
128
|
|
123
|
-
|
129
|
+
# 0.11.0
|
124
130
|
|
125
|
-
|
131
|
+
* [jaknowlden] Added option to Context#setup which puts the specific setup block at the beginning of the setups to be called for a context. Also useful for middlewares.
|
126
132
|
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
133
|
+
```
|
134
|
+
context "Foo" do
|
135
|
+
setup { puts "called second" }
|
136
|
+
setup { puts "called third" }
|
137
|
+
setup(true) { puts "called first" }
|
138
|
+
end # Foo
|
139
|
+
```
|
132
140
|
|
133
|
-
|
141
|
+
* [jaknowlden] Added idea of options for a context. This is another feature picked up from riot-rails work.
|
134
142
|
|
135
143
|
Essentially, these are useful for middlewares. For instance, if you wanted to tell a middleware that was looking for a "transactional" option before running code in a transaction block, you might do this:
|
136
144
|
|
137
|
-
|
138
|
-
|
139
|
-
|
145
|
+
```
|
146
|
+
context User do
|
147
|
+
set :transactional, true
|
148
|
+
end # User
|
149
|
+
```
|
140
150
|
|
141
151
|
The middleware might do something with it:
|
142
152
|
|
143
|
-
|
144
|
-
|
153
|
+
```
|
154
|
+
class TransactionalMiddleware < Riot::ContextMiddleware
|
155
|
+
register
|
145
156
|
|
146
|
-
|
157
|
+
def handle?(context) context.option(:transactional) == true; end
|
147
158
|
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
159
|
+
def prepare(context)
|
160
|
+
# transactional stuff
|
161
|
+
end
|
162
|
+
end # TransactionalMiddleware
|
163
|
+
```
|
152
164
|
|
153
165
|
You can call set as many times as you like
|
154
166
|
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
167
|
+
```
|
168
|
+
context User do
|
169
|
+
set :transactional, true
|
170
|
+
set :foo, :bar
|
171
|
+
end
|
172
|
+
```
|
159
173
|
|
160
|
-
|
174
|
+
* [jaknowlden] ContextMiddleware: a construction pattern that allows for custom code to be applied to any context given that the middleware chooses to.
|
161
175
|
|
162
176
|
This is something I started building into riot-rails and decided it was useful enough to just put it into riot itself. If, for instance, you wanted to add a setup with some stuff only if the context description was equal to "Your Mom":
|
163
177
|
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
def handle?(context)
|
168
|
-
context.description == "Your Mom"
|
169
|
-
end
|
170
|
-
|
171
|
-
def prepare(context)
|
172
|
-
context.setup do
|
173
|
-
"your mom is the topic"
|
174
|
-
end
|
175
|
-
end
|
176
|
-
end # YourMomMiddleware
|
177
|
-
|
178
|
-
== 0.10.13
|
179
|
-
|
180
|
-
==== [jaknowlden] Helpers are now run with other setups, not separately. Which means you could use a helper in a setup.
|
181
|
-
|
182
|
-
context "Foo" do
|
183
|
-
helper(:user) { User.new }
|
184
|
-
setup do
|
185
|
-
Baz.new(:user => user) # :)
|
186
|
-
end
|
187
|
-
end # Foo
|
188
|
-
|
189
|
-
==== [vandrijevik] Correctly report non-RR assertion failures and errors when RR is used.
|
190
|
-
|
191
|
-
context "Foo.bar" do
|
192
|
-
asserts("baz is called") do
|
193
|
-
mock(Foo).baz
|
194
|
-
raise RuntimeError.new("oh noes")
|
195
|
-
end
|
196
|
-
end
|
197
|
-
|
198
|
-
would previously return [:fail, "baz() Called 0 times. Expected 1 times."], and will now
|
199
|
-
correctly return [:error, #<RuntimeError: oh noes>]
|
200
|
-
|
201
|
-
==== [jaknowlden] Recording description as is. Providing #detailed_description for proper behavior
|
202
|
-
|
203
|
-
foo_context = context(Foo) {}
|
204
|
-
bar_context = foo_context.context(Bar) {}
|
205
|
-
bar_context.description
|
206
|
-
=> Bar
|
207
|
-
bar_context.detailed_description
|
208
|
-
=> "Foo Bar"
|
209
|
-
|
210
|
-
==== [jaknowlden] No longer assuming topic when no block provided to an assertion. Instead, assuming block fails by default. Use `asserts_topic` only now.
|
211
|
-
|
212
|
-
context "foo" do
|
213
|
-
setup { "bar" }
|
214
|
-
asserts_topic.kind_of(String)
|
215
|
-
asserts("topic").kind_of(String) # Will fail since block returns `false`
|
216
|
-
asserts("topic").equals(false) # Will actually pass :)
|
217
|
-
end
|
218
|
-
|
219
|
-
== 0.10.12
|
220
|
-
|
221
|
-
==== [vandrijevik] Recognizing file and line number of an assertion declaration on failure
|
178
|
+
```
|
179
|
+
class YourMomMiddleware < Riot::ContextMiddleware
|
180
|
+
register
|
222
181
|
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
require 'riot'
|
227
|
-
require 'riot/rr'
|
228
|
-
|
229
|
-
# your-test.rb
|
230
|
-
context "foo" do
|
231
|
-
asserts("failure due to not calling hello") { mock!.hello {"world"} } # actually fails
|
232
|
-
end
|
182
|
+
def handle?(context)
|
183
|
+
context.description == "Your Mom"
|
184
|
+
end
|
233
185
|
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
# ...
|
238
|
-
expected == actual pass(new_message.received(expected)) ? fail(expected(expected).not(actual))
|
239
|
-
# ...
|
186
|
+
def prepare(context)
|
187
|
+
context.setup do
|
188
|
+
"your mom is the topic"
|
240
189
|
end
|
190
|
+
end
|
191
|
+
end # YourMomMiddleware
|
192
|
+
```
|
193
|
+
|
194
|
+
# 0.10.13
|
195
|
+
|
196
|
+
* [jaknowlden] Helpers are now run with other setups, not separately. Which means you could use a helper in a setup.
|
197
|
+
|
198
|
+
```
|
199
|
+
context "Foo" do
|
200
|
+
helper(:user) { User.new }
|
201
|
+
setup do
|
202
|
+
Baz.new(:user => user) # :)
|
203
|
+
end
|
204
|
+
end # Foo
|
205
|
+
```
|
206
|
+
|
207
|
+
* [vandrijevik] Correctly report non-RR assertion failures and errors when RR is used.
|
208
|
+
|
209
|
+
```
|
210
|
+
context "Foo.bar" do
|
211
|
+
asserts("baz is called") do
|
212
|
+
mock(Foo).baz
|
213
|
+
raise RuntimeError.new("oh noes")
|
214
|
+
end
|
215
|
+
end
|
216
|
+
```
|
217
|
+
|
218
|
+
would previously return [:fail, "baz() Called 0 times. Expected 1 times."], and will now correctly return [:error, #<RuntimeError: oh noes>]
|
219
|
+
|
220
|
+
* [jaknowlden] Recording description as is. Providing #detailed_description for proper behavior
|
221
|
+
|
222
|
+
```
|
223
|
+
foo_context = context(Foo) {}
|
224
|
+
bar_context = foo_context.context(Bar) {}
|
225
|
+
bar_context.description
|
226
|
+
=> Bar
|
227
|
+
bar_context.detailed_description
|
228
|
+
=> "Foo Bar"
|
229
|
+
```
|
230
|
+
|
231
|
+
* [jaknowlden] No longer assuming topic when no block provided to an assertion. Instead, assuming block fails by default. Use `asserts_topic` only now.
|
232
|
+
|
233
|
+
```
|
234
|
+
context "foo" do
|
235
|
+
setup { "bar" }
|
236
|
+
asserts_topic.kind_of(String)
|
237
|
+
asserts("topic").kind_of(String) # Will fail since block returns `false`
|
238
|
+
asserts("topic").equals(false) # Will actually pass :)
|
239
|
+
end
|
240
|
+
```
|
241
|
+
|
242
|
+
# 0.10.12
|
243
|
+
|
244
|
+
* [vandrijevik] Recognizing file and line number of an assertion declaration on failure
|
245
|
+
* [vandrijevik,jaknowlden] RR support in Riot
|
246
|
+
|
247
|
+
```
|
248
|
+
# teststrap.rb
|
249
|
+
require 'riot'
|
250
|
+
require 'riot/rr'
|
251
|
+
|
252
|
+
# your-test.rb
|
253
|
+
context "foo" do
|
254
|
+
asserts("failure due to not calling hello") { mock!.hello {"world"} } # actually fails
|
255
|
+
end
|
256
|
+
```
|
257
|
+
|
258
|
+
* [jaknowlden] Added Riot::Message to make messages in macros easier to write
|
259
|
+
|
260
|
+
```
|
261
|
+
def evaluate(actual, expected)
|
262
|
+
# ...
|
263
|
+
expected == actual pass(new_message.received(expected)) ? fail(expected(expected).not(actual))
|
264
|
+
# ...
|
265
|
+
end
|
266
|
+
```
|
267
|
+
|
268
|
+
* [jaknowlden] Added responds_to as a respond_to alias
|
269
|
+
* [jaknowlden] Added the equivalent_to macro to compare case equality (===). equals is now (==)
|
270
|
+
* [jaknowlden] Assuming RootContext if nil parent provided. Added Context#parent to the API
|
271
|
+
|
272
|
+
```
|
273
|
+
Riot::Context.new("Hi", nil) {}.parent.class
|
274
|
+
=> Riot::RootContext
|
275
|
+
```
|
276
|
+
|
277
|
+
# 0.10.11
|
278
|
+
|
279
|
+
* [gabrielg, jaknowlden] Context#asserts_topic now takes an optional description
|
280
|
+
|
281
|
+
```
|
282
|
+
asserts_topic.exists
|
283
|
+
asserts_topic("some kind of description").exists
|
284
|
+
```
|
285
|
+
|
286
|
+
* [gabrielg, jaknowlden] Added not! assertion macro
|
287
|
+
|
288
|
+
```
|
289
|
+
setup { User.new(:funny? => false) }
|
290
|
+
asserts(:funny?).not!
|
291
|
+
```
|
241
292
|
|
242
|
-
|
293
|
+
* [jaknowlden] Added Context#hookup to add some setup code to an already defined topic
|
294
|
+
|
295
|
+
```
|
296
|
+
context "yo mama" do
|
297
|
+
setup { YoMama.new }
|
298
|
+
# ...
|
299
|
+
context "is cool" do
|
300
|
+
hookup { topic.do_something_involving_state }
|
301
|
+
asserts_topic.kind_of?(YoMama)
|
302
|
+
end
|
303
|
+
end
|
304
|
+
```
|
243
305
|
|
244
|
-
|
306
|
+
* [jaknowlden] Added Riot.alone! mode to ensure Riot.run is not run at-exit
|
307
|
+
|
308
|
+
```
|
309
|
+
Riot.alone!
|
310
|
+
Riot.run
|
311
|
+
```
|
245
312
|
|
246
|
-
|
313
|
+
This will still print output unless you also Riot.silently!
|
247
314
|
|
248
|
-
|
249
|
-
=> Riot::RootContext
|
315
|
+
* [gabrielg, jaknowlden] Returning non-zero status at-exit when tests don't pass
|
250
316
|
|
251
|
-
|
317
|
+
# 0.10.10
|
252
318
|
|
253
|
-
|
254
|
-
|
255
|
-
asserts_topic.exists
|
256
|
-
asserts_topic("some kind of description").exists
|
257
|
-
|
258
|
-
==== [gabrielg, jaknowlden] Added not! assertion macro
|
259
|
-
|
260
|
-
setup { User.new(:funny? => false) }
|
261
|
-
asserts(:funny?).not!
|
262
|
-
|
263
|
-
==== [jaknowlden] Added Context#hookup to add some setup code to an already defined topic
|
264
|
-
|
265
|
-
context "yo mama" do
|
266
|
-
setup { YoMama.new }
|
267
|
-
# ...
|
268
|
-
context "is cool" do
|
269
|
-
hookup { topic.do_something_involving_state }
|
270
|
-
asserts_topic.kind_of?(YoMama)
|
271
|
-
end
|
272
|
-
end
|
319
|
+
* [dasch, jaknowlden] Passing assertion macros can now return a custom message
|
273
320
|
|
274
|
-
|
321
|
+
```
|
322
|
+
def evaluate(actual, *expectings)
|
323
|
+
1 == 1 ? pass("1 does equal 1") : fail("1 does not equal 1 in this universe")
|
324
|
+
end
|
325
|
+
```
|
275
326
|
|
276
|
-
|
277
|
-
|
327
|
+
* [jaknowlden] Removing Context#extend_assertions and related code
|
328
|
+
* [dasch] Allow the use of symbolic descriptions as shorthands for sending the message to the topic
|
278
329
|
|
279
|
-
|
330
|
+
```
|
331
|
+
setup { "foo" }
|
332
|
+
asserts(:upcase).equals("FOO")
|
333
|
+
```
|
280
334
|
|
281
|
-
|
335
|
+
* [jaknowlden, splattael] Added AssertionMacro and #register for macros
|
282
336
|
|
283
|
-
|
284
|
-
|
285
|
-
|
337
|
+
```
|
338
|
+
module My
|
339
|
+
class CustomThingAssertion < Riot::AssertionMacro
|
340
|
+
register :custom_thing
|
341
|
+
expects_exception!
|
286
342
|
|
287
343
|
def evaluate(actual, *expectings)
|
288
|
-
1 == 1 ? pass("1 does equal 1") : fail("1 does not equal 1 in this universe")
|
289
|
-
end
|
290
|
-
|
291
|
-
==== [jaknowlden] Removing Context#extend_assertions and related code
|
292
|
-
|
293
|
-
==== [dasch] Allow the use of symbolic descriptions as shorthands for sending the message to the topic
|
294
|
-
|
295
|
-
setup { "foo" }
|
296
|
-
asserts(:upcase).equals("FOO")
|
297
|
-
|
298
|
-
==== [jaknowlden, splattael] Added AssertionMacro and #register for macros
|
299
|
-
|
300
|
-
module My
|
301
|
-
class CustomThingAssertion < Riot::AssertionMacro
|
302
|
-
register :custom_thing
|
303
|
-
expects_exception!
|
304
|
-
|
305
|
-
def evaluate(actual, *expectings)
|
306
|
-
# ...
|
307
|
-
end
|
308
|
-
end
|
309
|
-
|
310
|
-
Riot::Assertion.register_macro :custom_thing, CustomThingAssertion
|
311
|
-
end
|
312
|
-
|
313
|
-
==== [splattael] Replace IOReporter#say with #puts. Also add #print.
|
314
|
-
|
315
|
-
class SomeNewReporter < IOReporter
|
316
|
-
def pass
|
317
|
-
puts "I PASSED"
|
318
|
-
end
|
319
|
-
|
320
|
-
def fail
|
321
|
-
print "F"
|
322
|
-
end
|
323
344
|
# ...
|
324
345
|
end
|
325
|
-
|
326
|
-
|
346
|
+
end
|
347
|
+
|
348
|
+
Riot::Assertion.register_macro :custom_thing, CustomThingAssertion
|
349
|
+
end
|
350
|
+
```
|
351
|
+
|
352
|
+
* [splattael] Replace IOReporter#say with #puts. Also add #print.
|
353
|
+
|
354
|
+
```
|
355
|
+
class SomeNewReporter < IOReporter
|
356
|
+
def pass
|
357
|
+
puts "I PASSED"
|
358
|
+
end
|
359
|
+
|
360
|
+
def fail
|
361
|
+
print "F"
|
362
|
+
end
|
363
|
+
# ...
|
364
|
+
end
|
365
|
+
```
|
366
|
+
|
367
|
+
# 0.10.9 and before
|
327
368
|
|
328
369
|
See the commit log: http://github.com/thumblemonks/riot/commits/master
|