wabur 0.6.2 → 0.7.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.
Files changed (41) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +106 -15
  3. data/bin/wabur +6 -0
  4. data/export/assets/js/ui.js +18 -0
  5. data/lib/wab.rb +7 -1
  6. data/lib/wab/client.rb +145 -0
  7. data/lib/wab/controller.rb +1 -1
  8. data/lib/wab/errors.rb +6 -0
  9. data/lib/wab/impl.rb +1 -1
  10. data/lib/wab/impl/agoo.rb +18 -0
  11. data/lib/wab/impl/agoo/export_proxy.rb +55 -0
  12. data/lib/wab/impl/agoo/handler.rb +51 -0
  13. data/lib/wab/impl/agoo/sender.rb +50 -0
  14. data/lib/wab/impl/agoo/server.rb +59 -0
  15. data/lib/wab/impl/agoo/tql_handler.rb +35 -0
  16. data/lib/wab/impl/model.rb +8 -1
  17. data/lib/wab/impl/rack_error.rb +27 -0
  18. data/lib/wab/impl/rack_handler.rb +69 -0
  19. data/lib/wab/impl/shell.rb +56 -51
  20. data/lib/wab/impl/sinatra.rb +18 -0
  21. data/lib/wab/impl/sinatra/export_proxy.rb +57 -0
  22. data/lib/wab/impl/sinatra/handler.rb +50 -0
  23. data/lib/wab/impl/sinatra/sender.rb +53 -0
  24. data/lib/wab/impl/sinatra/server.rb +66 -0
  25. data/lib/wab/impl/sinatra/tql_handler.rb +35 -0
  26. data/lib/wab/impl/templates/wabur.conf.template +1 -1
  27. data/lib/wab/impl/webrick.rb +18 -0
  28. data/lib/wab/impl/webrick/export_proxy.rb +41 -0
  29. data/lib/wab/impl/webrick/handler.rb +116 -0
  30. data/lib/wab/impl/webrick/sender.rb +34 -0
  31. data/lib/wab/impl/webrick/server.rb +39 -0
  32. data/lib/wab/impl/webrick/tql_handler.rb +58 -0
  33. data/lib/wab/racker.rb +25 -0
  34. data/lib/wab/version.rb +1 -1
  35. data/pages/Architecture.md +15 -6
  36. data/test/test_client.rb +282 -0
  37. data/test/test_impl.rb +2 -0
  38. data/test/test_runner.rb +267 -91
  39. metadata +27 -5
  40. data/lib/wab/impl/export_proxy.rb +0 -39
  41. data/lib/wab/impl/handler.rb +0 -98
@@ -37,3 +37,5 @@ require 'test_data'
37
37
  require 'test_expr'
38
38
  require 'test_init'
39
39
  require 'test_model'
40
+
41
+ require 'test_client'
@@ -1,5 +1,4 @@
1
1
  #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
2
 
4
3
  require_relative 'helper'
5
4
 
@@ -13,12 +12,15 @@ require 'wab/io'
13
12
  # This is to verify that WAB-Runners behave as expected.
14
13
  #
15
14
  # Requirements:
16
- # - The Runner (e.g. OpO daemon) should be started with the MirrorController
17
- # class.
18
- # - The host and port must be the last argument on the command line when
19
- # invoking the test.
15
+ # - A Runner such as wabur or opo-rub.
16
+ # - The Runner should be started with the MirrorController class in
17
+ # mirror_controller.rb
18
+ # - The configuration files for the wabur and opo-rub Runners are in the
19
+ # runner directory.
20
20
  #
21
- # Example usage:
21
+ # Start the runner using local code (in a separate terminal):
22
+ # ../bin/wabur -I ../lib -I . -c runner/wabur.conf
23
+ # Run the test:
22
24
  # runner_test.rb localhost:6363
23
25
  # -----------------------------------------------------------------------------
24
26
 
@@ -29,60 +31,198 @@ $port = $port.to_i
29
31
 
30
32
  class TestRunner < Minitest::Test
