inversion 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. data.tar.gz.sig +2 -0
  2. data/.gemtest +0 -0
  3. data/ChangeLog +836 -0
  4. data/History.md +4 -0
  5. data/Manifest.txt +74 -0
  6. data/README.rdoc +171 -0
  7. data/Rakefile +55 -0
  8. data/bin/inversion +276 -0
  9. data/lib/inversion.rb +98 -0
  10. data/lib/inversion/exceptions.rb +21 -0
  11. data/lib/inversion/mixins.rb +236 -0
  12. data/lib/inversion/monkeypatches.rb +20 -0
  13. data/lib/inversion/renderstate.rb +337 -0
  14. data/lib/inversion/sinatra.rb +35 -0
  15. data/lib/inversion/template.rb +250 -0
  16. data/lib/inversion/template/attrtag.rb +120 -0
  17. data/lib/inversion/template/calltag.rb +16 -0
  18. data/lib/inversion/template/codetag.rb +164 -0
  19. data/lib/inversion/template/commenttag.rb +54 -0
  20. data/lib/inversion/template/conditionaltag.rb +49 -0
  21. data/lib/inversion/template/configtag.rb +60 -0
  22. data/lib/inversion/template/containertag.rb +45 -0
  23. data/lib/inversion/template/elsetag.rb +62 -0
  24. data/lib/inversion/template/elsiftag.rb +49 -0
  25. data/lib/inversion/template/endtag.rb +55 -0
  26. data/lib/inversion/template/escapetag.rb +26 -0
  27. data/lib/inversion/template/fortag.rb +120 -0
  28. data/lib/inversion/template/iftag.rb +69 -0
  29. data/lib/inversion/template/importtag.rb +70 -0
  30. data/lib/inversion/template/includetag.rb +51 -0
  31. data/lib/inversion/template/node.rb +102 -0
  32. data/lib/inversion/template/parser.rb +297 -0
  33. data/lib/inversion/template/pptag.rb +28 -0
  34. data/lib/inversion/template/publishtag.rb +72 -0
  35. data/lib/inversion/template/subscribetag.rb +88 -0
  36. data/lib/inversion/template/tag.rb +150 -0
  37. data/lib/inversion/template/textnode.rb +43 -0
  38. data/lib/inversion/template/unlesstag.rb +60 -0
  39. data/lib/inversion/template/uriencodetag.rb +30 -0
  40. data/lib/inversion/template/yieldtag.rb +51 -0
  41. data/lib/inversion/tilt.rb +82 -0
  42. data/lib/inversion/utils.rb +235 -0
  43. data/spec/data/sinatra/hello.inversion +1 -0
  44. data/spec/inversion/mixins_spec.rb +177 -0
  45. data/spec/inversion/monkeypatches_spec.rb +35 -0
  46. data/spec/inversion/renderstate_spec.rb +291 -0
  47. data/spec/inversion/sinatra_spec.rb +59 -0
  48. data/spec/inversion/template/attrtag_spec.rb +216 -0
  49. data/spec/inversion/template/calltag_spec.rb +30 -0
  50. data/spec/inversion/template/codetag_spec.rb +51 -0
  51. data/spec/inversion/template/commenttag_spec.rb +84 -0
  52. data/spec/inversion/template/configtag_spec.rb +105 -0
  53. data/spec/inversion/template/containertag_spec.rb +54 -0
  54. data/spec/inversion/template/elsetag_spec.rb +105 -0
  55. data/spec/inversion/template/elsiftag_spec.rb +87 -0
  56. data/spec/inversion/template/endtag_spec.rb +78 -0
  57. data/spec/inversion/template/escapetag_spec.rb +59 -0
  58. data/spec/inversion/template/fortag_spec.rb +98 -0
  59. data/spec/inversion/template/iftag_spec.rb +241 -0
  60. data/spec/inversion/template/importtag_spec.rb +106 -0
  61. data/spec/inversion/template/includetag_spec.rb +108 -0
  62. data/spec/inversion/template/node_spec.rb +81 -0
  63. data/spec/inversion/template/parser_spec.rb +170 -0
  64. data/spec/inversion/template/pptag_spec.rb +51 -0
  65. data/spec/inversion/template/publishtag_spec.rb +69 -0
  66. data/spec/inversion/template/subscribetag_spec.rb +60 -0
  67. data/spec/inversion/template/tag_spec.rb +97 -0
  68. data/spec/inversion/template/textnode_spec.rb +86 -0
  69. data/spec/inversion/template/unlesstag_spec.rb +84 -0
  70. data/spec/inversion/template/uriencodetag_spec.rb +49 -0
  71. data/spec/inversion/template/yieldtag_spec.rb +54 -0
  72. data/spec/inversion/template_spec.rb +269 -0
  73. data/spec/inversion/tilt_spec.rb +47 -0
  74. data/spec/inversion_spec.rb +95 -0
  75. data/spec/lib/constants.rb +9 -0
  76. data/spec/lib/helpers.rb +160 -0
  77. metadata +316 -0
  78. metadata.gz.sig +0 -0
