zorglub 0.0.9 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,13 +1,9 @@
1
1
  # -*- coding: UTF-8 -*-
2
- #
2
+
3
3
  module Zorglub
4
- #
5
4
  class Node
6
- #
7
5
  def session
8
6
  @request.session
9
7
  end
10
- #
11
8
  end
12
- #
13
9
  end
@@ -1,24 +1,24 @@
1
1
  # -*- coding: UTF-8 -*-
2
- #
2
+
3
3
  require 'securerandom'
4
- #
4
+
5
5
  module Zorglub
6
- #
6
+
7
7
  class Node
8
- #
8
+
9
9
  @sessions = {}
10
- #
10
+
11
11
  class << self
12
12
  attr_reader :sessions
13
13
  end
14
- #
14
+
15
15
  def session
16
16
  @session ||= SessionHash.new @request, @response, Node.sessions, app.opt(:session_options)
17
17
  end
18
18
  end
19
- #
19
+
20
20
  class SessionHash < Hash
21
- #
21
+
22
22
  def initialize req, resp, sessions, options
23
23
  @request = req
24
24
  @response = resp
@@ -27,49 +27,49 @@ module Zorglub
27
27
  @options = options
28
28
  super()
29
29
  end
30
- #
30
+
31
31
  def [] key
32
32
  load_data!
33
33
  super key
34
34
  end
35
- #
35
+
36
36
  def has_key? key
37
37
  load_data!
38
38
  super key
39
39
  end
40
40
  alias :key? :has_key?
41
41
  alias :include? :has_key?
42
- #
42
+
43
43
  def []= key, value
44
44
  load_data!
45
45
  super key, value
46
46
  end
47
- #
47
+
48
48
  def clear
49
49
  load_data!
50
- # @response.delete_cookie @options[:key]
51
- # @sessions.delete @sid
52
- # @sid = nil
50
+ # @response.delete_cookie @options[:key]
51
+ # @sessions.delete @sid
52
+ # @sid = nil
53
53
  super
54
54
  end
55
- #
55
+
56
56
  def to_hash
57
57
  load_data!
58
58
  h = {}.replace(self)
59
59
  h.delete_if { |k,v| v.nil? }
60
60
  h
61
61
  end
62
- #
62
+
63
63
  def update hash
64
64
  load_data!
65
65
  super stringify_keys(hash)
66
66
  end
67
- #
67
+
68
68
  def delete key
69
69
  load_data!
70
70
  super key
71
71
  end
72
- #
72
+
73
73
  def inspect
74
74
  if loaded?
75
75
  super
@@ -77,22 +77,22 @@ module Zorglub
77
77
  "#<#{self.class}:0x#{self.object_id.to_s(16)} not yet loaded>"
78
78
  end
79
79
  end
80
- #
80
+
81
81
  def exists?
82
82
  ( loaded? ? @sessions.has_key?(@sid) : false )
83
83
  end
84
- #
84
+
85
85
  def loaded?
86
86
  not @sid.nil?
87
87
  end
88
- #
88
+
89
89
  def empty?
90
90
  load_data!
91
91
  super
92
92
  end
93
- #
93
+
94
94
  private
95
- #
95
+
96
96
  def load_data!
97
97
  return if loaded?
98
98
  if @options[:enabled]
@@ -106,7 +106,7 @@ module Zorglub
106
106
  @sid = sid
107
107
  end
108
108
  end
109
- #
109
+
110
110
  def stringify_keys other
111
111
  hash = {}
112
112
  other.each do |key, value|
@@ -114,12 +114,12 @@ module Zorglub
114
114
  end
115
115
  hash
116
116
  end
117
- #
117
+
118
118
  def generate_sid!
119
119
  begin sid = sid_algorithm end while @sessions.has_key? sid
120
120
  sid
121
121
  end
122
- #
122
+
123
123
  begin
124
124
  require 'securerandom'
125
125
  # Using SecureRandom, optional length.
@@ -148,9 +148,5 @@ module Zorglub
148
148
  Digest::SHA2.hexdigest(entropy.join)
149
149
  end
150
150
  end
151
- #
152
151
  end
153
- #
154
152
  end
155
- #
156
- # EOF
@@ -1,43 +1,43 @@
1
1
  # -*- coding: UTF-8 -*-
2
- #
2
+
3
3
  require 'spec_helper'
