say_when 0.2.6 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 39f0c8806fd8c11484d52818cb71a42e71e60b62c8cf19af670f8db7e06d3c17
4
+ data.tar.gz: 2e22ba68d95307e93f019381399ed46b257d5170dc45f5d99fb06d8cb7832b48
5
+ SHA512:
6
+ metadata.gz: 9c11c37dea5355c17ac03ebfd589d769cd5526d11d34864b7890185e89aae593dfa92e58616dfa0305686c8885ac6eaaa65f955bf03d479c49151abe2385286a
7
+ data.tar.gz: 86790a64921d0f8cbbb92a11968bf036a76180c3d9fc40acec3cfd19a5e00e21c5a81f5e7029e3c23f0efbc8febc7bb8c2237f065b83e2788ac20f835e464c83
data/.gitignore CHANGED
@@ -3,4 +3,5 @@
3
3
  Gemfile.lock
4
4
  pkg/*
5
5
  *.DS_Store
6
- .rvmrc
6
+ spec/db/test.db
7
+ .ruby-version
data/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.8.7
4
+ script: bundle exec spec spec/
data/Gemfile CHANGED
@@ -2,3 +2,11 @@ source "http://rubygems.org"
2
2
 
3
3
  # Specify your gem's dependencies in say_when.gemspec
4
4
  gemspec
5
+
6
+ gem "rspec", "=1.3.2", git: 'https://github.com/makandra/rspec.git', branch: '1-3-lts'
7
+
8
+ git 'https://github.com/makandra/rails.git', :branch => '2-3-lts' do
9
+ gem 'rails', '~>2.3.18'
10
+ gem 'activesupport', :require => false
11
+ gem 'railslts-version', :require => false
12
+ end
data/Rakefile CHANGED
@@ -1 +1,9 @@
1
- require "bundler/gem_tasks"
1
+ require "bundler/gem_tasks"
2
+ require 'spec/rake/spectask'
3
+
4
+ desc "Run all tests"
5
+ Spec::Rake::SpecTask.new('test') do |t|
6
+ t.spec_files = FileList['spec/**/*_spec.rb']
7
+ end
8
+
9
+ task :default => :test
@@ -1,5 +1,5 @@
1
1
  class CreateSayWhenTables < ActiveRecord::Migration
2
-
2
+
3
3
  def self.up
4
4
 
5
5
  create_table :say_when_jobs, :force => true do |t|
@@ -35,11 +35,13 @@ class CreateSayWhenTables < ActiveRecord::Migration
35
35
  t.datetime :start_at
36
36
  t.datetime :end_at
37
37
  end
38
-
38
+
39
39
  add_index :say_when_jobs, :status
40
40
  add_index :say_when_jobs, :next_fire_at
41
+ add_index :say_when_jobs, [:next_fire_at, :status]
42
+ add_index :say_when_jobs, [:last_fire_at, :status]
41
43
  end
42
-
44
+
43
45
  def self.down
44
46
  drop_table :say_when_job_executions
45
47
  drop_table :say_when_jobs
@@ -7,8 +7,8 @@ module SayWhen
7
7
 
8
8
  @@scheduler = nil
9
9
  @@lock = nil
10
-
11
- attr_accessor :storage_strategy, :processor_class, :tick_length
10
+
11
+ attr_accessor :storage_strategy, :processor_class, :tick_length, :reset_acquired_length, :reset_next_at
12
12
 
13
13
  attr_accessor :running
14
14
 
@@ -40,11 +40,11 @@ module SayWhen
40
40
  def start
41
41
  self.scheduler.start
42
42
  end
43
-
44
43
  end
45
44
 
46
45
  def initialize
47
46
  self.tick_length = 1
47
+ self.reset_acquired_length = 3600
48
48
  end
49
49
 
50
50
  def processor
@@ -54,7 +54,7 @@ module SayWhen
54
54
  end
55
55
  @processor
56
56
  end
57
-
57
+
58
58
  def start
59
59
  logger.info "SayWhen::Scheduler starting"
60
60
 
@@ -63,47 +63,90 @@ module SayWhen
63
63
  trap("TERM", "EXIT")
64
64
 
65
65
  begin
66
-
67
66
  self.running = true
68
67
 
69
68
  logger.info "SayWhen::Scheduler running"
70
- job = nil
71
69
  while running