@@ -0,0 +1,49 @@
1
+ #!/usr/bin/env rspec -cfd -b
2
+ # vim: set noet nosta sw=4 ts=4 :
3
+
4
+ BEGIN {
5
+ require 'pathname'
6
+ basedir = Pathname( __FILE__ ).dirname.parent.parent.parent
7
+ libdir = basedir + 'lib'
8
+
9
+ $LOAD_PATH.unshift( basedir.to_s ) unless $LOAD_PATH.include?( basedir.to_s )
10
+ $LOAD_PATH.unshift( libdir.to_s ) unless $LOAD_PATH.include?( libdir.to_s )
11
+ }
12
+
13
+ require 'rspec'
14
+ require 'spec/lib/helpers'
15
+ require 'inversion/template/uriencodetag'
16
+
17
+ describe Inversion::Template::UriencodeTag do
18
+
19
+ before( :all ) do
20
+ setup_logging( :fatal )
21
+ end
22
+
23
+ after( :all ) do
24
+ reset_logging()
25
+ end
26
+
27
+ before( :each ) do
28
+ @attribute_object = mock( "template attribute" )
29
+ end
30
+
31
+
32
+ it "URI encodes the results of rendering" do
33
+ template = Inversion::Template.new( 'this is<?uriencode foo.bar ?>' )
34
+ template.foo = @attribute_object
35
+ @attribute_object.should_receive( :bar ).with( no_args() ).
36
+ and_return( " 25% Sparta!" )
37
+
38
+ template.render.should == "this is%2025%25%20Sparta%21"
39
+ end
40
+
41
+ it "stringifies its content before encoding" do
42
+ template = Inversion::Template.new( '<?uriencode foo.bar ?> bottles of beer on the wall' )
43
+ template.foo = @attribute_object
44
+ @attribute_object.should_receive( :bar ).with( no_args() ).
45
+ and_return( 99.999 )
46
+
47
+ template.render.should == "99.999 bottles of beer on the wall"
48
+ end
49
+ end
@@ -0,0 +1,54 @@
1
+ #!/usr/bin/env rspec -cfd -b
2
+ # vim: set noet nosta sw=4 ts=4 :
3
+
4
+ BEGIN {
5
+ require 'pathname'
6
+ basedir = Pathname( __FILE__ ).dirname.parent.parent.parent
7
+ libdir = basedir + 'lib'
8
+
9
+ $LOAD_PATH.unshift( basedir.to_s ) unless $LOAD_PATH.include?( basedir.to_s )
10
+ $LOAD_PATH.unshift( libdir.to_s ) unless $LOAD_PATH.include?( libdir.to_s )
11
+ }
12
+
13
+ require 'rspec'
14
+ require 'spec/lib/helpers'
15
+ require 'inversion/template/yieldtag'
16
+
17
+ describe Inversion::Template::YieldTag do
18
+
19
+ before( :all ) do
20
+ setup_logging( :fatal )
21
+ end
22
+
23
+ after( :all ) do
24
+ reset_logging()
25
+ end
26
+
27
+
28
+ it "calls the renderstate's block before rendering, and renders as its return value" do
29
+ tag = Inversion::Template::YieldTag.new
30
+ renderstate = Inversion::RenderState.new do |state|
31
+ :return_value
32
+ end
33
+ tag.before_rendering( renderstate )
34
+
35
+ rendered_output = renderstate.with_destination( [] ) do
36
+ renderstate << tag
37
+ end
38
+
39
+ rendered_output.should == [ :return_value ]
40
+ end
41
+
42
+ it "renders as nothing if there wasn't a render block" do
43
+ tag = Inversion::Template::YieldTag.new
44
+ renderstate = Inversion::RenderState.new
45
+ tag.before_rendering( renderstate )
46
+
47
+ rendered_output = renderstate.with_destination( [] ) do
48
+ renderstate << tag
49
+ end
50
+
51
+ rendered_output.should == [ nil ]
52
+ end
53
+
54
+ end
@@ -0,0 +1,269 @@
1
+ #!/usr/bin/env rspec -cfd -b
2
+ # vim: set noet nosta sw=4 ts=4 :
3
+
4
+ BEGIN {
5
+ require 'pathname'
6
+ basedir = Pathname( __FILE__ ).dirname.parent.parent
7
+ libdir = basedir + 'lib'
8
+
9
+ $LOAD_PATH.unshift( basedir.to_s ) unless $LOAD_PATH.include?( basedir.to_s )
10
+ $LOAD_PATH.unshift( libdir.to_s ) unless $LOAD_PATH.include?( libdir.to_s )
11
+ }
12
+
13
+ require 'rspec'
14
+ require 'stringio'
15
+
16
+ require 'spec/lib/helpers'
17
+ require 'inversion/template'
18
+
19
+ describe Inversion::Template do
20
+
21
+ before( :all ) do
22
+ setup_logging( :fatal )
23
+ end
24
+
25
+ it "can be loaded from a String" do
26
+ Inversion::Template.new( "a template" ).source.should == 'a template'
27
+ end
28
+
29
+ it "renders the source as-is if there are no instructions" do
30
+ Inversion::Template.new( "a template" ).render.should == 'a template'
31
+ end
32
+
33
+ it "renders when stringified" do
34
+ Inversion::Template.new( "a template" ).to_s.should == 'a template'
35
+ end
36
+
37
+ it "untaints template content loaded from a file" do
38
+ content = 'file contents'.taint
39
+ IO.should_receive( :read ).with( '/tmp/hooowat' ).and_return( content )
40
+
41
+ Inversion::Template.load( '/tmp/hooowat' ).source.should_not be_tainted()
42
+ end
43
+
44
+ it "calls before and after rendering hooks on all of its nodes when rendered" do
45
+ node = double( "fake node" )
46
+ parentstate = Inversion::RenderState.new( :foo => 'the merged stuff' )
47
+ tmpl = Inversion::Template.new( '' )
48
+ tmpl.node_tree << node
49
+
50
+ node.should_receive( :before_rendering ).with( an_instance_of(Inversion::RenderState) )
51
+ node.should_receive( :render ).with( an_instance_of(Inversion::RenderState) )
52
+ node.should_receive( :after_rendering ).with( an_instance_of(Inversion::RenderState) )
53
+
54
+ tmpl.render( parentstate )
55
+ end
56
+
57
+
58
+ it "passes the block it was rendered with to its RenderState" do
59
+ node = double( "fake node", :before_rendering => nil, :after_rendering => nil )
60
+ tmpl = Inversion::Template.new( '' )
61
+ tmpl.node_tree << node
62
+
63
+ renderblock = Proc.new {}
64
+ node.should_receive( :render ).and_return do |renderstate|
65
+ renderstate.block.should equal( renderblock )
66
+ end
67
+
68
+ tmpl.render( &renderblock )
69
+ end
70
+
71
+ it "can make an human-readable string version of itself suitable for debugging" do
72
+ IO.should_receive( :read ).with( '/tmp/inspect.tmpl' ).and_return( '<?attr foo ?>' )
73
+ tmpl = Inversion::Template.load( '/tmp/inspect.tmpl' )
74
+ tmpl.inspect.should =~ /Inversion::Template/
75
+ tmpl.inspect.should =~ %r{/tmp/inspect.tmpl}
76
+ tmpl.inspect.should =~ /attributes/
77
+ tmpl.inspect.should =~ /node_tree/
78
+ end
79
+
80
+ it "provides accessors for attributes that aren't identifiers in the template" do
81
+ tmpl = Inversion::Template.new( '' )
82
+ tmpl.foo = :bar
83
+ tmpl.foo.should == :bar
84
+ end
85
+
86
+
87
+ context "without template paths set" do
88
+
89
+ before( :each ) do
90
+ Inversion::Template.config[:template_paths].clear
91
+ end
92
+
93
+ it "instances can be loaded from an absolute path" do
94
+ IO.should_receive( :read ).with( '/tmp/hooowat' ).and_return( 'file contents' )
95
+ Inversion::Template.load( '/tmp/hooowat' ).source.should == 'file contents'
96
+ end
97
+
98
+ it "instances can be loaded from a path relative to the current working directory" do
99
+ tmplpath = Pathname.pwd + 'hooowat.tmpl'
100
+ FileTest.should_receive( :exist? ).with( tmplpath.to_s ).and_return( true )
101
+ IO.should_receive( :read ).with( tmplpath.to_s ).and_return( 'file contents' )
102
+ Inversion::Template.load( 'hooowat.tmpl' ).source.should == 'file contents'
103
+ end
104
+ end
105
+
106
+
107
+ context "with template paths set" do
108
+
109
+ before( :each ) do
110
+ Inversion::Template.config[:template_paths] = [ '/tmp', '/fun' ]
111
+ end
112
+
113
+ after( :each ) do
114
+ Inversion::Template.config[:template_paths].clear
115
+ end
116
+
117
+ it "instances can be loaded from an absolute path" do
118
+ FileTest.should_not_receive( :exist? )
119
+
120
+ IO.should_receive( :read ).with( '/tmp/hooowat' ).and_return( 'file contents' )
121
+ Inversion::Template.load( '/tmp/hooowat' ).source.should == 'file contents'
122
+ end
123
+
124
+ it "raises a runtime exception if unable to locate the template" do
125
+ tmplpath = Pathname.pwd + 'sadmanhose.tmpl'
126
+
127
+ FileTest.should_receive( :exist? ).with( '/tmp/sadmanhose.tmpl' ).and_return( false )
128
+ FileTest.should_receive( :exist? ).with( '/fun/sadmanhose.tmpl' ).and_return( false )
129
+ FileTest.should_receive( :exist? ).with( tmplpath.to_s ).and_return( false )
130
+
131
+ expect {
132
+ Inversion::Template.load( 'sadmanhose.tmpl' )
133
+ }.to raise_error( RuntimeError, /unable to find template ".+" within configured paths/i )
134
+ end
135
+
136
+ it "loads template relative to directories in the template_paths" do
137
+ FileTest.should_receive( :exist? ).with( '/tmp/hooowat.tmpl' ).and_return( false )
138
+ FileTest.should_receive( :exist? ).with( '/fun/hooowat.tmpl' ).and_return( true )
139
+ IO.should_receive( :read ).with( '/fun/hooowat.tmpl' ).and_return( 'file contents' )
140
+
141
+ Inversion::Template.load( 'hooowat.tmpl' ).source.should == 'file contents'
142
+ end
143
+
144
+ it "falls back to loading the template relative to the current working directory" do
145
+ tmplpath = Pathname.pwd + 'hooowat.tmpl'
146
+
147
+ FileTest.should_receive( :exist? ).with( '/tmp/hooowat.tmpl' ).and_return( false )
148
+ FileTest.should_receive( :exist? ).with( '/fun/hooowat.tmpl' ).and_return( false )
149
+ FileTest.should_receive( :exist? ).with( tmplpath.to_s ).and_return( true )
150
+ IO.should_receive( :read ).with( tmplpath.to_s ).and_return( 'file contents' )
151
+
152
+ Inversion::Template.load( 'hooowat.tmpl' ).source.should == 'file contents'
153
+ end
154
+ end
155
+
156
+
157
+ context "with an attribute PI" do
158
+
159
+ let( :template ) { Inversion::Template.new("<h1><?attr foo ?></h1>") }
160
+
161
+
162
+ it "has a reader for getting the attribute's value" do
163
+ template.should respond_to( :foo )
164
+ end
165
+
166
+ it "has an accessor for setting the attribute's value" do
167
+ template.should respond_to( :foo= )
168
+ end
169
+
170
+ it "renders scalar values set for the attribute" do
171
+ template.foo = "a lion"
172
+ template.render.should == "<h1>a lion</h1>"
173
+ end
174
+
175
+ it "renders an non-String value set for the attribute using #to_s" do
176
+ template.foo = [ 'a lion', 'a little guy', 'a bad mousie', 'one birdy' ]
177
+ template.render.should == %{<h1>a liona little guya bad mousieone birdy</h1>}
178
+ end
179
+ end
180
+
181
+
182
+ context "with several attribute PIs" do
183
+
184
+ let( :template ) { Inversion::Template.new("<h1><?attr foo ?> <?attr foo?> RUN!</h1>") }
185
+
186
+ it "has a reader for getting the attribute's value" do
187
+ template.should respond_to( :foo )
188
+ end
189
+
190
+ it "has an accessor for setting the attribute's value" do
191
+ template.should respond_to( :foo= )
192
+ end
193
+
194
+ it "renders scalar values set for the attribute(s)" do
195
+ template.foo = "lions!!"
196
+ template.render.should == "<h1>lions!! lions!! RUN!</h1>"
197
+ end
198
+ end
199
+
200
+
201
+ describe "Configurability support", :if => defined?( Configurability ) do
202
+
203
+ after( :each ) do
204
+ Inversion::Template.config = Inversion::Template::DEFAULT_CONFIG
205
+ end
206
+
207
+ it "is included in the list of configurable objects" do
208
+ Configurability.configurable_objects.should include( Inversion::Template )
209
+ end
210
+
211
+ it "can be configured using a Configurability::Config object" do
212
+ config = Configurability::Config.new( %{
213
+ ---
214
+ templates:
215
+ ignore_unknown_tags: false
216
+ debugging_comments: true
217
+ comment_start: "#"
218
+ comment_end: ""
219
+ }.gsub(/^\t{3}/, '') )
220
+
221
+ Inversion::Template.configure( config.templates )
222
+
223
+ Inversion::Template.config[:ignore_unknown_tags].should be_false()
224
+ Inversion::Template.config[:debugging_comments].should be_true()
225
+ Inversion::Template.config[:comment_start].should == '#'
226
+ Inversion::Template.config[:comment_end].should == ''
227
+
228
+ end
229
+
230
+ end
231
+
232
+
233
+ describe "exception-handling:" do
234
+
235
+ before( :each ) do
236
+ @source = "Some stuff\n<?call obj.raise_exception ?>\nMore stuff"
237
+ @tmpl = Inversion::Template.new( @source )
238
+
239
+ @obj = Object.new
240
+ def @obj.raise_exception
241
+ raise "Okay, here's an exception!"
242
+ end
243
+
244
+ @tmpl.obj = @obj
245
+ end
246
+
247
+ it "can be configured to completely ignore exceptions raised while rendering" do
248
+ @tmpl.options[:on_render_error] = :ignore
249
+ @tmpl.render.should == "Some stuff\nMore stuff"
250
+ end
251
+
252
+ it "can be configured to insert debugging comments for exceptions raised while rendering" do
253
+ @tmpl.options[:on_render_error] = :comment
254
+ @tmpl.render.should ==
255
+ "Some stuff\n<!-- RuntimeError: Okay, here's an exception! -->More stuff"
256
+ end
257
+
258
+ it "can be configured to propagate exceptions raised while rendering" do
259
+ @tmpl.options[:on_render_error] = :propagate
260
+ expect {
261
+ @tmpl.render
262
+ }.to raise_exception( RuntimeError, /Okay, here's an exception!/ )
263
+ end
264
+
265
+ end
266
+
267
+
268
+ end
269
+
@@ -0,0 +1,47 @@
1
+ #!/usr/bin/env rspec -cfd -b
2
+ # vim: set noet nosta sw=4 ts=4 :
3
+
4
+ BEGIN {
5
+ require 'pathname'
6
+ basedir = Pathname( __FILE__ ).dirname.parent.parent
7
+ libdir = basedir + 'lib'
8
+
9
+ $LOAD_PATH.unshift( basedir.to_s ) unless $LOAD_PATH.include?( basedir.to_s )
10
+ $LOAD_PATH.unshift( libdir.to_s ) unless $LOAD_PATH.include?( libdir.to_s )
11
+ }
12
+
13
+ require 'rspec'
14
+ require 'spec/lib/helpers'
15
+
16
+ begin
17
+ require 'inversion/tilt'
18
+ $tilt_support = true
19
+ rescue LoadError => err
20
+ warn "Tilt support testing disabled: %p: %s" % [ err.class, err.message ]
21
+ $tilt_support = false
22
+ end
23
+
24
+ describe "Tilt support", :if => $tilt_support do
25
+
26
+ before( :all ) do
27
+ setup_logging( :fatal )
28
+ end
29
+
30
+ it "registers itself with Tilt" do
31
+ Tilt['layout.tmpl'].should == Inversion::TiltWrapper
32
+ end
33
+
34
+ it "merges locals with template attributes upon evaluation" do
35
+ File.stub( :binread ).with( 'test.tmpl' ).and_return( '<?attr foo ?>' )
36
+ Tilt.new( 'test.tmpl' ).render( Object.new, :foo => 'Booyakasha!' ).should == 'Booyakasha!'
37
+ end
38
+
39
+ it "merges the 'scope' object if it responds_to #to_h" do
40
+ scope = Object.new
41
+ def scope.to_h; { :message => "Respek!" }; end
42
+ File.stub( :binread ).with( 'test.tmpl' ).and_return( '<?attr message ?>' )
43
+ Tilt.new( 'test.tmpl' ).render( scope, {} ).should == 'Respek!'
44
+ end
45
+
46
+ end
47
+
@@ -0,0 +1,95 @@
1
+ #!/usr/bin/env rspec -cfd -b
2
+ # vim: set noet nosta sw=4 ts=4 :
3
+
4
+ BEGIN {
5
+ require 'pathname'
6
+ basedir = Pathname( __FILE__ ).dirname.parent
7
+ libdir = basedir + 'lib'
8
+
9
+ $LOAD_PATH.unshift( basedir.to_s ) unless $LOAD_PATH.include?( basedir.to_s )
10
+ $LOAD_PATH.unshift( libdir.to_s ) unless $LOAD_PATH.include?( libdir.to_s )
11
+ }
12
+
13
+ require 'rspec'
14
+ require 'spec/lib/helpers'
15
+ require 'inversion'
16
+
17
+ describe Inversion do
18
+
19
+ before( :all ) do
20
+ @original_logger = Inversion.default_logger
21
+ @original_log_formatter = Inversion.default_log_formatter
22
+ setup_logging( :fatal )
23
+ end
24
+
25
+ after( :each ) do
26
+ Inversion.default_logger = @original_logger
27
+ Inversion.default_log_formatter = @original_log_formatter
28
+ reset_logging()
29
+ end
30
+
31
+
32
+ it "defines a version" do
33
+ Inversion::VERSION.should =~ /^\d+(\.\d+)*$/
34
+ end
35
+
36
+ describe "version methods" do
37
+
38
+ it "returns a version string if asked" do
39
+ Inversion.version_string.should =~ /\w+ [\d.]+/
40
+ end
41
+
42
+ it "returns a version string with a build number if asked" do
43
+ Inversion.version_string(true).should =~ /\w+ [\d.]+ \(build [[:xdigit:]]+\)/
44
+ end
45
+ end
46
+
47
+
48
+ describe " logging subsystem" do
49
+ before(:each) do
50
+ Inversion.reset_logger
51
+ end
52
+
53
+ after(:each) do
54
+ Inversion.reset_logger
55
+ end
56
+
57
+
58
+ it "knows if its default logger is replaced" do
59
+ Inversion.reset_logger
60
+ Inversion.should be_using_default_logger
61
+ Inversion.logger = Logger.new( $stderr )
62
+ Inversion.should_not be_using_default_logger
63
+ end
64
+
65
+ it "has the default logger instance after being reset" do
66
+ Inversion.logger.should equal( Inversion.default_logger )
67
+ end
68
+
69
+ it "has the default log formatter instance after being reset" do
70
+ Inversion.logger.formatter.should equal( Inversion.default_log_formatter )
71
+ end
72
+
73
+ end
74
+
75
+
76
+ describe " logging subsystem with new defaults" do
77
+ it "uses the new defaults when the logging subsystem is reset" do
78
+ logger = double( "dummy logger" )
79
+ formatter = double( "dummy logger" )
80
+
81
+ Inversion.default_logger = logger
82
+ Inversion.default_log_formatter = formatter
83
+
84
+ logger.should_receive( :formatter= ).with( formatter )
85
+ logger.should_receive( :level= ).with( Logger::WARN )
86
+
87
+ Inversion.reset_logger
88
+ Inversion.logger.should equal( logger )
89
+ end
90
+
91
+ end
92
+
93
+
94
+ end
95
+