test_bench-session 2.1.3.2 → 3.0.0.0.pre.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/test_bench/session/controls/backtrace/location.rb +46 -0
- data/lib/test_bench/session/controls/backtrace.rb +81 -0
- data/lib/test_bench/session/controls/comment_disposition.rb +15 -0
- data/lib/test_bench/session/controls/event.rb +27 -1
- data/lib/test_bench/session/controls/events/aborted.rb +49 -0
- data/lib/test_bench/session/controls/events/commented.rb +26 -76
- data/lib/test_bench/session/controls/events/context_finished.rb +68 -28
- data/lib/test_bench/session/controls/events/context_started.rb +17 -32
- data/lib/test_bench/session/controls/events/detailed.rb +26 -76
- data/lib/test_bench/session/controls/events/failed.rb +16 -24
- data/lib/test_bench/session/controls/events/file_executed.rb +99 -0
- data/lib/test_bench/session/controls/events/file_not_found.rb +39 -0
- data/lib/test_bench/session/controls/events/file_queued.rb +39 -0
- data/lib/test_bench/session/controls/events/skipped.rb +49 -0
- data/lib/test_bench/session/controls/events/test_finished.rb +48 -28
- data/lib/test_bench/session/controls/events/test_started.rb +17 -32
- data/lib/test_bench/session/controls/events.rb +19 -19
- data/lib/test_bench/session/controls/exception/message.rb +21 -0
- data/lib/test_bench/session/controls/exception/raise.rb +50 -0
- data/lib/test_bench/session/controls/exception.rb +55 -21
- data/lib/test_bench/session/controls/message.rb +41 -0
- data/lib/test_bench/session/controls/{time.rb → metadata.rb} +1 -1
- data/lib/test_bench/session/controls/path/apex_directory.rb +74 -0
- data/lib/test_bench/session/controls/path/file/create.rb +111 -0
- data/lib/test_bench/session/controls/path/file.rb +40 -0
- data/lib/test_bench/session/controls/path.rb +85 -0
- data/lib/test_bench/session/controls/random.rb +1 -1
- data/lib/test_bench/session/controls/result.rb +3 -11
- data/lib/test_bench/session/controls/{events/event_data.rb → sequence.rb} +4 -2
- data/lib/test_bench/session/controls/status.rb +90 -0
- data/lib/test_bench/session/controls/telemetry.rb +13 -0
- data/lib/test_bench/session/controls/telemetry_sink.rb +29 -1
- data/lib/test_bench/session/controls/text.rb +31 -0
- data/lib/test_bench/session/controls/title.rb +12 -12
- data/lib/test_bench/session/controls.rb +31 -26
- data/lib/test_bench/session/defaults.rb +15 -0
- data/lib/test_bench/session/events.rb +12 -15
- data/lib/test_bench/session/exception/format_backtrace/substitute.rb +32 -0
- data/lib/test_bench/session/exception/format_backtrace.rb +112 -0
- data/lib/test_bench/session/isolate/substitute.rb +43 -0
- data/lib/test_bench/session/isolate.rb +157 -0
- data/lib/test_bench/session/result.rb +42 -0
- data/lib/test_bench/session/session.rb +137 -164
- data/lib/test_bench/session/status.rb +58 -0
- data/lib/test_bench/session/substitute/sink.rb +30 -45
- data/lib/test_bench/session/substitute.rb +91 -52
- data/lib/test_bench/session/trace.rb +51 -0
- data/lib/test_bench/session.rb +15 -15
- metadata +53 -45
- data/lib/test_bench/session/controls/comment.rb +0 -105
- data/lib/test_bench/session/controls/detail.rb +0 -91
- data/lib/test_bench/session/controls/events/context_skipped.rb +0 -47
- data/lib/test_bench/session/controls/events/fixture_finished.rb +0 -53
- data/lib/test_bench/session/controls/events/fixture_started.rb +0 -47
- data/lib/test_bench/session/controls/events/test_skipped.rb +0 -47
- data/lib/test_bench/session/controls/failure.rb +0 -19
- data/lib/test_bench/session/controls/fixture.rb +0 -19
- data/lib/test_bench/session/controls/output/detail.rb +0 -29
- data/lib/test_bench/session/controls/output.rb +0 -55
- data/lib/test_bench/session/controls/process_id.rb +0 -7
- data/lib/test_bench/session/controls/substitute/path.rb +0 -33
- data/lib/test_bench/session/output/get.rb +0 -27
- data/lib/test_bench/session/output/writer/buffer/interactive/viewport.rb +0 -165
- data/lib/test_bench/session/output/writer/buffer/interactive.rb +0 -139
- data/lib/test_bench/session/output/writer/buffer.rb +0 -27
- data/lib/test_bench/session/output/writer/defaults.rb +0 -17
- data/lib/test_bench/session/output/writer/substitute.rb +0 -17
- data/lib/test_bench/session/output/writer.rb +0 -95
- data/lib/test_bench/session/output.rb +0 -384
- data/lib/test_bench/session/projection.rb +0 -28
- data/lib/test_bench/session/store.rb +0 -59
- data/lib/test_bench/session/substitute/path.rb +0 -63
@@ -1,95 +0,0 @@
|
|
1
|
-
module TestBench
|
2
|
-
class Session
|
3
|
-
class Output
|
4
|
-
class Writer < TestBench::Output::Writer
|
5
|
-
attr_accessor :peer
|
6
|
-
|
7
|
-
def alternate_device
|
8
|
-
@alternate_device ||= TestBench::Output::Device::Substitute.build
|
9
|
-
end
|
10
|
-
attr_writer :alternate_device
|
11
|
-
|
12
|
-
def indentation_depth
|
13
|
-
@indentation_depth ||= 0
|
14
|
-
end
|
15
|
-
attr_writer :indentation_depth
|
16
|
-
|
17
|
-
def configure
|
18
|
-
device = self.device
|
19
|
-
|
20
|
-
self.alternate_device = TestBench::Output::Device::Null.build
|
21
|
-
|
22
|
-
Buffer.configure(self, device:)
|
23
|
-
end
|
24
|
-
|
25
|
-
def self.follow(previous_writer)
|
26
|
-
device = previous_writer
|
27
|
-
|
28
|
-
alternate_device = previous_writer.peer
|
29
|
-
alternate_device ||= TestBench::Output::Device::Null.build
|
30
|
-
|
31
|
-
previous_digest = previous_writer.digest
|
32
|
-
digest = previous_digest.clone
|
33
|
-
|
34
|
-
writer = new
|
35
|
-
writer.sync = false
|
36
|
-
writer.device = device
|
37
|
-
writer.alternate_device = alternate_device
|
38
|
-
writer.styling_policy = previous_writer.styling_policy
|
39
|
-
writer.digest = digest
|
40
|
-
writer.sequence = previous_writer.sequence
|
41
|
-
writer.column_sequence = previous_writer.column_sequence
|
42
|
-
writer.indentation_depth = previous_writer.indentation_depth
|
43
|
-
writer.digest = previous_writer.digest.clone
|
44
|
-
writer
|
45
|
-
end
|
46
|
-
|
47
|
-
def branch
|
48
|
-
alternate = self.class.follow(self)
|
49
|
-
primary = self.class.follow(self)
|
50
|
-
|
51
|
-
primary.peer = alternate
|
52
|
-
|
53
|
-
return primary, alternate
|
54
|
-
end
|
55
|
-
|
56
|
-
def indent
|
57
|
-
indentation = ' ' * indentation_depth
|
58
|
-
|
59
|
-
print(indentation)
|
60
|
-
end
|
61
|
-
|
62
|
-
def flush
|
63
|
-
buffer.flush(device, alternate_device)
|
64
|
-
end
|
65
|
-
|
66
|
-
def write!(data)
|
67
|
-
device.write(data)
|
68
|
-
alternate_device.write(data)
|
69
|
-
end
|
70
|
-
|
71
|
-
def increase_indentation
|
72
|
-
self.indentation_depth += 1
|
73
|
-
end
|
74
|
-
alias :indent! :increase_indentation
|
75
|
-
|
76
|
-
def decrease_indentation
|
77
|
-
self.indentation_depth -= 1
|
78
|
-
end
|
79
|
-
alias :deindent! :decrease_indentation
|
80
|
-
|
81
|
-
def follows?(other_writer)
|
82
|
-
if sequence < other_writer.sequence
|
83
|
-
false
|
84
|
-
elsif device == other_writer
|
85
|
-
true
|
86
|
-
elsif device == other_writer.peer
|
87
|
-
true
|
88
|
-
else
|
89
|
-
false
|
90
|
-
end
|
91
|
-
end
|
92
|
-
end
|
93
|
-
end
|
94
|
-
end
|
95
|
-
end
|
@@ -1,384 +0,0 @@
|
|
1
|
-
module TestBench
|
2
|
-
class Session
|
3
|
-
class Output
|
4
|
-
include TestBench::Output
|
5
|
-
include Events
|
6
|
-
|
7
|
-
def pending_writer
|
8
|
-
@pending_writer ||= Writer::Substitute.build
|
9
|
-
end
|
10
|
-
attr_writer :pending_writer
|
11
|
-
|
12
|
-
def passing_writer
|
13
|
-
@passing_writer ||= Writer::Substitute.build
|
14
|
-
end
|
15
|
-
attr_writer :passing_writer
|
16
|
-
|
17
|
-
def failing_writer
|
18
|
-
@failing_writer ||= Writer::Substitute.build
|
19
|
-
end
|
20
|
-
attr_writer :failing_writer
|
21
|
-
|
22
|
-
def failures
|
23
|
-
@failures ||= 0
|
24
|
-
end
|
25
|
-
attr_writer :failures
|
26
|
-
|
27
|
-
def mode
|
28
|
-
@mode ||= Mode.initial
|
29
|
-
end
|
30
|
-
attr_writer :mode
|
31
|
-
|
32
|
-
def branch_count
|
33
|
-
@branch_count ||= 0
|
34
|
-
end
|
35
|
-
attr_writer :branch_count
|
36
|
-
|
37
|
-
def detail_policy
|
38
|
-
@detail_policy ||= Detail.default
|
39
|
-
end
|
40
|
-
alias :detail :detail_policy
|
41
|
-
attr_writer :detail_policy
|
42
|
-
|
43
|
-
def configure(detail: nil, **arguments)
|
44
|
-
if not detail.nil?
|
45
|
-
self.detail_policy = detail
|
46
|
-
end
|
47
|
-
|
48
|
-
Writer.configure(self, **arguments, attr_name: :pending_writer)
|
49
|
-
end
|
50
|
-
|
51
|
-
def receive(event_data)
|
52
|
-
case event_data.type
|
53
|
-
when ContextStarted.event_type, TestStarted.event_type
|
54
|
-
branch
|
55
|
-
end
|
56
|
-
|
57
|
-
if initial?
|
58
|
-
handle(event_data)
|
59
|
-
|
60
|
-
else
|
61
|
-
self.mode = Mode.failing
|
62
|
-
handle(event_data)
|
63
|
-
|
64
|
-
self.mode = Mode.passing
|
65
|
-
handle(event_data)
|
66
|
-
|
67
|
-
self.mode = Mode.pending
|
68
|
-
handle(event_data)
|
69
|
-
end
|
70
|
-
|
71
|
-
case event_data.type
|
72
|
-
when ContextFinished.event_type, TestFinished.event_type
|
73
|
-
_title, result = event_data.data
|
74
|
-
merge(result)
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
handle ContextStarted do |context_started|
|
79
|
-
title = context_started.title
|
80
|
-
|
81
|
-
if not title.nil?
|
82
|
-
writer.
|
83
|
-
indent.
|
84
|
-
style(:green).
|
85
|
-
puts(title)
|
86
|
-
|
87
|
-
writer.indent!
|
88
|
-
|
89
|
-
if branch_count == 1
|
90
|
-
self.failures = 0
|
91
|
-
end
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
handle ContextFinished do |context_finished|
|
96
|
-
title = context_finished.title
|
97
|
-
|
98
|
-
if not title.nil?
|
99
|
-
writer.deindent!
|
100
|
-
|
101
|
-
if branch_count == 1
|
102
|
-
writer.puts
|
103
|
-
|
104
|
-
if failing? && failures > 0
|
105
|
-
writer.
|
106
|
-
style(:bold, :red).
|
107
|
-
puts("Failure#{'s' if not failures == 1}: #{failures}")
|
108
|
-
|
109
|
-
writer.puts
|
110
|
-
end
|
111
|
-
end
|
112
|
-
end
|
113
|
-
end
|
114
|
-
|
115
|
-
handle ContextSkipped do |context_skipped|
|
116
|
-
title = context_skipped.title
|
117
|
-
|
118
|
-
if not writer.styling?
|
119
|
-
title = "#{title} (skipped)"
|
120
|
-
end
|
121
|
-
|
122
|
-
writer.
|
123
|
-
indent.
|
124
|
-
style(:yellow).
|
125
|
-
puts(title)
|
126
|
-
end
|
127
|
-
|
128
|
-
handle TestStarted do |test_started|
|
129
|
-
title = test_started.title
|
130
|
-
|
131
|
-
if title.nil?
|
132
|
-
if passing?
|
133
|
-
return
|
134
|
-
else
|
135
|
-
title = 'Test'
|
136
|
-
end
|
137
|
-
end
|
138
|
-
|
139
|
-
writer.indent
|
140
|
-
|
141
|
-
if passing?
|
142
|
-
writer.style(:green)
|
143
|
-
elsif failing?
|
144
|
-
if not writer.styling?
|
145
|
-
title = "#{title} (failed)"
|
146
|
-
end
|
147
|
-
|
148
|
-
writer.style(:bold, :red)
|
149
|
-
elsif pending?
|
150
|
-
writer.style(:faint)
|
151
|
-
end
|
152
|
-
|
153
|
-
writer.puts(title)
|
154
|
-
|
155
|
-
writer.indent!
|
156
|
-
end
|
157
|
-
|
158
|
-
handle TestFinished do |test_finished|
|
159
|
-
title = test_finished.title
|
160
|
-
|
161
|
-
if passing? && title.nil?
|
162
|
-
return
|
163
|
-
end
|
164
|
-
|
165
|
-
writer.deindent!
|
166
|
-
end
|
167
|
-
|
168
|
-
handle TestSkipped do |test_skipped|
|
169
|
-
title = test_skipped.title
|
170
|
-
|
171
|
-
if not writer.styling?
|
172
|
-
title = "#{title} (skipped)"
|
173
|
-
end
|
174
|
-
|
175
|
-
writer.
|
176
|
-
indent.
|
177
|
-
style(:yellow).
|
178
|
-
puts(title)
|
179
|
-
end
|
180
|
-
|
181
|
-
handle Failed do |failed|
|
182
|
-
message = failed.message
|
183
|
-
|
184
|
-
if failing?
|
185
|
-
self.failures += 1
|
186
|
-
end
|
187
|
-
|
188
|
-
writer
|
189
|
-
.indent
|
190
|
-
.style(:red)
|
191
|
-
.puts(message)
|
192
|
-
end
|
193
|
-
|
194
|
-
handle Detailed do |detailed|
|
195
|
-
if not detail?
|
196
|
-
return
|
197
|
-
end
|
198
|
-
|
199
|
-
text = detailed.text
|
200
|
-
quote = detailed.quote
|
201
|
-
heading = detailed.heading
|
202
|
-
|
203
|
-
comment(text, quote, heading)
|
204
|
-
end
|
205
|
-
|
206
|
-
handle Commented do |commented|
|
207
|
-
text = commented.text
|
208
|
-
quote = commented.quote
|
209
|
-
heading = commented.heading
|
210
|
-
|
211
|
-
comment(text, quote, heading)
|
212
|
-
end
|
213
|
-
|
214
|
-
def comment(text, quote, heading)
|
215
|
-
if not heading.nil?
|
216
|
-
writer.
|
217
|
-
indent.
|
218
|
-
style(:bold, :underline).
|
219
|
-
puts(heading)
|
220
|
-
|
221
|
-
if not writer.styling?
|
222
|
-
writer.
|
223
|
-
indent.
|
224
|
-
puts('- - -')
|
225
|
-
end
|
226
|
-
end
|
227
|
-
|
228
|
-
if text.empty?
|
229
|
-
writer.
|
230
|
-
indent.
|
231
|
-
style(:faint, :italic).
|
232
|
-
puts('(empty)')
|
233
|
-
return
|
234
|
-
end
|
235
|
-
|
236
|
-
if not quote
|
237
|
-
writer.
|
238
|
-
indent.
|
239
|
-
puts(text)
|
240
|
-
else
|
241
|
-
text.each_line(chomp: true) do |line|
|
242
|
-
writer.
|
243
|
-
indent
|
244
|
-
|
245
|
-
if writer.styling?
|
246
|
-
writer.
|
247
|
-
style(:white_bg).
|
248
|
-
print(' ').
|
249
|
-
style(:reset_bg).
|
250
|
-
print(' ')
|
251
|
-
else
|
252
|
-
writer.
|
253
|
-
print('> ')
|
254
|
-
end
|
255
|
-
|
256
|
-
writer.puts(line)
|
257
|
-
end
|
258
|
-
end
|
259
|
-
end
|
260
|
-
|
261
|
-
def current_writer
|
262
|
-
if initial? || pending?
|
263
|
-
pending_writer
|
264
|
-
elsif passing?
|
265
|
-
passing_writer
|
266
|
-
elsif failing?
|
267
|
-
failing_writer
|
268
|
-
end
|
269
|
-
end
|
270
|
-
alias :writer :current_writer
|
271
|
-
|
272
|
-
def branch
|
273
|
-
if branch_count.zero?
|
274
|
-
self.mode = Mode.pending
|
275
|
-
|
276
|
-
pending_writer.sync = false
|
277
|
-
|
278
|
-
parent_writer = pending_writer
|
279
|
-
else
|
280
|
-
parent_writer = passing_writer
|
281
|
-
end
|
282
|
-
|
283
|
-
self.branch_count += 1
|
284
|
-
|
285
|
-
self.passing_writer, self.failing_writer = parent_writer.branch
|
286
|
-
end
|
287
|
-
|
288
|
-
def merge(result)
|
289
|
-
self.branch_count -= 1
|
290
|
-
|
291
|
-
if not branched?
|
292
|
-
pending_writer.sync = true
|
293
|
-
|
294
|
-
self.mode = Mode.initial
|
295
|
-
end
|
296
|
-
|
297
|
-
if result
|
298
|
-
writer = passing_writer
|
299
|
-
else
|
300
|
-
writer = failing_writer
|
301
|
-
end
|
302
|
-
|
303
|
-
writer.flush
|
304
|
-
|
305
|
-
self.passing_writer = writer.device
|
306
|
-
self.failing_writer = writer.alternate_device
|
307
|
-
end
|
308
|
-
|
309
|
-
def branched?
|
310
|
-
branch_count > 0
|
311
|
-
end
|
312
|
-
|
313
|
-
def initial?
|
314
|
-
mode == Mode.initial
|
315
|
-
end
|
316
|
-
|
317
|
-
def pending?
|
318
|
-
mode == Mode.pending
|
319
|
-
end
|
320
|
-
|
321
|
-
def passing?
|
322
|
-
mode == Mode.passing
|
323
|
-
end
|
324
|
-
|
325
|
-
def failing?
|
326
|
-
mode == Mode.failing
|
327
|
-
end
|
328
|
-
|
329
|
-
def detail?
|
330
|
-
Detail.detail?(detail_policy, mode)
|
331
|
-
end
|
332
|
-
|
333
|
-
module Mode
|
334
|
-
def self.initial = :initial
|
335
|
-
def self.pending = :pending
|
336
|
-
def self.passing = :passing
|
337
|
-
def self.failing = :failing
|
338
|
-
end
|
339
|
-
|
340
|
-
module Detail
|
341
|
-
Error = Class.new(RuntimeError)
|
342
|
-
|
343
|
-
def self.detail?(policy, mode)
|
344
|
-
assure_detail(policy, mode)
|
345
|
-
end
|
346
|
-
|
347
|
-
def self.assure_detail(policy, mode=nil)
|
348
|
-
mode ||= Mode.initial
|
349
|
-
|
350
|
-
case policy
|
351
|
-
when on
|
352
|
-
true
|
353
|
-
when off
|
354
|
-
false
|
355
|
-
when failure
|
356
|
-
if mode == Mode.failing || mode == Mode.initial
|
357
|
-
true
|
358
|
-
else
|
359
|
-
false
|
360
|
-
end
|
361
|
-
else
|
362
|
-
raise Error, "Unknown detail policy #{policy.inspect}"
|
363
|
-
end
|
364
|
-
end
|
365
|
-
|
366
|
-
def self.on = :on
|
367
|
-
def self.off = :off
|
368
|
-
def self.failure = :failure
|
369
|
-
|
370
|
-
def self.default
|
371
|
-
policy = ENV.fetch('TEST_BENCH_DETAIL') do
|
372
|
-
return default!
|
373
|
-
end
|
374
|
-
|
375
|
-
policy.to_sym
|
376
|
-
end
|
377
|
-
|
378
|
-
def self.default!
|
379
|
-
:failure
|
380
|
-
end
|
381
|
-
end
|
382
|
-
end
|
383
|
-
end
|
384
|
-
end
|
@@ -1,28 +0,0 @@
|
|
1
|
-
module TestBench
|
2
|
-
class Session
|
3
|
-
class Projection
|
4
|
-
include Telemetry::Sink::Projection
|
5
|
-
include Events
|
6
|
-
|
7
|
-
receiver_name :session
|
8
|
-
|
9
|
-
apply Failed do
|
10
|
-
session.record_failure
|
11
|
-
end
|
12
|
-
|
13
|
-
apply TestSkipped do
|
14
|
-
session.record_skip
|
15
|
-
end
|
16
|
-
|
17
|
-
apply ContextSkipped do
|
18
|
-
session.record_skip
|
19
|
-
end
|
20
|
-
|
21
|
-
apply TestFinished do |test_finished|
|
22
|
-
if test_finished.result
|
23
|
-
session.record_assertion
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
@@ -1,59 +0,0 @@
|
|
1
|
-
module TestBench
|
2
|
-
class Session
|
3
|
-
class Store
|
4
|
-
PutError = Class.new(RuntimeError)
|
5
|
-
|
6
|
-
attr_accessor :put_session
|
7
|
-
|
8
|
-
def self.configure(receiver, attr_name: nil)
|
9
|
-
attr_name ||= :session_store
|
10
|
-
|
11
|
-
receiver.public_send(:"#{attr_name}=", instance)
|
12
|
-
end
|
13
|
-
|
14
|
-
def self.instance
|
15
|
-
@instance ||= new
|
16
|
-
end
|
17
|
-
|
18
|
-
def self.put(...) = instance.put(...)
|
19
|
-
def self.put?(...) = instance.put?(...)
|
20
|
-
def self.reset(...) = instance.reset(...)
|
21
|
-
def self.get(...) = instance.get(...)
|
22
|
-
def self.fetch(...) = instance.fetch(...)
|
23
|
-
|
24
|
-
def put(session)
|
25
|
-
if not put_session.nil?
|
26
|
-
raise PutError, "Already put a session"
|
27
|
-
end
|
28
|
-
|
29
|
-
self.put_session = session
|
30
|
-
end
|
31
|
-
|
32
|
-
def put?(session=nil)
|
33
|
-
if not session.nil?
|
34
|
-
put_session == session
|
35
|
-
else
|
36
|
-
!put_session.nil?
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
def reset(session=nil)
|
41
|
-
self.put_session = session
|
42
|
-
end
|
43
|
-
|
44
|
-
def get
|
45
|
-
put_session
|
46
|
-
end
|
47
|
-
|
48
|
-
def fetch
|
49
|
-
self.put_session ||= new_session
|
50
|
-
end
|
51
|
-
|
52
|
-
def new_session
|
53
|
-
Session.build do |telemetry|
|
54
|
-
Output.register_telemetry(telemetry)
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
@@ -1,63 +0,0 @@
|
|
1
|
-
module TestBench
|
2
|
-
class Session
|
3
|
-
module Substitute
|
4
|
-
class Path
|
5
|
-
def segments
|
6
|
-
@segments ||= []
|
7
|
-
end
|
8
|
-
attr_writer :segments
|
9
|
-
|
10
|
-
def match?(*segments, segment)
|
11
|
-
if not segment == self.segments.last
|
12
|
-
return false
|
13
|
-
end
|
14
|
-
|
15
|
-
segment_iterator = self.segments.to_enum
|
16
|
-
|
17
|
-
control_segments = [*segments, segment]
|
18
|
-
|
19
|
-
control_segments.all? do |control_segment|
|
20
|
-
begin
|
21
|
-
next_segment = segment_iterator.next
|
22
|
-
end until next_segment == control_segment
|
23
|
-
true
|
24
|
-
|
25
|
-
rescue StopIteration
|
26
|
-
false
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
def push_segment(segment)
|
31
|
-
segments << segment
|
32
|
-
end
|
33
|
-
alias :push :push_segment
|
34
|
-
alias :<< :push
|
35
|
-
|
36
|
-
def pop_segment(compare_segment=nil)
|
37
|
-
segments.pop
|
38
|
-
end
|
39
|
-
alias :pop :pop_segment
|
40
|
-
|
41
|
-
def copy(receiver)
|
42
|
-
path = self.class.new
|
43
|
-
|
44
|
-
segments.each do |segment|
|
45
|
-
path << segment
|
46
|
-
end
|
47
|
-
|
48
|
-
receiver.path = path
|
49
|
-
path
|
50
|
-
end
|
51
|
-
|
52
|
-
def eql?(compare)
|
53
|
-
if compare.is_a?(self.class)
|
54
|
-
segments == compare.segments
|
55
|
-
else
|
56
|
-
false
|
57
|
-
end
|
58
|
-
end
|
59
|
-
alias :== :eql?
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|