From 37facb43ba8c3ff590f72647a60fefc1ab3b81b9 Mon Sep 17 00:00:00 2001 From: Susan Wright Date: Tue, 26 Sep 2017 21:18:18 -0600 Subject: [PATCH 1/4] Add failing specs --- test/manager_test.rb | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/test/manager_test.rb b/test/manager_test.rb index c102c43..cb7937f 100644 --- a/test/manager_test.rb +++ b/test/manager_test.rb @@ -185,6 +185,32 @@ def assert_wont_run(t) assert_will_run 'jan 1 2010 18:10:00' assert_wont_run 'jan 1 2010 18:10:01' end + + it "once a day with :skip_first_run" do + @manager.every(5.minutes, 'myjob', :at => "16:20", :skip_first_run => true) + + assert_wont_run 'jan 1 2010 16:19:59' + assert_wont_run 'jan 1 2010 16:20:00' + assert_wont_run 'jan 1 2010 16:20:01' + assert_wont_run 'jan 2 2010 16:19:59' + assert_will_run 'jan 2 2010 16:20:00' + assert_will_run 'jan 3 2010 16:20:00' + end + + it "twice a day with :skip_first_run" do + @manager.every(1.day, 'myjob', :at => ['16:20', '18:10'], :skip_first_run => true) + + assert_wont_run 'jan 1 2010 16:19:59' + assert_will_run 'jan 1 2010 16:20:00' + assert_wont_run 'jan 1 2010 16:20:01' + + assert_wont_run 'jan 1 2010 18:09:59' + assert_will_run 'jan 1 2010 18:10:00' + assert_wont_run 'jan 1 2010 18:10:01' + + assert_will_run 'jan 2 2010 16:20:00' + assert_will_run 'jan 2 2010 18:10:00' + end end describe ':tz option' do From 5e1acaf720d9d4e3b844b9fd84a52b2145c61c51 Mon Sep 17 00:00:00 2001 From: Susan Wright Date: Tue, 3 Oct 2017 23:44:41 -0600 Subject: [PATCH 2/4] Move skip_first_run to manager --- lib/clockwork/event.rb | 6 +++--- lib/clockwork/manager.rb | 24 +++++++++++++++++++++++- test/manager_test.rb | 5 +++-- 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/lib/clockwork/event.rb b/lib/clockwork/event.rb index 0d7f333..848ee5e 100644 --- a/lib/clockwork/event.rb +++ b/lib/clockwork/event.rb @@ -1,6 +1,6 @@ module Clockwork class Event - attr_accessor :job, :last + attr_accessor :job, :last, :skip_first_run def initialize(manager, period, job, block, options={}) validate_if_option(options[:if]) @@ -12,8 +12,8 @@ def initialize(manager, period, job, block, options={}) @if = options[:if] @thread = options.fetch(:thread, @manager.config[:thread]) @timezone = options.fetch(:tz, @manager.config[:tz]) - @skip_first_run = options[:skip_first_run] - @last = @skip_first_run ? convert_timezone(Time.now) : nil + @skip_first_run = options.fetch(:skip_first_run, false) + @last = nil end def convert_timezone(t) diff --git a/lib/clockwork/manager.rb b/lib/clockwork/manager.rb index 55ec497..818faab 100644 --- a/lib/clockwork/manager.rb +++ b/lib/clockwork/manager.rb @@ -160,7 +160,10 @@ def log(msg) private def events_to_run(t) - @events.select{ |event| event.run_now?(t) } + events_to_run = @events.select{ |event| event.run_now?(t) } + puts "check" + puts events_to_run + clear_first_run_skips(events_to_run) end def register(period, job, block, options) @@ -176,5 +179,24 @@ def every_with_multiple_times(period, job, options={}, &block) register(period, job, block, each_options) end end + + def clear_first_run_skips(events_to_run) + skippable_events = events_to_run.select(&:skip_first_run) + return events_to_run if skippable_events.empty? + puts @events.select(&:skip_first_run) + events_to_run.reject!(&:skip_first_run) + skippable_events.each do |event| + clear_skips(event) + event.last = Time.now + end + events_to_run + end + + def clear_skips(event) + return unless event.skip_first_run + @events.select { |e| e.to_s == event.to_s }.each do |selected_event| + selected_event.skip_first_run = false + end + end end end diff --git a/test/manager_test.rb b/test/manager_test.rb index cb7937f..d31429a 100644 --- a/test/manager_test.rb +++ b/test/manager_test.rb @@ -2,6 +2,7 @@ require "minitest/autorun" require 'mocha/setup' require 'time' +require 'timecop' require 'active_support/time' describe Clockwork::Manager do @@ -198,10 +199,10 @@ def assert_wont_run(t) end it "twice a day with :skip_first_run" do - @manager.every(1.day, 'myjob', :at => ['16:20', '18:10'], :skip_first_run => true) + @manager.every(1.day, 'myjob', :at => ['18:10', '16:20'], :skip_first_run => true) assert_wont_run 'jan 1 2010 16:19:59' - assert_will_run 'jan 1 2010 16:20:00' + assert_wont_run 'jan 1 2010 16:20:00' assert_wont_run 'jan 1 2010 16:20:01' assert_wont_run 'jan 1 2010 18:09:59' From bc734b8a7252d9d18c7831e45102409ec49843ce Mon Sep 17 00:00:00 2001 From: Susan Wright Date: Wed, 4 Oct 2017 00:02:04 -0600 Subject: [PATCH 3/4] Add timecop for testing --- clockwork.gemspec | 1 + lib/clockwork/manager.rb | 3 --- test/manager_test.rb | 38 +++++++++++++++++++++----------------- 3 files changed, 22 insertions(+), 20 deletions(-) diff --git a/clockwork.gemspec b/clockwork.gemspec index 954dfe1..20eaea3 100644 --- a/clockwork.gemspec +++ b/clockwork.gemspec @@ -26,4 +26,5 @@ Gem::Specification.new do |s| s.add_development_dependency "minitest", "~> 5.8" s.add_development_dependency "mocha" s.add_development_dependency "test-unit" + s.add_development_dependency "timecop" end diff --git a/lib/clockwork/manager.rb b/lib/clockwork/manager.rb index 818faab..46467df 100644 --- a/lib/clockwork/manager.rb +++ b/lib/clockwork/manager.rb @@ -161,8 +161,6 @@ def log(msg) private def events_to_run(t) events_to_run = @events.select{ |event| event.run_now?(t) } - puts "check" - puts events_to_run clear_first_run_skips(events_to_run) end @@ -183,7 +181,6 @@ def every_with_multiple_times(period, job, options={}, &block) def clear_first_run_skips(events_to_run) skippable_events = events_to_run.select(&:skip_first_run) return events_to_run if skippable_events.empty? - puts @events.select(&:skip_first_run) events_to_run.reject!(&:skip_first_run) skippable_events.each do |event| clear_skips(event) diff --git a/test/manager_test.rb b/test/manager_test.rb index d31429a..48c3638 100644 --- a/test/manager_test.rb +++ b/test/manager_test.rb @@ -188,29 +188,33 @@ def assert_wont_run(t) end it "once a day with :skip_first_run" do - @manager.every(5.minutes, 'myjob', :at => "16:20", :skip_first_run => true) - - assert_wont_run 'jan 1 2010 16:19:59' - assert_wont_run 'jan 1 2010 16:20:00' - assert_wont_run 'jan 1 2010 16:20:01' - assert_wont_run 'jan 2 2010 16:19:59' - assert_will_run 'jan 2 2010 16:20:00' - assert_will_run 'jan 3 2010 16:20:00' + Timecop.travel Time.new(2010, 1, 1, 16, 19, 59) do + @manager.every(5.minutes, 'myjob', :at => "16:20", :skip_first_run => true) + + assert_wont_run 'jan 1 2010 16:19:59' + assert_wont_run 'jan 1 2010 16:20:00' + assert_wont_run 'jan 1 2010 16:20:01' + assert_wont_run 'jan 2 2010 16:19:59' + assert_will_run 'jan 2 2010 16:20:00' + assert_will_run 'jan 3 2010 16:20:00' + end end it "twice a day with :skip_first_run" do - @manager.every(1.day, 'myjob', :at => ['18:10', '16:20'], :skip_first_run => true) + Timecop.travel Time.new(2010, 1, 1, 16, 19, 59) do + @manager.every(1.day, 'myjob', :at => ['18:10', '16:20'], :skip_first_run => true) - assert_wont_run 'jan 1 2010 16:19:59' - assert_wont_run 'jan 1 2010 16:20:00' - assert_wont_run 'jan 1 2010 16:20:01' + assert_wont_run 'jan 1 2010 16:19:59' + assert_wont_run 'jan 1 2010 16:20:00' + assert_wont_run 'jan 1 2010 16:20:01' - assert_wont_run 'jan 1 2010 18:09:59' - assert_will_run 'jan 1 2010 18:10:00' - assert_wont_run 'jan 1 2010 18:10:01' + assert_wont_run 'jan 1 2010 18:09:59' + assert_will_run 'jan 1 2010 18:10:00' + assert_wont_run 'jan 1 2010 18:10:01' - assert_will_run 'jan 2 2010 16:20:00' - assert_will_run 'jan 2 2010 18:10:00' + assert_will_run 'jan 2 2010 16:20:00' + assert_will_run 'jan 2 2010 18:10:00' + end end end From 19006078f2fb3232f62c31b84bb82d444a772e1f Mon Sep 17 00:00:00 2001 From: Susan Wright Date: Wed, 4 Oct 2017 00:12:57 -0600 Subject: [PATCH 4/4] Remove unused specs in event_test --- test/database_events/test_helpers.rb | 2 +- test/event_test.rb | 37 ---------------------------- 2 files changed, 1 insertion(+), 38 deletions(-) diff --git a/test/database_events/test_helpers.rb b/test/database_events/test_helpers.rb index 7f25da0..f2fddcc 100644 --- a/test/database_events/test_helpers.rb +++ b/test/database_events/test_helpers.rb @@ -68,4 +68,4 @@ def name def if?(time) @if_state end -end \ No newline at end of file +end diff --git a/test/event_test.rb b/test/event_test.rb index 2ef77b6..566a426 100644 --- a/test/event_test.rb +++ b/test/event_test.rb @@ -34,41 +34,4 @@ end end end - - describe '#run_now?' do - before do - @manager = Class.new - @manager.stubs(:config).returns({}) - end - - describe 'event skip_first_run option set to true' do - it 'returns false on first attempt' do - event = Clockwork::Event.new(@manager, 1, nil, nil, :skip_first_run => true) - assert_equal false, event.run_now?(Time.now) - end - - it 'returns true on subsequent attempts' do - event = Clockwork::Event.new(@manager, 1, nil, nil, :skip_first_run => true) - # first run - event.run_now?(Time.now) - - # second run - assert_equal true, event.run_now?(Time.now + 1) - end - end - - describe 'event skip_first_run option not set' do - it 'returns true on first attempt' do - event = Clockwork::Event.new(@manager, 1, nil, nil) - assert_equal true, event.run_now?(Time.now + 1) - end - end - - describe 'event skip_first_run option set to false' do - it 'returns true on first attempt' do - event = Clockwork::Event.new(@manager, 1, nil, nil, :skip_first_run => false) - assert_equal true, event.run_now?(Time.now) - end - end - end end