hyper-mesh 0.5.2 → 0.5.3

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.
Files changed (203) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +34 -0
  3. data/README.md +10 -11
  4. data/docs/activerecord_api.md +55 -39
  5. data/docs/authorization-policies.md +62 -19
  6. data/docs/client_side_scoping.md +1 -1
  7. data/docs/word_game.md +26 -0
  8. data/examples/action-cable-production-mode/.gitignore +21 -0
  9. data/examples/action-cable-production-mode/Gemfile +57 -0
  10. data/examples/action-cable-production-mode/Gemfile.lock +231 -0
  11. data/examples/action-cable-production-mode/README.md +24 -0
  12. data/examples/action-cable-production-mode/Rakefile +6 -0
  13. data/examples/action-cable-production-mode/app/assets/config/manifest.js +3 -0
  14. data/examples/action-cable-production-mode/app/assets/images/.keep +0 -0
  15. data/examples/action-cable-production-mode/app/assets/javascripts/application.js +20 -0
  16. data/examples/action-cable-production-mode/app/assets/javascripts/cable.js +13 -0
  17. data/examples/action-cable-production-mode/app/assets/javascripts/channels/.keep +0 -0
  18. data/examples/action-cable-production-mode/app/assets/stylesheets/application.css +15 -0
  19. data/examples/action-cable-production-mode/app/channels/application_cable/channel.rb +4 -0
  20. data/examples/action-cable-production-mode/app/channels/application_cable/connection.rb +4 -0
  21. data/examples/action-cable-production-mode/app/controllers/application_controller.rb +3 -0
  22. data/examples/action-cable-production-mode/app/controllers/test_controller.rb +5 -0
  23. data/examples/action-cable-production-mode/app/models/models.rb +2 -0
  24. data/examples/action-cable-production-mode/app/models/public/application_record.rb +3 -0
  25. data/examples/action-cable-production-mode/app/models/public/word.rb +2 -0
  26. data/examples/action-cable-production-mode/app/policies/application_policy.rb +14 -0
  27. data/examples/action-cable-production-mode/app/views/components.rb +16 -0
  28. data/examples/action-cable-production-mode/app/views/components/app.rb +18 -0
  29. data/examples/action-cable-production-mode/app/views/layouts/application.html.erb +14 -0
  30. data/examples/action-cable-production-mode/bin/bundle +3 -0
  31. data/examples/action-cable-production-mode/bin/rails +9 -0
  32. data/examples/action-cable-production-mode/bin/rake +9 -0
  33. data/examples/action-cable-production-mode/bin/setup +34 -0
  34. data/examples/action-cable-production-mode/bin/spring +16 -0
  35. data/examples/action-cable-production-mode/bin/update +29 -0
  36. data/examples/action-cable-production-mode/config.ru +5 -0
  37. data/examples/action-cable-production-mode/config/application.rb +18 -0
  38. data/examples/action-cable-production-mode/config/boot.rb +3 -0
  39. data/examples/action-cable-production-mode/config/cable.yml +9 -0
  40. data/examples/action-cable-production-mode/config/database.yml +25 -0
  41. data/examples/action-cable-production-mode/config/environment.rb +5 -0
  42. data/examples/action-cable-production-mode/config/environments/development.rb +56 -0
  43. data/examples/action-cable-production-mode/config/environments/production.rb +89 -0
  44. data/examples/action-cable-production-mode/config/environments/test.rb +42 -0
  45. data/examples/action-cable-production-mode/config/initializers/application_controller_renderer.rb +6 -0
  46. data/examples/action-cable-production-mode/config/initializers/assets.rb +11 -0
  47. data/examples/action-cable-production-mode/config/initializers/backtrace_silencers.rb +7 -0
  48. data/examples/action-cable-production-mode/config/initializers/cookies_serializer.rb +5 -0
  49. data/examples/action-cable-production-mode/config/initializers/filter_parameter_logging.rb +4 -0
  50. data/examples/action-cable-production-mode/config/initializers/hyper_mesh.rb +4 -0
  51. data/examples/action-cable-production-mode/config/initializers/inflections.rb +16 -0
  52. data/examples/action-cable-production-mode/config/initializers/mime_types.rb +4 -0
  53. data/examples/action-cable-production-mode/config/initializers/new_framework_defaults.rb +24 -0
  54. data/examples/action-cable-production-mode/config/initializers/session_store.rb +3 -0
  55. data/examples/action-cable-production-mode/config/initializers/wrap_parameters.rb +14 -0
  56. data/examples/action-cable-production-mode/config/locales/en.yml +23 -0
  57. data/examples/action-cable-production-mode/config/puma.rb +47 -0
  58. data/examples/action-cable-production-mode/config/routes.rb +5 -0
  59. data/examples/action-cable-production-mode/config/secrets.yml +22 -0
  60. data/examples/action-cable-production-mode/config/spring.rb +6 -0
  61. data/examples/action-cable-production-mode/db/migrate/20161114213840_create_words.rb +9 -0
  62. data/examples/action-cable-production-mode/db/schema.rb +34 -0
  63. data/examples/action-cable-production-mode/db/seeds.rb +7 -0
  64. data/examples/action-cable-production-mode/lib/assets/.keep +0 -0
  65. data/examples/action-cable-production-mode/lib/tasks/.keep +0 -0
  66. data/examples/action-cable-production-mode/log/.keep +0 -0
  67. data/examples/action-cable-production-mode/public/404.html +67 -0
  68. data/examples/action-cable-production-mode/public/422.html +67 -0
  69. data/examples/action-cable-production-mode/public/500.html +66 -0
  70. data/examples/action-cable-production-mode/public/apple-touch-icon-precomposed.png +0 -0
  71. data/examples/action-cable-production-mode/public/apple-touch-icon.png +0 -0
  72. data/examples/action-cable-production-mode/public/assets/.sprockets-manifest-3e9abd3ee8ba47c39a55b61ae37ed9e1.json +1 -0
  73. data/examples/action-cable-production-mode/public/assets/application-90043e04e9e784054fd08159fa7aafe5e23d3ffb31584b1bea1e47043c9cfb5a.js +50 -0
  74. data/examples/action-cable-production-mode/public/assets/application-90043e04e9e784054fd08159fa7aafe5e23d3ffb31584b1bea1e47043c9cfb5a.js.gz +0 -0
  75. data/examples/action-cable-production-mode/public/assets/application-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.css +0 -0
  76. data/examples/action-cable-production-mode/public/assets/application-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.css.gz +0 -0
  77. data/examples/action-cable-production-mode/public/favicon.ico +0 -0
  78. data/examples/action-cable-production-mode/public/robots.txt +5 -0
  79. data/examples/action-cable-production-mode/test/controllers/.keep +0 -0
  80. data/examples/action-cable-production-mode/test/fixtures/.keep +0 -0
  81. data/examples/action-cable-production-mode/test/fixtures/files/.keep +0 -0
  82. data/examples/action-cable-production-mode/test/fixtures/words.yml +7 -0
  83. data/examples/action-cable-production-mode/test/helpers/.keep +0 -0
  84. data/examples/action-cable-production-mode/test/integration/.keep +0 -0
  85. data/examples/action-cable-production-mode/test/mailers/.keep +0 -0
  86. data/examples/action-cable-production-mode/test/models/.keep +0 -0
  87. data/examples/action-cable-production-mode/test/models/word_test.rb +7 -0
  88. data/examples/action-cable-production-mode/test/test_helper.rb +10 -0
  89. data/examples/action-cable-production-mode/tmp/.keep +0 -0
  90. data/examples/action-cable-production-mode/vendor/assets/javascripts/.keep +0 -0
  91. data/examples/action-cable-production-mode/vendor/assets/stylesheets/.keep +0 -0
  92. data/examples/action-cable/app/views/layouts/application.html.erb +1 -1
  93. data/examples/pusher-fake/app/views/layouts/application.html.erb +1 -1
  94. data/examples/pusher/app/views/layouts/application.html.erb +1 -1
  95. data/examples/simple-poller/app/views/layouts/application.html.erb +1 -1
  96. data/examples/word-game/.gitignore +21 -0
  97. data/examples/word-game/Gemfile +57 -0
  98. data/examples/word-game/Gemfile.lock +241 -0
  99. data/examples/word-game/README.md +24 -0
  100. data/examples/word-game/Rakefile +6 -0
  101. data/examples/word-game/app/assets/config/manifest.js +3 -0
  102. data/examples/word-game/app/assets/images/.keep +0 -0
  103. data/examples/word-game/app/assets/javascripts/application.js +20 -0
  104. data/examples/word-game/app/assets/javascripts/cable.js +13 -0
  105. data/examples/word-game/app/assets/javascripts/channels/.keep +0 -0
  106. data/examples/word-game/app/assets/stylesheets/application.css +15 -0
  107. data/examples/word-game/app/channels/application_cable/channel.rb +4 -0
  108. data/examples/word-game/app/channels/application_cable/connection.rb +4 -0
  109. data/examples/word-game/app/controllers/application_controller.rb +3 -0
  110. data/examples/word-game/app/controllers/concerns/.keep +0 -0
  111. data/examples/word-game/app/helpers/application_helper.rb +2 -0
  112. data/examples/word-game/app/jobs/application_job.rb +2 -0
  113. data/examples/word-game/app/mailers/application_mailer.rb +4 -0
  114. data/examples/word-game/app/models/application_record.rb +3 -0
  115. data/examples/word-game/app/models/concerns/.keep +0 -0
  116. data/examples/word-game/app/models/models.rb +2 -0
  117. data/examples/word-game/app/models/public/.keep +0 -0
  118. data/examples/word-game/app/policies/application_policy.rb +14 -0
  119. data/examples/word-game/app/views/components.rb +16 -0
  120. data/examples/word-game/app/views/components/.keep +0 -0
  121. data/examples/word-game/app/views/layouts/application.html.erb +14 -0
  122. data/examples/{action-cable → word-game}/app/views/layouts/mailer.html.erb +0 -0
  123. data/examples/{action-cable → word-game}/app/views/layouts/mailer.text.erb +0 -0
  124. data/examples/word-game/bin/bundle +3 -0
  125. data/examples/word-game/bin/rails +9 -0
  126. data/examples/word-game/bin/rake +9 -0
  127. data/examples/word-game/bin/setup +34 -0
  128. data/examples/word-game/bin/spring +16 -0
  129. data/examples/word-game/bin/update +29 -0
  130. data/examples/word-game/config.ru +5 -0
  131. data/examples/word-game/config/application.rb +20 -0
  132. data/examples/word-game/config/boot.rb +3 -0
  133. data/examples/word-game/config/cable.yml +9 -0
  134. data/examples/word-game/config/database.yml +25 -0
  135. data/examples/word-game/config/environment.rb +5 -0
  136. data/examples/word-game/config/environments/development.rb +56 -0
  137. data/examples/word-game/config/environments/production.rb +86 -0
  138. data/examples/word-game/config/environments/test.rb +42 -0
  139. data/examples/word-game/config/initializers/application_controller_renderer.rb +6 -0
  140. data/examples/word-game/config/initializers/assets.rb +11 -0
  141. data/examples/word-game/config/initializers/backtrace_silencers.rb +7 -0
  142. data/examples/word-game/config/initializers/cookies_serializer.rb +5 -0
  143. data/examples/word-game/config/initializers/filter_parameter_logging.rb +4 -0
  144. data/examples/word-game/config/initializers/hyper_mesh.rb +4 -0
  145. data/examples/word-game/config/initializers/inflections.rb +16 -0
  146. data/examples/word-game/config/initializers/mime_types.rb +4 -0
  147. data/examples/word-game/config/initializers/new_framework_defaults.rb +24 -0
  148. data/examples/word-game/config/initializers/session_store.rb +3 -0
  149. data/examples/word-game/config/initializers/wrap_parameters.rb +14 -0
  150. data/examples/word-game/config/locales/en.yml +23 -0
  151. data/examples/word-game/config/puma.rb +47 -0
  152. data/examples/word-game/config/routes.rb +4 -0
  153. data/examples/word-game/config/secrets.yml +22 -0
  154. data/examples/word-game/config/spring.rb +6 -0
  155. data/examples/word-game/db/seeds.rb +7 -0
  156. data/examples/word-game/lib/assets/.keep +0 -0
  157. data/examples/word-game/lib/tasks/.keep +0 -0
  158. data/examples/word-game/log/.keep +0 -0
  159. data/examples/word-game/public/404.html +67 -0
  160. data/examples/word-game/public/422.html +67 -0
  161. data/examples/word-game/public/500.html +66 -0
  162. data/examples/word-game/public/apple-touch-icon-precomposed.png +0 -0
  163. data/examples/word-game/public/apple-touch-icon.png +0 -0
  164. data/examples/word-game/public/favicon.ico +0 -0
  165. data/examples/word-game/public/robots.txt +5 -0
  166. data/examples/word-game/test/controllers/.keep +0 -0
  167. data/examples/word-game/test/fixtures/.keep +0 -0
  168. data/examples/word-game/test/fixtures/files/.keep +0 -0
  169. data/examples/word-game/test/helpers/.keep +0 -0
  170. data/examples/word-game/test/integration/.keep +0 -0
  171. data/examples/word-game/test/mailers/.keep +0 -0
  172. data/examples/word-game/test/models/.keep +0 -0
  173. data/examples/word-game/test/test_helper.rb +10 -0
  174. data/examples/word-game/tmp/.keep +0 -0
  175. data/examples/word-game/vendor/assets/javascripts/.keep +0 -0
  176. data/examples/word-game/vendor/assets/stylesheets/.keep +0 -0
  177. data/lib/active_record_base.rb +20 -1
  178. data/lib/hyper-mesh.rb +1 -0
  179. data/lib/hypermesh/version.rb +1 -1
  180. data/lib/kernel/itself.rb +5 -0
  181. data/lib/reactive_record/active_record/class_methods.rb +87 -11
  182. data/lib/reactive_record/active_record/instance_methods.rb +4 -2
  183. data/lib/reactive_record/active_record/reactive_record/collection.rb +9 -12
  184. data/lib/reactive_record/active_record/reactive_record/isomorphic_base.rb +52 -52
  185. data/lib/reactive_record/active_record/reactive_record/while_loading.rb +2 -3
  186. data/lib/reactive_record/scope_description.rb +8 -3
  187. data/lib/synchromesh/client_drivers.rb +1 -9
  188. data/lib/synchromesh/connection.rb +2 -2
  189. data/lib/synchromesh/synchromesh.rb +4 -4
  190. data/spec/reactive_record/auto_load_itself_spec.rb +24 -0
  191. data/spec/reactive_record/finder_method_spec.rb +67 -0
  192. data/spec/reactive_record/save_while_loading_spec.rb +44 -0
  193. data/spec/reactive_record/update_associations_spec.rb +0 -1
  194. data/spec/reactive_record/update_scopes_spec.rb +1 -1
  195. data/spec/spec_helper.rb +5 -0
  196. data/spec/synchromesh/examples/random_examples.rb +33 -0
  197. metadata +176 -10
  198. data/examples/pusher-fake/app/views/layouts/mailer.html.erb +0 -13
  199. data/examples/pusher-fake/app/views/layouts/mailer.text.erb +0 -1
  200. data/examples/pusher/app/views/layouts/mailer.html.erb +0 -13
  201. data/examples/pusher/app/views/layouts/mailer.text.erb +0 -1
  202. data/examples/simple-poller/app/views/layouts/mailer.html.erb +0 -13
  203. data/examples/simple-poller/app/views/layouts/mailer.text.erb +0 -1
