ruote-couch 2.1.10 → 2.1.11

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.txt CHANGED
@@ -2,10 +2,20 @@
2
2
  = ruote-couch - CHANGELOG.txt
3
3
 
4
4
 
5
+ == ruote-couch 2.1.11 released 2010/10/01
6
+
7
+ - storage#shutdown back in business (for the sake of tests mostly)
8
+ - get_many(x, y, :descending => true) support
9
+ - adapted for engine.processes pagination
10
+ - workitems.by_participant() :skip and :limit support
11
+ - get_many(x, y, :count => true) support
12
+ - a database.purge! that can't be mislead by cache issues
13
+
14
+
5
15
  == ruote-couch 2.1.10 released 2010/06/15
6
16
 
7
17
  - storage#ids not returning design doc ids anymore
8
- - now using CouchDB 0.11 continuous&all_docs
18
+ - now using CouchDB 0.11 ?feed=continuous&include_docs=true
9
19
  - multi-worker hardened
10
20
  - adapted #query_workitems to ruote 2.1.10
11
21
 
data/CREDITS.txt ADDED
@@ -0,0 +1,18 @@
1
+
2
+ = ruote-couch CREDITS.txt
3
+
4
+
5
+ == authors
6
+
7
+ - John Mettraux - http://github.com/jmettraux
8
+
9
+
10
+ == contributors
11
+
12
+ - Torsten Schoenebaum - http://github.com/tosch
13
+
14
+
15
+ == many thanks to
16
+
17
+ - the CouchDB team for their great project
18
+
data/README.rdoc CHANGED
@@ -5,7 +5,7 @@ A storage implementation for ruote 2.1.x.
5
5
 
6
6
  Warning : this is a very naive implementation for now. Not many optimizations...
7
7
 
8
- Note : CouchDB >= 0.11
8
+ Note : CouchDB >= 1.0.1
9
9
 
10
10
 
11
11
  == running tests
data/Rakefile CHANGED
@@ -32,8 +32,9 @@ CouchDB storage for ruote 2.1 (ruby workflow engine)
32
32
 
33
33
  gem.test_file = 'test/test.rb'
34
34
 
35
- gem.add_dependency 'ruote', ">= #{Ruote::Couch::VERSION}"
36
- gem.add_dependency 'rufus-jig', '>= 0.1.18'
35
+ #gem.add_dependency 'ruote', ">= #{Ruote::Couch::VERSION}"
36
+ gem.add_dependency 'ruote', ">= 2.1.11"
37
+ gem.add_dependency 'rufus-jig', '>= 0.1.23'
37
38
  gem.add_development_dependency 'yard'
38
39
  gem.add_development_dependency 'rake'
39
40
  gem.add_development_dependency 'jeweler'
@@ -61,33 +62,30 @@ end
61
62
  #
62
63
  # DOC
63
64
 
64
- begin
65
+ #
66
+ # make sure to have rdoc 2.5.x to run that
67
+ #
68
+ require 'rake/rdoctask'
69
+ Rake::RDocTask.new do |rd|
65
70
 
66
- require 'yard'
71
+ rd.main = 'README.rdoc'
72
+ rd.rdoc_dir = 'rdoc/ruote-couch_rdoc'
67
73
 
68
- YARD::Rake::YardocTask.new do |doc|
69
- doc.options = [
70
- '-o', 'html/ruote-couch', '--title',
71
- "ruote-couch #{Ruote::Couch::VERSION}"
72
- ]
73
- end
74
+ rd.rdoc_files.include(
75
+ 'README.rdoc', 'CHANGELOG.txt', 'CREDITS.txt', 'lib/**/*.rb')
74
76
 
75
- rescue LoadError
76
-
77
- task :yard do
78
- abort "YARD is not available : sudo gem install yard"
79
- end
77
+ rd.title = "ruote-couch #{Ruote::Couch::VERSION}"
80
78
  end
81
79
 
82
80
 
83
81
  #
