say_when 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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