hyper-model 1.0.alpha1.5 → 1.0.alpha1.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -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[:id]).backing_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[:id] = record.id if record.id
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[:id])
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
- return if @backing_record&.destroyed
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[:id]
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 == :id ? record[:id] : values.first
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
- if method == "*"
264
- # apply_star does the security check if value is present
265
- cache_item.apply_star || representative
266
- elsif method == "*all"
267
- # if we secure the collection then we assume its okay to read the ids
268
- secured_value = cache_item.value.__secure_collection_check(cache_item)
269
- cache_item.build_new_cache_item(timing(:active_record) { secured_value.collect { |record| record.id } }, method, method)
270
- elsif method == "*count"
271
- secured_value = cache_item.value.__secure_collection_check(cache_item)
272
- cache_item.build_new_cache_item(timing(:active_record) { cache_item.value.__secure_collection_check(cache_item).count }, method, method)
273
- elsif preloaded_value = @preloaded_records[cache_item.absolute_vector + [method]]
274
- # no security check needed since we already evaluated this
275
- cache_item.build_new_cache_item(preloaded_value, method, method)
276
- elsif aggregation = cache_item.aggregation?(method)
277
- # aggregations are not protected
278
- cache_item.build_new_cache_item(aggregation.mapping.collect { |attribute, accessor| cache_item.value[attribute] }, method, method)
279
- else
280
- if !cache_item.value || cache_item.value.is_a?(Array)
281
- # seeing as we just returning representative, no check is needed (its already checked)
282
- representative
283
- elsif method == 'model_name'
284
- cache_item.build_new_cache_item(timing(:active_record) { cache_item.value.model_name }, method, method)
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
- begin
287
- secured_method = "__secure_remote_access_to_#{[*method].first}"
288
-
289
- # order is important. This check must be first since scopes can have same name as attributes!
290
- if cache_item.value.respond_to? secured_method
291
- 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)
292
- 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...
293
- cache_item.value.check_permission_with_acting_user(@acting_user, :view_permitted?, method)
294
- cache_item.build_new_cache_item(timing(:active_record) { cache_item.value.send(*method) }, method, method)
295
- else
296
- raise "Method missing while fetching data: \`#{cache_item.value}##{[*method].first}\` "\
297
- 'should either be an attribute or a method defined using the server_method of finder_method macros.'
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["id"] and id_value.is_a? Array
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.set_count_state(value.first)
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
- # we cannot use target.send "#{method}=" here because it might be a server method, which does not have a setter
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.5
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: 2019-06-19 00:00:00.000000000 Z
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.5
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.5
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: 1.17.3
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: 1.17.3
87
- - - "<"
88
- - !ruby/object:Gem::Version
89
- version: '2.1'
69
+ version: '0'
90
70
  - !ruby/object:Gem::Dependency
91
- name: capybara
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: chromedriver-helper
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: mini_racer
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: '0'
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: '0'
111
+ version: 1.0.alpha1.6
160
112
  - !ruby/object:Gem::Dependency
161
- name: database_cleaner
113
+ name: hyper-trace
162
114
  requirement: !ruby/object:Gem::Requirement
163
115
  requirements:
164
- - - ">="
116
+ - - '='
165
117
  - !ruby/object:Gem::Version
166
- version: '0'
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: '0'
125
+ version: 1.0.alpha1.6
174
126
  - !ruby/object:Gem::Dependency
175
- name: factory_bot_rails
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: mysql2
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
- - !ruby/object:Gem::Dependency
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: '0'
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-rescue
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: 4.0.0
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: 4.0.0
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: '0'
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: '0'
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.3.6
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.3.6
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.4
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