isomorfeus-data 1.0.0.zeta5 → 1.0.0.zeta6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +37 -1
  3. data/lib/isomorfeus/data/attribute_support.rb +122 -0
  4. data/lib/isomorfeus/data/config.rb +79 -89
  5. data/lib/isomorfeus/data/element_validator.rb +133 -0
  6. data/lib/isomorfeus/data/generic_class_api.rb +155 -0
  7. data/lib/isomorfeus/data/generic_instance_api.rb +72 -0
  8. data/lib/isomorfeus/data/handler/arango.rb +61 -0
  9. data/lib/isomorfeus/data/handler/generic.rb +92 -0
  10. data/lib/isomorfeus/data/handler/object_call.rb +45 -0
  11. data/lib/isomorfeus/data/handler/object_store.rb +45 -0
  12. data/lib/isomorfeus/data/version.rb +1 -1
  13. data/lib/isomorfeus-data.rb +61 -30
  14. data/lib/isomorfeus_data/lucid_data/array/base.rb +15 -0
  15. data/lib/isomorfeus_data/lucid_data/array/mixin.rb +570 -0
  16. data/lib/isomorfeus_data/lucid_data/collection/base.rb +15 -0
  17. data/lib/isomorfeus_data/lucid_data/collection/finders.rb +83 -0
  18. data/lib/isomorfeus_data/lucid_data/collection/mixin.rb +710 -0
  19. data/lib/isomorfeus_data/lucid_data/composition/base.rb +15 -0
  20. data/lib/isomorfeus_data/lucid_data/composition/mixin.rb +185 -0
  21. data/lib/isomorfeus_data/lucid_data/document/base.rb +15 -0
  22. data/lib/isomorfeus_data/lucid_data/document/mixin.rb +9 -0
  23. data/lib/isomorfeus_data/lucid_data/edge/base.rb +15 -0
  24. data/lib/isomorfeus_data/lucid_data/edge/mixin.rb +281 -0
  25. data/lib/isomorfeus_data/lucid_data/edge_collection/base.rb +15 -0
  26. data/lib/isomorfeus_data/lucid_data/edge_collection/finders.rb +134 -0
  27. data/lib/isomorfeus_data/lucid_data/edge_collection/mixin.rb +705 -0
  28. data/lib/isomorfeus_data/lucid_data/graph/base.rb +15 -0
  29. data/lib/isomorfeus_data/lucid_data/graph/finders.rb +141 -0
  30. data/lib/isomorfeus_data/lucid_data/graph/mixin.rb +401 -0
  31. data/lib/isomorfeus_data/lucid_data/hash/base.rb +15 -0
  32. data/lib/isomorfeus_data/lucid_data/hash/mixin.rb +413 -0
  33. data/lib/isomorfeus_data/lucid_data/link/base.rb +15 -0
  34. data/lib/isomorfeus_data/lucid_data/link/mixin.rb +9 -0
  35. data/lib/isomorfeus_data/lucid_data/link_collection/base.rb +15 -0
  36. data/lib/isomorfeus_data/lucid_data/link_collection/mixin.rb +9 -0
  37. data/lib/isomorfeus_data/lucid_data/node/base.rb +15 -0
  38. data/lib/isomorfeus_data/lucid_data/node/mixin.rb +192 -0
  39. data/lib/isomorfeus_data/lucid_data/object/base.rb +13 -0
  40. data/lib/{lucid_array → isomorfeus_data/lucid_data/object}/mixin.rb +15 -16
  41. data/lib/isomorfeus_data/lucid_data/remote_object/base.rb +13 -0
  42. data/lib/isomorfeus_data/lucid_data/remote_object/mixin.rb +19 -0
  43. data/lib/isomorfeus_data/lucid_data/vertex/base.rb +15 -0
  44. data/lib/isomorfeus_data/lucid_data/vertex/mixin.rb +9 -0
  45. data/lib/lucid_arango/collection/base.rb +15 -0
  46. data/lib/lucid_arango/collection/mixin.rb +20 -0
  47. data/lib/lucid_arango/document/base.rb +15 -0
  48. data/lib/lucid_arango/document/mixin.rb +9 -0
  49. data/lib/lucid_arango/edge/base.rb +16 -0
  50. data/lib/lucid_arango/edge/mixin.rb +20 -0
  51. data/lib/lucid_arango/edge_collection/base.rb +15 -0
  52. data/lib/lucid_arango/edge_collection/mixin.rb +20 -0
  53. data/lib/lucid_arango/graph/base.rb +15 -0
  54. data/lib/lucid_arango/graph/mixin.rb +20 -0
  55. data/lib/lucid_arango/node/base.rb +16 -0
  56. data/lib/lucid_arango/node/mixin.rb +81 -0
  57. data/lib/lucid_arango/vertex/base.rb +15 -0
  58. data/lib/lucid_arango/vertex/mixin.rb +9 -0
  59. metadata +84 -47
  60. data/lib/isomorfeus/data/handler/array_load_handler.rb +0 -47
  61. data/lib/isomorfeus/data/handler/collection_load_handler.rb +0 -48
  62. data/lib/isomorfeus/data/handler/graph_load_handler.rb +0 -48
  63. data/lib/isomorfeus/data/handler/hash_load_handler.rb +0 -47
  64. data/lib/lucid_array/base.rb +0 -14
  65. data/lib/lucid_collection/base.rb +0 -14
  66. data/lib/lucid_collection/mixin.rb +0 -241
  67. data/lib/lucid_edge/base.rb +0 -5
  68. data/lib/lucid_edge/mixin.rb +0 -238
  69. data/lib/lucid_graph/base.rb +0 -14
  70. data/lib/lucid_graph/mixin.rb +0 -670
  71. data/lib/lucid_hash/base.rb +0 -14
  72. data/lib/lucid_hash/mixin.rb +0 -168
  73. data/lib/lucid_node/base.rb +0 -5
  74. data/lib/lucid_node/mixin.rb +0 -198