31
33
 
34
+ def setup
35
+ @client = WAB::Client.new($host, $port)
36
+ # Delete all records to start with a clean database
37
+ clear_records(@client)
38
+ end
39
+
40
+ def test_runner_static
41
+ puts "\n --- static content" if $VERBOSE
42
+ uri = URI("http://#{$host}:#{$port}/hello.txt")
43
+ req = Net::HTTP::Get.new(uri)
44
+ req['Connection'] = 'Close'
45
+ resp = Net::HTTP.start(uri.hostname, uri.port) { |h|
46
+ h.request(req)
47
+ }
48
+ assert_equal(Net::HTTPOK, resp.class)
49
+ assert_equal("Hello\n", resp.body)
50
+ end
51
+
52
+ def test_runner_export
53
+ puts "\n --- export" if $VERBOSE
54
+ uri = URI("http://#{$host}:#{$port}/index.html")
55
+ req = Net::HTTP::Get.new(uri)
56
+ req['Connection'] = 'Close'
57
+ resp = Net::HTTP.start(uri.hostname, uri.port) { |h|
58
+ h.request(req)
59
+ }
60
+ assert_equal(Net::HTTPOK, resp.class)
61
+ end
62
+
32
63
  # The Runner or rather it's storage is stateful so all steps in the test
33
64
  # must be made in order to keep the test self contained. Each step is a
34
65
  # separate function though.
35
- def test_runner_basics
36
- http = Net::HTTP.new($host, $port)
66
+ def test_runner_using_refs
67
+ ref = create_records(@client)
68
+ get_record(@client, ref)
69
+ update_record(@client, ref)
70
+ delete_record(@client, ref)
71
+ end
37
72
 
38
- # Delete all records to start with a clean database
39
- clear_records(http)
40
- ref = create_record(http)
41
- read_record(http, ref)
42
- list_records(http, ref)
73
+ def test_runner_using_queries
74
+ ref = create_records(@client)
43
75
 
44
- ref = update_record(http, ref)
45
- read_after_update(http, ref)
76
+ read_record(@client, ref)
77
+ list_records(@client)
78
+ query_records(@client)
79
+ update_query(@client)
80
+ delete_query(@client)
81
+ end
82
+
83
+ def test_runner_missing
84
+ create_records(@client)
46
85
 
47
- delete_record(http, ref)
48
- read_after_delete(http, ref)
86
+ puts " --- read missing" if $VERBOSE
87
+ result = @client.read('Article', {title: 'Missing'})
88
+ check_result_code(result)
89
+ assert_equal(0, result[:results].length, 'read results should be empty')
90
+
91
+ puts " --- update missing" if $VERBOSE
92
+ result = @client.update('Article', {kind: 'Article'}, {title: 'Missing'})
93
+ check_result_code(result)
94
+ assert_equal(0, result[:updated].length, 'updated should be empty')
95
+
96
+ puts " --- delete missing" if $VERBOSE
97
+ result = @client.delete('Article', {title: 'Missing'})
98
+ check_result_code(result)
99
+ assert_equal(0, result[:deleted].length, 'deleted should be empty')
49
100
  end
50
101
 
51
- def clear_records(http)
52
- resp = http.send_request('DELETE', '/v1/Article')
53
- # Response should be an OK with a JSON body.
54
- assert_equal(Net::HTTPOK, resp.class, 'response not an OK')
55
- reply = Oj.strict_load(resp.body, symbol_keys: true)
102
+ def test_runner_duplicate
103
+ create_records(@client)
104
+
105
+ assert_raises('should fail to create an unsupported kind') {
106
+ @client.create({
107
+ kind: 'Article',
108
+ title: 'Sample',
109
+ text: 'Different.'}, {title: 'Sample'})
110
+ }
56
111
  end
57
112
 
