say_when 0.3.0 → 0.4.0

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: ff56cfaa645736fcace3c95f0d9f20a35b7785aa2be6cd544caee8ecb3d0b537
4
+ data.tar.gz: e04c3cbf9dfff48405d88a574aab8ebd1bf85bb747f6223efa3df184f9e485bb
5
+ SHA512:
6
+ metadata.gz: 16b737f008959d234f85f9d8100bb5503500c6b0d8acdb5c78f9306e7c7ac7166571d9021a69daba2406e29e112cba8e0b0b27bd222edb7dfae6b2ceb62f8264
7
+ data.tar.gz: 020d6842616be2b4984f6f7202279d09660646b112a7d0b24cffad38a6be711a1ee257f12eb4fc64aaa861816e2ba75673f773b4bca54c1af131b91029198ebe
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
@@ -8,7 +8,7 @@ module SayWhen
8
8
  @@scheduler = nil
9
9
  @@lock = nil
10
10
 
11
- attr_accessor :storage_strategy, :processor_class, :tick_length, :reset_acquired_length
11
+ attr_accessor :storage_strategy, :processor_class, :tick_length, :reset_acquired_length, :reset_next_at
12
12
 
13
13
  attr_accessor :running
14
14
 
@@ -63,61 +63,13 @@ 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
- reset_next_at = Time.now
72
69
  while running
73
- begin
74
- time_now = Time.now
75
-
76
- if reset_acquired_length > 0 && reset_next_at <= time_now
77
- reset_next_at = time_now + reset_acquired_length
78
- logger.debug "SayWhen:: reset acquired at #{time_now}, try again at #{reset_next_at}"
79
- job_class.reset_acquired(reset_acquired_length)
80
- end
81
-
82
- begin
83
- logger.debug "SayWhen:: Looking for job that should be ready to fire before #{time_now}"
84
- job = job_class.acquire_next(time_now)
85
- rescue StandardError => ex
86
- job_error("Failure to acquire job", job, ex)
87
- job = nil
88
- end
89
-
90
- if job.nil?
91
- logger.debug "SayWhen:: no jobs to acquire, sleep"
92
- sleep(tick_length)
93
- next
94
- end
95
-
96
- begin
97
- logger.debug "SayWhen:: got a job: #{job.inspect}"
98
- # delegate processing the trigger to the processor
99
- self.processor.process(job)
100
- logger.debug "SayWhen:: job processed"
101
-
102
- # if successful, update next fire at, put back to waiting / ended
103
- job.fired(time_now)
104
- logger.debug "SayWhen:: job fired complete"
105
- rescue StandardError=>ex
106
- job_error("Failure to process", job, ex)
107
- end
108
-
109
- rescue Interrupt => ex
110
- job_error("Interrupt!", job, ex)
111
- raise ex
112
- rescue StandardError => ex
113
- job_error("Error!", job, ex)
114
- sleep(tick_length)
115
- rescue Exception => ex
116
- job_error("Exception!", job, ex)
117
- raise ex
118
- end
70
+ process_jobs
119
71
  end
120
- rescue Exception=>ex
72
+ rescue Exception => ex
121
73
  logger.error "SayWhen::Scheduler stopping, error: #{ex.class.name}: #{ex.message}"
122
74
  exit
123
75
  end
@@ -125,6 +77,55 @@ module SayWhen
125
77
  logger.info "SayWhen::Scheduler stopped"
126
78
  end
127
79
 
