qed 2.6.3 → 2.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. data/.ruby +4 -3
  2. data/.yardopts +3 -0
  3. data/HISTORY.rdoc +71 -35
  4. data/README.rdoc +9 -10
  5. data/bin/qed +1 -1
  6. data/bin/qedoc +2 -1
  7. data/lib/qed.rb +2 -5
  8. data/lib/qed.yml +4 -3
  9. data/lib/qed/applique.rb +57 -24
  10. data/lib/qed/cli.rb +8 -0
  11. data/lib/qed/cli/qed.rb +124 -0
  12. data/lib/qed/demo.rb +35 -39
  13. data/lib/qed/document.rb +5 -3
  14. data/lib/qed/document/template.rhtml +1 -0
  15. data/lib/qed/evaluator.rb +227 -199
  16. data/lib/qed/parser.rb +60 -282
  17. data/lib/qed/reporter/abstract.rb +54 -58
  18. data/lib/qed/reporter/dotprogress.rb +6 -4
  19. data/lib/qed/reporter/html.rb +112 -31
  20. data/lib/qed/reporter/tapy.rb +95 -125
  21. data/lib/qed/reporter/verbatim.rb +80 -38
  22. data/lib/qed/scope.rb +35 -48
  23. data/lib/qed/session.rb +35 -140
  24. data/lib/qed/settings.rb +104 -67
  25. data/lib/qed/step.rb +237 -0
  26. data/{spec → qed}/01_demos.rdoc +0 -0
  27. data/{spec → qed}/02_advice.rdoc +18 -7
  28. data/qed/03_helpers.rdoc +44 -0
  29. data/{spec → qed}/04_samples.rdoc +4 -4
  30. data/{spec → qed}/05_quote.rdoc +3 -3
  31. data/{spec → qed}/07_toplevel.rdoc +0 -0
  32. data/{spec → qed}/08_cross_script.rdoc +0 -0
  33. data/{spec → qed}/09_cross_script.rdoc +0 -0
  34. data/{spec → qed}/10_constant_lookup.rdoc +2 -2
  35. data/qed/11_embedded_rules.rdoc +46 -0
  36. data/{test/integration/topcode.rdoc → qed/99_issues/02_topcode.rdoc} +0 -0
  37. data/{spec → qed}/applique/constant.rb +0 -0
  38. data/{spec → qed}/applique/env.rb +0 -0
  39. data/{spec → qed}/applique/fileutils.rb +0 -0
  40. data/{spec → qed}/applique/markup.rb +0 -0
  41. data/{spec → qed}/applique/toplevel.rb +0 -0
  42. data/{spec → qed}/helpers/advice.rb +6 -7
  43. data/{spec → qed}/helpers/toplevel.rb +0 -0
  44. data/{spec → qed}/samples/data.txt +0 -0
  45. data/{spec → qed}/samples/table.yml +0 -0
  46. metadata +44 -39
  47. data/LICENSE.rdoc +0 -31
  48. data/SPECSHEET.rdoc +0 -456
  49. data/lib/qed/advice.rb +0 -158
  50. data/lib/qed/reporter/bullet.rb +0 -91
  51. data/lib/qed/reporter/dtrace.rb +0 -67
  52. data/lib/yard-qed.rb +0 -1
  53. data/spec/03_helpers.rdoc +0 -43
  54. data/spec/applique/quote.rb +0 -4
  55. data/spec/helpers/sample.rb +0 -4
File without changes
@@ -5,7 +5,7 @@ They are used to keep demonstrations clean of extraneous,
5
5
  repetitive and merely adminstrative code that the reader does
6
6
  not need to see over and over.
7
7
 
8
- Typically you will want to put advice definitions is applique
8
+ Typically you will want to put advice definitions in applique
9
9
  files, rather then place them directly in the demonstration
10
10
  document, but you can do so, as you will see in this document.
11
11
 
@@ -98,13 +98,13 @@ to be run when the event is triggered.
98
98
 
99
99
  x = []
100
100
 
101
- When(:text) do |section|
101
+ When(:step) do |section|
102
102
  section.text.scan(/^\*(.*?)$/) do |m|
103
103
  x << $1.strip
104
104
  end
105
105
  end
106
106
 
107
- Not let see if it worked.
107
+ Now let's see if it worked.
108
108
 
109
109
  * SampleA
110
110
  * SampleB
@@ -119,6 +119,17 @@ So +x+ should now contain these three list samples.
119
119
  QED also supports comment match triggers. With the +When+ method one can
120
120
  define procedures to run when a given pattern matches comment text.
121
121
 
122
+ When 'given the facts' do
123
+ @facts = "this is truth"
124
+ end
125
+
126
+ Then whenever the words, 'given the facts' appear in step description
127
+ the `@facts` varaible will be set.
128
+
129
+ @facts.assert == "this is truth"
130
+
131
+ Pattern matchers reall shine when we also add captures to the mix.
132
+
122
133
  When 'given a setting @a equal to (((\d+)))' do |n|