@@ -0,0 +1,570 @@
1
+ module LucidData
2
+ module Array
3
+ module Mixin
4
+ def self.included(base)
5
+ base.include(Enumerable)
6
+ base.extend(LucidPropDeclaration::Mixin)
7
+ base.extend(Isomorfeus::Data::GenericClassApi)
8
+ base.include(Isomorfeus::Data::GenericInstanceApi)
9
+
10
+ base.instance_exec do
11
+ def elements(validate_hash = {})
12
+ @element_conditions = validate_hash
13
+ end
14
+ alias element elements
15
+
16
+ def element_conditions
17
+ @element_conditions
18
+ end
19
+
20
+ def valid_element?(element)
21
+ return true unless @element_conditions
22
+ Isomorfeus::Data::ElementValidator.new(self.name, element, @element_conditions).validate!
23
+ rescue
24
+ false
25
+ end
26
+ end
27
+
28
+ def composition
29
+ @_composition
30
+ end
31
+
32
+ def composition=(c)
33
+ @_composition = c
34
+ end
35
+
36
+ def changed!
37
+ @_composition.changed! if @_composition
38
+ @_changed = true
39
+ end
40
+
41
+ def _validate_element(el)
42
+ Isomorfeus::Data::ElementValidator.new(@class_name, el, @_el_con).validate!
43
+ end
44
+
45
+ if RUBY_ENGINE == 'opal'
46
+ def initialize(key:, revision: nil, elements: nil, composition: nil)
47
+ @key = key.to_s
48
+ @class_name = self.class.name
49
+ @class_name = @class_name.split('>::').last if @class_name.start_with?('#<')
50
+ @_store_path = [:data_state, @class_name, @key, :elements]
51
+ @_revision = revision ? revision : Redux.fetch_by_path(:data_state, @class_name, @key, :revision)
52
+ @_changed_array = nil
53
+ @_composition = composition
54
+ @_changed = false
55
+ @_el_con = self.class.element_conditions
56
+ @_validate_elements = @_el_con ? true : false
57
+ if @_validate_elements && elements
58
+ elements.each { |e| _validate_element(e) }
59
+ end
60
+ raw_array = Redux.fetch_by_path(*@_store_path)
61
+ if `raw_array === null`
62
+ @_changed_array = elements ? elements : []
63
+ elsif raw_array && !elements.nil?
64
+ @_changed_array = elements
65
+ end
66
+ end
67
+
68
+ def _load_from_store!
69
+ @_changed = false
70
+ @_changed_array = nil
71
+ end
72
+
73
+ def _get_array
74
+ return @_changed_array if @_changed_array
75
+ Redux.fetch_by_path(*@_store_path)
76
+ end
77
+
78
+ def changed?
79
+ @_changed || !!@_changed_array
80
+ end
81
+
82
+ def each(&block)
83
+ _get_array.each(&block)
84
+ end
85
+
86
+ def to_transport
87
+ hash = { 'elements' => _get_array }
88
+ hash.merge!('revision' => revision) if revision
89
+ { @class_name => { @key => hash }}
90
+ end
91
+
92
+ # Array methods
93
+ def method_missing(method_name, *args, &block)
94
+ raw_array = _get_array
95
+ raw_array.send(method_name, *args, &block)
96
+ end
97
+
98
+ def <<(element)
99
+ _validate_element(element) if @_validate_elements
100
+ raw_array = _get_array
101
+ result = raw_array << element
102
+ @_changed_array = raw_array
103
+ changed!
104
+ result
105
+ end
106
+
107
+ def [](idx)
108
+ _get_array[idx]
109
+ end
110
+
111
+ def []=(idx, element)
112
+ _validate_element(element) if @_validate_elements
113
+ raw_array = _get_array
114
+ raw_array[idx] = element
115
+ @_changed_array = raw_array
116
+ changed!
117
+ element
118
+ end
119
+
120
+ def clear
121
+ @_changed_array = []
122
+ changed!
123
+ self
124
+ end
125
+
126
+ def collect!(&block)
127
+ raw_array = _get_array
128
+ raw_array.collect!(&block)
129
+ @_changed_array = raw_array
130
+ changed!
131
+ self
132
+ end
133
+
134
+ def compact!
135
+ raw_array = _get_array
136
+ result = raw_array.compact!
137
+ return nil if result.nil?
138
+ @_changed_array = raw_array
139
+ changed!
140
+ self
141
+ end
142
+
143
+ def concat(*args)
144
+ raw_array = _get_array
145
+ raw_array.concat(*args)
146
+ @_changed_array = raw_array
147
+ changed!
148
+ self
149
+ end
150
+
151
+ def delete(element, &block)
152
+ raw_array = _get_array
153
+ result = raw_array.delete(element, &block)
154
+ return nil if result.nil?
155
+ @_changed_array = raw_array
156
+ changed!
157
+ result
158
+ end
159
+
160
+ def delete_at(idx)
161
+ raw_array = _get_array
162
+ result = raw_array.delete_at(idx)
163
+ return nil if result.nil?
164
+ @_changed_array = raw_array
165
+ changed!
166
+ result
167
+ end
168
+
169
+ def delete_if(&block)
170
+ raw_array = _get_array
171
+ raw_array.delete_if(&block)
172
+ @_changed_array = raw_array
173
+ changed!
174
+ self
175
+ end
176
+
177
+ def fill(*args, &block)
178
+ raw_array = _get_array
179
+ raw_array.fill(*args, &block)
180
+ @_changed_array = raw_array
181
+ changed!
182
+ self
183
+ end
184
+
185
+ def filter!(&block)
186
+ raw_array = _get_array
187
+ result = raw_array.filter!(&block)
188
+ return nil if result.nil?
189
+ @_changed_array = raw_array
190
+ changed!
191
+ self
192
+ end
193
+
194
+ def flatten!(level = nil)
195
+ raw_array = _get_array
196
+ result = raw_array.flatten!(level)
197
+ return nil if result.nil?
198
+ @_changed_array = raw_array
199
+ changed!
200
+ self
201
+ end
202
+
203
+ def insert(*args)
204
+ raw_array = _get_array
205
+ raw_array.insert(*args)
206
+ @_changed_array = raw_array
207
+ changed!
208
+ self
209
+ end
210
+
211
+ def keep_if(&block)
212
+ raw_array = _get_array
213
+ raw_array.keep_if(&block)
214
+ @_changed_array = raw_array
215
+ changed!
216
+ self
217
+ end
218
+
219
+ def map!(&block)
220
+ raw_array = _get_array
221
+ raw_array.map!(&block)
222
+ @_changed_array = raw_array
223
+ changed!
224
+ self
225
+ end
226
+
227
+ def pop(n = nil)
228
+ raw_array = _get_array
229
+ result = raw_array.pop(n)
230
+ @_changed_array = raw_array
231
+ changed!
232
+ result
233
+ end
234
+
235
+ def push(*elements)
236
+ if @_validate_elements
237
+ elements.each { |element| _validate_element(element) }
238
+ end
239
+ raw_array = _get_array
240
+ raw_array.push(*elements)
241
+ @_changed_array = raw_array
242
+ changed!
243
+ self
244
+ end
245
+ alias append push
246
+
247
+ def reject!(&block)
248
+ raw_array = _get_array
249
+ result = raw_array.reject!(&block)
250
+ return nil if result.nil?
251
+ @_changed_array = raw_array
252
+ changed!
253
+ self
254
+ end
255
+
256
+ def reverse!
257
+ raw_array = _get_array
258
+ raw_array.reverse!
259
+ @_changed_array = raw_array
260
+ changed!
261
+ self
262
+ end
263
+
264
+ def rotate!(count = 1)
265
+ raw_array = _get_array
266
+ raw_array.rotate!(count)
267
+ @_changed_array = raw_array
268
+ changed!
269
+ self
270
+ end
271
+
272
+ def select!(&block)
273
+ raw_array = _get_array
274
+ result = raw_array.select!(&block)
275
+ return nil if result.nil?
276
+ @_changed_array = raw_array
277
+ changed!
278
+ self
279
+ end
280
+
281
+ def shift(n = nil)
282
+ raw_array = _get_array
283
+ result = raw_array.shift(n)
284
+ @_changed_array = raw_array
285
+ changed!
286
+ result
287
+ end
288
+
289
+ def shuffle!(*args)
290
+ raw_array = _get_array
291
+ raw_array.shuffle!(*args)
292
+ @_changed_array = raw_array
293
+ changed!
294
+ self
295
+ end
296
+
297
+ def slice!(*args)
298
+ raw_array = _get_array
299
+ result = raw_array.slice!(*args)
300
+ @_changed_array = raw_array
301
+ changed!
302
+ result
303
+ end
304
+
305
+ def sort!(&block)
306
+ raw_array = _get_array
307
+ raw_array.sort!(&block)
308
+ @_changed_array = raw_array
309
+ changed!
310
+ self
311
+ end
312
+
313
+ def sort_by!(&block)
314
+ raw_array = _get_array
315
+ raw_array.sort_by!(&block)
316
+ @_changed_array = raw_array
317
+ changed!
318
+ self
319
+ end
320
+
321
+ def uniq!(&block)
322
+ raw_array = _get_array
323
+ raw_array.uniq!(&block)
324
+ @_changed_array = raw_array
325
+ changed!
326
+ self
327
+ end
328
+
329
+ def unshift(*args)
330
+ raw_array = _get_array
331
+ raw_array.unshift(*args)
332
+ @_changed_array = raw_array
333
+ changed!
334
+ self
335
+ end
336
+ alias prepend unshift
337
+ else # RUBY_ENGINE
338
+ unless base == LucidData::Array::Base
339
+ Isomorfeus.add_valid_data_class(base)
340
+ base.prop :pub_sub_client, default: nil
341
+ base.prop :current_user, default: Anonymous.new
342
+ end
343
+
344
+ base.instance_exec do
345
+ def load(key:, pub_sub_client: nil, current_user: nil)
346
+ data = instance_exec(key: key, &@_load_block)
347
+ revision = nil
348
+ revision = data.delete(:revision) if data.key?(:revision)
349
+ elements = data.delete(:elements)
350
+ self.new(key: key, revision: revision, elements: elements)
351
+ end
352
+ end
353
+
354
+ def initialize(key:, revision: nil, elements: nil, composition: nil)
355
+ @key = key.to_s
356
+ @class_name = self.class.name
357
+ @class_name = @class_name.split('>::').last if @class_name.start_with?('#<')
358
+ @_revision = revision
359
+ @_changed = false
360
+ @_composition = composition
361
+ @_el_con = self.class.element_conditions
362
+ @_validate_elements = @_el_con ? true : false
363
+ elements = [] unless elements
364
+ if @_validate_elements
365
+ elements.each { |e| _validate_element(e) }
366
+ end
367
+ @_raw_array = elements
368
+ end
369
+
370
+ def changed?
371
+ @_changed
372
+ end
373
+
374
+ def each(&block)
375
+ @_raw_array.each(&block)
376
+ end
377
+
378
+ def to_transport
379
+ hash = { 'elements' => @_raw_array }
380
+ hash.merge!('revision' => revision) if revision
381
+ { @class_name => { @key => hash }}
382
+ end
383
+
384
+ # Array methods
385
+ def method_missing(method_name, *args, &block)
386
+ @_raw_array.send(method_name, *args, &block)
387
+ end
388
+
389
+ def <<(element)
390
+ _validate_element(element) if @_validate_elements
391
+ changed!
392
+ @_raw_array << element
393
+ end
394
+
395
+ def []=(idx, element)
396
+ _validate_element(element) if @_validate_elements
397
+ changed!
398
+ @_raw_array[idx] = element
399
+ end
400
+
401
+ def clear
402
+ @_raw_array = []
403
+ self
404
+ end
405
+
406
+ def collect!(&block)
407
+ changed!
408
+ @_raw_array.collect!(&block)
409
+ self
410
+ end
411
+
412
+ def compact!
413
+ result = @_raw_array.compact!
414
+ return nil if result.nil?
415
+ changed!
416
+ self
417
+ end
418
+
419
+ def concat(*args)
420
+ changed!
421
+ @_raw_array.concat(*args)
422
+ self
423
+ end
424
+
425
+ def delete(element, &block)
426
+ result = @_raw_array.delete(element, &block)
427
+ changed!
428
+ result
429
+ end
430
+
431
+ def delete_at(idx)
432
+ result = @_raw_array.delete_at(idx)
433
+ return nil if result.nil?
434
+ changed!
435
+ result
436
+ end
437
+
438
+ def delete_if(&block)
439
+ @_raw_array.delete_if(&block)
440
+ changed!
441
+ self
442
+ end
443
+
444
+ def fill(*args, &block)
445
+ @_raw_array.fill(*args, &block)
446
+ changed!
447
+ self
448
+ end
449
+
450
+ def filter!(&block)
451
+ result = @_raw_array.filter!(&block)
452
+ return nil if result.nil?
453
+ changed!
454
+ self
455
+ end
456
+
457
+ def flatten!(level = nil)
458
+ result = @_raw_array.flatten!(level)
459
+ return nil if result.nil?
460
+ changed!
461
+ self
462
+ end
463
+
464
+ def insert(*args)
465
+ @_raw_array.insert(*args)
466
+ changed!
467
+ self
468
+ end
469
+
470
+ def keep_if(&block)
471
+ @_raw_array.keep_if(&block)
472
+ changed!
473
+ self
474
+ end
475
+
476
+ def map!(&block)
477
+ @_raw_array.map!(&block)
478
+ changed!
479
+ self
480
+ end
481
+
482
+ def pop(n = nil)
483
+ result = @_raw_array.pop(n)
484
+ changed!
485
+ result
486
+ end
487
+
488
+ def push(*elements)
489
+ if @_validate_elements
490
+ elements.each { |element| _validate_element(element) }
491
+ end
492
+ @_raw_array.push(*elements)
493
+ changed!
494
+ self
495
+ end
496
+ alias append push
497
+
498
+ def reject!(&block)
499
+ result = @_raw_array.reject!(&block)
500
+ return nil if result.nil?
501
+ changed!
502
+ self
503
+ end
504
+
505
+ def reverse!
506
+ @_raw_array.reverse!
507
+ changed!
508
+ self
509
+ end
510
+
511
+ def rotate!(count = 1)
512
+ @_raw_array.rotate!(count)
513
+ changed!
514
+ self
515
+ end
516
+
517
+ def select!(&block)
518
+ result = @_raw_array.select!(&block)
519
+ return nil if result.nil?
520
+ changed!
521
+ self
522
+ end
523
+
524
+ def shift(n = nil)
525
+ result = @_raw_array.shift(n)
526
+ changed!
527
+ result
528
+ end
529
+
530
+ def shuffle!(*args)
531
+ @_raw_array.shuffle!(*args)
532
+ changed!
533
+ self
534
+ end
535
+
536
+ def slice!(*argsk)
537
+ result = @_raw_array.slice!(*args)
538
+ changed!
539
+ result
540
+ end
541
+
542
+ def sort!(&block)
543
+ @_raw_array.sort!(&block)
544
+ changed!
545
+ self
546
+ end
547
+
548
+ def sort_by!(&block)
549
+ @_raw_array.sort_by!(&block)
550
+ changed!
551
+ self
552
+ end
553
+
554
+ def uniq!(&block)
555
+ @_raw_array.uniq!(&block)
556
+ changed!
557
+ self
558
+ end
559
+
560
+ def unshift(*args)
561
+ @_raw_array.unshift(*args)
562
+ changed!
563
+ self
564
+ end
565
+ alias prepend unshift
566
+ end # RUBY_ENGINE
567
+ end
568
+ end
569
+ end
570
+ end
@@ -0,0 +1,15 @@
1
+ module LucidData
2
+ module Collection
3
+ class Base
4
+ include LucidData::Collection::Mixin
5
+
6
+ if RUBY_ENGINE != 'opal'
7
+ def self.inherited(base)
8
+ Isomorfeus.add_valid_data_class(base)
9
+ base.prop :pub_sub_client, default: nil
10
+ base.prop :current_user, default: Anonymous.new
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,83 @@
1
+ module LucidData
2
+ module Collection
3
+ module Finders
4
+ def find(attribute_hash = nil, &block)
5
+ if block_given?
6
+ nodes.each do |node|
7
+ return node if block.call(node)
8
+ end
9
+ else
10
+ node_class = attribute_hash.delete(:class)
11
+ is_a_module = attribute_hash.delete(:is_a)
12
+ nodes.each do |node|
13
+ if node_class
14
+ next unless node.class == node_class
15
+ end
16
+ if is_a_module
17
+ next unless node.is_a?(is_a_module)
18
+ end
19
+ found = true
20
+ attribute_hash.each do |k,v|
21
+ found &&= (node[k] == v)
22
+ break unless found
23
+ end
24
+ return node if found
25
+ end
26
+ end
27
+ nil
28
+ end
29
+
30
+ def find_all(attribute_hash = nil, &block)
31
+ found_nodes = []
32
+ if block_given?
33
+ nodes.each do |node|
34
+ found_nodes << node if block.call(node)
35
+ end
36
+ else
37
+ node_class = attribute_hash.delete(:class)
38
+ is_a_module = attribute_hash.delete(:is_a)
39
+ nodes.each do |node|
40
+ if node_class
41
+ next unless node.class == node_class
42
+ end
43
+ if is_a_module
44
+ next unless node.is_a?(is_a_module)
45
+ end
46
+ found = true
47
+ attribute_hash.each do |k,v|
48
+ found &&= (node[k] == v)
49
+ break unless found
50
+ end
51
+ found_nodes << node if found
52
+ end
53
+ end
54
+ found_nodes
55
+ end
56
+
57
+ def find_by_key(node_key)
58
+ nodes.each do |node|
59
+ return node if node.key == node_key
60
+ end
61
+ nil
62
+ end
63
+
64
+ if RUBY_ENGINE == 'opal'
65
+ def find_by_sid(node)
66
+ node_sid = node.respond_to?(:to_sid) ? node.to_sid : node
67
+ nodes_as_sids.each do |sid|
68
+ return Isomorfeus.instance_from_sid(node_sid) if sid == node_sid
69
+ end
70
+ nil
71
+ end
72
+ else
73
+ def find_by_sid(node)
74
+ node_sid = node.respond_to?(:to_sid) ? node.to_sid : node
75
+ nodes.each do |node|
76
+ return node if node.to_sid == node_sid
77
+ end
78
+ nil
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end