72
- begin
73
- time_now = Time.now
74
- logger.debug "SayWhen:: Looking for job that should be ready to fire before #{time_now}"
75
- job = job_class.acquire_next(time_now)
76
- if job.nil?
77
- logger.debug "SayWhen:: no jobs to acquire, sleep"
78
- sleep(tick_length)
79
- else
80
- logger.debug "SayWhen:: got a job: #{job.inspect}"
81
- # delegate processing the trigger to the processor
82
- self.processor.process(job)
83
- logger.debug "SayWhen:: job processed"
84
-
85
- # this should update next fire at, and put back in list of scheduled jobs
86
- job.fired(time_now)
87
- logger.debug "SayWhen:: job fired complete"
88
- end
89
- rescue Interrupt
90
- job_msg = job && " job:'#{job.inspect}'"
91
- logger.error "\nSayWhen:: Interrupt! #{job_msg}"
92
- exit
93
- rescue StandardError=>ex
94
- job_msg = job && " job:'#{job.inspect}'"
95
- logger.error "SayWhen:: Failure to process#{job_msg}: #{ex.message}\n\t#{ex.backtrace.join("\t\n")}"
96
- job.release if job
97
- rescue Exception=>ex
98
- logger.error "SayWhen:: Exception in process#{job_msg}: #{ex.message}\n\t#{ex.backtrace.join("\t\n")}"
99
- exit
100
- end
70
+ process_jobs
101
71
  end
72
+ rescue Exception => ex
73
+ logger.error "SayWhen::Scheduler stopping, error: #{ex.class.name}: #{ex.message}"
74
+ exit
102
75
  end
103
76
 
104
77
  logger.info "SayWhen::Scheduler stopped"
105
78
  end
106
79
 
80
+ def process_waiting_jobs(max_jobs=1000)
81
+ jobs_processed = 0
82
+ while(jobs_processed < max_jobs)
83
+ if job = process_jobs
84
+ jobs_processed += 1
85
+ else
86
+ break
87
+ end
88
+ end
89
+ return jobs_processed
90
+ end
91
+
92
+ def process_jobs
93
+ job = nil
94
+ time_now = Time.now
95
+ self.reset_next_at ||= Time.now
96
+
97
+ if reset_acquired_length > 0 && reset_next_at <= time_now
98
+ self.reset_next_at = time_now + reset_acquired_length
99
+ logger.debug "SayWhen:: reset acquired at #{time_now}, try again at #{reset_next_at}"
100
+ job_class.reset_acquired(reset_acquired_length)
101
+ end
102
+
103
+ begin
104
+ logger.debug "SayWhen:: Looking for job that should be ready to fire before #{time_now}"
105
+ job = job_class.acquire_next(time_now)
106
+ rescue StandardError => ex
107
+ job_error("Failure to acquire job", job, ex)
108
+ job = nil
109
+ end
110
+
111
+ if job.nil?
112
+ logger.debug "SayWhen:: no jobs to acquire, sleep"
113
+ sleep(tick_length)
114
+ return job
115
+ end
116
+
117
+ begin
118
+ logger.debug "SayWhen:: got a job: #{job.inspect}"
119
+ # delegate processing the trigger to the processor
120
+ self.processor.process(job)
121
+ logger.debug "SayWhen:: job processed"
122
+
123
+ # if successful, update next fire at, put back to waiting / ended
124
+ job.fired(time_now)
125
+ logger.debug "SayWhen:: job fired complete"
126
+ rescue StandardError => ex
127
+ job_error("Failure to process", job, ex)
128
+ end
129
+
130
+ return job
131
+
132
+ rescue StandardError => ex
133
+ job_error("Error!", job, ex)
134
+ sleep(tick_length)
135
+ return job
136
+ rescue Interrupt => ex
137
+ job_error("Interrupt!", job, ex)
138
+ raise ex
139
+ rescue Exception => ex
140
+ job_error("Exception!", job, ex)
141
+ raise ex
142
+ end
143
+
144
+ def job_error(msg, job, ex)
145
+ job_msg = job && " job:'#{job.inspect}'"
146
+ logger.error "SayWhen::Scheduler #{msg}#{job_msg}: #{ex.message}\n\t#{ex.backtrace.join("\t\n")}"
147
+ job.release if job
148
+ end
149
+
107
150
  def stop
108
151
  logger.info "SayWhen::Scheduler stopping..."
109
152
  self.running = false
@@ -127,6 +170,5 @@ module SayWhen
127
170
  def logger
128
171
  SayWhen::logger
129
172
  end
130
-
131
173
  end
132
174
  end
@@ -8,18 +8,23 @@ module SayWhen
8
8
  module ActiveRecord
9
9
 
10
10
  class Job < ::ActiveRecord::Base
11
-
12
11
  include SayWhen::BaseJob
13
-
14
12
  self.table_name = "say_when_jobs"
15
-
16
-
17
13
  serialize :trigger_options
18
14
  serialize :data
19
15
  belongs_to :scheduled, :polymorphic => true
20
16
  has_many :job_executions, :class_name=>'SayWhen::Storage::ActiveRecord::JobExecution'
21
17
  before_create :set_defaults
22
18
 