@@ -6,17 +6,22 @@ module ReactiveRecord
6
6
  class ScopeDescription
7
7
  def initialize(model, name, opts)
8
8
  sself = self
9
- model.singleton_class.send(:define_method, "_#{name}_synchromesh_scope_description_") do
10
- sself
11
- end
12
9
  @filter_proc = filter_proc(opts)
13
10
  @name = name
11
+ model.singleton_class.send(:define_method, "_#{@name}_synchromesh_scope_description_") do
12
+ sself
13
+ end
14
14
  @model = model
15
15
  build_joins opts[:joins]
16
16
  end
17
17
 
18
+ attr_reader :name
19
+
18
20
  def self.find(target_model, name)
21
+ name = name.gsub(/!$/,'')
19
22
  target_model.send "_#{name}_synchromesh_scope_description_"
23
+ rescue
24
+ nil
20
25
  end
21
26
 
22
27
  def filter?
@@ -171,7 +171,6 @@ module HyperMesh
171
171
  def merge_current_values(br)
172
172
  current_values = Hash[*@previous_changes.collect do |attr, values|
173
173
  value = attr == :id ? record[:id] : values.first
174
- begin
175
174
  if br.attributes.key?(attr) &&
176
175
  br.attributes[attr] != br.convert(attr, value) &&
177
176
  br.attributes[attr] != br.convert(attr, values.last)
@@ -179,16 +178,9 @@ module HyperMesh
179
178
  "local value: #{br.attributes[attr]} remote value: #{br.convert(attr, value)}->#{br.convert(attr, values.last)}"
180
179
  return nil
181
180
  end
182
- rescue Exception => e
183
- debugger
184
- nil
185
- end
186
181
  [attr, value]
187
182
  end.compact.flatten].merge(br.attributes)
