Skip to content

Commit 5cda4b4

Browse files
authored
Merge pull request #11 from schwern/issue/#3
Make iterate a class method of TimeIterator
2 parents 492788d + f834835 commit 5cda4b4

File tree

4 files changed

+37
-33
lines changed

4 files changed

+37
-33
lines changed

lib/time_iterator.rb

Lines changed: 8 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -18,29 +18,17 @@ module TimeIterator
1818
}.freeze
1919
ITERATE_BY = (PERIODS.keys + PERIODS.values).freeze
2020

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
3024

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)
3326

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
3931
end
4032
end
4133
end
4234
end
43-
44-
class Time
45-
include TimeIterator
46-
end

lib/time_iterator/core_ext/time.rb

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,15 @@
11
# Inject convenience methods into Time.
22
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+
313
def beginning_of(period)
414
method_for_period(:beginning_of, period)
515
end

spec/time_iterator/core_ext/time_spec.rb

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,6 @@
11
RSpec.describe Time do
22
let(:time) { described_class.now }
33

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-
124
describe '#beginning_of' do
135
periods2methods = {
146
minute: :beginning_of_minute,
@@ -25,6 +17,10 @@
2517
expect(time.beginning_of(period)).to eq time.send(method)
2618
end
2719
end
20+
21+
it 'raises on invalid period' do
22+
expect { time.beginning_of(:time) }.to raise_error(ArgumentError)
23+
end
2824
end
2925

3026
describe '#end_of' do
@@ -43,6 +39,10 @@
4339
expect(time.end_of(period)).to eq time.send(method)
4440
end
4541
end
42+
43+
it 'raises on invalid period' do
44+
expect { time.end_of(:universe) }.to raise_error(ArgumentError)
45+
end
4646
end
4747

4848
describe '#days_in_month/year' do

spec/time_iterator_spec.rb

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,15 @@
11
RSpec.describe TimeIterator do
22
let(:time) { Time.now }
33

4-
describe '#iterate' do
4+
describe '.iterate' do
55
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)
713
end
814

915
[
@@ -12,20 +18,20 @@
1218
].each do |period|
1319
it "iterates by #{period}" do
1420
expect(
15-
time.iterate(by: period).take(3)
21+
described_class.iterate(time, by: period).take(3)
1622
).to eq [time, time + 1.send(period), time + 2.send(period)]
1723
end
1824
end
1925

2026
it 'iterates every X periods' do
2127
expect(
22-
time.iterate(by: :day, every: 3).take(3)
28+
described_class.iterate(time, by: :day, every: 3).take(3)
2329
).to eq [time, time + 3.days, time + 6.days]
2430
end
2531

2632
it 'does not alter the original time' do
2733
orig = time.clone
28-
time.iterate(by: :day).take(5)
34+
described_class.iterate(time, by: :day).take(5)
2935
expect( time ).to eq orig
3036
end
3137
end

0 commit comments

Comments
 (0)