80
+ def process_jobs
81
+ job = nil
82
+ time_now = Time.now
83
+ self.reset_next_at ||= Time.now
84
+
85
+ if reset_acquired_length > 0 && reset_next_at <= time_now
86
+ self.reset_next_at = time_now + reset_acquired_length
87
+ logger.debug "SayWhen:: reset acquired at #{time_now}, try again at #{reset_next_at}"
88
+ job_class.reset_acquired(reset_acquired_length)
89
+ end
90
+
91
+ begin
92
+ logger.debug "SayWhen:: Looking for job that should be ready to fire before #{time_now}"
93
+ job = job_class.acquire_next(time_now)
94
+ rescue StandardError => ex
95
+ job_error("Failure to acquire job", job, ex)
96
+ job = nil
97
+ end
98
+
99
+ if job.nil?
100
+ logger.debug "SayWhen:: no jobs to acquire, sleep"
101
+ sleep(tick_length)
102
+ return
103
+ end
104
+
105
+ begin
106
+ logger.debug "SayWhen:: got a job: #{job.inspect}"
107
+ # delegate processing the trigger to the processor
108
+ self.processor.process(job)
109
+ logger.debug "SayWhen:: job processed"
110
+
111
+ # if successful, update next fire at, put back to waiting / ended
112
+ job.fired(time_now)
113
+ logger.debug "SayWhen:: job fired complete"
114
+ rescue StandardError => ex
115
+ job_error("Failure to process", job, ex)
116
+ end
117
+
118
+ rescue Interrupt => ex
119
+ job_error("Interrupt!", job, ex)
120
+ raise ex
121
+ rescue StandardError => ex
122
+ job_error("Error!", job, ex)
123
+ sleep(tick_length)
124
+ rescue Exception => ex
125
+ job_error("Exception!", job, ex)
126
+ raise ex
127
+ end
128
+
128
129
  def job_error(msg, job, ex)
129
130
  job_msg = job && " job:'#{job.inspect}'"
130
131
  logger.error "SayWhen::Scheduler #{msg}#{job_msg}: #{ex.message}\n\t#{ex.backtrace.join("\t\n")}"
@@ -154,6 +155,5 @@ module SayWhen
154
155
  def logger
155
156
  SayWhen::logger
156
157
  end
157
-
158
158
  end
159
159
  end
@@ -1,3 +1,3 @@
1
1
  module SayWhen
2
- VERSION = "0.3.0"
2
+ VERSION = "0.4.0"
3
3
  end
data/say_when.gemspec CHANGED
@@ -18,8 +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 'rspec', "~> 1.3"
21
+ s.add_development_dependency 'rspec', '~> 1.3'
22
+ s.add_development_dependency 'rake', '~> 10.5.0'
22
23
  s.add_development_dependency 'sqlite3'
23
- s.add_development_dependency 'rake', '~> 0.8.7'
24
-
25
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
 
@@ -58,15 +58,15 @@ describe SayWhen::Scheduler do
58
58
  it "should start the scheduler running and stop it" do
59
59
  @scheduler.running.should be_false
60
60
 
61
- puts 'starting'
61
+ # puts 'starting'
62
62
  scheduler_thread = Thread.start{@scheduler.start}
63
- puts 'started'
63
+ # puts 'started'
64
64
  sleep(0.1)
65
65
  @scheduler.running.should == true
66
66
 
67
- puts 'stop'
67
+ # puts 'stop'
68
68
  @scheduler.stop
69
- puts 'wait for it'
69
+ # puts 'wait for it'
70
70
  @scheduler.running.should == false
71
71
  end
72
72
 
@@ -1,6 +1,6 @@
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
 
@@ -66,14 +66,15 @@ describe SayWhen::Storage::ActiveRecord::Job do
66
66
  j2_opts = {
67
67
  :trigger_strategy => :cron,
68
68
  :trigger_options => {:expression => '0 0 10 ? * * *', :time_zone => 'Pacific Time (US & Canada)'},
69
- :data => {:foo=>'bar', :result=>2},
69
+ :data => {:foo=>'can find the next job - j2', :result=>2},
70
70
  :job_class => 'SayWhen::Test::TestTask',
71
71
  :job_method => 'execute'
72
72
  }
73
73
 
74
74
  j1 = SayWhen::Storage::ActiveRecord::Job.create(@valid_attributes)
75
75
  j2 = SayWhen::Storage::ActiveRecord::Job.create(j2_opts)
76
- next_job = SayWhen::Storage::ActiveRecord::Job.acquire_next(1.day.since)
76
+ acquire = 1.day.since
77
+ next_job = SayWhen::Storage::ActiveRecord::Job.acquire_next(acquire)
77
78
  next_job.should == j2
78
79
  end
79
80
 
@@ -94,5 +95,4 @@ describe SayWhen::Storage::ActiveRecord::Job do
94
95
  j.last_fire_at.should == now
95
96
  j.status.should == SayWhen::BaseJob::STATE_WAITING
96
97
  end
97
-
98
98
  end
@@ -1,5 +1,5 @@
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
 