188
183
  klass._react_param_conversion(current_values)
189
- rescue Exception => e
190
- debugger
191
- nil
192
184
  end
193
185
  end
194
186
  end
@@ -350,7 +342,7 @@ module HyperMesh
350
342
  elsif opts[:transport] == :simple_poller
351
343
  opts[:auto_connect].each { |channel| IncomingBroadcast.add_connection(*channel) }
352
344
  every(opts[:seconds_between_poll]) do
353
- get_queued_data(:read, nil, headers: {'X-SYNCHROMESH-SILENT-REQUEST': true })
345
+ get_queued_data(:read, nil, headers: {'X-SYNCHROMESH-SILENT-REQUEST' => true })
354
346
  end
355
347
  end
356
348
  end
@@ -2,7 +2,7 @@ module HyperMesh
2
2
  module AutoCreate
3
3
  def needs_init?
4
4
  return true unless connection.tables.include?(table_name)
5
- return false if HyperMesh.on_console?
5
+ return false unless HyperMesh.on_server?
6
6
  return true if defined?(Rails::Server)
7
7
  return true unless Connection.root_path
8
8
  uri = URI("#{Connection.root_path}server_up")
@@ -104,7 +104,7 @@ module HyperMesh
104
104
  attr_accessor :transport
105
105
 
