hyper-model 1.0.alpha1.3 → 1.0.alpha1.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -5,7 +5,7 @@ module ReactiveRecord
5
5
  def get_belongs_to(assoc, reload = nil)
6
6
  getter_common(assoc.attribute, reload) do |has_key, attr|
7
7
  return if new?
8
- value = Base.fetch_from_db([@model, [:find, id], attr, @model.primary_key]) if id.present?
8
+ value = fetch_by_id(attr, @model.primary_key) if id.present?
9
9
  value = find_association(assoc, value)
10
10
  sync_ignore_dummy attr, value, has_key
11
11
  end&.cast_to_current_sti_type
@@ -77,8 +77,13 @@ module ReactiveRecord
77
77
  elsif on_opal_client?
78
78
  sync_ignore_dummy attr, Base.load_from_db(self, *(vector ? vector : [nil]), attr), has_key
79
79
  elsif id.present?
80
- sync_attribute attr, Base.fetch_from_db([@model, [:find, id], attr])
80
+ sync_attribute attr, fetch_by_id(attr)
81
81
  else
82
+ # Not sure how to test this branch, it may never execute this line?
83
+ # If we are on opal_server then we should always be getting an id before getting here
84
+ # but if we do vector might not be set up properly to fetch the attribute
85
+ puts "*** Syncing attribute in getters.rb without an id. This may cause problems. ***"
86
+ puts "*** Report this to hyperstack.org if you see this message: vector = #{[*vector, attr]}"
82
87
  sync_attribute attr, Base.fetch_from_db([*vector, attr])
83
88
  end
84
89
  end
@@ -129,5 +134,9 @@ module ReactiveRecord
129
134
  self.aggregate_attribute = attr
130
135
  @ar_instance
131
136
  end
137
+
138
+ def fetch_by_id(*vector)
139
+ Base.fetch_from_db([@model, *find_by_vector(@model.primary_key => id), *vector])
140
+ end
132
141
  end
133
142
  end
@@ -47,6 +47,15 @@ module ReactiveRecord
47
47
  self.class.instance_variable_get(:@records)
48
48
  end
49
49
 
50
+ # constructs vector for find_by
51
+ def self.find_by_vector(attrs)
52
+ [:all, [:___hyperstack_internal_scoped_find_by, attrs], '*0']
53
+ end
54
+
55
+ def find_by_vector(attrs)
56
+ self.class.find_by_vector(attrs)
57
+ end
58
+
50
59
  # Prerendering db access (returns nil if on client):
51
60
  # at end of prerendering dumps all accessed records in the footer
52
61
 
@@ -58,7 +67,9 @@ module ReactiveRecord
58
67
 
59
68
  isomorphic_method(:find_in_db) do |f, klass, attrs|
60
69
  f.send_to_server klass.name, attrs if RUBY_ENGINE == 'opal'
61
- f.when_on_server { @server_data_cache[klass, ['find_by', attrs], 'id'] }
70
+ f.when_on_server do
71
+ @server_data_cache[klass, *find_by_vector(attrs), 'id']
72
+ end
62
73
  end
63
74
 
64
75
  class << self
@@ -325,8 +336,6 @@ module ReactiveRecord
325
336
  elsif method.is_a? Array #__secure_remote_access_to_
326
337
  if method[0] == 'new'
327
338
  object.new
328
- elsif method[0] == 'find_by'
329
- object.send(*method)
330
339
  else
331
340
  object.send(:"__secure_remote_access_to_#{method[0]}", object, acting_user, *method[1..-1])
332
341
  end
@@ -337,7 +346,11 @@ module ReactiveRecord
337
346
  end
338
347
  end
339
348
  if id and (found.nil? or !(found.class <= model) or (found.id and found.id.to_s != id.to_s))
340
- raise "Inconsistent data sent to server - #{model.name}.find(#{id}) != [#{vector}]"
349
+ # TODO: the one case that this is okay is when we are doing a find(some_id) which
350
+ # does not exist. So the above check needs to deal with that if possible,
351
+ # otherwise we can just skip this check, as it was put in sometime back for
352
+ # debugging purposes, and is perhaps not necessary anymore
353
+ #raise "Inconsistent data sent to server - #{model.name}.find(#{id}) != [#{vector}]"
341
354
  end
342
355
  found
