From 44581782e48adab1a635cde74743dfee7f4bec09 Mon Sep 17 00:00:00 2001 From: Peter Boling Date: Sat, 3 Jun 2017 01:07:51 -0700 Subject: [PATCH] Lots of project cleanup --- .gitignore | 1 + clockwork.gemspec | 1 + lib/clockwork/at.rb | 5 +++-- lib/clockwork/at/failed_to_parse.rb | 5 +++++ lib/clockwork/database_events.rb | 12 +++++----- lib/clockwork/database_events/event.rb | 4 ---- .../database_events/event_collection.rb | 1 - lib/clockwork/database_events/event_store.rb | 6 ----- lib/clockwork/database_events/manager.rb | 3 --- lib/clockwork/database_events/synchronizer.rb | 6 ----- lib/clockwork/event.rb | 1 + lib/clockwork/manager.rb | 5 +++-- lib/clockwork/manager/no_handler_defined.rb | 6 +++++ .../support/active_record_fake.rb | 22 +++++++++---------- test/database_events/synchronizer_test.rb | 12 +++++----- test/database_events/test_helpers.rb | 18 ++++++++------- test/signal_test.rb | 2 +- 17 files changed, 54 insertions(+), 56 deletions(-) create mode 100644 lib/clockwork/at/failed_to_parse.rb create mode 100644 lib/clockwork/manager/no_handler_defined.rb diff --git a/.gitignore b/.gitignore index ccddd02..3cc79ce 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ tmp /.bundle Gemfile.lock .ruby-version +.byebug_history diff --git a/clockwork.gemspec b/clockwork.gemspec index 66c501e..3045513 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 "byebug" end diff --git a/lib/clockwork/at.rb b/lib/clockwork/at.rb index 19ca4f9..9f3880c 100644 --- a/lib/clockwork/at.rb +++ b/lib/clockwork/at.rb @@ -1,7 +1,7 @@ +require 'clockwork/at/failed_to_parse' + module Clockwork class At - class FailedToParse < StandardError; end - NOT_SPECIFIED = nil WDAYS = %w[sunday monday tuesday wednesday thursday friday saturday].each.with_object({}).with_index do |(w, wdays), index| [w, w.capitalize, w[0...3], w[0...3].capitalize].each do |k| @@ -53,6 +53,7 @@ def == other end private + def valid? @min == NOT_SPECIFIED || (0..59).cover?(@min) && @hour == NOT_SPECIFIED || (0..23).cover?(@hour) && diff --git a/lib/clockwork/at/failed_to_parse.rb b/lib/clockwork/at/failed_to_parse.rb new file mode 100644 index 0000000..13ff6f0 --- /dev/null +++ b/lib/clockwork/at/failed_to_parse.rb @@ -0,0 +1,5 @@ +module Clockwork + class At + class FailedToParse < StandardError; end + end +end diff --git a/lib/clockwork/database_events.rb b/lib/clockwork/database_events.rb index cc10caa..9df97a4 100644 --- a/lib/clockwork/database_events.rb +++ b/lib/clockwork/database_events.rb @@ -1,18 +1,18 @@ -require_relative 'database_events/event' -require_relative 'database_events/synchronizer' -require_relative 'database_events/event_store' -require_relative 'database_events/manager' +require 'clockwork/database_events/event' +require 'clockwork/database_events/synchronizer' +require 'clockwork/database_events/event_collection' +require 'clockwork/database_events/event_store' +require 'clockwork/database_events/manager' # TERMINOLOGY # -# For clarity, we have chosen to define terms as follows for better communication in the code, and when +# For clarity, we have chosen to define terms as follows for better communication in the code, and when # discussing the database event implementation. # # "Event": "Native" Clockwork events, whether Clockwork::Event or Clockwork::DatabaseEvents::Event # "Model": Database-backed model instances representing events to be created in Clockwork module Clockwork - module Methods def sync_database_events(options={}, &block) DatabaseEvents::Synchronizer.setup(options, &block) diff --git a/lib/clockwork/database_events/event.rb b/lib/clockwork/database_events/event.rb index 6f8d05f..8fcdde2 100644 --- a/lib/clockwork/database_events/event.rb +++ b/lib/clockwork/database_events/event.rb @@ -1,9 +1,6 @@ module Clockwork - module DatabaseEvents - class Event < Clockwork::Event - attr_accessor :event_store, :model_attributes def initialize(manager, period, job, block, event_store, model_attributes, options={}) @@ -29,6 +26,5 @@ def frequency @period end end - end end diff --git a/lib/clockwork/database_events/event_collection.rb b/lib/clockwork/database_events/event_collection.rb index 6e09139..a57803a 100644 --- a/lib/clockwork/database_events/event_collection.rb +++ b/lib/clockwork/database_events/event_collection.rb @@ -1,7 +1,6 @@ module Clockwork module DatabaseEvents class EventCollection - def initialize(manager=Clockwork.manager) @events = [] @manager = manager diff --git a/lib/clockwork/database_events/event_store.rb b/lib/clockwork/database_events/event_store.rb index 9a89e35..4e05c87 100644 --- a/lib/clockwork/database_events/event_store.rb +++ b/lib/clockwork/database_events/event_store.rb @@ -1,5 +1,3 @@ -require_relative './event_collection' - # How EventStore and Clockwork manager events are kept in sync... # # The normal Clockwork::Manager is responsible for keeping track of @@ -24,11 +22,8 @@ # - it creates a new DatabaseEvents::Event # - DatabaseEvents::Event#initialize registers it with the EventStore module Clockwork - module DatabaseEvents - class EventStore - def initialize(block_to_perform_on_event_trigger) @related_events = {} @block_to_perform_on_event_trigger = block_to_perform_on_event_trigger @@ -131,6 +126,5 @@ def at_strings_for(model) model.at.split(',').map(&:strip) end end - end end diff --git a/lib/clockwork/database_events/manager.rb b/lib/clockwork/database_events/manager.rb index 3231d6f..0c06368 100644 --- a/lib/clockwork/database_events/manager.rb +++ b/lib/clockwork/database_events/manager.rb @@ -1,9 +1,6 @@ module Clockwork - module DatabaseEvents - class Manager < Clockwork::Manager - def unregister(event) @events.delete(event) end diff --git a/lib/clockwork/database_events/synchronizer.rb b/lib/clockwork/database_events/synchronizer.rb index f635242..af37186 100644 --- a/lib/clockwork/database_events/synchronizer.rb +++ b/lib/clockwork/database_events/synchronizer.rb @@ -1,11 +1,6 @@ -require_relative '../database_events' - module Clockwork - module DatabaseEvents - class Synchronizer - def self.setup(options={}, &block_to_perform_on_event_trigger) model_class = options.fetch(:model) { raise KeyError, ":model must be set to the model class" } every = options.fetch(:every) { raise KeyError, ":every must be set to the database sync frequency" } @@ -18,6 +13,5 @@ def self.setup(options={}, &block_to_perform_on_event_trigger) end end end - end end diff --git a/lib/clockwork/event.rb b/lib/clockwork/event.rb index 50b197d..b57821e 100644 --- a/lib/clockwork/event.rb +++ b/lib/clockwork/event.rb @@ -50,6 +50,7 @@ def to_s end private + def execute @block.call(@job, @last) rescue => e diff --git a/lib/clockwork/manager.rb b/lib/clockwork/manager.rb index 55ec497..ffc9276 100644 --- a/lib/clockwork/manager.rb +++ b/lib/clockwork/manager.rb @@ -1,7 +1,7 @@ +require 'clockwork/manager/no_handler_defined' + module Clockwork class Manager - class NoHandlerDefined < RuntimeError; end - attr_reader :config def initialize @@ -159,6 +159,7 @@ def log(msg) end private + def events_to_run(t) @events.select{ |event| event.run_now?(t) } end diff --git a/lib/clockwork/manager/no_handler_defined.rb b/lib/clockwork/manager/no_handler_defined.rb new file mode 100644 index 0000000..b42cb79 --- /dev/null +++ b/lib/clockwork/manager/no_handler_defined.rb @@ -0,0 +1,6 @@ +module Clockwork + class Manager + class NoHandlerDefined < RuntimeError; end + end +end + diff --git a/test/database_events/support/active_record_fake.rb b/test/database_events/support/active_record_fake.rb index f0fea51..e5d1f47 100644 --- a/test/database_events/support/active_record_fake.rb +++ b/test/database_events/support/active_record_fake.rb @@ -1,12 +1,10 @@ module ActiveRecordFake - def self.included(base) base.instance_variable_set(:@items, []) - base.instance_variable_set(:@next_id, 1) + base.instance_variable_set(:@next_id, 1) base.extend(ClassMethods) end - attr_accessor :id def initialize options={} @@ -28,10 +26,10 @@ def attributes end module ClassMethods - def create *args - new *args + def create(*args) + new(*args) end - + def delete_all @items.clear reset_id @@ -41,8 +39,8 @@ def delete_all def all @items.dup end - - + + def add instance @items << instance end @@ -64,7 +62,7 @@ def reset_id private - def set_attribute_values_from_options options - options.each{|attr, value| self.send("#{attr}=".to_sym, value) } - end -end \ No newline at end of file + def set_attribute_values_from_options options + options.each{|attr, value| self.send("#{attr}=".to_sym, value) } + end +end diff --git a/test/database_events/synchronizer_test.rb b/test/database_events/synchronizer_test.rb index 210c4d1..b3d582d 100644 --- a/test/database_events/synchronizer_test.rb +++ b/test/database_events/synchronizer_test.rb @@ -2,6 +2,7 @@ require 'mocha/setup' require 'time' require 'active_support/time' +require 'byebug' require_relative '../../lib/clockwork' require_relative '../../lib/clockwork/database_events' @@ -164,7 +165,7 @@ def log(msg); end # silence log output end describe "when #name is defined" do - it 'runs daily event with at from databse only once' do + it 'runs daily event with at from database only once' do DatabaseEventModel.create(:frequency => 1.day, :at => next_minute(@now).strftime('%H:%M')) setup_sync(model: DatabaseEventModel, :every => @sync_frequency, :events_run => @events_run) @@ -176,7 +177,7 @@ def log(msg); end # silence log output end describe "when #name is not defined" do - it 'runs daily event with at from databse only once' do + it 'runs daily event with at from database only once' do DatabaseEventModelWithoutName.create(:frequency => 1.day, :at => next_minute(next_minute(@now)).strftime('%H:%M')) setup_sync(model: DatabaseEventModelWithoutName, :every => @sync_frequency, :events_run => @events_run) @@ -221,12 +222,13 @@ def log(msg); end # silence log output end it 'runs event only once within the model frequency period' do + # creates one immediately, and another in 5 minutes. DatabaseEventModel.create(:frequency => 5.minutes) setup_sync(model: DatabaseEventModel, :every => 1.minute, :events_run => @events_run) + # We will let 9 minutes pass, so the model will have been created 2x only. + tick_at(@now, :and_every_second_for => 9.minutes) - tick_at(@now, :and_every_second_for => 5.minutes) - - assert_equal 1, @events_run.length + assert_equal 2, @events_run.length end end diff --git a/test/database_events/test_helpers.rb b/test/database_events/test_helpers.rb index 7f25da0..1622909 100644 --- a/test/database_events/test_helpers.rb +++ b/test/database_events/test_helpers.rb @@ -33,22 +33,23 @@ def normalize_time t t.is_a?(String) ? Time.parse(t) : t end - class DatabaseEventModel include ActiveRecordFake - attr_accessor :name, :frequency, :at, :tz + attr_writer :name + attr_accessor :frequency, :at, :tz def name - @name || "#{self.class}:#{id}" + @name ||= "#{self.class}:#{id}" end end class DatabaseEventModel2 include ActiveRecordFake - attr_accessor :name, :frequency, :at, :tz + attr_writer :name + attr_accessor :frequency, :at, :tz def name - @name || "#{self.class}:#{id}" + @name ||= "#{self.class}:#{id}" end end @@ -59,13 +60,14 @@ class DatabaseEventModelWithoutName class DatabaseEventModelWithIf include ActiveRecordFake - attr_accessor :name, :frequency, :at, :tz, :if_state + attr_writer :name + attr_accessor :frequency, :at, :tz, :if_state def name - @name || "#{self.class}:#{id}" + @name ||= "#{self.class}:#{id}" end def if?(time) @if_state end -end \ No newline at end of file +end diff --git a/test/signal_test.rb b/test/signal_test.rb index 5f3c463..f741b2a 100644 --- a/test/signal_test.rb +++ b/test/signal_test.rb @@ -25,7 +25,7 @@ class SignalTest < Test::Unit::TestCase assert_equal 'done', File.read(LOGFILE) end - test 'should forcely shutdown with SIGINT' do + test 'should force shutdown with SIGINT' do Process.kill(:INT, @pid) sleep 0.2 assert_equal 'start', File.read(LOGFILE)