qed 1.3 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/HISTORY CHANGED
@@ -1,5 +1,21 @@
1
1
  = RELEASE HISTORY
2
2
 
3
+ == 10.03.04 / 2010-03-04
4
+
5
+ This is a major new release of QED. All demonstration documents
6
+ are now converted to HTML via Tilt (http://github.com/tilt) before
7
+ being run through the test runner. So QED now supports any markup
8
+ format supported by Tilt, as well as ordinary HTML. Simply
9
+ stated, QED process <tt>pre</tt> tags as code and everything else
10
+ as comments. Nokogiri is used to parse the HTML.
11
+
12
+ Changes:
13
+
14
+ * HTML serves as a common format.
15
+ * New dependencies: Tilt and Nokogiri.
16
+ * New system of version numbers.
17
+
18
+
3
19
  == 1.2 / 2009-12-07
4
20
 
5
21
  This release adds a significant new feature, Comment Matchers.
data/bin/qedoc CHANGED
@@ -1,52 +1,3 @@
1
1
  #!/usr/bin/env ruby
2
-
3
- require 'optparse'
4
- require 'qed/document'
5
-
6
- options = {}
7
-
8
- usage = OptionParser.new do |usage|
9
-
10
- usage.banner = "Usage: qedoc [OPTIONS] <QEDFile1> [ <QEDFile2> ... ]"
11
-
12
- usage.on("-o", "--output [DIR]", "Output directory") do |dir|
13
- options[:output]= dir
14
- end
15
-
16
- usage.on("-t", "--title [TITLE]", "Title of Document") do |title|
17
- options[:title]= title
18
- end
19
-
20
- usage.on("--css [URI]", "Specify a URI for a CSS file add to HTML header.") do |uri|
21
- options[:css] = uri
22
- end
23
-
24
- usage.on("--dryrun", "") do
25
- options[:dryrun] = true
26
- end
27
-
28
- usage.on("-q", "--quiet", "") do
29
- options[:quiet] = true
30
- end
31
-
32
- usage.on_tail("-h", "--help", "display this help message") do
33
- puts usage
34
- exit
35
- end
36
-
37
- end
38
-
39
- usage.parse!
40
-
41
- options[:paths] = ARGV.dup
42
-
43
- #opts[:output] = cli.options[:file]
44
- #opts[:dryrun] = cli.options[:dryrun]
45
- #opts[:quiet] = cli.options[:quiet]
46
- #opts[:css] = cli.options[:css]
47
- #opts[:title] = cli.options[:title]
48
-
49
- doc = QED::Document.new(options)
50
-
51
- doc.generate
52
-
2
+ require 'qedoc/command'
3
+ QEDoc::Command.run
data/demo/error.rdoc ADDED
@@ -0,0 +1,21 @@
1
+ = Examples of Failure
2
+
3
+ This document is here simply to demonstrate what
4
+ a failed and error raising code steps looks like.
5
+
6
+ When run with the -v (verbatim) option, for instance, +qed+
7
+ will highlight the following sections in red and give a brief
8
+ error message.
9
+
10
+ == Failure
11
+
12
+ This step demonstrates a failed assertion.
13
+
14
+ 1.assert == 2
15
+
16
+ == Error
17
+
18
+ This step demonstrates a raised error.
19
+
20
+ raise "Just because"
21
+
File without changes
data/doc/qedoc/index.html CHANGED
@@ -98,7 +98,9 @@
98
98
  </div>
99
99
 
100
100
  <div id="content">
101
- <h1>Standard Sections</h1>
101
+ <body>
102
+ <h1>Demonstrations</h1>
103
+ <h2>Standard Sections</h2>
102
104
  <p>
103
105
  QED demos are light-weight specification documents, highly suitable to
104
106
  interface-driven design. The documents are divided up into clauses
@@ -109,7 +111,7 @@ executable code.
109
111
  <p>
110
112
  Each code section is executed in order of appearance, within a rescue
111
113
  wrapper that captures any failures or errors. If neither a failure or error
112
- occur then the code gets a &#8220;pass&#8221;.
114
+ occur then the code gets a pass”.
113
115
  </p>
114
116
  <p>
115
117
  For example, the following passes:
@@ -118,7 +120,7 @@ For example, the following passes:
118
120
  (2 + 2).assert == 4
119
121
  </pre>
120
122
  <p>
121
- While the following would &#8220;fail&#8221;, as indicated by the raising
123
+ While the following would fail”, as indicated by the raising
122
124
  of an Assertion error:
123
125
  </p>
124
126
  <pre>
@@ -134,13 +136,13 @@ And this would have raised a NameError:
134
136
  nobody_knows_method
135
137
  end
136
138
  </pre>
137
- <h1>Neutral Code</h1>
139
+ <h2>Neutral Code Blocks</h2>
138
140
  <p>
139
141
  There is no means of specifying that a code clause is neutral code, i.e.
140
142
  that it should be executed but not tested. Thus far, such a feature has
141
143
  proven to be a YAGNI.
142
144
  </p>
143
- <h1>Defining Custom Assertions</h1>
145
+ <h2>Defining Custom Assertions</h2>
144
146
  <p>
145
147
  The context in which the QED code is run is a self-extended module, thus
146
148
  reusable macros can be created simply by defining a method.
@@ -157,45 +159,44 @@ Now lets try out our new macro definition.
157
159
  assert_integer(4)
158
160
  </pre>
159
161
  <p>
160
- Let&#8217;s prove that it can also fail:
162
+ Lets prove that it can also fail:
161
163
  </p>
162
164
  <pre>
163
165
  expect Assertion do
164
- assert_integer(&quot;IV&quot;)
166
+ assert_integer("IV")
165
167
  end
166
168
  </pre>
167
- <h1>Helper File</h1>
169
+ </body>
170
+ <body>
171
+ <h1>Advice</h1>
168
172
  <p>
169
- Helpers can be defined at the bottom of any QED document by placing the
170
- code after a triple-dash divider (ie. &#8220;&#8212;&#8221;). You can use
171
- that to load optional AE features, or define your own specialized assertion
172
- methods. Helpers can be defined in a separate files using <tt>require</tt>
173
- or <tt>load</tt> in the bottom section to import them. The bottom section
174
- is run first, before any the steps.
173
+ Advice are wrapper methods that augment demonstrations. They are used to
174
+ keep demonstrations clean of extraneous, repetitive and merely
175
+ adminstrative code that the reader does not need to see over and over.
175
176
  </p>
176
- <h1>Before and After Clauses</h1>
177
+ <h2>Before and After</h2>
177
178
  <p>
178
179
  QED supports <b>before</b> and <b>after</b> clauses in a specification
179
- through the use of before and after code blocks. Before and after clauses
180
- are executed at the beginning and at the end of each subsequent step.
180
+ through the use of Before and After code blocks. These blocks are executed
181
+ at the beginning and at the end of each indicated step.
181
182
  </p>
182
183
  <p>
183
184
  We use a <b>before</b> clause if we want to setup some code at the start of
184
- each step.
185
+ each code step.
185
186
  </p>
186
187
  <pre>
187
188
  a, z = nil, nil
188
189
 
189
190
  Before do
190
- a = &quot;BEFORE&quot;
191
+ a = "BEFORE"
191
192
  end
192
193
  </pre>
193
194
  <p>
194
- And an <b>after</b> clause to teardown objects after a step.
195
+ And an <b>after</b> clause to teardown objects after a code step.
195
196
  </p>
196
197
  <pre>
197
198
  After do
198
- z = &quot;AFTER&quot;
199
+ z = "AFTER"
199
200
  end
200
201
  </pre>
201
202
  <p>
@@ -204,78 +205,113 @@ ensure their visibility in the scope later. Now, lets verify that the
204
205
  <b>before</b> and <b>after</b> clauses work.
205
206
  </p>
206
207
  <pre>
207
- a.assert == &quot;BEFORE&quot;
208
+ a.assert == "BEFORE"
208
209
 
209
- a = &quot;A&quot;
210
- z = &quot;Z&quot;
210
+ a = "A"
211
+ z = "Z"
211
212
  </pre>
212
213
  <p>
213
214
  And now.
214
215
  </p>
215
216
  <pre>
216
- z.assert == &quot;AFTER&quot;
217
+ z.assert == "AFTER"
217
218
  </pre>
218
219
  <p>
219
- There can only be one before or after clause at a time. So if we define a
220
- new <b>before</b> or <b>after</b> clause later in the document, it will
221
- replace the current clause(s) in use.
220
+ There can be more than one before and after clause at a time. If we define
221
+ a new <b>before</b> or <b>after</b> clause later in the document, it will
222
+ be appended to the current list of clauses in use.
222
223
  </p>
223
224
  <p>
224
225
  As a demonstration of this:
225
226
  </p>
226
227
  <pre>
228
+ b = nil
229
+
227
230
  Before do
228
- a = &quot;BEFORE AGAIN&quot;
231
+ b = "BEFORE AGAIN"
229
232
  end
230
233
  </pre>
231
234
  <p>
232
235
  We will see it is the case.
233
236
  </p>
234
237
  <pre>
235
- a.assert == &quot;BEFORE AGAIN&quot;
238
+ b.assert == "BEFORE AGAIN"
236
239
  </pre>
237
240
  <p>
238
241
  Only use <b>before</b> and <b>after</b> clauses when necessary
239
- &#8212;specifications are generally more readable without them. Indeed,
242
+ specifications are generally more readable without them. Indeed,
240
243
  some developers make a policy of avoiding them altogether. YMMV.
241
244
  </p>
242
- <h1>External Data</h1>
245
+ <h2>Caveats of Before and After</h2>
243
246
  <p>
244
- When creating testable demonstrations, there are times when sizable chunks
245
- of data are needed. It is convenient to store such data in a separate file.
246
- The <tt>Data</tt> method makes is easy to load such files.
247
+ Instead of using Before and After clauses, it is wiser to define a reusable
248
+ setup method. For example, in the helper if we define a method such as
249
+ #prepare_example.
247
250
  </p>
248
251
  <pre>
249
- Data('data.txt').assert =~ /dolor/
252
+ def prepare_example
253
+ "Hello, World!"
254
+ end
250
255
  </pre>
251
256
  <p>
252
- All files are found relative to the location of current document.
257
+ Then we can reuse it in later code blocks.
253
258
  </p>
254
- <h1>Tabular Steps</h1>
259
+ <pre>
260
+ example = prepare_example
261
+ example.assert == "Hello, World!"
262
+ </pre>
255
263
  <p>
256
- The <tt>Table</tt> method is similar to the <tt>Data</tt> method except
257
- that it expects a YAML file, and it can take a block to iterate the data
258
- over. This makes it easy to test tables of examples.
264
+ The advantage to this is that it gives the reader an indication of what is
265
+ going on behind the scenes, rather the having an object just magically
266
+ appear.
259
267
  </p>
268
+ <h2>Event Targets</h2>
260
269
  <p>
261
- The arity of the table block corresponds to the number of columns in each
262
- row of the table. Each row is assigned in turn and run through the coded
263
- step. Consider the following example:
270
+ There is a small set of advice targets that do not come before or after an
271
+ event, rather they occur <b>upon</b> a particular event. These include
272
+ <tt>:load</tt> and <tt>:unload</tt>, for when a new helper is loaded;
273
+ <tt>:pass</tt>, <tt>:fail</tt> and <tt>:error</tt> for when a code block
274
+ passes, fails or raises an error; and <tt>:tag</tt> which is a low-level
275
+ target triggered upon parsing each element in the HTML conversion of the
276
+ demonstration.
264
277
  </p>
265
278
  <p>
266
- Every row in the <a href="http://table.yml">table.yml table</a> will be
267
- assigned to the block parameters and run through the subsequent assertion.
279
+ These event targets can be advised by calling the <tt>When</tt> method with
280
+ the target type as an argument along with the code block to be run when the
281
+ event is triggered.
268
282
  </p>
269
283
  <pre>
270
- Table 'table.yml' do |x, y|
271
- x.upcase.assert == y
272
- end
284
+ x = []
285
+
286
+ When(:tag) do |element|
287
+ x &lt;&lt; element.text.strip if element.name == 'li'
288
+ end
273
289
  </pre>
274
- <h1>Comment Triggers</h1>
290
+ <p>
291
+ Not let see it is worked:
292
+ </p>
293
+ <ul>
294
+ <li>SampleA
295
+
296
+ </li>
297
+ <li>SampleB
298
+
299
+ </li>
300
+ <li>SampleC
301
+
302
+ </li>
303
+ </ul>
304
+ <p>
305
+ So <tt>x</tt> should now contain these three list samples.
306
+ </p>
307
+ <pre>
308
+ x.assert == [ 'SampleA', 'SampleB', 'SampleC' ]
309
+ </pre>
310
+ <h2>Pattern Matchers</h2>
275
311
  <p>
276
312
  QED also supports comment match triggers. With the <tt>When</tt> method one
277
- can define setup and teardown procedures by matching against comment text.
278
- For example:
313
+ can define procedures to run when a given pattern matches comment text. For
314
+ example:
279
315
  </p>
280
316
  <pre>
281
317
  When 'given a setting @a equal to (((\d+)))' do |n|
@@ -284,7 +320,7 @@ For example:
284
320
  </pre>
285
321
  <p>
286
322
  Now, @a will be set to 1 whenever a comment like this one contains,
287
- &#8220;given a setting @a equal to 1&#8221;.
323
+ given a setting @a equal to 1”.
288
324
  </p>
289
325
  <pre>
290
326
  @a.assert == 1
@@ -295,8 +331,8 @@ use a regular expression if you need more control over the match. When
295
331
  using a string all spaces are converted to <tt>\s+</tt> and anything within
296
332
  double-parenthesis is treated as raw regular expression. Since the above
297
333
  example has (((\d+))), the actual regular expression contains
298
- <tt>(\d+)</tt>, so any number can be used. For example, &#8220;given a
299
- setting @a equal to 2&#8221;.
334
+ <tt>(\d+)</tt>, so any number can be used. For example, given a
335
+ setting @a equal to 2”.
300
336
  </p>
301
337
  <pre>
302
338
  @a.assert == 2
@@ -306,34 +342,89 @@ Typically you will want to put triggers is helper files, rather then place
306
342
  them directly in the demonstration document.
307
343
  </p>
308
344
  <p>
309
- This concludes the basic overview of QED&#8217;s specification system,
345
+ This concludes the basic overview of QEDs specification system,
310
346
  which is itself a QED document. Yes, we eat our own dog food.
311
347
  </p>
312
- <hr size="1"></hr><p>
313
- <a href="http://helper.rb">1</a> Helper
348
+ </body>
349
+ <body>
350
+ <h1>Helpers</h1>
351
+ <p>
352
+ There are two ways to load advice scripts. Either per demonstration or
353
+ globally. Per demonstration helpers apply only to the current
354
+ demonstration. Global helpers apply to all demonstrations.
355
+ </p>
356
+ <h2>Global Helpers</h2>
357
+ <p>
358
+ Global helpers are loaded at the start of a session and apply equally to
359
+ all demonstrations in a suite.
314
360
  </p>
315
-
316
- <h1>Examples of Failure</h1>
361
+ <h2>Local Helpers</h2>
317
362
  <p>
318
- This document is here simply to demonstrate what a failed step looks like.
363
+ Helper scripts can be written just a demonstration scripts, or they can be
364
+ defined as pure Ruby scripts. Either way they are loaded per-demonstration
365
+ by using specially marked links.
366
+ </p>
367
+ <p>
368
+ For example, because this link, <a href="qed://helpers/advice.rb">Advice</a>, begins with <tt>require:</tt>,
369
+ it will be used to load a global helper. We can see this with the
370
+ following:
319
371
  </p>
320
372
  <pre>
321
- 1.assert == 2
373
+ pudding.assert.include?('load advice.rb')
322
374
  </pre>
323
375
  <p>
324
- And this step demonstrates an error.
376
+ No where in the demonstration have we defined <tt>pudding</tt>, but it has
377
+ been defined for us in the advice.rb helper script.
378
+ </p>
379
+ <p>
380
+ We can also see that the generic When clause in our advice helper is
381
+ keeping count of descriptions. Since the helper script was loaded three
382
+ paragraphs back, the count will be 3.
325
383
  </p>
326
384
  <pre>
327
- raise &quot;just because&quot;
385
+ count.assert == 3
328
386
  </pre>
329
387
  <p>
330
- When run with the -v (verbatim) option, <tt>qed</tt> will highlight these
331
- in red and give a brief error message.
388
+ Helpers are vital to building test-demonstration suites for applications.
389
+ But here again, only use them as necessary. The more helpers you use the
390
+ more difficult your demos will be to follow.
332
391
  </p>
333
- <hr size="1"></hr><p>
334
- <a href="http://helper.rb">1</a> Helper
392
+ </body>
393
+ <body>
394
+ <h1>Fixtures</h1>
395
+ <h2>Flat-file Data</h2>
396
+ <p>
397
+ When creating testable demonstrations, there are times when sizable chunks
398
+ of data are needed. It is convenient to store such data in separate files.
399
+ The <tt>Data</tt> method makes is easy to load such files.
335
400
  </p>
336
-
401
+ <pre>
402
+ Data('fixtures/data.txt').assert =~ /dolor/
403
+ </pre>
404
+ <p>
405
+ All files are found relative to the location of current document.
406
+ </p>
407
+ <h2>Tabular Data</h2>
408
+ <p>
409
+ The <tt>Table</tt> method is similar to the <tt>Data</tt> method except
410
+ that it expects a YAML file, and it can take a block to iterate the data
411
+ over. This makes it easy to test tables of examples.
412
+ </p>
413
+ <p>
414
+ The arity of the table block corresponds to the number of columns in each
415
+ row of the table. Each row is assigned in turn and run through the coded
416
+ step. Consider the following example:
417
+ </p>
418
+ <p>
419
+ Every row in the <a href="http://table.yml">table.yml table</a> will be
420
+ assigned to the block parameters and run through the subsequent assertion.
421
+ </p>
422
+ <pre>
423
+ Table 'fixtures/table.yml' do |x, y|
424
+ x.upcase.assert == y
425
+ end
426
+ </pre>
427
+ </body>
337
428
 
338
429
  </div>
339
430
  </div>