343
356
  elsif id
@@ -528,7 +541,7 @@ module ReactiveRecord
528
541
 
529
542
  promise = Promise.new
530
543
 
531
- if !data_loading? and (id or vector)
544
+ if !data_loading? && (id || vector)
532
545
  Operations::Destroy.run(model: ar_instance.model_name.to_s, id: id, vector: vector)
533
546
  .then do |response|
534
547
  Broadcast.to_self ar_instance
@@ -9,10 +9,10 @@ module ReactiveRecord
9
9
  def set_pre_sync_related_records(related_records, _record = nil)
10
10
  @pre_sync_related_records = nil
11
11
  ReactiveRecord::Base.catch_db_requests do
12
- puts "#{self}.set_pre_sync_related_records filter_records(#{related_records})"
12
+ # puts "#{self}.set_pre_sync_related_records filter_records(#{related_records})"
13
13
 
14
14
  @pre_sync_related_records = filter_records(related_records)
15
- puts "returns #{@pre_sync_related_records}"
15
+ # puts "returns #{@pre_sync_related_records}"
16
16
  live_scopes.each do |scope|
17
17
  scope.set_pre_sync_related_records(@pre_sync_related_records)
18
18
  end
@@ -35,9 +35,7 @@ module ReactiveRecord
35
35
  if collector?
36
36
  update_collector_scope(related_records)
37
37
  else
38
- puts "#{self}.update_collection calling filter_records(#{related_records})"
39
38
  related_records = filter_records(related_records)
40
- puts "returns #{related_records}"
41
39
  update_filter_scope(@pre_sync_related_records, related_records)
42
40
  end
43
41
  end
@@ -46,8 +44,7 @@ module ReactiveRecord
46
44
  current = Set.new([*@collection])
47
45
  (related_records - @pre_sync_related_records).each { |r| current << r }
48
46
  (@pre_sync_related_records - related_records).each { |r| current.delete(r) }
49
- puts "#{self}.update_collector_scope calling replace(filter_records(#{current}))"
50
- replace(filter_records(current).tap { |rr| puts "returns #{rr}" })
47
+ replace(filter_records(current))
51
48
  Set.new([*@collection])
52
49
  end
53
50
 
@@ -63,7 +63,7 @@ module ReactiveRecord
63
63
  ReactiveRecord::Collection.sync_scopes broadcast.process_previous_changes
64
64
  end
65
65
  end
66
- end
66
+ end if RUBY_ENGINE == 'opal'
67
67
 
68
68
  def self.to_self(record, data = {})
69
69
  # simulate incoming packet after a local save
@@ -145,11 +145,6 @@ module ReactiveRecord
145
145
  record.backing_record.destroyed = @destroyed
146
146
  @backing_record = record.backing_record
147
147
  @previous_changes = record.changes
148
- # attributes = record.attributes
149
- # data.each do |k, v|
150
- # next if klass.reflect_on_association(k) || attributes[k] == v
151
- # @previous_changes[k] = [attributes[k], v]
152
- # end
153
148
  self
154
149
  end
155
150
 
@@ -162,7 +157,26 @@ module ReactiveRecord
162
157
  @previous_changes.merge! params.previous_changes
163
158
  ReactiveRecord::Base.when_not_saving(klass) do
164
159
  @backing_record = ReactiveRecord::Base.exists?(klass, params.record[:id])
165
- @is_new = params.operation == :create && !@backing_record
160
+
161
+ # first check to see if we already destroyed it and if so exit the block
162
+ return if @backing_record&.destroyed
163
+
164
+ # We ignore whether the record is being created or not, and just check and see if in our
165
+ # local copy we have ever loaded this id before. If we have then its not new to us.
166
+ # BUT if we are destroying a record then it can't be treated as new regardless.
167
+ # This is because we might be just doing a count on a scope and so no actual records will
168
+ # exist. Treating a destroyed record as "new" would cause us to first increment the
169
+ # scope counter and then decrement for the destroy, resulting in a nop instead of a -1 on
170
+ # the scope count.
171
+ @is_new = !@backing_record&.id_loaded? && !@destroyed
172
+
173
+ # it is possible that we are recieving data on a record for which we are also waiting
174
+ # on an an inital data load in which case we have not yet set the loaded id, so we
175
+ # set if now.
176
+ @backing_record&.loaded_id = params.record[:id]
177
+
178
+ # once we have received all the data from all the channels (applies to create and update only)
179
+ # we yield and process the record
166
180
  yield complete! if @channels == @received
