ruote-sequel 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.
- 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
|
-
|