ruote-redis 2.2.0 → 2.3.0

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.
@@ -2,6 +2,16 @@
2
2
  = ruote-redis - CHANGELOG.txt
3
3
 
4
4
 
5
+ == ruote-redis 2.3.0 released 2012/09/01
6
+
7
+ - fix issue uncovered by Base#remove_process
8
+ - fix update_rev (also update put_at)
9
+ - Storage#reconnect (shortcut to @redis.reconnect)
10
+ - further hardened Redis#keys_to_a
11
+ - simplified storage initialization
12
+ - using rpush and lpop for msgs (one del less per msg)
13
+
14
+
5
15
  == ruote-redis 2.2.0 released 2011/03/01
6
16
 
7
17
  - Ruote::Redis::Storage (instead of RedisStorage)
@@ -15,5 +15,6 @@
15
15
 
16
16
  == many thanks to
17
17
 
18
- - the Redis team for their great project
18
+ - the Redis authors and community
19
+ - the redis.rb authors and community
19
20
 
@@ -1,5 +1,5 @@
1
1
 
2
- Copyright (c) 2001-2011, John Mettraux, jmettraux@gmail.com
2
+ Copyright (c) 2005-2012, John Mettraux, jmettraux@gmail.com
3
3
 
4
4
  Permission is hereby granted, free of charge, to any person obtaining a copy
5
5
  of this software and associated documentation files (the "Software"), to deal
@@ -21,7 +21,8 @@ The storage is instantiate by passing a redis-rb instance to the storage.
21
21
 
22
22
  Passing an em-redis instance might work, but I haven't tried.
23
23
 
24
- Tested with Redis 1.2.6 and 2.0.4 (redis-rb 2.1.1).
24
+ Tested with Redis 2.0.1 (redis-rb 3.0.1) on Debian GNU/Linux.
25
+ Tested with Redis 2.4.16 (redis-rb 3.0.1) on OSX snoleo.
25
26
 
26
27
 
27
28
  == running tests
@@ -31,20 +32,20 @@ assuming you have
31
32
  ruote/
32
33
  ruote-redis/
33
34
 
34
- start a redis server instance (port 6379) and then
35
+ start a redis server instance (port 6379) and then
35
36
 
36
37
 
37
38
  * unit tests :
38
39
 
39
40
  get into ruote/ and do
40
41
 
41
- ruby test/unit/storage.rb -- --redis
42
+ RUOTE_STORAGE=redis ruby test/functional/storage.rb
42
43
 
43
44
  * functional tests :
44
45
 
45
46
  get into ruote/ and do
46
47
 
47
- ruby test/functional/test.rb -- --redis
48
+ RUOTE_STORAGE=redis ruby test/functional/test.rb
48
49
 
49
50
 
50
51
  == license
data/Rakefile CHANGED
@@ -5,7 +5,7 @@ require 'rubygems'
5
5
 
6
6
  require 'rake'
7
7
  require 'rake/clean'
8
- require 'rake/rdoctask'
8
+ require 'rdoc/task'
9
9
 
10
10
 
11
11
  #
data/TODO.txt CHANGED
@@ -6,4 +6,7 @@
6
6
  [x] 1 ::Redis instance per thread ? (instead of :thread_safe => true)
7
7
 
8
8
  [ ] resque participant ?
9
+ [ ] sidekiq participant ?
10
+
11
+ [ ] use flushdb
9
12
 
@@ -1,5 +1,5 @@
1
1
  #--
2
- # Copyright (c) 2005-2011, John Mettraux, jmettraux@gmail.com
2
+ # Copyright (c) 2005-2012, John Mettraux, jmettraux@gmail.com
3
3
  #
4
4
  # Permission is hereby granted, free of charge, to any person obtaining a copy
5
5
  # of this software and associated documentation files(the "Software"), to deal
@@ -22,8 +22,7 @@
22
22
  # Made in Japan.
23
23
  #++
24
24
 
25
- #require 'redis'
26
- # now letting the end-user doing this require
25
+ require 'redis'
27
26
 
28
27
  require 'rufus-json'
29
28
  require 'ruote/storage/base'
@@ -37,7 +36,7 @@ module Redis
37
36
  # A Redis storage for ruote.
38
37
  #
39
38
  # The constructor accepts two arguments, the first one is a Redis instance
40
- #( see http://github.com/ezmobius/redis-rb ), the second one is the classic
39
+ # ( see http://github.com/ezmobius/redis-rb ), the second one is the classic
41
40
  # ruote engine options( see
