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.
@@ -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