hyper-model 1.0.alpha1.5 → 1.0.alpha1.6
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/.rspec +0 -1
- data/Gemfile +6 -5
- data/Rakefile +1 -1
- data/hyper-model.gemspec +11 -19
- data/lib/active_record_base.rb +58 -12
- data/lib/hyper-model.rb +3 -1
- data/lib/hyper_model/version.rb +1 -1
- data/lib/reactive_record/active_record/associations.rb +8 -3
- data/lib/reactive_record/active_record/base.rb +1 -1
- data/lib/reactive_record/active_record/class_methods.rb +54 -32
- data/lib/reactive_record/active_record/instance_methods.rb +48 -3
- data/lib/reactive_record/active_record/reactive_record/base.rb +2 -2
- data/lib/reactive_record/active_record/reactive_record/collection.rb +77 -27
- data/lib/reactive_record/active_record/reactive_record/dummy_value.rb +26 -15
- data/lib/reactive_record/active_record/reactive_record/getters.rb +4 -2
- data/lib/reactive_record/active_record/reactive_record/isomorphic_base.rb +17 -23
- data/lib/reactive_record/active_record/reactive_record/operations.rb +7 -1
- data/lib/reactive_record/active_record/reactive_record/setters.rb +2 -3
- data/lib/reactive_record/active_record/reactive_record/while_loading.rb +22 -1
- data/lib/reactive_record/broadcast.rb +21 -10
- data/lib/reactive_record/server_data_cache.rb +56 -44
- metadata +44 -150
|
@@ -353,7 +353,7 @@ module ReactiveRecord
|
|
|
353
353
|
|
|
354
354
|
end
|
|
355
355
|
|
|
356
|
-
def after_mount_and_update
|
|
356
|
+
def after_mount_and_update(*)
|
|
357
357
|
@waiting_on_resources = @Loading
|
|
358
358
|
node = dom_node
|
|
359
359
|
%x{
|
|
@@ -478,6 +478,27 @@ if RUBY_ENGINE == 'opal'
|
|
|
478
478
|
reactive_record_link_set_while_loading_container_class
|
|
479
479
|
end
|
|
480
480
|
|
|
481
|
+
# This is required to support legacy browsers (Internet Explorer 9+)
|
|
482
|
+
# https://developer.mozilla.org/en-US/docs/Web/API/Element/closest#Polyfill
|
|
483
|
+
`
|
|
484
|
+
if (typeof(Element) != 'undefined' && !Element.prototype.matches) {
|
|
485
|
+
Element.prototype.matches = Element.prototype.msMatchesSelector ||
|
|
486
|
+
Element.prototype.webkitMatchesSelector;
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
if (typeof(Element) != 'undefined' && !Element.prototype.closest) {
|
|
490
|
+
Element.prototype.closest = function(s) {
|
|
491
|
+
var el = this;
|
|
492
|
+
|
|
493
|
+
do {
|
|
494
|
+
if (el.matches(s)) return el;
|
|
495
|
+
el = el.parentElement || el.parentNode;
|
|
496
|
+
} while (el !== null && el.nodeType === 1);
|
|
497
|
+
return null;
|
|
498
|
+
};
|
|
499
|
+
}
|
|
500
|
+
`
|
|
501
|
+
|
|
481
502
|
def reactive_record_link_to_enclosing_while_loading_container
|
|
482
503
|
# Call after any component mounts - attaches the containers loading id to this component
|
|
483
504
|
# Fyi, the while_loading container is responsible for setting its own link to itself
|
|
@@ -6,17 +6,19 @@ module ReactiveRecord
|
|
|
6
6
|
# before the first broadcast.
|
|
7
7
|
@public_columns_hash ||= ActiveRecord::Base.public_columns_hash
|
|
8
8
|
Hyperstack::InternalPolicy.regulate_broadcast(model) do |data|
|
|
9
|
+
puts "Broadcast aftercommit hook: #{data}" if Hyperstack::Connection.show_diagnostics
|
|
10
|
+
|
|
9
11
|
if !Hyperstack.on_server? && Hyperstack::Connection.root_path
|
|
10
|
-
send_to_server(operation, data) rescue nil # fails if server no longer running so ignore
|
|
12
|
+
send_to_server(operation, data, model.__synchromesh_update_time) rescue nil # fails if server no longer running so ignore
|
|
11
13
|
else
|
|
12
|
-
SendPacket.run(data, operation: operation)
|
|
14
|
+
SendPacket.run(data, operation: operation, updated_at: model.__synchromesh_update_time)
|
|
13
15
|
end
|
|
14
16
|
end
|
|
15
17
|
rescue ActiveRecord::StatementInvalid => e
|
|
16
18
|
raise e unless e.message == "Could not find table 'hyperstack_connections'"
|
|
17
19
|
end unless RUBY_ENGINE == 'opal'
|
|
18
20
|
|
|
19
|
-
def self.send_to_server(operation, data)
|
|
21
|
+
def self.send_to_server(operation, data, updated_at)
|
|
20
22
|
salt = SecureRandom.hex
|
|
21
23
|
authorization = Hyperstack.authorization(salt, data[:channel], data[:broadcast_id])
|
|
22
24
|
raise 'no server running' unless Hyperstack::Connection.root_path
|
|
@@ -25,6 +27,7 @@ module ReactiveRecord
|
|
|
25
27
|
Hyperstack::Connection.root_path,
|
|
26
28
|
data,
|
|
27
29
|
operation: operation,
|
|
30
|
+
updated_at: updated_at,
|
|
28
31
|
salt: salt,
|
|
29
32
|
authorization: authorization
|
|
30
33
|
).tap { |p| raise p.error if p.rejected? }
|
|
@@ -45,6 +48,7 @@ module ReactiveRecord
|
|
|
45
48
|
param :record
|
|
46
49
|
param :operation
|
|
47
50
|
param :previous_changes
|
|
51
|
+
param :updated_at
|
|
48
52
|
|
|
49
53
|
unless RUBY_ENGINE == 'opal'
|
|
50
54
|
validate do
|
|
@@ -86,7 +90,7 @@ module ReactiveRecord
|
|
|
86
90
|
|
|
87
91
|
def record_with_current_values
|
|
88
92
|
ReactiveRecord::Base.load_data do
|
|
89
|
-
backing_record = @backing_record || klass.find(record[
|
|
93
|
+
backing_record = @backing_record || klass.find(record[klass.primary_key]).backing_record
|
|
90
94
|
if destroyed?
|
|
91
95
|
backing_record.ar_instance
|
|
92
96
|
else
|
|
@@ -113,6 +117,10 @@ module ReactiveRecord
|
|
|
113
117
|
@destroyed
|
|
114
118
|
end
|
|
115
119
|
|
|
120
|
+
def local?
|
|
121
|
+
@is_local
|
|
122
|
+
end
|
|
123
|
+
|
|
116
124
|
def klass
|
|
117
125
|
Object.const_get(@klass)
|
|
118
126
|
end
|
|
@@ -124,6 +132,7 @@ module ReactiveRecord
|
|
|
124
132
|
# private
|
|
125
133
|
|
|
126
134
|
attr_reader :record
|
|
135
|
+
attr_reader :updated_at
|
|
127
136
|
|
|
128
137
|
def self.open_channels
|
|
129
138
|
@open_channels ||= Set.new
|
|
@@ -133,7 +142,7 @@ module ReactiveRecord
|
|
|
133
142
|
@in_transit ||= Hash.new { |h, k| h[k] = new(k) }
|
|
134
143
|
end
|
|
135
144
|
|
|
136
|
-
def initialize(id)
|
|
145
|
+
def initialize(id = nil)
|
|
137
146
|
@id = id
|
|
138
147
|
@received = Set.new
|
|
139
148
|
@record = {}
|
|
@@ -142,11 +151,12 @@ module ReactiveRecord
|
|
|
142
151
|
|
|
143
152
|
def local(operation, record, data)
|
|
144
153
|
@destroyed = operation == :destroy
|
|
154
|
+
@is_local = true
|
|
145
155
|
@is_new = operation == :create
|
|
146
156
|
@klass = record.class.name
|
|
147
157
|
@record = data
|
|
148
158
|
record.backing_record.destroyed = false
|
|
149
|
-
@record[
|
|
159
|
+
@record[record.primary_key] = record.id if record.id
|
|
150
160
|
record.backing_record.destroyed = @destroyed
|
|
151
161
|
@backing_record = record.backing_record
|
|
152
162
|
@previous_changes = record.changes
|
|
@@ -160,11 +170,12 @@ module ReactiveRecord
|
|
|
160
170
|
@klass ||= params.klass
|
|
161
171
|
@record.merge! params.record
|
|
162
172
|
@previous_changes.merge! params.previous_changes
|
|
173
|
+
@updated_at = params.updated_at
|
|
163
174
|
ReactiveRecord::Base.when_not_saving(klass) do
|
|
164
|
-
@backing_record = ReactiveRecord::Base.exists?(klass, params.record[
|
|
175
|
+
@backing_record = ReactiveRecord::Base.exists?(klass, params.record[klass.primary_key])
|
|
165
176
|
|
|
166
177
|
# first check to see if we already destroyed it and if so exit the block
|
|
167
|
-
|
|
178
|
+
break if @backing_record&.destroyed
|
|
168
179
|
|
|
169
180
|
# We ignore whether the record is being created or not, and just check and see if in our
|
|
170
181
|
# local copy we have ever loaded this id before. If we have then its not new to us.
|
|
@@ -178,7 +189,7 @@ module ReactiveRecord
|
|
|
178
189
|
# it is possible that we are recieving data on a record for which we are also waiting
|
|
179
190
|
# on an an inital data load in which case we have not yet set the loaded id, so we
|
|
180
191
|
# set if now.
|
|
181
|
-
@backing_record&.loaded_id = params.record[
|
|
192
|
+
@backing_record&.loaded_id = params.record[klass.primary_key]
|
|
182
193
|
|
|
183
194
|
# once we have received all the data from all the channels (applies to create and update only)
|
|
184
195
|
# we yield and process the record
|
|
@@ -232,7 +243,7 @@ module ReactiveRecord
|
|
|
232
243
|
|
|
233
244
|
def merge_current_values(br)
|
|
234
245
|
current_values = Hash[*@previous_changes.collect do |attr, values|
|
|
235
|
-
value = attr ==
|
|
246
|
+
value = attr == klass.primary_key ? record[klass.primary_key] : values.first
|
|
236
247
|
if br.attributes.key?(attr) &&
|
|
237
248
|
br.attributes[attr] != br.convert(attr, value) &&
|
|
238
249
|
br.attributes[attr] != br.convert(attr, values.last)
|
|
@@ -260,49 +260,54 @@ module ReactiveRecord
|
|
|
260
260
|
def apply_method_to_cache(method)
|
|
261
261
|
@db_cache.cache.inject(nil) do |representative, cache_item|
|
|
262
262
|
if cache_item.vector == vector
|
|
263
|
-
|
|
264
|
-
#
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
cache_item.build_new_cache_item(
|
|
263
|
+
begin
|
|
264
|
+
# error_recovery_method holds the current method that we are attempting to apply
|
|
265
|
+
# in case we throw an exception, and need to give the developer a meaningful message.
|
|
266
|
+
if method == "*"
|
|
267
|
+
# apply_star does the security check if value is present
|
|
268
|
+
cache_item.apply_star || representative
|
|
269
|
+
elsif method == "*all"
|
|
270
|
+
# if we secure the collection then we assume its okay to read the ids
|
|
271
|
+
error_recovery_method = [:all]
|
|
272
|
+
secured_value = cache_item.value.__secure_collection_check(cache_item)
|
|
273
|
+
cache_item.build_new_cache_item(timing(:active_record) { secured_value.collect { |record| record.id } }, method, method)
|
|
274
|
+
elsif method == "*count"
|
|
275
|
+
error_recovery_method = [:count]
|
|
276
|
+
secured_value = cache_item.value.__secure_collection_check(cache_item)
|
|
277
|
+
cache_item.build_new_cache_item(timing(:active_record) { cache_item.value.__secure_collection_check(cache_item).count }, method, method)
|
|
278
|
+
elsif preloaded_value = @preloaded_records[cache_item.absolute_vector + [method]]
|
|
279
|
+
# no security check needed since we already evaluated this
|
|
280
|
+
cache_item.build_new_cache_item(preloaded_value, method, method)
|
|
281
|
+
elsif aggregation = cache_item.aggregation?(method)
|
|
282
|
+
# aggregations are not protected
|
|
283
|
+
error_recovery_method = [method, :mapping, :all]
|
|
284
|
+
cache_item.build_new_cache_item(aggregation.mapping.collect { |attribute, accessor| cache_item.value[attribute] }, method, method)
|
|
285
285
|
else
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
286
|
+
if !cache_item.value || cache_item.value.is_a?(Array)
|
|
287
|
+
# seeing as we just returning representative, no check is needed (its already checked)
|
|
288
|
+
representative
|
|
289
|
+
elsif method == 'model_name'
|
|
290
|
+
error_recovery_method = [:model_name]
|
|
291
|
+
cache_item.build_new_cache_item(timing(:active_record) { cache_item.value.model_name }, method, method)
|
|
292
|
+
else
|
|
293
|
+
begin
|
|
294
|
+
secured_method = "__secure_remote_access_to_#{[*method].first}"
|
|
295
|
+
error_recovery_method = [*method]
|
|
296
|
+
# order is important. This check must be first since scopes can have same name as attributes!
|
|
297
|
+
if cache_item.value.respond_to? secured_method
|
|
298
|
+
cache_item.build_new_cache_item(timing(:active_record) { cache_item.value.send(secured_method, cache_item.value, @acting_user, *([*method][1..-1])) }, method, method)
|
|
299
|
+
elsif (cache_item.value.class < ActiveRecord::Base) && cache_item.value.attributes.has_key?(method) # TODO: second check is not needed, its built into check_permmissions, check should be does class respond to check_permissions...
|
|
300
|
+
cache_item.value.check_permission_with_acting_user(@acting_user, :view_permitted?, method)
|
|
301
|
+
cache_item.build_new_cache_item(timing(:active_record) { cache_item.value.send(*method) }, method, method)
|
|
302
|
+
else
|
|
303
|
+
raise "Method missing while fetching data: \`#{[*method].first}\` "\
|
|
304
|
+
'was expected to be an attribute or a method defined using the server_method of finder_method macros.'
|
|
305
|
+
end
|
|
298
306
|
end
|
|
299
|
-
# rescue Exception => e # this check may no longer be needed as we are quite explicit now on which methods we apply
|
|
300
|
-
# binding.pry
|
|
301
|
-
# # ReactiveRecord::Pry::rescued(e)
|
|
302
|
-
# #::Rails.logger.debug "\033[0;31;1mERROR: HyperModel exception caught when applying #{method} to db object #{cache_item.value}: #{e}\033[0;30;21m"
|
|
303
|
-
# raise e, "HyperModel fetching records failed, exception caught when applying #{method} to db object #{cache_item.value}: #{e}", e.backtrace
|
|
304
307
|
end
|
|
305
308
|
end
|
|
309
|
+
rescue StandardError => e
|
|
310
|
+
raise e.class, form_error_message(e, cache_item.vector + error_recovery_method), e.backtrace
|
|
306
311
|
end
|
|
307
312
|
else
|
|
308
313
|
representative
|
|
@@ -310,6 +315,15 @@ module ReactiveRecord
|
|
|
310
315
|
end
|
|
311
316
|
end
|
|
312
317
|
|
|
318
|
+
def form_error_message(original_error, vector)
|
|
319
|
+
expression = vector.collect do |exp|
|
|
320
|
+
next exp unless exp.is_a? Array
|
|
321
|
+
next exp.first if exp.length == 1
|
|
322
|
+
"#{exp.first}(#{exp[1..-1].join(', ')})"
|
|
323
|
+
end.join('.')
|
|
324
|
+
"raised when evaluating #{expression}\n#{original_error}"
|
|
325
|
+
end
|
|
326
|
+
|
|
313
327
|
def aggregation?(method)
|
|
314
328
|
if method.is_a?(String) && @value.class.respond_to?(:reflect_on_aggregation)
|
|
315
329
|
aggregation = @value.class.reflect_on_aggregation(method.to_sym)
|
|
@@ -460,7 +474,7 @@ keys:
|
|
|
460
474
|
end
|
|
461
475
|
end
|
|
462
476
|
|
|
463
|
-
if id_value = tree[
|
|
477
|
+
if (id_value = tree[target.class.try(:primary_key)] || tree[:id]) && id_value.is_a?(Array)
|
|
464
478
|
target.id = id_value.first
|
|
465
479
|
end
|
|
466
480
|
tree.each do |method, value|
|
|
@@ -472,7 +486,7 @@ keys:
|
|
|
472
486
|
elsif !target
|
|
473
487
|
load_from_json(value, Object.const_get(method))
|
|
474
488
|
elsif method == "*count"
|
|
475
|
-
target.
|
|
489
|
+
target.count_state = value.first
|
|
476
490
|
elsif method.is_a? Integer or method =~ /^[0-9]+$/
|
|
477
491
|
new_target = target.push_and_update_belongs_to(method)
|
|
478
492
|
elsif method.is_a? Array
|
|
@@ -492,9 +506,7 @@ keys:
|
|
|
492
506
|
|
|
493
507
|
target.send "#{method}=", value.first
|
|
494
508
|
elsif value.is_a? Array
|
|
495
|
-
|
|
496
|
-
# a better fix might be something like target._internal_attribute_hash[method] = ...
|
|
497
|
-
target.backing_record.set_attr_value(method, value.first) unless method == :id
|
|
509
|
+
target.send("_hyperstack_internal_setter_#{method}", value.first) unless method == target.class.primary_key
|
|
498
510
|
elsif value.is_a?(Hash) && value[:id] && value[:id].first && (association = target.class.reflect_on_association(method))
|
|
499
511
|
# not sure if its necessary to check the id above... is it possible to for the method to be an association but not have an id?
|
|
500
512
|
klass = value[:model_name] ? Object.const_get(value[:model_name].first) : association.klass
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: hyper-model
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.0.alpha1.
|
|
4
|
+
version: 1.0.alpha1.6
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Mitch VanDuyn
|
|
@@ -9,7 +9,7 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date:
|
|
12
|
+
date: 2021-03-29 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: activemodel
|
|
@@ -39,56 +39,36 @@ dependencies:
|
|
|
39
39
|
- - ">="
|
|
40
40
|
- !ruby/object:Gem::Version
|
|
41
41
|
version: 4.0.0
|
|
42
|
-
- !ruby/object:Gem::Dependency
|
|
43
|
-
name: hyper-component
|
|
44
|
-
requirement: !ruby/object:Gem::Requirement
|
|
45
|
-
requirements:
|
|
46
|
-
- - '='
|
|
47
|
-
- !ruby/object:Gem::Version
|
|
48
|
-
version: 1.0.alpha1.5
|
|
49
|
-
type: :runtime
|
|
50
|
-
prerelease: false
|
|
51
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
52
|
-
requirements:
|
|
53
|
-
- - '='
|
|
54
|
-
- !ruby/object:Gem::Version
|
|
55
|
-
version: 1.0.alpha1.5
|
|
56
42
|
- !ruby/object:Gem::Dependency
|
|
57
43
|
name: hyper-operation
|
|
58
44
|
requirement: !ruby/object:Gem::Requirement
|
|
59
45
|
requirements:
|
|
60
46
|
- - '='
|
|
61
47
|
- !ruby/object:Gem::Version
|
|
62
|
-
version: 1.0.alpha1.
|
|
48
|
+
version: 1.0.alpha1.6
|
|
63
49
|
type: :runtime
|
|
64
50
|
prerelease: false
|
|
65
51
|
version_requirements: !ruby/object:Gem::Requirement
|
|
66
52
|
requirements:
|
|
67
53
|
- - '='
|
|
68
54
|
- !ruby/object:Gem::Version
|
|
69
|
-
version: 1.0.alpha1.
|
|
55
|
+
version: 1.0.alpha1.6
|
|
70
56
|
- !ruby/object:Gem::Dependency
|
|
71
57
|
name: bundler
|
|
72
58
|
requirement: !ruby/object:Gem::Requirement
|
|
73
59
|
requirements:
|
|
74
60
|
- - ">="
|
|
75
61
|
- !ruby/object:Gem::Version
|
|
76
|
-
version:
|
|
77
|
-
- - "<"
|
|
78
|
-
- !ruby/object:Gem::Version
|
|
79
|
-
version: '2.1'
|
|
62
|
+
version: '0'
|
|
80
63
|
type: :development
|
|
81
64
|
prerelease: false
|
|
82
65
|
version_requirements: !ruby/object:Gem::Requirement
|
|
83
66
|
requirements:
|
|
84
67
|
- - ">="
|
|
85
68
|
- !ruby/object:Gem::Version
|
|
86
|
-
version:
|
|
87
|
-
- - "<"
|
|
88
|
-
- !ruby/object:Gem::Version
|
|
89
|
-
version: '2.1'
|
|
69
|
+
version: '0'
|
|
90
70
|
- !ruby/object:Gem::Dependency
|
|
91
|
-
name:
|
|
71
|
+
name: database_cleaner
|
|
92
72
|
requirement: !ruby/object:Gem::Requirement
|
|
93
73
|
requirements:
|
|
94
74
|
- - ">="
|
|
@@ -102,21 +82,7 @@ dependencies:
|
|
|
102
82
|
- !ruby/object:Gem::Version
|
|
103
83
|
version: '0'
|
|
104
84
|
- !ruby/object:Gem::Dependency
|
|
105
|
-
name:
|
|
106
|
-
requirement: !ruby/object:Gem::Requirement
|
|
107
|
-
requirements:
|
|
108
|
-
- - '='
|
|
109
|
-
- !ruby/object:Gem::Version
|
|
110
|
-
version: 1.2.0
|
|
111
|
-
type: :development
|
|
112
|
-
prerelease: false
|
|
113
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
114
|
-
requirements:
|
|
115
|
-
- - '='
|
|
116
|
-
- !ruby/object:Gem::Version
|
|
117
|
-
version: 1.2.0
|
|
118
|
-
- !ruby/object:Gem::Dependency
|
|
119
|
-
name: libv8
|
|
85
|
+
name: factory_bot_rails
|
|
120
86
|
requirement: !ruby/object:Gem::Requirement
|
|
121
87
|
requirements:
|
|
122
88
|
- - ">="
|
|
@@ -130,49 +96,35 @@ dependencies:
|
|
|
130
96
|
- !ruby/object:Gem::Version
|
|
131
97
|
version: '0'
|
|
132
98
|
- !ruby/object:Gem::Dependency
|
|
133
|
-
name:
|
|
99
|
+
name: hyper-spec
|
|
134
100
|
requirement: !ruby/object:Gem::Requirement
|
|
135
101
|
requirements:
|
|
136
|
-
- -
|
|
137
|
-
- !ruby/object:Gem::Version
|
|
138
|
-
version: 0.2.4
|
|
139
|
-
type: :development
|
|
140
|
-
prerelease: false
|
|
141
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
142
|
-
requirements:
|
|
143
|
-
- - "~>"
|
|
144
|
-
- !ruby/object:Gem::Version
|
|
145
|
-
version: 0.2.4
|
|
146
|
-
- !ruby/object:Gem::Dependency
|
|
147
|
-
name: selenium-webdriver
|
|
148
|
-
requirement: !ruby/object:Gem::Requirement
|
|
149
|
-
requirements:
|
|
150
|
-
- - ">="
|
|
102
|
+
- - '='
|
|
151
103
|
- !ruby/object:Gem::Version
|
|
152
|
-
version:
|
|
104
|
+
version: 1.0.alpha1.6
|
|
153
105
|
type: :development
|
|
154
106
|
prerelease: false
|
|
155
107
|
version_requirements: !ruby/object:Gem::Requirement
|
|
156
108
|
requirements:
|
|
157
|
-
- -
|
|
109
|
+
- - '='
|
|
158
110
|
- !ruby/object:Gem::Version
|
|
159
|
-
version:
|
|
111
|
+
version: 1.0.alpha1.6
|
|
160
112
|
- !ruby/object:Gem::Dependency
|
|
161
|
-
name:
|
|
113
|
+
name: hyper-trace
|
|
162
114
|
requirement: !ruby/object:Gem::Requirement
|
|
163
115
|
requirements:
|
|
164
|
-
- -
|
|
116
|
+
- - '='
|
|
165
117
|
- !ruby/object:Gem::Version
|
|
166
|
-
version:
|
|
118
|
+
version: 1.0.alpha1.6
|
|
167
119
|
type: :development
|
|
168
120
|
prerelease: false
|
|
169
121
|
version_requirements: !ruby/object:Gem::Requirement
|
|
170
122
|
requirements:
|
|
171
|
-
- -
|
|
123
|
+
- - '='
|
|
172
124
|
- !ruby/object:Gem::Version
|
|
173
|
-
version:
|
|
125
|
+
version: 1.0.alpha1.6
|
|
174
126
|
- !ruby/object:Gem::Dependency
|
|
175
|
-
name:
|
|
127
|
+
name: mini_racer
|
|
176
128
|
requirement: !ruby/object:Gem::Requirement
|
|
177
129
|
requirements:
|
|
178
130
|
- - ">="
|
|
@@ -186,7 +138,7 @@ dependencies:
|
|
|
186
138
|
- !ruby/object:Gem::Version
|
|
187
139
|
version: '0'
|
|
188
140
|
- !ruby/object:Gem::Dependency
|
|
189
|
-
name:
|
|
141
|
+
name: pg
|
|
190
142
|
requirement: !ruby/object:Gem::Requirement
|
|
191
143
|
requirements:
|
|
192
144
|
- - ">="
|
|
@@ -199,64 +151,28 @@ dependencies:
|
|
|
199
151
|
- - ">="
|
|
200
152
|
- !ruby/object:Gem::Version
|
|
201
153
|
version: '0'
|
|
202
|
-
- !ruby/object:Gem::Dependency
|
|
203
|
-
name: opal-activesupport
|
|
204
|
-
requirement: !ruby/object:Gem::Requirement
|
|
205
|
-
requirements:
|
|
206
|
-
- - "~>"
|
|
207
|
-
- !ruby/object:Gem::Version
|
|
208
|
-
version: 0.3.1
|
|
209
|
-
type: :development
|
|
210
|
-
prerelease: false
|
|
211
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
212
|
-
requirements:
|
|
213
|
-
- - "~>"
|
|
214
|
-
- !ruby/object:Gem::Version
|
|
215
|
-
version: 0.3.1
|
|
216
|
-
- !ruby/object:Gem::Dependency
|
|
217
|
-
name: opal-browser
|
|
218
|
-
requirement: !ruby/object:Gem::Requirement
|
|
219
|
-
requirements:
|
|
220
|
-
- - "~>"
|
|
221
|
-
- !ruby/object:Gem::Version
|
|
222
|
-
version: 0.2.0
|
|
223
|
-
type: :development
|
|
224
|
-
prerelease: false
|
|
225
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
226
|
-
requirements:
|
|
227
|
-
- - "~>"
|
|
228
|
-
- !ruby/object:Gem::Version
|
|
229
|
-
version: 0.2.0
|
|
230
154
|
- !ruby/object:Gem::Dependency
|
|
231
155
|
name: opal-rails
|
|
232
156
|
requirement: !ruby/object:Gem::Requirement
|
|
233
157
|
requirements:
|
|
234
|
-
- - "
|
|
235
|
-
- !ruby/object:Gem::Version
|
|
236
|
-
version: 0.9.4
|
|
237
|
-
type: :development
|
|
238
|
-
prerelease: false
|
|
239
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
240
|
-
requirements:
|
|
241
|
-
- - "~>"
|
|
158
|
+
- - ">="
|
|
242
159
|
- !ruby/object:Gem::Version
|
|
243
160
|
version: 0.9.4
|
|
244
|
-
-
|
|
245
|
-
name: parser
|
|
246
|
-
requirement: !ruby/object:Gem::Requirement
|
|
247
|
-
requirements:
|
|
248
|
-
- - ">="
|
|
161
|
+
- - "<"
|
|
249
162
|
- !ruby/object:Gem::Version
|
|
250
|
-
version: '0'
|
|
163
|
+
version: '2.0'
|
|
251
164
|
type: :development
|
|
252
165
|
prerelease: false
|
|
253
166
|
version_requirements: !ruby/object:Gem::Requirement
|
|
254
167
|
requirements:
|
|
255
168
|
- - ">="
|
|
256
169
|
- !ruby/object:Gem::Version
|
|
257
|
-
version:
|
|
170
|
+
version: 0.9.4
|
|
171
|
+
- - "<"
|
|
172
|
+
- !ruby/object:Gem::Version
|
|
173
|
+
version: '2.0'
|
|
258
174
|
- !ruby/object:Gem::Dependency
|
|
259
|
-
name: pry
|
|
175
|
+
name: pry-rescue
|
|
260
176
|
requirement: !ruby/object:Gem::Requirement
|
|
261
177
|
requirements:
|
|
262
178
|
- - ">="
|
|
@@ -270,7 +186,7 @@ dependencies:
|
|
|
270
186
|
- !ruby/object:Gem::Version
|
|
271
187
|
version: '0'
|
|
272
188
|
- !ruby/object:Gem::Dependency
|
|
273
|
-
name: pry-
|
|
189
|
+
name: pry-stack_explorer
|
|
274
190
|
requirement: !ruby/object:Gem::Requirement
|
|
275
191
|
requirements:
|
|
276
192
|
- - ">="
|
|
@@ -331,14 +247,20 @@ dependencies:
|
|
|
331
247
|
requirements:
|
|
332
248
|
- - ">="
|
|
333
249
|
- !ruby/object:Gem::Version
|
|
334
|
-
version:
|
|
250
|
+
version: 5.0.0
|
|
251
|
+
- - "<"
|
|
252
|
+
- !ruby/object:Gem::Version
|
|
253
|
+
version: '7.0'
|
|
335
254
|
type: :development
|
|
336
255
|
prerelease: false
|
|
337
256
|
version_requirements: !ruby/object:Gem::Requirement
|
|
338
257
|
requirements:
|
|
339
258
|
- - ">="
|
|
340
259
|
- !ruby/object:Gem::Version
|
|
341
|
-
version:
|
|
260
|
+
version: 5.0.0
|
|
261
|
+
- - "<"
|
|
262
|
+
- !ruby/object:Gem::Version
|
|
263
|
+
version: '7.0'
|
|
342
264
|
- !ruby/object:Gem::Dependency
|
|
343
265
|
name: rake
|
|
344
266
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -373,20 +295,6 @@ dependencies:
|
|
|
373
295
|
- - "<"
|
|
374
296
|
- !ruby/object:Gem::Version
|
|
375
297
|
version: 2.5.0
|
|
376
|
-
- !ruby/object:Gem::Dependency
|
|
377
|
-
name: reactrb-rails-generator
|
|
378
|
-
requirement: !ruby/object:Gem::Requirement
|
|
379
|
-
requirements:
|
|
380
|
-
- - ">="
|
|
381
|
-
- !ruby/object:Gem::Version
|
|
382
|
-
version: '0'
|
|
383
|
-
type: :development
|
|
384
|
-
prerelease: false
|
|
385
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
386
|
-
requirements:
|
|
387
|
-
- - ">="
|
|
388
|
-
- !ruby/object:Gem::Version
|
|
389
|
-
version: '0'
|
|
390
298
|
- !ruby/object:Gem::Dependency
|
|
391
299
|
name: rspec-collection_matchers
|
|
392
300
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -531,30 +439,30 @@ dependencies:
|
|
|
531
439
|
name: spring-commands-rspec
|
|
532
440
|
requirement: !ruby/object:Gem::Requirement
|
|
533
441
|
requirements:
|
|
534
|
-
- - "
|
|
442
|
+
- - "~>"
|
|
535
443
|
- !ruby/object:Gem::Version
|
|
536
|
-
version:
|
|
444
|
+
version: 1.0.4
|
|
537
445
|
type: :development
|
|
538
446
|
prerelease: false
|
|
539
447
|
version_requirements: !ruby/object:Gem::Requirement
|
|
540
448
|
requirements:
|
|
541
|
-
- - "
|
|
449
|
+
- - "~>"
|
|
542
450
|
- !ruby/object:Gem::Version
|
|
543
|
-
version:
|
|
451
|
+
version: 1.0.4
|
|
544
452
|
- !ruby/object:Gem::Dependency
|
|
545
453
|
name: sqlite3
|
|
546
454
|
requirement: !ruby/object:Gem::Requirement
|
|
547
455
|
requirements:
|
|
548
456
|
- - "~>"
|
|
549
457
|
- !ruby/object:Gem::Version
|
|
550
|
-
version: 1.
|
|
458
|
+
version: 1.4.2
|
|
551
459
|
type: :development
|
|
552
460
|
prerelease: false
|
|
553
461
|
version_requirements: !ruby/object:Gem::Requirement
|
|
554
462
|
requirements:
|
|
555
463
|
- - "~>"
|
|
556
464
|
- !ruby/object:Gem::Version
|
|
557
|
-
version: 1.
|
|
465
|
+
version: 1.4.2
|
|
558
466
|
- !ruby/object:Gem::Dependency
|
|
559
467
|
name: timecop
|
|
560
468
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -569,20 +477,6 @@ dependencies:
|
|
|
569
477
|
- - "~>"
|
|
570
478
|
- !ruby/object:Gem::Version
|
|
571
479
|
version: 0.8.1
|
|
572
|
-
- !ruby/object:Gem::Dependency
|
|
573
|
-
name: unparser
|
|
574
|
-
requirement: !ruby/object:Gem::Requirement
|
|
575
|
-
requirements:
|
|
576
|
-
- - ">="
|
|
577
|
-
- !ruby/object:Gem::Version
|
|
578
|
-
version: '0'
|
|
579
|
-
type: :development
|
|
580
|
-
prerelease: false
|
|
581
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
582
|
-
requirements:
|
|
583
|
-
- - ">="
|
|
584
|
-
- !ruby/object:Gem::Version
|
|
585
|
-
version: '0'
|
|
586
480
|
description: HyperModel gives your HyperComponents CRUD access to your ActiveRecord
|
|
587
481
|
models on the client, using the the standard ActiveRecord API. HyperModel also implements
|
|
588
482
|
push notifications (via a number of possible technologies) so changes to records
|
|
@@ -669,7 +563,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
669
563
|
- !ruby/object:Gem::Version
|
|
670
564
|
version: 1.3.1
|
|
671
565
|
requirements: []
|
|
672
|
-
rubygems_version: 3.0.
|
|
566
|
+
rubygems_version: 3.0.8
|
|
673
567
|
signing_key:
|
|
674
568
|
specification_version: 4
|
|
675
569
|
summary: React based CRUD access and Synchronization of active record models across
|