actionable 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +75 -2
- data/lib/actionable/job.rb +4 -4
- data/lib/actionable/memory_store/action.rb +3 -1
- data/lib/actionable/mongoid_store/action.rb +7 -1
- data/lib/actionable/version.rb +1 -1
- data/spec/recurrence_spec.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 59ea314ec2b4a5a5e5e9264c4c3a62b7ab012b4d
|
4
|
+
data.tar.gz: d05dda313d5413911dd9885811bd7863c33fd2f6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a1af58fdea6f80e3be686f0423da148114462437276ae3f6c6df6abd42b27bbc60a86da5c89451ec6f69d618c4fc689043af926967fcff96531fd447ba49e458
|
7
|
+
data.tar.gz: a4e40d2e4426f2996741369d14aa5226468dafbea37f9442a6be168890e9bf645b0342c897816fa0f485807c15d57f0e0ee9a376340e3cf15f2e2cc2fa914894
|
data/README.md
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
<img src="https://semaphoreapp.com/api/v1/projects/d32a2e65068b7b995bd9e9e2f8beb99a64c7f98d/36068/badge.png">
|
7
7
|
|
8
|
-
|
8
|
+
Actionables, jobs to do later. Scheduled, not queued.
|
9
9
|
|
10
10
|
## Installation
|
11
11
|
|
@@ -23,7 +23,80 @@ Or install it yourself as:
|
|
23
23
|
|
24
24
|
## Usage
|
25
25
|
|
26
|
-
|
26
|
+
### Basic Actionables
|
27
|
+
|
28
|
+
Include in model:
|
29
|
+
|
30
|
+
```ruby
|
31
|
+
class Book
|
32
|
+
|
33
|
+
include Mongoid::Document
|
34
|
+
include Actionable::Target
|
35
|
+
|
36
|
+
field :current_page
|
37
|
+
|
38
|
+
end
|
39
|
+
```
|
40
|
+
|
41
|
+
Schedule actionable:
|
42
|
+
|
43
|
+
```ruby
|
44
|
+
mybook = Book.new
|
45
|
+
mybook.schedule_actionable(1.hour.from_now,ReadBook,{pages:27})
|
46
|
+
```
|
47
|
+
|
48
|
+
Make sure the job exists too:
|
49
|
+
|
50
|
+
```ruby
|
51
|
+
class ReadBook < Actionable::Job
|
52
|
+
|
53
|
+
def perform
|
54
|
+
target.current_page = target.current_page + payload[:pages]
|
55
|
+
target.save
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
```
|
60
|
+
|
61
|
+
`schedule_actionable` takes three arguments: when to execute the job, the job class and an optional payload hash. Inside your `Actionable::Job`-inheriting class, the model for which the actionable was created (`mybook` above) is available as `target` and the payload hash is available as `payload`.
|
62
|
+
|
63
|
+
The actionables themselves are instances of `Actionable::Action` and are available as `actionables` on the model. They can have lots of stuff done to them:
|
64
|
+
|
65
|
+
```ruby
|
66
|
+
# cancel all actionables
|
67
|
+
mybook.actionables.each(&:cancel)
|
68
|
+
|
69
|
+
# reschedule the first one for two hours from now
|
70
|
+
mybook.actionables.first.reschedule_for(2.hours.from_now)
|
71
|
+
|
72
|
+
# update the payload of the last one
|
73
|
+
mybook.actionables.last.update_attribute(:payload,{pages:32})
|
74
|
+
```
|
75
|
+
|
76
|
+
`Actionable::Actions` are also Mongoid documents.
|
77
|
+
|
78
|
+
### Recurring Actionables
|
79
|
+
|
80
|
+
Super simple:
|
81
|
+
|
82
|
+
```ruby
|
83
|
+
# read five pages every five minutes...forever
|
84
|
+
Actionable::Recurrence.create({
|
85
|
+
recurrence_string: "*/12 * * * *",
|
86
|
+
job_class: ReadBook,
|
87
|
+
payload: {pages:5}
|
88
|
+
})
|
89
|
+
```
|
90
|
+
|
91
|
+
### Running Worker
|
92
|
+
|
93
|
+
Same as a normal Resque worker, just `require 'actionable/tasks'` at the top of you `Rakefile` to patch Resque's worker to poll Mongoid for actionable when Redis is out of jobs.
|
94
|
+
|
95
|
+
## Tests
|
96
|
+
|
97
|
+
```
|
98
|
+
$ rake spec
|
99
|
+
```
|
27
100
|
|
28
101
|
## Contributing
|
29
102
|
|
data/lib/actionable/job.rb
CHANGED
@@ -7,10 +7,10 @@ module Actionable
|
|
7
7
|
@queue ||= 'actionable'
|
8
8
|
end
|
9
9
|
|
10
|
-
def self.after_enqueue(id)
|
11
|
-
|
12
|
-
|
13
|
-
end
|
10
|
+
# def self.after_enqueue(id)
|
11
|
+
# actionable = Actionable::Action.find(id)
|
12
|
+
# actionable.update_attributes(status: :enqueued)
|
13
|
+
# end
|
14
14
|
|
15
15
|
def self.perform(id)
|
16
16
|
actionable = Actionable::Action.find(id)
|
@@ -33,9 +33,11 @@ module Actionable
|
|
33
33
|
end
|
34
34
|
|
35
35
|
def cancel
|
36
|
-
update_attributes(status: :
|
36
|
+
update_attributes(status: :canceled)
|
37
37
|
end
|
38
38
|
|
39
|
+
alias :cancel! :cancel
|
40
|
+
|
39
41
|
def reschedule_for(execution_time)
|
40
42
|
update_attributes(execution_time: execution_time)
|
41
43
|
end
|
@@ -15,12 +15,18 @@ module Actionable
|
|
15
15
|
field :target_id, type: Moped::BSON::ObjectId
|
16
16
|
field :target_class_name, type: String
|
17
17
|
|
18
|
-
scope :scheduled, where(status: :scheduled)
|
19
18
|
scope :scheduled_for_between, ->(from,to){
|
20
19
|
between(execution_time:[from,to])
|
21
20
|
}
|
22
21
|
scope :scheduled_for_before, ->(to){ where(:execution_time.lt => to) }
|
23
22
|
|
23
|
+
scope :with_job_class, ->(klass) { where(job_class_name: klass.to_s.classify)}
|
24
|
+
|
25
|
+
[:scheduled,:enqueued,:working,:complete,:canceled,:failed].each do |status|
|
26
|
+
scope status, where(status: status)
|
27
|
+
define_method(:"#{status}?") { self.status == status }
|
28
|
+
end
|
29
|
+
|
24
30
|
def self.to_do
|
25
31
|
scheduled.scheduled_for_before(Time.now.to_datetime)
|
26
32
|
end
|
data/lib/actionable/version.rb
CHANGED
data/spec/recurrence_spec.rb
CHANGED
@@ -84,7 +84,7 @@ describe Actionable::Recurrence do
|
|
84
84
|
context "over the course of an hour" do
|
85
85
|
|
86
86
|
it "should create and perform the job 11 times" do
|
87
|
-
RecurringTestJob.should_receive(:go).
|
87
|
+
RecurringTestJob.should_receive(:go).at_least(11).times
|
88
88
|
Timecop.travel(1.hour.from_now.change(minutes:0))
|
89
89
|
recurrence.valid?
|
90
90
|
60.times do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: actionable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Luxemburg
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-04-
|
11
|
+
date: 2013-04-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|