84
82
  # TO THE WEB
85
83
 
86
- task :upload_website => [ :clean, :yard ] do
84
+ task :upload_rdoc => [ :clean, :rdoc ] do
87
85
 
88
86
  account = 'jmettraux@rubyforge.org'
89
87
  webdir = '/var/www/gforge-projects/ruote'
90
88
 
91
- sh "rsync -azv -e ssh html/ruote-couch #{account}:#{webdir}/"
89
+ sh "rsync -azv -e ssh rdoc/ruote-couch_rdoc #{account}:#{webdir}/"
92
90
  end
93
91
 
data/TODO.txt CHANGED
@@ -12,3 +12,6 @@
12
12
  [ ] issue with cron '* * * * *' and long-polling |
13
13
  =================================================+
14
14
 
15
+ [ ] storage.close
16
+ [ ] http://guide.couchdb.org/draft/notifications.html (filter schedules ?)
17
+
@@ -39,11 +39,7 @@ module Ruote::Couch
39
39
 
40
40
  attr_reader :couch
41
41
 
42
- def initialize (host, port, type, name)
43
-
44
- #opts = { :re_put_ok => re_put_ok }
45
- opts = {}
46
- #opts[:timeout] = TODO
42
+ def initialize (host, port, type, name, opts={})
47
43
 
48
44
  @couch = Rufus::Jig::Couch.new(host, port, name, opts)
49
45
 
@@ -79,29 +75,49 @@ module Ruote::Couch
79
75
  # without this, test/functional/ct_0 fails after 1 to 10 runs...
80
76
 
81
77
  r
78
+
79
+ rescue Rufus::Jig::TimeoutError => te
80
+ true
82
81
  end
83
82
 
83
+ # The get_many used by msgs, configurations and variables.
84
+ #
84
85
  def get_many (key, opts)
85
86
 
86
- rs = @couch.get("_all_docs?include_docs=true#{query_options(opts)}")
87
+ return query('_all_docs?include_docs=true') if ( ! key) && opts.size < 1
87
88
 
88
- rs = rs['rows'].collect { |e| e['doc'] }
89
+ is = ids
89
90
 
90
- rs = rs.select { |doc| doc['_id'].match(key) } if key
91
- # naive...
91
+ return is.length if opts[:count]
92
92
 