4
- #
4
+
5
5
  describe Zorglub do
6
- #
6
+
7
7
  describe Zorglub::App do
8
- #
8
+
9
9
  it "map should add a mapped node" do
10
- APP.at("/temp").should be_nil
10
+ expect(APP.at("/temp")).to be_nil
11
11
  APP.map "/temp", Temp
12
- APP.at("/temp").should be Temp
12
+ expect(APP.at("/temp")).to be Temp
13
13
  end
14
- #
14
+
15
15
  it "delete should delete a mapped node" do
16
- APP.at("/temp").should be Temp
16
+ expect(APP.at("/temp")).to be Temp
17
17
  APP.delete "/temp"
18
- APP.at("/temp").should be_nil
18
+ expect(APP.at("/temp")).to be_nil
19
19
  end
20
- #
20
+
21
21
  it "at should return mapped node" do
22
- APP.at("/node1").should be Node1
22
+ expect(APP.at("/node1")).to be Node1
23
23
  end
24
- #
24
+
25
25
  it "at should return nil if no Node mapped" do
26
- APP.at("/none").should be_nil
26
+ expect(APP.at("/none")).to be_nil
27
27
  end
28
- #
28
+
29
29
  it "to should return path to node" do
30
- APP.to(Node1).should == "/node1"
30
+ expect(APP.to(Node1)).to eq "/node1"
31
31
  end
32
- #
32
+
33
33
  it "to should return nil if not an existing Node" do
34
- APP.to(nil).should be_nil
34
+ expect(APP.to(nil)).to be_nil
35
35
  end
36
- #
36
+
37
37
  it "to_hash should return a correct hash" do
38
- APP.to_hash["/node1"].should be Node1
38
+ expect(APP.to_hash["/node1"]).to be Node1
39
39
  end
40
- #
40
+
41
41
  end
42
- #
42
+
43
43
  end
@@ -1,307 +1,315 @@
1
1
  # -*- coding: UTF-8 -*-
2
- #
2
+
3
3
  require 'spec_helper'
4
- #
4
+
5
5
  def clean_static_path
6
6
  static_base_path = Node0.app.static_base_path
7
7
  Dir.glob( File.join(static_base_path,'**','*') ).each do |f| File.unlink f if File.file? f end
8
8
  Dir.glob( File.join(static_base_path,'*') ).each do |d| Dir.rmdir d end
9
9
  Dir.rmdir static_base_path if File.directory? static_base_path
10
10
  end
11
- #
11
+
12
12
  describe Zorglub do
13
- #
13
+
14
14
  describe Zorglub::Node do
15
- #
15
+
16
16
  before(:all) do
17
17
  clean_static_path
18
18
  end
19
- #
19
+
20
20
  after(:all) do
21
21
  clean_static_path
22
22
  end
23
- #
23
+
24
24
  it "engine should return default Node's engine" do
25
- Node0.engine.should == Node0.app.opt(:engine)
25
+ expect(Node0.engine).to eq Node0.app.opt(:engine)
26
26
  end
27
- #
27
+
28
28
  it "layout should return default Node's layout" do
29
- Node0.layout.should == Node0.app.opt(:layout)
29
+ expect(Node0.layout).to eq Node0.app.opt(:layout)
30
30
  end
31
- #
31
+
32
32
  it "engine should return class defined Node's engine" do
33
- Node1.engine.should == "engine-1"
34
- Node3.engine.should == "engine-2"
33
+ expect(Node1.engine).to eq "engine-1"
34
+ expect(Node3.engine).to eq "engine-2"
35
35
  end
36
- #
36
+
37
37
  it "layout should return class defined Node's layout" do
38
- Node1.layout.should == "layout-1"
39
- Node3.layout.should == "layout-2"
38
+ expect(Node1.layout).to eq "layout-1"
39
+ expect(Node3.layout).to eq "layout-2"
40
40
  end
41
- #
41
+
42
42
  it "engine should return engine inherited from Node2" do
43
- Node2.engine.should == "engine-1"
43
+ expect(Node2.engine).to eq "engine-1"
44
44
  end
45
- #
45
+
46
46
  it "layout should return layout inherited from Node2" do
47
- Node2.layout.should == "layout-1"
47
+ expect(Node2.layout).to eq "layout-1"
48
48
  end
49
- #
49
+
50
50
  it "r should build a well formed path" do
