resque-aps 0.9.14 → 0.9.15

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/HISTORY.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## 0.9.15 (2010-10-18)
2
+
3
+ * Move the application enqueue/dequeue methods to the Application class
4
+ * Fixed incr/decr issues around application (de-)queuing
5
+ * Fixed the page size issue on application view
6
+
1
7
  ## 0.9.14 (2010-09-1)
2
8
 
3
9
  * Corrected path issues
data/Rakefile CHANGED
@@ -23,7 +23,7 @@ begin
23
23
  puts "gem install jeweler"
24
24
  end
25
25
 
26
- require 'resque_aps/version'
26
+ require 'resque/plugins/aps/version'
27
27
 
28
28
  Jeweler::Tasks.new do |gemspec|
29
29
  gemspec.name = "resque-aps"
@@ -36,8 +36,8 @@ begin
36
36
  gemspec.authors = ["Ashley Martens"]
37
37
  gemspec.version = Resque::Plugins::Aps::Version
38
38
 
39
- gemspec.add_dependency "redis", ">= 1.0.7"
40
- gemspec.add_dependency "resque", ">= 1.5.0"
39
+ # gemspec.add_dependency "redis", ">= 1.0.7"
40
+ # gemspec.add_dependency "resque", ">= 1.5.0"
41
41
  gemspec.add_development_dependency "jeweler"
42
42
  gemspec.add_development_dependency "mocha"
43
43
  gemspec.add_development_dependency "rack-test"
@@ -61,34 +61,16 @@ module Resque
61
61
  def aps_application_job_limit
62
62
  @aps_application_job_limit ||= 5
63
63
  end
64
-
65
- def aps_applications_queued_count(application_name)
66
- redis.get(aps_application_queued_key(application_name)) || 0
67
- end
68
-
69
- def enqueue_aps_application(application_name, override = false)
70
- count_apps = aps_applications_queued_count(application_name).to_i
71
- count_not = aps_notification_count_for_application(application_name)
72
- if override || count_apps <= 0 || (count_apps < aps_application_job_limit && (count_not > aps_queue_size_upper && count_not % (aps_queue_size_upper / 10) == 0))
73
- enqueue(Resque::Plugins::Aps::Application, application_name)
74
- redis.incr(aps_application_queued_key(application_name))
75
- end
76
- end
77
-
78
- def dequeue_aps_application(application_name)
79
- redis.decr(aps_application_queued_key(application_name)) if aps_applications_queued_count(application_name).to_i > 0
80
- end
81
-
64
+
82
65
  def enqueue_aps(application_name, notification)
83
66
  redis.rpush(aps_application_queue_key(application_name), encode(notification.to_hash))
84
- enqueue_aps_application(application_name)
67
+ Resque::Plugins::Aps::Application.new('name' => application_name).enqueue
85
68
  true
86
69
  end
87
70
 
88
71
  def dequeue_aps(application_name)
89
72
  h = decode(redis.lpop(aps_application_queue_key(application_name)))
90
- return Resque::Plugins::Aps::Notification.new(h) if h
91
- nil
73
+ h ? Resque::Plugins::Aps::Notification.new(h) : nil
92
74
  end
93
75
 
94
76
  # Returns the number of queued notifications for a given application
@@ -99,11 +81,7 @@ module Resque
99
81
  # Returns an array of queued notifications for the given application
100
82
  def aps_notifications_for_application(application_name, start = 0, count = 1)
101
83
  r = redis.lrange(aps_application_queue_key(application_name), start, count)
102
- if r
103
- r.map { |h| Resque::Plugins::Aps::Notification.new(decode(h)) }
104
- else
105
- []
106
- end
84
+ r ? r.map { |h| Resque::Plugins::Aps::Notification.new(decode(h)) } : []
107
85
  end
108
86
 
109
87
  def create_aps_application(name, cert_file, cert_passwd = nil)
@@ -113,17 +91,14 @@ module Resque
113
91
 
114
92
  def aps_application(name)
115
93
  h = decode(redis.get(aps_application_key(name)))
116
- return Resque::Plugins::Aps::Application.new(h) if h
117
- nil
94
+ h ? Resque::Plugins::Aps::Application.new(h) : nil
118
95
  end
119
96
 
120
97
  # Returns an array of applications based on start and count
121
98
  def aps_application_names(start = 0, count = 1)
122
99
  a = redis.smembers(:aps_applications)
123
100
  return a if count == 0
124
- ret = a[start..(start + count)]
125
- return [] unless ret
126
- ret
101
+ a[start..(start + count)] || []
127
102
  end
128
103
 
129
104
  # Returns the number of application queues
@@ -177,6 +177,63 @@ module Resque
177
177
  logger.error("ResqueAps[read_failed]: Bad data on the socket (#{name})") if logger
178
178
  end
179
179
 
180
+
181
+
182
+
183
+
184
+ def queued_count
185
+ (redis.get(Resque.aps_application_queued_key(name)) || 0).to_i
186
+ end
187
+
188
+ def lock_key
189
+ @lock_key ||= "#{Resque.aps_application_key(name)}:lock"
190
+ end
191
+
192
+ def redis
193
+ Resque.redis
194
+ end
195
+
196
+ def acquire_lock
197
+ if redis.setnx(lock_key, Time.now.utc.to_i + 1)
198
+ true
199
+ elsif Time.at(redis.get(lock_key).to_i) > Time.now
200
+ delete_lock
201
+ acquire_lock
202
+ else
203
+ false
204
+ end
205
+ end
206
+
207
+ def delete_lock
208
+ redis.del(lock_key)
209
+ end
210
+
211
+ def enqueue(override = false)
212
+ count_apps = 0
213
+ count_not = 0
214
+ locked = false
215
+
216
+ unless override
217
+ count_apps = queued_count
218
+ if count_apps == 0
219
+ locked = acquire_lock
220
+ return unless locked
221
+ count_apps = queued_count
222
+ end
223
+ count_not = Resque.aps_notification_count_for_application(name)
224
+ end
225
+
226
+ if count_apps <= 0 || (count_apps < Resque.aps_application_job_limit && (count_not > Resque.aps_queue_size_upper && count_not % (Resque.aps_queue_size_upper / 10) == 0))
227
+ enqueue(Resque::Plugins::Aps::Application, name)
228
+ redis.incr(Resque.aps_application_queued_key(name))
229
+ delete_lock if locked
230
+ end
231
+ end
232
+
233
+ def dequeue
234
+ redis.decr(Resque.aps_application_queued_key(name))
235
+ end
236
+
180
237
  end