19
+ def self.reset_acquired(older_than_seconds)
20
+ return unless older_than_seconds.to_i > 0
21
+ older_than = (Time.now - older_than_seconds.to_i)
22
+ update_all(
23
+ "status = '#{STATE_WAITING}'",
24
+ ["status = ? and updated_at < ?", STATE_ACQUIRED, older_than]
25
+ )
26
+ end
27
+
23
28
  def self.acquire_next(no_later_than)
24
29
  @next_job = nil
25
30
  hide_logging do
@@ -28,13 +33,13 @@ module SayWhen
28
33
  @next_job = find(:first,
29
34
  :lock => true,
30
35
  :order => 'next_fire_at ASC',
31
- :conditions => ['status = ? and ? >= next_fire_at',
36
+ :conditions => ['status = ? and ? >= next_fire_at',
32
37
  STATE_WAITING,
33
- no_later_than.in_time_zone('UTC')])
38
+ no_later_than])
34
39
 
35
40
  # set status to acquired to take it out of rotation
36
41
  @next_job.update_attribute(:status, STATE_ACQUIRED) unless @next_job.nil?
37
-
42
+
38
43
  end
39
44
  end
40
45
  @next_job
@@ -94,9 +99,9 @@ module SayWhen
94
99
  ::ActiveRecord::Base.logger = old_logger
95
100
  end
96
101
  end
97
-
102
+
98
103
  end
99
-
104
+
100
105
  end
101
106
  end
102
107
  end
@@ -17,21 +17,45 @@ module SayWhen
17
17
  has_properties :trigger_strategy, :trigger_options, :last_fire_at, :next_fire_at
18
18
  has_properties :job_class, :job_method, :data
19
19
  has_properties :scheduled
20
+ has_properties :updated_at
21
+
22
+ def self.class_lock
23
+ @@_lock ||= Mutex.new
24
+ end
25
+
26
+ def self._reset
27
+ @@jobs = SortedSet.new
28
+ end
29
+
30
+ def self.reset_acquired(older_than_seconds)
31
+ return unless older_than_seconds.to_i > 0
32
+ older_than = (Time.now - older_than_seconds.to_i)
33
+ self.class_lock.synchronize {
34
+ jobs.select do |j|
35
+ j.status == STATE_ACQUIRED && j.updated_at < older_than
36
+ end.each{ |j| j.status = STATE_WAITING }
37
+ }
38
+ end
20
39
 
21
40
  def self.acquire_next(no_later_than)
22
- self.lock.synchronize {
23
-
41
+ self.class_lock.synchronize {
42
+
24
43
  next_job = jobs.detect(nil) do |j|
25
44
  (j.status == STATE_WAITING) && (j.next_fire_at.to_i <= no_later_than.to_i)
26
45
  end
27
46
 
28
- next_job.status = STATE_ACQUIRED if next_job
47
+ if next_job
48
+ next_job.status = STATE_ACQUIRED
49
+ next_job.updated_at = Time.now
50
+ end
51
+
29
52
  next_job
30
- }
53
+ }
31
54
  end
32
55
 
33
56
  def initialize(options={})
34
57
  super
58
+ self.updated_at = Time.now
35
59
  self.status = STATE_WAITING unless self.status
36
60
  self.next_fire_at = trigger.next_fire_at
37
61
  self.class.jobs << self
@@ -41,6 +65,15 @@ module SayWhen
41
65
  self.next_fire_at.to_i <=> job.next_fire_at.to_i
42
66
  end
43
67
 
68
+ def fired(fired_at=Time.now)
69
+ super
70
+ self.updated_at = Time.now
71
+ end
72
+
73
+ def release
74
+ super
75
+ self.updated_at = Time.now
76
+ end
44
77
  end
45
78
 
46
79
  end
@@ -6,17 +6,4 @@ namespace :say_when do
6
6
  SayWhen::Scheduler.start
7
7
  end
8
8
 
9
- # # Preload app files if this is Rails
10
- # # thanks resque
11
- # task :preload => :setup do
12
- # if defined?(Rails) && Rails.respond_to?(:application)
13
- # # Rails 3
14
- # Rails.application.eager_load!
15
- # elsif defined?(Rails::Initializer)
16
- # # Rails 2.3
17
- # $rails_rake_task = false
18
- # Rails::Initializer.run :load_application_classes
19
- # end
20
- # end
21
-
22
- end
9
+ end
@@ -1,3 +1,3 @@
1
1
  module SayWhen
2
- VERSION = "0.2.6"
2
+ VERSION = "0.4.1"
3
3
  end
data/say_when.gemspec CHANGED
@@ -18,9 +18,7 @@ Gem::Specification.new do |s|
18
18
  s.add_development_dependency "activemessaging", '~> 0.9.0'
19
19
  s.add_development_dependency "activesupport", '~> 2.3.14'