58
- # Returns the reference of the created record.
59
- def create_record(http)
60
- json = %|{
61
- "kind": "Article",
62
- "title": "Sample",
63
- "text": "Just some random text."
64
- }|
65
- resp = http.send_request('PUT', '/v1/Article', json, { 'Content-Type' => 'application/json' })
66
- # Response should be an OK with a JSON body.
67
- assert_equal(Net::HTTPOK, resp.class, 'response not an OK')
68
- reply = Oj.strict_load(resp.body, symbol_keys: true)
113
+ def test_runner_multi_match
114
+ # create records twice so there are duplicates
115
+ create_records(@client)
116
+ create_records(@client)
117
+
118
+ puts " --- delete multi" if $VERBOSE
119
+ result = @client.delete('Article', {title: 'Second'})
120
+ check_result_code(result)
121
+ assert_equal(2, result[:deleted].length, 'delete reply.deleted should contain exactly two member')
122
+
123
+ result = @client.read('Article')
124
+ check_result_code(result)
125
+ assert_equal(4, result[:results].length, 'read reply.results should contain all member')
126
+ end
127
+
128
+ def test_runner_query
129
+ 10.times { |i|
130
+ @client.create({kind: 'Article', title: "Article-#{i}", num: i})
131
+ }
132
+
133
+ check_query(@client, {where: ['EQ', 'num', 3], select: 'title'}, ['Article-3'])
134
+ check_query(@client, {where: ['EQ', 'title', 'Article-4'], select: 'title'}, ['Article-4'])
135
+
136
+ check_query(@client, {where: ['LT', 'num', 3], select: 'title'}, ['Article-0','Article-1','Article-2'])
137
+ check_query(@client, {where: ['LTE', 'num', 2], select: 'title'}, ['Article-0','Article-1','Article-2'])
138
+
139
+ check_query(@client, {where: ['GT', 'num', 7], select: 'title'}, ['Article-8','Article-9'])
140
+ check_query(@client, {where: ['GTE', 'num', 7], select: 'title'}, ['Article-7','Article-8','Article-9'])
141
+
142
+ check_query(@client, {where: ['BETWEEN', 'num', 5, 7], select: 'title'}, ['Article-5','Article-6','Article-7'])
143
+ check_query(@client, {where: ['BETWEEN', 'num', 5, 7, false, false], select: 'title'}, ['Article-6'])
144
+ check_query(@client, {where: ['BETWEEN', 'num', 5, 7, false, true], select: 'title'}, ['Article-6','Article-7'])
145
+ check_query(@client, {where: ['BETWEEN', 'num', 5, 7, true, false], select: 'title'}, ['Article-5','Article-6'])
146
+
147
+ check_query(@client, {where: ['IN', 'num', 1, 3, 5, 7], select: 'title'}, ['Article-1','Article-3','Article-5','Article-7'])
148
+
149
+ check_query(@client, {where: ['OR', ['LT', 'num', 2], ['GT', 'num', 7]], select: 'title'}, ['Article-0','Article-1','Article-8','Article-9'])
150
+ check_query(@client, {where: ['EQ', 'kind', 'Article'], filter: ['NOT', ['BETWEEN', 'num', 2, 7]], select: 'num'}, [0, 1, 8, 9])
151
+
152
+ check_query(@client, {where: ['eq', 'kind', 'Article'], filter: ['eq', 'title', 'Article-3'], select: 'num'}, [3])
153
+ check_query(@client, {where: ['eq', 'kind', 'Article'], filter: ['regex', 'title', 'A.*-[3,4,5]'], select: 'num'}, [3, 4, 5])
154
+
155
+ check_query(@client, {where: ['and', ['LT', 'num', 5], ['GT', 'num', 2]], select: 'num'}, [3, 4])
156
+
157
+ check_query(@client, {where: ['and', ['LT', 'num', 5], ['or', ['eq', 'num', 0], ['GT', 'num', 2]]], select: 'num'}, [0, 3, 4])
158
+ end
159
+
160
+ def test_runner_rack
161
+ puts "\n --- calling rack" if $VERBOSE
162
+ uri = URI("http://#{$host}:#{$port}/rack/hello")
163
+ req = Net::HTTP::Post.new(uri)
164
+ req['Accept-Encoding'] = '*'
165
+ req['Accept'] = 'application/json'
166
+ req['User-Agent'] = 'Ruby'
167
+ req['Connection'] = 'Close'
168
+ req.body = 'hello'
169
+ resp = Net::HTTP.start(uri.hostname, uri.port) { |h|
170
+ h.request(req)
171
+ }
172
+ assert_equal(Net::HTTPOK, resp.class)
173
+ assert_equal('A WABuR Rack Application', resp.body)
174
+ end
175
+
176
+ def check_query(client, query, expect)
177
+ puts " --- query #{query}" if $VERBOSE
178
+ result = client.find(query)
179
+ check_result_code(result)
180
+ assert_equal(expect, result[:results].sort, 'result mistmatch')
181
+ end
182
+
183
+ def check_result_code(result)
184
+ assert_equal(0, result[:code], 'result.code should be 0 meaning no error')
185
+ end
69
186
 