51
- Node1.r(1,'arg2',"some").should == "/node1/1/arg2/some"
51
+ expect(Node1.r(1,'arg2',"some")).to eq "/node1/1/arg2/some"
52
52
  end
53
- #
53
+
54
54
  it "instance level map should work" do
55
55
  r = Node0.my_call '/with_2args/1/2'
56
56
  h = YAML.load r.body[0]
57
- h[:map].should == '/node0'
57
+ expect(h[:map]).to eq '/node0'
58
58
  end
59
- #
59
+
60
60
  it "should return err404 response when no method found" do
61
- Node0.respond_to?('noresponse').should be_false
61
+ expect(Node0.respond_to?('noresponse')).to be_falsey
62
62
  r = Node0.my_call '/noresponse'
63
- r.status.should == 404
63
+ expect(r.status).to eq 404
64
64
  end
65
- #
65
+
66
66
  it "simple method should respond" do
67
67
  r = Node0.my_call '/hello'
68
- r.status.should == 200
69
- r.body[0].should == 'world'
68
+ expect(r.status).to eq 200
69
+ expect(r.body[0]).to eq 'world'
70
70
  end
71
- #
71
+
72
72
  it "instance level args should work" do
73
73
  r = Node0.my_call '/with_2args/1/2'
74
74
  h = YAML.load r.body[0]
75
- h[:args][0].should == '1'
76
- h[:args][1].should == '2'
75
+ expect(h[:args][0]).to eq '1'
76
+ expect(h[:args][1]).to eq '2'
77
77
  end
78
- #
78
+
79
79
  it "should raise error when too much arguments" do
80
- lambda{ r = Node0.my_call '/with_2args/1/2/3' }.should raise_error ArgumentError
80
+ expect(lambda{ r = Node0.my_call '/with_2args/1/2/3' }).to raise_error ArgumentError
81
81
  end
82
- #
82
+
83
83
  it "layout proc, method level layout and engine definitions should work" do
84
84
  r = Node0.my_call '/index'
85
- r.status.should == 200
85
+ expect(r.status).to eq 200
86
86
  h = YAML.load r.body[0]
87
87
  ly = File.join Node0.app.layout_base_path, Node0.layout
88
88
  vu = File.join Node0.app.view_base_path, Node0.r, 'index'
89
- h[:path].should == ly
90
- h[:layout].should == ly
91
- h[:view].should == vu
89
+ expect(h[:path]).to eq ly
90
+ expect(h[:layout]).to eq ly
91
+ expect(h[:view]).to eq vu
92
92
  end
93
- #
93
+
94
94
  it "layout proc, method level layout and engine definitions should work" do
95
95
  r = Node1.my_call '/index'
96
- r.status.should == 200
96
+ expect(r.status).to eq 200
97
97
  h = YAML.load r.body[0]
98
98
  ly = File.join Node1.app.layout_base_path, 'main.spec'
99
99
  vu = File.join Node1.app.view_base_path, Node1.r, 'index.spec'
100
- h[:path].should == ly
101
- h[:layout].should == ly
102
- h[:view].should == vu
100
+ expect(h[:path]).to eq ly
101
+ expect(h[:layout]).to eq ly
102
+ expect(h[:view]).to eq vu
103
103
  end
104
- #
104
+
105
105
  it "before_all hook should work" do
106
106
  Node3.before = 0
107
107
  Node3.after = 0
108
- Node3.before.should == 0
109
- Node3.my_call '/index'
110
- Node3.before.should == 1
111
- Node3.my_call '/index'
112
- Node3.before.should == 2
113
- Node3.my_call '/index'
114
- Node3.before.should == 3
115
- end
116
- #
108
+ expect(Node3.before).to eq 0
109
+ expect(Node3.my_call_i('/index')).to eq 1
110
+ expect(Node3.before).to eq 1
111
+ expect(Node3.my_call_i('/index')).to eq 1
112
+ expect(Node3.before).to eq 2
113
+ expect(Node3.my_call_i('/index')).to eq 1
114
+ expect(Node3.before).to eq 3
115
+ end
116
+
117
117
  it "after_all hook should work" do
118
118
  Node3.before = 0
119
119
  Node3.after = 0
