ruote-couch 2.1.4 → 2.1.5

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 CHANGED
@@ -2,11 +2,16 @@
2
2
  = ruote-couch - CHANGELOG.txt
3
3
 
4
4
 
5
- == ruote-couch 2.1.4 released 2009/01/11
5
+ == ruote-couch 2.1.5 released 2010/01/28
6
6
 
7
- - Ruote::Couch::Storage added #ids(type)
8
- - Ruote::Couch::Storage added #purge_type!(t)
7
+ - implemented CouchStorage#by_wfid and #by_participant
9
8
 
10
9
 
11
- == ruote-couch 2.1.3 released 2009/01/05
10
+ == ruote-couch 2.1.4 released 2010/01/11
11
+
12
+ - Ruote::Couch::CouchStorage added #ids(type)
13
+ - Ruote::Couch::CouchStorage added #purge_type!(t)
14
+
15
+
16
+ == ruote-couch 2.1.3 released 2010/01/05
12
17
 
data/Rakefile CHANGED
@@ -35,7 +35,7 @@ CouchDB storage for ruote 2.1 (ruby workflow engine)
35
35
  gem.add_dependency 'ruote', ">= #{Ruote::Couch::VERSION}"
36
36
  #gem.add_dependency 'yajl-ruby'
37
37
  #gem.add_dependency 'json'
38
- gem.add_dependency 'rufus-jig', '>= 0.1.11'
38
+ gem.add_dependency 'rufus-jig', '>= 0.1.12'
39
39
  gem.add_development_dependency 'yard', '>= 0'
40
40
 
41
41
  # gemspec spec : http://www.rubygems.org/read/chapter/20
@@ -22,9 +22,14 @@
22
22
  # Made in Japan.
23
23
  #++
24
24
 
25
+ require 'cgi'
26
+
25
27
 
26
28
  module Ruote::Couch
27
29
 
30
+ #
31
+ # A database corresponds to a Couch database (not a Couch server).
32
+ #
28
33
  class Database
29
34
 
30
35
  attr_reader :type
@@ -62,20 +67,14 @@ module Ruote::Couch
62
67
 
63
68
  def get_many (key, opts)
64
69
 
65
- os = if l = opts[:limit]
66
- "&limit=#{l}"
67
- else
68
- ''
69
- end
70
-
71
- rs = @couch.get("_all_docs?include_docs=true#{os}")
70
+ rs = @couch.get("_all_docs?include_docs=true#{query_options(opts)}")
72
71
 
73
72
  rs = rs['rows'].collect { |e| e['doc'] }
74
73
 
75
74
  rs = rs.select { |doc| doc['_id'].match(key) } if key
76
75
  # naive...
77
76
 