106
106
  def active
107
- unless HyperMesh.on_console?
107
+ if HyperMesh.on_server?
108
108
  expired.delete_all
109
109
  refresh_connections if needs_refresh?
110
110
  end
@@ -89,7 +89,7 @@ module HyperMesh
89
89
  end
90
90
 
91
91
  def self.send(channel, data)
92
- if on_console?
92
+ if !on_server?
93
93
  send_to_server(channel, data)
94
94
  elsif transport == :pusher
95
95
  pusher.trigger("#{HyperMesh.channel}-#{data[1][:channel]}", *data)
@@ -98,8 +98,8 @@ module HyperMesh
98
98
  end
99
99
  end
100
100
 
101
- def self.on_console?
102
- defined?(Rails::Console)
101
+ def self.on_server?
102
+ Rails.const_defined? 'Server'
103
103
  end
104
104
 
105
105
  def self.send_to_server(channel, data)
@@ -145,7 +145,7 @@ module HyperMesh
145
145
 
146
146
  def self.after_commit(operation, model)
147
147
  InternalPolicy.regulate_broadcast(model) do |data|
148
- if HyperMesh.on_console? && Connection.root_path
148
+ if !HyperMesh.on_server? && Connection.root_path
149
149
  HyperMesh.send_to_server(data[:channel], [operation, data])
150
150
  else