120
- Node3.after.should == 0
121
- Node3.my_call '/index'
122
- Node3.after.should == 1
123
- Node3.my_call '/index'
124
- Node3.after.should == 2
125
- Node3.my_call '/index'
126
- Node3.after.should == 3
127
- end
128
- #
120
+ expect(Node3.after).to eq 0
121
+ expect(Node3.my_call_i('/index')).to eq 1
122
+ expect(Node3.after).to eq 1
123
+ expect(Node3.my_call_i('/index')).to eq 1
124
+ expect(Node3.after).to eq 2
125
+ expect(Node3.my_call_i('/index')).to eq 1
126
+ expect(Node3.after).to eq 3
127
+ end
128
+
129
129
  it "inherited before_all hook should work" do
130
130
  Node3.before = 0
131
131
  Node3.after = 0
132
- Node3.before.should == 0
133
- Node8.my_call '/index'
134
- Node3.before.should == 1
135
- Node8.my_call '/index'
136
- Node3.before.should == 2
137
- Node8.my_call '/index'
138
- Node3.before.should == 3
139
- end
140
- #
132
+ expect(Node3.before).to eq 0
133
+ expect(Node8.my_call_i('/index')).to eq 1
134
+ expect(Node3.before).to eq 1
135
+ expect(Node8.my_call_i('/index')).to eq 1
136
+ expect(Node3.before).to eq 2
137
+ expect(Node8.my_call_i('/index')).to eq 1
138
+ expect(Node3.before).to eq 3
139
+ end
140
+
141
141
  it "inherited after_all hook should work" do
142
142
  Node3.before = 0
143
143
  Node3.after = 0
144
- Node3.after.should == 0
145
- Node8.my_call '/index'
146
- Node3.after.should == 1
147
- Node8.my_call '/index'
148
- Node3.after.should == 2
149
- Node8.my_call '/index'
150
- Node3.after.should == 3
151
- end
152
- #
144
+ expect(Node3.after).to eq 0
145
+ expect(Node8.my_call_i('/index')).to eq 1
146
+ expect(Node3.after).to eq 1
147
+ expect(Node8.my_call_i('/index')).to eq 1
148
+ expect(Node3.after).to eq 2
149
+ expect(Node8.my_call_i('/index')).to eq 1
150
+ expect(Node3.after).to eq 3
151
+ end
152
+
153
153
  it "should find view and layout and render them" do
154
154
  r = Node0.my_call '/do_render'
155
- r.status.should == 200
156
- r.body[0].should == "layout_start view_content layout_end"
155
+ expect(r.status).to eq 200
156
+ expect(r.body[0]).to eq "layout_start view_content layout_end"
157
157
  end
158
- #
158
+
159
159
  it "default mime-type should be text/html" do
160
160
  r = Node0.my_call '/index'
161
- r.header['Content-type'].should == 'text/html'
161
+ expect(r.header['Content-type']).to eq 'text/html'
162
162
  end
163
- #
163
+
164
164
  it "should be able to override mime-type" do
165
165
  r = Node0.my_call '/do_render'
166
- r.header['Content-type'].should == 'text/view'
166
+ expect(r.header['Content-type']).to eq 'text/view'
167
167
  end
168
- #
168
+
169
169
  it "should be able to override through rack response mime-type" do
170
170
  r = Node0.my_call '/do_content_type'
171
- r.header['Content-type'].should == 'text/mine'
171
+ expect(r.header['Content-type']).to eq 'text/mine'
172
172
  end
173
- #
173
+
174
174
  it "partial should render correctly" do
175
- Node0.partial({},:do_partial, 1, 2).should == 'partial_content'
175
+ expect(Node0.partial({},:do_partial, 1, 2)).to eq 'partial_content'
176
176
  end
177
- #
177
+
178
178
  it "method level view should work" do
179
- Node0.partial({},:other_view).should == 'partial_content'
179
+ expect(Node0.partial({},:other_view)).to eq 'partial_content'
180
180
  end
181
- #
181
+
182
182
  it "partial with hooks should be default" do
183
183
  Node3.before = 0
184
184
  Node3.after = 0
185
- Node3.partial({},:do_partial,1,2).should == 'partial_content'
186
- Node3.before.should == 1
187
- Node3.after.should == 1
185
+ expect(Node3.partial({},:do_partial,1,2)).to eq 'partial_content'
186
+ expect(Node3.before).to eq 1
187
+ expect(Node3.after).to eq 1
188
188
  end
