buffered_job 0.4.0 → 0.4.1
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.
- data/.travis.yml +3 -0
- data/README.md +13 -1
- data/VERSION +1 -1
- data/buffered_job.gemspec +3 -3
- data/lib/buffered_job/ext.rb +13 -5
- data/lib/buffered_job/model.rb +1 -2
- data/lib/buffered_job/proxy.rb +10 -9
- data/spec/buffered_job_spec.rb +48 -4
- data/spec/spec_helper.rb +24 -8
- metadata +67 -22
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -62,12 +62,24 @@ $ (bundle exec) rake db:migrate
|
|
62
62
|
```
|
63
63
|
|
64
64
|
|
65
|
-
|
65
|
+
### Dependancies
|
66
66
|
|
67
67
|
This module depends on [delayed_job_active_record](https://github.com/collectiveidea/delayed_job_active_record).
|
68
68
|
Set up delayed_job and be sure to run delayed_job worker.
|
69
69
|
|
70
70
|
|
71
|
+
## Running jobs
|
72
|
+
|
73
|
+
flushing would be triggered by delayed_job. Start worker as follows after migrating the table required.
|
74
|
+
|
75
|
+
|
76
|
+
```
|
77
|
+
$ (bundle exec) rake jobs:work
|
78
|
+
```
|
79
|
+
|
80
|
+
See more details about [delayed_job_active_record](https://github.com/collectiveidea/delayed_job_active_record)
|
81
|
+
|
82
|
+
|
71
83
|
## Usage
|
72
84
|
|
73
85
|
Every active_record object has `buffer` method. You can put it between receiver and method and bufferes method
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.4.
|
1
|
+
0.4.1
|
data/buffered_job.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "buffered_job"
|
8
|
-
s.version = "0.4.
|
8
|
+
s.version = "0.4.1"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Masaki Sawamura"]
|
12
|
-
s.date = "2012-06-
|
12
|
+
s.date = "2012-06-05"
|
13
13
|
s.description = "Buffering jobs for a certain period and invoke specific method if two or more similer jobs in a buffer."
|
14
14
|
s.email = "masaki.sw@gmail.com"
|
15
15
|
s.extra_rdoc_files = [
|
@@ -40,7 +40,7 @@ Gem::Specification.new do |s|
|
|
40
40
|
s.homepage = "http://github.com/sawamur/buffered_job"
|
41
41
|
s.licenses = ["MIT"]
|
42
42
|
s.require_paths = ["lib"]
|
43
|
-
s.rubygems_version = "1.8.
|
43
|
+
s.rubygems_version = "1.8.24"
|
44
44
|
s.summary = "buffering jobs to merge similer jobs"
|
45
45
|
|
46
46
|
if s.respond_to? :specification_version then
|
data/lib/buffered_job/ext.rb
CHANGED
@@ -1,15 +1,23 @@
|
|
1
1
|
module BufferedJob
|
2
2
|
module Ext
|
3
|
-
def buffer_for(user,opt={})
|
4
|
-
Proxy.new(self,user,opt)
|
3
|
+
def buffer_for(user,key=nil,opt={})
|
4
|
+
Proxy.new(self,user,key,opt)
|
5
5
|
end
|
6
6
|
|
7
|
-
def buffer(opt={})
|
8
|
-
|
9
|
-
|
7
|
+
def buffer(key=nil,opt={})
|
8
|
+
if !self.respond_to?(:id) and self.superclass != ActionMailer::Base
|
9
|
+
raise NoBufferTargetError
|
10
|
+
end
|
11
|
+
if self.kind_of?(Class) and key.nil?
|
12
|
+
raise NoBufferKeywordError,"Specify buffer keyword like YourMailer.buffer('send_to_user/123').notification(msg)"
|
13
|
+
end
|
14
|
+
buffer_for(self,key,opt)
|
10
15
|
end
|
11
16
|
end
|
12
17
|
|
13
18
|
class NoBufferTargetError < StandardError
|
14
19
|
end
|
20
|
+
|
21
|
+
class NoBufferKeywordError < StandardError
|
22
|
+
end
|
15
23
|
end
|
data/lib/buffered_job/model.rb
CHANGED
@@ -5,7 +5,6 @@ module BufferedJob
|
|
5
5
|
self.table_name = 'buffered_jobs'
|
6
6
|
before_create :yaml_dump
|
7
7
|
after_create :set_delayed_job
|
8
|
-
|
9
8
|
|
10
9
|
def self.cache
|
11
10
|
@@cache ||= defined?(Rails) ? Rails.cache : ActiveSupport::Cache::MemoryStore.new
|
@@ -26,7 +25,7 @@ module BufferedJob
|
|
26
25
|
j.destroy
|
27
26
|
next
|
28
27
|
end
|
29
|
-
cojobs = jobs.select{ |o| o.user_id
|
28
|
+
cojobs = jobs.select{ |o| o.user_id == j.user_id and o.category == j.category }
|
30
29
|
receiver = YAML.load(j.receiver)
|
31
30
|
if cojobs.size > 1
|
32
31
|
begin
|
data/lib/buffered_job/proxy.rb
CHANGED
@@ -1,21 +1,22 @@
|
|
1
1
|
module BufferedJob
|
2
2
|
class Proxy
|
3
|
-
def initialize(receiver,user,opt={})
|
3
|
+
def initialize(receiver,user,key,opt={})
|
4
4
|
@receiver = receiver
|
5
5
|
@user = user
|
6
6
|
@opt = opt
|
7
|
+
@key = key
|
7
8
|
end
|
8
9
|
|
9
10
|
def method_missing(method,target)
|
10
|
-
|
11
|
-
cat ||= ( @receiver.class == Class ? @receiver.to_s : @receiver.class.to_s) + '#' + method.to_s
|
11
|
+
@key ||= ( @receiver.class == Class ? @receiver.to_s : @receiver.class.to_s) + '#' + method.to_s
|
12
12
|
merge_method = @opt[:action] || "merge_#{method}".to_sym
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
13
|
+
user_id = @user.respond_to?(:id) ? @user.id : 0
|
14
|
+
BufferedJob::Model.create(:user_id => user_id,
|
15
|
+
:category => @key,
|
16
|
+
:receiver => @receiver,
|
17
|
+
:method => method.to_sym,
|
18
|
+
:merge_method => merge_method,
|
19
|
+
:target => target)
|
19
20
|
end
|
20
21
|
end
|
21
22
|
end
|
data/spec/buffered_job_spec.rb
CHANGED
@@ -6,7 +6,7 @@ describe "BufferedJob" do
|
|
6
6
|
@paul = User.create(:name => "paul")
|
7
7
|
@george = User.create(:name => "george")
|
8
8
|
@article = Article.create(:user => @john,:text => "foo")
|
9
|
-
BufferedJob::Spec.
|
9
|
+
BufferedJob::Spec.results = []
|
10
10
|
BufferedJob::Model.destroy_all
|
11
11
|
end
|
12
12
|
|
@@ -24,7 +24,7 @@ describe "BufferedJob" do
|
|
24
24
|
comment = @article.comments.create(:user => @paul,:text => "I love this!")
|
25
25
|
@john.buffer.notify(comment)
|
26
26
|
BufferedJob.flush!
|
27
|
-
BufferedJob::Spec.
|
27
|
+
BufferedJob::Spec.results.last.should == comment
|
28
28
|
end
|
29
29
|
|
30
30
|
it "can exec merge method with a array of target objects " do
|
@@ -32,8 +32,12 @@ describe "BufferedJob" do
|
|
32
32
|
@john.buffer.notify(c1)
|
33
33
|
c2 = @article.comments.create(:user => @george,:text => "I hate this!")
|
34
34
|
@john.buffer.notify(c2)
|
35
|
+
|
36
|
+
c3 = @article.comments.create(:user => @ringo,:text => "I know this!")
|
37
|
+
@paul.buffer.notify(c3)
|
35
38
|
BufferedJob.flush!
|
36
|
-
BufferedJob::Spec.
|
39
|
+
BufferedJob::Spec.results.should include([c1,c2])
|
40
|
+
BufferedJob::Spec.results.should include(c3)
|
37
41
|
end
|
38
42
|
|
39
43
|
context "with delayed_job" do
|
@@ -52,7 +56,47 @@ describe "BufferedJob" do
|
|
52
56
|
c2 = @article.comments.create(:user => @george,:text => "I hate this!")
|
53
57
|
@john.buffer.notify(c2)
|
54
58
|
Delayed::Worker.new.work_off
|
55
|
-
BufferedJob::Spec.
|
59
|
+
BufferedJob::Spec.results.last.should == [c1,c2]
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
|
64
|
+
context "with specific buffering keyword" do
|
65
|
+
|
66
|
+
it "should count by the keyword given to buffer method" do
|
67
|
+
c1 = @article.comments.create(:user => @paul,:text => "I love this!")
|
68
|
+
@john.buffer("foo").notify(c1)
|
69
|
+
c2 = @article.comments.create(:user => @george,:text => "I hate this!")
|
70
|
+
@john.buffer("foo").notify(c2)
|
71
|
+
c3 = @article.comments.create(:user => @george,:text => "I like this!")
|
72
|
+
@john.buffer("foo").notify(c3)
|
73
|
+
|
74
|
+
c4 = @article.comments.create(:user => @george,:text => "I know this!")
|
75
|
+
@john.buffer("baa").notify(c4)
|
76
|
+
BufferedJob.flush!
|
77
|
+
BufferedJob::Spec.results.should include([c1,c2,c3])
|
78
|
+
BufferedJob::Spec.results.should include(c4)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
|
83
|
+
context "ActionMailer" do
|
84
|
+
before do
|
85
|
+
ActionMailer::Base.delivery_method = :test
|
86
|
+
ActionMailer::Base.deliveries = []
|
87
|
+
end
|
88
|
+
|
89
|
+
it "buffer sending method with ActionMailer class " do
|
90
|
+
TestMailer.buffer("notification/foo@example.org").notification({:to => "foo@example.org"})
|
91
|
+
ActionMailer::Base.deliveries.should be_empty
|
92
|
+
BufferedJob.flush!
|
93
|
+
ActionMailer::Base.deliveries.should_not be_empty
|
94
|
+
end
|
95
|
+
|
96
|
+
it "should raise error when invoked without key" do
|
97
|
+
expect {
|
98
|
+
TestMailer.buffer.notification({:to => "foo@example.org"})
|
99
|
+
}.to raise_error(BufferedJob::NoBufferKeywordError)
|
56
100
|
end
|
57
101
|
end
|
58
102
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -62,14 +62,14 @@ end
|
|
62
62
|
|
63
63
|
|
64
64
|
class BufferedJob::Spec
|
65
|
-
@@
|
65
|
+
@@results = []
|
66
66
|
|
67
|
-
def self.
|
68
|
-
@@
|
67
|
+
def self.results=(args)
|
68
|
+
@@results = args
|
69
69
|
end
|
70
|
-
|
71
|
-
def self.
|
72
|
-
@@
|
70
|
+
|
71
|
+
def self.results
|
72
|
+
@@results
|
73
73
|
end
|
74
74
|
|
75
75
|
end
|
@@ -81,11 +81,11 @@ class User < ActiveRecord::Base
|
|
81
81
|
# include BufferedJob::Ext
|
82
82
|
|
83
83
|
def notify(comment)
|
84
|
-
BufferedJob::Spec.
|
84
|
+
BufferedJob::Spec.results << comment
|
85
85
|
end
|
86
86
|
|
87
87
|
def merge_notify(comments)
|
88
|
-
BufferedJob::Spec.
|
88
|
+
BufferedJob::Spec.results << comments
|
89
89
|
end
|
90
90
|
end
|
91
91
|
|
@@ -100,4 +100,20 @@ class Comment < ActiveRecord::Base
|
|
100
100
|
end
|
101
101
|
|
102
102
|
|
103
|
+
class TestMailer < ActionMailer::Base
|
104
|
+
|
105
|
+
def notification(obj)
|
106
|
+
mail(:to => obj[:to],
|
107
|
+
:subject => "Welcome to My Awesome Site") do |fmt|
|
108
|
+
fmt.text {
|
109
|
+
render :text => "OK"
|
110
|
+
}
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
def merge_notification(objs)
|
115
|
+
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
103
119
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: buffered_job
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-06-
|
12
|
+
date: 2012-06-05 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
16
|
-
requirement:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,15 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
25
30
|
- !ruby/object:Gem::Dependency
|
26
31
|
name: delayed_job_active_record
|
27
|
-
requirement:
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
28
33
|
none: false
|
29
34
|
requirements:
|
30
35
|
- - ! '>='
|
@@ -32,10 +37,15 @@ dependencies:
|
|
32
37
|
version: '0'
|
33
38
|
type: :runtime
|
34
39
|
prerelease: false
|
35
|
-
version_requirements:
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
36
46
|
- !ruby/object:Gem::Dependency
|
37
47
|
name: actionmailer
|
38
|
-
requirement:
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
39
49
|
none: false
|
40
50
|
requirements:
|
41
51
|
- - ! '>='
|
@@ -43,10 +53,15 @@ dependencies:
|
|
43
53
|
version: '0'
|
44
54
|
type: :runtime
|
45
55
|
prerelease: false
|
46
|
-
version_requirements:
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
47
62
|
- !ruby/object:Gem::Dependency
|
48
63
|
name: rspec
|
49
|
-
requirement:
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
50
65
|
none: false
|
51
66
|
requirements:
|
52
67
|
- - ~>
|
@@ -54,10 +69,15 @@ dependencies:
|
|
54
69
|
version: 2.8.0
|
55
70
|
type: :development
|
56
71
|
prerelease: false
|
57
|
-
version_requirements:
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ~>
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: 2.8.0
|
58
78
|
- !ruby/object:Gem::Dependency
|
59
79
|
name: rdoc
|
60
|
-
requirement:
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
61
81
|
none: false
|
62
82
|
requirements:
|
63
83
|
- - ~>
|
@@ -65,10 +85,15 @@ dependencies:
|
|
65
85
|
version: '3.12'
|
66
86
|
type: :development
|
67
87
|
prerelease: false
|
68
|
-
version_requirements:
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ~>
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '3.12'
|
69
94
|
- !ruby/object:Gem::Dependency
|
70
95
|
name: bundler
|
71
|
-
requirement:
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
72
97
|
none: false
|
73
98
|
requirements:
|
74
99
|
- - ! '>='
|
@@ -76,10 +101,15 @@ dependencies:
|
|
76
101
|
version: '0'
|
77
102
|
type: :development
|
78
103
|
prerelease: false
|
79
|
-
version_requirements:
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
80
110
|
- !ruby/object:Gem::Dependency
|
81
111
|
name: jeweler
|
82
|
-
requirement:
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
83
113
|
none: false
|
84
114
|
requirements:
|
85
115
|
- - ~>
|
@@ -87,10 +117,15 @@ dependencies:
|
|
87
117
|
version: 1.8.3
|
88
118
|
type: :development
|
89
119
|
prerelease: false
|
90
|
-
version_requirements:
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ~>
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: 1.8.3
|
91
126
|
- !ruby/object:Gem::Dependency
|
92
127
|
name: simplecov
|
93
|
-
requirement:
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
94
129
|
none: false
|
95
130
|
requirements:
|
96
131
|
- - ! '>='
|
@@ -98,10 +133,15 @@ dependencies:
|
|
98
133
|
version: '0'
|
99
134
|
type: :development
|
100
135
|
prerelease: false
|
101
|
-
version_requirements:
|
136
|
+
version_requirements: !ruby/object:Gem::Requirement
|
137
|
+
none: false
|
138
|
+
requirements:
|
139
|
+
- - ! '>='
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: '0'
|
102
142
|
- !ruby/object:Gem::Dependency
|
103
143
|
name: sqlite3
|
104
|
-
requirement:
|
144
|
+
requirement: !ruby/object:Gem::Requirement
|
105
145
|
none: false
|
106
146
|
requirements:
|
107
147
|
- - ! '>='
|
@@ -109,7 +149,12 @@ dependencies:
|
|
109
149
|
version: '0'
|
110
150
|
type: :development
|
111
151
|
prerelease: false
|
112
|
-
version_requirements:
|
152
|
+
version_requirements: !ruby/object:Gem::Requirement
|
153
|
+
none: false
|
154
|
+
requirements:
|
155
|
+
- - ! '>='
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
version: '0'
|
113
158
|
description: Buffering jobs for a certain period and invoke specific method if two
|
114
159
|
or more similer jobs in a buffer.
|
115
160
|
email: masaki.sw@gmail.com
|
@@ -153,7 +198,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
153
198
|
version: '0'
|
154
199
|
segments:
|
155
200
|
- 0
|
156
|
-
hash:
|
201
|
+
hash: 7026175223246001
|
157
202
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
158
203
|
none: false
|
159
204
|
requirements:
|
@@ -162,7 +207,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
162
207
|
version: '0'
|
163
208
|
requirements: []
|
164
209
|
rubyforge_project:
|
165
|
-
rubygems_version: 1.8.
|
210
|
+
rubygems_version: 1.8.24
|
166
211
|
signing_key:
|
167
212
|
specification_version: 3
|
168
213
|
summary: buffering jobs to merge similer jobs
|