@@ -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,127 +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: 19
5
- prerelease:
6
- segments:
7
- - 0
8
- - 3
9
- - 0
10
- version: 0.3.0
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.4.0
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: 2016-05-17 00:00:00 Z
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
21
- prerelease: false
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
32
- version: 0.9.0
33
- requirement: *id001
11
+ date: 2022-04-12 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
34
14
  name: activemessaging
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.9.0
35
20
  type: :development
36
- - !ruby/object:Gem::Dependency
37
21
  prerelease: false
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
48
- version: 2.3.14
49
- requirement: *id002
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
50
28
  name: activesupport
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 2.3.14
51
34
  type: :development
52
- - !ruby/object:Gem::Dependency
53
35
  prerelease: false
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
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
64
40
  version: 2.3.14
65
- requirement: *id003
41
+ - !ruby/object:Gem::Dependency
66
42
  name: activerecord
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 2.3.14
67
48
  type: :development
68
- - !ruby/object:Gem::Dependency
69
49
  prerelease: false
70
- version_requirements: &id004 !ruby/object:Gem::Requirement
71
- none: false
72
- requirements:
73
- - - ~>
74
- - !ruby/object:Gem::Version
75
- hash: 9
76
- segments:
77
- - 1
78
- - 3
79
- version: "1.3"
80
- requirement: *id004
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
81
56
  name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.3'
82
62
  type: :development
83
- - !ruby/object:Gem::Dependency
84
63
  prerelease: false
85
- version_requirements: &id005 !ruby/object:Gem::Requirement
86
- none: false
87
- requirements:
88
- - - ">="
89
- - !ruby/object:Gem::Version
90
- hash: 3
91
- segments:
92
- - 0
93
- version: "0"
94
- requirement: *id005
95
- name: sqlite3
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
- - !ruby/object:Gem::Dependency
98
77
  prerelease: false
99
- version_requirements: &id006 !ruby/object:Gem::Requirement
100
- none: false
101
- requirements:
102
- - - ~>
103
- - !ruby/object:Gem::Version
104
- hash: 49
105
- segments:
106
- - 0
107
- - 8
108
- - 7
109
- version: 0.8.7
110
- requirement: *id006
111
- name: rake
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
84
+ name: sqlite3
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
112
90
  type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
113
97
  description:
114
- email:
98
+ email:
115
99
  - andrew@prx.org
116
100
  executables: []
117
-
118
101
  extensions: []
119
-
120
102
  extra_rdoc_files: []
121
-
122
- files:
123
- - .gitignore
124
- - .travis.yml
103
+ files:
104
+ - ".gitignore"
105
+ - ".travis.yml"
125
106
  - Gemfile
126
107
  - Rakefile
127
108
  - generators/say_when_migration/say_when_migration_generator.rb
@@ -163,38 +144,27 @@ files:
163
144
  - spec/support/models.rb
164
145
  homepage: http://labs.prx.org
165
146
  licenses: []
166
-
147
+ metadata: {}
167
148
  post_install_message:
168
149
  rdoc_options: []
169
-
170
- require_paths:
150
+ require_paths:
171
151
  - lib
172
- required_ruby_version: !ruby/object:Gem::Requirement
173
- none: false
174
- requirements:
152
+ required_ruby_version: !ruby/object:Gem::Requirement
153
+ requirements:
175
154
  - - ">="
176
- - !ruby/object:Gem::Version
177
- hash: 3
178
- segments:
179
- - 0
180
- version: "0"
181
- required_rubygems_version: !ruby/object:Gem::Requirement
182
- none: false
183
- requirements:
155
+ - !ruby/object:Gem::Version
156
+ version: '0'
157
+ required_rubygems_version: !ruby/object:Gem::Requirement
158
+ requirements:
184
159
  - - ">="
185
- - !ruby/object:Gem::Version
186
- hash: 3
187
- segments:
188
- - 0
189
- version: "0"
160
+ - !ruby/object:Gem::Version
161
+ version: '0'
190
162
  requirements: []
191
-
192
- rubyforge_project:
193
- rubygems_version: 1.8.15
163
+ rubygems_version: 3.1.4
194
164
  signing_key:
195
- specification_version: 3
165
+ specification_version: 4
196
166
  summary: Scheduling system for programmatically defined and stored jobs.
197
- test_files:
167
+ test_files:
198
168
  - spec/active_record_spec_helper.rb
199
169
  - spec/db/schema.rb
200
170
  - spec/say_when/cron_expression_spec.rb