189
- #
189
+
190
190
  it "partial without hooks should work" do
191
191
  Node3.before = 0
192
192
  Node3.after = 0
193
- Node3.partial({:no_hooks=>true},:do_partial,1,2).should == 'partial_content'
194
- Node3.before.should == 0
195
- Node3.after.should == 0
193
+ expect(Node3.partial({:no_hooks=>true},:do_partial,1,2)).to eq 'partial_content'
194
+ expect(Node3.before).to eq 0
195
+ expect(Node3.after).to eq 0
196
196
  end
197
- #
197
+
198
198
  it "static pages should be generated" do
199
199
  r = Node6.my_call '/do_static'
200
- r.body[0].should == 'VAL 1'
201
- r.header['Content-type'].should == 'text/static'
200
+ expect(r.body[0]).to eq 'VAL 1'
201
+ expect(r.header['Content-type']).to eq 'text/static'
202
202
  r = Node6.my_call '/do_static'
203
- r.body[0].should == 'VAL 1'
204
- r.header['Content-type'].should == 'text/static'
203
+ expect(r.body[0]).to eq 'VAL 1'
204
+ expect(r.header['Content-type']).to eq 'text/static'
205
205
  r = Node6.my_call '/do_static'
206
- r.body[0].should == 'VAL 1'
207
- r.header['Content-type'].should == 'text/static'
206
+ expect(r.body[0]).to eq 'VAL 1'
207
+ expect(r.header['Content-type']).to eq 'text/static'
208
208
  r = Node6.my_call '/no_static'
209
- r.body[0].should == 'VAL 4'
210
- r.header['Content-type'].should == 'text/static'
209
+ expect(r.body[0]).to eq 'VAL 4'
210
+ expect(r.header['Content-type']).to eq 'text/static'
211
211
  r = Node6.my_call '/do_static'
212
- r.body[0].should == 'VAL 1'
213
- r.header['Content-type'].should == 'text/static'
212
+ expect(r.body[0]).to eq 'VAL 1'
213
+ expect(r.header['Content-type']).to eq 'text/static'
214
214
  Node6.static! true, 0.000001
215
215
  sleep 0.0001
216
216
  r = Node6.my_call '/do_static'
217
- r.body[0].should == 'VAL 6'
218
- r.header['Content-type'].should == 'text/static'
217
+ expect(r.body[0]).to eq 'VAL 6'
218
+ expect(r.header['Content-type']).to eq 'text/static'
219
219
  end
220
- #
220
+
221
221
  it "redirect should work" do
222
222
  r = Node0.my_call '/do_redirect'
223
- r.status.should == 302
224
- r.header['location'].should == Node0.r(:do_partial,1,2,3)
223
+ expect(r.status).to eq 302
224
+ expect(r.header['location']).to eq Node0.r(:do_partial,1,2,3)
225
225
  end
226
- #
226
+
227
227
  it "no_layout! should be inherited" do
228
- Node5.layout.should be_nil
228
+ expect(Node5.layout).to be_nil
229
229
  end
230
- #
230
+
231
231
  it "cli_vals should be inherited and extended" do
232
232
  r = Node5.my_call '/index'
233
233
  vars = YAML.load r.body[0]
234
- vars.should == ['js0','js1','js3','jsx','css0','css1','css2']
235
- vars[7].should be_nil
234
+ expect(vars).to eq ['js0','js1','js3','jsx','css0','css1','css2']
235
+ expect(vars[7]).to be_nil
236
236
  end
237
- #
237
+
238
238
  it "cli_vals should be extended at method level" do
239
239
  r = Node4.my_call '/more'
240
240
  vars = YAML.load r.body[0]
241
- vars.should == ['js0','js1','js2']
242
- vars[3].should be_nil
241
+ expect(vars).to eq ['js0','js1','js2']
242
+ expect(vars[3]).to be_nil
243
243
  end
244
- #
244
+
245
245
  it "cli_vals should be untouched" do
246
246
  r = Node4.my_call '/index'
247
247
  vars = YAML.load r.body[0]
248
- vars.should == ['js0','js1']
249
- vars[2].should be_nil
248
+ expect(vars).to eq ['js0','js1']
249
+ expect(vars[2]).to be_nil
250
250
  r = Node5.my_call '/index'
251
251
  vars = YAML.load r.body[0]
