wabur 0.2.0d1 → 0.4.0d1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +40 -14
  3. data/bin/wabur +103 -0
  4. data/lib/wab/controller.rb +133 -90
  5. data/lib/wab/data.rb +14 -27
  6. data/lib/wab/errors.rb +14 -8
  7. data/lib/wab/impl/bool_expr.rb +25 -0
  8. data/lib/wab/impl/configuration.rb +166 -0
  9. data/lib/wab/impl/data.rb +155 -232
  10. data/lib/wab/impl/expr.rb +26 -0
  11. data/lib/wab/impl/expr_parser.rb +55 -0
  12. data/lib/wab/impl/exprs/and.rb +29 -0
  13. data/lib/wab/impl/exprs/between.rb +41 -0
  14. data/lib/wab/impl/exprs/eq.rb +28 -0
  15. data/lib/wab/impl/exprs/gt.rb +30 -0
  16. data/lib/wab/impl/exprs/gte.rb +30 -0
  17. data/lib/wab/impl/exprs/has.rb +26 -0
  18. data/lib/wab/impl/exprs/in.rb +28 -0
  19. data/lib/wab/impl/exprs/lt.rb +30 -0
  20. data/lib/wab/impl/exprs/lte.rb +30 -0
  21. data/lib/wab/impl/exprs/not.rb +27 -0
  22. data/lib/wab/impl/exprs/or.rb +29 -0
  23. data/lib/wab/impl/exprs/regex.rb +28 -0
  24. data/lib/wab/impl/handler.rb +95 -0
  25. data/lib/wab/impl/model.rb +197 -0
  26. data/lib/wab/impl/path_expr.rb +14 -0
  27. data/lib/wab/impl/shell.rb +92 -7
  28. data/lib/wab/impl/utils.rb +110 -0
  29. data/lib/wab/impl.rb +24 -0
  30. data/lib/wab/io/call.rb +4 -7
  31. data/lib/wab/io/engine.rb +128 -51
  32. data/lib/wab/io/shell.rb +61 -64
  33. data/lib/wab/io.rb +0 -2
  34. data/lib/wab/open_controller.rb +43 -0
  35. data/lib/wab/shell.rb +46 -61
  36. data/lib/wab/shell_logger.rb +13 -0
  37. data/lib/wab/utils.rb +36 -0
  38. data/lib/wab/uuid.rb +3 -6
  39. data/lib/wab/version.rb +2 -2
  40. data/lib/wab.rb +3 -0
  41. data/pages/Plan.md +20 -14
  42. data/test/bench_io_shell.rb +49 -0
  43. data/test/{impl_test.rb → helper.rb} +2 -4
  44. data/test/mirror_controller.rb +16 -0
  45. data/test/test_configuration.rb +38 -0
  46. data/test/test_data.rb +207 -0
  47. data/test/test_expr.rb +35 -0
  48. data/test/test_expr_and.rb +24 -0
  49. data/test/test_expr_between.rb +43 -0
  50. data/test/test_expr_eq.rb +24 -0
  51. data/test/test_expr_gt.rb +24 -0
  52. data/test/test_expr_gte.rb +24 -0
  53. data/test/test_expr_has.rb +19 -0
  54. data/test/test_expr_in.rb +24 -0
  55. data/test/test_expr_lt.rb +24 -0
  56. data/test/test_expr_lte.rb +24 -0
  57. data/test/test_expr_not.rb +22 -0
  58. data/test/test_expr_or.rb +24 -0
  59. data/test/test_expr_regex.rb +30 -0
  60. data/test/test_impl.rb +38 -0
  61. data/test/test_io_shell.rb +189 -0
  62. data/test/test_model.rb +31 -0
  63. data/test/test_runner.rb +177 -0
  64. data/test/tests.rb +3 -8
  65. metadata +91 -18
  66. data/lib/wab/model.rb +0 -136
  67. data/lib/wab/view.rb +0 -21
  68. data/test/data_test.rb +0 -253
  69. data/test/ioshell_test.rb +0 -461
