riot 0.11.0 → 0.11.1

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -3,3 +3,4 @@ pkg
3
3
  .*.swp
4
4
  doc
5
5
  .yardoc
6
+ *.tmproj
data/CHANGELOG CHANGED
@@ -1,3 +1,19 @@
1
+ *0.11.1*
2
+
3
+ * 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. [jaknowlden]
4
+
5
+ class MyMiddleware < Riot::ContextMiddleware
6
+ register
7
+
8
+ def call(context)
9
+ context.setup { "fooberries" }
10
+
11
+ middleware.call(context)
12
+
13
+ context.hookup { "furberries" } if context.option(:barns)
14
+ end
15
+ end
16
+
1
17
  *0.11.0*
2
18
 
3
19
  * 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. [jaknowlden]
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.11.0
1
+ 0.11.1
@@ -1,4 +1,5 @@
1
1
  require 'riot/reporter'
2
+ require 'riot/middleware'
2
3
  require 'riot/context'
3
4
  require 'riot/situation'
4
5
  require 'riot/runnable'
@@ -1,31 +1,10 @@
1
1
  module Riot
2
2
  RootContext = Struct.new(:setups, :teardowns, :detailed_description)
3
3
 
4
- class ContextMiddleware
5
- # Registers the current middleware class with Riot so that it may be included in the set of middlewares
6
- # Riot will poke before executing a Context.
7
- #
8
- # class MyContextMiddleware < Riot::ContextMiddleware
9
- # register
10
- # def handle?(context); ...; end
11
- # def prepare(context); ...; end
12
- # end
13
- def self.register; Context.middlewares << self.new; end
14
-
15
- # Called prior to a Context being executed. If this method returns true, +call+ will be called. This
16
- # methods expects to receive an instance of the Context to be executed. Generally, you will inspect
17
- # various aspects of the Context to determine if this middleware is meant to be used.
18
- def handle?(context); false; end
19
-
20
- # The meat of the middleware. Because you have access to the Context, you can add your own setups,
21
- # hookups, etc. +call+ will be called before any tests are run, but after the Context is configured.
22
- def call(context); end
23
- end
24
-
25
4
  module ContextClassOverrides
26
5
  def assertion_class; Assertion; end
27
6
  def situation_class; Situation; end
28
- end
7
+ end # ContextClassOverrides
29
8
 
30
9
  module ContextOptions
31
10
  # Set options for the specific context. These options will generally be used for context middleware.
@@ -43,7 +22,7 @@ module Riot
43
22
  def option(key) options[key]; end
44
23
  private
45
24
  def options; @options ||= {}; end
46
- end
25
+ end # ContextOptions
47
26
 
48
27
  # You make your assertions within a Context. The context stores setup and teardown blocks, and allows for
49
28
  # nesting and refactoring into helpers. Extension developers may also configure ContextMiddleware objects
@@ -71,8 +50,7 @@ module Riot
71
50
  @parent = parent || RootContext.new([],[], "")
72
51
  @description = description
73
52
  @contexts, @setups, @assertions, @teardowns = [], [], [], []
74
- self.instance_eval(&definition)
75
- prepare_middleware
53
+ prepare_middleware(&definition)
76
54
  end
77
55
 
78
56
  # Create a new test context.
@@ -201,14 +179,18 @@ module Riot
201
179
  runnables.each { |runnable| reporter.report(runnable.to_s, runnable.run(situation)) }
202
180
  end
203
181
 
182
+ # Prints the full description from the context tree
204
183
  def detailed_description
205
184
  "#{parent.detailed_description} #{description}".strip
206
185
  end
207
186
 
208
187
  private
209
188
 
210
- def prepare_middleware
211
- Context.middlewares.each { |middleware| middleware.call(self) if middleware.handle?(self) }
189
+ def prepare_middleware(&context_definition)
190
+ last_middleware = AllImportantMiddleware.new(&context_definition)
191
+ Context.middlewares.inject(last_middleware) do |last_middleware, middleware|
192
+ middleware.new(last_middleware)
193
+ end.call(self)
212
194
  end
213
195
 
214
196
  def runnables
@@ -232,4 +214,5 @@ module Riot
232
214
  (@assertions << assertion_class.new(description, &definition)).last
233
215
  end
234
216
  end # Context
217
+
235
218
  end # Riot