252
- vars.should == ['js0','js1','js3','jsx','css0','css1','css2']
253
- vars[7].should be_nil
252
+ expect(vars).to eq ['js0','js1','js3','jsx','css0','css1','css2']
253
+ expect(vars[7]).to be_nil
254
254
  end
255
- #
255
+
256
256
  it "ext definition and file engine should work" do
257
257
  r = Node0.my_call '/xml_file'
258
- r.body[0].should == "<xml>file<\/xml>\n"
259
- r.header['Content-type'].should == 'application/xml'
258
+ expect(r.body[0]).to eq "<xml>file<\/xml>\n"
259
+ expect(r.header['Content-type']).to eq 'application/xml'
260
260
  r = Node0.my_call '/plain_file'
261
- r.body[0].should == "plain file\n"
262
- r.header['Content-type'].should == 'text/plain'
261
+ expect(r.body[0]).to eq "plain file\n"
262
+ expect(r.header['Content-type']).to eq 'text/plain'
263
263
  end
264
- #
264
+
265
265
  it "no view no layout should work as well" do
266
266
  r = Node0.my_call '/no_view_no_layout'
267
- r.body[0].should == "hello world"
267
+ expect(r.body[0]).to eq "hello world"
268
268
  end
269
- #
269
+
270
270
  it "haml engine should work" do
271
271
  Node0.app.opt! :engines_cache_enabled, false
272
272
  r = Node0.my_call '/engines/haml'
273
- r.body[0].should == "<h1>Hello world</h1>\n"
273
+ expect(r.body[0]).to eq "<h1>Hello world</h1>\n"
274
274
  Node0.app.opt! :engines_cache_enabled, true
275
275
  r = Node0.my_call '/engines/haml'
276
- r.body[0].should == "<h1>Hello world</h1>\n"
276
+ expect(r.body[0]).to eq "<h1>Hello world</h1>\n"
277
277
  end
278
- #
278
+
279
279
  it "sass engine should work" do
280
280
  Node0.app.opt! :engines_cache_enabled, true
281
281
  r = Node0.my_call '/engines/sass'
282
- r.body[0].should == "vbar{width:80%;height:23px}vbar ul{list-style-type:none}vbar li{float:left}vbar li a{font-weight:bold}\n"
282
+ expect(r.body[0]).to eq "vbar{width:80%;height:23px}vbar ul{list-style-type:none}vbar li{float:left}vbar li a{font-weight:bold}\n"
283
283
  Node0.app.opt! :engines_cache_enabled, false
284
284
  r = Node0.my_call '/engines/sass'
285
- r.body[0].should == "vbar{width:80%;height:23px}vbar ul{list-style-type:none}vbar li{float:left}vbar li a{font-weight:bold}\n"
285
+ expect(r.body[0]).to eq "vbar{width:80%;height:23px}vbar ul{list-style-type:none}vbar li{float:left}vbar li a{font-weight:bold}\n"
286
286
  end
287
- #
287
+
288
288
  it "view_base_path! should work" do
289
289
  r = Node7.my_call '/view_path'
290
290
  h = YAML.load r.body[0]
291
- h[:view].should == File.join(Node7.app.opt(:root), 'alt','do_render')
291
+ expect(h[:view]).to eq File.join(Node7.app.opt(:root), 'alt','do_render')
292
292
  end
293
- #
293
+
294
294
  it "layout_base_path! should work" do
295
295
  r = Node7.my_call '/view_path'
296
296
  h = YAML.load r.body[0]
297
- h[:layout].should == File.join(Node7.app.opt(:root), 'alt','layout','default')
297
+ expect(h[:layout]).to eq File.join(Node7.app.opt(:root), 'alt','layout','default')
298
298
  end
299
- #
299
+
300
300
  it "debug out should work" do
301
- APP.opt! :debug, true
302
- Node0.my_call '/hello'
303
- end
304
- #
301
+ stderr0= $stderr.dup
302
+ stderrs = StringIO.new
303
+ $stderr = stderrs
304
+ begin
305
+ APP.opt! :debug, true
306
+ Node0.my_call '/hello'
307
+ ensure
308
+ $stderr = stderr0
309
+ end
310
+ expect(stderrs.string.include?('spec/data/view/node0/hello')).to be true
311
+ end
312
+
305
313
  end
306
- #
314
+
307
315
  end