data/test/ioshell_test.rb DELETED
@@ -1,461 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
-
4
- $: << __dir__
5
- $: << File.join(File.dirname(File.expand_path(__dir__)), 'lib')
6
-
7
- require 'minitest'
8
- require 'minitest/autorun'
9
-
10
- require 'wab/impl'
11
- require 'wab/io'
12
-
13
-
14
- class IoEngineTest < Minitest::Test
15
-
16
- class MirrorController < ::WAB::Controller
17
- def initialize(shell)
18
- super
19
- end
20
-
21
- def handle(data)
22
- data
23
- end
24
-
25
- def create(path, query, data)
26
- super
27
- end
28
-
29
- def read(path, query)
30
- super
31
- end
32
-
33
- def update(path, query, data)
34
- super
35
- end
36
-
37
- def delete(path, query)
38
- super
39
- end
40
-
41
- end # MirrorController
42
-
43
- def test_default_controller
44
- run_fork_test([
45
- [{
46
- rid: 'rid-mirror',
47
- api: 1,
48
- body:{
49
- kind: 'sample',
50
- num: 7,
51
- },
52
- },
53
- {rid:'rid-mirror', api:2, body:{kind:"sample", num:7}}]
54
- ])
55
- end
56
-
57
- def test_create
58
- run_fork_test([
59
- [{
60
- rid: 'rid-create',
61
- api: 1,
62
- body:{
63
- op: 'NEW',
64
- path: [ 'sample' ],
65
- content: {
66
- kind: 'sample',
67
- num: 7,
68
- },
69
- },
70
- },
71
- {rid: '1', api: 3, body:{ insert:{ kind: 'sample', num: 7}}}],
72
- [{
73
- rid: '1',
74
- api: 4,
75
- body:{
76
- ref: 123,
77
- code: 0,
78
- },
79
- },
80
- {rid: 'rid-create', api: 2, body:{ ref: 123, code: 0 }}]
81
- ])
82
- end
83
-
84
- def test_create_with_where
85
- run_fork_test([
86
- [{
87
- rid: 'rid-create-where',
88
- api: 1,
89
- body:{
90
- op: 'NEW',
91
- path: [ 'sample' ],
92
- query: {
93
- id: 12345
94
- },
95
- content: {
96
- kind: 'sample',
97
- id: 12345,
98
- num: 7,
99
- },
100
- },
101
- },
102
- {
103
- rid: '1',
104
- api: 3,
105
- body:{
106
- where: ['AND', ['EQ', 'kind', "'sample"],['EQ', 'id', 12345]],
107
- insert:{ kind: 'sample', id: 12345, num: 7}
108
- }
109
- }],
110
- [{
111
- rid: '1',
112
- api: 4,
113
- body:{
114
- ref: 123,
115
- code: 0,
116
- },
117
- },
118
- {rid: 'rid-create-where', api: 2, body:{ ref: 123, code: 0 }}]
119
- ])
120
- end
121
-
122
- def test_create_error
123
- run_fork_test([
124
- [{
125
- rid: 'rid-create',
126
- api: 1,
127
- body:{
128
- op: 'NEW',
129
- path: [ 'sample' ],
130
- content: {
131
- kind: 'sample',
132
- num: 7,
133
- },
134
- },
135
- },
136
- {rid: '1', api: 3, body:{ insert:{ kind: 'sample', num: 7}}}],
137
- [{
138
- rid: '1',
139
- api: 4,
140
- body:{
141
- ref: 123,
142
- code: -1,
143
- error: "something went wrong"
144
- },
145
- },
146
- {rid: 'rid-create', api: 2, body:{ code: -1, error: "error on sample create. something went wrong" }}]
147
- ])
148
- end
149
-
150
- def test_read_by_id
151
- run_fork_test([
152
- [{
153
- rid: 'rid-read-id',
154
- api: 1,
155
- body:{
156
- op: 'GET',
157
- path: [ 'sample', '12345' ]
158
- },
159
- },
160
- {
161
- rid: '1',
162
- api: 3,
163
- body:{
164
- where: 12345,
165
- select: '$'
166
- }
167
- }],
168
- [{
169
- rid: '1',
170
- api: 4,
171
- body:{
172
- code: 0,
173
- results:{
174
- kind: 'sample',
175
- id: 12345,
176
- num: 7,
177
- }
178
- }
179
- },
180
- {rid: 'rid-read-id', api: 2, body:{ code: 0, results:[{ id: 12345, data: { kind: 'sample', id: 12345, num: 7}}]}}]
181
- ])
182
- end
183
-
184
- def test_read_by_attrs
185
- run_fork_test([
186
- [{
187
- rid: 'rid-read-attrs',
188
- api: 1,
189
- body:{
190
- op: 'GET',
191
- path: [ 'sample' ],
192
- query: {
193
- id: 12345
194
- }
195
- }
196
- },
197
- {
198
- rid: '1',
199
- api: 3,
200
- body:{
201
- where: ['AND', ['EQ', 'kind', "'sample"],['EQ', 'id', 12345]],
202
- select: { id: '$ref', data: '$' }
203
- }
204
- }],
205
- [{
206
- rid: '1',
207
- api: 4,
208
- body:{
209
- code: 0,
210
- results:[{
211
- id: 12345,
212
- data: {
213
- kind: 'sample',
214
- id: 12345,
215
- num: 7,
216
- }
217
- }]
218
- }
219
- },
220
- {
221
- rid: 'rid-read-attrs',
222
- api: 2,
223
- body: {
224
- code: 0,
225
- results:[{
226
- id: 12345,
227
- data: {
228
- kind: 'sample',
229
- id: 12345,
230
- num: 7,
231
- }
232
- }]
233
- }
234
- }]
235
- ])
236
- end
237
-
238
- def test_read_list
239
- run_fork_test([
240
- [{
241
- rid: 'rid-read-list',
242
- api: 1,
243
- body:{
244
- op: 'GET',
245
- path: [ 'sample' ]
246
- }
247
- },
248
- {
249
- rid: '1',
250
- api: 3,
251
- body:{
252
- where: ['EQ', 'kind', "'sample"],
253
- select: { id: '$ref', data: '$' }
254
- }
255
- }],
256
- [{
257
- rid: '1',
258
- api: 4,
259
- body:{
260
- code: 0,
261
- results:[ 12345 ]
262
- }
263
- },
264
- {
265
- rid: 'rid-read-list',
266
- api: 2,
267
- body: {
268
- code: 0,
269
- results:[ 12345 ]
270
- }
271
- }]
272
- ])
273
- end
274
-
275
- def test_update_by_id
276
- run_fork_test([
277
- [{
278
- rid: 'rid-update-id',
279
- api: 1,
280
- body:{
281
- op: 'MOD',
282
- path: [ 'sample', '12345' ],
283
- content: {
284
- kind: 'sample',
285
- id: 12345,
286
- num: 7,
287
- }
288
- }
289
- },
290
- {
291
- rid: '1',
292
- api: 3,
293
- body:{
294
- where: 12345,
295
- update: { kind: 'sample', id: 12345, num: 7}
296
- }
297
- }],
298
- [{
299
- rid: '1',
300
- api: 4,
301
- body:{
302
- code: 0,
303
- updated: [ 12345 ]
304
- }
305
- },
306
- {rid: 'rid-update-id', api: 2, body:{ code: 0, updated: [12345] }}]
307
- ])
308
- end
309
-
310
- def test_update_by_attrs
311
- run_fork_test([
312
- [{
313
- rid: 'rid-update-attrs',
314
- api: 1,
315
- body:{
316
- op: 'MOD',
317
- path: [ 'sample' ],
318
- query: {
319
- id: 12345
320
- },
321
- content: {
322
- kind: 'sample',
323
- id: 12345,
324
- num: 7,
325
- }
326
- }
327
- },
328
- {
329
- rid: '1',
330
- api: 3,
331
- body:{
332
- where: ['AND', ['EQ', 'kind', "'sample"],['EQ', 'id', 12345]],
333
- update: { kind: 'sample', id: 12345, num: 7}
334
- }
335
- }],
336
- [{
337
- rid: '1',
338
- api: 4,
339
- body:{
340
- code: 0,
341
- updated: [ 12345 ]
342
- }
343
- },
344
- {rid: 'rid-update-attrs', api: 2, body:{ code: 0, updated: [12345] }}]
345
- ])
346
- end
347
-
348
- def test_delete_by_id
349
- run_fork_test([
350
- [{
351
- rid: 'rid-delete-id',
352
- api: 1,
353
- body:{
354
- op: 'DEL',
355
- path: [ 'sample', '12345' ]
356
- }
357
- },
358
- {
359
- rid: '1',
360
- api: 3,
361
- body:{
362
- where: 12345,
363
- delete: nil
364
- }
365
- }],
366
- [{
367
- rid: '1',
368
- api: 4,
369
- body:{
370
- code: 0,
371
- deleted: [ 12345 ]
372
- }
373
- },
374
- {rid: 'rid-delete-id', api: 2, body:{ code: 0, deleted: [12345] }}]
375
- ])
376
- end
377
-
378
- def test_delete_by_attrs
379
- run_fork_test([
380
- [{
381
- rid: 'rid-delete-attrs',
382
- api: 1,
383
- body:{
384
- op: 'DEL',
385
- path: [ 'sample' ],
386
- query: {
387
- id: 12345
388
- }
389
- }
390
- },
391
- {
392
- rid: '1',
393
- api: 3,
394
- body:{
395
- where: ['AND', ['EQ', 'kind', "'sample"],['EQ', 'id', 12345]],
396
- delete: nil
397
- }
398
- }],
399
- [{
400
- rid: '1',
401
- api: 4,
402
- body:{
403
- code: 0,
404
- deleted: [ 12345 ]
405
- }
406
- },
407
- {rid: 'rid-delete-attrs', api: 2, body:{ code: 0, deleted: [12345] }}]
408
- ])
409
- end
410
-
411
- # Fork and create a shell in the child. For each pair in the script send the
412
- # first message and wait for the second. Compare second for test success of
413
- # failure.
414
- def run_fork_test(script)
415
- # Windows does not support fork
416
- return if RbConfig::CONFIG['host_os'] =~ /(mingw|mswin)/
417
-
418
- to_r, to_w = IO.pipe
419
- from_r, from_w = IO.pipe
420
-
421
- if fork.nil? # child
422
- $stdin = to_r
423
- to_w.close
424
- $stdout = from_w
425
- from_r.close
426
-
427
- shell = ::WAB::IO::Shell.new(1, 'kind', 0)
428
- shell.register_controller(nil, MirrorController.new(shell))
429
- shell.start
430
-
431
- Process.exit(0)
432
- else
433
- to_r.close
434
- from_w.close
435
-
436
- # Shell#data should be called instead but for this test a shell is not
437
- # desired.
438
- script.each { |pair|
439
- to_w.puts(::WAB::Impl::Data.new(pair[0], false).json)
440
- to_w.flush
441
-
442
- reply = nil
443
- Oj.strict_load(from_r, symbol_keys: true) { |msg| reply = msg; break }
444
-
445
- # remove backtrace if an error
446
- bt = nil
447
- if !reply.nil? && !reply[:body].nil?
448
- bt = reply[:body].delete(:backtrace)
449
- end
450
- begin
451
- assert_equal(pair[1], reply)
452
- rescue Exception => e
453
- puts
454
- puts bt
455
- raise e
456
- end
457
- }
458
- end
459
- end
460
-
461
- end