151
151
  Connection.send_to_channel(data[:channel], [operation, data])
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+ require 'synchromesh/integration/test_components'
3
+
4
+ describe "HyperMesh.load", js: true do
5
+
6
+ before(:each) do
7
+ # spec_helper resets the policy system after each test so we have to setup
8
+ # before each test
9
+ stub_const 'TestApplication', Class.new
10
+ stub_const 'TestApplicationPolicy', Class.new
11
+ TestApplicationPolicy.class_eval do
12
+ always_allow_connection
13
+ regulate_all_broadcasts { |policy| policy.send_all }
14
+ end
15
+ size_window(:small, :portrait)
16
+ end
17
+
18
+ it "uses itself to force loading" do
19
+ user = FactoryGirl.create(:user, first_name: 'Ima')
20
+ expect_promise do
21
+ HyperMesh.load { User.find_by_first_name('Ima') }.then { |user| user.id }
22
+ end.to eq(user.id)
23
+ end
24
+ end
@@ -0,0 +1,67 @@
1
+ require 'spec_helper'
2
+ require 'synchromesh/integration/test_components'
3
+ require 'rspec-steps'
4
+
5
+
6
+ RSpec::Steps.steps "finder_method", js: true do
7
+
8
+ before(:step) do
9
+ # spec_helper resets the policy system after each test so we have to setup
10
+ # before each test
11
+ stub_const 'TestApplication', Class.new
12
+ stub_const 'TestApplicationPolicy', Class.new
13
+ TestApplicationPolicy.class_eval do
14
+ always_allow_connection
15
+ regulate_all_broadcasts { |policy| policy.send_all }
16
+ end
17
+ isomorphic do
18
+ Todo.class_eval do
19
+ class << self
20
+ attr_accessor :current_random_value
21
+ end
22
+ finder_method :random_item do |i|
23
+ find(current_random_value + i.to_i)
24
+ end
25
+ scope :test_scope, -> { all }
26
+ end
27
+ end
28
+ size_window(:small, :portrait)
29
+ 5.times { FactoryGirl.create(:todo) }
30
+ end
31
+
32
+ it "returns the correct value" do
33
+ Todo.current_random_value = 1
34
+ expect_promise do
35
+ HyperMesh.load { Todo.random_item(2) }.then { |todo| todo.id }
36
+ end.to eq(3)
37
+ end
38
+
39
+ it "returns the correct value on the server too" do
40
+ Todo.current_random_value = 1
41
+ expect(Todo.random_item(2).id).to eq(3)
42
+ end
43
+
44
+ it "will not reload the value unless forced" do
45
+ Todo.current_random_value = 2
46
+ expect_promise do
47
+ HyperMesh.load { Todo.random_item(2) }.then { |todo| todo.id }
48
+ end.to eq(3)
49
+ end
50
+
51
+ it "can be forced to reload the value" do
52
+ expect_promise do
53
+ current_value = Todo.random_item(2).id
54
+ HyperMesh.load do
55
+ new_value = Todo.random_item(2).id
56
+ Todo.random_item!(2) if current_value == new_value
57
+ new_value
58
+ end
59
+ end.to eq(4)
60
+ end
61
+
62
+ it "can apply to a nested scope" do
63
+ expect_promise do
64
+ HyperMesh.load { Todo.test_scope.random_item(2) }.then { |todo| todo.id }
65
+ end.to eq(4)
66
+ end
67
+ end
@@ -0,0 +1,44 @@
1
+ require 'spec_helper'
2
+ require 'synchromesh/integration/test_components'
3
+
4
+ describe "save while loading", js: true do
5
+
6
+ before(:each) do
7
+ # spec_helper resets the policy system after each test so we have to setup
8
+ # before each test
9
+ stub_const 'TestApplication', Class.new
10
+ stub_const 'TestApplicationPolicy', Class.new
11
+ TestApplicationPolicy.class_eval do
12
+ always_allow_connection
13
+ regulate_all_broadcasts { |policy| policy.send_all }
14
+ #allow_change(to: User, on: [:update]) { true }
15
+ allow_change(to: :all, on: [:create, :update, :destroy]) { true }
16
+ end
17
+ size_window(:small, :portrait)
18
+ end
19
+
20
+ it "with new and create" do
21
+ user = FactoryGirl.create(:user, first_name: 'Ima')
22
+ expect_promise do
23
+ TodoItem.create(user: User.find_by_first_name('Ima'))
24
+ end.to include('success' => true)
25
+ expect(user.todo_items).to eq([TodoItem.first])
26
+ end
27
+ it "with push" do
28
+ user = FactoryGirl.create(:user, first_name: 'Ima')
29
+ expect_promise do
30
+ User.find(1).todo_items << TodoItem.new
31
+ User.find(1).save
32
+ end.to include('success' => true)
33
+ expect(user.todo_items).to eq([TodoItem.first])
34
+ end
35
+ it "with assignment" do
36
+ user = FactoryGirl.create(:user, first_name: 'Ima')
37
+ expect_promise do
38
+ todo = TodoItem.new
39
+ todo.user = User.find_by_first_name('Ima')
40
+ todo.save
41
+ end.to include('success' => true)
42
+ expect(user.todo_items).to eq([TodoItem.first])
43
+ end
44
+ end
@@ -139,7 +139,6 @@ RSpec::Steps.steps "updating associations", js: true do
139
139
  ReactiveRecord.load do
140
140
  User.find_by_first_name("Jan").todo_items.collect { |item| item.itself }.first
141
141
  end.then do | first |
142
- ReactiveRecord::Collection.hypertrace instrument: :all
143
142
  first.destroy.then do |response|
144
143
  User.find_by_first_name("Jan").todo_items.all
145
144
  end
@@ -44,7 +44,7 @@ RSpec::Steps.steps "updating scopes", js: true do
44
44
  while count > 0
45
45
  expect(page).to have_content("TodoItem.count = #{count}")
46
46
  evaluate_ruby do
47
- ReactiveRecord.load { TodoItem.last.itself }.then { |todo| todo.destroy }
47
+ ReactiveRecord.load { TodoItem.last }.then { |todo| todo.destroy }
48
48
  end
49
49
  count -= 1
50
50
  end
@@ -228,6 +228,11 @@ if RUBY_ENGINE != 'opal'
228
228
  end
229
229
 
230
230
  config.before(:each) do |x|
231
+ HyperMesh.class_eval do
232
+ def self.on_server?
233
+ true
234
+ end
235
+ end
231
236
  #puts " RUNNING #{x.full_description}"
232
237
  end
233
238
 
@@ -37,6 +37,39 @@ describe "random examples", js: true do
37
37
  pause
38
38
  end
39
39
 
40
+ it "pass a native hash as a param" do
41
+ mount "Tester" do
42
+
43
+ class React::RenderingContext
44
+ def self.remove_nodes_from_args(args)
45
+ args[0].each do |key, value|
46
+ begin
47
+ value.as_node if value.is_a?(Element)
48
+ rescue Exception
49
+ end
50
+ end if args[0] && args[0].is_a?(Hash)
51
+ end
52
+ end
53
+
54
+ class HelloWorld < React::Component::Base
55
+ param :hash
56
+ render do
57
+ debugger
58
+ "hash[key] = #{`#{params.hash['key']}`}"
59
+ end
60
+ end
61
+
62
+ class Tester < React::Component::Base
63
+ def render
64
+ HelloWorld(hash: `{key: 'the key'}`)
65
+ end
66
+ end
67
+ end
68
+ page.should have_content("hash[key] = 'the key'")
69
+ pause
70
+ end
71
+
72
+
40
73
  it "can destroy on the fly" do
41
74
 
42
75
  5.times do |i|
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hyper-mesh
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.2
4
+ version: 0.5.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mitch VanDuyn
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-11-16 00:00:00.000000000 Z
11
+ date: 2017-01-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -586,6 +586,7 @@ files:
586
586
  - ".rspec"
