ruote-sequel 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.txt ADDED
@@ -0,0 +1,8 @@
1
+
2
+ = ruote-sequel - CHANGELOG.txt
3
+
4
+
5
+ == ruote-sequel 2.2.0 released 2011/03/01
6
+
7
+ - initial release
8
+
data/CREDITS.txt ADDED
@@ -0,0 +1,15 @@
1
+
2
+ = ruote-sequel CREDITS.txt
3
+
4
+ == authors
5
+
6
+ - John Mettraux - http://github.com/jmettraux
7
+
8
+
9
+ == contributors
10
+
11
+
12
+ == many thanks to
13
+
14
+ - Jeremy Evans and all the Sequel community
15
+
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+
2
+ Copyright (c) 2005-2011, 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
+
data/README.rdoc ADDED
@@ -0,0 +1,75 @@
1
+
2
+ = ruote-sequel
3
+
4
+ Sequel storage implementation for ruote >= 2.2.0
5
+
6
+
7
+ == usage
8
+
9
+ This is how a ruote engine is setup with a ruote-dm storage (postgres) and a worker :
10
+
11
+ require 'rubygems'
12
+ require 'json' # gem install json
13
+ require 'ruote'
14
+ require 'ruote-sequel' # gem install ruote-sequel
15
+
16
+ sequel = Sequel.connect('postgres://localhost/ruote_test')
17
+ #sequel = Sequel.connect('mysql://root:root@localhost/ruote_test')
18
+
19
+ engine = Ruote::Engine.new(
20
+ Ruote::Worker.new(
21
+ Ruote::Sequel::Storage.new(sequel)))
22
+
23
+ # ...
24
+
25
+ To create the tables in the database :
26
+
27
+ Ruote::Sequel.create_table($sequel, :re_create => true)
28
+
29
+
30
+ Tested with sequel 3.20.0, with the postgresql (pg 0.10.1) adapter.
31
+
32
+
33
+ == running tests
34
+
35
+ assuming you have
36
+
37
+ ruote/
38
+ ruote-sequel/
39
+
40
+ * unit tests :
41
+
42
+ get into ruote/ and do
43
+
44
+ ruby test/unit/storage.rb -- --sequel
45
+
46
+ * functional tests :
47
+
48
+ get into ruote/ and do
49
+
50
+ ruby test/functional/test.rb -- --sequel
51
+
52
+
53
+ == known issues
54
+
55
+ none
56
+
57
+
58
+ == license
59
+
60
+ MIT
61
+
62
+
63
+ == links
64
+
65
+ http://sequel.rubyforge.org/
66
+
67
+ http://ruote.rubyforge.org/
68
+ http://github.com/jmettraux/ruote-sequel
69
+
70
+
71
+ == feedback
72
+
73
+ mailing list : http://groups.google.com/group/openwferu-users
74
+ irc : irc.freenode.net #ruote
75
+
data/Rakefile ADDED
@@ -0,0 +1,92 @@
1
+
2
+ $:.unshift('.') # 1.9.2
3
+
4
+ require 'rubygems'
5
+
6
+ require 'rake'
7
+ require 'rake/clean'
8
+ require 'rake/rdoctask'
9
+
10
+
11
+ #
12
+ # clean
13
+
14
+ CLEAN.include('pkg', 'rdoc')
15
+
16
+
17
+ #
18
+ # test / spec
19
+
20
+ task :test do
21
+
22
+ puts
23
+ puts "to test ruote-sequel, head to your ruote/ dir and run"
24
+ puts
25
+ puts " ruby test/test.rb -- --sequel"
26
+ puts
27
+ puts "but first, make sure your ruote-sequel/test/functional_connection.rb"
28
+ puts "is set correctly."
29
+ puts
30
+ end
31
+
32
+ task :default => [ :test ]
33
+
34
+
35
+ #
36
+ # gem
37
+
38
+ GEMSPEC_FILE = Dir['*.gemspec'].first
39
+ GEMSPEC = eval(File.read(GEMSPEC_FILE))
40
+ GEMSPEC.validate
41
+
42
+
43
+ desc %{
44
+ builds the gem and places it in pkg/
45
+ }
46
+ task :build do
47
+
48
+ sh "gem build #{GEMSPEC_FILE}"
49
+ sh "mkdir pkg" rescue nil
50
+ sh "mv #{GEMSPEC.name}-#{GEMSPEC.version}.gem pkg/"
51
+ end
52
+
53
+ desc %{
54
+ builds the gem and pushes it to rubygems.org
55
+ }
56
+ task :push => :build do
57
+
58
+ sh "gem push pkg/#{GEMSPEC.name}-#{GEMSPEC.version}.gem"
59
+ end
60
+
61
+
62
+ #
63
+ # rdoc
64
+ #
65
+ # make sure to have rdoc 2.5.x to run that
66
+
67
+ Rake::RDocTask.new do |rd|
68
+
69
+ rd.main = 'README.rdoc'
70
+ rd.rdoc_dir = 'rdoc'
71
+
72
+ rd.rdoc_files.include(
73
+ 'README.rdoc', 'CHANGELOG.txt', 'CREDITS.txt', 'lib/**/*.rb')
74
+
75
+ rd.title = "#{GEMSPEC.name} #{GEMSPEC.version}"
76
+ end
77
+
78
+
79
+ #
80
+ # upload_rdoc
81
+
82
+ desc %{
83
+ upload the rdoc to rubyforge
84
+ }
85
+ task :upload_rdoc => [ :clean, :rdoc ] do
86
+
87
+ account = 'jmettraux@rubyforge.org'
88
+ webdir = '/var/www/gforge-projects/ruote'
89
+
90
+ sh "rsync -azv -e ssh rdoc/#{GEMSPEC.name}_rdoc #{account}:#{webdir}/"
91
+ end
92
+
data/TODO.txt ADDED
@@ -0,0 +1,3 @@
1
+
2
+ [ ] nothing for now
3
+
@@ -0,0 +1,360 @@
1
+ #--
2
+ # Copyright (c) 2005-2011, 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 'sequel'
26
+ require 'ruote/storage/base'
27
+ require 'ruote/sequel/version'
28
+
29
+
30
+ module Ruote
31
+ module Sequel
32
+
33
+ # Creates the 'documents' table necessary for this storage.
34
+ #
35
+ # If re_create is set to true, it will destroy any previous 'documents'
36
+ # table and create it.
37
+ #
38
+ def self.create_table(sequel, re_create=false)
39
+
40
+ m = re_create ? :create_table! : :create_table
41
+
42
+ sequel.send(m, :documents) do
43
+ String :ide, :size => 255, :null => false
44
+ Integer :rev, :null => false
45
+ String :typ, :size => 55, :null => false
46
+ String :doc, :text => true, :null => false
47
+ String :wfid, :size => 255, :index => true
48
+ String :participant_name, :size => 512
49
+ primary_key [ :ide, :rev, :typ ]
50
+ end
51
+ end
52
+
53
+ #
54
+ # A Sequel storage implementation for ruote >= 2.2.0.
55
+ #
56
+ # require 'rubygems'
57
+ # require 'json' # gem install json
58
+ # require 'ruote'
59
+ # require 'ruote-sequel' # gem install ruote-sequel
60
+ #
61
+ # sequel = Sequel.connect('postgres://localhost/ruote_test')
62
+ # #sequel = Sequel.connect('mysql://root:root@localhost/ruote_test')
63
+ #
64
+ # opts = { 'remote_definition_allowed' => true }
65
+ #
66
+ # engine = Ruote::Engine.new(
67
+ # Ruote::Worker.new(
68
+ # Ruote::Sequel::Storage.new(sequel, opts)))
69
+ #
70
+ # # ...
71
+ #
72
+ class Storage
73
+
74
+ include Ruote::StorageBase
75
+
76
+ # The underlying Sequel::Database instance
77
+ #
78
+ attr_reader :sequel
79
+
80
+ def initialize(sequel, options={})
81
+
82
+ @sequel = sequel
83
+ @options = options
84
+
85
+ put_configuration
86
+ end
87
+
88
+ def put_msg(action, options)
89
+
90
+ # put_msg is a unique action, no need for all the complexity of put
91
+
92
+ do_insert(prepare_msg_doc(action, options), 1)
93
+
94
+ nil
95
+ end
96
+
97
+ def put_schedule(flavour, owner_fei, s, msg)
98
+
99
+ # put_schedule is a unique action, no need for all the complexity of put
100
+
101
+ doc = prepare_schedule_doc(flavour, owner_fei, s, msg)
102
+
103
+ return nil unless doc
104
+
105
+ do_insert(doc, 1)
106
+
107
+ doc['_id']
108
+ end
109
+
110
+ def put(doc, opts={})
111
+
112
+ if doc['_rev']
113
+
114
+ d = get(doc['type'], doc['_id'])
115
+
116
+ return true unless d
117
+ return d if d['_rev'] != doc['_rev']
118
+ # failures
119
+ end
120
+
121
+ nrev = doc['_rev'].to_i + 1
122
+
123
+ begin
124
+
125
+ do_insert(doc, nrev)
126
+
127
+ rescue ::Sequel::DatabaseError => de
128
+
129
+ return (get(doc['type'], doc['_id']) || true)
130
+ # failure
131
+ end
132
+
133
+ @sequel[:documents].where(
134
+ :typ => doc['type'], :ide => doc['_id']
135
+ ).filter { rev < nrev }.delete
136
+
137
+ doc['_rev'] = nrev if opts[:update_rev]
138
+
139
+ nil
140
+ # success
141
+ end
142
+
143
+ def get(type, key)
144
+
145
+ d = do_get(type, key)
146
+
147
+ d ? Rufus::Json.decode(d[:doc]) : nil
148
+ end
149
+
150
+ def delete(doc)
151
+
152
+ raise ArgumentError.new('no _rev for doc') unless doc['_rev']
153
+
154
+ count = do_delete(doc)
155
+
156
+ return (get(doc['type'], doc['_id']) || true) if count != 1
157
+ # failure
158
+
159
+ nil
160
+ # success
161
+ end
162
+
163
+ def get_many(type, key=nil, opts={})
164
+
165
+ ds = @sequel[:documents].where(:typ => type)
166
+
167
+ keys = key ? Array(key) : nil
168
+ ds = ds.filter(:wfid => keys) if keys && keys.first.is_a?(String)
169
+
170
+ return ds.all.size if opts[:count]
171
+
172
+ ds = ds.order(
173
+ *(opts[:descending] ? [ :ide.desc, :rev.desc ] : [ :ide.asc, :rev.asc ])
174
+ )
175
+
176
+ ds = ds.limit(opts[:limit], opts[:skip])
177
+
178
+ docs = ds.all
179
+ docs = select_last_revs(docs, opts[:descending])
180
+ docs = docs.collect { |d| Rufus::Json.decode(d[:doc]) }
181
+
182
+ keys && keys.first.is_a?(Regexp) ?
183
+ docs.select { |doc| keys.find { |key| key.match(doc['_id']) } } :
184
+ docs
185
+
186
+ # (pass on the dataset.filter(:wfid => /regexp/) for now
187
+ # since we have potentially multiple keys)
188
+ end
189
+
190
+ # Returns all the ids of the documents of a given type.
191
+ #
192
+ def ids(type)
193
+
194
+ @sequel[:documents].where(:typ => type).collect { |d| d[:ide] }.uniq.sort
195
+ end
196
+
197
+ # Nukes all the documents in this storage.
198
+ #
199
+ def purge!
200
+
201
+ @sequel[:documents].delete
202
+ end
203
+
204
+ # Returns a string representation the current content of the storage for
205
+ # a given type.
206
+ #
207
+ def dump(type)
208
+
209
+ "=== #{type} ===\n" +
210
+ get_many(type).map { |h| " #{h['_id']} => #{h.inspect}" }.join("\n")
211
+ end
212
+
213
+ # Calls #disconnect on the db. According to Sequel's doc, it closes
214
+ # all the idle connections in the pool (not the active ones).
215
+ #
216
+ def shutdown
217
+
218
+ @sequel.disconnect
219
+ end
220
+
221
+ # Grrr... I should sort the mess between close and shutdown...
222
+ # Tests vs production :-(
223
+ #
224
+ def close
225
+
226
+ @sequel.disconnect
227
+ end
228
+
229
+ # Mainly used by ruote's test/unit/ut_17_storage.rb
230
+ #
231
+ def add_type(type)
232
+
233
+ # does nothing, types are differentiated by the 'typ' column
234
+ end
235
+
236
+ # Nukes a db type and reputs it (losing all the documents that were in it).
237
+ #
238
+ def purge_type!(type)
239
+
240
+ @sequel[:documents].where(:typ => type).delete
241
+ end
242
+
243
+ # A provision made for workitems, allow to query them directly by
244
+ # participant name.
245
+ #
246
+ def by_participant(type, participant_name, opts)
247
+
248
+ raise NotImplementedError if type != 'workitems'
249
+
250
+ docs = @sequel[:documents].where(
251
+ :typ => type, :participant_name => participant_name)
252
+
253
+ select_last_revs(docs).collect { |d| Rufus::Json.decode(d[:doc]) }
254
+ end
255
+
256
+ # Querying workitems by field (warning, goes deep into the JSON structure)
257
+ #
258
+ def by_field(type, field, value=nil)
259
+
260
+ raise NotImplementedError if type != 'workitems'
261
+
262
+ lk = [ '%"', field, '":' ]
263
+ lk.push(Rufus::Json.encode(value)) if value
264
+ lk.push('%')
265
+
266
+ docs = @sequel[:documents].where(:typ => type).filter(:doc.like(lk.join))
267
+
268
+ select_last_revs(docs).collect { |d| Rufus::Json.decode(d[:doc]) }
269
+ end
270
+
271
+ def query_workitems(criteria)
272
+
273
+ ds = @sequel[:documents].where(:typ => 'workitems')
274
+
275
+ return select_last_revs(ds.all).size if criteria['count']
276
+
277
+ limit = criteria.delete('limit')
278
+ offset = criteria.delete('offset')
279
+
280
+ ds = ds.limit(limit, offset)
281
+
282
+ wfid =
283
+ criteria.delete('wfid')
284
+ pname =
285
+ criteria.delete('participant_name') || criteria.delete('participant')
286
+
287
+ ds = ds.filter(:ide.like("%!#{wfid}")) if wfid
288
+ ds = ds.filter(:participant_name => pname) if pname
289
+
290
+ criteria.collect do |k, v|
291
+ ds = ds.filter(:doc.like("%\"#{k}\":#{Rufus::Json.encode(v)}%"))
292
+ end
293
+
294
+ select_last_revs(ds.all).collect { |d|
295
+ Ruote::Workitem.new(Rufus::Json.decode(d[:doc]))
296
+ }
297
+ end
298
+
299
+ protected
300
+
301
+ def do_delete(doc)
302
+
303
+ @sequel[:documents].where(
304
+ :ide => doc['_id'], :typ => doc['type'], :rev => doc['_rev'].to_i
305
+ ).delete
306
+ end
307
+
308
+ def do_insert(doc, rev)
309
+
310
+ @sequel[:documents].insert(
311
+ :ide => doc['_id'],
312
+ :rev => rev,
313
+ :typ => doc['type'],
314
+ :doc => Rufus::Json.encode(doc.merge(
315
+ '_rev' => rev,
316
+ 'put_at' => Ruote.now_to_utc_s)),
317
+ :wfid => extract_wfid(doc),
318
+ :participant_name => doc['participant_name']
319
+ )
320
+ end
321
+
322
+ def extract_wfid(doc)
323
+
324
+ doc['wfid'] || (doc['fei'] ? doc['fei']['wfid'] : nil)
325
+ end
326
+
327
+ def do_get(type, key)
328
+
329
+ @sequel[:documents].where(
330
+ :typ => type, :ide => key
331
+ ).reverse_order(:rev).first
332
+ end
333
+
334
+ # Don't put configuration if it's already in
335
+ #
336
+ # (avoid storages from trashing configuration...)
337
+ #
338
+ def put_configuration
339
+
340
+ return if get('configurations', 'engine')
341
+
342
+ conf = { '_id' => 'engine', 'type' => 'configurations' }.merge(@options)
343
+ put(conf)
344
+ end
345
+
346
+ def select_last_revs(docs, reverse=false)
347
+
348
+ docs = docs.inject({}) { |h, doc|
349
+ h[doc[:ide]] = doc
350
+ h
351
+ }.values.sort_by { |h|
352
+ h[:ide]
353
+ }
354
+
355
+ reverse ? docs.reverse : docs
356
+ end
357
+ end
358
+ end
359
+ end
360
+
@@ -0,0 +1,8 @@
1
+
2
+ module Ruote
3
+ module Sequel
4
+
5
+ VERSION = '2.2.0'
6
+ end
7
+ end
8
+
@@ -0,0 +1,3 @@
1
+
2
+ require 'ruote/sequel/storage'
3
+
@@ -0,0 +1,3 @@
1
+
2
+ require 'ruote/sequel/storage'
3
+
@@ -0,0 +1,33 @@
1
+ # encoding: utf-8
2
+
3
+ Gem::Specification.new do |s|
4
+
5
+ s.name = 'ruote-sequel'
6
+ s.version = File.read('lib/ruote/sequel/version.rb').match(/VERSION = '([^']+)'/)[1]
7
+ s.platform = Gem::Platform::RUBY
8
+ s.authors = [ 'John Mettraux' ]
9
+ s.email = [ 'jmettraux@gmail.com' ]
10
+ s.homepage = 'http://ruote.rubyforge.org'
11
+ s.rubyforge_project = 'ruote'
12
+ s.summary = 'Sequel storage for ruote (a workflow engine)'
13
+ s.description = %q{
14
+ Sequel storage for ruote (a workflow engine)
15
+ }
16
+
17
+ #s.files = `git ls-files`.split("\n")
18
+ s.files = Dir[
19
+ 'Rakefile',
20
+ 'lib/**/*.rb', 'spec/**/*.rb', 'test/**/*.rb',
21
+ '*.gemspec', '*.txt', '*.rdoc', '*.md'
22
+ ]
23
+
24
+ s.add_runtime_dependency 'sequel', '3.20.0'
25
+ s.add_runtime_dependency 'ruote', ">= #{s.version}"
26
+
27
+ s.add_development_dependency 'rake'
28
+ s.add_development_dependency 'pg', '0.10.1'
29
+ s.add_development_dependency 'mysql', '2.8.1'
30
+
31
+ s.require_path = 'lib'
32
+ end
33
+
@@ -0,0 +1,44 @@
1
+
2
+ #
3
+ # testing ruote-sequel
4
+ #
5
+ # Thu Feb 10 11:14:56 JST 2011
6
+ #
7
+
8
+ require 'yajl' rescue require 'json'
9
+ require 'rufus-json'
10
+ Rufus::Json.detect_backend
11
+
12
+ require 'ruote-sequel'
13
+
14
+ unless $sequel
15
+
16
+ $sequel = Sequel.connect('postgres://localhost/ruote_test')
17
+ #$sequel = Sequel.connect('mysql://root:root@localhost/ruote_test')
18
+
19
+ Ruote::Sequel.create_table($sequel, true)
20
+ # true forces re_create of 'documents' table
21
+
22
+ require 'logger'
23
+
24
+ logger = nil
25
+
26
+ if ARGV.include?('-l') || ARGV.include?('--l')
27
+ FileUtils.rm('debug.log') rescue nil
28
+ logger = Logger.new('debug.log')
29
+ elsif ARGV.include?('-ls') || ARGV.include?('--ls')
30
+ logger = Logger.new($stdout)
31
+ end
32
+
33
+ if logger
34
+ logger.level = Logger::DEBUG
35
+ $sequel.loggers << logger
36
+ end
37
+ end
38
+
39
+
40
+ def new_storage (opts)
41
+
42
+ Ruote::Sequel::Storage.new($sequel, opts)
43
+ end
44
+
data/test/test.rb ADDED
@@ -0,0 +1,7 @@
1
+
2
+ puts %{
3
+ ~~~
4
+ please read the README about how to run ruote-sequel tests
5
+ ~~~
6
+ }
7
+
metadata ADDED
@@ -0,0 +1,150 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ruote-sequel
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 2
7
+ - 2
8
+ - 0
9
+ version: 2.2.0
10
+ platform: ruby
11
+ authors:
12
+ - John Mettraux
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2011-03-01 00:00:00 +09:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: sequel
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - "="
27
+ - !ruby/object:Gem::Version
28
+ segments:
29
+ - 3
30
+ - 20
31
+ - 0
32
+ version: 3.20.0
33
+ type: :runtime
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: ruote
37
+ prerelease: false
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ segments:
44
+ - 2
45
+ - 2
46
+ - 0
47
+ version: 2.2.0
48
+ type: :runtime
49
+ version_requirements: *id002
50
+ - !ruby/object:Gem::Dependency
51
+ name: rake
52
+ prerelease: false
53
+ requirement: &id003 !ruby/object:Gem::Requirement
54
+ none: false
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ segments:
59
+ - 0
60
+ version: "0"
61
+ type: :development
62
+ version_requirements: *id003
63
+ - !ruby/object:Gem::Dependency
64
+ name: pg
65
+ prerelease: false
66
+ requirement: &id004 !ruby/object:Gem::Requirement
67
+ none: false
68
+ requirements:
69
+ - - "="
70
+ - !ruby/object:Gem::Version
71
+ segments:
72
+ - 0
73
+ - 10
74
+ - 1
75
+ version: 0.10.1
76
+ type: :development
77
+ version_requirements: *id004
78
+ - !ruby/object:Gem::Dependency
79
+ name: mysql
80
+ prerelease: false
81
+ requirement: &id005 !ruby/object:Gem::Requirement
82
+ none: false
83
+ requirements:
84
+ - - "="
85
+ - !ruby/object:Gem::Version
86
+ segments:
87
+ - 2
88
+ - 8
89
+ - 1
90
+ version: 2.8.1
91
+ type: :development
92
+ version_requirements: *id005
93
+ description: "\n\
94
+ Sequel storage for ruote (a workflow engine)\n"
95
+ email:
96
+ - jmettraux@gmail.com
97
+ executables: []
98
+
99
+ extensions: []
100
+
101
+ extra_rdoc_files: []
102
+
103
+ files:
104
+ - Rakefile
105
+ - lib/ruote/sequel/storage.rb
106
+ - lib/ruote/sequel/version.rb
107
+ - lib/ruote/sequel.rb
108
+ - lib/ruote-sequel.rb
109
+ - test/functional_connection.rb
110
+ - test/test.rb
111
+ - ruote-sequel.gemspec
112
+ - CHANGELOG.txt
113
+ - CREDITS.txt
114
+ - LICENSE.txt
115
+ - TODO.txt
116
+ - README.rdoc
117
+ has_rdoc: true
118
+ homepage: http://ruote.rubyforge.org
119
+ licenses: []
120
+
121
+ post_install_message:
122
+ rdoc_options: []
123
+
124
+ require_paths:
125
+ - lib
126
+ required_ruby_version: !ruby/object:Gem::Requirement
127
+ none: false
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ segments:
132
+ - 0
133
+ version: "0"
134
+ required_rubygems_version: !ruby/object:Gem::Requirement
135
+ none: false
136
+ requirements:
137
+ - - ">="
138
+ - !ruby/object:Gem::Version
139
+ segments:
140
+ - 0
141
+ version: "0"
142
+ requirements: []
143
+
144
+ rubyforge_project: ruote
145
+ rubygems_version: 1.3.7
146
+ signing_key:
147
+ specification_version: 3
148
+ summary: Sequel storage for ruote (a workflow engine)
149
+ test_files: []
150
+