@@ -0,0 +1,40 @@
1
+ module Riot
2
+
3
+ class ContextMiddleware
4
+ # Registers the current middleware class with Riot so that it may be included in the set of middlewares
5
+ # Riot will poke before executing a Context.
6
+ #
7
+ # class MyContextMiddleware < Riot::ContextMiddleware
8
+ # register
9
+ # def call(context)
10
+ # context.setup { ... }
11
+ # middleware.call(context) # this can go anywhere
12
+ # context.hookup { ... }
13
+ # end
14
+ # end
15
+ def self.register; Context.middlewares << self; end
16
+
17
+ attr_reader :middleware # Theoretically, the next middleware in the stack
18
+
19
+ def initialize(middleware)
20
+ @middleware = middleware
21
+ end
22
+
23
+ # The meat. Because you have access to the Context, you can add your own setups,
24
+ # hookups, etc. +call+ will be called before any tests are run, but after the Context is configured.
25
+ def call(context)
26
+ raise "You should implement call yourself"
27
+ end
28
+ end # ContextMiddleware
29
+
30
+ # Special middleware used by Context directly. It will always be the last in the chain and is the actual
31
+ # place where the user's runtime context is processed.
32
+ class AllImportantMiddleware < ContextMiddleware
33
+ def initialize(&context_definition)
34
+ @context_definition = context_definition
35
+ end
36
+
37
+ def call(context) context.instance_eval(&@context_definition); end
38
+ end # AllImportantMiddleware
39
+
40
+ end # Riot
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{riot}
8
- s.version = "0.11.0"
8
+ s.version = "0.11.1"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Justin 'Gus' Knowlden"]
12
- s.date = %q{2010-05-17}
12
+ s.date = %q{2010-06-13}
13
13
  s.description = %q{An extremely fast, expressive, and context-driven unit-testing framework. A replacement for all other testing frameworks. Protest the slow test.}
14
14
  s.email = %q{gus@gusg.us}
