buffered_job 0.4.0 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
data/.travis.yml CHANGED
@@ -7,3 +7,6 @@ rvm:
7
7
  # - jruby-19mode # JRuby in 1.9 mode
8
8
  - rbx-18mode
9
9
  - rbx-19mode
10
+ branches:
11
+ only:
12
+ - master
data/README.md CHANGED
@@ -62,12 +62,24 @@ $ (bundle exec) rake db:migrate
62
62
  ```
63
63
 
64
64
 
65
- ## Dependancies
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.0
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.0"
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-04"
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.10"
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
@@ -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
- raise NoBufferTargetError unless self.respond_to?(:id)
9
- buffer_for(self,opt)
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
@@ -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 = j.user_id and o.category == j.category }
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
@@ -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
- cat = @opt[:category]
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
- BufferedJob::Model.create(:user_id => @user.id,
14
- :category => cat,
15
- :receiver => @receiver,
16
- :method => method.to_sym,
17
- :merge_method => merge_method,
18
- :target => target)
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
@@ -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.result = []
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.result.should == comment
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.result.should == [c1,c2]
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.result.should == [c1,c2]
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
- @@result = []
65
+ @@results = []
66
66
 
67
- def self.result=(args)
68
- @@result = args
67
+ def self.results=(args)
68
+ @@results = args
69
69
  end
70
-
71
- def self.result
72
- @@result
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.result = comment
84
+ BufferedJob::Spec.results << comment
85
85
  end
86
86
 
87
87
  def merge_notify(comments)
88
- BufferedJob::Spec.result = comments
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.0
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-04 00:00:00.000000000Z
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: &2153271400 !ruby/object:Gem::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: *2153271400
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: &2153270540 !ruby/object:Gem::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: *2153270540
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: &2153267560 !ruby/object:Gem::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: *2153267560
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: &2153261140 !ruby/object:Gem::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: *2153261140
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: &2153256260 !ruby/object:Gem::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: *2153256260
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: &2153246180 !ruby/object:Gem::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: *2153246180
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: &2153243380 !ruby/object:Gem::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: *2153243380
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: &2153224800 !ruby/object:Gem::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: *2153224800
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: &2153221580 !ruby/object:Gem::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: *2153221580
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: -1485630599081764974
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.10
210
+ rubygems_version: 1.8.24
166
211
  signing_key:
167
212
  specification_version: 3
168
213
  summary: buffering jobs to merge similer jobs