-
-
Notifications
You must be signed in to change notification settings - Fork 2.6k
/
sequence.rb
70 lines (57 loc) · 1.17 KB
/
sequence.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
module FactoryBot
# Sequences are defined using sequence within a FactoryBot.define block.
# Sequence values are generated using next.
# @api private
class Sequence
attr_reader :name
def initialize(name, *args, &proc)
@name = name
@proc = proc
options = args.extract_options!
@value = args.first || 1
@aliases = options.fetch(:aliases) { [] }
unless @value.respond_to?(:peek)
@value = EnumeratorAdapter.new(@value)
end
end
def next(scope = nil)
if @proc && scope
scope.instance_exec(value, &@proc)
elsif @proc
@proc.call(value)
else
value
end
ensure
increment_value
end
def names
[@name] + @aliases
end
def rewind
@value.rewind
end
private
def value
@value.peek
end
def increment_value
@value.next
end
class EnumeratorAdapter
def initialize(value)
@first_value = value
@value = value
end
def peek
@value
end
def next
@value = @value.next
end
def rewind
@value = @first_value
end
end
end
end