42
41
  # http://ruote.rubyforge.org/configuration.html#engine )
43
42
  #
@@ -47,8 +46,7 @@ module Redis
47
46
  #
48
47
  # engine = Ruote::Engine.new(
49
48
  # Ruote::Worker.new(
50
- # Ruote::Redis::RedisStorage.new(
51
- # ::Redis.new(:db => 14, :thread_safe => true), {})))
49
+ # Ruote::Redis::RedisStorage.new('db'=> 14, 'thread_safe' => true)))
52
50
  #
53
51
  #
54
52
  # == em-redis
@@ -60,49 +58,129 @@ module Redis
60
58
  # If you try and it works, feedback is welcome
61
59
  # http://groups.google.com/group/openwferu-users
62
60
  #
61
+ #
62
+ # == 'pop_count' option
63
+ #
64
+ # By default, when the worker queries this storage for msgs to process,
65
+ # the storage will try to pop 28 msgs. This number can be changed thanks
66
+ # to the 'pop_count' option, like in:
67
+ #
68
+ # engine = Ruote::Engine.new(
69
+ # Ruote::Worker.new(
70
+ # Ruote::Redis::RedisStorage.new(
71
+ # 'db'=> 14, 'thread_safe' => true, 'pop_count' => 56)))
72
+ #
73
+ # Don't put too high a number, it increases the chance of msgs getting lost
74
+ # in case of the worker going down.
75
+ #
76
+ # (if there is a need to avoid such a scenario in the future,
77
+ # Redis' rpoplpush might come in handy).
78
+ #
63
79
  class Storage
64
80
 
65
81
  include Ruote::StorageBase
66
82
 
67
83
  attr_reader :redis
68
84
 
85
+ # Listing the redis options to differentiate them from ruote storage
86
+ # options.
87
+ #
88
+ REDIS_OPTIONS = %w[ host port path db thread_safe logger ]
89
+
69
90
  # A Redis storage for ruote.
70
91
  #
92
+ # Can be initialized in two ways
93
+ #
94
+ # Ruote::Redis::Storage.new(
95
+ # ::Redis.new(
96
+ # :host => '127.0.0.1',
97
+ # :db => 13,
98
+ # :thread_safe => true))
99
+ #
100
+ # or
101
+ #
102
+ # Ruote::Redis::Storage.new(
103
+ # 'host' => '127.0.0.1',
104
+ # 'db' => 13,
105
+ # 'thread_safe' => true)
106
+ #
107
+ # The first style is probably better avoided.
108
+ #
71
109
  def initialize(redis, options={})
72
110
 
111
+ if options == {} && redis.is_a?(Hash)
112
+
113
+ redis_options, options = redis.partition { |k, v|
114
+ REDIS_OPTIONS.include?(k.to_s)
115
+ }
116
+
117
+ redis_options = Hash[redis_options.collect { |k, v| [ k.to_sym, v ] }]
118
+ options = Hash[options]
119
+
120
+ redis = ::Redis.new(redis_options)
121
+ end
122
+
73
123
  @redis = redis
74
124
  @options = options
75
125
 
76
- def @redis.keys_to_a(opt)
77
- keys(opt) rescue []
126
+ @pop_count = @options['pop_count'] || 28
127
+
128
+ # Returns an array of the (String) keys that match the given pattern.
129
+ #
130
+ # Returns an empty array if anything goes wrong.
131
+ #
132
+ def @redis.keys_to_a(pattern)
133
+
134
+ if (a = (keys(pattern) rescue nil)).is_a?(Array)
135
+ a
136
+ else
137
+ []
138
+ end
78
139
  end
79
140
 
80
- put_configuration
141
+ replace_engine_configuration(options)
81
142
  end
82
143
 
83
144
  # Returns true if the doc is successfully deleted.
84
145
  #
85
146
  def reserve(doc)
86
147
 
148
+ return true if doc['type'] == 'msgs'
149
+
87
150
  (@redis.del(key_for(doc)) == 1)
88
151
  end
89
152
 
90
153
  def put_msg(action, options)
91
154
 
92
155
  doc = prepare_msg_doc(action, options)
156
+ doc['put_at'] = Ruote.now_to_utc_s
93
157
 
94
- @redis.set(key_for(doc), to_json(doc))
158
+ @redis.lpush('msgs', Rufus::Json.encode(doc))
95
159
 
