ruote-sequel 2.2.0 → 2.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.txt +10 -0
- data/CREDITS.txt +11 -2
- data/LICENSE.txt +1 -1
- data/TODO.txt +3 -1
- data/lib/ruote/sequel/storage.rb +182 -80
- data/lib/ruote/sequel/version.rb +25 -1
- data/ruote-sequel.gemspec +8 -4
- data/test/connection.rb +54 -0
- metadata +86 -99
- data/README.rdoc +0 -75
- data/test/functional_connection.rb +0 -44
data/CHANGELOG.txt
CHANGED
@@ -2,6 +2,16 @@
|
|
2
2
|
= ruote-sequel - CHANGELOG.txt
|
3
3
|
|
4
4
|
|
5
|
+
== ruote-sequel 2.3.0 released 2012/09/01
|
6
|
+
|
7
|
+
- switched to "begin_step" model
|
8
|
+
- StorageParticipant#by_participant :skip :limit fix (Thanks Jan Topiński)
|
9
|
+
- #delete : doc count > 1 is OK
|
10
|
+
- StorageParticipant :count => true made consistent (Thanks Jan Topiński)
|
11
|
+
- query_workitems didn't recognize :skip option (Thanks Eric Smith)
|
12
|
+
- 'table_name' option for specifying something other than 'documents'
|
13
|
+
|
14
|
+
|
5
15
|
== ruote-sequel 2.2.0 released 2011/03/01
|
6
16
|
|
7
17
|
- initial release
|
data/CREDITS.txt
CHANGED
@@ -1,15 +1,24 @@
|
|
1
1
|
|
2
2
|
= ruote-sequel CREDITS.txt
|
3
3
|
|
4
|
+
|
4
5
|
== authors
|
5
6
|
|
6
|
-
- John Mettraux -
|
7
|
+
- John Mettraux - https://github.com/jmettraux
|
7
8
|
|
8
9
|
|
9
10
|
== contributors
|
10
11
|
|
12
|
+
- Wesley Moore - https://github.com/wezm
|
13
|
+
|
14
|
+
|
15
|
+
== feedback
|
16
|
+
|
17
|
+
- Chad Albers - https://github.com/neomantic
|
18
|
+
- Eric Smith - issue reporting
|
19
|
+
|
11
20
|
|
12
21
|
== many thanks to
|
13
22
|
|
14
|
-
- Jeremy Evans and
|
23
|
+
- Jeremy Evans and the Sequel community
|
15
24
|
|
data/LICENSE.txt
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
|
2
|
-
Copyright (c) 2005-
|
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
|
data/TODO.txt
CHANGED
data/lib/ruote/sequel/storage.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
#--
|
2
|
-
# Copyright (c) 2005-
|
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
|
@@ -33,20 +33,29 @@ module Sequel
|
|
33
33
|
# Creates the 'documents' table necessary for this storage.
|
34
34
|
#
|
35
35
|
# If re_create is set to true, it will destroy any previous 'documents'
|
36
|
-
# table and create it.
|
36
|
+
# table and create it. If false (default) then the table will be created
|
37
|
+
# if it doesn't already exist.
|
37
38
|
#
|
38
|
-
|
39
|
+
# It's also possible to change the default table_name from 'documents' to
|
40
|
+
# something else with the optional third parameter
|
41
|
+
#
|
42
|
+
def self.create_table(sequel, re_create=false, table_name='documents')
|
43
|
+
|
44
|
+
m = re_create ? :create_table! : :create_table?
|
39
45
|
|
40
|
-
m
|
46
|
+
sequel.send(m, table_name.to_sym) do
|
41
47
|
|
42
|
-
sequel.send(m, :documents) do
|
43
48
|
String :ide, :size => 255, :null => false
|
44
49
|
Integer :rev, :null => false
|
45
50
|
String :typ, :size => 55, :null => false
|
46
51
|
String :doc, :text => true, :null => false
|
47
|
-
String :wfid, :size => 255
|
52
|
+
String :wfid, :size => 255
|
48
53
|
String :participant_name, :size => 512
|
49
|
-
|
54
|
+
|
55
|
+
primary_key [ :typ, :ide, :rev ]
|
56
|
+
|
57
|
+
index :wfid
|
58
|
+
#index [ :typ, :wfid ]
|
50
59
|
end
|
51
60
|
end
|
52
61
|
|
@@ -80,9 +89,10 @@ module Sequel
|
|
80
89
|
def initialize(sequel, options={})
|
81
90
|
|
82
91
|
@sequel = sequel
|
83
|
-
|
92
|
+
#@options = options
|
93
|
+
@table = (options['sequel_table_name'] || :documents).to_sym
|
84
94
|
|
85
|
-
|
95
|
+
replace_engine_configuration(options)
|
86
96
|
end
|
87
97
|
|
88
98
|
def put_msg(action, options)
|
@@ -94,6 +104,17 @@ module Sequel
|
|
94
104
|
nil
|
95
105
|
end
|
96
106
|
|
107
|
+
# Used to reserve 'msgs' and 'schedules'. Simply deletes the document,
|
108
|
+
# return true if the delete was successful (ie if the reservation is
|
109
|
+
# valid).
|
110
|
+
#
|
111
|
+
def reserve(doc)
|
112
|
+
|
113
|
+
@sequel[@table].where(
|
114
|
+
:typ => doc['type'], :ide => doc['_id'], :rev => 1
|
115
|
+
).delete > 0
|
116
|
+
end
|
117
|
+
|
97
118
|
def put_schedule(flavour, owner_fei, s, msg)
|
98
119
|
|
99
120
|
# put_schedule is a unique action, no need for all the complexity of put
|
@@ -109,6 +130,8 @@ module Sequel
|
|
109
130
|
|
110
131
|
def put(doc, opts={})
|
111
132
|
|
133
|
+
cache_clear(doc)
|
134
|
+
|
112
135
|
if doc['_rev']
|
113
136
|
|
114
137
|
d = get(doc['type'], doc['_id'])
|
@@ -122,7 +145,7 @@ module Sequel
|
|
122
145
|
|
123
146
|
begin
|
124
147
|
|
125
|
-
do_insert(doc, nrev)
|
148
|
+
do_insert(doc, nrev, opts[:update_rev])
|
126
149
|
|
127
150
|
rescue ::Sequel::DatabaseError => de
|
128
151
|
|
@@ -130,30 +153,31 @@ module Sequel
|
|
130
153
|
# failure
|
131
154
|
end
|
132
155
|
|
133
|
-
@sequel[
|
156
|
+
@sequel[@table].where(
|
134
157
|
:typ => doc['type'], :ide => doc['_id']
|
135
158
|
).filter { rev < nrev }.delete
|
136
159
|
|
137
|
-
doc['_rev'] = nrev if opts[:update_rev]
|
138
|
-
|
139
160
|
nil
|
140
161
|
# success
|
141
162
|
end
|
142
163
|
|
143
164
|
def get(type, key)
|
144
165
|
|
145
|
-
|
146
|
-
|
147
|
-
d ? Rufus::Json.decode(d[:doc]) : nil
|
166
|
+
cache_get(type, key) || do_get(type, key)
|
148
167
|
end
|
149
168
|
|
150
169
|
def delete(doc)
|
151
170
|
|
152
171
|
raise ArgumentError.new('no _rev for doc') unless doc['_rev']
|
153
172
|
|
154
|
-
|
173
|
+
cache_clear(doc)
|
174
|
+
# usually not necessary, adding it not to forget it later on
|
175
|
+
|
176
|
+
count = @sequel[@table].where(
|
177
|
+
:typ => doc['type'], :ide => doc['_id'], :rev => doc['_rev'].to_i
|
178
|
+
).delete
|
155
179
|
|
156
|
-
return (get(doc['type'], doc['_id']) || true) if count
|
180
|
+
return (get(doc['type'], doc['_id']) || true) if count < 1
|
157
181
|
# failure
|
158
182
|
|
159
183
|
nil
|
@@ -162,26 +186,30 @@ module Sequel
|
|
162
186
|
|
163
187
|
def get_many(type, key=nil, opts={})
|
164
188
|
|
165
|
-
|
189
|
+
cached = cache_get_many(type, key, opts)
|
190
|
+
return cached if cached
|
191
|
+
|
192
|
+
ds = @sequel[@table].where(:typ => type)
|
166
193
|
|
167
194
|
keys = key ? Array(key) : nil
|
168
195
|
ds = ds.filter(:wfid => keys) if keys && keys.first.is_a?(String)
|
169
196
|
|
170
|
-
return ds.
|
197
|
+
return ds.count if opts[:count]
|
171
198
|
|
172
199
|
ds = ds.order(
|
173
|
-
|
200
|
+
opts[:descending] ? :ide.desc : :ide.asc, :rev.desc
|
201
|
+
).limit(
|
202
|
+
opts[:limit], opts[:skip] || opts[:offset]
|
174
203
|
)
|
175
204
|
|
176
|
-
|
177
|
-
|
178
|
-
docs = ds.all
|
179
|
-
docs = select_last_revs(docs, opts[:descending])
|
205
|
+
docs = select_last_revs(ds)
|
180
206
|
docs = docs.collect { |d| Rufus::Json.decode(d[:doc]) }
|
181
207
|
|
182
|
-
keys && keys.first.is_a?(Regexp)
|
183
|
-
docs.select { |doc| keys.find { |key| key.match(doc['_id']) } }
|
208
|
+
if keys && keys.first.is_a?(Regexp)
|
209
|
+
docs.select { |doc| keys.find { |key| key.match(doc['_id']) } }
|
210
|
+
else
|
184
211
|
docs
|
212
|
+
end
|
185
213
|
|
186
214
|
# (pass on the dataset.filter(:wfid => /regexp/) for now
|
187
215
|
# since we have potentially multiple keys)
|
@@ -191,23 +219,14 @@ module Sequel
|
|
191
219
|
#
|
192
220
|
def ids(type)
|
193
221
|
|
194
|
-
@sequel[
|
222
|
+
@sequel[@table].where(:typ => type).collect { |d| d[:ide] }.uniq.sort
|
195
223
|
end
|
196
224
|
|
197
225
|
# Nukes all the documents in this storage.
|
198
226
|
#
|
199
227
|
def purge!
|
200
228
|
|
201
|
-
@sequel[
|
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")
|
229
|
+
@sequel[@table].delete
|
211
230
|
end
|
212
231
|
|
213
232
|
# Calls #disconnect on the db. According to Sequel's doc, it closes
|
@@ -237,25 +256,34 @@ module Sequel
|
|
237
256
|
#
|
238
257
|
def purge_type!(type)
|
239
258
|
|
240
|
-
@sequel[
|
259
|
+
@sequel[@table].where(:typ => type).delete
|
241
260
|
end
|
242
261
|
|
243
262
|
# A provision made for workitems, allow to query them directly by
|
244
263
|
# participant name.
|
245
264
|
#
|
246
|
-
def by_participant(type, participant_name, opts)
|
265
|
+
def by_participant(type, participant_name, opts={})
|
247
266
|
|
248
267
|
raise NotImplementedError if type != 'workitems'
|
249
268
|
|
250
|
-
docs = @sequel[
|
251
|
-
:typ => type, :participant_name => participant_name
|
269
|
+
docs = @sequel[@table].where(
|
270
|
+
:typ => type, :participant_name => participant_name
|
271
|
+
)
|
272
|
+
|
273
|
+
return docs.count if opts[:count]
|
274
|
+
|
275
|
+
docs = docs.order(
|
276
|
+
:ide.asc, :rev.desc
|
277
|
+
).limit(
|
278
|
+
opts[:limit], opts[:offset] || opts[:skip]
|
279
|
+
)
|
252
280
|
|
253
|
-
select_last_revs(docs).collect { |d|
|
281
|
+
select_last_revs(docs).collect { |d| Ruote::Workitem.from_json(d[:doc]) }
|
254
282
|
end
|
255
283
|
|
256
284
|
# Querying workitems by field (warning, goes deep into the JSON structure)
|
257
285
|
#
|
258
|
-
def by_field(type, field, value=
|
286
|
+
def by_field(type, field, value, opts={})
|
259
287
|
|
260
288
|
raise NotImplementedError if type != 'workitems'
|
261
289
|
|
@@ -263,21 +291,31 @@ module Sequel
|
|
263
291
|
lk.push(Rufus::Json.encode(value)) if value
|
264
292
|
lk.push('%')
|
265
293
|
|
266
|
-
docs = @sequel[
|
294
|
+
docs = @sequel[@table].where(
|
295
|
+
:typ => type
|
296
|
+
).filter(
|
297
|
+
:doc.like(lk.join)
|
298
|
+
)
|
299
|
+
|
300
|
+
return docs.count if opts[:count]
|
301
|
+
|
302
|
+
docs = docs.order(
|
303
|
+
:ide.asc, :rev.desc
|
304
|
+
).limit(
|
305
|
+
opts[:limit], opts[:offset] || opts[:skip]
|
306
|
+
)
|
267
307
|
|
268
|
-
select_last_revs(docs).collect { |d|
|
308
|
+
select_last_revs(docs).collect { |d| Ruote::Workitem.from_json(d[:doc]) }
|
269
309
|
end
|
270
310
|
|
271
311
|
def query_workitems(criteria)
|
272
312
|
|
273
|
-
ds = @sequel[
|
313
|
+
ds = @sequel[@table].where(:typ => 'workitems')
|
274
314
|
|
275
|
-
|
315
|
+
count = criteria.delete('count')
|
276
316
|
|
277
317
|
limit = criteria.delete('limit')
|
278
|
-
offset = criteria.delete('offset')
|
279
|
-
|
280
|
-
ds = ds.limit(limit, offset)
|
318
|
+
offset = criteria.delete('offset') || criteria.delete('skip')
|
281
319
|
|
282
320
|
wfid =
|
283
321
|
criteria.delete('wfid')
|
@@ -291,29 +329,35 @@ module Sequel
|
|
291
329
|
ds = ds.filter(:doc.like("%\"#{k}\":#{Rufus::Json.encode(v)}%"))
|
292
330
|
end
|
293
331
|
|
294
|
-
|
295
|
-
Ruote::Workitem.new(Rufus::Json.decode(d[:doc]))
|
296
|
-
}
|
297
|
-
end
|
332
|
+
return ds.count if count
|
298
333
|
|
299
|
-
|
334
|
+
ds = ds.order(:ide.asc, :rev.desc).limit(limit, offset)
|
300
335
|
|
301
|
-
|
336
|
+
select_last_revs(ds).collect { |d| Ruote::Workitem.from_json(d[:doc]) }
|
337
|
+
end
|
302
338
|
|
303
|
-
|
304
|
-
|
305
|
-
|
339
|
+
# Used by the worker to indicate a new step begins. For ruote-sequel,
|
340
|
+
# it means the cache can be prepared (a unique select yielding
|
341
|
+
# all the info necessary for one worker step (expressions excluded)).
|
342
|
+
#
|
343
|
+
def begin_step
|
344
|
+
|
345
|
+
prepare_cache
|
306
346
|
end
|
307
347
|
|
308
|
-
|
348
|
+
protected
|
309
349
|
|
310
|
-
|
350
|
+
def do_insert(doc, rev, update_rev=false)
|
351
|
+
|
352
|
+
doc = doc.send(
|
353
|
+
update_rev ? :merge! : :merge,
|
354
|
+
{ '_rev' => rev, 'put_at' => Ruote.now_to_utc_s })
|
355
|
+
|
356
|
+
@sequel[@table].insert(
|
311
357
|
:ide => doc['_id'],
|
312
358
|
:rev => rev,
|
313
359
|
:typ => doc['type'],
|
314
|
-
:doc => Rufus::Json.encode(doc
|
315
|
-
'_rev' => rev,
|
316
|
-
'put_at' => Ruote.now_to_utc_s)),
|
360
|
+
:doc => Rufus::Json.encode(doc),
|
317
361
|
:wfid => extract_wfid(doc),
|
318
362
|
:participant_name => doc['participant_name']
|
319
363
|
)
|
@@ -326,33 +370,91 @@ module Sequel
|
|
326
370
|
|
327
371
|
def do_get(type, key)
|
328
372
|
|
329
|
-
@sequel[
|
373
|
+
d = @sequel[@table].select(:doc).where(
|
330
374
|
:typ => type, :ide => key
|
331
375
|
).reverse_order(:rev).first
|
376
|
+
|
377
|
+
d ? Rufus::Json.decode(d[:doc]) : nil
|
332
378
|
end
|
333
379
|
|
334
|
-
#
|
380
|
+
# Weed out older docs (same ide, smaller rev).
|
335
381
|
#
|
336
|
-
#
|
382
|
+
# This could all have been done via SQL, but those inconsistencies
|
383
|
+
# are rare, the cost of the pumped SQL is not constant :-(
|
337
384
|
#
|
338
|
-
def
|
385
|
+
def select_last_revs(docs)
|
339
386
|
|
340
|
-
|
387
|
+
docs.each_with_object([]) { |doc, a|
|
388
|
+
a << doc if a.last.nil? || doc[:ide] != a.last[:ide]
|
389
|
+
}
|
390
|
+
end
|
391
|
+
|
392
|
+
#--
|
393
|
+
# worker step cache
|
394
|
+
#
|
395
|
+
# in order to cut down the number of selects, do one select with
|
396
|
+
# all the information the worker needs for one step of work
|
397
|
+
#++
|
398
|
+
|
399
|
+
CACHED_TYPES = %w[ msgs schedules configurations variables ]
|
400
|
+
|
401
|
+
# One select to grab in all the info necessary for a worker step
|
402
|
+
# (expressions excepted).
|
403
|
+
#
|
404
|
+
def prepare_cache
|
405
|
+
|
406
|
+
CACHED_TYPES.each { |t| cache[t] = {} }
|
407
|
+
|
408
|
+
@sequel[@table].select(
|
409
|
+
:ide, :typ, :doc
|
410
|
+
).where(
|
411
|
+
:typ => CACHED_TYPES
|
412
|
+
).order(
|
413
|
+
:ide.asc, :rev.desc
|
414
|
+
).each do |d|
|
415
|
+
(cache[d[:typ]] ||= {})[d[:ide]] ||= Rufus::Json.decode(d[:doc])
|
416
|
+
end
|
341
417
|
|
342
|
-
|
343
|
-
|
418
|
+
cache['variables']['trackers'] ||=
|
419
|
+
{ '_id' => 'trackers', 'type' => 'variables', 'trackers' => {} }
|
344
420
|
end
|
345
421
|
|
346
|
-
|
422
|
+
# Ask the cache for a doc. Returns nil if it's not cached.
|
423
|
+
#
|
424
|
+
def cache_get(type, key)
|
347
425
|
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
426
|
+
(cache[type] || {})[key]
|
427
|
+
end
|
428
|
+
|
429
|
+
# Ask the cache for a set of documents. Returns nil if it's not cached
|
430
|
+
# or caching is not OK.
|
431
|
+
#
|
432
|
+
def cache_get_many(type, keys, options)
|
433
|
+
|
434
|
+
if !options[:batch] && CACHED_TYPES.include?(type) && cache[type]
|
435
|
+
cache[type].values
|
436
|
+
else
|
437
|
+
nil
|
438
|
+
end
|
439
|
+
end
|
440
|
+
|
441
|
+
# Removes a document from the cache.
|
442
|
+
#
|
443
|
+
def cache_clear(doc)
|
444
|
+
|
445
|
+
(cache[doc['type']] || {}).delete(doc['_id'])
|
446
|
+
end
|
447
|
+
|
448
|
+
# Returns the cache for the given thread. Returns {} if there is no
|
449
|
+
# cache available.
|
450
|
+
#
|
451
|
+
def cache
|
452
|
+
|
453
|
+
worker = Thread.current['ruote_worker']
|
454
|
+
|
455
|
+
return {} unless worker
|
354
456
|
|
355
|
-
|
457
|
+
(Thread.current["cache_#{worker.name}"] ||= {})
|
356
458
|
end
|
357
459
|
end
|
358
460
|
end
|
data/lib/ruote/sequel/version.rb
CHANGED
@@ -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 Sequel
|
4
28
|
|
5
|
-
VERSION = '2.
|
29
|
+
VERSION = '2.3.0'
|
6
30
|
end
|
7
31
|
end
|
8
32
|
|
data/ruote-sequel.gemspec
CHANGED
@@ -1,9 +1,13 @@
|
|
1
|
-
# encoding:
|
1
|
+
# encoding: UTF-8
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
|
5
5
|
s.name = 'ruote-sequel'
|
6
|
-
|
6
|
+
|
7
|
+
s.version = File.read(
|
8
|
+
File.expand_path('../lib/ruote/sequel/version.rb', __FILE__)
|
9
|
+
).match(/ VERSION *= *['"]([^'"]+)/)[1]
|
10
|
+
|
7
11
|
s.platform = Gem::Platform::RUBY
|
8
12
|
s.authors = [ 'John Mettraux' ]
|
9
13
|
s.email = [ 'jmettraux@gmail.com' ]
|
@@ -12,7 +16,7 @@ Gem::Specification.new do |s|
|
|
12
16
|
s.summary = 'Sequel storage for ruote (a workflow engine)'
|
13
17
|
s.description = %q{
|
14
18
|
Sequel storage for ruote (a workflow engine)
|
15
|
-
}
|
19
|
+
}
|
16
20
|
|
17
21
|
#s.files = `git ls-files`.split("\n")
|
18
22
|
s.files = Dir[
|
@@ -21,7 +25,7 @@ Sequel storage for ruote (a workflow engine)
|
|
21
25
|
'*.gemspec', '*.txt', '*.rdoc', '*.md'
|
22
26
|
]
|
23
27
|
|
24
|
-
s.add_runtime_dependency 'sequel'
|
28
|
+
s.add_runtime_dependency 'sequel'#, '>= 3.31.0'
|
25
29
|
s.add_runtime_dependency 'ruote', ">= #{s.version}"
|
26
30
|
|
27
31
|
s.add_development_dependency 'rake'
|
data/test/connection.rb
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
|
2
|
+
#
|
3
|
+
# testing ruote-sequel
|
4
|
+
#
|
5
|
+
# Thu Feb 10 11:14:56 JST 2011
|
6
|
+
#
|
7
|
+
|
8
|
+
require 'rufus-json/automatic'
|
9
|
+
require 'ruote-sequel'
|
10
|
+
|
11
|
+
|
12
|
+
unless $sequel
|
13
|
+
|
14
|
+
$sequel = case ENV['RUOTE_STORAGE_DB'] || 'postgres'
|
15
|
+
when 'pg', 'postgres'
|
16
|
+
Sequel.connect('postgres://localhost/ruote_test')
|
17
|
+
when 'my', 'mysql'
|
18
|
+
#Sequel.connect('mysql://root:root@localhost/ruote_test')
|
19
|
+
Sequel.connect('mysql://root@localhost/ruote_test')
|
20
|
+
when 'mysql2'
|
21
|
+
Sequel.connect('mysql2://root@localhost/ruote_test')
|
22
|
+
when /:/
|
23
|
+
Sequel.connect(ENV['RUOTE_STORAGE_DB'])
|
24
|
+
else
|
25
|
+
raise ArgumentError.new("unknown DB: #{ENV['RUOTE_STORAGE_DB'].inspect}")
|
26
|
+
end
|
27
|
+
|
28
|
+
require 'logger'
|
29
|
+
|
30
|
+
logger = case ENV['RUOTE_STORAGE_DEBUG']
|
31
|
+
when 'log'
|
32
|
+
FileUtils.rm('debug.log') rescue nil
|
33
|
+
Logger.new('debug.log')
|
34
|
+
when 'stdout'
|
35
|
+
Logger.new($stdout)
|
36
|
+
else
|
37
|
+
nil
|
38
|
+
end
|
39
|
+
|
40
|
+
if logger
|
41
|
+
logger.level = Logger::DEBUG
|
42
|
+
$sequel.loggers << logger
|
43
|
+
end
|
44
|
+
|
45
|
+
Ruote::Sequel.create_table($sequel, true)
|
46
|
+
# true forces re_create of 'documents' table
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
def new_storage(opts)
|
51
|
+
|
52
|
+
Ruote::Sequel::Storage.new($sequel, opts)
|
53
|
+
end
|
54
|
+
|
metadata
CHANGED
@@ -1,150 +1,137 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruote-sequel
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
|
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
|
-
|
18
|
-
|
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: sequel
|
22
|
-
|
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
|
-
|
29
|
-
- 3
|
30
|
-
- 20
|
31
|
-
- 0
|
32
|
-
version: 3.20.0
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
- !ruby/object:Gem::Dependency
|
64
|
-
name: pg
|
65
55
|
prerelease: false
|
66
|
-
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
67
57
|
none: false
|
68
|
-
requirements:
|
69
|
-
- -
|
70
|
-
- !ruby/object:Gem::Version
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: pg
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - '='
|
68
|
+
- !ruby/object:Gem::Version
|
75
69
|
version: 0.10.1
|
76
70
|
type: :development
|
77
|
-
version_requirements: *id004
|
78
|
-
- !ruby/object:Gem::Dependency
|
79
|
-
name: mysql
|
80
71
|
prerelease: false
|
81
|
-
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
82
73
|
none: false
|
83
|
-
requirements:
|
84
|
-
- -
|
85
|
-
- !ruby/object:Gem::Version
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
74
|
+
requirements:
|
75
|
+
- - '='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: 0.10.1
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: mysql
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - '='
|
84
|
+
- !ruby/object:Gem::Version
|
90
85
|
version: 2.8.1
|
91
86
|
type: :development
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - '='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: 2.8.1
|
94
|
+
description: ! "\nSequel storage for ruote (a workflow engine)\n "
|
95
|
+
email:
|
96
96
|
- jmettraux@gmail.com
|
97
97
|
executables: []
|
98
|
-
|
99
98
|
extensions: []
|
100
|
-
|
101
99
|
extra_rdoc_files: []
|
102
|
-
|
103
|
-
files:
|
100
|
+
files:
|
104
101
|
- Rakefile
|
105
102
|
- lib/ruote/sequel/storage.rb
|
106
103
|
- lib/ruote/sequel/version.rb
|
107
104
|
- lib/ruote/sequel.rb
|
108
105
|
- lib/ruote-sequel.rb
|
109
|
-
- test/
|
106
|
+
- test/connection.rb
|
110
107
|
- test/test.rb
|
111
108
|
- ruote-sequel.gemspec
|
112
109
|
- CHANGELOG.txt
|
113
110
|
- CREDITS.txt
|
114
111
|
- LICENSE.txt
|
115
112
|
- TODO.txt
|
116
|
-
- README.rdoc
|
117
|
-
has_rdoc: true
|
118
113
|
homepage: http://ruote.rubyforge.org
|
119
114
|
licenses: []
|
120
|
-
|
121
115
|
post_install_message:
|
122
116
|
rdoc_options: []
|
123
|
-
|
124
|
-
require_paths:
|
117
|
+
require_paths:
|
125
118
|
- lib
|
126
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
119
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
127
120
|
none: false
|
128
|
-
requirements:
|
129
|
-
- -
|
130
|
-
- !ruby/object:Gem::Version
|
131
|
-
|
132
|
-
|
133
|
-
version: "0"
|
134
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ! '>='
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
135
126
|
none: false
|
136
|
-
requirements:
|
137
|
-
- -
|
138
|
-
- !ruby/object:Gem::Version
|
139
|
-
|
140
|
-
- 0
|
141
|
-
version: "0"
|
127
|
+
requirements:
|
128
|
+
- - ! '>='
|
129
|
+
- !ruby/object:Gem::Version
|
130
|
+
version: '0'
|
142
131
|
requirements: []
|
143
|
-
|
144
132
|
rubyforge_project: ruote
|
145
|
-
rubygems_version: 1.
|
133
|
+
rubygems_version: 1.8.24
|
146
134
|
signing_key:
|
147
135
|
specification_version: 3
|
148
136
|
summary: Sequel storage for ruote (a workflow engine)
|
149
137
|
test_files: []
|
150
|
-
|
data/README.rdoc
DELETED
@@ -1,75 +0,0 @@
|
|
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
|
-
|
@@ -1,44 +0,0 @@
|
|
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
|
-
|