587
587
  - ".rubocop.yml"
588
588
  - ".travis.yml"
589
+ - CHANGELOG.md
589
590
  - CODE_OF_CONDUCT.md
590
591
  - Gemfile
591
592
  - LICENSE.txt
@@ -606,7 +607,92 @@ files:
606
607
  - docs/pusher_quickstart.md
607
608
  - docs/simple_poller_quickstart.md
608
609
  - docs/todo-example.md
610
+ - docs/word_game.md
609
611
  - docs/words-example.md
612
+ - examples/action-cable-production-mode/.gitignore
613
+ - examples/action-cable-production-mode/Gemfile
614
+ - examples/action-cable-production-mode/Gemfile.lock
615
+ - examples/action-cable-production-mode/README.md
616
+ - examples/action-cable-production-mode/Rakefile
617
+ - examples/action-cable-production-mode/app/assets/config/manifest.js
618
+ - examples/action-cable-production-mode/app/assets/images/.keep
619
+ - examples/action-cable-production-mode/app/assets/javascripts/application.js
620
+ - examples/action-cable-production-mode/app/assets/javascripts/cable.js
621
+ - examples/action-cable-production-mode/app/assets/javascripts/channels/.keep
622
+ - examples/action-cable-production-mode/app/assets/stylesheets/application.css
623
+ - examples/action-cable-production-mode/app/channels/application_cable/channel.rb
624
+ - examples/action-cable-production-mode/app/channels/application_cable/connection.rb
625
+ - examples/action-cable-production-mode/app/controllers/application_controller.rb
626
+ - examples/action-cable-production-mode/app/controllers/test_controller.rb
627
+ - examples/action-cable-production-mode/app/models/models.rb
628
+ - examples/action-cable-production-mode/app/models/public/application_record.rb
629
+ - examples/action-cable-production-mode/app/models/public/word.rb
630
+ - examples/action-cable-production-mode/app/policies/application_policy.rb
631
+ - examples/action-cable-production-mode/app/views/components.rb
632
+ - examples/action-cable-production-mode/app/views/components/app.rb
633
+ - examples/action-cable-production-mode/app/views/layouts/application.html.erb
634
+ - examples/action-cable-production-mode/bin/bundle
635
+ - examples/action-cable-production-mode/bin/rails
636
+ - examples/action-cable-production-mode/bin/rake
637
+ - examples/action-cable-production-mode/bin/setup
638
+ - examples/action-cable-production-mode/bin/spring
639
+ - examples/action-cable-production-mode/bin/update
640
+ - examples/action-cable-production-mode/config.ru
641
+ - examples/action-cable-production-mode/config/application.rb
642
+ - examples/action-cable-production-mode/config/boot.rb
643
+ - examples/action-cable-production-mode/config/cable.yml
644
+ - examples/action-cable-production-mode/config/database.yml
645
+ - examples/action-cable-production-mode/config/environment.rb
646
+ - examples/action-cable-production-mode/config/environments/development.rb
647
+ - examples/action-cable-production-mode/config/environments/production.rb
648
+ - examples/action-cable-production-mode/config/environments/test.rb
649
+ - examples/action-cable-production-mode/config/initializers/application_controller_renderer.rb
650
+ - examples/action-cable-production-mode/config/initializers/assets.rb
651
+ - examples/action-cable-production-mode/config/initializers/backtrace_silencers.rb
652
+ - examples/action-cable-production-mode/config/initializers/cookies_serializer.rb
653
+ - examples/action-cable-production-mode/config/initializers/filter_parameter_logging.rb
654
+ - examples/action-cable-production-mode/config/initializers/hyper_mesh.rb
655
+ - examples/action-cable-production-mode/config/initializers/inflections.rb
656
+ - examples/action-cable-production-mode/config/initializers/mime_types.rb
657
+ - examples/action-cable-production-mode/config/initializers/new_framework_defaults.rb
658
+ - examples/action-cable-production-mode/config/initializers/session_store.rb
659
+ - examples/action-cable-production-mode/config/initializers/wrap_parameters.rb
660
+ - examples/action-cable-production-mode/config/locales/en.yml
661
+ - examples/action-cable-production-mode/config/puma.rb
662
+ - examples/action-cable-production-mode/config/routes.rb
663
+ - examples/action-cable-production-mode/config/secrets.yml
664
+ - examples/action-cable-production-mode/config/spring.rb
665
+ - examples/action-cable-production-mode/db/migrate/20161114213840_create_words.rb
666
+ - examples/action-cable-production-mode/db/schema.rb
667
+ - examples/action-cable-production-mode/db/seeds.rb
668
+ - examples/action-cable-production-mode/lib/assets/.keep
669
+ - examples/action-cable-production-mode/lib/tasks/.keep
670
+ - examples/action-cable-production-mode/log/.keep
671
+ - examples/action-cable-production-mode/public/404.html
672
+ - examples/action-cable-production-mode/public/422.html
673
+ - examples/action-cable-production-mode/public/500.html
674
+ - examples/action-cable-production-mode/public/apple-touch-icon-precomposed.png
675
+ - examples/action-cable-production-mode/public/apple-touch-icon.png
676
+ - examples/action-cable-production-mode/public/assets/.sprockets-manifest-3e9abd3ee8ba47c39a55b61ae37ed9e1.json
677
+ - examples/action-cable-production-mode/public/assets/application-90043e04e9e784054fd08159fa7aafe5e23d3ffb31584b1bea1e47043c9cfb5a.js
678
+ - examples/action-cable-production-mode/public/assets/application-90043e04e9e784054fd08159fa7aafe5e23d3ffb31584b1bea1e47043c9cfb5a.js.gz
679
+ - examples/action-cable-production-mode/public/assets/application-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.css
680
+ - examples/action-cable-production-mode/public/assets/application-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.css.gz
681
+ - examples/action-cable-production-mode/public/favicon.ico
682
+ - examples/action-cable-production-mode/public/robots.txt
683
+ - examples/action-cable-production-mode/test/controllers/.keep
684
+ - examples/action-cable-production-mode/test/fixtures/.keep
685
+ - examples/action-cable-production-mode/test/fixtures/files/.keep
686
+ - examples/action-cable-production-mode/test/fixtures/words.yml
687
+ - examples/action-cable-production-mode/test/helpers/.keep
688
+ - examples/action-cable-production-mode/test/integration/.keep
689
+ - examples/action-cable-production-mode/test/mailers/.keep
690
+ - examples/action-cable-production-mode/test/models/.keep
691
+ - examples/action-cable-production-mode/test/models/word_test.rb
692
+ - examples/action-cable-production-mode/test/test_helper.rb
693
+ - examples/action-cable-production-mode/tmp/.keep
694
+ - examples/action-cable-production-mode/vendor/assets/javascripts/.keep
695
+ - examples/action-cable-production-mode/vendor/assets/stylesheets/.keep
610
696
  - examples/action-cable/.gitignore