20
20
  s.add_development_dependency "activerecord", '~> 2.3.14'
21
- s.add_development_dependency "mongoid", '~> 1.9.5'
22
- s.add_development_dependency 'rspec', "~> 1.3"
21
+ s.add_development_dependency 'rspec', '~> 1.3'
22
+ s.add_development_dependency 'rake', '~> 10.5.0'
23
23
  s.add_development_dependency 'sqlite3'
24
- s.add_development_dependency 'rake'
25
-
26
24
  end
@@ -1,8 +1,6 @@
1
1
  require 'active_record'
2
2
  require 'sqlite3'
3
3
 
4
- ActiveRecord::Base.logger = Logger.new(STDOUT)
5
-
6
4
  ActiveRecord::Base.establish_connection(
7
5
  :adapter => "sqlite3",
8
6
  :database => (File.dirname(__FILE__) + "/db/test.db")
data/spec/db/schema.rb CHANGED
@@ -28,9 +28,11 @@ ActiveRecord::Schema.define(:version => 0) do
28
28
  t.datetime :start_at
29
29
  t.datetime :end_at
30
30
  end
31
-
31
+
32
32
  add_index :say_when_jobs, :status
33
33
  add_index :say_when_jobs, :next_fire_at
34
+ add_index :say_when_jobs, [:next_fire_at, :status]
35
+ add_index :say_when_jobs, [:last_fire_at, :status]
34
36
 
35
37
 
36
- end
38
+ end
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/../spec_helper'
1
+ require_relative '../spec_helper'
2
2
 
3
3
  describe SayWhen::CronExpression do
4
4
 
@@ -1,7 +1,6 @@
1
-
2
- require File.dirname(__FILE__) + '/../../spec_helper'
3
- require File.dirname(__FILE__) + '/../../../lib/say_when/processor/active_messaging'
4
- require File.dirname(__FILE__) + '/../../../lib/say_when/storage/active_record/job'
1
+ require_relative '../../spec_helper'
2
+ require_relative '../../../lib/say_when/processor/active_messaging'
3
+ require_relative '../../../lib/say_when/storage/active_record/job'
5
4
 
6
5
  def destination(destination_name)
7
6
  d = ActiveMessaging::Gateway.find_destination(destination_name).value
@@ -1,5 +1,5 @@
1
- require File.dirname(__FILE__) + '/../spec_helper'
2
- require File.dirname(__FILE__) + '/../active_record_spec_helper'
1
+ require_relative '../spec_helper'
2
+ require_relative '../active_record_spec_helper'
3
3
 
4
4
  describe SayWhen::Scheduler do
5
5
 
@@ -25,6 +25,7 @@ describe SayWhen::Scheduler do
25
25
  scheduler.storage_strategy = :active_record
26
26
  scheduler.processor_class = SayWhen::Test::TestProcessor
27
27
  end
28
+ SayWhen::Storage::ActiveRecord::Job.delete_all
28
29
 
29
30
  job = SayWhen::Scheduler.schedule(
30
31
  :trigger_strategy => 'once',
@@ -35,6 +36,58 @@ describe SayWhen::Scheduler do
35
36
  job.should_not be_nil
36
37
  end
37
38
 
39
+ it "can process jobs when there are no jobs" do
40
+ SayWhen::Storage::ActiveRecord::Job.delete_all
41
+
42
+ SayWhen::Scheduler.configure do |scheduler|
43
+ scheduler.storage_strategy = :active_record
44
+ scheduler.processor_class = SayWhen::Test::TestProcessor
45
+ end
46
+ job = SayWhen::Scheduler.scheduler.process_jobs
47
+ job.should be_nil
48
+ end
49
+
50
+ it "can process jobs when there is a job" do
51
+ SayWhen::Storage::ActiveRecord::Job.delete_all
52
+
53
+ SayWhen::Scheduler.configure do |scheduler|
54
+ scheduler.storage_strategy = :active_record
55
+ scheduler.processor_class = SayWhen::Test::TestProcessor
56
+ end
57
+
58
+ job = SayWhen::Scheduler.schedule(
59
+ :trigger_strategy => 'once',
60
+ :trigger_options => {:at => 1.second.since},
61
+ :job_class => 'SayWhen::Test::TestTask',
62
+ :job_method => 'execute'
63
+ )
64
+ sleep(1)
65
+
66
+ processed_job = SayWhen::Scheduler.scheduler.process_jobs
67
+ processed_job.should_not be_nil
68
+ processed_job.should == job
69
+ end
70
+
71
+ it "can process multiple waiting jobs" do
72
+ SayWhen::Scheduler.configure do |scheduler|
73
+ scheduler.storage_strategy = :active_record
74
+ scheduler.processor_class = SayWhen::Test::TestProcessor
75
+ end
76
+ SayWhen::Storage::ActiveRecord::Job.delete_all
77
+
78
+ opts = {
79
+ :trigger_strategy => 'once',
80
+ :trigger_options => {:at => 1.seconds.since},
81
+ :job_class => 'SayWhen::Test::TestTask',
82
+ :job_method => 'execute'
83
+ }
84
+
85
+ 10.times{ SayWhen::Scheduler.schedule(opts) }
86
+ sleep(1)
87
+
88
+ job_count = SayWhen::Scheduler.scheduler.process_waiting_jobs(100)
89
+ job_count.should == 10
90
+ end
38
91
  end
39
92
 
40
93
  describe "instance methods" do
@@ -58,19 +111,16 @@ describe SayWhen::Scheduler do
58
111
  it "should start the scheduler running and stop it" do
59
112
  @scheduler.running.should be_false
60
113
 
61
- puts 'starting'
114
+ # puts 'starting'
62
115
  scheduler_thread = Thread.start{@scheduler.start}
63
- puts 'started'
116
+ # puts 'started'
64
117
  sleep(0.1)
65
118
  @scheduler.running.should == true
66
119
 
67
- puts 'stop'
120
+ # puts 'stop'
68
121
  @scheduler.stop
69
- puts 'wait for it'
122
+ # puts 'wait for it'
70
123
  @scheduler.running.should == false
71
124
  end
72
-
73
125
  end
74
-
75
-
76
126
  end
@@ -1,10 +1,12 @@
1
- require File.dirname(__FILE__) + '/../../../spec_helper'
2
- require File.dirname(__FILE__) + '/../../../active_record_spec_helper'
3
- require File.dirname(__FILE__) + '/../../../../lib/say_when/storage/active_record/job'
1
+ require_relative '../../../spec_helper'
2
+ require_relative '../../../active_record_spec_helper'
3
+ require_relative '../../../../lib/say_when/storage/active_record/job'
4
4
 
5
5
  describe SayWhen::Storage::ActiveRecord::Job do
6
6
 
7
7
  before(:each) do
8
+ SayWhen::Storage::ActiveRecord::Job.delete_all
9
+
8
10
  @valid_attributes = {
9
11
  :trigger_strategy => :cron,
10
12
  :trigger_options => {:expression => '0 0 12 ? * * *', :time_zone => 'Pacific Time (US & Canada)'},
@@ -48,18 +50,30 @@ describe SayWhen::Storage::ActiveRecord::Job do
48
50
  j.next_fire_at.should == ce.next_fire_at
49
51
  end
50
52
 
53
+ it "resets acquired jobs" do
54
+ old = 2.hours.ago
55
+ j = SayWhen::Storage::ActiveRecord::Job.create!(@valid_attributes.merge({
56
+ :status => 'acquired', :updated_at => old, :created_at => old
57
+ }))
58
+
59
+ SayWhen::Storage::ActiveRecord::Job.reset_acquired(3600)
60
+
61
+ j.reload
62
+ j.status.should == 'waiting'
63
+ end
64
+
51
65
  it "can find the next job" do
52
66
  j2_opts = {
53
67
  :trigger_strategy => :cron,
54
68
  :trigger_options => {:expression => '0 0 10 ? * * *', :time_zone => 'Pacific Time (US & Canada)'},
55
- :data => {:foo=>'bar', :result=>2},
69
+ :data => {:foo=>'can find the next job - j2', :result=>2},
56
70
  :job_class => 'SayWhen::Test::TestTask',
57
71
  :job_method => 'execute'
58
72
  }
59
73
 
60
74
  j1 = SayWhen::Storage::ActiveRecord::Job.create(@valid_attributes)
61
75
  j2 = SayWhen::Storage::ActiveRecord::Job.create(j2_opts)
62
- next_job = SayWhen::Storage::ActiveRecord::Job.acquire_next(1.day.since)
76
+ next_job = SayWhen::Storage::ActiveRecord::Job.acquire_next(25.hours.since)
63
77
  next_job.should == j2
64
78
  end
65
79
 
@@ -80,5 +94,4 @@ describe SayWhen::Storage::ActiveRecord::Job do
80
94
  j.last_fire_at.should == now
81
95
  j.status.should == SayWhen::BaseJob::STATE_WAITING
82
96
  end
83
-
84
97
  end
@@ -1,9 +1,10 @@
1
- require File.dirname(__FILE__) + '/../../../spec_helper'
2
- require File.dirname(__FILE__) + '/../../../../lib/say_when/storage/memory/job'
1
+ require_relative '../../../spec_helper'
2
+ require_relative '../../../../lib/say_when/storage/memory/job'
3
3
 
4
4
  describe SayWhen::Store::Memory::Job do
5
5
 
6
6
  before(:each) do
7
+ SayWhen::Store::Memory::Job._reset
7
8
  @valid_attributes = {
8
9
  :name => 'Memory::Job::Test',
9
10
  :group => 'Test',
@@ -28,4 +29,17 @@ describe SayWhen::Store::Memory::Job do
28
29
  j.execute.should == 1
29
30
  end
30
31
 
32
+ it "can reset acquired jobs" do
33
+ j = SayWhen::Store::Memory::Job.new(@valid_attributes)
34
+ j.status = 'acquired'
35
+ j.updated_at = 2.hours.ago
36
+ SayWhen::Store::Memory::Job.reset_acquired(3600)
37
+ j.status.should == 'waiting'
38
+ end
39
+
40
+ it "can find the next job" do
41
+ j = SayWhen::Store::Memory::Job.new(@valid_attributes)
42
+ next_job = SayWhen::Store::Memory::Job.acquire_next(1.day.since)
43
+ next_job.should == j
44
+ end
31
45
  end
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/../../../spec_helper'
1
+ require_relative '../../../spec_helper'
2
2
  # require File.dirname(__FILE__) + '/../../../../lib/say_when/store/memory/trigger'
3
3
 
4
4
  # describe SayWhen::Store::Memory::Trigger do
@@ -1,5 +1,5 @@
1
- require File.dirname(__FILE__) + '/../../spec_helper'
2
- require File.dirname(__FILE__) + '/../../../lib/say_when/triggers/once_strategy'
1
+ require_relative '../../spec_helper'
2
+ require_relative '../../../lib/say_when/triggers/once_strategy'
3
3
 
4
4
  describe SayWhen::Triggers::OnceStrategy do
5
5
 
data/spec/spec_helper.rb CHANGED
@@ -3,6 +3,7 @@ ENV['RAILS_ENV']='test'
3
3
  require "rubygems"
4
4
  require 'bundler/setup'
5
5
  require 'active_support'
6
+ require 'active_record'
6
7
 
7
8
  require 'spec'
8
9
  require 'spec/autorun'
@@ -10,8 +11,14 @@ require 'spec/autorun'
10
11
  $: << (File.dirname(__FILE__) + "/../lib")
11
12
  require "say_when"
12
13
 
14
+ logger = Logger.new(STDOUT)
15
+ logger.level = Logger::ERROR
16
+ SayWhen.logger = logger
17
+ ::ActiveRecord::Base.logger = logger
18
+
13
19
  Dir[File.expand_path(File.join(File.dirname(__FILE__),'support','**','*.rb'))].each {|f| require f}
14
20
 
21
+
15
22
  Spec::Runner.configure do |config|
16
23
  config.mock_with :rspec
17
24
  end
metadata CHANGED
@@ -1,140 +1,108 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: say_when
3
- version: !ruby/object:Gem::Version
4
- hash: 27
5
- prerelease:
6
- segments:
7
- - 0
8
- - 2
9
- - 6
10
- version: 0.2.6
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.4.1
11
5
  platform: ruby
12
- authors:
6
+ authors:
13
7
  - Andrew Kuklewicz
14
8
  autorequire:
15
9
  bindir: bin
16
10
  cert_chain: []
17
-
18
- date: 2012-10-30 00:00:00 Z
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
11
+ date: 2022-07-21 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
21
14
  name: activemessaging
22
- version_requirements: &id001 !ruby/object:Gem::Requirement
23
- none: false
24
- requirements:
25
- - - ~>
26
- - !ruby/object:Gem::Version
27
- hash: 59
28
- segments:
29
- - 0
30
- - 9
31
- - 0
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
32
19
  version: 0.9.0
33
20
  type: :development
34
21
  prerelease: false
35
- requirement: *id001
36
- - !ruby/object:Gem::Dependency
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.9.0
27
+ - !ruby/object:Gem::Dependency
37
28
  name: activesupport
38
- version_requirements: &id002 !ruby/object:Gem::Requirement
39
- none: false
40
- requirements:
41
- - - ~>
42
- - !ruby/object:Gem::Version
43
- hash: 31
44
- segments:
45
- - 2
46
- - 3
47
- - 14
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
48
33
  version: 2.3.14
49
34
  type: :development
50
35
  prerelease: false
51
- requirement: *id002
52
- - !ruby/object:Gem::Dependency
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 2.3.14
41
+ - !ruby/object:Gem::Dependency
53
42
  name: activerecord
54
- version_requirements: &id003 !ruby/object:Gem::Requirement
55
- none: false
56
- requirements:
57
- - - ~>
58
- - !ruby/object:Gem::Version
59
- hash: 31
60
- segments:
61
- - 2
62
- - 3
63
- - 14
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
64
47
  version: 2.3.14
65
48
  type: :development
66
49
  prerelease: false
67
- requirement: *id003
68
- - !ruby/object:Gem::Dependency
69
- name: mongoid
70
- version_requirements: &id004 !ruby/object:Gem::Requirement
71
- none: false
72
- requirements:
73
- - - ~>
74
- - !ruby/object:Gem::Version
75
- hash: 57
76
- segments:
77
- - 1
78
- - 9
79
- - 5
80
- version: 1.9.5
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 2.3.14
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.3'
81
62
  type: :development
82
63
  prerelease: false
83
- requirement: *id004
84
- - !ruby/object:Gem::Dependency
85
- name: rspec
86
- version_requirements: &id005 !ruby/object:Gem::Requirement
87
- none: false
88
- requirements:
89
- - - ~>
90
- - !ruby/object:Gem::Version
91
- hash: 9
92
- segments:
93
- - 1
94
- - 3
95
- version: "1.3"
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.3'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 10.5.0
96
76
  type: :development
97
77
  prerelease: false
98
- requirement: *id005
99
- - !ruby/object:Gem::Dependency
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 10.5.0
83
+ - !ruby/object:Gem::Dependency
100
84
  name: sqlite3
101
- version_requirements: &id006 !ruby/object:Gem::Requirement
102
- none: false
103
- requirements:
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
104
87
  - - ">="
105
- - !ruby/object:Gem::Version
106
- hash: 3
107
- segments:
108
- - 0
109
- version: "0"
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
110
90
  type: :development
111
91
  prerelease: false
112
- requirement: *id006
113
- - !ruby/object:Gem::Dependency
114
- name: rake
115
- version_requirements: &id007 !ruby/object:Gem::Requirement
116
- none: false
117
- requirements:
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
118
94
  - - ">="
119
- - !ruby/object:Gem::Version
120
- hash: 3
121
- segments:
122
- - 0
123
- version: "0"
124
- type: :development
125
- prerelease: false
126
- requirement: *id007
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
127
97
  description:
128
- email:
98
+ email:
129
99
  - andrew@prx.org
130
100
  executables: []
131
-
132
101
  extensions: []
133
-
134
102
  extra_rdoc_files: []
135
-
136
- files:
137
- - .gitignore
103
+ files:
104
+ - ".gitignore"
105
+ - ".travis.yml"
138
106
  - Gemfile
139
107
  - Rakefile
140
108
  - generators/say_when_migration/say_when_migration_generator.rb
@@ -154,7 +122,6 @@ files:
154
122
  - lib/say_when/storage/active_record/job_execution.rb
155
123
  - lib/say_when/storage/memory/base.rb
156
124
  - lib/say_when/storage/memory/job.rb
157
- - lib/say_when/storage/mongoid/job.rb
158
125
  - lib/say_when/tasks.rb
159
126
  - lib/say_when/triggers/base.rb
160
127
  - lib/say_when/triggers/cron_strategy.rb
@@ -165,64 +132,47 @@ files:
165
132
  - say_when.gemspec
166
133
  - spec/active_record_spec_helper.rb
167
134
  - spec/db/schema.rb
168
- - spec/db/test.db
169
- - spec/mongoid_spec_helper.rb
170
135
  - spec/say_when/cron_expression_spec.rb
171
136
  - spec/say_when/processor/active_messaging_spec.rb
172
137
  - spec/say_when/scheduler_spec.rb
173
138
  - spec/say_when/storage/active_record/job_spec.rb
174
139
  - spec/say_when/storage/memory/job_spec.rb
175
140
  - spec/say_when/storage/memory/trigger_spec.rb
176
- - spec/say_when/storage/mongoid/trigger_spec.rb
177
141
  - spec/say_when/triggers/once_strategy_spec.rb
178
142
  - spec/spec.opts
179
143
  - spec/spec_helper.rb
180
144
  - spec/support/models.rb
181
145
  homepage: http://labs.prx.org
182
146
  licenses: []
183
-
147
+ metadata: {}
184
148
  post_install_message:
185
149
  rdoc_options: []
186
-
187
- require_paths:
150
+ require_paths:
188
151
  - lib
189
- required_ruby_version: !ruby/object:Gem::Requirement
190
- none: false
191
- requirements:
152
+ required_ruby_version: !ruby/object:Gem::Requirement
153
+ requirements:
192
154
  - - ">="
193
- - !ruby/object:Gem::Version
194
- hash: 3
195
- segments:
196
- - 0
197
- version: "0"
198
- required_rubygems_version: !ruby/object:Gem::Requirement
199
- none: false
200
- requirements:
155
+ - !ruby/object:Gem::Version
156
+ version: '0'
157
+ required_rubygems_version: !ruby/object:Gem::Requirement
158
+ requirements:
201
159
  - - ">="
202
- - !ruby/object:Gem::Version
203
- hash: 3
204
- segments:
205
- - 0
206
- version: "0"
160
+ - !ruby/object:Gem::Version
161
+ version: '0'
207
162
  requirements: []
208
-
209
- rubyforge_project:
210
- rubygems_version: 1.8.22
163
+ rubygems_version: 3.1.4
211
164
  signing_key:
212
- specification_version: 3
165
+ specification_version: 4
213
166
  summary: Scheduling system for programmatically defined and stored jobs.
214
- test_files:
167
+ test_files:
215
168
  - spec/active_record_spec_helper.rb
216
169
  - spec/db/schema.rb
217
- - spec/db/test.db
218
- - spec/mongoid_spec_helper.rb
219
170
  - spec/say_when/cron_expression_spec.rb
220
171
  - spec/say_when/processor/active_messaging_spec.rb
221
172
  - spec/say_when/scheduler_spec.rb
222
173
  - spec/say_when/storage/active_record/job_spec.rb
223
174
  - spec/say_when/storage/memory/job_spec.rb
224
175
  - spec/say_when/storage/memory/trigger_spec.rb
225
- - spec/say_when/storage/mongoid/trigger_spec.rb
226
176
  - spec/say_when/triggers/once_strategy_spec.rb
227
177
  - spec/spec.opts
228
178
  - spec/spec_helper.rb
@@ -1,15 +0,0 @@
1
- require 'mongoid'
2
-
3
- module SayWhen
4
- module Store
5
- module Mongoid
6
-
7
- class Job
8
-
9
- include Mongoid::Document
10
-
11
- end
12
-
13
- end
14
- end
15
- end
data/spec/db/test.db DELETED
Binary file
@@ -1,7 +0,0 @@
1
- require 'mongoid'
2
-
3
- Mongoid.configure do |config|
4
- config.master = Mongo::Connection.new.db("say_when_test")
5
- end
6
-
7
- # Mongoid.logger = Logger.new($stdout)
@@ -1,57 +0,0 @@
1
- require File.dirname(__FILE__) + '/../../../spec_helper'
2
- require File.dirname(__FILE__) + '/../../../mongoid_spec_helper'
3
- # require File.dirname(__FILE__) + '/../../../../lib/say_when/store/mongoid/trigger'
4
-
5
- # describe SayWhen::Store::Mongoid::Trigger do
6
-
7
- # before(:each) do
8
- # SayWhen::Store::Mongoid::Trigger.delete_all
9
- # @valid_attributes = {
10
- # :expression => '0 0 12 ? * * *',
11
- # :time_zone => 'Pacific Time (US & Canada)'
12
- # }
13
- # end
14
-
15
- # it "can be created using new and save" do
16
- # t = SayWhen::Store::Mongoid::Trigger.new(@valid_attributes)
17
- # t.should be_valid
18
- # t.save
19
- # end
20
-
21
- # it "sets a cron_expression" do
22
- # t = SayWhen::Store::Mongoid::Trigger.create(@valid_attributes)
23
- # t.cron_expression.should_not be_nil
24
- # t.cron_expression.expression.should == '0 0 12 ? * * *'
25
- # t.cron_expression.time_zone.should == 'Pacific Time (US & Canada)'
26
- # end
27
-
28
- # it "has a waiting state on create" do
29
- # t = SayWhen::Store::Mongoid::Trigger.create(@valid_attributes)
30
- # t.status.should == SayWhen::BaseTrigger::STATE_WAITING
31
- # end
32
-
33
- # it "has a next fire at set on create" do
34
- # ce = SayWhen::CronExpression.new(@valid_attributes[:expression], @valid_attributes[:time_zone])
35
- # t = SayWhen::Store::Mongoid::Trigger.create(@valid_attributes)
36
- # t.status.should == SayWhen::BaseTrigger::STATE_WAITING
37
- # t.next_fire_at.should == ce.next_fire_at(t.created_at)
38
- # end
39
-
40
- # it "can be fired" do
41
- # ce = SayWhen::CronExpression.new(@valid_attributes[:expression], @valid_attributes[:time_zone])
42
- # t = SayWhen::Store::Mongoid::Trigger.create(@valid_attributes)
43
- # nfa = ce.last_fire_at(t.created_at - 1.second)
44
- # lfa = ce.last_fire_at(nfa - 1.second)
45
- # t.next_fire_at = nfa
46
- # t.last_fire_at = lfa
47
-
48
- # now = Time.now
49
- # Time.stub!(:now).and_return(now)
50
-
51
- # t.fired
52
- # t.next_fire_at.should == ce.next_fire_at(now)
53
- # t.last_fire_at.should == now
54
- # t.status.should == SayWhen::BaseTrigger::STATE_WAITING
55
- # end
56
-
57
- # end