File tree Expand file tree Collapse file tree 4 files changed +37
-33
lines changed Expand file tree Collapse file tree 4 files changed +37
-33
lines changed Original file line number Diff line number Diff line change @@ -18,29 +18,17 @@ module TimeIterator
18
18
} . freeze
19
19
ITERATE_BY = ( PERIODS . keys + PERIODS . values ) . freeze
20
20
21
- private def valid_period? ( period )
22
- raise ArgumentError , "Unknown time period: #{ period } " unless PERIODS . include? ( period )
23
- end
24
-
25
- private def method_for_period ( method , period )
26
- period = period . to_sym
27
- valid_period? ( period )
28
- send ( "#{ method } _#{ period } " )
29
- end
21
+ class << self
22
+ def iterate ( start , by :, every : 1 )
23
+ by = by . to_sym
30
24
31
- def iterate ( by :, every : 1 )
32
- by = by . to_sym
25
+ raise ArgumentError , "Unknown period to iterate by: #{ by } " unless ITERATE_BY . include? ( by )
33
26
34
- raise ArgumentError , "Unknown period to iterate by: #{ by } " unless ITERATE_BY . include? ( by )
35
-
36
- Enumerator . new do |block |
37
- ( 0 ..INFINITY ) . each do |num |
38
- block << ( self + ( num . send ( by ) * every ) )
27
+ Enumerator . new do |block |
28
+ ( 0 ..INFINITY ) . each do |num |
29
+ block << ( start + ( num . send ( by ) * every ) )
30
+ end
39
31
end
40
32
end
41
33
end
42
34
end
43
-
44
- class Time
45
- include TimeIterator
46
- end
Original file line number Diff line number Diff line change 1
1
# Inject convenience methods into Time.
2
2
class Time
3
+ private def valid_period? ( period )
4
+ raise ArgumentError , "Unknown time period: #{ period } " unless TimeIterator ::PERIODS . include? ( period )
5
+ end
6
+
7
+ private def method_for_period ( method , period )
8
+ period = period . to_sym
9
+ valid_period? ( period )
10
+ send ( "#{ method } _#{ period } " )
11
+ end
12
+
3
13
def beginning_of ( period )
4
14
method_for_period ( :beginning_of , period )
5
15
end
Original file line number Diff line number Diff line change 1
1
RSpec . describe Time do
2
2
let ( :time ) { described_class . now }
3
3
4
- describe 'period check' do
5
- it 'raises on invalid period' do
6
- expect { time . beginning_of ( :time ) } . to raise_error ( ArgumentError )
7
- expect { time . end_of ( :universe ) } . to raise_error ( ArgumentError )
8
- expect { time . iterate ( by : :colors ) } . to raise_error ( ArgumentError )
9
- end
10
- end
11
-
12
4
describe '#beginning_of' do
13
5
periods2methods = {
14
6
minute : :beginning_of_minute ,
25
17
expect ( time . beginning_of ( period ) ) . to eq time . send ( method )
26
18
end
27
19
end
20
+
21
+ it 'raises on invalid period' do
22
+ expect { time . beginning_of ( :time ) } . to raise_error ( ArgumentError )
23
+ end
28
24
end
29
25
30
26
describe '#end_of' do
43
39
expect ( time . end_of ( period ) ) . to eq time . send ( method )
44
40
end
45
41
end
42
+
43
+ it 'raises on invalid period' do
44
+ expect { time . end_of ( :universe ) } . to raise_error ( ArgumentError )
45
+ end
46
46
end
47
47
48
48
describe '#days_in_month/year' do
Original file line number Diff line number Diff line change 1
1
RSpec . describe TimeIterator do
2
2
let ( :time ) { Time . now }
3
3
4
- describe '# iterate' do
4
+ describe '. iterate' do
5
5
it 'uses an Enumerator' do
6
- expect ( time . iterate ( by : :day ) ) . to be_a ( Enumerator )
6
+ expect ( described_class . iterate ( time , by : :day ) ) . to be_a ( Enumerator )
7
+ end
8
+
9
+ it 'raises on an invalid period' do
10
+ expect do
11
+ described_class . iterate ( time , by : :colors )
12
+ end . to raise_error ( ArgumentError )
7
13
end
8
14
9
15
[
12
18
] . each do |period |
13
19
it "iterates by #{ period } " do
14
20
expect (
15
- time . iterate ( by : period ) . take ( 3 )
21
+ described_class . iterate ( time , by : period ) . take ( 3 )
16
22
) . to eq [ time , time + 1 . send ( period ) , time + 2 . send ( period ) ]
17
23
end
18
24
end
19
25
20
26
it 'iterates every X periods' do
21
27
expect (
22
- time . iterate ( by : :day , every : 3 ) . take ( 3 )
28
+ described_class . iterate ( time , by : :day , every : 3 ) . take ( 3 )
23
29
) . to eq [ time , time + 3 . days , time + 6 . days ]
24
30
end
25
31
26
32
it 'does not alter the original time' do
27
33
orig = time . clone
28
- time . iterate ( by : :day ) . take ( 5 )
34
+ described_class . iterate ( time , by : :day ) . take ( 5 )
29
35
expect ( time ) . to eq orig
30
36
end
31
37
end
You can’t perform that action at this time.
0 commit comments