93
- rs.select { |doc| ! doc['_id'].match(/^\_design\//) }
94
- end
93
+ is = is.reverse if opts[:descending]
95
94
 
96
- DESIGN_DOC_REGEX = /^\_design\//
95
+ if key
96
+ keys = Array(key).map { |k| k.is_a?(String) ? "!#{k}" : k }
97
+ is = is.select { |i| Ruote::StorageBase.key_match?(keys, i) }
98
+ end
99
+
100
+ skip = opts[:skip] || 0
101
+ limit = opts[:limit] || is.length
102
+
103
+ is = is[skip, limit]
104
+
105
+ query_by_post('_all_docs?include_docs=true', is)
106
+
107
+ # TODO
108
+ # maybe _count come be of use here
109
+ # http://wiki.apache.org/couchdb/Built-In_Reduce_Functions
110
+ end
97
111
 
98
112
  # Returns a sorted list of the ids of all the docs in this database.
99
113
  #
100
114
  def ids
101
115
 
102
- rs = @couch.get('_all_docs')
103
-
104
- rs['rows'].collect { |r| r['id'] }.reject { |i| i.match(DESIGN_DOC_REGEX) }
116
+ @couch.get('_all_docs')['rows'].collect { |r|
117
+ r['id']
118
+ }.reject { |i|
119
+ DESIGN_DOC_REGEX.match(i)
120
+ }
105
121
  end
106
122
 
107
123
  def dump
@@ -116,18 +132,22 @@ module Ruote::Couch
116
132
  end
117
133
  end
118
134
 
119
- #def shutdown
120
- # @couch.close
121
- #end
122
- # jig > 0.1.17 is OK without that
135
+ # Makes sure to close the HTTP connection down.
136
+ #
137
+ def shutdown
138
+
139
+ @couch.close
140
+ end
123
141
 
124
142
  # Deletes all the documents in this database.
125
143
  #
126
144
  def purge!
127
145
 
146
+ @couch.http.cache.clear
128
147
  @couch.get('_all_docs')['rows'].each do |row|
148
+ next if row['id'].match(/^\_design\//)
129
149
  doc = { '_id' => row['id'], '_rev' => row['value']['rev'] }
130
- @couch.delete(doc) unless doc['_id'].match(/^\_design\//)
150
+ @couch.delete(doc)
131
151
  end
132
152
  #
133
153
  # which is faster than
@@ -144,22 +164,36 @@ module Ruote::Couch
144
164
  # nothing to do for a index-less database
145
165
  end
146
166
 
147
- # (for now, the only option is :limit)
167
+ # These options are known and passed to CouchDB.
168
+ #
169
+ QUERY_OPTIONS = [ :skip, :limit, :descending ]
170
+
171
+ # :limit and :skip support
148
172
  #
149
173
  def query_options (opts)
150
174
 
151
- opts = opts.select { |k, v| [ :limit, :skip ].include?(k) && v != nil }
175
+ opts = opts.select { |k, v| QUERY_OPTIONS.include?(k) && v != nil }
152
176
 
153
177
  s = opts.collect { |k, v| "#{k}=#{v}" }.join('&')
154
178
 
155
179
  s.length > 0 ? "&#{s}" : ''
156
180
  end
157
181
 
182
+ # Used by #get_many and #ids when filtering design documents out of
183
+ # '_all_docs'.
184
+ #
185
+ DESIGN_DOC_REGEX = /^\_design\//
186
+
187
+ def filter_design_docs (docs)
188
+
189
+ docs.reject { |d| DESIGN_DOC_REGEX.match(d['_id']) }
190
+ end
191
+
158
192
  def query (uri)
159
193
 
160
194
  rs = @couch.get(uri)
161
195
 
162
- rs['rows'].collect { |e| e['doc'] }
196
+ filter_design_docs(rs['rows'].collect { |e| e['doc'] })
163
197
  end
164
198
 
165
199
  def query_by_post (uri, keys)
@@ -168,7 +202,7 @@ module Ruote::Couch
168
202
 
169
203
  rs = @couch.post(uri, keys)
170
204
 
171
- rs['rows'].collect { |e| e['doc'] }.uniq
205
+ filter_design_docs(rs['rows'].collect { |e| e['doc'] }.uniq)
172
206
  end
173
207
  end
174
208
 
@@ -177,27 +211,23 @@ module Ruote::Couch
177
211
  #
178
212
  class WfidIndexedDatabase < Database
179
213
 
214
+ # The get_many used by errors, expressions and schedules.
215
+ #
180
216
  def get_many (key, opts)
181
217
 
182
- if key && m = key.source.match(/!?(.+)\$$/)
183
- # let's use the couch view...
184
-
185
- query(
186
- "_design/ruote/_view/by_wfid?key=%22#{m[1]}%22" +
187
- "&include_docs=true#{query_options(opts)}")
218
+ return super(key, opts) unless key.is_a?(String)
188
219
 
189
- else
190
- # let's use the naive default implementation
220
+ # key is a wfid
191
221
 
192
- super
193
- end
222
+ query("_design/ruote/_view/by_wfid?key=%22#{key}%22&include_docs=true")
194
223
  end
195
224
 
196
225
  # Used by WorkitemDatabase#query
197
226
  #
198
227
  def by_wfid (wfid)
199
228
 
200
- get_many(/!#{wfid}$/, {})
229
+ #get_many(/!#{wfid}$/, {})
230
+ get_many(wfid, {})
201
231
  end
202
232
 
203
233
  # Returns the design document that goes with this class of database
@@ -215,8 +245,12 @@ module Ruote::Couch
215
245
  '_id' => '_design/ruote',
216
246
  'views' => {
217
247
  'by_wfid' => {
218
- 'map' =>
219
- 'function (doc) { if (doc.fei) emit(doc.fei.wfid, null); }'
248
+ 'map' => %{
249
+ function (doc) {
250
+ if (doc.wfid) emit(doc.wfid, null);
251
+ else if (doc.fei) emit(doc.fei.wfid, null);
252
+ }
253
+ }
220
254
  }
221
255
  }
222
256
  }
@@ -278,8 +312,7 @@ module Ruote::Couch
278
312
  return by_wfid(wfid) # if wfid
279
313
  end
280
314
 
281
- return get_many(nil, {}).collect { |hwi| Ruote::Workitem.new(hwi) } \
282
- if criteria.empty?
315
+ return get_many(nil, {}) if criteria.empty?
283
316
 
284
317
  cr = criteria.collect { |fname, fvalue| { fname => fvalue } }
285
318
 
@@ -47,47 +47,41 @@ module Couch
47
47
  # Hooks the storage to a CouchDB instance.
48
48
  #
49
49
  # The main option is 'couch_prefix', which indicate which prefix should be
50
- # added to all the database names used by this storage.
50
+ # added to all the database names used by this storage. 'prefix' is accepted
51
+ # as well.
51
52
  #
52
- # The option 'couch_timeout' is used what is the get_msgs timeout. This
53
- # is the long-polling timeout. For functional test it is set to two seconds
54
- # but for a production system, something like 10 minutes or 8 hours might
55
- # be OK.
56
- #
57
- def initialize (host, port, options={})
53
+ def initialize (*args)
58
54
 
59
- @host = host
60
- @port = port
55
+ hc = Rufus::Jig::HttpCore.new(*args)
56
+ # leverage the argument parsing logic in there
61
57
 
62
- @options = options
58
+ @host = hc.host
59
+ @port = hc.port
63
60
 
64
- @prefix = options['couch_prefix'] || options['prefix'] || ''
65
- @prefix = "#{@prefix}_" if @prefix.size > 0
61
+ @options = hc.options
66
62
 
67
- #@zeroes = 21 # maybe make it an option
68
- @timeout = options['couch_timeout'] || 60
63
+ @prefix = hc.options['couch_prefix'] || hc.options['prefix'] || ''
64
+ @prefix = "#{@prefix}_" if @prefix.size > 0
69
65
 
70
66
  @dbs = {}
71
67
 
72
- %w[ msgs schedules configurations variables ].each do |type|
68
+ %w[ msgs configurations variables ].each do |type|
73
69
 
74
70
  @dbs[type] = Database.new(
75
- @host, @port, type, "#{@prefix}ruote_#{type}")
71
+ @host, @port, type, "#{@prefix}ruote_#{type}", @options)
76
72
  end
77
73
 
78
- @dbs['errors'] = WfidIndexedDatabase.new(
79
- @host, @port, 'errors', "#{@prefix}ruote_errors")
74
+ %w[ errors expressions schedules ].each do |type|
80
75
 
81
- @dbs['expressions'] = WfidIndexedDatabase.new(
82
- #@host, @port, 'expressions', "#{@prefix}ruote_expressions", false)
83
- @host, @port, 'expressions', "#{@prefix}ruote_expressions")
76
+ @dbs[type] = WfidIndexedDatabase.new(
77
+ @host, @port, type, "#{@prefix}ruote_#{type}", @options)
78
+ end
84
79
 
85
80
  @dbs['workitems'] = WorkitemDatabase.new(
86
- @host, @port, 'workitems', "#{@prefix}ruote_workitems")
81
+ @host, @port, 'workitems', "#{@prefix}ruote_workitems", @options)
87
82
 
88
83
  put_configuration
89
84
 
90
- #@zero_msgs_offset = @zeroes
91
85
  @msgs_thread = nil
92
86
  @msgs_queue = ::Queue.new
93
87
 
@@ -131,18 +125,6 @@ module Couch
131
125
  #@dbs.values.each { |db| db.shutdown }
132
126
  end
133
127
 
134
- # Used when doing integration tests, removes all
135
- # msgs, schedules, errors, expressions and workitems.
136
- #
137
- # NOTE that it doesn't remove engine variables (danger)
138
- #
139
- def clear
140
-
141
- %w[ msgs schedules errors expressions workitems ].each do |type|
142
- @dbs[type].purge!
143
- end
144
- end
145
-
146
128
  def dump (type)
147
129
 
148
130
  @dbs[type].dump
@@ -150,9 +132,7 @@ module Couch
150
132
 
151
133
  def shutdown
152
134
 
153
- #@dbs.values.each { |db| db.shutdown }
154
-
155
- #@poller.kill if @poller
135
+ @dbs.values.each { |db| db.shutdown }
156
136
 
157
137
  @msgs_thread.kill rescue nil
158
138
  @schedules_thread.kill rescue nil
@@ -179,11 +159,11 @@ module Couch
179
159
  # A provision made for workitems, allow to query them directly by
180
160
  # participant name.
181
161
  #
182
- def by_participant (type, participant_name)
162
+ def by_participant (type, participant_name, opts)
183
163
 
184
164
  raise NotImplementedError if type != 'workitems'
185
165
 
186
- @dbs['workitems'].by_participant(participant_name)
166
+ @dbs['workitems'].by_participant(participant_name, opts)
187
167
  end
188
168
 
189
169
  def by_field (type, field, value=nil)
@@ -195,7 +175,11 @@ module Couch
195
175
 
196
176
  def query_workitems (criteria)
197
177
 
198
- @dbs['workitems'].query_workitems(criteria)
178
+ count = criteria.delete('count')
179
+
180
+ result = @dbs['workitems'].query_workitems(criteria)
181
+
182
+ count ? result.size : result.collect { |h| Ruote::Workitem.new(h) }
199
183
  end
200
184
 
201
185
  # Overwriting Ruote::StorageBase.get_msgs
@@ -205,9 +189,14 @@ module Couch
205
189
  #
206
190
  def get_msgs
207
191
 
192
+ mt = @msgs_thread
193
+
208
194
  ensure_msgs_thread_is_running
209
195
 
210
196
  msgs = []
197
+ 2.times { msgs = get_many('msgs') } if mt != @msgs_thread
198
+ #
199
+ # seems necessary to avoid any msgs leak :-(
211
200
 
212
201
  while @msgs_queue.size > 0
213
202
  msgs << @msgs_queue.pop
@@ -234,6 +223,8 @@ module Couch
234
223
 
235
224
  deleted, s = @schedules_queue.pop
236
225
 
226
+ next unless s
227
+
237
228
  if deleted
238
229
  @schedules.delete(s['_id'])
239
230
  else
@@ -241,7 +232,7 @@ module Couch
241
232
  end
242
233
  end
243
234
 
244
- filter_schedules(@schedules.values, now)
235
+ filter_schedules(@schedules.values.reject { |sch| sch['at'].nil? }, now)
245
236
  end
246
237
 
247
238
  protected
@@ -1,7 +1,7 @@
1
1
 
2
2
  module Ruote
3
3
  module Couch
4
- VERSION = '2.1.10'
4
+ VERSION = '2.1.11'
5
5
  end
6
6
  end
7
7
 
data/ruote-couch.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{ruote-couch}
8
- s.version = "2.1.10"
8
+ s.version = "2.1.11"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["John Mettraux"]
12
- s.date = %q{2010-06-15}
12
+ s.date = %q{2010-10-01}
13
13
  s.description = %q{CouchDB storage for ruote 2.1 (ruby workflow engine)}
14
14
  s.email = %q{jmettraux@gmail.com}
15
15
  s.extra_rdoc_files = [
@@ -18,6 +18,7 @@ Gem::Specification.new do |s|
18
18
  ]
19
19
  s.files = [
20
20
  "CHANGELOG.txt",
21
+ "CREDITS.txt",
21
22
  "LICENSE.txt",
22
23
  "README.rdoc",
23
24
  "Rakefile",
@@ -29,7 +30,6 @@ Gem::Specification.new do |s|
29
30
  "lib/ruote/couch/version.rb",
30
31
  "ruote-couch.gemspec",
31
32
  "test/functional/base.rb",
32
- "test/functional/ft_0_long_polling.rb",
33
33
  "test/functional/test.rb",
34
34
  "test/functional_connection.rb",
35
35
  "test/test.rb",
@@ -51,21 +51,21 @@ Gem::Specification.new do |s|
51
51
  s.specification_version = 3
52
52
 
53
53
  if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
54
- s.add_runtime_dependency(%q<ruote>, [">= 2.1.10"])
55
- s.add_runtime_dependency(%q<rufus-jig>, [">= 0.1.18"])
54
+ s.add_runtime_dependency(%q<ruote>, [">= 2.1.11"])
55
+ s.add_runtime_dependency(%q<rufus-jig>, [">= 0.1.23"])
56
56
  s.add_development_dependency(%q<yard>, [">= 0"])
57
57
  s.add_development_dependency(%q<rake>, [">= 0"])
58
58
  s.add_development_dependency(%q<jeweler>, [">= 0"])
59
59
  else
60
- s.add_dependency(%q<ruote>, [">= 2.1.10"])
61
- s.add_dependency(%q<rufus-jig>, [">= 0.1.18"])
60
+ s.add_dependency(%q<ruote>, [">= 2.1.11"])
61
+ s.add_dependency(%q<rufus-jig>, [">= 0.1.23"])
62
62
  s.add_dependency(%q<yard>, [">= 0"])
63
63
  s.add_dependency(%q<rake>, [">= 0"])
64
64
  s.add_dependency(%q<jeweler>, [">= 0"])
65
65
  end
66
66
  else
67
- s.add_dependency(%q<ruote>, [">= 2.1.10"])
68
- s.add_dependency(%q<rufus-jig>, [">= 0.1.18"])
67
+ s.add_dependency(%q<ruote>, [">= 2.1.11"])
68
+ s.add_dependency(%q<rufus-jig>, [">= 0.1.23"])
69
69
  s.add_dependency(%q<yard>, [">= 0"])
70
70
  s.add_dependency(%q<rake>, [">= 0"])
71
71
  s.add_dependency(%q<jeweler>, [">= 0"])
@@ -9,18 +9,35 @@ require 'yajl' rescue require 'json'
9
9
  require 'rufus-json'
10
10
  Rufus::Json.detect_backend
11
11
 
12
- begin
13
- require 'patron' unless ARGV.include?('--net')
14
- rescue LoadError
15
- # then use 'net/http'
12
+ unless $http_lib_loaded
13
+ begin
14
+ if ARGV.include?('--patron')
15
+ require 'patron'
16
+ puts ' : using patron'
17
+ elsif ARGV.include?('--netp')
18
+ require 'net/http/persistent'
19
+ puts ' : using net-http-persistent'
20
+ else
21
+ puts ' : using net/http'
22
+ end
23
+ rescue LoadError => le
24
+ # then use 'net/http'
25
+ puts ' : falling back to net/http'
26
+ end
27
+ $http_lib_loaded = true
16
28
  end
17
29
 
18
30
  require 'ruote/couch/storage'
19
31
 
32
+ def _couch_url
33
+
34
+ File.read('couch_url.txt').strip rescue 'http://127.0.0.1:5984'
35
+ end
36
+
20
37
 
21
38
  unless $_RUOTE_COUCH_CLEANED
22
39
 
23
- couch = Rufus::Jig::Couch.new('127.0.0.1', 5984)
40
+ couch = Rufus::Jig::Couch.new(_couch_url)
24
41
  %w[
25
42
  configurations errors expressions msgs schedules variables workitems
26
43
  ].each do |type|
@@ -36,8 +53,7 @@ def new_storage (opts)
36
53
  opts ||= {}
37
54
 
38
55
  Ruote::Couch::CouchStorage.new(
39
- '127.0.0.1',
40
- 5984,
41
- opts.merge!('couch_prefix' => 'test', 'couch_timeout' => 1))
56
+ _couch_url,
57
+ opts.merge!('couch_prefix' => 'test', :basic_auth => %w[ admin admin ]))
42
58
  end
43
59
 
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 2
7
7
  - 1
8
- - 10
9
- version: 2.1.10
8
+ - 11
9
+ version: 2.1.11
10
10
  platform: ruby
11
11
  authors:
12
12
  - John Mettraux
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-06-15 00:00:00 +09:00
17
+ date: 2010-10-01 00:00:00 +09:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -27,8 +27,8 @@ dependencies:
27
27
  segments:
28
28
  - 2
29
29
  - 1
30
- - 10
31
- version: 2.1.10
30
+ - 11
31
+ version: 2.1.11
32
32
  type: :runtime
33
33
  version_requirements: *id001
34
34
  - !ruby/object:Gem::Dependency
@@ -41,8 +41,8 @@ dependencies:
41
41
  segments:
42
42
  - 0
43
43
  - 1
44
- - 18
45
- version: 0.1.18
44
+ - 23
45
+ version: 0.1.23
46
46
  type: :runtime
47
47
  version_requirements: *id002
48
48
  - !ruby/object:Gem::Dependency
@@ -92,6 +92,7 @@ extra_rdoc_files:
92
92
  - README.rdoc
93
93
  files:
94
94
  - CHANGELOG.txt
95
+ - CREDITS.txt
95
96
  - LICENSE.txt
96
97
  - README.rdoc
97
98
  - Rakefile
@@ -103,7 +104,6 @@ files:
103
104
  - lib/ruote/couch/version.rb
104
105
  - ruote-couch.gemspec
105
106
  - test/functional/base.rb
106
- - test/functional/ft_0_long_polling.rb
107
107
  - test/functional/test.rb
108
108
  - test/functional_connection.rb
109
109
  - test/test.rb
@@ -1,66 +0,0 @@
1
-
2
- #
3
- # testing ruote-couch
4
- #
5
- # Fri Mar 12 17:15:27 JST 2010
6
- #
7
-
8
- require File.join(File.dirname(__FILE__), 'base')
9
-
10
-
11
- class FtLongPollingTest < Test::Unit::TestCase
12
-
13
- def setup
14
-
15
- @engine =
16
- Ruote::Engine.new(
17
- Ruote::Worker.new(
18
- Ruote::Couch::CouchStorage.new(
19
- '127.0.0.1',
20
- 5984,
21
- 'couch_prefix' => 'test', 'couch_timeout' => 2 * 60)))
22
- end
23
-
24
- def teardown
25
-
26
- @engine.shutdown
27
- @engine.context.storage.purge!
28
- end
29
-
30
- def test_wait
31
-
32
- trace = []
33
-
34
- @engine.register_participant '.+' do |workitem|
35
- trace << Time.now
36
- end
37
-
38
- pdef = Ruote.process_definition do
39
- sequence do
40
- alpha
41
- wait '3m'
42
- bravo
43
- end
44
- end
45
-
46
- @engine.context.logger.noisy = true
47
-
48
- wfid = @engine.launch(pdef)
49
-
50
- sleep 15
51
- assert_equal 1, trace.size
52
-
53
- assert_not_nil @engine.context.storage.instance_variable_get(:@poller)
54
-
55
- @engine.wait_for(wfid)
56
-
57
- p trace
58
-
59
- assert_equal 2, trace.size
60
-
61
- delta = trace.last - trace.first
62
-
63
- assert_in_delta 3.0 * 60, delta, 1.0
64
- end
65
- end
66
-