isomorfeus-data 1.0.0.delta11
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.
- checksums.yaml +7 -0
- data/LICENSE +21 -0
- data/README.md +3 -0
- data/lib/isomorfeus/data/config.rb +116 -0
- data/lib/isomorfeus/data/core_ext/hash/deep_merge.rb +35 -0
- data/lib/isomorfeus/data/handler/array_load_handler.rb +41 -0
- data/lib/isomorfeus/data/handler/collection_load_handler.rb +42 -0
- data/lib/isomorfeus/data/handler/graph_load_handler.rb +42 -0
- data/lib/isomorfeus/data/handler/hash_load_handler.rb +41 -0
- data/lib/isomorfeus/data/prop_declaration.rb +58 -0
- data/lib/isomorfeus/data/props.rb +96 -0
- data/lib/isomorfeus/data/reducer.rb +30 -0
- data/lib/isomorfeus/data/version.rb +5 -0
- data/lib/isomorfeus-data.rb +48 -0
- data/lib/lucid_array/base.rb +15 -0
- data/lib/lucid_array/mixin.rb +163 -0
- data/lib/lucid_collection/base.rb +15 -0
- data/lib/lucid_collection/mixin.rb +241 -0
- data/lib/lucid_edge/base.rb +5 -0
- data/lib/lucid_edge/mixin.rb +243 -0
- data/lib/lucid_graph/base.rb +15 -0
- data/lib/lucid_graph/mixin.rb +672 -0
- data/lib/lucid_hash/base.rb +15 -0
- data/lib/lucid_hash/mixin.rb +169 -0
- data/lib/lucid_node/base.rb +5 -0
- data/lib/lucid_node/mixin.rb +201 -0
- metadata +180 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: c88289965bb31facfa65c47f0765ce3666ceb4037396dfad2cc7f186b26015cc
|
4
|
+
data.tar.gz: 4324025cab83a20528a5cc1003111cb6315cb4332998bde4acdedbeea3d18a9a
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 37f57249d5a9605b4beb5ff9d84e5959636ccb33f64a643f7c5ba56b7e2b8392f8778a61c949e3fd5f34e25691e58e68f76d1966cf8660a398a511d965d58b74
|
7
|
+
data.tar.gz: 3cb3de2349ab663682381cabd57a70f29819efb2ef7760fc0d5bb9ce065a7eb83f1b652ff9fff5f0d5abf1b82b962813520612e58b67675a9366e178e0ebf198
|
data/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
MIT License
|
2
|
+
|
3
|
+
Copyright (c) 2019 Jan Biedermann
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,116 @@
|
|
1
|
+
module Isomorfeus
|
2
|
+
# available settings
|
3
|
+
class << self
|
4
|
+
def cached_array_classes
|
5
|
+
@cached_array_classes ||= {}
|
6
|
+
end
|
7
|
+
|
8
|
+
def cached_array_class(class_name)
|
9
|
+
return cached_array_classes[class_name] if cached_array_classes.key?(class_name)
|
10
|
+
cached_array_classes[class_name] = "::#{class_name}".constantize
|
11
|
+
end
|
12
|
+
|
13
|
+
def cached_collection_classes
|
14
|
+
@cached_collection_classes ||= {}
|
15
|
+
end
|
16
|
+
|
17
|
+
def cached_collection_class(class_name)
|
18
|
+
return cached_collection_classes[class_name] if cached_collection_classes.key?(class_name)
|
19
|
+
cached_collection_classes[class_name] = "::#{class_name}".constantize
|
20
|
+
end
|
21
|
+
|
22
|
+
def cached_edge_classes
|
23
|
+
@cached_edge_classes ||= {}
|
24
|
+
end
|
25
|
+
|
26
|
+
def cached_edge_class(class_name)
|
27
|
+
return cached_edge_classes[class_name] if cached_edge_classes.key?(class_name)
|
28
|
+
cached_edge_classes[class_name] = "::#{class_name}".constantize
|
29
|
+
end
|
30
|
+
|
31
|
+
def cached_graph_classes
|
32
|
+
@cached_graph_classes ||= {}
|
33
|
+
end
|
34
|
+
|
35
|
+
def cached_graph_class(class_name)
|
36
|
+
return cached_graph_classes[class_name] if cached_graph_classes.key?(class_name)
|
37
|
+
cached_graph_classes[class_name] = "::#{class_name}".constantize
|
38
|
+
end
|
39
|
+
|
40
|
+
def cached_hash_classes
|
41
|
+
@cached_hash_classes ||= {}
|
42
|
+
end
|
43
|
+
|
44
|
+
def cached_hash_class(class_name)
|
45
|
+
return cached_hash_classes[class_name] if cached_hash_classes.key?(class_name)
|
46
|
+
cached_hash_classes[class_name] = "::#{class_name}".constantize
|
47
|
+
end
|
48
|
+
|
49
|
+
def cached_node_classes
|
50
|
+
@cached_node_classes ||= {}
|
51
|
+
end
|
52
|
+
|
53
|
+
def cached_node_class(class_name)
|
54
|
+
return cached_node_classes[class_name] if cached_node_classes.key?(class_name)
|
55
|
+
cached_node_classes[class_name] = "::#{class_name}".constantize
|
56
|
+
end
|
57
|
+
|
58
|
+
if RUBY_ENGINE != 'opal'
|
59
|
+
def valid_array_class_names
|
60
|
+
@valid_array_class_names ||= Set.new
|
61
|
+
end
|
62
|
+
|
63
|
+
def valid_array_class_name?(class_name)
|
64
|
+
valid_array_class_names.include?(class_name)
|
65
|
+
end
|
66
|
+
|
67
|
+
def add_valid_array_class(klass)
|
68
|
+
class_name = klass.name
|
69
|
+
class_name = class_name.split('>::').last if class_name.start_with?('#<')
|
70
|
+
valid_array_class_names << class_name
|
71
|
+
end
|
72
|
+
|
73
|
+
def valid_collection_class_names
|
74
|
+
@valid_collection_class_names ||= Set.new
|
75
|
+
end
|
76
|
+
|
77
|
+
def valid_collection_class_name?(class_name)
|
78
|
+
valid_collection_class_names.include?(class_name)
|
79
|
+
end
|
80
|
+
|
81
|
+
def add_valid_collection_class(klass)
|
82
|
+
class_name = klass.name
|
83
|
+
class_name = class_name.split('>::').last if class_name.start_with?('#<')
|
84
|
+
valid_collection_class_names << class_name
|
85
|
+
end
|
86
|
+
|
87
|
+
def valid_graph_class_names
|
88
|
+
@valid_graph_class_names ||= Set.new
|
89
|
+
end
|
90
|
+
|
91
|
+
def valid_graph_class_name?(class_name)
|
92
|
+
valid_graph_class_names.include?(class_name)
|
93
|
+
end
|
94
|
+
|
95
|
+
def add_valid_graph_class(klass)
|
96
|
+
class_name = klass.name
|
97
|
+
class_name = class_name.split('>::').last if class_name.start_with?('#<')
|
98
|
+
valid_graph_class_names << class_name
|
99
|
+
end
|
100
|
+
|
101
|
+
def valid_hash_class_names
|
102
|
+
@valid_hash_class_names ||= Set.new
|
103
|
+
end
|
104
|
+
|
105
|
+
def valid_hash_class_name?(class_name)
|
106
|
+
valid_hash_class_names.include?(class_name)
|
107
|
+
end
|
108
|
+
|
109
|
+
def add_valid_hash_class(klass)
|
110
|
+
class_name = klass.name
|
111
|
+
class_name = class_name.split('>::').last if class_name.start_with?('#<')
|
112
|
+
valid_hash_class_names << class_name
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# taken from: https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/hash/deep_merge.rb
|
3
|
+
|
4
|
+
class Hash
|
5
|
+
# Returns a new hash with +self+ and +other_hash+ merged recursively.
|
6
|
+
#
|
7
|
+
# h1 = { a: true, b: { c: [1, 2, 3] } }
|
8
|
+
# h2 = { a: false, b: { x: [3, 4, 5] } }
|
9
|
+
#
|
10
|
+
# h1.deep_merge(h2) # => { a: false, b: { c: [1, 2, 3], x: [3, 4, 5] } }
|
11
|
+
#
|
12
|
+
# Like with Hash#merge in the standard library, a block can be provided
|
13
|
+
# to merge values:
|
14
|
+
#
|
15
|
+
# h1 = { a: 100, b: 200, c: { c1: 100 } }
|
16
|
+
# h2 = { b: 250, c: { c1: 200 } }
|
17
|
+
# h1.deep_merge(h2) { |key, this_val, other_val| this_val + other_val }
|
18
|
+
# # => { a: 100, b: 450, c: { c1: 300 } }
|
19
|
+
def deep_merge(other_hash, &block)
|
20
|
+
dup.deep_merge!(other_hash, &block)
|
21
|
+
end
|
22
|
+
|
23
|
+
# Same as +deep_merge+, but modifies +self+.
|
24
|
+
def deep_merge!(other_hash, &block)
|
25
|
+
merge!(other_hash) do |key, this_val, other_val|
|
26
|
+
if this_val.is_a?(Hash) && other_val.is_a?(Hash)
|
27
|
+
this_val.deep_merge(other_val, &block)
|
28
|
+
elsif block_given?
|
29
|
+
block.call(key, this_val, other_val)
|
30
|
+
else
|
31
|
+
other_val
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Isomorfeus
|
2
|
+
module Data
|
3
|
+
module Handler
|
4
|
+
class ArrayLoadHandler < LucidHandler::Base
|
5
|
+
on_request do |pub_sub_client, session_id, current_user, request, response|
|
6
|
+
result = { error: 'No such thing' }
|
7
|
+
# promise_send_path('Isomorfeus::Data::Handler::CollectionLoadHandler', self.to_s, props_hash)
|
8
|
+
request.each_key do |array_class_name|
|
9
|
+
if Isomorfeus.valid_array_class_name?(array_class_name)
|
10
|
+
array_class = Isomorfeus.cached_array_class(array_class_name)
|
11
|
+
if array_class
|
12
|
+
props_json = request[array_class_name]
|
13
|
+
begin
|
14
|
+
props = Oj.load(props_json, mode: :strict)
|
15
|
+
props.merge!({pub_sub_client: pub_sub_client, session_id: session_id, current_user: current_user})
|
16
|
+
array = array_class.load(props)
|
17
|
+
array.instance_exec do
|
18
|
+
array_class.on_load_block.call(pub_sub_client, session_id, current_user) if array_class.on_load_block
|
19
|
+
end
|
20
|
+
response.deep_merge!(data: array.to_transport)
|
21
|
+
result = { success: 'ok' }
|
22
|
+
rescue Exception => e
|
23
|
+
result = if Isomorfeus.production?
|
24
|
+
{ error: { array_class_name => 'No such thing!' }}
|
25
|
+
else
|
26
|
+
{ error: { array_class_name => "Isomorfeus::Data::Handler::ArrayLoadHandler: #{e.message}" }}
|
27
|
+
end
|
28
|
+
end
|
29
|
+
else
|
30
|
+
result = { error: { array_class_name => 'No such thing!' }}
|
31
|
+
end
|
32
|
+
else
|
33
|
+
result = { error: { array_class_name => 'No such thing!' }}
|
34
|
+
end
|
35
|
+
end
|
36
|
+
result
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module Isomorfeus
|
2
|
+
module Data
|
3
|
+
module Handler
|
4
|
+
class CollectionLoadHandler < LucidHandler::Base
|
5
|
+
on_request do |pub_sub_client, session_id, current_user, request, response|
|
6
|
+
result = { error: 'No such thing' }
|
7
|
+
# promise_send_path('Isomorfeus::Data::Handler::CollectionLoadHandler', self.to_s, props_hash)
|
8
|
+
request.each_key do |collection_class_name|
|
9
|
+
if Isomorfeus.valid_collection_class_name?(collection_class_name)
|
10
|
+
collection_class = Isomorfeus.cached_collection_class(collection_class_name)
|
11
|
+
if collection_class
|
12
|
+
props_json = request[collection_class_name]
|
13
|
+
begin
|
14
|
+
props = Oj.load(props_json, mode: :strict)
|
15
|
+
props.merge!({pub_sub_client: pub_sub_client, session_id: session_id, current_user: current_user})
|
16
|
+
collection = collection_class.load(props)
|
17
|
+
collection.instance_exec do
|
18
|
+
collection_class.on_load_block.call(pub_sub_client, session_id, current_user) if collection_class.on_load_block
|
19
|
+
end
|
20
|
+
response.deep_merge!(data: collection.to_transport)
|
21
|
+
response.deep_merge!(data: collection.included_items_to_transport)
|
22
|
+
result = { success: 'ok' }
|
23
|
+
rescue Exception => e
|
24
|
+
result = if Isomorfeus.production?
|
25
|
+
{ error: { collection_class_name => 'No such thing!' }}
|
26
|
+
else
|
27
|
+
{ error: { collection_class_name => "Isomorfeus::Data::Handler::CollectionLoadHandler: #{e.message}" }}
|
28
|
+
end
|
29
|
+
end
|
30
|
+
else
|
31
|
+
result = { error: { collection_class_name => 'No such thing!' }}
|
32
|
+
end
|
33
|
+
else
|
34
|
+
result = { error: { collection_class_name => 'No such thing!' }}
|
35
|
+
end
|
36
|
+
end
|
37
|
+
result
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module Isomorfeus
|
2
|
+
module Data
|
3
|
+
module Handler
|
4
|
+
class GraphLoadHandler < LucidHandler::Base
|
5
|
+
on_request do |pub_sub_client, session_id, current_user, request, response|
|
6
|
+
result = { error: 'No such thing' }
|
7
|
+
# promise_send_path('Isomorfeus::Data::Handler::GraphLoadHandler', self.to_s, props_hash)
|
8
|
+
request.each_key do |graph_class_name|
|
9
|
+
if Isomorfeus.valid_graph_class_name?(graph_class_name)
|
10
|
+
graph_class = Isomorfeus.cached_graph_class(graph_class_name)
|
11
|
+
if graph_class
|
12
|
+
props_json = request[graph_class_name]
|
13
|
+
begin
|
14
|
+
props = Oj.load(props_json, mode: :strict)
|
15
|
+
props.merge!({pub_sub_client: pub_sub_client, session_id: session_id, current_user: current_user})
|
16
|
+
graph = graph_class.load(props)
|
17
|
+
graph.instance_exec do
|
18
|
+
graph_class.on_load_block.call(pub_sub_client, session_id, current_user) if graph_class.on_load_block
|
19
|
+
end
|
20
|
+
response.deep_merge!(data: graph.to_transport)
|
21
|
+
response.deep_merge!(data: graph.included_items_to_transport)
|
22
|
+
result = { success: 'ok' }
|
23
|
+
rescue Exception => e
|
24
|
+
result = if Isomorfeus.production?
|
25
|
+
{ error: { graph_class_name => 'No such thing!' }}
|
26
|
+
else
|
27
|
+
{ error: { graph_class_name => "Isomorfeus::Data::Handler::GraphLoadHandler: #{e.message}" }}
|
28
|
+
end
|
29
|
+
end
|
30
|
+
else
|
31
|
+
result = { error: { graph_class_name => 'No such thing!' }}
|
32
|
+
end
|
33
|
+
else
|
34
|
+
result = { error: { graph_class_name => 'No such thing!' }}
|
35
|
+
end
|
36
|
+
end
|
37
|
+
result
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Isomorfeus
|
2
|
+
module Data
|
3
|
+
module Handler
|
4
|
+
class HashLoadHandler < LucidHandler::Base
|
5
|
+
on_request do |pub_sub_client, session_id, current_user, request, response|
|
6
|
+
result = { error: 'No such thing' }
|
7
|
+
# promise_send_path('Isomorfeus::Data::Handler::HashLoadHandler', self.to_s, props_hash)
|
8
|
+
request.each_key do |hash_class_name|
|
9
|
+
if Isomorfeus.valid_hash_class_name?(hash_class_name)
|
10
|
+
hash_class = Isomorfeus.cached_hash_class(hash_class_name)
|
11
|
+
if hash_class
|
12
|
+
props_json = request[hash_class_name]
|
13
|
+
begin
|
14
|
+
props = Oj.load(props_json, mode: :strict)
|
15
|
+
props.merge!({pub_sub_client: pub_sub_client, session_id: session_id, current_user: current_user})
|
16
|
+
hash = hash_class.load(props)
|
17
|
+
hash.instance_exec do
|
18
|
+
hash_class.on_load_block.call(pub_sub_client, session_id, current_user) if hash_class.on_load_block
|
19
|
+
end
|
20
|
+
response.deep_merge!(data: hash.to_transport)
|
21
|
+
result = { success: 'ok' }
|
22
|
+
rescue Exception => e
|
23
|
+
result = if Isomorfeus.production?
|
24
|
+
{ error: { hash_class_name => 'No such thing!' }}
|
25
|
+
else
|
26
|
+
{ error: { hash_class_name => "Isomorfeus::Data::Handler::HashLoadHandler: #{e.message}" }}
|
27
|
+
end
|
28
|
+
end
|
29
|
+
else
|
30
|
+
result = { error: { hash_class_name => 'No such thing!' }}
|
31
|
+
end
|
32
|
+
else
|
33
|
+
result = { error: { hash_class_name => 'No such thing!' }}
|
34
|
+
end
|
35
|
+
end
|
36
|
+
result
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module Isomorfeus
|
2
|
+
module Data
|
3
|
+
module PropDeclaration
|
4
|
+
# props, very similar to Components:
|
5
|
+
# prop :text, class: String # a required prop of class String, class must match exactly
|
6
|
+
# prop :other, is_a: Enumerable # a required prop, which can be a Array for example, but at least must be a Enumerable
|
7
|
+
# prop :cool, default: 'yet some more text' # a optional prop with a default value
|
8
|
+
# prop :even_cooler, class: String, required: false
|
9
|
+
def prop(prop_name, options_hash = {})
|
10
|
+
declared_props[prop_name.to_sym] = options_hash
|
11
|
+
end
|
12
|
+
|
13
|
+
def declared_props
|
14
|
+
@declared_props ||= {}
|
15
|
+
end
|
16
|
+
|
17
|
+
def validate_props(props_hash)
|
18
|
+
p = declared_props
|
19
|
+
|
20
|
+
props = Isomorfeus::Data::Props.new(props_hash)
|
21
|
+
|
22
|
+
raise "#{self}: Wrong or to many props given!" if (props.keys - p.keys).size > 0
|
23
|
+
|
24
|
+
# validation
|
25
|
+
p.each_key do |key|
|
26
|
+
# determine if prop is required
|
27
|
+
required = if p[key].key?(:required)
|
28
|
+
p[key][:required]
|
29
|
+
elsif p[key].key?(:default)
|
30
|
+
false
|
31
|
+
else
|
32
|
+
true
|
33
|
+
end
|
34
|
+
|
35
|
+
# assign value
|
36
|
+
value = if props.key?(key)
|
37
|
+
props[key]
|
38
|
+
elsif p[key].key?(:default)
|
39
|
+
props_hash[key] = p[key][:default].dup
|
40
|
+
else
|
41
|
+
raise "#{self}: Required prop not given: #{key}!" if required
|
42
|
+
nil
|
43
|
+
end
|
44
|
+
|
45
|
+
# check if passed value is of correct type
|
46
|
+
if props_hash.key?(key)
|
47
|
+
if p[key].key?(:class) && value.class != (p[key][:class])
|
48
|
+
raise "#{self}: #{key} value is not of class #{p[key][:class]} but instead a #{value.class}!"
|
49
|
+
end
|
50
|
+
if p[key].key?(:is_a) && !value.is_a?(p[key][:is_a])
|
51
|
+
raise "#{self}: #{key} value is not a #{p[key][:is_a]}!"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
module Isomorfeus
|
2
|
+
module Data
|
3
|
+
class Props
|
4
|
+
def initialize(props_hash)
|
5
|
+
props_hash = {} unless props_hash
|
6
|
+
@props_hash = props_hash
|
7
|
+
end
|
8
|
+
|
9
|
+
def any?
|
10
|
+
@props_hash.keys.size > 0
|
11
|
+
end
|
12
|
+
|
13
|
+
if RUBY_ENGINE == 'opal'
|
14
|
+
def [](prop_name)
|
15
|
+
@props_hash[prop_name]
|
16
|
+
end
|
17
|
+
|
18
|
+
def []=(prop_name, value)
|
19
|
+
@props_hash[prop_name] = value
|
20
|
+
end
|
21
|
+
|
22
|
+
def key?(prop_name)
|
23
|
+
@props_hash.key?(prop_name)
|
24
|
+
end
|
25
|
+
|
26
|
+
def keys
|
27
|
+
@props_hash.keys
|
28
|
+
end
|
29
|
+
|
30
|
+
def method_missing(prop_name, *args, &block)
|
31
|
+
return @props_hash[prop_name] if @props_hash.key?(prop_name)
|
32
|
+
super(prop_name, *args, &block)
|
33
|
+
end
|
34
|
+
|
35
|
+
def set(prop_name, value)
|
36
|
+
@props_hash[prop_name] = value
|
37
|
+
end
|
38
|
+
|
39
|
+
def to_json
|
40
|
+
JSON.dump(to_transport)
|
41
|
+
end
|
42
|
+
|
43
|
+
def to_transport
|
44
|
+
transport_hash = {}.merge(@props_hash)
|
45
|
+
transport_hash
|
46
|
+
end
|
47
|
+
else # RUBY_ENGINE
|
48
|
+
def [](prop_name)
|
49
|
+
name = prop_name.to_sym
|
50
|
+
return @props_hash[name] if @props_hash.key?(name)
|
51
|
+
name = prop_name.to_s
|
52
|
+
return @props_hash[name] if @props_hash.key?(name)
|
53
|
+
nil
|
54
|
+
end
|
55
|
+
|
56
|
+
def []=(prop_name, value)
|
57
|
+
@props_hash[prop_name.to_sym] = value
|
58
|
+
end
|
59
|
+
|
60
|
+
def key?(prop_name)
|
61
|
+
@props_hash.key?(prop_name.to_sym) || @props_hash.key?(prop_name.to_s)
|
62
|
+
end
|
63
|
+
|
64
|
+
def keys
|
65
|
+
@props_hash.keys.map(&:to_sym)
|
66
|
+
end
|
67
|
+
|
68
|
+
def method_missing(prop_name, *args, &block)
|
69
|
+
name = prop_name.to_sym
|
70
|
+
return @props_hash[name] if @props_hash.key?(name)
|
71
|
+
name = prop_name.to_s
|
72
|
+
return @props_hash[name] if @props_hash.key?(name)
|
73
|
+
super(prop_name, *args, &block)
|
74
|
+
end
|
75
|
+
|
76
|
+
def set(prop_name, value)
|
77
|
+
@props_hash[prop_name.to_sym] = value
|
78
|
+
end
|
79
|
+
|
80
|
+
def to_json
|
81
|
+
Oj.dump(to_transport, mode: :strict)
|
82
|
+
end
|
83
|
+
|
84
|
+
def to_transport
|
85
|
+
transport_hash = {}.merge(@props_hash)
|
86
|
+
transport_hash.delete(:pub_sub_client)
|
87
|
+
transport_hash.delete(:session_id)
|
88
|
+
transport_hash.delete(:current_user)
|
89
|
+
transport_hash
|
90
|
+
end
|
91
|
+
end # RUBY_ENGINE
|
92
|
+
|
93
|
+
alias_method :has_key?, :key?
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Isomorfeus
|
2
|
+
module Data
|
3
|
+
module Reducer
|
4
|
+
def self.add_reducer_to_store
|
5
|
+
data_reducer = Redux.create_reducer do |prev_state, action|
|
6
|
+
action_type = action[:type]
|
7
|
+
if action_type.JS.startsWith('DATA_')
|
8
|
+
case action_type
|
9
|
+
when 'DATA_STATE'
|
10
|
+
if action.key?(:set_state)
|
11
|
+
action[:set_state]
|
12
|
+
else
|
13
|
+
prev_state
|
14
|
+
end
|
15
|
+
when 'DATA_LOAD'
|
16
|
+
prev_state.deep_merge(action[:data])
|
17
|
+
else
|
18
|
+
prev_state
|
19
|
+
end
|
20
|
+
else
|
21
|
+
prev_state
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
Redux::Store.preloaded_state_merge!(data_state: {})
|
26
|
+
Redux::Store.add_reducer(data_state: data_reducer)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'opal'
|
2
|
+
require 'opal-autoloader'
|
3
|
+
require 'opal-activesupport'
|
4
|
+
require 'isomorfeus-redux'
|
5
|
+
require 'isomorfeus-transport'
|
6
|
+
|
7
|
+
require 'isomorfeus/data/config'
|
8
|
+
require 'isomorfeus/data/props'
|
9
|
+
require 'isomorfeus/data/prop_declaration'
|
10
|
+
require 'lucid_node/mixin'
|
11
|
+
require 'lucid_node/base'
|
12
|
+
require 'lucid_edge/mixin'
|
13
|
+
require 'lucid_edge/base'
|
14
|
+
require 'lucid_array/mixin'
|
15
|
+
require 'lucid_array/base'
|
16
|
+
require 'lucid_collection/mixin'
|
17
|
+
require 'lucid_collection/base'
|
18
|
+
require 'lucid_graph/mixin'
|
19
|
+
require 'lucid_graph/base'
|
20
|
+
require 'lucid_hash/mixin'
|
21
|
+
require 'lucid_hash/base'
|
22
|
+
|
23
|
+
if RUBY_ENGINE == 'opal'
|
24
|
+
require 'isomorfeus/data/core_ext/hash/deep_merge'
|
25
|
+
require 'isomorfeus/data/reducer'
|
26
|
+
Isomorfeus::Data::Reducer.add_reducer_to_store
|
27
|
+
Opal::Autoloader.add_load_path('data')
|
28
|
+
else
|
29
|
+
require 'oj'
|
30
|
+
require 'active_support'
|
31
|
+
require 'active_support/core_ext/hash'
|
32
|
+
require 'isomorfeus/data/handler/array_load_handler'
|
33
|
+
require 'isomorfeus/data/handler/collection_load_handler'
|
34
|
+
require 'isomorfeus/data/handler/graph_load_handler'
|
35
|
+
require 'isomorfeus/data/handler/hash_load_handler'
|
36
|
+
|
37
|
+
Opal.append_path(__dir__.untaint) unless Opal.paths.include?(__dir__.untaint)
|
38
|
+
|
39
|
+
require 'active_support/dependencies'
|
40
|
+
|
41
|
+
path = File.expand_path(File.join('isomorfeus', 'data'))
|
42
|
+
|
43
|
+
ActiveSupport::Dependencies.autoload_paths << path
|
44
|
+
# we also need to require them all, so classes are registered accordingly
|
45
|
+
Dir.glob("#{path}/**/*.rb").each do |file|
|
46
|
+
require file
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module LucidArray
|
2
|
+
class Base
|
3
|
+
include LucidArray::Mixin
|
4
|
+
|
5
|
+
if RUBY_ENGINE != 'opal'
|
6
|
+
def self.inherited(base)
|
7
|
+
Isomorfeus.add_valid_array_class(base)
|
8
|
+
|
9
|
+
base.prop :pub_sub_client, default: nil
|
10
|
+
base.prop :session_id, default: nil
|
11
|
+
base.prop :current_user, default: nil
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|