96
160
  nil
97
161
  end
98
162
 
163
+ # Note: the worker argument is not used in this storage implementation.
164
+ #
165
+ def get_msgs
166
+
167
+ @redis.pipelined {
168
+ @pop_count.times { @redis.rpop('msgs') }
169
+ }.compact.collect { |d|
170
+ from_json(d)
171
+ }
172
+ end
173
+
99
174
  def put_schedule(flavour, owner_fei, s, msg)
100
175
 
101
176
  doc = prepare_schedule_doc(flavour, owner_fei, s, msg)
102
177
 
103
178
  return nil unless doc
104
179
 
105
- @redis.set(key_for(doc), to_json(doc))
180
+ doc['_rev'] = '0'
181
+ doc['put_at'] = Ruote.now_to_utc_s
182
+
183
+ @redis.set(key_for(doc), Rufus::Json.encode(doc))
106
184
 
107
185
  doc['_id']
108
186
  end
@@ -141,9 +219,11 @@ module Redis
141
219
  #
142
220
  # put is successful (return nil)
143
221
  #
144
- nrev = (rev.to_i + 1).to_s
145
- @redis.set(key, to_json(doc.merge('_rev' => nrev)))
146
- doc['_rev'] = nrev if opts[:update_rev]
222
+ doc = doc.send(
223
+ opts[:update_rev] ? :merge! : :merge,
224
+ { '_rev' => (rev.to_i + 1).to_s, 'put_at' => Ruote.now_to_utc_s })
225
+
226
+ @redis.set(key, Rufus::Json.encode(doc))
147
227
 
148
228
  nil
149
229
  end
@@ -204,7 +284,9 @@ module Redis
204
284
 
205
285
  elsif keys.first.is_a?(String)
206
286
 
207
- keys.collect { |k| @redis.keys_to_a("#{type}/*!#{k}") }.flatten
287
+ keys.collect { |k|
288
+ @redis.keys_to_a("#{type}/*!#{k}#{type == 'schedules' ? '-*' : ''}")
289
+ }.flatten
208
290
 
209
291
  else #if keys.first.is_a?(Regexp)
210
292
 
@@ -225,13 +307,13 @@ module Redis
225
307
  limit = opts[:limit] || ids.length
226
308
  ids = ids[skip, limit]
227
309
 
228
- docs = ids.length > 0 ? @redis.mget(*ids) : []
229
- docs = docs.inject({}) do |h, doc|
230
- if doc
231
- doc = Rufus::Json.decode(doc)
232
- h[doc['_id']] = doc
233
- end
234
- h
310
+ docs = ids.length > 0 && @redis.mget(*ids)
311
+ docs = docs.is_a?(Array) ? docs : []
312
+
313
+ docs = docs.each_with_object({}) do |doc, h|
314
+ next unless doc
315
+ doc = Rufus::Json.decode(doc)
316
+ h[doc['_id']] = doc
235
317
  end
236
318
 
237
319
  return docs.size if opts[:count]
@@ -252,15 +334,8 @@ module Redis
252
334
 
253
335
  def purge!
254
336
 
255
- @redis.keys_to_a('*').each { |k| @redis.del(k) }
256
- end
257
-
258
- # Returns a String containing a representation of the current content of
259
- # in this Redis storage.
260
- #
261
- def dump(type)
262
-
263
- @redis.keys_to_a("#{type}/*").sort.join("\n")
337
+ 2.times { @redis.flushdb rescue nil }
338
+ # 2 times to work around Redis::ProtocolError '3'
264
339
  end
265
340
 
266
341
  # Shuts this worker down.
@@ -295,6 +370,13 @@ module Redis
295
370
  @redis.keys_to_a("#{type}/*").each { |k| (@redis.del(k) rescue nil) }
296
371
  end
297
372
 
373
+ # Simply calls @redis.reconnect
374
+ #
375
+ def reconnect
376
+
377
+ @redis.reconnect
378
+ end
379
+
298
380
  protected
299
381
 
300
382
  LOCK_KEY = /-lock$/
@@ -309,20 +391,18 @@ module Redis
309
391
 
310
392
  loop do
311
393
 
312
- r = @redis.setnx(kl, Time.now.to_f.to_s)
394
+ break if @redis.setnx(kl, Time.now.to_f.to_s) != false
395
+ # locking successful
313
396
 
314
- if r == false
397
+ #
398
+ # already locked
315
399
 