123
134
  @a = n.to_i
124
135
  end
@@ -140,12 +151,12 @@ so any number can be used. For example, "given a setting @a equal to 2".
140
151
  When clauses can also use consecutive pattern matching. For instance
141
152
  we could write,
142
153
 
143
- When 'first match #(((\d+)))', 'then match #(((\d+)))' do |i1, i2|
144
- @a = [i1.to_i, i2.to_i]
145
- end
154
+ When 'first match #(((\d+)))', 'then match #(((\d+)))' do |i1, i2|
155
+ @a = [i1.to_i, i2.to_i]
156
+ end
146
157
 
147
158
  So that 'first match #1' will be looked for first, and only after
148
- that if 'then match #2' is found, will it be condiered a complete match.
159
+ that if 'then match #2' is found, will it be considered a complete match.
149
160
  All regular expression slots are collected from all matches and passed to
150
161
  the block. We can see that the rule matched this very paragraph.
151
162
 
@@ -0,0 +1,44 @@
1
+ = Helpers
2
+
3
+ There are two ways to load advice scripts. Manually loaded
4
+ helpers act per demonstrandum and apply only to the currently
5
+ executing demo. Automaticly loaded helpers apply to all
6
+ demonstrandum within their preview.
7
+
8
+ Helper scripts can be written just like demonstration scripts,
9
+ or they can be defined as pure Ruby scripts.
10
+
11
+ == Automatic Helpers
12
+
13
+ Automatic helpers, known as the "applique" are loaded at the
14
+ start of a session and apply equally to all demonstrandum within
15
+ the same or lower directory as teh demo. These helpers are placed
16
+ in an +applique+ subdirectory. For instance this document uses,
17
+ {applique/env.rb}[applique/env.rb].
18
+
19
+ == Manual Helpers
20
+
21
+ Manual helpers are loaded per-demonstration by using specially
22
+ marked links.
23
+
24
+ For example, because this link, Advice[qed://helpers/advice.rb],
25
+ begins with +qed:+, it will be used to load a helper. We can
26
+ see this with the following assertion.
27
+
28
+ pudding.assert.include?('loaded advice.rb')
29
+
30
+ No where in the demonstration have we defined +pudding+, but
31
+ it has been defined for us in the advice.rb helper script.
32
+
33
+ We can also see that the generic When clause in our advice
34
+ helper is keeping count of decriptive paragraphs. Since the
35
+ helper script was loaded two paragraphs back, the next count
36
+ will be 3.
37
+
38
+ count.assert == 3
39
+
40
+ Helpers are vital to building test-demonstration suites for
41
+ applications. But here again, only use them as necessary.
42
+ The more helpers you use the more difficult your demos will
43
+ be to follow.
44
+
@@ -6,12 +6,12 @@ When creating testable demonstrations, there are times when sizable
6
6
  chunks of data are needed. It is convenient to store such data in
7
7
  separate files. The +Data+ method makes is easy to utilize them.
8
8
 
9
- Data('qed/samples/data.txt').assert =~ /dolor/
9
+ Data(File.dirname(__FILE__) + '/samples/data.txt').assert =~ /dolor/
10
10
 
11
11
  The +Data+ method can also take a block which passes the data
12
- as the block's only argument.
12
+ as the blocks only argument.
13
13
 
14
- Data('qed/samples/data.txt') do |data|
14
+ Data(File.dirname(__FILE__) + '/samples/data.txt') do |data|
15
15
  data.assert =~ /dolor/
16
16
  end
17
17
 
@@ -32,7 +32,7 @@ the coded step. Consider the following example.
32
32
  Every row in the {table.yml table}[table.yml] will be assigned to
33
33
  the block parameters and run through the subsequent assertion.
34
34
 
35
- Table 'qed/samples/table.yml' do |x, y|
35
+ Table File.dirname(__FILE__) + '/samples/table.yml' do |x, y|
36
36
  x.upcase.assert == y
37
37
  end
38
38
 
@@ -5,15 +5,15 @@ Sometimes it would more useful to treat them a plain text to
5
5
  which the preceeding paragraph can make use in a processing rule.
6
6
 
7
7
  For example let say we want to make an example out of the following
8
- text...
8
+ text:
9
9
 
10
10
  The file will contain
11
11
 
12
12
  this text
13
13
 
14
- The use of the ellipsis ('...') tells the processor that the next
14
+ The use of the colon (`:`) tells the processor that the next
15
15
  segment is a plain text continuation of the current segment, rather
16
- than example code. If the next segment is varbatim it will be added to
16
+ than executable code. If the next segment is varbatim it will be added to
17
17
  the end of the arguments list of any applicable processing rule.
18
18
 
19
19
  Behind the scenes we created a rule to set the text to an instance
File without changes
File without changes
File without changes
@@ -1,13 +1,13 @@
1
1
  = Missing Constant
2
2
 
3
3
  If a constant is missing it is because it was not found
4
- in either the demos scope, the applique or the toplevel.
4
+ in either the demos scope, the applique or at the toplevel.
5
5
 
6
6
  begin
7
7
  UnknownConstant
8
8
  rescue => err
9
9
  # no colon means toplevel
10
- /[^:]UnknownConstant/ =~ err.message
10
+ err.name.to_s.refute.include?('::')
11
11
  end
12
12
 
13
13
  A constant defined in the applique is visible.
@@ -0,0 +1,46 @@
1
+ = Meta Code
2
+
3
+ All code steps are evaluated in a rescue clause. If an error occurs, it
4
+ is captured and reported through the test report, and execution continues.
5
+ However, sometimes this is not desired. To evaluate a step without the
6
+ rescue clause, and effective *fail fast*, append `^` mark to the end of
7
+ the desription text, like so. ^
8
+
9
+ When 'this is cool' do |text|
10
+ @text = text
11
+ end
12
+
13
+ Now, let's try it by saying, "this is cool":
14
+
15
+ And this is the text.
16
+
17
+ Did it work?
18
+
19
+ @text.assert == "And this is the text."
20
+
21
+
22
+ == Match Separator
23
+
24
+ The `When` method can take a list of String or Regexp as arguments.
25
+ If any of the strings contain `...`, the string will be split into
26
+ two at this point, which effective means that any text can occur
27
+ within this space. It behaves much like adding `((*.?))`, but parses
28
+ more quickly by dividing the string into multiple matches.
29
+
30
+ When 'Let /(\w+)/ be ... scared of /(\w+)/' do |name, monster|
31
+ @name = name
32
+ @monster = monster
33
+ end
34
+
35
+ Okay let's try it: Let John be very scared of Zombies.
36
+
37
+ So now what is the name?
38
+
39
+ @name.assert == "John"
40
+
41
+ What is the monster?
42
+
43
+ @monster.assert == "Zombies"
44
+
45
+ Did it work?
46
+
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -1,16 +1,15 @@
1
- # This helper is used to demonstrate
2
- # the use of advice --before, after
1
+ # This helper is used to demonstrate the use of advice --before, after
3
2
  # and when clauses.
4
3
 
5
4
  count = 0
6
5
  pudding = []
7
6
 
8
- When(:load) do
9
- pudding << "load #{File.basename(__FILE__)}"
10
- end
7
+ #Before(:import) do
8
+ # pudding << "load #{File.basename(__FILE__)}"
9
+ #end
11
10
 
12
- When(:unload) do
13
- pudding << "unload #{File.basename(__FILE__)}"
11
+ After(:import) do
12
+ pudding << "loaded #{File.basename(__FILE__)}"
14
13
  end
15
14
 
16
15
  #Before do
File without changes
File without changes
File without changes
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: qed
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.6.3
4
+ version: 2.7.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-10-24 00:00:00.000000000 Z
12
+ date: 2011-11-21 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: ansi
16
- requirement: &34514420 !ruby/object:Gem::Requirement
16
+ requirement: &70171077943540 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *34514420
24
+ version_requirements: *70171077943540
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: facets
27
- requirement: &34513660 !ruby/object:Gem::Requirement
27
+ requirement: &70171077942820 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '2.8'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *34513660
35
+ version_requirements: *70171077942820
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: ae
38
- requirement: &34513060 !ruby/object:Gem::Requirement
38
+ requirement: &70171077942200 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,21 @@ dependencies:
43
43
  version: '1.7'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *34513060
46
+ version_requirements: *70171077942200
47
+ - !ruby/object:Gem::Dependency
48
+ name: confection
49
+ requirement: &70171077941740 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :runtime
56
+ prerelease: false
57
+ version_requirements: *70171077941740
47
58
  - !ruby/object:Gem::Dependency
48
59
  name: detroit
49
- requirement: &34512580 !ruby/object:Gem::Requirement
60
+ requirement: &70171077941200 !ruby/object:Gem::Requirement
50
61
  none: false
51
62
  requirements:
52
63
  - - ! '>='
@@ -54,7 +65,7 @@ dependencies:
54
65
  version: '0'
55
66
  type: :development
56
67
  prerelease: false
57
- version_requirements: *34512580
68
+ version_requirements: *70171077941200
58
69
  description: ! 'QED (Quality Ensured Demonstrations) is a TDD/BDD framework
59
70
 
60
71
  utilizing Literate Programming techniques.'
@@ -66,17 +77,16 @@ executables:
66
77
  extensions: []
67
78
  extra_rdoc_files:
68
79
  - HISTORY.rdoc
69
- - SPECSHEET.rdoc
70
80
  - README.rdoc
71
- - LICENSE.rdoc
72
81
  files:
73
82
  - .ruby
74
83
  - .yardopts
75
84
  - bin/qed
76
85
  - bin/qedoc
77
- - lib/qed/advice.rb
78
86
  - lib/qed/applique.rb
87
+ - lib/qed/cli/qed.rb
79
88
  - lib/qed/cli/qedoc.rb
89
+ - lib/qed/cli.rb
80
90
  - lib/qed/core_ext.rb
81
91
  - lib/qed/demo.rb
82
92
  - lib/qed/document/jquery.js
@@ -88,43 +98,38 @@ files:
88
98
  - lib/qed/helpers/shell_session.rb
89
99
  - lib/qed/parser.rb
90
100
  - lib/qed/reporter/abstract.rb
91
- - lib/qed/reporter/bullet.rb
92
101
  - lib/qed/reporter/dotprogress.rb
93
- - lib/qed/reporter/dtrace.rb
94
102
  - lib/qed/reporter/html.rb
95
103
  - lib/qed/reporter/tapy.rb
96
104
  - lib/qed/reporter/verbatim.rb
97
105
  - lib/qed/scope.rb
98
106
  - lib/qed/session.rb
99
107
  - lib/qed/settings.rb
108
+ - lib/qed/step.rb
100
109
  - lib/qed.rb
101
110
  - lib/qed.yml
102
- - lib/yard-qed.rb
103
- - spec/01_demos.rdoc
104
- - spec/02_advice.rdoc
105
- - spec/03_helpers.rdoc
106
- - spec/04_samples.rdoc
107
- - spec/05_quote.rdoc
108
- - spec/07_toplevel.rdoc
109
- - spec/08_cross_script.rdoc
110
- - spec/09_cross_script.rdoc
111
- - spec/10_constant_lookup.rdoc
112
- - spec/applique/constant.rb
113
- - spec/applique/env.rb
114
- - spec/applique/fileutils.rb
115
- - spec/applique/markup.rb
116
- - spec/applique/quote.rb
117
- - spec/applique/toplevel.rb
118
- - spec/helpers/advice.rb
119
- - spec/helpers/sample.rb
120
- - spec/helpers/toplevel.rb
121
- - spec/samples/data.txt
122
- - spec/samples/table.yml
123
- - test/integration/topcode.rdoc
111
+ - qed/01_demos.rdoc
112
+ - qed/02_advice.rdoc
113
+ - qed/03_helpers.rdoc
114
+ - qed/04_samples.rdoc
115
+ - qed/05_quote.rdoc
116
+ - qed/07_toplevel.rdoc
117
+ - qed/08_cross_script.rdoc
118
+ - qed/09_cross_script.rdoc
119
+ - qed/10_constant_lookup.rdoc
120
+ - qed/11_embedded_rules.rdoc
121
+ - qed/99_issues/02_topcode.rdoc
122
+ - qed/applique/constant.rb
123
+ - qed/applique/env.rb
124
+ - qed/applique/fileutils.rb
125
+ - qed/applique/markup.rb
126
+ - qed/applique/toplevel.rb
127
+ - qed/helpers/advice.rb
128
+ - qed/helpers/toplevel.rb
129
+ - qed/samples/data.txt
130
+ - qed/samples/table.yml
124
131
  - HISTORY.rdoc
125
- - SPECSHEET.rdoc
126
132
  - README.rdoc
127
- - LICENSE.rdoc
128
133
  homepage: http://rubyworks.github.com/qed
129
134
  licenses:
130
135
  - BSD-2-Clause
@@ -1,31 +0,0 @@
1
- = COPYRIGHT NOTICES
2
-
3
- == QED
4
-
5
- Copyright:: (c) 2007 Rubyworks, Thomas Sawyer
6
- License:: BSD-2-Clause
7
- Website:: http://rubyworks.github.com/yes
8
-
9
- Copyright 2007 Thomas Sawyer, Rubyworks. All rights reserved.
10
-
11
- Redistribution and use in source and binary forms, with or without
12
- modification, are permitted provided that the following conditions are met:
13
-
14
- * Redistributions of source code must retain the above copyright notice,
15
- this list of conditions and the following disclaimer.
16
-
17
- * Redistributions in binary form must reproduce the above copyright notice,
18
- this list of conditions and the following disclaimer in the documentation
19
- and/or other materials provided with the distribution.
20
-
21
- THIS SOFTWARE IS PROVIDED BY Thomas Sawyer ``AS IS'' AND ANY EXPRESS
22
- OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
23
- OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
24
- NO EVENT SHALL Thomas Sawyer OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
25
- INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
26
- BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
28
- OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
29
- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
30
- EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
-