15
15
  s.extra_rdoc_files = [
@@ -43,6 +43,7 @@ Gem::Specification.new do |s|
43
43
  "lib/riot/assertion_macros/size.rb",
44
44
  "lib/riot/context.rb",
45
45
  "lib/riot/message.rb",
46
+ "lib/riot/middleware.rb",
46
47
  "lib/riot/reporter.rb",
47
48
  "lib/riot/rr.rb",
48
49
  "lib/riot/runnable.rb",
@@ -70,6 +71,7 @@ Gem::Specification.new do |s|
70
71
  "test/core/assertion_macros/same_elements_test.rb",
71
72
  "test/core/assertion_macros/size_test.rb",
72
73
  "test/core/assertion_test.rb",
74
+ "test/core/chained_context_middleware_test.rb",
73
75
  "test/core/context_middleware_test.rb",
74
76
  "test/core/context_test.rb",
75
77
  "test/core/context_with_options_test.rb",
@@ -109,6 +111,7 @@ Gem::Specification.new do |s|
109
111
  "test/core/assertion_macros/same_elements_test.rb",
110
112
  "test/core/assertion_macros/size_test.rb",
111
113
  "test/core/assertion_test.rb",
114
+ "test/core/chained_context_middleware_test.rb",
112
115
  "test/core/context_middleware_test.rb",
113
116
  "test/core/context_test.rb",
114
117
  "test/core/context_with_options_test.rb",
@@ -0,0 +1,49 @@
1
+ require 'teststrap'
2
+
3
+ context "Chaining ContextMiddleware" do
4
+
5
+ teardown { Riot::Context.middlewares.clear }
6
+
7
+ context("when middleware halts the call chain") do
8
+ hookup do
9
+ Class.new(Riot::ContextMiddleware) do
10
+ register
11
+ def initialize(middleware); end
12
+ def call(context) "whoops"; end
13
+ end
14
+ end
15
+
16
+ setup do
17
+ situation = Riot::Situation.new
18
+ Riot::Context.new("Foo") do
19
+ setup { "foo" }
20
+ end.local_run(MockReporter.new, situation)
21
+ situation
22
+ end
23
+
24
+ asserts("situation topic") { topic.topic }.nil
25
+ end # when middleware halts the call chain
26
+
27
+ context("when middleware continues the call chain") do
28
+ hookup do
29
+ Class.new(Riot::ContextMiddleware) do
30
+ register
31
+ def call(context)
32
+ context.setup { ["foo"] }
33
+ middleware.call(context)
34
+ context.hookup { topic << "baz" }
35
+ end
36
+ end
37
+ end
38
+
39
+ setup do
40
+ situation = Riot::Situation.new
41
+ Riot::Context.new("Foo") do
42
+ hookup { topic << "bar" }
43
+ end.local_run(MockReporter.new, situation)
44
+ situation
45
+ end
46
+
47
+ asserts("situation topic") { topic.topic }.equals(%w[foo bar baz])
48
+ end # when middleware halts the call chain
49
+ end # Chaining ContextMiddleware
@@ -1,24 +1,28 @@
1
1
  require 'teststrap'
2
2
 
3
3
  context "ContextMiddleware" do
4
- setup { Riot::ContextMiddleware.new }
4
+ setup { Riot::ContextMiddleware.new("") }
5
5
  teardown { Riot::Context.middlewares.clear }
6
6
 
7
- asserts("handle? with context") { topic.handle?("Foo") }.equals(false)
8
- asserts("call with context") { topic.call("Foo") }.nil
7
+ asserts("#call on the base class") do
8
+ topic.call("Foo")
9
+ end.raises(RuntimeError, "You should implement call yourself")
9
10
 
10
11
  context "registration" do
11
12
  setup { Class.new(Riot::ContextMiddleware) { register } }
12
13
  asserts("registered middlewares list") { Riot::Context.middlewares }.size(1)
13
- asserts("registered middleware") { Riot::Context.middlewares.first }.kind_of(Riot::ContextMiddleware)
14
+ asserts("registered middleware") { Riot::Context.middlewares.first }.kind_of(Class)
14
15
  end # registration
15
16
 
16
17
  context "that is not meant to be used" do
17
18
  hookup do
18
19
  Class.new(Riot::ContextMiddleware) do
19
20
  register
20
- def handle?(context) context.description == "Bar"; end
21
- def call(context) context.setup { "fooberries" }; end
21
+ # def handle?(context) context.description == "Bar"; end
22
+ def call(context)
23
+ context.setup { "fooberries" } if context.description == "Bar"
24
+ middleware.call(context)
25
+ end
22
26
  end
23
27
  end
24
28
 
@@ -33,8 +37,11 @@ context "ContextMiddleware" do
33
37
  hookup do
34
38
  Class.new(Riot::ContextMiddleware) do
35
39
  register
36
- def handle?(context); true; end
37
- def call(context) context.setup { "fooberries" }; end
40
+ # def handle?(context); true; end
41
+ def call(context)
42
+ context.setup { "fooberries" }
43
+ middleware.call(context)
44
+ end
38
45
  end
39
46
  end
40
47
 
@@ -49,16 +56,20 @@ context "ContextMiddleware" do
49
56
  hookup do
50
57
  Class.new(Riot::ContextMiddleware) do
51
58
  register
52
- def handle?(context); true; end
53
- def call(context) context.setup { "foo" }; end
59
+ def call(context)
60
+ context.setup { topic + "berries" }
61
+ middleware.call(context)
62
+ end
54
63
  end
55
64
  end
56
65
 
57
66
  hookup do
58
67
  Class.new(Riot::ContextMiddleware) do
59
68
  register
60
- def handle?(context); true; end
61
- def call(context) context.setup { topic + "berries" }; end
69
+ def call(context)
70
+ context.setup { "foo" }
71
+ middleware.call(context)
72
+ end
62
73
  end
63
74
  end
64
75
 
@@ -69,12 +80,14 @@ context "ContextMiddleware" do
69
80
  asserts("tests passed") { topic.passes }.equals(1)
70
81
  end # that are not exclusive
71
82
 
72
- context "has access to options" do
83
+ context "has access to options after context setup" do
73
84
  hookup do
74
85
  Class.new(Riot::ContextMiddleware) do
75
86
  register
76
- def handle?(context); context.option(:foo) == "bar"; end
77
- def call(context) context.setup { "fooberries" }; end
87
+ def call(context)
88
+ middleware.call(context)
89
+ context.setup { "fooberries" } if context.option(:foo) == "bar"
90
+ end
78
91
  end
79
92
  end
80
93
 
@@ -86,5 +99,5 @@ context "ContextMiddleware" do
86
99
  end
87
100
 
88
101
  asserts("tests passed") { topic.passes }.equals(1)
89
- end # has access to options
102
+ end # has access to options after context setup
90
103
  end # ContextMiddleware
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 11
8
- - 0
9
- version: 0.11.0
8
+ - 1
9
+ version: 0.11.1
10
10
  platform: ruby
11
11
  authors:
12
12
  - Justin 'Gus' Knowlden
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-05-17 00:00:00 -05:00
17
+ date: 2010-06-13 00:00:00 -05:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -77,6 +77,7 @@ files:
77
77
  - lib/riot/assertion_macros/size.rb
78
78
  - lib/riot/context.rb
79
79
  - lib/riot/message.rb
80
+ - lib/riot/middleware.rb
80
81
  - lib/riot/reporter.rb
81
82
  - lib/riot/rr.rb
82
83
  - lib/riot/runnable.rb
@@ -104,6 +105,7 @@ files:
104
105
  - test/core/assertion_macros/same_elements_test.rb
105
106
  - test/core/assertion_macros/size_test.rb
106
107
  - test/core/assertion_test.rb
108
+ - test/core/chained_context_middleware_test.rb
107
109
  - test/core/context_middleware_test.rb
108
110
  - test/core/context_test.rb
109
111
  - test/core/context_with_options_test.rb
@@ -167,6 +169,7 @@ test_files:
167
169
  - test/core/assertion_macros/same_elements_test.rb
168
170
  - test/core/assertion_macros/size_test.rb
169
171
  - test/core/assertion_test.rb
172
+ - test/core/chained_context_middleware_test.rb
170
173
  - test/core/context_middleware_test.rb
171
174
  - test/core/context_test.rb
172
175
  - test/core/context_with_options_test.rb