urge 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/lib/urge/persistence/active_record_persistence.rb +7 -13
- data/lib/urge/version.rb +1 -1
- data/lib/urge.rb +111 -4
- data/spec/aasm.sqlite3.db +0 -0
- data/spec/{lib → models}/active_record/dual_action_model_spec.rb +10 -12
- data/spec/{lib → models}/active_record/simple_model_spec.rb +40 -11
- data/spec/{lib → models}/dual_action_spec.rb +13 -13
- data/spec/{lib → models}/scheduled_spec.rb +20 -16
- data/spec/spec_helper.rb +2 -22
- metadata +10 -11
- data/lib/urge/scheduled.rb +0 -95
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
Nzg5ZjVlOTg2MWUzYWE5NTYxZTliZmE3Y2ZiOWVkMzA1N2JjMTRlNg==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
MmFhZjQyZTUzYTBlNGQ2Njg4MTBiNjU0NzFkNDNjZmQ2ZTMyYjg0OQ==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
MzNlN2Y2M2M5ZDRmYThmOWQxZmMyYzg1N2EyN2YwOTA5NTBiZTdiNDcxYzQ2
|
10
|
+
ZDg0MDhjYjU4NjExNmJhYmU5ZjRlZjQzNTZkZTk1ZjgwYTJlOWU2NTY3NTc1
|
11
|
+
YTYxOWU5ZjUxNWQ4OTZiZWZkMTAzNTkzNDFiNTBlMzhjZTQ2ZmE=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
M2FiM2I2MThjY2UxNTdiMzMyNzcwYTJiMDA0YmMxODQ1MDgwNDI1MjhlZGJk
|
14
|
+
ZjYxMTQyOTVlOGJmZDViZjEwZDE1MTYyNzE5YjNjODJlNmFmZWU1MjNkOWU3
|
15
|
+
MzQ2MmFiN2FhMjE1YzYzM2IxODk0YzQ4MTJkOWI3OGViNmQxZWI=
|
@@ -11,10 +11,10 @@ module Urge
|
|
11
11
|
module ClassMethods
|
12
12
|
|
13
13
|
# AR finder
|
14
|
-
def
|
15
|
-
options =
|
14
|
+
def urgent( name, at = DateTime.now )
|
15
|
+
options = urge_schedules[name]
|
16
16
|
raise 'Unknown schedule' unless options
|
17
|
-
where( "#{
|
17
|
+
where( "#{urge_attr_name(name)} < ?", at )
|
18
18
|
end
|
19
19
|
|
20
20
|
|
@@ -36,22 +36,16 @@ module Urge
|
|
36
36
|
# matches
|
37
37
|
# end
|
38
38
|
|
39
|
-
|
40
|
-
|
41
|
-
now = DateTime.now
|
42
|
-
logger.debug "run_all! Time now: #{now}"
|
43
|
-
ready_to_run( now ).each do |task|
|
44
|
-
logger.debug "Task of class #{task.class.name} is about to be run! (with a bang)"
|
45
|
-
task.run!( name )
|
46
|
-
end
|
39
|
+
def urge_all!( name )
|
40
|
+
urgent( name ).each { |u| u.urge!( name ) }
|
47
41
|
end
|
48
42
|
|
49
43
|
end
|
50
44
|
|
51
45
|
module InstanceMethods
|
52
46
|
|
53
|
-
def
|
54
|
-
|
47
|
+
def urge!( name, options = {} )
|
48
|
+
urge( name, options )
|
55
49
|
save!
|
56
50
|
end
|
57
51
|
|
data/lib/urge/version.rb
CHANGED
data/lib/urge.rb
CHANGED
@@ -1,10 +1,117 @@
|
|
1
1
|
require 'urge/version'
|
2
|
-
require 'urge/scheduled'
|
3
2
|
require 'urge/persistence'
|
4
3
|
|
5
|
-
# require 'urge/credit_control'
|
6
|
-
|
7
4
|
require 'logging'
|
8
5
|
|
9
6
|
module Urge
|
10
|
-
|
7
|
+
|
8
|
+
module ClassMethods
|
9
|
+
|
10
|
+
# def run_all( name )
|
11
|
+
# now = DateTime.now
|
12
|
+
# logger.debug "run_all. Time now: #{now}"
|
13
|
+
# ready_to_run( name, now ).each do |task|
|
14
|
+
# logger.debug "Task of class #{task.class.name} named: #{name} is about to be run"
|
15
|
+
# task.run( name )
|
16
|
+
# end
|
17
|
+
# end
|
18
|
+
#
|
19
|
+
# def inspect_all( name )
|
20
|
+
# now = DateTime.now
|
21
|
+
# tasks = ready_to_run( name, now )
|
22
|
+
# logger.info "inspect_queue. Time now: #{now}. The following #{tasks.size} tasks are ready to run"
|
23
|
+
# tasks.each { |task| logger.info task.inspect }
|
24
|
+
# tasks
|
25
|
+
# end
|
26
|
+
|
27
|
+
def urge_logger
|
28
|
+
@@urge_logger ||= Logging.logger[self]
|
29
|
+
end
|
30
|
+
|
31
|
+
def urge_schedule( name, options = {} )
|
32
|
+
|
33
|
+
urge_logger.info "Defining schedule: #{name}. Options: #{options}. Class: #{self.name}"
|
34
|
+
|
35
|
+
# Warn if a schedule with this name already exists, but don't bail out.
|
36
|
+
# It's not necessarily an error. Rails autoloading classes is an example where it's not...
|
37
|
+
urge_logger.warn "A schedule with this name already exists. Old options: #{urge_schedules[name]}" if urge_schedules[name]
|
38
|
+
|
39
|
+
# NEW. Set defaults. The name pf the action metod is the same as the name of the schedule, and the name of the timestamp
|
40
|
+
# attribute is likewise, but with _at appended.
|
41
|
+
|
42
|
+
# For example, if the schedule name is 'check_credit', the signature of the action method - unless overridden - is
|
43
|
+
# expected to be
|
44
|
+
|
45
|
+
# def check_credit( options )
|
46
|
+
# end
|
47
|
+
|
48
|
+
# The timestamp name - unless set explicitly - is check_credit_at
|
49
|
+
options[:timestamp_name] ||= "#{name}_at"
|
50
|
+
options[:action] ||= name
|
51
|
+
|
52
|
+
urge_schedules[name] = options
|
53
|
+
end
|
54
|
+
|
55
|
+
def urge_schedules
|
56
|
+
@@urge_per_class_schedules ||= {}
|
57
|
+
@@urge_per_class_schedules[self.name] ||= {}
|
58
|
+
end
|
59
|
+
|
60
|
+
def urge_all_schedules
|
61
|
+
@@urge_per_class_schedules
|
62
|
+
end
|
63
|
+
|
64
|
+
# private
|
65
|
+
|
66
|
+
def urge_attr_name( name )
|
67
|
+
raise 'Non existent schedule name' unless urge_schedules[name]
|
68
|
+
urge_schedules[name][:timestamp_name]
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
|
73
|
+
#
|
74
|
+
#
|
75
|
+
#
|
76
|
+
module InstanceMethods
|
77
|
+
|
78
|
+
def urgent?( name )
|
79
|
+
ts = self.send( urge_attr_name( name ) )
|
80
|
+
ts ? (DateTime.now >= ts) : false
|
81
|
+
end
|
82
|
+
|
83
|
+
def urge_reschedule( name, _when )
|
84
|
+
urge_logger.debug "ScheduledTask#reschedule about to reschedule for #{_when}"
|
85
|
+
self.send( "#{urge_attr_name(name)}=", _when )
|
86
|
+
end
|
87
|
+
|
88
|
+
# Takes action and reschedules itself. That is all, and that is enough!
|
89
|
+
def urge( name, options = {} )
|
90
|
+
|
91
|
+
return false unless urgent?( name )
|
92
|
+
|
93
|
+
interval = self.send( self.class.urge_schedules[name][:action].to_sym, options )
|
94
|
+
urge_reschedule( name, interval ? interval.from_now : nil )
|
95
|
+
true
|
96
|
+
|
97
|
+
end
|
98
|
+
|
99
|
+
private
|
100
|
+
|
101
|
+
def urge_attr_name( name )
|
102
|
+
self.class.urge_attr_name( name )
|
103
|
+
end
|
104
|
+
|
105
|
+
def urge_logger
|
106
|
+
self.class.urge_logger
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
110
|
+
|
111
|
+
def self.included(base)
|
112
|
+
base.extend ClassMethods
|
113
|
+
base.send :include, InstanceMethods
|
114
|
+
Urge::Persistence.set_persistence(base)
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
data/spec/aasm.sqlite3.db
CHANGED
Binary file
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
load_schema
|
4
4
|
|
@@ -14,10 +14,10 @@ logger = Logging.logger['simple']
|
|
14
14
|
|
15
15
|
class DualActionGuest < ActiveRecord::Base
|
16
16
|
|
17
|
-
include Urge
|
17
|
+
include Urge
|
18
18
|
|
19
|
-
urge_schedule( :status_check, :
|
20
|
-
urge_schedule( :insurance_check, :
|
19
|
+
urge_schedule( :status_check, :timestamp_name => :status_check_at, :action => :check_status )
|
20
|
+
urge_schedule( :insurance_check, :timestamp_name => :insurance_check_at, :action => :check_insurance )
|
21
21
|
|
22
22
|
def status_checked?
|
23
23
|
@status_checked
|
@@ -83,13 +83,13 @@ describe 'AR model with more than one schedule' do
|
|
83
83
|
@checks = [:status_check, :insurance_check]
|
84
84
|
end
|
85
85
|
|
86
|
-
it "both checks should be
|
87
|
-
@checks.each { |c| @guest.should
|
86
|
+
it "both checks should be urgent" do
|
87
|
+
@checks.each { |c| @guest.should be_urgent( c ) }
|
88
88
|
end
|
89
89
|
|
90
90
|
context "when run" do
|
91
91
|
before(:each) do
|
92
|
-
@checks.each { |c| @guest.
|
92
|
+
@checks.each { |c| @guest.urge( c )}
|
93
93
|
end
|
94
94
|
|
95
95
|
it "should result in the guest having his status and his insurance checked" do
|
@@ -118,14 +118,12 @@ describe "AR finders" do
|
|
118
118
|
|
119
119
|
it "should return the correct number guests ready to run" do
|
120
120
|
|
121
|
-
logger.info "All schedules: #{DualActionGuest.all_schedules}"
|
122
|
-
|
123
121
|
expect {
|
124
|
-
DualActionGuest.
|
122
|
+
DualActionGuest.urgent( :default )
|
125
123
|
}.to raise_error( RuntimeError )
|
126
124
|
|
127
|
-
DualActionGuest.
|
128
|
-
DualActionGuest.
|
125
|
+
DualActionGuest.urgent( :status_check ).should have(@count).items
|
126
|
+
DualActionGuest.urgent( :insurance_check ).should have(@count).items
|
129
127
|
end
|
130
128
|
|
131
129
|
end
|
@@ -1,17 +1,16 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
load_schema
|
4
4
|
|
5
5
|
class SimpleGuest < ActiveRecord::Base
|
6
6
|
|
7
|
-
include Urge
|
8
|
-
|
9
|
-
urge_schedule( :default, :scheduled_for => :scheduled_for, :action => :take_action )
|
7
|
+
include Urge
|
8
|
+
urge_schedule( :default, :timestamp_name => :scheduled_for, :action => :take_action )
|
10
9
|
|
11
10
|
private
|
12
11
|
|
13
12
|
def take_action( options )
|
14
|
-
logger.debug "In take_action. About to return
|
13
|
+
logger.debug "In take_action. About to return nil"
|
15
14
|
nil
|
16
15
|
end
|
17
16
|
|
@@ -52,7 +51,7 @@ describe 'Simplest active record model' do
|
|
52
51
|
end
|
53
52
|
|
54
53
|
it "should be ready to run" do
|
55
|
-
@guest.should
|
54
|
+
@guest.should be_urgent( :default )
|
56
55
|
end
|
57
56
|
|
58
57
|
it "should raise an exception if an attempt is made to access a schedule that doesn't exist" do
|
@@ -61,9 +60,9 @@ describe 'Simplest active record model' do
|
|
61
60
|
}.to raise_error
|
62
61
|
end
|
63
62
|
|
64
|
-
context "when
|
63
|
+
context "when urged" do
|
65
64
|
before(:each) do
|
66
|
-
@guest.
|
65
|
+
@guest.urge :default
|
67
66
|
end
|
68
67
|
|
69
68
|
it "should not be rescheduled" do
|
@@ -73,7 +72,7 @@ describe 'Simplest active record model' do
|
|
73
72
|
|
74
73
|
end
|
75
74
|
|
76
|
-
describe "
|
75
|
+
describe "Class method finders" do
|
77
76
|
|
78
77
|
before(:each) do
|
79
78
|
|
@@ -85,9 +84,39 @@ describe "AR finders" do
|
|
85
84
|
end
|
86
85
|
end
|
87
86
|
|
88
|
-
it "should
|
89
|
-
SimpleGuest.
|
87
|
+
it "should find the correct number of urgent guests" do
|
88
|
+
SimpleGuest.urgent( :default ).should have(@count).items
|
90
89
|
end
|
91
90
|
|
92
91
|
end
|
93
92
|
|
93
|
+
|
94
|
+
describe "AR saving. 10 guests, when scheduled" do
|
95
|
+
|
96
|
+
before(:each) do
|
97
|
+
|
98
|
+
SimpleGuest.delete_all
|
99
|
+
@count = 10
|
100
|
+
@count.times do |index|
|
101
|
+
FactoryGirl.create :simple_guest, :scheduled_for => 1.day.ago
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|
105
|
+
|
106
|
+
it "should return the correct number of urgent guests" do
|
107
|
+
SimpleGuest.urgent( :default ).should have(@count).items
|
108
|
+
end
|
109
|
+
|
110
|
+
context "when urged" do
|
111
|
+
|
112
|
+
before(:each) do
|
113
|
+
SimpleGuest.urge_all! :default
|
114
|
+
end
|
115
|
+
|
116
|
+
it "should have no urgent guests" do
|
117
|
+
SimpleGuest.urgent( :default ).should be_empty
|
118
|
+
end
|
119
|
+
|
120
|
+
end
|
121
|
+
|
122
|
+
end
|
@@ -1,11 +1,11 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
#
|
4
4
|
#
|
5
5
|
#
|
6
6
|
class TwoTask
|
7
7
|
|
8
|
-
include Urge
|
8
|
+
include Urge
|
9
9
|
|
10
10
|
attr_accessor :scheduled_for_one, :scheduled_for_two
|
11
11
|
|
@@ -15,13 +15,13 @@ class TwoTask
|
|
15
15
|
@scheduled_for_one = attrs[:scheduled_for_one]
|
16
16
|
@scheduled_for_two = attrs[:scheduled_for_two]
|
17
17
|
|
18
|
-
@logger = options[:logger] || Logging.logger['
|
18
|
+
@logger = options[:logger] || Logging.logger['test']
|
19
19
|
|
20
20
|
@actions = options[:actions]
|
21
21
|
end
|
22
22
|
|
23
|
-
urge_schedule( :one, :
|
24
|
-
urge_schedule( :two, :
|
23
|
+
urge_schedule( :one, :timestamp_name => :scheduled_for_one, :action => :take_one )
|
24
|
+
urge_schedule( :two, :timestamp_name => :scheduled_for_two, :action => :take_two )
|
25
25
|
|
26
26
|
def take_one( options )
|
27
27
|
@actions << :action_one
|
@@ -35,7 +35,7 @@ class TwoTask
|
|
35
35
|
|
36
36
|
end
|
37
37
|
|
38
|
-
describe Urge
|
38
|
+
describe Urge do
|
39
39
|
|
40
40
|
context "when applied to an in memory object requiring two separate actions, that object" do
|
41
41
|
|
@@ -53,10 +53,10 @@ describe Urge::Scheduled do
|
|
53
53
|
@actions.should be_empty
|
54
54
|
end
|
55
55
|
|
56
|
-
context "when
|
56
|
+
context "when urged in the context of task 1" do
|
57
57
|
|
58
58
|
before(:each) do
|
59
|
-
@object.
|
59
|
+
@object.urge( :one )
|
60
60
|
end
|
61
61
|
|
62
62
|
it "should produce one action" do
|
@@ -70,10 +70,10 @@ describe Urge::Scheduled do
|
|
70
70
|
|
71
71
|
end
|
72
72
|
|
73
|
-
context "when
|
73
|
+
context "when urged in the context of task 2" do
|
74
74
|
|
75
75
|
before(:each) do
|
76
|
-
@object.
|
76
|
+
@object.urge( :two )
|
77
77
|
end
|
78
78
|
|
79
79
|
it "should produce another action" do
|
@@ -87,11 +87,11 @@ describe Urge::Scheduled do
|
|
87
87
|
|
88
88
|
end
|
89
89
|
|
90
|
-
context "when
|
90
|
+
context "when urged in the context of both tasks" do
|
91
91
|
|
92
92
|
before(:each) do
|
93
|
-
@object.
|
94
|
-
@object.
|
93
|
+
@object.urge( :one )
|
94
|
+
@object.urge( :two )
|
95
95
|
end
|
96
96
|
|
97
97
|
it "should produce two actions" do
|
@@ -1,38 +1,42 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
Logging.logger['simple'].tap {|logger|
|
4
4
|
logger.add_appenders 'colourful_stdout'
|
5
5
|
logger.level = :info
|
6
6
|
}
|
7
7
|
|
8
|
-
|
9
8
|
#
|
10
9
|
#
|
11
10
|
#
|
12
11
|
class Simple
|
12
|
+
|
13
|
+
# By including the Urge module, we drag in all the class methods from that module
|
14
|
+
include Urge
|
13
15
|
|
14
|
-
|
15
|
-
|
16
|
-
attr_accessor :scheduled_for
|
16
|
+
attr_accessor :something_at
|
17
17
|
attr_reader :actions, :logger
|
18
18
|
|
19
19
|
def initialize( attrs = {} )
|
20
|
-
self.
|
20
|
+
self.something_at = attrs[:something_at]
|
21
21
|
|
22
22
|
@logger = Logging.logger['simple']
|
23
23
|
@actions = []
|
24
24
|
end
|
25
25
|
|
26
|
-
urge_schedule
|
26
|
+
urge_schedule :something, :action => 'do_something'
|
27
27
|
|
28
28
|
def do_something( options )
|
29
29
|
@actions << :foo
|
30
30
|
nil
|
31
31
|
end
|
32
32
|
|
33
|
+
# def self.attr_name( name )
|
34
|
+
# raise 'ILLEGAL!'
|
35
|
+
# end
|
36
|
+
|
33
37
|
end
|
34
38
|
|
35
|
-
describe Urge
|
39
|
+
describe Urge do
|
36
40
|
|
37
41
|
context "when applied to a simple, in memory object" do
|
38
42
|
|
@@ -47,10 +51,10 @@ describe Urge::Scheduled do
|
|
47
51
|
|
48
52
|
context "that is not scheduled" do
|
49
53
|
|
50
|
-
context "when
|
54
|
+
context "when urged to do something" do
|
51
55
|
|
52
56
|
before(:each) do
|
53
|
-
@object.
|
57
|
+
@object.urge( :something )
|
54
58
|
end
|
55
59
|
|
56
60
|
it "should do nothing" do
|
@@ -64,13 +68,13 @@ describe Urge::Scheduled do
|
|
64
68
|
context "that has been scheduled to run 1 second ago" do
|
65
69
|
|
66
70
|
before(:each) do
|
67
|
-
@object.
|
71
|
+
@object.something_at = 1.second.ago
|
68
72
|
end
|
69
73
|
|
70
|
-
context "when
|
74
|
+
context "when urged in the correct context" do
|
71
75
|
|
72
76
|
before(:each) do
|
73
|
-
@object.
|
77
|
+
@object.urge( :something )
|
74
78
|
end
|
75
79
|
|
76
80
|
it "should produce one action" do
|
@@ -79,16 +83,16 @@ describe Urge::Scheduled do
|
|
79
83
|
end
|
80
84
|
|
81
85
|
it "should not be rescheduled" do
|
82
|
-
@object.
|
86
|
+
@object.something_at.should be_nil
|
83
87
|
end
|
84
88
|
|
85
89
|
end
|
86
90
|
|
87
|
-
context "when
|
91
|
+
context "when urged in a non existent context" do
|
88
92
|
|
89
93
|
it "should raise an error" do
|
90
94
|
expect {
|
91
|
-
@object.
|
95
|
+
@object.urge( :doesnt_exist )
|
92
96
|
}.to raise_error( RuntimeError )
|
93
97
|
end
|
94
98
|
|
data/spec/spec_helper.rb
CHANGED
@@ -26,7 +26,7 @@ Logging.configure do
|
|
26
26
|
)
|
27
27
|
)
|
28
28
|
|
29
|
-
test_loggers = %w{
|
29
|
+
test_loggers = %w{ test }
|
30
30
|
# test_loggers = []
|
31
31
|
|
32
32
|
test_loggers.each do |name|
|
@@ -40,31 +40,13 @@ end
|
|
40
40
|
|
41
41
|
require 'aasm'
|
42
42
|
require 'logging'
|
43
|
-
require 'urge/scheduled'
|
44
43
|
require 'active_support/time'
|
45
44
|
require 'active_record'
|
46
45
|
require 'factory_girl'
|
47
46
|
|
48
47
|
FactoryGirl.find_definitions
|
49
48
|
|
50
|
-
|
51
|
-
|
52
|
-
include Urge::Scheduled
|
53
|
-
|
54
|
-
attr_reader :logger
|
55
|
-
|
56
|
-
def initialize( name, options = {} )
|
57
|
-
if options[:logger]
|
58
|
-
@logger = options[:logger]
|
59
|
-
else
|
60
|
-
@logger = Logging.logger['scheduled_task_test']
|
61
|
-
end
|
62
|
-
self.name = name
|
63
|
-
end
|
64
|
-
|
65
|
-
end
|
66
|
-
|
67
|
-
ActiveRecord::Base.logger = Logging.logger['credit_control_test']
|
49
|
+
ActiveRecord::Base.logger = Logging.logger['test']
|
68
50
|
|
69
51
|
def load_schema
|
70
52
|
config = YAML::load( IO.read( File.dirname(__FILE__) + '/database.yml' ) )
|
@@ -72,6 +54,4 @@ def load_schema
|
|
72
54
|
load( File.dirname(__FILE__) + "/schema.rb" )
|
73
55
|
end
|
74
56
|
|
75
|
-
class Client < ActiveRecord::Base
|
76
|
-
end
|
77
57
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: urge
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nick Adams
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-03-
|
11
|
+
date: 2013-03-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -110,15 +110,14 @@ files:
|
|
110
110
|
- lib/urge/persistence.rb
|
111
111
|
- lib/urge/persistence/active_record_persistence.rb
|
112
112
|
- lib/urge/persistence/base.rb
|
113
|
-
- lib/urge/scheduled.rb
|
114
113
|
- lib/urge/version.rb
|
115
114
|
- spec/aasm.sqlite3.db
|
116
115
|
- spec/database.yml
|
117
116
|
- spec/factories/factory.rb
|
118
|
-
- spec/
|
119
|
-
- spec/
|
120
|
-
- spec/
|
121
|
-
- spec/
|
117
|
+
- spec/models/active_record/dual_action_model_spec.rb
|
118
|
+
- spec/models/active_record/simple_model_spec.rb
|
119
|
+
- spec/models/dual_action_spec.rb
|
120
|
+
- spec/models/scheduled_spec.rb
|
122
121
|
- spec/schema.rb
|
123
122
|
- spec/spec_helper.rb
|
124
123
|
- urge.gemspec
|
@@ -149,9 +148,9 @@ test_files:
|
|
149
148
|
- spec/aasm.sqlite3.db
|
150
149
|
- spec/database.yml
|
151
150
|
- spec/factories/factory.rb
|
152
|
-
- spec/
|
153
|
-
- spec/
|
154
|
-
- spec/
|
155
|
-
- spec/
|
151
|
+
- spec/models/active_record/dual_action_model_spec.rb
|
152
|
+
- spec/models/active_record/simple_model_spec.rb
|
153
|
+
- spec/models/dual_action_spec.rb
|
154
|
+
- spec/models/scheduled_spec.rb
|
156
155
|
- spec/schema.rb
|
157
156
|
- spec/spec_helper.rb
|
data/lib/urge/scheduled.rb
DELETED
@@ -1,95 +0,0 @@
|
|
1
|
-
require 'logging'
|
2
|
-
|
3
|
-
module Urge
|
4
|
-
module Scheduled
|
5
|
-
module ClassMethods
|
6
|
-
|
7
|
-
def run_all( name )
|
8
|
-
now = DateTime.now
|
9
|
-
logger.debug "run_all. Time now: #{now}"
|
10
|
-
ready_to_run( name, now ).each do |task|
|
11
|
-
logger.debug "Task of class #{task.class.name} named: #{name} is about to be run"
|
12
|
-
task.run( name )
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
def inspect_all( name )
|
17
|
-
now = DateTime.now
|
18
|
-
tasks = ready_to_run( name, now )
|
19
|
-
logger.info "inspect_queue. Time now: #{now}. The following #{tasks.size} tasks are ready to run"
|
20
|
-
tasks.each { |task| logger.info task.inspect }
|
21
|
-
tasks
|
22
|
-
end
|
23
|
-
|
24
|
-
def logger
|
25
|
-
@@logger ||= Logging.logger[self]
|
26
|
-
end
|
27
|
-
|
28
|
-
def urge_schedule( name, options = {} )
|
29
|
-
logger.info "Defining schedule: #{name}. Options: #{options}. Class: #{self.name}"
|
30
|
-
raise 'Cannot have two schedules with the same name' if schedules[name]
|
31
|
-
schedules[name] = options
|
32
|
-
end
|
33
|
-
|
34
|
-
def schedules
|
35
|
-
@@per_class_schedules ||= {}
|
36
|
-
@@per_class_schedules[self.name] ||= {}
|
37
|
-
end
|
38
|
-
|
39
|
-
def attr_name( name )
|
40
|
-
raise 'Non existent schedule name' if schedules[name].blank?
|
41
|
-
schedules[name][:scheduled_for] || "scheduled_for_#{name}"
|
42
|
-
end
|
43
|
-
|
44
|
-
def all_schedules
|
45
|
-
@@per_class_schedules
|
46
|
-
end
|
47
|
-
|
48
|
-
end
|
49
|
-
|
50
|
-
module InstanceMethods
|
51
|
-
|
52
|
-
def ready_to_run?( name )
|
53
|
-
ts = self.send( attr_name( name ) )
|
54
|
-
ts ? (DateTime.now >= ts) : false
|
55
|
-
end
|
56
|
-
|
57
|
-
def reschedule( name, _when )
|
58
|
-
logger.debug "ScheduledTask#reschedule about to reschedule for #{_when}"
|
59
|
-
self.send( "#{attr_name(name)}=", _when )
|
60
|
-
end
|
61
|
-
|
62
|
-
# Takes action and reschedules itself. That is all, and that is enough!
|
63
|
-
def run( name, options = {} )
|
64
|
-
|
65
|
-
return false unless ready_to_run?( name )
|
66
|
-
|
67
|
-
logger.debug "About to call take_action_#{name}"
|
68
|
-
interval = internal_take_action( name, options )
|
69
|
-
|
70
|
-
logger.debug "Action taken. Calculated run interval: #{interval ? interval : 'none - task will *not* be rescheduled'}"
|
71
|
-
reschedule( name, interval ? interval.from_now : nil )
|
72
|
-
|
73
|
-
true
|
74
|
-
|
75
|
-
end
|
76
|
-
|
77
|
-
private
|
78
|
-
|
79
|
-
def internal_take_action( name, options )
|
80
|
-
self.send( self.class.schedules[name][:action] || "take_action_#{name}".to_sym, options )
|
81
|
-
end
|
82
|
-
|
83
|
-
def attr_name( name )
|
84
|
-
self.class.attr_name( name )
|
85
|
-
end
|
86
|
-
|
87
|
-
end
|
88
|
-
|
89
|
-
def self.included(base)
|
90
|
-
base.extend ClassMethods
|
91
|
-
base.send :include, InstanceMethods
|
92
|
-
Urge::Persistence.set_persistence(base)
|
93
|
-
end
|
94
|
-
end
|
95
|
-
end
|