167
181
  end
168
182
  end
@@ -219,7 +233,6 @@ module ReactiveRecord
219
233
  end
220
234
  [attr, value]
221
235
  end.compact.flatten(1)]
222
- # TODO: verify - it used to be current_values.merge(br.attributes)
223
236
  klass._react_param_conversion(br.attributes.merge(current_values))
224
237
  end
225
238
  end
@@ -90,7 +90,7 @@ class ActiveRecord::Base
90
90
  def belongs_to(attr_name, *args)
91
91
  belongs_to_without_reactive_record_add_is_method(attr_name, *args).tap do
92
92
  define_method "#{attr_name}_is?".to_sym do |model|
93
- self.class.reflections[attr_name.to_s].foreign_key == model.id
93
+ attributes[self.class.reflections[attr_name.to_s].foreign_key] == model.id
94
94
  end
95
95
  end
96
96
  end
@@ -291,9 +291,11 @@ module ReactiveRecord
291
291
  cache_item.value.check_permission_with_acting_user(@acting_user, :view_permitted?, method)
292
292
  cache_item.build_new_cache_item(timing(:active_record) { cache_item.value.send(*method) }, method, method)
293
293
  else
294
- raise "method missing"
294
+ raise "Method missing while fetching data: \`#{cache_item.value}##{[*method].first}\` "\
295
+ 'should either be an attribute or a method defined using the server_method of finder_method macros.'
295
296
  end
296
297
  # rescue Exception => e # this check may no longer be needed as we are quite explicit now on which methods we apply
298
+ # binding.pry
297
299
  # # ReactiveRecord::Pry::rescued(e)
298
300
  # #::Rails.logger.debug "\033[0;31;1mERROR: HyperModel exception caught when applying #{method} to db object #{cache_item.value}: #{e}\033[0;30;21m"
299
301
  # raise e, "HyperModel fetching records failed, exception caught when applying #{method} to db object #{cache_item.value}: #{e}", e.backtrace
@@ -378,6 +380,8 @@ module ReactiveRecord
378
380
  if method == "*"
379
381
  if @value.is_a? Array # this happens when a scope is empty there is test case, but
380
382
  @parent.as_hash({}) # does it work for all edge cases?
383
+ elsif (@value.class < ActiveRecord::Base) && children.is_a?(Hash)
384
+ @parent.as_hash({@value.id => merge_inheritance_column(children)})
381
385
  else
382
386
  @parent.as_hash({@value.id => children})
383
387
  end
@@ -431,14 +435,20 @@ keys:
431
435
  if value is a hash
432
436
  =end
433
437
 
434
-
435
438
  def self.load_from_json(tree, target = nil)
436
-
437
439
  # have to process *all before any other items
438
440
  # we leave the "*all" key in just for debugging purposes, and then skip it below
439
441
 
440
442
  if sorted_collection = tree["*all"]
441
- target.replace sorted_collection.collect { |id| target.proxy_association.klass.find(id) }
443
+ loaded_collection = sorted_collection.collect do |id|
444
+ ReactiveRecord::Base.find_by_id(target.proxy_association.klass, id)
445
+ end
446
+ if loaded_collection[0] && target.scope_description&.name == '___hyperstack_internal_scoped_find_by'
447
+ primary_key = target.proxy_association.klass.primary_key
448
+ attrs = target.vector[-1][1].reject { |key, _| key == primary_key }
449
+ loaded_collection[0].backing_record.sync_attributes(attrs)
450
+ end
451
+ target.replace loaded_collection
442
452
  end
443
453
 
444
454
  if id_value = tree["id"] and id_value.is_a? Array
@@ -456,14 +466,13 @@ keys:
456
466
  target.set_count_state(value.first)
457
467
  elsif method.is_a? Integer or method =~ /^[0-9]+$/
458
468
  new_target = target.push_and_update_belongs_to(method)
459
- #target << (new_target = target.proxy_association.klass.find(method))
460
469
  elsif method.is_a? Array
461
470
  if method[0] == "new"
462
471
  new_target = ReactiveRecord::Base.lookup_by_object_id(method[1])
