diff --git a/Gemfile.lock b/Gemfile.lock index 55c1ed9..c2321e1 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - crono (0.8.5.pre) + crono (0.8.7.pre) activejob (~> 4.0) activerecord (~> 4.0) activesupport (~> 4.0) @@ -31,7 +31,7 @@ GEM columnize (= 0.9.0) columnize (0.9.0) diff-lcs (1.2.5) - globalid (0.3.3) + globalid (0.3.5) activesupport (>= 4.1.0) haml (4.0.6) tilt diff --git a/lib/crono/cli.rb b/lib/crono/cli.rb index 478c755..aa7eb98 100644 --- a/lib/crono/cli.rb +++ b/lib/crono/cli.rb @@ -62,7 +62,7 @@ module Crono logger.info 'Jobs:' Crono.scheduler.jobs.each do |job| logger.info "'#{job.performer}' with rule '#{job.period.description}'"\ - "next time will perform at #{job.next}" + " next time will perform at #{job.next}" end end @@ -80,9 +80,9 @@ module Crono end def start_working_loop - while true + loop do next_time, jobs = Crono.scheduler.next_jobs - sleep(next_time - Time.now) + sleep(next_time - Time.now) if next_time > Time.now jobs.each(&:perform) end end diff --git a/lib/crono/job.rb b/lib/crono/job.rb index 24a7922..276e373 100644 --- a/lib/crono/job.rb +++ b/lib/crono/job.rb @@ -60,9 +60,7 @@ module Crono end def perform_job - performer_instance = performer.new - performer_instance.instance_variable_set(:@_crono_job, self) - performer_instance.perform + performer.new.perform finished_time_sec = format('%.2f', Time.now - last_performed_at) rescue StandardError => e handle_job_fail(e, finished_time_sec) diff --git a/lib/crono/period.rb b/lib/crono/period.rb index 31a99f3..661cd88 100644 --- a/lib/crono/period.rb +++ b/lib/crono/period.rb @@ -1,5 +1,5 @@ module Crono - # Period describe frequency of performing a task + # Period describe frequency of jobs class Period DAYS = [:monday, :tuesday, :wednesday, :thursday, :friday, :saturday, :sunday] @@ -14,7 +14,9 @@ module Crono return initial_next unless since @next = @period.since(since) @next = @next.beginning_of_week.advance(days: @on) if @on - @next.change(time_atts) + @next = @next.change(time_atts) + return @next if @next.future? + Time.now end def description diff --git a/lib/crono/version.rb b/lib/crono/version.rb index 17b35a1..a191de3 100644 --- a/lib/crono/version.rb +++ b/lib/crono/version.rb @@ -1,3 +1,3 @@ module Crono - VERSION = '0.8.5.pre' + VERSION = '0.8.7.pre' end diff --git a/spec/job_spec.rb b/spec/job_spec.rb index 6eb8c45..029e50c 100644 --- a/spec/job_spec.rb +++ b/spec/job_spec.rb @@ -32,23 +32,10 @@ describe Crono::Job do expect(saved_log).to include 'Some error' end - xit 'should set Job#healthy to true if perform ok' do - class TestJob - def perform - @_crono_job - end - end - job.perform.join - end - it 'should set Job#healthy to false if perform with error' do failing_job.perform.join expect(failing_job.healthy).to be false end - - xit 'should set @_crono_job variable to instance' do - job.perform - end end describe '#description' do diff --git a/spec/period_spec.rb b/spec/period_spec.rb index bb7fa57..e396912 100644 --- a/spec/period_spec.rb +++ b/spec/period_spec.rb @@ -53,28 +53,33 @@ describe Crono::Period do end context 'in daily basis' do + it "should return Time.now if the next time in past" do + @period = Crono::Period.new(1.day, at: '06:00') + expect(@period.next(since: 2.days.ago)).to be_eql(Time.now) + end + it 'should return the time 2 days from now' do @period = Crono::Period.new(2.day) - expect(@period.next).to be_eql(2.day.from_now) + expect(@period.next).to be_eql(2.days.from_now) end it "should set time to 'at' time as a string" do time = 10.minutes.ago at = [time.hour, time.min].join(':') - @period = Crono::Period.new(2.day, at: at) - expect(@period.next).to be_eql(2.day.from_now.change(hour: time.hour, min: time.min)) + @period = Crono::Period.new(2.days, at: at) + expect(@period.next).to be_eql(2.days.from_now.change(hour: time.hour, min: time.min)) end it "should set time to 'at' time as a hash" do time = 10.minutes.ago at = { hour: time.hour, min: time.min } - @period = Crono::Period.new(2.day, at: at) - expect(@period.next).to be_eql(2.day.from_now.change(at)) + @period = Crono::Period.new(2.days, at: at) + expect(@period.next).to be_eql(2.days.from_now.change(at)) end it "should raise error when 'at' is wrong" do expect { - Crono::Period.new(2.day, at: 1) + Crono::Period.new(2.days, at: 1) }.to raise_error("Unknown 'at' format") end @@ -85,14 +90,14 @@ describe Crono::Period do end it 'should return time in relation to last time' do - @period = Crono::Period.new(2.day) + @period = Crono::Period.new(2.days) expect(@period.next(since: 1.day.ago)).to be_eql(1.day.from_now) end it 'should return today time if it is first run and not too late' do time = 10.minutes.from_now at = { hour: time.hour, min: time.min } - @period = Crono::Period.new(2.day, at: at) + @period = Crono::Period.new(2.days, at: at) expect(@period.next.utc.to_s).to be_eql(Time.now.change(at).utc.to_s) end end