ruote-redis 2.1.10

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,9 @@
1
+
2
+ = ruote-redis - CHANGELOG.txt
3
+
4
+
5
+ == ruote-redis 2.1.10 released 2010/06/15
6
+
7
+ - works with redis-rb 1.0.2 and 2.0
8
+ - initial release
9
+
@@ -0,0 +1,21 @@
1
+
2
+ Copyright (c) 2001-2010, 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
+
@@ -0,0 +1,73 @@
1
+
2
+ = ruote-redis
3
+
4
+ Redis persistence for ruote 2.1 (a ruby workflow engine)
5
+
6
+
7
+ == usage
8
+
9
+ The storage is instantiate by passing a redis-rb instance to the storage.
10
+
11
+ require 'redis' # gem install redis
12
+ require 'ruote' # gem install ruote
13
+ require 'ruote-redis' # gem install ruote-redis
14
+
15
+ engine = Ruote::Engine.new(
16
+ Ruote::Worker.new(
17
+ Ruote::Redis::RedisStorage.new(
18
+ ::Redis.new(:db => 14, :thread_safe => true), {})))
19
+
20
+ # ...
21
+
22
+ Passing an em-redis instance might work, but I haven't tried.
23
+
24
+ Tested with Redis 1.3.8 (redis-rb 2.0.1).
25
+
26
+
27
+ == running tests
28
+
29
+ assuming you have
30
+
31
+ ruote/
32
+ ruote-redis/
33
+
34
+ start a redis server instance (port 6379) and then
35
+
36
+
37
+ * unit tests :
38
+
39
+ get into ruote/ and do
40
+
41
+ ruby test/unit/storage.rb --redis
42
+
43
+ * functional tests :
44
+
45
+ get into ruote/ and do
46
+
47
+ ruby test/functional/test.rb --redis
48
+
49
+
50
+ == license
51
+
52
+ MIT
53
+
54
+
55
+ == links
56
+
57
+ * http://code.google.com/p/redis/
58
+ * http://github.com/ezmobius/redis-rb
59
+
60
+ * http://ruote.rubyforge.org/
61
+ * http://github.com/jmettraux/ruote-redis
62
+
63
+
64
+ == feedback
65
+
66
+ mailing list : http://groups.google.com/group/openwferu-users
67
+ irc : irc.freenode.net #ruote
68
+
69
+
70
+ == many thanks to
71
+
72
+ - the Redis authors and the redis-rb authors
73
+
@@ -0,0 +1,78 @@
1
+
2
+ require 'rubygems'
3
+ require 'rake'
4
+
5
+ require 'lib/ruote/redis/version.rb'
6
+
7
+ #
8
+ # CLEAN
9
+
10
+ require 'rake/clean'
11
+ CLEAN.include('pkg', 'tmp', 'html')
12
+ task :default => [ :clean ]
13
+
14
+
15
+ #
16
+ # GEM
17
+
18
+ require 'jeweler'
19
+
20
+ Jeweler::Tasks.new do |gem|
21
+
22
+ gem.version = Ruote::Redis::VERSION
23
+ gem.name = 'ruote-redis'
24
+ gem.summary = 'Redis storage for ruote (a ruby workflow engine)'
25
+ gem.description = %{
26
+ Redis storage for ruote (a ruby workflow engine)
27
+ }.strip
28
+ gem.email = 'jmettraux@gmail.com'
29
+ gem.homepage = 'http://github.com/jmettraux/ruote-redis'
30
+ gem.authors = [ 'John Mettraux' ]
31
+ gem.rubyforge_project = 'ruote'
32
+
33
+ #gem.test_file = 'test/test.rb'
34
+
35
+ gem.add_dependency 'ruote', ">= #{Ruote::Redis::VERSION}"
36
+ gem.add_dependency 'redis', '>= 2.0.1'
37
+ gem.add_development_dependency 'yard'
38
+ gem.add_development_dependency 'rake'
39
+ gem.add_development_dependency 'jeweler'
40
+
41
+ # gemspec spec : http://www.rubygems.org/read/chapter/20
42
+ end
43
+ Jeweler::GemcutterTasks.new
44
+
45
+
46
+ #
47
+ # DOC
48
+
49
+ begin
50
+
51
+ require 'yard'
52
+
53
+ YARD::Rake::YardocTask.new do |doc|
54
+ doc.options = [
55
+ '-o', 'html/ruote-redis', '--title',
56
+ "ruote-redis #{Ruote::Redis::VERSION}"
57
+ ]
58
+ end
59
+
60
+ rescue LoadError
61
+
62
+ task :yard do
63
+ abort "YARD is not available : sudo gem install yard"
64
+ end
65
+ end
66
+
67
+
68
+ #
69
+ # TO THE WEB
70
+
71
+ task :upload_website => [ :clean, :yard ] do
72
+
73
+ account = 'jmettraux@rubyforge.org'
74
+ webdir = '/var/www/gforge-projects/ruote'
75
+
76
+ sh "rsync -azv -e ssh html/ruote-redis #{account}:#{webdir}/"
77
+ end
78
+
@@ -0,0 +1,10 @@
1
+
2
+ [x] methods specific to StorageParticipant
3
+ [o] redis -> @redis
4
+
5
+ [ ] 1 ::Redis instance per thread ? (instead of :thread_safe => true)
6
+ [ ] update to redis-rb 2.0 (which has sthing about threads)
7
+ http://blog.citrusbyte.com/2010/05/14/redis-rb-200/
8
+
9
+ [ ] double-check for deletion of old keys
10
+
@@ -0,0 +1,3 @@
1
+
2
+ require 'ruote/redis/storage'
3
+
@@ -0,0 +1,3 @@
1
+
2
+ require 'ruote/redis/storage'
3
+
@@ -0,0 +1,297 @@
1
+ #--
2
+ # Copyright (c) 2005-2010, 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
+
25
+ #require 'redis'
26
+ # now letting the end-user doing this require
27
+
28
+ require 'rufus-json'
29
+ require 'ruote/storage/base'
30
+ require 'ruote/redis/version'
31
+
32
+
33
+ module Ruote
34
+ module Redis
35
+
36
+ #
37
+ # A Redis storage for ruote.
38
+ #
39
+ # 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
41
+ # ruote engine options ( see
42
+ # http://ruote.rubyforge.org/configuration.html#engine )
43
+ #
44
+ # require 'redis' # gem install redis
45
+ # require 'ruote' # gem install ruote
46
+ # require 'ruote-redis' # gem install ruote-redis
47
+ #
48
+ # engine = Ruote::Engine.new(
49
+ # Ruote::Worker.new(
50
+ # Ruote::Redis::RedisStorage.new(
51
+ # ::Redis.new(:db => 14, :thread_safe => true), {})))
52
+ #
53
+ #
54
+ # == em-redis
55
+ #
56
+ # Not tried, but I guess, that substituting an instance of em-redis for
57
+ # the redis instance passed to the constructor might work.
58
+ # http://github.com/madsimian/em-redis
59
+ #
60
+ # If you try and it works, feedback is welcome
61
+ # http://groups.google.com/group/openwferu-users
62
+ #
63
+ class RedisStorage
64
+
65
+ include Ruote::StorageBase
66
+
67
+ attr_reader :redis
68
+
69
+ def initialize (redis, options={})
70
+
71
+ @redis = redis
72
+ @options = options
73
+
74
+ def @redis.keys_to_a (opt)
75
+ r = keys(opt)
76
+ r.is_a?(Array) ? r : r.split(' ')
77
+ end
78
+
79
+ put_configuration
80
+ end
81
+
82
+ def reserve (doc)
83
+
84
+ @redis.del(key_for(doc))
85
+ end
86
+
87
+ def put_msg (action, options)
88
+
89
+ doc = prepare_msg_doc(action, options)
90
+
91
+ @redis.set(key_for(doc), to_json(doc))
92
+
93
+ nil
94
+ end
95
+
96
+ def put_schedule (flavour, owner_fei, s, msg)
97
+
98
+ if doc = prepare_schedule_doc(flavour, owner_fei, s, msg)
99
+ @redis.set(key_for(doc), to_json(doc))
100
+ return doc['_id']
101
+ end
102
+
103
+ nil
104
+ end
105
+
106
+ def delete_schedule (schedule_id)
107
+
108
+ @redis.del(key_for('schedules', schedule_id))
109
+ end
110
+
111
+ def put (doc, opts={})
112
+
113
+ rev = doc['_rev'].to_i
114
+ key = key_for(doc)
115
+
116
+ current_rev = @redis.get(key).to_i
117
+
118
+ return true if current_rev == 0 && rev > 0
119
+ return do_get(doc, current_rev) if rev != current_rev
120
+
121
+ nrev = rev + 1
122
+
123
+ # the setnx here is crucial in multiple workers env...
124
+
125
+ r = @redis.setnx(
126
+ key_rev_for(doc, nrev),
127
+ to_json(doc.merge('_rev' => nrev), opts))
128
+
129
+ return get(doc['type'], doc['_id']) if r == false
130
+
131
+ @redis.set(key, nrev)
132
+ @redis.del(key_rev_for(doc, rev)) if rev > 0
133
+
134
+ doc['_rev'] = nrev if opts[:update_rev]
135
+
136
+ nil
137
+ end
138
+
139
+ def get (type, key)
140
+
141
+ do_get(type, key, @redis.get(key_for(type, key)))
142
+ end
143
+
144
+ def delete (doc)
145
+
146
+ raise ArgumentError.new(
147
+ "can't delete doc without _rev") unless doc['_rev']
148
+
149
+ r = put(doc, :delete => true)
150
+
151
+ return r if r != nil
152
+
153
+ @redis.keys_to_a("#{key_for(doc)}*").sort.each { |k|
154
+ Thread.pass # lingering a bit...
155
+ @redis.del(k)
156
+ }
157
+ # deleting the key_rev last and making 1 'keys' call preliminarily
158
+
159
+ nil
160
+ end
161
+
162
+ def get_many (type, key=nil, opts={})
163
+
164
+ keys = "#{type}/*"
165
+
166
+ ids = if type == 'msgs' || type == 'schedules'
167
+
168
+ @redis.keys_to_a(keys)
169
+
170
+ else
171
+
172
+ @redis.keys_to_a(keys).inject({}) { |h, k|
173
+
174
+ if m = k.match(/^[^\/]+\/([^\/]+)\/(\d+)$/)
175
+
176
+ if ( ! key) || m[1].match(key)
177
+
178
+ o = h[m[1]]
179
+ n = [ m[2].to_i, k ]
180
+ h[m[1]] = [ m[2].to_i, k ] if ( ! o) || o.first < n.first
181
+ end
182
+ end
183
+
184
+ h
185
+ }.values.collect { |i| i[1] }
186
+ end
187
+
188
+ if l = opts[:limit]
189
+ ids = ids[0, l]
190
+ end
191
+
192
+ ids.inject([]) do |a, i|
193
+ v = @redis.get(i)
194
+ a << Rufus::Json.decode(v) if v
195
+ a
196
+ end
197
+ end
198
+
199
+ def ids (type)
200
+
201
+ @redis.keys_to_a("#{type}/*").inject([]) { |a, k|
202
+
203
+ if m = k.match(/^[^\/]+\/([^\/]+)$/)
204
+ a << m[1]
205
+ end
206
+
207
+ a
208
+ }.sort
209
+ end
210
+
211
+ def purge!
212
+
213
+ @redis.keys_to_a('*').each { |k| @redis.del(k) }
214
+ end
215
+
216
+ #def dump (type)
217
+ # @dbs[type].dump
218
+ #end
219
+
220
+ def shutdown
221
+ end
222
+
223
+ # Mainly used by ruote's test/unit/ut_17_storage.rb
224
+ #
225
+ def add_type (type)
226
+ end
227
+
228
+ # Nukes a db type and reputs it (losing all the documents that were in it).
229
+ #
230
+ def purge_type! (type)
231
+
232
+ @redis.keys_to_a("#{type}/*").each { |k| @redis.del(k) }
233
+ end
234
+
235
+ protected
236
+
237
+ # key_for(doc)
238
+ # key_for(type, key)
239
+ #
240
+ def key_for (*args)
241
+
242
+ a = args.first
243
+
244
+ (a.is_a?(Hash) ? [ a['type'], a['_id'] ] : args[0, 2]).join('/')
245
+ end
246
+
247
+ # key_rev_for(doc)
248
+ # key_rev_for(doc, rev)
249
+ # key_rev_for(type, key, rev)
250
+ #
251
+ def key_rev_for (*args)
252
+
253
+ as = nil
254
+ a = args.first
255
+
256
+ if a.is_a?(Hash)
257
+ as = [ a['type'], a['_id'], a['_rev'] ] if a.is_a?(Hash)
258
+ as[2] = args[1] if args[1]
259
+ else
260
+ as = args[0, 3]
261
+ end
262
+
263
+ as.join('/')
264
+ end
265
+
266
+ def do_get (*args)
267
+
268
+ d = @redis.get(key_rev_for(*args))
269
+
270
+ d ? Rufus::Json.decode(d) : nil
271
+ end
272
+
273
+ def to_json (doc, opts={})
274
+
275
+ doc = if opts[:delete]
276
+ nil
277
+ else
278
+ doc.merge('put_at' => Ruote.now_to_utc_s)
279
+ end
280
+
281
+ Rufus::Json.encode(doc)
282
+ end
283
+
284
+ # Don't put configuration if it's already in
285
+ #
286
+ # (avoid storages from trashing configuration...)
287
+ #
288
+ def put_configuration
289
+
290
+ return if get('configurations', 'engine')
291
+
292
+ put({ '_id' => 'engine', 'type' => 'configurations' }.merge(@options))
293
+ end
294
+ end
295
+ end
296
+ end
297
+
@@ -0,0 +1,7 @@
1
+
2
+ module Ruote
3
+ module Redis
4
+ VERSION = '2.1.10'
5
+ end
6
+ end
7
+
@@ -0,0 +1,67 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{ruote-redis}
8
+ s.version = "2.1.10"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["John Mettraux"]
12
+ s.date = %q{2010-06-15}
13
+ s.description = %q{Redis storage for ruote (a ruby workflow engine)}
14
+ s.email = %q{jmettraux@gmail.com}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE.txt",
17
+ "README.rdoc"
18
+ ]
19
+ s.files = [
20
+ "CHANGELOG.txt",
21
+ "LICENSE.txt",
22
+ "README.rdoc",
23
+ "Rakefile",
24
+ "TODO.txt",
25
+ "lib/ruote-redis.rb",
26
+ "lib/ruote/redis.rb",
27
+ "lib/ruote/redis/storage.rb",
28
+ "lib/ruote/redis/version.rb",
29
+ "ruote-redis.gemspec",
30
+ "test/functional_connection.rb"
31
+ ]
32
+ s.homepage = %q{http://github.com/jmettraux/ruote-redis}
33
+ s.rdoc_options = ["--charset=UTF-8"]
34
+ s.require_paths = ["lib"]
35
+ s.rubyforge_project = %q{ruote}
36
+ s.rubygems_version = %q{1.3.6}
37
+ s.summary = %q{Redis storage for ruote (a ruby workflow engine)}
38
+ s.test_files = [
39
+ "test/functional_connection.rb"
40
+ ]
41
+
42
+ if s.respond_to? :specification_version then
43
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
44
+ s.specification_version = 3
45
+
46
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
47
+ s.add_runtime_dependency(%q<ruote>, [">= 2.1.10"])
48
+ s.add_runtime_dependency(%q<redis>, [">= 2.0.1"])
49
+ s.add_development_dependency(%q<yard>, [">= 0"])
50
+ s.add_development_dependency(%q<rake>, [">= 0"])
51
+ s.add_development_dependency(%q<jeweler>, [">= 0"])
52
+ else
53
+ s.add_dependency(%q<ruote>, [">= 2.1.10"])
54
+ s.add_dependency(%q<redis>, [">= 2.0.1"])
55
+ s.add_dependency(%q<yard>, [">= 0"])
56
+ s.add_dependency(%q<rake>, [">= 0"])
57
+ s.add_dependency(%q<jeweler>, [">= 0"])
58
+ end
59
+ else
60
+ s.add_dependency(%q<ruote>, [">= 2.1.10"])
61
+ s.add_dependency(%q<redis>, [">= 2.0.1"])
62
+ s.add_dependency(%q<yard>, [">= 0"])
63
+ s.add_dependency(%q<rake>, [">= 0"])
64
+ s.add_dependency(%q<jeweler>, [">= 0"])
65
+ end
66
+ end
67
+
@@ -0,0 +1,31 @@
1
+
2
+ #
3
+ # testing ruote-redis
4
+ #
5
+ # Thu Apr 1 21:35:07 JST 2010
6
+ #
7
+
8
+ require 'yajl' rescue require 'json'
9
+ require 'rufus-json'
10
+ Rufus::Json.detect_backend
11
+
12
+ require 'redis'
13
+ require 'ruote-redis'
14
+
15
+
16
+ class RrLogger
17
+ def method_missing (m, *args)
18
+ super if args.length != 1
19
+ puts ". #{Time.now.to_f} #{Thread.current.object_id} #{args.first}"
20
+ end
21
+ end
22
+
23
+
24
+ def new_storage (opts)
25
+
26
+ Ruote::Redis::RedisStorage.new(
27
+ ::Redis.new(:db => 14, :thread_safe => true),
28
+ #::Redis.new(:db => 14, :thread_safe => true, :logger => RrLogger.new),
29
+ opts)
30
+ end
31
+
metadata ADDED
@@ -0,0 +1,136 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ruote-redis
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 2
7
+ - 1
8
+ - 10
9
+ version: 2.1.10
10
+ platform: ruby
11
+ authors:
12
+ - John Mettraux
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2010-06-15 00:00:00 +09:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: ruote
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ segments:
28
+ - 2
29
+ - 1
30
+ - 10
31
+ version: 2.1.10
32
+ type: :runtime
33
+ version_requirements: *id001
34
+ - !ruby/object:Gem::Dependency
35
+ name: redis
36
+ prerelease: false
37
+ requirement: &id002 !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ segments:
42
+ - 2
43
+ - 0
44
+ - 1
45
+ version: 2.0.1
46
+ type: :runtime
47
+ version_requirements: *id002
48
+ - !ruby/object:Gem::Dependency
49
+ name: yard
50
+ prerelease: false
51
+ requirement: &id003 !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ segments:
56
+ - 0
57
+ version: "0"
58
+ type: :development
59
+ version_requirements: *id003
60
+ - !ruby/object:Gem::Dependency
61
+ name: rake
62
+ prerelease: false
63
+ requirement: &id004 !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ segments:
68
+ - 0
69
+ version: "0"
70
+ type: :development
71
+ version_requirements: *id004
72
+ - !ruby/object:Gem::Dependency
73
+ name: jeweler
74
+ prerelease: false
75
+ requirement: &id005 !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ segments:
80
+ - 0
81
+ version: "0"
82
+ type: :development
83
+ version_requirements: *id005
84
+ description: Redis storage for ruote (a ruby workflow engine)
85
+ email: jmettraux@gmail.com
86
+ executables: []
87
+
88
+ extensions: []
89
+
90
+ extra_rdoc_files:
91
+ - LICENSE.txt
92
+ - README.rdoc
93
+ files:
94
+ - CHANGELOG.txt
95
+ - LICENSE.txt
96
+ - README.rdoc
97
+ - Rakefile
98
+ - TODO.txt
99
+ - lib/ruote-redis.rb
100
+ - lib/ruote/redis.rb
101
+ - lib/ruote/redis/storage.rb
102
+ - lib/ruote/redis/version.rb
103
+ - ruote-redis.gemspec
104
+ - test/functional_connection.rb
105
+ has_rdoc: true
106
+ homepage: http://github.com/jmettraux/ruote-redis
107
+ licenses: []
108
+
109
+ post_install_message:
110
+ rdoc_options:
111
+ - --charset=UTF-8
112
+ require_paths:
113
+ - lib
114
+ required_ruby_version: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ segments:
119
+ - 0
120
+ version: "0"
121
+ required_rubygems_version: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - ">="
124
+ - !ruby/object:Gem::Version
125
+ segments:
126
+ - 0
127
+ version: "0"
128
+ requirements: []
129
+
130
+ rubyforge_project: ruote
131
+ rubygems_version: 1.3.6
132
+ signing_key:
133
+ specification_version: 3
134
+ summary: Redis storage for ruote (a ruby workflow engine)
135
+ test_files:
136
+ - test/functional_connection.rb