187
+ def clear_records(client)
188
+ puts "\n --- deleting existing records" if $VERBOSE
189
+ result = client.delete('Article')
190
+ check_result_code(result)
191
+ end
192
+
193
+ # Returns the reference of the created record.
194
+ def create_records(client)
195
+ puts " --- create records" if $VERBOSE
196
+ record = {
197
+ kind: 'Article',
198
+ title: 'Sample',
199
+ text: 'Just some random text.'
200
+ }
201
+ result = client.create(record)
70
202
  # Make sure the message has the correct fields and values.
71
- assert_equal(0, reply[:code], 'create reply.code should be 0 meaning no error')
72
- ref = reply[:ref]
203
+ check_result_code(result)
204
+ ref = result[:ref]
73
205
  refute_equal(nil, ref, 'create reply record reference can not be nil')
74
206
  refute_equal(0, ref, 'create reply record reference can not be 0')
207
+
208
+ # create a couple more records
209
+ client.create({
210
+ kind: 'Article',
211
+ title: 'Second',
212
+ text: 'More random text.'})
213
+ client.create({
214
+ kind: 'Article',
215
+ title: 'Third',
216
+ text: 'Even more random text.'})
75
217
  ref
76
218
  end
77
219
 
78
- def read_record(http, ref)
79
- resp = http.send_request('GET', "/v1/Article/#{ref}")
80
- assert_equal(Net::HTTPOK, resp.class, 'response not an OK')
81
- reply = Oj.strict_load(resp.body, symbol_keys: true)
82
-
220
+ def get_record(client, ref)
221
+ puts " --- get record" if $VERBOSE
222
+ result = client.read('Article', ref)
83
223
  # Make sure the message has the correct fields and values.
84
- assert_equal(0, reply[:code], 'read reply.code should be 0 meaning no error')
85
- results = reply[:results]
224
+ check_result_code(result)
225
+ results = result[:results]
86
226
  assert_equal(1, results.length, 'read reply.results should contain exactly one member')
87
227
  record = results[0]
88
228
  assert_equal(ref, record[:id], 'read reply.results[0].id should match the record reference')
@@ -91,14 +231,12 @@ class TestRunner < Minitest::Test
91
231
  assert_equal('Sample', obj[:title], 'read reply obj.title incorrect')
92
232
  end
93
233
 
94
- def list_records(http, ref)
95
- resp = http.send_request('GET', '/v1/Article')
96
- assert_equal(Net::HTTPOK, resp.class, 'response not an OK')
97
- reply = Oj.strict_load(resp.body, symbol_keys: true)
98
-
234
+ def read_record(client, ref)
235
+ puts " --- read record" if $VERBOSE
236
+ result = client.read('Article', {title: 'Sample'})
99
237
  # Make sure the message has the correct fields and values.
100
- assert_equal(0, reply[:code], 'read reply.code should be 0 meaning no error')
101
- results = reply[:results]
238
+ check_result_code(result)
239
+ results = result[:results]
102
240
  assert_equal(1, results.length, 'read reply.results should contain exactly one member')