611
697
  - examples/action-cable/Gemfile
612
698
  - examples/action-cable/Gemfile.lock
@@ -630,8 +716,6 @@ files:
630
716
  - examples/action-cable/app/views/components.rb
631
717
  - examples/action-cable/app/views/components/app.rb
632
718
  - examples/action-cable/app/views/layouts/application.html.erb
633
- - examples/action-cable/app/views/layouts/mailer.html.erb
634
- - examples/action-cable/app/views/layouts/mailer.text.erb
635
719
  - examples/action-cable/bin/bundle
636
720
  - examples/action-cable/bin/rails
637
721
  - examples/action-cable/bin/rake
@@ -708,8 +792,6 @@ files:
708
792
  - examples/pusher-fake/app/views/components.rb
709
793
  - examples/pusher-fake/app/views/components/app.rb
710
794
  - examples/pusher-fake/app/views/layouts/application.html.erb
711
- - examples/pusher-fake/app/views/layouts/mailer.html.erb
712
- - examples/pusher-fake/app/views/layouts/mailer.text.erb
713
795
  - examples/pusher-fake/bin/bundle
714
796
  - examples/pusher-fake/bin/rails
715
797
  - examples/pusher-fake/bin/rake
@@ -785,8 +867,6 @@ files:
785
867
  - examples/pusher/app/views/components.rb
786
868
  - examples/pusher/app/views/components/app.rb
787
869
  - examples/pusher/app/views/layouts/application.html.erb
788
- - examples/pusher/app/views/layouts/mailer.html.erb
789
- - examples/pusher/app/views/layouts/mailer.text.erb
790
870
  - examples/pusher/bin/bundle
791
871
  - examples/pusher/bin/rails
792
872
  - examples/pusher/bin/rake
@@ -862,8 +942,6 @@ files:
862
942
  - examples/simple-poller/app/views/components.rb
863
943
  - examples/simple-poller/app/views/components/app.rb
864
944
  - examples/simple-poller/app/views/layouts/application.html.erb
865
- - examples/simple-poller/app/views/layouts/mailer.html.erb
866
- - examples/simple-poller/app/views/layouts/mailer.text.erb
867
945
  - examples/simple-poller/bin/bundle
868
946
  - examples/simple-poller/bin/rails
869
947
  - examples/simple-poller/bin/rake
@@ -920,6 +998,87 @@ files:
920
998
  - examples/simple-poller/tmp/.keep
921
999
  - examples/simple-poller/vendor/assets/javascripts/.keep
922
1000
  - examples/simple-poller/vendor/assets/stylesheets/.keep