316
- t = @redis.get(kl)
400
+ t = @redis.get(kl)
317
401
 
318
- @redis.del(kl) if t && Time.now.to_f - t.to_f > 60.0
319
- # after 1 minute, locks time out
320
-
321
- sleep 0.007 # let's try to lock again after a while
322
- else
402
+ @redis.del(kl) if t && Time.now.to_f - t.to_f > 60.0
403
+ # after 1 minute, locks time out
323
404
 
324
- break # lock acquired
325
- end
405
+ sleep 0.007 # let's try to lock again after a while
326
406
  end
327
407
 
328
408
  #@redis.expire(kl, 2)
@@ -354,23 +434,6 @@ module Redis
354
434
 
355
435
  s ? Rufus::Json.decode(s) : nil
356
436
  end
357
-
358
- def to_json(doc, opts={})
359
-
360
- Rufus::Json.encode(
361
- opts[:delete] ? nil : doc.merge('put_at' => Ruote.now_to_utc_s))
362
- end
363
-
364
- # Don't put configuration if it's already in
365
- #
366
- # (prevent storages from trashing configuration...)
367
- #
368
- def put_configuration
369
-
370
- return if get('configurations', 'engine')
371
-
372
- put({ '_id' => 'engine', 'type' => 'configurations' }.merge(@options))
373
- end
374
437
  end
375
438
 
376
439
  #
@@ -1,8 +1,32 @@
1
+ #--
2
+ # Copyright (c) 2005-2012, John Mettraux, jmettraux@gmail.com
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
5
+ # of this software and associated documentation files(the "Software"), to deal
6
+ # in the Software without restriction, including without limitation the rights
7
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ # copies of the Software, and to permit persons to whom the Software is
9
+ # furnished to do so, subject to the following conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be included in
12
+ # all copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20
+ # THE SOFTWARE.
21
+ #
22
+ # Made in Japan.
23
+ #++
24
+
1
25
 
2
26
  module Ruote
3
27
  module Redis
4
28
 
5
- VERSION = '2.2.0'
29
+ VERSION = '2.3.0'
6
30
  end
7
31
  end
8
32
 
@@ -1,9 +1,12 @@
1
- # encoding: utf-8
2
1
 
3
2
  Gem::Specification.new do |s|
4
3
 
5
4
  s.name = 'ruote-redis'