103
241
  record = results[0]
104
242
  assert_equal(ref, record[:id], 'read reply.results[0].id should match the record reference')
@@ -107,71 +245,109 @@ class TestRunner < Minitest::Test
107
245
  assert_equal('Sample', obj[:title], 'read reply obj.title incorrect')
108
246
  end
109
247
 
248
+ def list_records(client)
249
+ puts " --- list records" if $VERBOSE
250
+ result = client.read('Article')
251
+ # Make sure the message has the correct fields and values.
252
+ check_result_code(result)
253
+ results = result[:results]
254
+ assert_equal(3, results.length, 'read reply.results should contain all member')
255
+ end
256
+
110
257
  # Returns the reference of the updated record. There is no requirement that
111
258
  # the reference will not change.
112
- def update_record(http, ref)
113
- json = %|{
114
- "kind": "Article",
115
- "title": "Sample",
116
- "text": "Updated text."
117
- }|
118
- resp = http.send_request('POST', "/v1/Article/#{ref}", json, { 'Content-Type' => 'application/json' })
119
- # Response should be an OK with a JSON body.
120
- assert_equal(Net::HTTPOK, resp.class, 'response not an OK')
121
- reply = Oj.strict_load(resp.body, symbol_keys: true)
122
-
259
+ def update_record(client, ref)
260
+ puts " --- update record" if $VERBOSE
261
+ record = {
262
+ kind: 'Article',
263
+ title: 'Sample',
264
+ text: 'Updated text.'
265
+ }
266
+ result = client.update('Article', record, ref)
123
267
  # Make sure the message has the correct fields and values.
124
- assert_equal(0, reply[:code], 'update reply.code should be 0 meaning no error')
125
- updated = reply[:updated]
268
+ check_result_code(result)
269
+ updated = result[:updated]
126
270
  assert_equal(1, updated.length, 'update reply.updated should contain exactly one member')
127
271
  ref = updated[0]
128
272
  refute_equal(nil, ref, 'update reply record reference can not be nil')
129
273
  refute_equal(0, ref, 'update reply record reference can not be 0')
130
- ref
131
- end
132
-
133
- def read_after_update(http, ref)
134
- resp = http.send_request('GET', "/v1/Article/#{ref}")
135
- assert_equal(Net::HTTPOK, resp.class, 'response not an OK')
136
- reply = Oj.strict_load(resp.body, symbol_keys: true)
137
-
138
- assert_equal(0, reply[:code], 'read after update reply.code should be 0 meaning no error')
139
- results = reply[:results]
274
+ # verify
275
+ result = client.read('Article', ref)
276
+ check_result_code(result)
277
+ results = result[:results]
140
278
  assert_equal(1, results.length, 'read after update reply.results should contain exactly one member')
141
279
  record = results[0]
142
280
  assert_equal(ref, record[:id], 'read after update reply.results[0].id should match the record reference')
143
281
  obj = record[:data]
144
282
  assert_equal('Updated text.', obj[:text], 'read after update reply obj.text incorrect')
283
+ ref
145
284
  end
146
285
 
147
- def delete_record(http, ref)
148
- resp = http.send_request('DELETE', "/v1/Article/#{ref}")
149
- # Response should be an OK with a JSON body.
150
- assert_equal(Net::HTTPOK, resp.class, 'response not an OK')
151
- reply = Oj.strict_load(resp.body, symbol_keys: true)
152
-
286
+ def delete_record(client, ref)
287
+ puts " --- delete record" if $VERBOSE
288
+ result = client.delete('Article', ref)
153
289
  # Make sure the message has the correct fields and values.
154
- assert_equal(0, reply[:code], 'delete reply.code should be 0 meaning no error')
155
- deleted = reply[:deleted]
290
+ check_result_code(result)
291
+ deleted = result[:deleted]
156
292
  assert_equal(1, deleted.length, 'delete reply.deleted should contain exactly one member')