463
472
  elsif !(target.class < ActiveRecord::Base)
464
473
  new_target = target.send(*method)
465
474
  # value is an array if scope returns nil, so we destroy the bogus record
466
- new_target.destroy and new_target = nil if value.is_a? Array
475
+ new_target.destroy && (new_target = nil) if value.is_a? Array
467
476
  else
468
477
  target.backing_record.update_simple_attribute([method], target.backing_record.convert(method, value.first))
469
478
  end
@@ -479,7 +488,7 @@ keys:
479
488
  target.backing_record.set_attr_value(method, value.first) unless method == :id
480
489
  elsif value.is_a? Hash and value[:id] and value[:id].first and association = target.class.reflect_on_association(method)
481
490
  # 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?
482
- new_target = association.klass.find(value[:id].first)
491
+ new_target = ReactiveRecord::Base.find_by_id(association.klass, value[:id].first)
483
492
  target.send "#{method}=", new_target
484
493
  elsif !(target.class < ActiveRecord::Base)
485
494
  new_target = target.send(*method)
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.3
4
+ version: 1.0.alpha1.4
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-01-17 00:00:00.000000000 Z
12
+ date: 2019-02-16 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activemodel
@@ -45,28 +45,28 @@ dependencies:
45
45
  requirements:
46
46
  - - '='
47
47
  - !ruby/object:Gem::Version
48
- version: 1.0.alpha1.3
48
+ version: 1.0.alpha1.4
49
49
  type: :runtime
50
50
  prerelease: false
51
51
  version_requirements: !ruby/object:Gem::Requirement
52
52
  requirements:
53
53
  - - '='
54
54
  - !ruby/object:Gem::Version
55
- version: 1.0.alpha1.3
55
+ version: 1.0.alpha1.4
56
56
  - !ruby/object:Gem::Dependency
57
57
  name: hyper-operation
58
58
  requirement: !ruby/object:Gem::Requirement
59
59
  requirements:
60
60
  - - '='
61
61
  - !ruby/object:Gem::Version
62
- version: 1.0.alpha1.3
62
+ version: 1.0.alpha1.4
63
63
  type: :runtime
64
64
  prerelease: false
65
65
  version_requirements: !ruby/object:Gem::Requirement
66
66
  requirements:
67
67
  - - '='
68
68
  - !ruby/object:Gem::Version
69
- version: 1.0.alpha1.3
69
+ version: 1.0.alpha1.4
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: bundler
72
72
  requirement: !ruby/object:Gem::Requirement
@@ -545,16 +545,16 @@ dependencies:
545
545
  name: sqlite3
546
546
  requirement: !ruby/object:Gem::Requirement
547
547
  requirements:
548
- - - ">="
548
+ - - "~>"
549
549
  - !ruby/object:Gem::Version
550
- version: '0'
550
+ version: 1.3.6
551
551
  type: :development
552
552
  prerelease: false
553
553
  version_requirements: !ruby/object:Gem::Requirement
554
554
  requirements:
555
- - - ">="
555
+ - - "~>"
556
556
  - !ruby/object:Gem::Version
557
- version: '0'
557
+ version: 1.3.6
558
558
  - !ruby/object:Gem::Dependency
559
559
  name: timecop
560
560
  requirement: !ruby/object:Gem::Requirement
@@ -598,7 +598,6 @@ files:
598
598
  - ".rspec"
599
599
  - ".travis.yml"
600
600
  - Gemfile
601
- - Gemfile.lock
602
601
  - Rakefile
603
602
  - bin/console
604
603
  - bin/setup