78
- rs
77
+ rs.select { |doc| ! doc['_id'].match(/^\_design\//) }
79
78
  end
80
79
 
81
80
  # Returns a sorted list of the ids of all the docs in this database.
@@ -126,28 +125,140 @@ module Ruote::Couch
126
125
 
127
126
  # nothing to do for a index-less database
128
127
  end
128
+
129
+ # (for now, the only option is :limit)
130
+ #
131
+ def query_options (opts)
132
+
133
+ if l = opts[:limit]
134
+ "&limit=#{l}"
135
+ else
136
+ ''
137
+ end
138
+ end
139
+
140
+ def query (uri)
141
+
142
+ rs = @couch.get(uri)
143
+
144
+ rs['rows'].collect { |e| e['doc'] }
145
+ end
129
146
  end
130
147
 
148
+ #
149
+ # A Couch database with a by_wfid view.
150
+ #
131
151
  class WfidIndexedDatabase < Database
132
152
 
133
- #DESIGN_DOC_TEMPLATE = %{
134
- # {
135
- # "_id": "_design/ruote",
136
- # "version": 0,
137
- #
138
- # "views": {
139
- # "by_type": {
140
- # "map": "function (doc) { emit(doc.type, doc); }"
141
- # }
142
- # }
143
- # }
144
- #}.strip
153
+ def get_many (key, opts)
154
+
155
+ if key && m = key.source.match(/!?(.+)\$$/)
156
+ # let's use the couch view...
157
+
158
+ query(
159
+ "_design/ruote/_view/by_wfid?key=%22#{m[1]}%22" +
160
+ "&include_docs=true#{query_options(opts)}")
161
+
162
+ else
163
+ # let's use the naive default implementation
164
+
165
+ super
166
+ end
167
+ end
145
168
 
146
169
  protected
147
170
 
171
+ def design_doc
172
+
173
+ {
174
+ '_id' => '_design/ruote',
175
+ 'views' => {
176
+ 'by_wfid' => {
177
+ 'map' =>
178
+ 'function (doc) { if (doc.fei) emit(doc.fei.wfid, null); }'
179
+ }
180
+ }
181
+ }
182
+ end
183
+
148
184
  def prepare
149
185
 
150
- # TODO
186
+ d = @couch.get('_design/ruote')
187
+ @couch.delete(d) if d
188
+ @couch.put(design_doc)
189
+ end
190
+ end
191
+
192
+ #
193
+ # A Couch database with a by_wfid view and a by_field view.
194
+ #
195
+ class WorkitemDatabase < WfidIndexedDatabase
196
+
197
+ # This method is called by CouchStorage#by_field
198
+ #
199
+ def by_field (field, value=nil, opts={})
200
+
201
+ field = { field => value } if value
202
+ field = CGI.escape(Rufus::Json.encode(field))
203
+
204
+ query(
205
+ "_design/ruote/_view/by_field?key=#{field}" +
206
+ "&include_docs=true#{query_options(opts)}")
207
+ end
208
+
209
+ # This method is called by CouchStorage#by_participant
210
+ #
211
+ def by_participant (name, opts={})
212
+
213
+ query(
214
+ "_design/ruote/_view/by_participant_name?key=%22#{name}%22" +
215
+ "&include_docs=true#{query_options(opts)}")
216
+ end
217
+
218
+ protected
219
+
220
+ def design_doc
221
+
222
+ doc = super
223
+
224
+ # NOTE : with 'by_field', for a workitem with N fields there are
225
+ # currently 2 * N rows generated per workitem.
226
+ #
227
+ # Why not restrict { field => value } keys to only fields whose value
228
+ # is a string, a boolean or null ? I have the impression that querying
229
+ # for field whose value is 'complex' (array or hash) is not necessary
230
+ # (though sounding crazy useful).
231
+
232
+ doc['views']['by_field'] = {
233
+ 'map' => %{
234
+ function(doc) {
235
+ if (doc.fields) {
236
+ for (var field in doc.fields) {
237
+
238
+ emit(field, null);
239
+
240
+ var k = {};
241
+ k[field] = doc.fields[field]
242
+ emit(k, null);
243
+ //
244
+ // have to use that k trick...
245
+ // else the field is named 'field'
246
+ }
247
+ }
248
+ }
249
+ }
250
+ }
251
+ doc['views']['by_participant_name'] = {
252
+ 'map' => %{
253
+ function (doc) {
254
+ if (doc.participant_name) {
255
+ emit(doc.participant_name, null);
256
+ }
257
+ }
258
+ }
259
+ }
260
+
261
+ doc
151
262
  end
152
263
  end
153
264
  end
@@ -55,15 +55,15 @@ module Couch
55
55
  @host, @port, type, "#{@prefix}ruote_#{type}")
56
56
  end
57
57
 
58
- %w[ errors workitems ].each do |type|
59
-
60
- @dbs[type] = WfidIndexedDatabase.new(
61
- @host, @port, type, "#{@prefix}ruote_#{type}")
62
- end
58
+ @dbs['errors'] = WfidIndexedDatabase.new(
59
+ @host, @port, 'errors', "#{@prefix}ruote_errors")
63
60
 
64
61
  @dbs['expressions'] = WfidIndexedDatabase.new(
65
62
  @host, @port, 'expressions', "#{@prefix}ruote_expressions", false)
66
63
 
64
+ @dbs['workitems'] = WorkitemDatabase.new(
65
+ @host, @port, 'workitems', "#{@prefix}ruote_workitems")
66
+
67
67
  put_configuration
68
68
  end
69
69
 
@@ -128,6 +128,23 @@ module Couch
128
128
  end
129
129
  end
130
130
 
131
+ # A provision made for workitems, allow to query them directly by
132
+ # participant name.
133
+ #
134
+ def by_participant (type, participant_name)
135
+
136
+ raise NotImplementedError if type != 'workitems'
137
+
138
+ @dbs['workitems'].by_participant(participant_name)
139
+ end
140
+
141
+ def by_field (type, field, value=nil)
142
+
143
+ raise NotImplementedError if type != 'workitems'
144
+
145
+ @dbs['workitems'].by_field(field, value)
146
+ end
147
+
131
148
  protected
132
149
 
133
150
  def put_configuration
@@ -138,20 +155,6 @@ module Couch
138
155
 
139
156
  put(conf)
140
157
  end
141
-
142
- # def put_design_document
143
- #
144
- # doc = Rufus::Jig::Json.decode(
145
- # File.read(File.join(File.dirname(__FILE__), 'storage.json')))
146
- #
147
- # current = @couch.get('_design/ruote')
148
- #
149
- # if current.nil? || doc['version'] >= (current['version'] || -1)
150
- #
151
- # @couch.delete(current) if current
152
- # @couch.put(doc)
153
- # end
154
- # end
155
158
  end
156
159
  end
157
160
  end
@@ -1,7 +1,7 @@
1
1
 
2
2
  module Ruote
3
3
  module Couch
4
- VERSION = '2.1.4'
4
+ VERSION = '2.1.5'
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.4"
8
+ s.version = "2.1.5"
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-01-11}
12
+ s.date = %q{2010-01-28}
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 = [
@@ -52,17 +52,17 @@ Gem::Specification.new do |s|
52
52
  s.specification_version = 3
53
53
 
54
54
  if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
55
- s.add_runtime_dependency(%q<ruote>, [">= 2.1.4"])
56
- s.add_runtime_dependency(%q<rufus-jig>, [">= 0.1.11"])
55
+ s.add_runtime_dependency(%q<ruote>, [">= 2.1.5"])
56
+ s.add_runtime_dependency(%q<rufus-jig>, [">= 0.1.12"])
57
57
  s.add_development_dependency(%q<yard>, [">= 0"])
58
58
  else
59
- s.add_dependency(%q<ruote>, [">= 2.1.4"])
60
- s.add_dependency(%q<rufus-jig>, [">= 0.1.11"])
59
+ s.add_dependency(%q<ruote>, [">= 2.1.5"])
60
+ s.add_dependency(%q<rufus-jig>, [">= 0.1.12"])
61
61
  s.add_dependency(%q<yard>, [">= 0"])
62
62
  end
63
63
  else
64
- s.add_dependency(%q<ruote>, [">= 2.1.4"])
65
- s.add_dependency(%q<rufus-jig>, [">= 0.1.11"])
64
+ s.add_dependency(%q<ruote>, [">= 2.1.5"])
65
+ s.add_dependency(%q<rufus-jig>, [">= 0.1.12"])
66
66
  s.add_dependency(%q<yard>, [">= 0"])
67
67
  end
68
68
  end
@@ -6,16 +6,14 @@
6
6
  #
7
7
 
8
8
  require File.join(File.dirname(__FILE__), '..', 'test_helper.rb')
9
-
10
- require 'ruote/couch/storage'
9
+ require File.join(File.dirname(__FILE__), '..', 'integration_connection.rb')
11
10
 
12
11
 
13
12
  class UtInitialTest < Test::Unit::TestCase
14
13
 
15
14
  def test_connect
16
15
 
17
- storage = Ruote::Couch::CouchStorage.new(
18
- '127.0.0.1', 5984, :prefix => 'test')
16
+ storage = new_storage(nil)
19
17
 
20
18
  v = storage.get_many('configurations')
21
19
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruote-couch
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.4
4
+ version: 2.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Mettraux
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-01-11 00:00:00 +09:00
12
+ date: 2010-01-28 00:00:00 +09:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -20,7 +20,7 @@ dependencies:
20
20
  requirements:
21
21
  - - ">="
22
22
  - !ruby/object:Gem::Version
23
- version: 2.1.4
23
+ version: 2.1.5
24
24
  version:
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rufus-jig
@@ -30,7 +30,7 @@ dependencies:
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 0.1.11
33
+ version: 0.1.12
34
34
  version:
35
35
  - !ruby/object:Gem::Dependency
36
36
  name: yard