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

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