157
293
  ref = deleted[0]
158
294
  refute_equal(nil, ref, 'delete reply record reference can not be nil')
159
295
  refute_equal(0, ref, 'delete reply record reference can not be 0')
296
+ # verify
297
+ result = client.read('Article', ref)
298
+ check_result_code(result)
299
+ results = result[:results]
300
+ assert_equal(0, results.length, 'read after delete reply.results should contain no members')
160
301
  end
161
302
 
162
- def read_after_delete(http, ref)
163
- resp = http.send_request('GET', "/v1/Article/#{ref}")
164
- assert_equal(Net::HTTPOK, resp.class, 'response not an OK')
165
- reply = Oj.strict_load(resp.body, symbol_keys: true)
303
+ def query_records(client)
304
+ puts " --- query records" if $VERBOSE
305
+ result = client.read('Article', {title: 'Second'})
306
+ check_result_code(result)
307
+ results = result[:results]
308
+ assert_equal(1, results.length, 'read reply.results should contain matching members')
309
+ assert_equal({kind: 'Article', title: 'Second', text: 'More random text.'}, results[0][:data], 'first result should match the inserted')
310
+ end
166
311
 
167
- assert_equal(0, reply[:code], 'read after delete reply.code should be 0 meaning no error')
168
- results = reply[:results]
169
- assert_equal(0, results.length, 'read after delete reply.results should contain no members')
312
+ def update_query(client)
313
+ puts " --- update query" if $VERBOSE
314
+ record = {
315
+ kind: 'Article',
316
+ title: 'Sample',
317
+ text: 'Updated text.'
318
+ }
319
+ result = client.update('Article', record, {title: 'Sample'})
320
+ # Make sure the message has the correct fields and values.
321
+ check_result_code(result)
322
+ updated = result[:updated]
323
+ assert_equal(1, updated.length, 'update reply.updated should contain exactly one member')
324
+ ref = updated[0]
325
+ refute_equal(nil, ref, 'update reply record reference can not be nil')
326
+ refute_equal(0, ref, 'update reply record reference can not be 0')
327
+ # verify
328
+ result = client.read('Article', {title: 'Sample'})
329
+ check_result_code(result)
330
+ results = result[:results]
331
+ assert_equal(1, results.length, 'read after update reply.results should contain exactly one member')
332
+ record = results[0]
333
+ assert_equal(ref, record[:id], 'read after update reply.results[0].id should match the record reference')
334
+ obj = record[:data]
335
+ assert_equal('Updated text.', obj[:text], 'read after update reply obj.text incorrect')
170
336
  end
171
337
 
172
- # TBD test failure modes as well
173
- # TBD test multiple matches on update and delete
174
- # TBD test no matches on update and delete
175
- # TBD test queries
338
+ def delete_query(client)
339
+ puts " --- delete query" if $VERBOSE
340
+ result = client.delete('Article', {title: 'Second'})
341
+ check_result_code(result)
342
+ deleted = result[:deleted]
343
+ assert_equal(1, deleted.length, 'delete reply.deleted should contain exactly one member')
344
+ ref = deleted[0]
345
+ refute_equal(nil, ref, 'delete reply record reference can not be nil')
346
+ refute_equal(0, ref, 'delete reply record reference can not be 0')
347
+ # verify
348
+ result = client.read('Article', {title: 'Second'})
349
+ check_result_code(result)
350
+ assert_equal(0, result[:results].length, 'read after delete reply.results should contain no members')
351
+ end
176
352
 
177
353
  end # TestRunner
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wabur
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.2
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Ohler
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-10-16 00:00:00.000000000 Z
11
+ date: 2018-02-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: oj
@@ -163,14 +163,20 @@ files:
163
163
  - export/assets/js/wab.js
164
164
  - export/index.html
165
165
  - lib/wab.rb
166
+ - lib/wab/client.rb
166
167
  - lib/wab/controller.rb
167
168
  - lib/wab/data.rb
168
169
  - lib/wab/errors.rb
169
170
  - lib/wab/impl.rb
171
+ - lib/wab/impl/agoo.rb
172
+ - lib/wab/impl/agoo/export_proxy.rb
173
+ - lib/wab/impl/agoo/handler.rb
174
+ - lib/wab/impl/agoo/sender.rb
175
+ - lib/wab/impl/agoo/server.rb
176
+ - lib/wab/impl/agoo/tql_handler.rb
170
177
  - lib/wab/impl/bool_expr.rb
171
178
  - lib/wab/impl/configuration.rb
172
179
  - lib/wab/impl/data.rb
173
- - lib/wab/impl/export_proxy.rb
174
180
  - lib/wab/impl/expr.rb
175
181
  - lib/wab/impl/expr_parser.rb
176
182
  - lib/wab/impl/exprs/and.rb
@@ -185,22 +191,36 @@ files:
185
191
  - lib/wab/impl/exprs/not.rb
186
192
  - lib/wab/impl/exprs/or.rb
187
193
  - lib/wab/impl/exprs/regex.rb
188
- - lib/wab/impl/handler.rb
189
194
  - lib/wab/impl/init.rb
190
195
  - lib/wab/impl/model.rb
191
196
  - lib/wab/impl/path_expr.rb
197
+ - lib/wab/impl/rack_error.rb
198
+ - lib/wab/impl/rack_handler.rb
192
199
  - lib/wab/impl/shell.rb
200
+ - lib/wab/impl/sinatra.rb
201
+ - lib/wab/impl/sinatra/export_proxy.rb
202
+ - lib/wab/impl/sinatra/handler.rb
203
+ - lib/wab/impl/sinatra/sender.rb
204
+ - lib/wab/impl/sinatra/server.rb
205
+ - lib/wab/impl/sinatra/tql_handler.rb
193
206
  - lib/wab/impl/templates/opo-rub.conf.template
194
207
  - lib/wab/impl/templates/opo.conf.template
195
208
  - lib/wab/impl/templates/spawn.rb.template
196
209
  - lib/wab/impl/templates/ui_controller.rb.template
197
210
  - lib/wab/impl/templates/wabur.conf.template
198
211
  - lib/wab/impl/utils.rb
212
+ - lib/wab/impl/webrick.rb
213
+ - lib/wab/impl/webrick/export_proxy.rb
214
+ - lib/wab/impl/webrick/handler.rb
215
+ - lib/wab/impl/webrick/sender.rb
216
+ - lib/wab/impl/webrick/server.rb
217
+ - lib/wab/impl/webrick/tql_handler.rb
199
218
  - lib/wab/io.rb
200
219
  - lib/wab/io/call.rb
201
220
  - lib/wab/io/engine.rb
202
221
  - lib/wab/io/shell.rb
203
222
  - lib/wab/open_controller.rb
223
+ - lib/wab/racker.rb
204
224
  - lib/wab/shell.rb
205
225
  - lib/wab/shell_logger.rb
206
226
  - lib/wab/ui.rb
@@ -220,6 +240,7 @@ files:
220
240
  - test/bench_io_shell.rb
221
241
  - test/helper.rb
222
242
  - test/mirror_controller.rb
243
+ - test/test_client.rb
223
244
  - test/test_configuration.rb
224
245
  - test/test_data.rb
225
246
  - test/test_expr.rb
@@ -268,7 +289,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
268
289
  version: '0'
269
290
  requirements: []
270
291
  rubyforge_project: wabur
271
- rubygems_version: 2.6.11
292
+ rubygems_version: 2.7.3
272
293
  signing_key:
273
294
  specification_version: 4
274
295
  summary: Web Application Builder
@@ -290,6 +311,7 @@ test_files:
290
311
  - test/test_expr_lt.rb
291
312
  - test/test_expr_gte.rb
292
313
  - test/test_expr_gt.rb
314
+ - test/test_client.rb
293
315
  - test/helper.rb
294
316
  - test/bench_io_shell.rb
295
317
  - test/test_expr_eq.rb