1001
+ - examples/word-game/.gitignore
1002
+ - examples/word-game/Gemfile
1003
+ - examples/word-game/Gemfile.lock
1004
+ - examples/word-game/README.md
1005
+ - examples/word-game/Rakefile
1006
+ - examples/word-game/app/assets/config/manifest.js
1007
+ - examples/word-game/app/assets/images/.keep
1008
+ - examples/word-game/app/assets/javascripts/application.js
1009
+ - examples/word-game/app/assets/javascripts/cable.js
1010
+ - examples/word-game/app/assets/javascripts/channels/.keep
1011
+ - examples/word-game/app/assets/stylesheets/application.css
1012
+ - examples/word-game/app/channels/application_cable/channel.rb
1013
+ - examples/word-game/app/channels/application_cable/connection.rb
1014
+ - examples/word-game/app/controllers/application_controller.rb
1015
+ - examples/word-game/app/controllers/concerns/.keep
1016
+ - examples/word-game/app/helpers/application_helper.rb
1017
+ - examples/word-game/app/jobs/application_job.rb
1018
+ - examples/word-game/app/mailers/application_mailer.rb
1019
+ - examples/word-game/app/models/application_record.rb
1020
+ - examples/word-game/app/models/concerns/.keep
1021
+ - examples/word-game/app/models/models.rb
1022
+ - examples/word-game/app/models/public/.keep
1023
+ - examples/word-game/app/policies/application_policy.rb
1024
+ - examples/word-game/app/views/components.rb
1025
+ - examples/word-game/app/views/components/.keep
1026
+ - examples/word-game/app/views/layouts/application.html.erb
1027
+ - examples/word-game/app/views/layouts/mailer.html.erb
1028
+ - examples/word-game/app/views/layouts/mailer.text.erb
1029
+ - examples/word-game/bin/bundle
1030
+ - examples/word-game/bin/rails
1031
+ - examples/word-game/bin/rake
1032
+ - examples/word-game/bin/setup
1033
+ - examples/word-game/bin/spring
1034
+ - examples/word-game/bin/update
1035
+ - examples/word-game/config.ru
1036
+ - examples/word-game/config/application.rb
1037
+ - examples/word-game/config/boot.rb
1038
+ - examples/word-game/config/cable.yml
1039
+ - examples/word-game/config/database.yml
1040
+ - examples/word-game/config/environment.rb
1041
+ - examples/word-game/config/environments/development.rb
1042
+ - examples/word-game/config/environments/production.rb
1043
+ - examples/word-game/config/environments/test.rb
1044
+ - examples/word-game/config/initializers/application_controller_renderer.rb
1045
+ - examples/word-game/config/initializers/assets.rb
1046
+ - examples/word-game/config/initializers/backtrace_silencers.rb
1047
+ - examples/word-game/config/initializers/cookies_serializer.rb
1048
+ - examples/word-game/config/initializers/filter_parameter_logging.rb
1049
+ - examples/word-game/config/initializers/hyper_mesh.rb
1050
+ - examples/word-game/config/initializers/inflections.rb
1051
+ - examples/word-game/config/initializers/mime_types.rb
1052
+ - examples/word-game/config/initializers/new_framework_defaults.rb
1053
+ - examples/word-game/config/initializers/session_store.rb
1054
+ - examples/word-game/config/initializers/wrap_parameters.rb
1055
+ - examples/word-game/config/locales/en.yml
1056
+ - examples/word-game/config/puma.rb
1057
+ - examples/word-game/config/routes.rb
1058
+ - examples/word-game/config/secrets.yml
1059
+ - examples/word-game/config/spring.rb
1060
+ - examples/word-game/db/seeds.rb
1061
+ - examples/word-game/lib/assets/.keep
1062
+ - examples/word-game/lib/tasks/.keep
1063
+ - examples/word-game/log/.keep
1064
+ - examples/word-game/public/404.html
1065
+ - examples/word-game/public/422.html
1066
+ - examples/word-game/public/500.html
1067
+ - examples/word-game/public/apple-touch-icon-precomposed.png
1068
+ - examples/word-game/public/apple-touch-icon.png
1069
+ - examples/word-game/public/favicon.ico
1070
+ - examples/word-game/public/robots.txt
1071
+ - examples/word-game/test/controllers/.keep
1072
+ - examples/word-game/test/fixtures/.keep
1073
+ - examples/word-game/test/fixtures/files/.keep
1074
+ - examples/word-game/test/helpers/.keep
1075
+ - examples/word-game/test/integration/.keep
1076
+ - examples/word-game/test/mailers/.keep
1077
+ - examples/word-game/test/models/.keep
1078
+ - examples/word-game/test/test_helper.rb
1079
+ - examples/word-game/tmp/.keep
1080
+ - examples/word-game/vendor/assets/javascripts/.keep
1081
+ - examples/word-game/vendor/assets/stylesheets/.keep
923
1082
  - examples/words/.gitignore
924
1083
  - examples/words/Gemfile
925
1084
  - examples/words/Gemfile.lock
@@ -988,6 +1147,7 @@ files:
988
1147
  - lib/enumerable/pluck.rb
989
1148
  - lib/hyper-mesh.rb
990
1149
  - lib/hypermesh/version.rb
1150
+ - lib/kernel/itself.rb
991
1151
  - lib/opal/equality_patches.rb
992
1152
  - lib/opal/parse_patch.rb
993
1153
  - lib/opal/set_patches.rb
@@ -1121,12 +1281,15 @@ files:
1121
1281
  - spec/factories/test_models.rb
1122
1282
  - spec/factories/todo.rb
1123
1283
  - spec/factories/user.rb
1284
+ - spec/reactive_record/auto_load_itself_spec.rb
1124
1285
  - spec/reactive_record/edge_cases_spec.rb
1125
1286
  - spec/reactive_record/factory.rb
1287
+ - spec/reactive_record/finder_method_spec.rb
1126
1288
  - spec/reactive_record/many_to_many_spec.rb
1127
1289
  - spec/reactive_record/play.rb
1128
1290
  - spec/reactive_record/pry_rescue_xspec.rb
1129
1291
  - spec/reactive_record/revert_spec.rb
1292
+ - spec/reactive_record/save_while_loading_spec.rb
1130
1293
  - spec/reactive_record/update_associations_spec.rb
1131
1294
  - spec/reactive_record/update_scopes_spec.rb
1132
1295
  - spec/spec_helper.rb
@@ -1249,12 +1412,15 @@ test_files:
1249
1412
  - spec/factories/test_models.rb
1250
1413
  - spec/factories/todo.rb
1251
1414
  - spec/factories/user.rb
1415
+ - spec/reactive_record/auto_load_itself_spec.rb
1252
1416
  - spec/reactive_record/edge_cases_spec.rb
1253
1417
  - spec/reactive_record/factory.rb
1418
+ - spec/reactive_record/finder_method_spec.rb
1254
1419
  - spec/reactive_record/many_to_many_spec.rb
1255
1420
  - spec/reactive_record/play.rb
1256
1421
  - spec/reactive_record/pry_rescue_xspec.rb
1257
1422
  - spec/reactive_record/revert_spec.rb
1423
+ - spec/reactive_record/save_while_loading_spec.rb
1258
1424
  - spec/reactive_record/update_associations_spec.rb
1259
1425
  - spec/reactive_record/update_scopes_spec.rb
1260
1426
  - spec/spec_helper.rb