@@ -1,440 +0,0 @@
1
- PATH
2
- remote: ../hyper-component
3
- specs:
4
- hyper-component (1.0.alpha1.3)
5
- hyper-state (= 1.0.alpha1.3)
6
- hyperstack-config (= 1.0.alpha1.3)
7
- libv8 (~> 6.7.0)
8
- mini_racer (~> 0.2.4)
9
- opal (>= 0.11.0, < 0.12.0)
10
- opal-activesupport (~> 0.3.1)
11
- react-rails (>= 2.4.0, < 2.5.0)
12
-
13
- PATH
14
- remote: ../hyper-operation
15
- specs:
16
- hyper-operation (1.0.alpha1.3)
17
- activerecord (>= 4.0.0)
18
- hyper-component (= 1.0.alpha1.3)
19
- mutations
20
- opal-activesupport (~> 0.3.1)
21
- tty-table
22
-
23
- PATH
24
- remote: ../hyper-state
25
- specs:
26
- hyper-state (1.0.alpha1.3)
27
- hyperstack-config (= 1.0.alpha1.3)
28
- opal (>= 0.11.0, < 0.12.0)
29
-
30
- PATH
31
- remote: ../hyperstack-config
32
- specs:
33
- hyperstack-config (1.0.alpha1.3)
34
- listen (~> 3.0)
35
- mini_racer (~> 0.2.4)
36
- opal (>= 0.11.0, < 0.12.0)
37
- opal-browser (~> 0.2.0)
38
- uglifier
39
- websocket
40
-
41
- PATH
42
- remote: .
43
- specs:
44
- hyper-model (1.0.alpha1.3)
45
- activemodel
46
- activerecord (>= 4.0.0)
47
- hyper-component (= 1.0.alpha1.3)
48
- hyper-operation (= 1.0.alpha1.3)
49
-
50
- GEM
51
- remote: https://rubygems.org/
52
- specs:
53
- abstract_type (0.0.7)
54
- actioncable (5.2.1)
55
- actionpack (= 5.2.1)
56
- nio4r (~> 2.0)
57
- websocket-driver (>= 0.6.1)
58
- actionmailer (5.2.1)
59
- actionpack (= 5.2.1)
60
- actionview (= 5.2.1)
61
- activejob (= 5.2.1)
62
- mail (~> 2.5, >= 2.5.4)
63
- rails-dom-testing (~> 2.0)
64
- actionpack (5.2.1)
65
- actionview (= 5.2.1)
66
- activesupport (= 5.2.1)
67
- rack (~> 2.0)
68
- rack-test (>= 0.6.3)
69
- rails-dom-testing (~> 2.0)
70
- rails-html-sanitizer (~> 1.0, >= 1.0.2)
71
- actionview (5.2.1)
72
- activesupport (= 5.2.1)
73
- builder (~> 3.1)
74
- erubi (~> 1.4)
75
- rails-dom-testing (~> 2.0)
76
- rails-html-sanitizer (~> 1.0, >= 1.0.3)
77
- activejob (5.2.1)
78
- activesupport (= 5.2.1)
79
- globalid (>= 0.3.6)
80
- activemodel (5.2.1)
81
- activesupport (= 5.2.1)
82
- activerecord (5.2.1)
83
- activemodel (= 5.2.1)
84
- activesupport (= 5.2.1)
85
- arel (>= 9.0)
86
- activestorage (5.2.1)
87
- actionpack (= 5.2.1)
88
- activerecord (= 5.2.1)
89
- marcel (~> 0.3.1)
90
- activesupport (5.2.1)
91
- concurrent-ruby (~> 1.0, >= 1.0.2)
92
- i18n (>= 0.7, < 2)
93
- minitest (~> 5.1)
94
- tzinfo (~> 1.1)
95
- adamantium (0.2.0)
96
- ice_nine (~> 0.11.0)
97
- memoizable (~> 0.4.0)
98
- addressable (2.5.2)
99
- public_suffix (>= 2.0.2, < 4.0)
100
- archive-zip (0.11.0)
101
- io-like (~> 0.3.0)
102
- arel (9.0.0)
103
- ast (2.4.0)
104
- babel-source (5.8.35)
105
- babel-transpiler (0.7.0)
106
- babel-source (>= 4.0, < 6)
107
- execjs (~> 2.0)
108
- builder (3.2.3)
109
- capybara (3.7.2)
110
- addressable
111
- mini_mime (>= 0.1.3)
112
- nokogiri (~> 1.8)
113
- rack (>= 1.6.0)
114
- rack-test (>= 0.6.3)
115
- xpath (~> 3.1)
116
- childprocess (0.9.0)
117
- ffi (~> 1.0, >= 1.0.11)
118
- chromedriver-helper (1.2.0)
119
- archive-zip (~> 0.10)
120
- nokogiri (~> 1.8)
121
- coderay (1.1.2)
122
- concord (0.1.5)
123
- adamantium (~> 0.2.0)
124
- equalizer (~> 0.0.9)
125
- concurrent-ruby (1.0.5)
126
- connection_pool (2.2.2)
127
- cookiejar (0.3.3)
128
- crass (1.0.4)
129
- daemons (1.2.6)
130
- database_cleaner (1.7.0)
131
- diff-lcs (1.3)
132
- em-http-request (1.1.5)
133
- addressable (>= 2.3.4)
134
- cookiejar (!= 0.3.1)
135
- em-socksify (>= 0.3)
136
- eventmachine (>= 1.0.3)
137
- http_parser.rb (>= 0.6.0)
138
- em-socksify (0.3.2)
139
- eventmachine (>= 1.0.0.beta.4)
140
- em-websocket (0.5.1)
141
- eventmachine (>= 0.12.9)
142
- http_parser.rb (~> 0.6.0)
143
- equalizer (0.0.11)
144
- equatable (0.5.0)
145
- erubi (1.7.1)
146
- eventmachine (1.2.7)
147
- execjs (2.7.0)
148
- factory_bot (4.11.1)
149
- activesupport (>= 3.0.0)
150
- factory_bot_rails (4.11.1)
151
- factory_bot (~> 4.11.1)
152
- railties (>= 3.0.0)
153
- ffi (1.9.25)
154
- globalid (0.4.1)
155
- activesupport (>= 4.2.0)
156
- hike (1.2.3)
157
- http_parser.rb (0.6.0)
158
- httpclient (2.8.3)
159
- i18n (1.1.0)
160
- concurrent-ruby (~> 1.0)
161
- ice_nine (0.11.2)
162
- interception (0.5)
163
- io-like (0.3.0)
164
- jquery-rails (4.3.3)
165
- rails-dom-testing (>= 1, < 3)
166
- railties (>= 4.2.0)
167
- thor (>= 0.14, < 2.0)
168
- libv8 (6.7.288.46.1)
169
- listen (3.1.5)
170
- rb-fsevent (~> 0.9, >= 0.9.4)
171
- rb-inotify (~> 0.9, >= 0.9.7)
172
- ruby_dep (~> 1.2)
173
- loofah (2.2.2)
174
- crass (~> 1.0.2)
175
- nokogiri (>= 1.5.9)
176
- mail (2.7.0)
177
- mini_mime (>= 0.1.1)
178
- marcel (0.3.2)
179
- mimemagic (~> 0.3.2)
180
- memoizable (0.4.2)
181
- thread_safe (~> 0.3, >= 0.3.1)
182
- method_source (0.9.0)
183
- mimemagic (0.3.2)
184
- mini_mime (1.0.1)
185
- mini_portile2 (2.3.0)
186
- mini_racer (0.2.4)
187
- libv8 (>= 6.3)
188
- minitest (5.11.3)
189
- multi_json (1.13.1)
190
- mutations (0.8.3)
191
- activesupport
192
- mysql2 (0.5.2)
193
- necromancer (0.4.0)
194
- nio4r (2.3.1)
195
- nokogiri (1.8.4)
196
- mini_portile2 (~> 2.3.0)
197
- opal (0.11.3)
198
- ast (>= 2.3.0)
199
- hike (~> 1.2)
200
- parser (= 2.3.3.1)
201
- sourcemap (~> 0.1.0)
202
- opal-activesupport (0.3.1)
203
- opal (>= 0.5.0, < 1.0.0)
204
- opal-browser (0.2.0)
205
- opal
206
- paggio
207
- opal-jquery (0.4.3)
208
- opal (>= 0.10.0, < 0.12.0)
209
- opal-rails (0.9.5)
210
- jquery-rails
211
- opal (>= 0.11.0, < 0.12)
212
- opal-activesupport (>= 0.0.5)
213
- opal-jquery (~> 0.4.0)
214
- opal-sprockets (~> 0.4.2)
215
- rails (>= 4.1, < 6.0)
216
- sprockets-rails (>= 2.3.3, < 4.0)
217
- opal-sprockets (0.4.2.0.11.0.3.1)
218
- opal (~> 0.11.0)
219
- sprockets (~> 3.1)
220
- tilt (>= 1.4)
221
- paggio (0.2.6)
222
- parallel (1.12.1)
223
- parser (2.3.3.1)
224
- ast (~> 2.2)
225
- pastel (0.7.2)
226
- equatable (~> 0.5.0)
227
- tty-color (~> 0.4.0)
228
- powerpack (0.1.2)
229
- procto (0.0.3)
230
- pry (0.11.3)
231
- coderay (~> 1.1.0)
232
- method_source (~> 0.9.0)
233
- pry-rescue (1.4.5)
234
- interception (>= 0.5)
235
- pry
236
- public_suffix (3.0.3)
237
- puma (3.12.0)
238
- pusher (1.3.1)
239
- httpclient (~> 2.7)
240
- multi_json (~> 1.0)
241
- pusher-signature (~> 0.1.8)
242
- pusher-fake (1.10.0)
243
- em-http-request (~> 1.1)
244
- em-websocket (~> 0.5)
245
- multi_json (~> 1.6)
246
- thin (~> 1.5)
247
- pusher-signature (0.1.8)
248
- rack (2.0.5)
249
- rack-test (1.1.0)
250
- rack (>= 1.0, < 3)
251
- rails (5.2.1)
252
- actioncable (= 5.2.1)
253
- actionmailer (= 5.2.1)
254
- actionpack (= 5.2.1)
255
- actionview (= 5.2.1)
256
- activejob (= 5.2.1)
257
- activemodel (= 5.2.1)
258
- activerecord (= 5.2.1)
259
- activestorage (= 5.2.1)
260
- activesupport (= 5.2.1)
261
- bundler (>= 1.3.0)
262
- railties (= 5.2.1)
263
- sprockets-rails (>= 2.0.0)
264
- rails-dom-testing (2.0.3)
265
- activesupport (>= 4.2.0)
266
- nokogiri (>= 1.6)
267
- rails-html-sanitizer (1.0.4)
268
- loofah (~> 2.2, >= 2.2.2)
269
- railties (5.2.1)
270
- actionpack (= 5.2.1)
271
- activesupport (= 5.2.1)
272
- method_source
273
- rake (>= 0.8.7)
274
- thor (>= 0.19.0, < 2.0)
275
- rainbow (2.2.2)
276
- rake
277
- rake (12.3.1)
278
- rb-fsevent (0.10.3)
279
- rb-inotify (0.10.0)
280
- ffi (~> 1.0)
281
- react-rails (2.4.7)
282
- babel-transpiler (>= 0.7.0)
283
- connection_pool
284
- execjs
285
- railties (>= 3.2)
286
- tilt
287
- reactrb-rails-generator (0.2.0)
288
- rails (>= 4.0.0)
289
- rspec (3.8.0)
290
- rspec-core (~> 3.8.0)
291
- rspec-expectations (~> 3.8.0)
292
- rspec-mocks (~> 3.8.0)
293
- rspec-collection_matchers (1.1.3)
294
- rspec-expectations (>= 2.99.0.beta1)
295
- rspec-core (3.8.0)
296
- rspec-support (~> 3.8.0)
297
- rspec-expectations (3.8.1)
298
- diff-lcs (>= 1.2.0, < 2.0)
299
- rspec-support (~> 3.8.0)
300
- rspec-its (1.2.0)
301
- rspec-core (>= 3.0.0)
302
- rspec-expectations (>= 3.0.0)
303
- rspec-mocks (3.8.0)
304
- diff-lcs (>= 1.2.0, < 2.0)
305
- rspec-support (~> 3.8.0)
306
- rspec-rails (3.8.0)
307
- actionpack (>= 3.0)
308
- activesupport (>= 3.0)
309
- railties (>= 3.0)
310
- rspec-core (~> 3.8.0)
311
- rspec-expectations (~> 3.8.0)
312
- rspec-mocks (~> 3.8.0)
313
- rspec-support (~> 3.8.0)
314
- rspec-steps (2.1.1)
315
- rspec (>= 3.0, < 3.99)
316
- rspec-support (3.8.0)
317
- rspec-wait (0.0.9)
318
- rspec (>= 3, < 4)
319
- rubocop (0.51.0)
320
- parallel (~> 1.10)
321
- parser (>= 2.3.3.1, < 3.0)
322
- powerpack (~> 0.1)
323
- rainbow (>= 2.2.2, < 3.0)
324
- ruby-progressbar (~> 1.7)
325
- unicode-display_width (~> 1.0, >= 1.0.1)
326
- ruby-progressbar (1.10.0)
327
- ruby_dep (1.5.0)
328
- rubyzip (1.2.2)
329
- selenium-webdriver (3.14.0)
330
- childprocess (~> 0.5)
331
- rubyzip (~> 1.2)
332
- shoulda (3.6.0)
333
- shoulda-context (~> 1.0, >= 1.0.1)
334
- shoulda-matchers (~> 3.0)
335
- shoulda-context (1.2.2)
336
- shoulda-matchers (3.1.2)
337
- activesupport (>= 4.0.0)
338
- sourcemap (0.1.1)
339
- spring (2.0.2)
340
- activesupport (>= 4.2)
341
- spring-commands-rspec (1.0.4)
342
- spring (>= 0.9.1)
343
- sprockets (3.7.2)
344
- concurrent-ruby (~> 1.0)
345
- rack (> 1, < 3)
346
- sprockets-rails (3.2.1)
347
- actionpack (>= 4.0)
348
- activesupport (>= 4.0)
349
- sprockets (>= 3.0.0)
350
- sqlite3 (1.3.13)
351
- strings (0.1.4)
352
- strings-ansi (~> 0.1.0)
353
- unicode-display_width (~> 1.4.0)
354
- unicode_utils (~> 1.4.0)
355
- strings-ansi (0.1.0)
356
- thin (1.7.2)
357
- daemons (~> 1.0, >= 1.0.9)
358
- eventmachine (~> 1.0, >= 1.0.4)
359
- rack (>= 1, < 3)
360
- thor (0.20.0)
361
- thread_safe (0.3.6)
362
- tilt (2.0.8)
363
- timecop (0.8.1)
364
- tty-color (0.4.3)
365
- tty-screen (0.6.5)
366
- tty-table (0.10.0)
367
- equatable (~> 0.5.0)
368
- necromancer (~> 0.4.0)
369
- pastel (~> 0.7.2)
370
- strings (~> 0.1.0)
371
- tty-screen (~> 0.6.4)
372
- tzinfo (1.2.5)
373
- thread_safe (~> 0.1)
374
- uglifier (4.1.20)
375
- execjs (>= 0.3.0, < 3)
376
- unicode-display_width (1.4.0)
377
- unicode_utils (1.4.0)
378
- unparser (0.2.8)
379
- abstract_type (~> 0.0.7)
380
- adamantium (~> 0.2.0)
381
- concord (~> 0.1.5)
382
- diff-lcs (~> 1.3)
383
- equalizer (~> 0.0.9)
384
- parser (>= 2.3.1.2, < 2.6)
385
- procto (~> 0.0.2)
386
- websocket (1.2.8)
387
- websocket-driver (0.7.0)
388
- websocket-extensions (>= 0.1.0)
389
- websocket-extensions (0.1.3)
390
- xpath (3.1.0)
391
- nokogiri (~> 1.8)
392
-
393
- PLATFORMS
394
- ruby
395
-
396
- DEPENDENCIES
397
- bundler (>= 1.17.3, < 2.1)
398
- capybara
399
- chromedriver-helper (= 1.2.0)
400
- database_cleaner
401
- factory_bot_rails
402
- hyper-component!
403
- hyper-model!
404
- hyper-operation!
405
- hyper-state!
406
- hyperstack-config!
407
- libv8
408
- mini_racer (~> 0.2.4)
409
- mysql2
410
- opal-activesupport (~> 0.3.1)
411
- opal-browser (~> 0.2.0)
412
- opal-rails (~> 0.9.4)
413
- parser
414
- pry
415
- pry-rescue
416
- puma
417
- pusher
418
- pusher-fake
419
- rails (>= 4.0.0)
420
- rake
421
- react-rails (>= 2.4.0, < 2.5.0)
422
- reactrb-rails-generator
423
- rspec-collection_matchers
424
- rspec-expectations
425
- rspec-its
426
- rspec-mocks
427
- rspec-rails
428
- rspec-steps (~> 2.1.1)
429
- rspec-wait
430
- rubocop (~> 0.51.0)
431
- selenium-webdriver
432
- shoulda
433
- shoulda-matchers
434
- spring-commands-rspec
435
- sqlite3
436
- timecop (~> 0.8.1)
437
- unparser
438
-
439
- BUNDLED WITH
440
- 2.0.1