isomorfeus-data 2.5.5 → 22.9.0.rc1
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 +4 -4
- data/lib/isomorfeus/data/config.rb +8 -25
- data/lib/isomorfeus/data/enhancer.rb +291 -0
- data/lib/isomorfeus/data/file_accelerator.rb +95 -0
- data/lib/isomorfeus/data/object_accelerator.rb +82 -90
- data/lib/isomorfeus/data/rack_middleware.rb +73 -0
- data/lib/isomorfeus/data/reducer.rb +47 -17
- data/lib/isomorfeus/data/sid.rb +34 -0
- data/lib/isomorfeus/data/version.rb +1 -1
- data/lib/isomorfeus-data.rb +27 -32
- data/lib/lucid_data_generic.rb +163 -0
- data/lib/lucid_file.rb +137 -0
- data/lib/lucid_object.rb +431 -0
- metadata +51 -47
- data/lib/data_uri/open_uri.rb +0 -22
- data/lib/data_uri/uri.rb +0 -61
- data/lib/data_uri.rb +0 -4
- data/lib/isomorfeus/data/field_support.rb +0 -269
- data/lib/isomorfeus/data/generic_class_api.rb +0 -127
- data/lib/isomorfeus/data/generic_instance_api.rb +0 -171
- data/lib/isomorfeus/data/handler/generic.rb +0 -133
- data/lib/isomorfeus_data/lucid_file/base.rb +0 -10
- data/lib/isomorfeus_data/lucid_file/mixin.rb +0 -281
- data/lib/isomorfeus_data/lucid_object/base.rb +0 -10
- data/lib/isomorfeus_data/lucid_object/mixin.rb +0 -250
- data/lib/isomorfeus_data/lucid_query/base.rb +0 -10
- data/lib/isomorfeus_data/lucid_query/mixin.rb +0 -112
- data/lib/isomorfeus_data/lucid_query_result.rb +0 -113
- data/opal/iso_uri.rb +0 -29
- data/opal/uri/common.rb +0 -18
- data/opal/uri/generic.rb +0 -47
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
module Isomorfeus
|
|
2
|
-
module Data
|
|
3
|
-
module GenericClassApi
|
|
4
|
-
if RUBY_ENGINE == 'opal'
|
|
5
|
-
def destroy(key:)
|
|
6
|
-
promise_destroy(key: key)
|
|
7
|
-
true
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
def promise_destroy(key:)
|
|
11
|
-
Isomorfeus::Transport.promise_send_path( 'Isomorfeus::Data::Handler::Generic', self.name, :destroy, key: key).then do |agent|
|
|
12
|
-
agent.process do
|
|
13
|
-
Isomorfeus.store.dispatch(type: 'DATA_DESTROY', data: [self.name, key])
|
|
14
|
-
true
|
|
15
|
-
end
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
def load(key:)
|
|
20
|
-
instance = self.new(key: key, _loading: true)
|
|
21
|
-
promise_load(key: key, instance: instance) unless instance.loaded?
|
|
22
|
-
instance
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
def promise_load(key:, instance: nil)
|
|
26
|
-
instance = self.new(key: key, _loading: true) unless instance
|
|
27
|
-
if instance.loaded?
|
|
28
|
-
Promise.new.resolve(instance)
|
|
29
|
-
else
|
|
30
|
-
promise_load!(key: key, instance: instance)
|
|
31
|
-
end
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
def load!(key:)
|
|
35
|
-
instance = self.new(key: key, _loading: true)
|
|
36
|
-
promise_load!(key: key, instance: instance) unless instance.loaded?
|
|
37
|
-
instance
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
def promise_load!(key:, instance: nil)
|
|
41
|
-
instance = self.new(key: key, _loading: true) unless instance
|
|
42
|
-
Isomorfeus::Transport.promise_send_path( 'Isomorfeus::Data::Handler::Generic', self.name, :load, key: key).then do |agent|
|
|
43
|
-
agent.process do
|
|
44
|
-
instance._load_from_store!
|
|
45
|
-
Isomorfeus.store.dispatch(type: 'DATA_LOAD', data: agent.full_response[:data])
|
|
46
|
-
instance
|
|
47
|
-
end
|
|
48
|
-
end
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
# execute
|
|
52
|
-
def execute_create(_); end
|
|
53
|
-
def execute_destroy(_); end
|
|
54
|
-
def execute_load(_); end
|
|
55
|
-
def execute_save(_); end
|
|
56
|
-
else # RUBY_ENGINE
|
|
57
|
-
def destroy(key:)
|
|
58
|
-
!!instance_exec(key: key, &@_destroy_block)
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
def promise_destroy(key:)
|
|
62
|
-
Promise.new.resolve(destroy(key: key))
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
def load(key:, _already_loaded: {})
|
|
66
|
-
data = if @_load_block.arity == 1
|
|
67
|
-
instance_exec(key: key, &@_load_block)
|
|
68
|
-
else
|
|
69
|
-
instance_exec(key: key, _already_loaded: _already_loaded, &@_load_block)
|
|
70
|
-
end
|
|
71
|
-
return nil if data.nil?
|
|
72
|
-
return data if data.class.to_s == self.to_s
|
|
73
|
-
Isomorfeus.raise_error(message: "#{self}: execute_load must return a instance of #{self} or nil. Returned was: #{data.class}.")
|
|
74
|
-
end
|
|
75
|
-
alias load! load
|
|
76
|
-
|
|
77
|
-
def promise_load(key:)
|
|
78
|
-
instance = self.load(key: key)
|
|
79
|
-
result_promise = Promise.new
|
|
80
|
-
result_promise.resolve(instance)
|
|
81
|
-
result_promise
|
|
82
|
-
end
|
|
83
|
-
alias promise_load! promise_load
|
|
84
|
-
|
|
85
|
-
def execute_create(&block)
|
|
86
|
-
@_create_block = block
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
def execute_destroy(&block)
|
|
90
|
-
@_destroy_block = block
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
def execute_load(&block)
|
|
94
|
-
@_load_block = block
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
def execute_save(&block)
|
|
98
|
-
@_save_block = block
|
|
99
|
-
end
|
|
100
|
-
end # RUBY_ENGINE
|
|
101
|
-
|
|
102
|
-
def gen_ref_s(key)
|
|
103
|
-
"---iso-object-reference---#{self.name}---#{key}---"
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
def gen_sid_s(key)
|
|
107
|
-
"[#{self.name}|#{key}]"
|
|
108
|
-
end
|
|
109
|
-
|
|
110
|
-
def create(key: nil, **things)
|
|
111
|
-
new(key: key, **things).create
|
|
112
|
-
end
|
|
113
|
-
|
|
114
|
-
def promise_create(key: nil, **things)
|
|
115
|
-
new(key: key, **things).promise_create
|
|
116
|
-
end
|
|
117
|
-
|
|
118
|
-
def current_user
|
|
119
|
-
Isomorfeus.current_user
|
|
120
|
-
end
|
|
121
|
-
|
|
122
|
-
def pub_sub_client
|
|
123
|
-
Isomorfeus.pub_sub_client
|
|
124
|
-
end
|
|
125
|
-
end
|
|
126
|
-
end
|
|
127
|
-
end
|
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
module Isomorfeus
|
|
2
|
-
module Data
|
|
3
|
-
module GenericInstanceApi
|
|
4
|
-
def key
|
|
5
|
-
@key
|
|
6
|
-
end
|
|
7
|
-
|
|
8
|
-
def key=(k)
|
|
9
|
-
@key = k.to_s
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
def changed?
|
|
13
|
-
@_changed
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
def revision
|
|
17
|
-
@_revision
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
def sid
|
|
21
|
-
[@class_name, @key]
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
def sid_s
|
|
25
|
-
"[#{@class_name}|#{@key}]"
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
def ref_s
|
|
29
|
-
self.class.gen_ref_s(@key)
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
if RUBY_ENGINE == 'opal'
|
|
33
|
-
def loaded?
|
|
34
|
-
Redux.fetch_by_path(*@_store_path) ? true : false
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
def create
|
|
38
|
-
promise_create
|
|
39
|
-
self
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
def promise_create
|
|
43
|
-
data_hash = { instance: to_transport }
|
|
44
|
-
data_hash.deep_merge!(included_items: included_items_to_transport) if respond_to?(:included_items_to_transport)
|
|
45
|
-
class_name = self.class.name
|
|
46
|
-
Isomorfeus::Transport.promise_send_path( 'Isomorfeus::Data::Handler::Generic', class_name, :create, data_hash).then do |agent|
|
|
47
|
-
agent.process do |agnt|
|
|
48
|
-
data = agnt.full_response[:data]
|
|
49
|
-
if data.key?(class_name) && data[class_name].key?(@key) && data[class_name][@key].key?('new_key')
|
|
50
|
-
@key = data[class_name][@key]['new_key']
|
|
51
|
-
@revision = data[class_name][@key]['revision'] if data[class_name][@key].key?('revision')
|
|
52
|
-
_update_paths
|
|
53
|
-
end
|
|
54
|
-
_load_from_store!
|
|
55
|
-
Isomorfeus.store.dispatch(type: 'DATA_LOAD', data: data)
|
|
56
|
-
self
|
|
57
|
-
end
|
|
58
|
-
end
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
def destroy
|
|
62
|
-
promise_destroy
|
|
63
|
-
nil
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
def promise_destroy
|
|
67
|
-
self.class.promise_destroy(key: @key)
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
def reload
|
|
71
|
-
self.class.promise_load!(key: @key, instance: self)
|
|
72
|
-
self
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
def promise_reload
|
|
76
|
-
self.class.promise_load!(key: @key, instance: self)
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
def save
|
|
80
|
-
promise_save
|
|
81
|
-
self
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
def promise_save
|
|
85
|
-
data_hash = { instance: to_transport }
|
|
86
|
-
data_hash.deep_merge!(included_items: included_items_to_transport) if respond_to?(:included_items_to_transport)
|
|
87
|
-
class_name = self.class.name
|
|
88
|
-
Isomorfeus::Transport.promise_send_path( 'Isomorfeus::Data::Handler::Generic', class_name, :save, data_hash).then do |agent|
|
|
89
|
-
agent.process do |agnt|
|
|
90
|
-
data = agnt.full_response[:data]
|
|
91
|
-
if data.key?(class_name) && data[class_name].key?(@key) && data[class_name][@key].key?('new_key')
|
|
92
|
-
@key = data[class_name][@key]['new_key']
|
|
93
|
-
@revision = data[class_name][@key]['revision'] if data[class_name][@key].key?('revision')
|
|
94
|
-
_update_paths
|
|
95
|
-
end
|
|
96
|
-
_load_from_store!
|
|
97
|
-
Isomorfeus.store.dispatch(type: 'DATA_LOAD', data: data)
|
|
98
|
-
self
|
|
99
|
-
end
|
|
100
|
-
end
|
|
101
|
-
end
|
|
102
|
-
else # RUBY_ENGINE
|
|
103
|
-
def loaded?
|
|
104
|
-
true
|
|
105
|
-
end
|
|
106
|
-
|
|
107
|
-
def create(_already_saved: {})
|
|
108
|
-
previous_key = self.key
|
|
109
|
-
create_block = self.class.instance_variable_get(:@_create_block)
|
|
110
|
-
instance = if create_block.arity == 0
|
|
111
|
-
instance_exec(&create_block)
|
|
112
|
-
else
|
|
113
|
-
instance_exec(_already_saved: _already_saved, &create_block)
|
|
114
|
-
end
|
|
115
|
-
return nil unless instance
|
|
116
|
-
Isomorfeus.raise_error(message: "#{self.to_s}: execute_create must return self or nil. Returned was: #{instance.class}.") if instance != self
|
|
117
|
-
instance_variable_set(:@previous_key, previous_key) if key != previous_key
|
|
118
|
-
_unchange!
|
|
119
|
-
self
|
|
120
|
-
end
|
|
121
|
-
|
|
122
|
-
def promise_create
|
|
123
|
-
promise = Promise.new
|
|
124
|
-
promise.resolve(create)
|
|
125
|
-
end
|
|
126
|
-
|
|
127
|
-
def destroy
|
|
128
|
-
self.class.destroy(key: @key)
|
|
129
|
-
end
|
|
130
|
-
|
|
131
|
-
def promise_destroy
|
|
132
|
-
self.class.promise_destroy(key: @key)
|
|
133
|
-
end
|
|
134
|
-
|
|
135
|
-
# reload must be implemented by mixin
|
|
136
|
-
|
|
137
|
-
def promise_reload
|
|
138
|
-
Promise.new.resolve(reload)
|
|
139
|
-
end
|
|
140
|
-
|
|
141
|
-
def save(_already_saved: {})
|
|
142
|
-
previous_key = self.key
|
|
143
|
-
save_block = self.class.instance_variable_get(:@_save_block)
|
|
144
|
-
instance = if save_block.arity == 0
|
|
145
|
-
instance_exec(&save_block)
|
|
146
|
-
else
|
|
147
|
-
instance_exec(_already_saved: _already_saved, &save_block)
|
|
148
|
-
end
|
|
149
|
-
return nil unless instance
|
|
150
|
-
Isomorfeus.raise_error(message: "#{self.to_s}: execute_save must return self or nil. Returned was: #{instance.class}.") if instance != self
|
|
151
|
-
instance_variable_set(:@previous_key, previous_key) if key != previous_key
|
|
152
|
-
_unchange!
|
|
153
|
-
self
|
|
154
|
-
end
|
|
155
|
-
|
|
156
|
-
def promise_save
|
|
157
|
-
promise = Promise.new
|
|
158
|
-
promise.resolve(save)
|
|
159
|
-
end
|
|
160
|
-
end # RUBY_ENGINE
|
|
161
|
-
|
|
162
|
-
def current_user
|
|
163
|
-
Isomorfeus.current_user
|
|
164
|
-
end
|
|
165
|
-
|
|
166
|
-
def pub_sub_client
|
|
167
|
-
Isomorfeus.pub_sub_client
|
|
168
|
-
end
|
|
169
|
-
end
|
|
170
|
-
end
|
|
171
|
-
end
|
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Isomorfeus
|
|
4
|
-
module Data
|
|
5
|
-
module Handler
|
|
6
|
-
class Generic < LucidHandler::Base
|
|
7
|
-
# responsible for loading:
|
|
8
|
-
# LucidObject
|
|
9
|
-
# LucidFile
|
|
10
|
-
# LucidQuery
|
|
11
|
-
|
|
12
|
-
def process_request(response_agent)
|
|
13
|
-
# promise_send_path('Isomorfeus::Data::Handler::Generic', self.to_s, action, props_hash)
|
|
14
|
-
response_agent.request.each_key do |type_class_name|
|
|
15
|
-
if Isomorfeus.valid_data_class_name?(type_class_name)
|
|
16
|
-
type_class = Isomorfeus.cached_data_class(type_class_name)
|
|
17
|
-
if type_class
|
|
18
|
-
response_agent.request[type_class_name].each_key do |action|
|
|
19
|
-
case action
|
|
20
|
-
when 'load' then process_load(response_agent, type_class, type_class_name)
|
|
21
|
-
when 'execute' then process_execute(response_agent, type_class, type_class_name)
|
|
22
|
-
when 'create' then process_create(response_agent, type_class, type_class_name)
|
|
23
|
-
when 'save' then process_save(response_agent, type_class, type_class_name)
|
|
24
|
-
when 'destroy' then process_destroy(response_agent, type_class, type_class_name)
|
|
25
|
-
else response_agent.error = { error: { action => 'No such thing!' }}
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
else response_agent.error = { error: { type_class_name => 'No such class!' }}
|
|
29
|
-
end
|
|
30
|
-
else response_agent.error = { error: { type_class_name => 'Not a valid LucidData class!' }}
|
|
31
|
-
end
|
|
32
|
-
end
|
|
33
|
-
rescue Exception => e
|
|
34
|
-
response_agent.error = { error: "Isomorfeus::Data::Handler::Generic: #{e.message}\n#{e.backtrace.join("\n")}" }
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
def process_create(response_agent, type_class, type_class_name)
|
|
38
|
-
# 'Isomorfeus::Data::Handler::Generic', self.name, :create, data_hash
|
|
39
|
-
data = response_agent.request[type_class_name]['create']
|
|
40
|
-
instance_data = data['instance']
|
|
41
|
-
included_items_data = data.key?('included_items') ? data['included_items'] : nil
|
|
42
|
-
if Isomorfeus.current_user.authorized?(type_class, :create, type_class.props_from_data(instance_data))
|
|
43
|
-
instance = type_class.instance_from_transport(instance_data, included_items_data)
|
|
44
|
-
created_type = instance.create
|
|
45
|
-
if created_type
|
|
46
|
-
response_agent.outer_result = {} unless response_agent.outer_result
|
|
47
|
-
response_agent.outer_result.deep_merge!(data: created_type.to_transport)
|
|
48
|
-
if created_type.respond_to?(:included_items_to_transport)
|
|
49
|
-
response_agent.outer_result.deep_merge!(data: created_type.included_items_to_transport)
|
|
50
|
-
end
|
|
51
|
-
response_agent.agent_result = { success: 'ok' }
|
|
52
|
-
else response_agent.error = { error: { type_class_name => 'Create returned nothing!' }}
|
|
53
|
-
end
|
|
54
|
-
else response_agent.error = { error: 'Access denied!' }
|
|
55
|
-
end
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
def process_execute(response_agent, type_class, type_class_name)
|
|
59
|
-
# 'Isomorfeus::Data::Handler::Generic', self.name, :execute, props_json
|
|
60
|
-
props = response_agent.request[type_class_name]['execute']
|
|
61
|
-
props.transform_keys!(&:to_sym)
|
|
62
|
-
if Isomorfeus.current_user.authorized?(type_class, :execute, props)
|
|
63
|
-
queried_type = type_class.execute(**props)
|
|
64
|
-
if queried_type
|
|
65
|
-
response_agent.outer_result = {} unless response_agent.outer_result
|
|
66
|
-
response_agent.outer_result.deep_merge!(data: queried_type.to_transport)
|
|
67
|
-
if queried_type.respond_to?(:included_items_to_transport)
|
|
68
|
-
response_agent.outer_result.deep_merge!(data: queried_type.included_items_to_transport)
|
|
69
|
-
end
|
|
70
|
-
response_agent.agent_result = { success: 'ok' }
|
|
71
|
-
else response_agent.error = { error: { type_class_name => 'Query returned nothing!' }}
|
|
72
|
-
end
|
|
73
|
-
else response_agent.error = { error: 'Access denied!' }
|
|
74
|
-
end
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
def process_load(response_agent, type_class, type_class_name)
|
|
78
|
-
# 'Isomorfeus::Data::Handler::Generic', self.name, :load, key: key
|
|
79
|
-
props = response_agent.request[type_class_name]['load']
|
|
80
|
-
props.transform_keys!(&:to_sym)
|
|
81
|
-
if Isomorfeus.current_user.authorized?(type_class, :load, props)
|
|
82
|
-
loaded_type = type_class.load(**props)
|
|
83
|
-
if loaded_type
|
|
84
|
-
response_agent.outer_result = {} unless response_agent.outer_result
|
|
85
|
-
response_agent.outer_result.deep_merge!(data: loaded_type.to_transport)
|
|
86
|
-
if loaded_type.respond_to?(:included_items_to_transport)
|
|
87
|
-
response_agent.outer_result.deep_merge!(data: loaded_type.included_items_to_transport)
|
|
88
|
-
end
|
|
89
|
-
response_agent.agent_result = { success: 'ok' }
|
|
90
|
-
else response_agent.error = { error: { type_class_name => 'Load returned nothing!' }}
|
|
91
|
-
end
|
|
92
|
-
else response_agent.error = { error: 'Access denied!' }
|
|
93
|
-
end
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
def process_save(response_agent, type_class, type_class_name)
|
|
97
|
-
# 'Isomorfeus::Data::Handler::Generic', self.name, :save, data_hash
|
|
98
|
-
data = response_agent.request[type_class_name]['save']
|
|
99
|
-
instance_data = data['instance']
|
|
100
|
-
included_items_data = data.key?('included_items') ? data['included_items'] : nil
|
|
101
|
-
if Isomorfeus.current_user.authorized?(type_class, :save, type_class.props_from_data(instance_data))
|
|
102
|
-
instance = type_class.instance_from_transport(instance_data, included_items_data)
|
|
103
|
-
saved_type = instance.save
|
|
104
|
-
if saved_type
|
|
105
|
-
response_agent.outer_result = {} unless response_agent.outer_result
|
|
106
|
-
response_agent.outer_result.deep_merge!(data: saved_type.to_transport)
|
|
107
|
-
if saved_type.respond_to?(:included_items_to_transport)
|
|
108
|
-
response_agent.outer_result.deep_merge!(data: saved_type.included_items_to_transport)
|
|
109
|
-
end
|
|
110
|
-
response_agent.agent_result = { success: 'ok' }
|
|
111
|
-
else response_agent.error = { error: { type_class_name => 'Save returned nothing!' }}
|
|
112
|
-
end
|
|
113
|
-
else response_agent.error = { error: 'Access denied!' }
|
|
114
|
-
end
|
|
115
|
-
end
|
|
116
|
-
|
|
117
|
-
def process_destroy(response_agent, type_class, type_class_name)
|
|
118
|
-
props = response_agent.request[type_class_name]['destroy']
|
|
119
|
-
props.transform_keys!(&:to_sym)
|
|
120
|
-
if Isomorfeus.current_user.authorized?(type_class, :destroy, props)
|
|
121
|
-
result = type_class.destroy(**props)
|
|
122
|
-
if result
|
|
123
|
-
response_agent.agent_result = { success: 'ok' }
|
|
124
|
-
else
|
|
125
|
-
response_agent.error = { error: { type_class_name => 'Destroy failed!' }}
|
|
126
|
-
end
|
|
127
|
-
else response_agent.error = { error: 'Access denied!' }
|
|
128
|
-
end
|
|
129
|
-
end
|
|
130
|
-
end
|
|
131
|
-
end
|
|
132
|
-
end
|
|
133
|
-
end
|