181
238
  end
182
239
  end
@@ -14,7 +14,7 @@
14
14
  <th>Notification Count</th>
15
15
  <th></th>
16
16
  </tr>
17
- <% resque.aps_application_names(start, start+20).each do |application_name| %>
17
+ <% resque.aps_application_names(start, 20).each do |application_name| %>
18
18
  <tr>
19
19
  <td><a href="<%= url "aps/#{application_name}" %>"><%= application_name %></a></td>
20
20
  <td><%= resque.aps_notification_count_for_application(application_name) %></td>
@@ -1,7 +1,7 @@
1
1
  module Resque
2
2
  module Plugins
3
3
  module Aps
4
- Version = '0.9.14'
4
+ Version = '0.9.15'
5
5
  end
6
6
  end
7
7
  end
@@ -1,7 +1,7 @@
1
1
  require File.dirname(__FILE__) + '/test_helper'
2
2
 
3
3
  # Pull in the server test_helper from resque
4
- require 'resque_aps/server/test_helper.rb'
4
+ require 'resque/plugins/aps/server/test_helper.rb'
5
5
 
6
6
  context "on GET to /aps" do
7
7
  setup { get "/aps" }
metadata CHANGED
@@ -1,7 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: resque-aps
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.14
4
+ hash: 37
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 9
9
+ - 15
10
+ version: 0.9.15
5
11
  platform: ruby
6
12
  authors:
7
13
  - Ashley Martens
@@ -9,59 +15,51 @@ autorequire:
9
15
  bindir: bin
10
16
  cert_chain: []
11
17
 
12
- date: 2010-09-01 00:00:00 -07:00
18
+ date: 2010-10-18 00:00:00 -07:00
13
19
  default_executable:
14
20
  dependencies:
15
- - !ruby/object:Gem::Dependency
16
- name: redis
17
- type: :runtime
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
20
- requirements:
21
- - - ">="
22
- - !ruby/object:Gem::Version
23
- version: 1.0.7
24
- version:
25
- - !ruby/object:Gem::Dependency
26
- name: resque
27
- type: :runtime
28
- version_requirement:
29
- version_requirements: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: 1.5.0
34
- version:
35
21
  - !ruby/object:Gem::Dependency
36
22
  name: jeweler
37
- type: :development
38
- version_requirement:
39
- version_requirements: !ruby/object:Gem::Requirement
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
40
26
  requirements:
41
27
  - - ">="
42
28
  - !ruby/object:Gem::Version
29
+ hash: 3
30
+ segments:
31
+ - 0
43
32
  version: "0"
44
- version:
33
+ type: :development
34
+ version_requirements: *id001
45
35
  - !ruby/object:Gem::Dependency
46
36
  name: mocha
47
- type: :development
48
- version_requirement:
49
- version_requirements: !ruby/object:Gem::Requirement
37
+ prerelease: false
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
50
40
  requirements:
51
41
  - - ">="
52
42
  - !ruby/object:Gem::Version
43
+ hash: 3
44
+ segments:
45
+ - 0
53
46
  version: "0"
54
- version:
47
+ type: :development
48
+ version_requirements: *id002
55
49
  - !ruby/object:Gem::Dependency
56
50
  name: rack-test
57
- type: :development
58
- version_requirement:
59
- version_requirements: !ruby/object:Gem::Requirement
51
+ prerelease: false
52
+ requirement: &id003 !ruby/object:Gem::Requirement
53
+ none: false
60
54
  requirements:
61
55
  - - ">="
62
56
  - !ruby/object:Gem::Version
57
+ hash: 3
58
+ segments:
59
+ - 0
63
60
  version: "0"
64
- version:
61
+ type: :development
62
+ version_requirements: *id003
65
63
  description: |-
66
64
  Queuing system for Apple's Push Service on top of Resque.
67
65
  Adds methods enqueue_aps to queue a notification message.
@@ -111,21 +109,27 @@ rdoc_options:
111
109
  require_paths:
112
110
  - lib
113
111
  required_ruby_version: !ruby/object:Gem::Requirement
112
+ none: false
114
113
  requirements:
115
114
  - - ">="
116
115
  - !ruby/object:Gem::Version
116
+ hash: 3
117
+ segments:
118
+ - 0
117
119
  version: "0"
118
- version:
119
120
  required_rubygems_version: !ruby/object:Gem::Requirement
121
+ none: false
120
122
  requirements:
121
123
  - - ">="
122
124
  - !ruby/object:Gem::Version
125
+ hash: 3
126
+ segments:
127
+ - 0
123
128
  version: "0"
124
- version:
125
129
  requirements: []
126
130
 
127
131
  rubyforge_project:
128
- rubygems_version: 1.3.5
132
+ rubygems_version: 1.3.7
129
133
  signing_key:
130
134
  specification_version: 3
131
135
  summary: Queuing system for Apple's Push Service on top of Resque