6
- s.version = File.read('lib/ruote/redis/version.rb').match(/VERSION = '([^']+)'/)[1]
5
+
6
+ s.version = File.read(
7
+ File.expand_path('../lib/ruote/redis/version.rb', __FILE__)
8
+ ).match(/ VERSION *= *['"]([^'"]+)/)[1]
9
+
7
10
  s.platform = Gem::Platform::RUBY
8
11
  s.authors = [ 'John Mettraux' ]
9
12
  s.email = [ 'jmettraux@gmail.com' ]
@@ -12,7 +15,7 @@ Gem::Specification.new do |s|
12
15
  s.summary = 'Redis storage for ruote (a Ruby workflow engine)'
13
16
  s.description = %q{
14
17
  Redis storage for ruote (a Ruby workflow engine)
15
- }
18
+ }
16
19
 
17
20
  #s.files = `git ls-files`.split("\n")
18
21
  s.files = Dir[
@@ -21,7 +24,7 @@ Redis storage for ruote (a Ruby workflow engine)
21
24
  '*.gemspec', '*.txt', '*.rdoc', '*.md'
22
25
  ]
23
26
 
24
- s.add_runtime_dependency 'redis', '2.1.1'
27
+ s.add_runtime_dependency 'redis'#, '>= 2.2.2'
25
28
  s.add_runtime_dependency 'ruote', ">= #{s.version}"
26
29
 
27
30
  s.add_development_dependency 'rake'
@@ -0,0 +1,38 @@
1
+
2
+ $: << File.expand_path('../../../lib', __FILE__)
3
+
4
+ require 'test/unit'
5
+
6
+ require 'rufus-json/automatic'
7
+ require 'ruote'
8
+ require 'ruote-redis'
9
+
10
+ ruote =
11
+ Ruote::Dashboard.new(
12
+ Ruote::Worker.new(
13
+ Ruote::Redis::Storage.new('db' => 15, 'thread_safe' => true)))
14
+
15
+ ruote.storage.purge!
16
+ #ruote.noisy = true
17
+
18
+ ruote.register 'toto' do |workitem|
19
+ workitem.fields['seen'] = Time.now.to_s
20
+ end
21
+
22
+ t = Time.now
23
+
24
+ 50.times do
25
+ wfid = ruote.launch(Ruote.define do
26
+ toto; toto; toto; toto; toto
27
+ end)
28
+ p wfid
29
+ end
30
+
31
+ loop do
32
+ count = ruote.storage.get_many('expressions', nil, :count => true)
33
+ p count
34
+ break if count < 1
35
+ end
36
+
37
+ p Time.now - t
38
+
@@ -0,0 +1,75 @@
1
+
2
+ #
3
+ # testing ruote-redis
4
+ #
5
+ # Started in Narita, finished in Santa Barbara
6
+ #
7
+ # Fri Feb 3 14:47:04 JST 2012
8
+ #
9
+
10
+ $:.unshift(File.expand_path('../../../../ruote/lib', __FILE__))
11
+ $:.unshift(File.expand_path('../../../lib', __FILE__))
12
+
13
+ require 'rubygems'
14
+
15
+ require 'pp'
16
+
17
+ require 'rufus-json/automatic'
18
+ require 'redis'
19
+
20
+ require 'ruote'
21
+ #require 'ruote/storage/fs_storage'
22
+ require 'ruote-redis'
23
+
24
+ N = 1000
25
+
26
+ $dash = Ruote::Dashboard.new(
27
+ Ruote::Worker.new(
28
+ Ruote::Redis::Storage.new(
29
+ 'db' => 13, 'thread_safe' => true)))
30
+ #Ruote::HashStorage.new))
31
+ #Ruote::FsStorage.new('work')))
32
+
33
+ p $dash.storage_participant.size
34
+ $dash.storage.purge!
35
+ #p $dash.processes.size
36
+ p $dash.storage_participant.size
37
+
38
+ #exit 0
39
+
40
+ $dash.register 'toto', Ruote::StorageParticipant
41
+
42
+ $pdef = Ruote.define do
43
+ sequence do
44
+ sequence do
45
+ toto
46
+ end
47
+ end
48
+ end
49
+
50
+ $wfids = []
51
+
52
+ N.times do |i|
53
+ $wfids << $dash.launch($pdef)
54
+ print (i % 10 == 0) ? i : '.'; STDOUT.flush
55
+ #sleep 0.001 # jams...
56
+ #sleep 0.005
57
+ end
58
+
59
+ puts
60
+ puts 'launch done'
61
+
62
+ t = Time.now
63
+
64
+ while (n = $dash.storage_participant.size) < N
65
+ sleep 0.050
66
+ p n if (Time.now - t) > 60.0
67
+ break if (Time.now - t) > 2 * 60.0
68
+ end
69
+
70
+ puts "took #{Time.now - t}s"
71
+ p $dash.storage_participant.size
72
+
73
+ $dash.shutdown
74
+ $dash.storage.purge!
75
+
@@ -0,0 +1,36 @@
1
+
2
+ $:.unshift(File.expand_path('../../../../ruote/lib', __FILE__))
3
+ $:.unshift(File.expand_path('../../../lib', __FILE__))
4
+
5
+ require 'rubygems'
6
+
7
+ require 'pp'
8
+
9
+ require 'redis'
10
+
11
+ N = 10_000
12
+
13
+ redis = ::Redis.new('db' => 12, 'thread_safe' => true)
14
+
15
+ p redis.del('put_gun')
16
+
17
+ N.times do
18
+ msg = (Time.now.to_f.to_s + '__') * 50
19
+ redis.rpush('put_gun', msg)
20
+ end
21
+
22
+ p redis.llen('put_gun')
23
+
24
+ results = []
25
+
26
+ loop do
27
+ x = redis.lpop('put_gun')
28
+ break unless x
29
+ results << x
30
+ end
31
+
32
+ p results.size
33
+ p results.sort.uniq.size
34
+
35
+ # it's always N, redis is great
36
+
@@ -21,11 +21,13 @@ class RrLogger
21
21
  end
22
22
 
23
23
 
24
- def new_storage (opts)
24
+ def new_storage(opts)
25
+
26
+ #Ruote::Redis::Storage.new(
27
+ # ::Redis.new(:db => 14, :thread_safe => true, :logger => RrLogger.new),
28
+ # opts)
25
29
 
26
30
  Ruote::Redis::Storage.new(
27
- ::Redis.new(:db => 14, :thread_safe => true),
28
- #::Redis.new(:db => 14, :thread_safe => true, :logger => RrLogger.new),
29
- opts)
31
+ opts.merge('db' => 14, 'thread_safe' => true, 'pop_count' => 28))
30
32
  end
