redis-scheduler 0.8 → 0.9

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d4c61ee6608f6112456f84933f3b209f879a3401
4
- data.tar.gz: ae05d544a25078cd248a0e70ea005fca7df1e629
3
+ metadata.gz: d86d2f1e9780f66e41e977a2f8e282e75b50c3e8
4
+ data.tar.gz: 9df37814b8decc86caa1a3da82a8500b59653b3d
5
5
  SHA512:
6
- metadata.gz: ce8cd9ee9ba8b78a436bb1e680cb7f34b6fb3bdb41907a4bb8825053371e286e8082935f768b1fe727b3b509848d1405c44a12aaffd7ad4ca99c4a189e40765a
7
- data.tar.gz: 257cbd5324c02e216ee497a72ea4adbe3c9fa74d9795d7fd4143be41b3d186d08559883d969f29ce97837dd99e52a7bff0a2bd09f52e4197ace5122f7000b9e9
6
+ metadata.gz: e91b0f8151013796b90d91dc87cf9c12210a68f5e65309064c3ccc93eec0058da8e379ed2cbc07fe1ab154a3cf587b079c8f58d519d26049d9d379cec4abf4a0
7
+ data.tar.gz: bdb246caeb6415100a6549eb63dd79afe7709031079d33dd233aa8821f2521cdc562c999034cd7e304abe891c82eb02859cb2f4af1830ab3f55cb03fbbd06f24
data/COPYING CHANGED
@@ -1,4 +1,4 @@
1
- Redis Scheduler is copyright (c) 2012 William Morgan <wmorgan@masanjin.net>
1
+ Redis Scheduler is copyright (c) 2012-2014 William Morgan <wmorgan@masanjin.net>
2
2
  All rights reserved.
3
3
 
4
4
  Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
@@ -67,7 +67,10 @@ class RedisScheduler
67
67
  @counter = [@namespace, "counter"].join
68
68
  end
69
69
 
70
- ## Schedule an item at a specific time. item will be converted to a string.
70
+ attr_reader :redis, :namespace, :blocking, :uniq, :queue
71
+
72
+ ## Schedule an item at a specific time. Item is any Ruby object that can
73
+ ## be marshalled.
71
74
  def schedule! item, time
72
75
  @redis.zadd @queue, time.to_f, make_entry(item)
73
76
  end
@@ -116,7 +119,7 @@ class RedisScheduler
116
119
  ## to the schedule happen while iterating.
117
120
  ##
118
121
  ## For these reasons, this is mainly useful for debugging purposes.
119
- def items; ItemEnumerator.new(@redis, @queue, @uniq) end
122
+ def items; ItemEnumerator.new(self) end
120
123
 
121
124
  ## Returns an Array of [item, timestamp, descriptor] tuples representing the
122
125
  ## set of in-process items. The timestamp corresponds to the time at which
@@ -128,28 +131,38 @@ class RedisScheduler
128
131
  end
129
132
  end
130
133
 
134
+ ## the inverse of #make_entry below. public because it must also be called by
135
+ ## ItemEnumerator.
136
+ def parse_entry entry
137
+ item = if @uniq
138
+ entry
139
+ else
140
+ delim = entry.index ":"
141
+ entry[(delim + 1) .. -1]
142
+ end
143
+ begin
144
+ Marshal.load item
145
+ rescue TypeError
146
+ ## fall back to treating the item as a string--it's possible the schedule contains
147
+ ## items inserted from a pre-0.9 release, in which case they'll be stored
148
+ ## as pure strings.
149
+ item
150
+ end
151
+ end
152
+
131
153
  private
132
154
 
133
155
  ## generate the value actually stored in redis
134
156
  def make_entry item
157
+ item = Marshal.dump item
135
158
  if @uniq
136
- item.to_s
159
+ item
137
160
  else
138
161
  id = @redis.incr @counter
139
162
  "#{id}:#{item}"
140
163
  end
141
164
  end
142
165
 
143
- ## the inverse of #make_item_value
144
- def parse_entry entry
145
- if @uniq
146
- entry
147
- else
148
- entry =~ /^\d+:(\S+)$/ or raise InvalidEntryException, entry
149
- $1
150
- end
151
- end
152
-
153
166
  def get descriptor; @blocking ? blocking_get(descriptor) : nonblocking_get(descriptor) end
154
167
 
155
168
  def blocking_get descriptor
@@ -190,10 +203,8 @@ private
190
203
  ## Supports random access with #[], with the same caveats as above.
191
204
  class ItemEnumerator
192
205
  include Enumerable
193
- def initialize redis, q, uniq
194
- @redis = redis
195
- @q = q
196
- @uniq = uniq
206
+ def initialize scheduler
207
+ @scheduler = scheduler
197
208
  end
198
209
 
199
210
  PAGE_SIZE = 50
@@ -207,24 +218,14 @@ private
207
218
  end
208
219
 
209
220
  def [] start, num=nil
210
- elements = @redis.zrange @q, start, start + (num || 0), :withscores => true
221
+ elements = @scheduler.redis.zrange @scheduler.queue, start, start + (num || 0), :withscores => true
211
222
  v = elements.map do |entry, at|
212
- item = parse_entry entry
223
+ item = @scheduler.parse_entry entry
213
224
  [item, Time.at(at.to_f)]
214
225
  end
215
226
  num ? v : v.first
216
227
  end
217
228
 
218
- def size; @redis.zcard @q end
219
-
220
- ## duplicated :(
221
- def parse_entry entry
222
- if @uniq
223
- entry
224
- else
225
- entry =~ /^\d+:(\S+)$/ or raise InvalidEntryException, entry
226
- $1
227
- end
228
- end
229
+ def size; @scheduler.redis.zcard @scheduler.queue end
229
230
  end
230
231
  end
@@ -115,4 +115,31 @@ class RedisSchedulerTest < Minitest::Test
115
115
  assert_equal ["b", "a"], items
116
116
  end
117
117
  end
118
+
119
+ class Potato
120
+ def initialize x, y, z
121
+ @x = x
122
+ @y = y
123
+ @z = z
124
+ end
125
+
126
+ attr_reader :x, :y, :z
127
+ end
128
+
129
+ def test_can_schedule_ruby_objects
130
+ Timecop.freeze TIME do
131
+ @scheduler.schedule! Potato.new(10, ["hello", :there], /bob/), (TIME + 99)
132
+ end
133
+
134
+ Timecop.freeze(TIME + 99) do
135
+ potato = nil
136
+ @scheduler.each do |item, ts|
137
+ potato = item
138
+ end
139
+
140
+ assert_equal 10, potato.x
141
+ assert_equal ["hello", :there], potato.y
142
+ assert_equal /bob/, potato.z
143
+ end
144
+ end
118
145
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redis-scheduler
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.8'
4
+ version: '0.9'
5
5
  platform: ruby
6
6
  authors:
7
7
  - William Morgan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-28 00:00:00.000000000 Z
11
+ date: 2014-08-15 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: |-
14
14
  A simple, production-ready chronological scheduler for Redis. It allows you to schedule items to be processed at arbitrary points in the future, and easily
@@ -23,7 +23,8 @@ files:
23
23
  - lib/redis-scheduler.rb
24
24
  - test/redis-scheduler.rb
25
25
  homepage: http://gitub.com/wmorgan/redis-scheduler
26
- licenses: []
26
+ licenses:
27
+ - COPYING
27
28
  metadata: {}
28
29
  post_install_message:
29
30
  rdoc_options: