wabur 0.6.2 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
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