31
33
 
metadata CHANGED
@@ -1,119 +1,108 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: ruote-redis
3
- version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 2
7
- - 2
8
- - 0
9
- version: 2.2.0
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.3.0
5
+ prerelease:
10
6
  platform: ruby
11
- authors:
7
+ authors:
12
8
  - John Mettraux
13
9
  autorequire:
14
10
  bindir: bin
15
11
  cert_chain: []
16
-
17
- date: 2011-03-01 00:00:00 +09:00
18
- default_executable:
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
12
+ date: 2012-09-01 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
21
15
  name: redis
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
24
17
  none: false
25
- requirements:
26
- - - "="
27
- - !ruby/object:Gem::Version
28
- segments:
29
- - 2
30
- - 1
31
- - 1
32
- version: 2.1.1
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
33
22
  type: :runtime
34
- version_requirements: *id001
35
- - !ruby/object:Gem::Dependency
36
- name: ruote
37
23
  prerelease: false
38
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: ruote
32
+ requirement: !ruby/object:Gem::Requirement
39
33
  none: false
40
- requirements:
41
- - - ">="
42
- - !ruby/object:Gem::Version
43
- segments:
44
- - 2
45
- - 2
46
- - 0
47
- version: 2.2.0
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: 2.3.0
48
38
  type: :runtime
49
- version_requirements: *id002
50
- - !ruby/object:Gem::Dependency
51
- name: rake
52
39
  prerelease: false
53
- requirement: &id003 !ruby/object:Gem::Requirement
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: 2.3.0
46
+ - !ruby/object:Gem::Dependency
47
+ name: rake
48
+ requirement: !ruby/object:Gem::Requirement
54
49
  none: false
55
- requirements:
56
- - - ">="
57
- - !ruby/object:Gem::Version
58
- segments:
59
- - 0
60
- version: "0"
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
61
54
  type: :development
62
- version_requirements: *id003
63
- description: "\n\
64
- Redis storage for ruote (a Ruby workflow engine)\n"
65
- email:
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ description: ! "\nRedis storage for ruote (a Ruby workflow engine)\n "
63
+ email:
66
64
  - jmettraux@gmail.com
67
65
  executables: []
68
-
69
66
  extensions: []
70
-
71
67
  extra_rdoc_files: []
72
-
73
- files:
68
+ files:
74
69
  - Rakefile
75
70
  - lib/ruote/redis/storage.rb
76
71
  - lib/ruote/redis/version.rb
77
72
  - lib/ruote/redis.rb
78
73
  - lib/ruote-redis.rb
79
- - test/functional_connection.rb
74
+ - test/bm/loaded.rb
75
+ - test/bughunt/launch_gun.rb
76
+ - test/bughunt/put_gun.rb
77
+ - test/connection.rb
80
78
  - ruote-redis.gemspec
81
79
  - CHANGELOG.txt
82
80
  - CREDITS.txt
83
81
  - LICENSE.txt
84
82
  - TODO.txt
85
83
  - README.rdoc
86
- has_rdoc: true
87
84
  homepage: http://ruote.rubyforge.org
88
85
  licenses: []
89
-
90
86
  post_install_message:
91
87
  rdoc_options: []
92
-
93
- require_paths:
88
+ require_paths:
94
89
  - lib
95
- required_ruby_version: !ruby/object:Gem::Requirement
90
+ required_ruby_version: !ruby/object:Gem::Requirement
96
91
  none: false
97
- requirements:
98
- - - ">="
99
- - !ruby/object:Gem::Version
100
- segments:
101
- - 0
102
- version: "0"
103
- required_rubygems_version: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ! '>='
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ required_rubygems_version: !ruby/object:Gem::Requirement
104
97
  none: false
105
- requirements:
106
- - - ">="
107
- - !ruby/object:Gem::Version
108
- segments:
109
- - 0
110
- version: "0"
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
111
102
  requirements: []
112
-
113
103
  rubyforge_project: ruote
114
- rubygems_version: 1.3.7
104
+ rubygems_version: 1.8.24
115
105
  signing_key:
116
106
  specification_version: 3
117
107
  summary: Redis storage for ruote (a Ruby workflow engine)
118
108
  test_files: []
119
-