hyper-mesh 0.5.3 → 0.5.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (150) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -1
  3. data/Gemfile +7 -2
  4. data/README.md +112 -87
  5. data/Rakefile +6 -1
  6. data/docs/action_cable_quickstart.md +20 -16
  7. data/docs/activerecord_api.md +23 -17
  8. data/docs/authorization-policies.md +45 -35
  9. data/docs/client_side_scoping.md +5 -5
  10. data/docs/configuration_details.md +6 -46
  11. data/docs/pusher_faker_quickstart.md +7 -68
  12. data/docs/pusher_quickstart.md +7 -68
  13. data/docs/simple_poller_quickstart.md +6 -67
  14. data/docs/todo-example.md +2 -2
  15. data/docs/word_game.md +3 -1
  16. data/docs/words-example.md +2 -3
  17. data/examples/action-cable/Gemfile +2 -1
  18. data/examples/action-cable/Gemfile.lock +73 -54
  19. data/examples/action-cable/config/initializers/{hyper_mesh.rb → hyperloop.rb} +1 -1
  20. data/examples/action-cable/config/routes.rb +1 -1
  21. data/hyper-mesh.gemspec +10 -4
  22. data/lib/active_record_base.rb +3 -3
  23. data/{examples/action-cable-production-mode/log/.keep → lib/acts_as_string.rb} +0 -0
  24. data/lib/hyper-mesh.rb +11 -19
  25. data/lib/hyper_mesh/version.rb +3 -0
  26. data/lib/hypermesh/version.rb +1 -1
  27. data/lib/reactive_record/active_record/class_methods.rb +10 -3
  28. data/lib/reactive_record/active_record/instance_methods.rb +8 -0
  29. data/lib/reactive_record/active_record/public_columns_hash.rb +8 -2
  30. data/lib/reactive_record/active_record/reactive_record/collection.rb +0 -1
  31. data/lib/reactive_record/active_record/reactive_record/dummy_value.rb +2 -1
  32. data/lib/reactive_record/active_record/reactive_record/isomorphic_base.rb +55 -63
  33. data/lib/reactive_record/active_record/reactive_record/operations.rb +51 -0
  34. data/lib/reactive_record/active_record/reactive_record/reactive_set_relationship_helpers.rb +3 -3
  35. data/lib/reactive_record/active_record/reactive_record/while_loading.rb +93 -84
  36. data/lib/reactive_record/broadcast.rb +183 -0
  37. data/lib/reactive_record/permissions.rb +2 -2
  38. data/reactive_record_test_app/Gemfile +6 -2
  39. data/reactive_record_test_app/Gemfile.lock +120 -60
  40. data/reactive_record_test_app/app/assets/javascripts/application.rb +3 -5
  41. data/reactive_record_test_app/app/assets/javascripts/bigdecimal.rb +1 -0
  42. data/reactive_record_test_app/app/assets/javascripts/reactive_record_config.js +2 -2
  43. data/reactive_record_test_app/app/controllers/application_controller.rb +3 -3
  44. data/reactive_record_test_app/app/controllers/home_controller.rb +1 -1
  45. data/reactive_record_test_app/app/models/models.rb.erb +6 -0
  46. data/reactive_record_test_app/config/application.rb +2 -0
  47. data/reactive_record_test_app/config/environments/development.rb +1 -1
  48. data/reactive_record_test_app/config/routes.rb +1 -2
  49. data/reactive_record_test_app/db/seeds.rb +6 -0
  50. data/reactive_record_test_app/script/rails +0 -0
  51. data/reactive_record_test_app/spec-opal/active-record/rendering_spec.rb +11 -2
  52. data/reactive_record_test_app/spec-opal/active-record/save_spec.rb +3 -4
  53. data/reactive_record_test_app/spec-opal/spec_helper.js.rb +1 -1
  54. data/reactive_record_test_app/spec-opal/test_spec.rb +7 -0
  55. data/reactive_record_test_app/spec_dont_run/README.md +7 -0
  56. data/reactive_record_test_app/{spec-opal/active-record → spec_dont_run/active_record_broken}/permissions_spec.rb +0 -0
  57. data/reactive_record_test_app/{spec-opal/active-record → spec_dont_run/active_record_broken}/prerendering_spec.rb +1 -0
  58. data/spec/{synchromesh/aaa-unit_tests/connection_spec.rb → batch1/aaa-unit_tests/connection_movedspec.rb} +0 -0
  59. data/spec/{synchromesh → batch1}/aaa-unit_tests/dummy_value_spec.rb +2 -2
  60. data/spec/{synchromesh → batch1}/column_types/column_type_spec.rb +2 -2
  61. data/spec/{synchromesh → batch1}/crud_access_regulation/broadcast_controls_access_spec.rb +1 -1
  62. data/spec/{synchromesh → batch1}/crud_access_regulation/model_policies_spec.rb +6 -6
  63. data/spec/batch1/misc/access_like_hash_spec.rb +43 -0
  64. data/spec/batch1/misc/while_loading_spec.rb +196 -0
  65. data/spec/{synchromesh → batch1}/policies/regulate_all_broadcasts_spec.rb +12 -12
  66. data/spec/{synchromesh → batch1}/policies/regulate_broadcast_spec.rb +25 -25
  67. data/spec/{synchromesh/integration → batch2}/authorization_spec.rb +8 -7
  68. data/spec/{synchromesh/integration → batch2}/default_scope_spec.rb +2 -2
  69. data/spec/{synchromesh/integration → batch2}/has_many_through_spec.rb +2 -2
  70. data/spec/{synchromesh/integration → batch2}/relationships_spec.rb +3 -3
  71. data/spec/{reactive_record → batch3}/auto_load_itself_spec.rb +1 -1
  72. data/spec/{reactive_record → batch3}/edge_cases_spec.rb +1 -1
  73. data/spec/{reactive_record → batch3}/finder_method_spec.rb +1 -1
  74. data/spec/{reactive_record → batch3}/many_to_many_spec.rb +2 -2
  75. data/spec/{reactive_record → batch3}/pry_rescue_xspec.rb +0 -0
  76. data/{examples/action-cable-production-mode/public/assets/application-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.css → spec/batch3/readme.txt} +0 -0
  77. data/spec/{reactive_record → batch3}/revert_spec.rb +2 -2
  78. data/spec/{reactive_record → batch3}/save_while_loading_spec.rb +1 -1
  79. data/spec/{reactive_record → batch3}/update_associations_spec.rb +2 -2
  80. data/spec/{reactive_record → batch3}/update_scopes_spec.rb +2 -2
  81. data/spec/{synchromesh/integration → batch4}/saving_during_commit_spec.rb +2 -2
  82. data/spec/{synchromesh/integration → batch4}/scope_spec.rb +30 -2
  83. data/spec/{synchromesh/examples → batch4}/scoped_todos_spec.rb +3 -3
  84. data/spec/{synchromesh/integration → batch4}/synchromesh_spec.rb +2 -2
  85. data/spec/{synchromesh/examples → examples}/dictionary.rb +2 -2
  86. data/spec/{synchromesh/examples → examples}/dictionary_with_client_scopes.rb +2 -2
  87. data/spec/{synchromesh/examples → examples}/random_examples.rb +1 -1
  88. data/spec/{reactive_record/play.rb → play_ground.rb} +0 -0
  89. data/spec/{reactive_record/factory.rb → reactive_record_factory.rb} +0 -0
  90. data/spec/spec_helper.rb +3 -2
  91. data/spec/test_app/Gemfile +8 -3
  92. data/spec/test_app/Gemfile.lock +114 -64
  93. data/spec/test_app/app/views/components.rb +1 -2
  94. data/spec/test_app/config/application.rb +2 -0
  95. data/spec/test_app/config/routes.rb +1 -1
  96. data/spec/{synchromesh/integration/test_components.rb → test_components.rb} +0 -0
  97. metadata +144 -137
  98. data/app/controllers/reactive_record/application_controller.rb +0 -4
  99. data/app/controllers/reactive_record/reactive_record_controller.rb +0 -49
  100. data/config/routes.rb +0 -7
  101. data/examples/action-cable-production-mode/public/assets/application-90043e04e9e784054fd08159fa7aafe5e23d3ffb31584b1bea1e47043c9cfb5a.js +0 -50
  102. data/examples/action-cable-production-mode/public/assets/application-90043e04e9e784054fd08159fa7aafe5e23d3ffb31584b1bea1e47043c9cfb5a.js.gz +0 -0
  103. data/examples/action-cable-production-mode/public/assets/application-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.css.gz +0 -0
  104. data/examples/action-cable-production-mode/tmp/.keep +0 -0
  105. data/examples/action-cable/log/.keep +0 -0
  106. data/examples/action-cable/tmp/.keep +0 -0
  107. data/examples/pusher-fake/log/.keep +0 -0
  108. data/examples/pusher-fake/tmp/.keep +0 -0
  109. data/examples/pusher/log/.keep +0 -0
  110. data/examples/pusher/tmp/.keep +0 -0
  111. data/examples/simple-poller/log/.keep +0 -0
  112. data/examples/simple-poller/tmp/.keep +0 -0
  113. data/examples/word-game/log/.keep +0 -0
  114. data/examples/word-game/tmp/.keep +0 -0
  115. data/examples/words/log/.keep +0 -0
  116. data/examples/words/tmp/.keep +0 -0
  117. data/lib/reactive_record/version.rb +0 -3
  118. data/lib/sources/hyper-mesh/pusher.js +0 -98
  119. data/lib/synchromesh/action_cable.rb +0 -39
  120. data/lib/synchromesh/client_drivers.rb +0 -357
  121. data/lib/synchromesh/configuration.rb +0 -40
  122. data/lib/synchromesh/connection.rb +0 -170
  123. data/lib/synchromesh/policy.rb +0 -504
  124. data/lib/synchromesh/synchromesh.rb +0 -159
  125. data/lib/synchromesh/synchromesh_controller.rb +0 -162
  126. data/reactive_record_test_app/README.rdoc +0 -261
  127. data/reactive_record_test_app/app/assets/javascripts/components/another_component.rb +0 -24
  128. data/reactive_record_test_app/app/assets/javascripts/components/empty_component.rb +0 -6
  129. data/reactive_record_test_app/app/assets/javascripts/components/todo_item_component.js.rb +0 -16
  130. data/reactive_record_test_app/app/assets/javascripts/components/todos_component.js.rb +0 -42
  131. data/reactive_record_test_app/app/assets/javascripts/components/todos_main_component.rb +0 -49
  132. data/reactive_record_test_app/app/assets/javascripts/react_js_test_only.js +0 -21618
  133. data/reactive_record_test_app/app/assets/javascripts/spec/reactive_record_xspec.js.rb +0 -42
  134. data/reactive_record_test_app/app/controllers/test_controller.rb +0 -7
  135. data/reactive_record_test_app/app/mailers/.gitkeep +0 -0
  136. data/reactive_record_test_app/app/models/models.rb +0 -1
  137. data/reactive_record_test_app/app/policies/application_policy.rb +0 -5
  138. data/reactive_record_test_app/app/views/components.rb +0 -4
  139. data/reactive_record_test_app/app/views/components/test.rb +0 -18
  140. data/reactive_record_test_app/app/views/home/index.html.erb +0 -1
  141. data/reactive_record_test_app/app/views/layouts/application.html.erb +0 -17
  142. data/reactive_record_test_app/config/environments/production.rb +0 -70
  143. data/reactive_record_test_app/config/environments/test.rb +0 -41
  144. data/spec/synchromesh/integration/transports_spec.rb +0 -308
  145. data/spec/synchromesh/policies/auto_connect_spec.rb +0 -60
  146. data/spec/synchromesh/policies/auto_loader_spec.rb +0 -34
  147. data/spec/synchromesh/policies/policy_methods_spec.rb +0 -85
  148. data/spec/synchromesh/policies/regulate_class_connection_spec.rb +0 -50
  149. data/spec/synchromesh/policies/regulate_instance_connection_spec.rb +0 -66
  150. data/spec/test_app/log/.keep +0 -0
@@ -1,4 +1,4 @@
1
1
  #config/initializers/hyper_mesh.rb
2
- HyperMesh.configuration do |config|
2
+ Hyperloop.configuration do |config|
3
3
  config.transport = :action_cable
4
4
  end
@@ -1,5 +1,5 @@
1
1
  Rails.application.routes.draw do
2
2
  get 'test', to: 'test#app'
3
- mount HyperMesh::Engine => '/rr'
3
+ mount Hyperloop::Engine => '/rr'
4
4
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
5
5
  end
@@ -23,8 +23,10 @@ Gem::Specification.new do |s|
23
23
  s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
24
24
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
25
25
  s.require_paths = ['lib']
26
+
26
27
  s.add_dependency 'activerecord', '>= 0.3.0'
27
- s.add_dependency 'hyper-react', '>= 0.10.0'
28
+ s.add_dependency 'hyper-operation', '>= 0.5.0'
29
+ s.add_dependency 'hyper-component', '>= 0.12.3'
28
30
 
29
31
  s.add_development_dependency 'bundler', '~> 1.8'
30
32
  s.add_development_dependency 'rake', '~> 10.0'
@@ -39,12 +41,15 @@ Gem::Specification.new do |s|
39
41
  s.add_development_dependency 'factory_girl_rails'
40
42
  s.add_development_dependency 'reactrb-rails-generator'
41
43
  s.add_development_dependency 'rspec-wait'
42
- s.add_development_dependency 'puma'
44
+ s.add_development_dependency 'puma', '~> 3.6.0'
43
45
 
44
46
  s.add_development_dependency 'pusher'
45
47
  s.add_development_dependency 'pusher-fake'
46
48
  s.add_development_dependency 'opal-browser'
47
49
 
50
+ # Keep linter-rubocop happy
51
+ s.add_development_dependency 'rubocop'
52
+
48
53
  if RUBY_PLATFORM == 'java'
49
54
  s.add_development_dependency 'jdbc-sqlite3'
50
55
  s.add_development_dependency 'activerecord-jdbcsqlite3-adapter'
@@ -68,7 +73,7 @@ Gem::Specification.new do |s|
68
73
  s.add_development_dependency 'rspec-collection_matchers'
69
74
  s.add_development_dependency 'database_cleaner'
70
75
  s.add_development_dependency 'capybara'
71
- s.add_development_dependency 'selenium-webdriver'
76
+ s.add_development_dependency 'selenium-webdriver', '< 3'
72
77
  s.add_development_dependency 'poltergeist'
73
78
  s.add_development_dependency 'spring-commands-rspec'
74
79
  s.add_development_dependency 'chromedriver-helper'
@@ -77,6 +82,7 @@ Gem::Specification.new do |s|
77
82
  s.add_development_dependency 'unparser'
78
83
  s.add_development_dependency 'jquery-rails'
79
84
  s.add_development_dependency 'pry-byebug'
80
- #s.add_development_dependency 'hyper-trace'
85
+ s.add_development_dependency 'hyper-spec'
86
+ s.add_development_dependency 'hyper-trace'
81
87
  end
82
88
  end
@@ -137,17 +137,17 @@ module ActiveRecord
137
137
 
138
138
  def synchromesh_after_create
139
139
  return if do_not_synchronize? #|| previous_changes.empty?
140
- HyperMesh.after_commit :create, self
140
+ ReactiveRecord::Broadcast.after_commit :create, self
141
141
  end
142
142
 
143
143
  def synchromesh_after_change
144
144
  return if do_not_synchronize? || previous_changes.empty?
145
- HyperMesh.after_commit :change, self
145
+ ReactiveRecord::Broadcast.after_commit :change, self
146
146
  end
147
147
 
148
148
  def synchromesh_after_destroy
149
149
  return if do_not_synchronize?
150
- HyperMesh.after_commit :destroy, self
150
+ ReactiveRecord::Broadcast.after_commit :destroy, self
151
151
  end
152
152
  else
153
153
 
@@ -1,17 +1,8 @@
1
- # module ApplicationCable
2
- # class Connection < ActionCable::Connection::Base
3
- # # we always create a connection, and use the session_id to identify it.
4
- # #identified_by :session
5
- #
6
- # # def connect
7
- # # #self.session = cookies.encrypted[Rails.application.config.session_options[:key]]
8
- # # end
9
- # end
10
- # end
11
-
12
1
  require 'set'
2
+ require 'hyperloop-config'
3
+ require 'hyper-component'
13
4
  if RUBY_ENGINE == 'opal'
14
- require "hyper-react"
5
+ require 'hyper-operation'
15
6
  require 'active_support'
16
7
  require 'time'
17
8
  require 'date'
@@ -19,6 +10,8 @@ if RUBY_ENGINE == 'opal'
19
10
  require "reactive_record/active_record/error"
20
11
  require "reactive_record/server_data_cache"
21
12
  require "reactive_record/active_record/reactive_record/while_loading"
13
+ require "reactive_record/active_record/reactive_record/operations"
14
+ require 'reactive_record/broadcast'
22
15
  require "reactive_record/active_record/reactive_record/isomorphic_base"
23
16
  require 'reactive_record/active_record/reactive_record/dummy_value'
24
17
  require 'reactive_record/active_record/reactive_record/column_types'
@@ -39,26 +32,25 @@ if RUBY_ENGINE == 'opal'
39
32
  require_relative 'opal/parse_patch'
40
33
  require_relative 'opal/set_patches'
41
34
  require_relative 'opal/equality_patches'
35
+ React::IsomorphicHelpers.log(
36
+ "The gem 'hyper-mesh' is deprecated. Use gem 'hyper-model' instead.", :warning
37
+ ) unless defined? Hyperloop::Model
42
38
  else
43
39
  require 'opal'
44
- require 'hyper-react'
40
+ require 'hyper-operation'
45
41
  require "reactive_record/permissions"
46
- require "reactive_record/engine"
47
42
  require "reactive_record/server_data_cache"
43
+ require "reactive_record/active_record/reactive_record/operations"
44
+ require 'reactive_record/broadcast'
48
45
  require "reactive_record/active_record/reactive_record/isomorphic_base"
49
46
  require "reactive_record/active_record/public_columns_hash"
50
47
  require "reactive_record/serializers"
51
48
  require "reactive_record/pry"
52
49
  require_relative 'active_record_base'
53
50
  require 'hypermesh/version'
54
- require 'synchromesh/connection'
55
- require 'synchromesh/synchromesh'
56
- require 'synchromesh/policy'
57
- require 'synchromesh/synchromesh_controller'
58
51
 
59
52
  Opal.append_path File.expand_path('../sources/', __FILE__).untaint
60
53
  Opal.append_path File.expand_path('../', __FILE__).untaint
61
54
  Opal.append_path File.expand_path('../../vendor', __FILE__).untaint
62
55
  end
63
56
  require 'enumerable/pluck'
64
- require_relative 'synchromesh/client_drivers'
@@ -0,0 +1,3 @@
1
+ module Hypermesh
2
+ VERSION = '0.6.0'
3
+ end
@@ -1,3 +1,3 @@
1
1
  module Hypermesh
2
- VERSION = '0.5.3'
2
+ VERSION = '0.5.4'
3
3
  end
@@ -135,7 +135,7 @@ module ActiveRecord
135
135
  :distinct, :unscope, :calculate, :average, :count_by_sql, :minimum, :lock, :find_by_sql, :count, :cache, :uncached, :connection, :connection_pool,
136
136
  :establish_connection, :connected?, :clear_cache!, :clear_reloadable_connections!, :connection_id, :connection_config, :clear_all_connections!,
137
137
  :remove_connection, :connection_specification_name, :connection_specification_name=, :retrieve_connection, :connection_id=, :clear_active_connections!,
138
- :sqlite3_connection, :direct_descendants, :benchmark, :model_name
138
+ :sqlite3_connection, :direct_descendants, :benchmark, :model_name, :with_options, :attr_protected, :attr_accessible
139
139
  ]
140
140
 
141
141
  def method_missing(name, *args, &block)
@@ -210,11 +210,11 @@ module ActiveRecord
210
210
  end
211
211
 
212
212
  def column_names
213
- HyperMesh::ClientDrivers.public_columns_hash.keys
213
+ ReactiveRecord::Base.public_columns_hash.keys
214
214
  end
215
215
 
216
216
  def columns_hash
217
- HyperMesh::ClientDrivers.public_columns_hash[name] || {}
217
+ ReactiveRecord::Base.public_columns_hash[name] || {}
218
218
  end
219
219
 
220
220
  def server_methods
@@ -275,6 +275,13 @@ module ActiveRecord
275
275
  [key, [value]]
276
276
  end
277
277
  end
278
+
279
+ # We do want to be doing something like this, but this breaks other stuff...
280
+ #
281
+ # ReactiveRecord::Base.load_data do
282
+ # ReactiveRecord::ServerDataCache.load_from_json(Hash[param], target)
283
+ # end
284
+
278
285
  ReactiveRecord::ServerDataCache.load_from_json(Hash[param], target)
279
286
  target
280
287
  end
@@ -73,6 +73,14 @@ module ActiveRecord
73
73
  @backing_record == ar_instance.instance_eval { @backing_record }
74
74
  end
75
75
 
76
+ def [](attr)
77
+ send(attr)
78
+ end
79
+
80
+ def []=(attr, val)
81
+ send("#{attr}=", val)
82
+ end
83
+
76
84
  def method_missing_warning(name)
77
85
  @backing_record.deprecation_warning("Server side method #{name} must be defined using the 'server_method' macro.")
78
86
  end
@@ -1,3 +1,7 @@
1
+ module Hyperloop
2
+ define_setting :public_model_directories, ['app/models/public', 'app/hyperloop/models']
3
+ end
4
+
1
5
  module ActiveRecord
2
6
  # adds method to get the HyperMesh public column types
3
7
  # for now we are just getting all models column types, but we should
@@ -6,8 +10,10 @@ module ActiveRecord
6
10
  class Base
7
11
  def self.public_columns_hash
8
12
  return @public_columns_hash if @public_columns_hash
9
- Dir.glob(Rails.root.join('app/models/public/*.rb')).each do |file|
10
- require_dependency(file)
13
+ Hyperloop.public_model_directories.each do |dir|
14
+ Dir.glob(Rails.root.join("#{dir}/*.rb")).each do |file|
15
+ require_dependency(file)
16
+ end
11
17
  end
12
18
  @public_columns_hash = {}
13
19
  descendants.each do |model|
@@ -483,7 +483,6 @@ module ReactiveRecord
483
483
  elsif ScopeDescription.find(@target_klass, method) || (args.count == 1 && method =~ /^find_by_/)
484
484
  apply_scope(method, *args)
485
485
  elsif @target_klass.respond_to?(method) && ScopeDescription.find(@target_klass, "_#{method}")
486
- puts "here we are..."
487
486
  apply_scope("_#{method}", *args).first
488
487
  else
489
488
  super
@@ -202,7 +202,8 @@ module ReactiveRecord
202
202
  end
203
203
 
204
204
  def acts_as_string?
205
- return @object.acts_as_string if @object
205
+ return true if @object.is_a? String
206
+ return @object.acts_as_string? if @object
206
207
  true
207
208
  end
208
209
 
@@ -7,10 +7,11 @@ module ReactiveRecord
7
7
  include React::IsomorphicHelpers
8
8
 
9
9
  before_first_mount do |context|
10
- HyperMesh::ClientDrivers.on_first_mount
11
10
  if RUBY_ENGINE != 'opal'
12
11
  @server_data_cache = ReactiveRecord::ServerDataCache.new(context.controller.acting_user, {})
13
12
  else
13
+ @public_columns_hash = get_public_columns_hash
14
+ define_attribute_methods
14
15
  @outer_scopes = Set.new
15
16
  @fetch_scheduled = nil
16
17
  @records = Hash.new { |hash, key| hash[key] = [] }
@@ -60,6 +61,22 @@ module ReactiveRecord
60
61
  f.when_on_server { @server_data_cache[klass, ["find_by_#{attribute}", value], :id] }
61
62
  end
62
63
 
64
+ class << self
65
+ attr_reader :public_columns_hash
66
+ end
67
+
68
+ def self.define_attribute_methods
69
+ public_columns_hash.keys.each do |model|
70
+ Object.const_get(model).define_attribute_methods rescue nil
71
+ end
72
+ end
73
+
74
+ isomorphic_method(:get_public_columns_hash) do |f|
75
+ f.when_on_client { JSON.parse(`JSON.stringify(window.ReactiveRecordPublicColumnsHash)`) }
76
+ f.send_to_server
77
+ f.when_on_server { ActiveRecord::Base.public_columns_hash }
78
+ end
79
+
63
80
  prerender_footer do
64
81
  if @server_data_cache
65
82
  json = @server_data_cache.as_json.to_json # can this just be to_json?
@@ -67,12 +84,9 @@ module ReactiveRecord
67
84
  else
68
85
  json = {}.to_json
69
86
  end
70
- path = ::Rails.application.routes.routes.detect do |route|
71
- # not sure why the second check is needed. It happens in the test app
72
- route.app == HyperMesh::Engine or (route.app.respond_to?(:app) and route.app.app == HyperMesh::Engine)
73
- end.path.spec
74
87
  "<script type='text/javascript'>\n"+
75
- "window.ReactiveRecordEnginePath = '#{path}';\n"+
88
+ "if (typeof window.ReactiveRecordPublicColumnsHash === 'undefined') { \n" +
89
+ " window.ReactiveRecordPublicColumnsHash = #{ActiveRecord::Base.public_columns_hash.to_json}}\n" +
76
90
  "if (typeof window.ReactiveRecordInitialData === 'undefined') { window.ReactiveRecordInitialData = [] }\n" +
77
91
  "window.ReactiveRecordInitialData.push(#{json})\n"+
78
92
  "</script>\n"
@@ -127,31 +141,26 @@ module ReactiveRecord
127
141
  models, associations = gather_records(@pending_records, false, nil)
128
142
  log(["Server Fetching: %o", pending_fetches.to_n])
129
143
  start_time = Time.now
130
- HTTP.post(`window.ReactiveRecordEnginePath`,
131
- payload: {
132
- json: {
133
- models: models,
134
- associations: associations,
135
- pending_fetches: pending_fetches
136
- }.to_json
137
- }
138
- ).then do |response|
139
- fetch_time = Time.now
140
- log(" Fetched in: #{(fetch_time-start_time).to_i}s")
141
- begin
142
- ReactiveRecord::Base.load_from_json(response.json)
143
- rescue Exception => e
144
- log("Unexpected exception raised while loading json from server: #{e}", :error)
144
+ Operations::Fetch(models: models, associations: associations, pending_fetches: pending_fetches)
145
+ .then do |response|
146
+ fetch_time = Time.now
147
+ log(" Fetched in: #{(fetch_time-start_time).to_i}s")
148
+ begin
149
+ ReactiveRecord::Base.load_from_json(response)
150
+ rescue Exception => e
151
+ log("Unexpected exception raised while loading json from server: #{e}", :error)
152
+ end
153
+ log(" Processed in: #{(Time.now-fetch_time).to_i}s")
154
+ log([" Returned: %o", response.to_n])
155
+ ReactiveRecord.run_blocks_to_load last_fetch_at
156
+ ReactiveRecord::WhileLoading.loaded_at last_fetch_at
157
+ ReactiveRecord::WhileLoading.quiet! if @pending_fetches.empty?
158
+ end
159
+ .fail do |response|
160
+ log("Fetch failed", :error)
161
+ # not sure what response was supposed to look like here was response.body before conversion to operations....
162
+ ReactiveRecord.run_blocks_to_load(last_fetch_at, response)
145
163
  end
146
- log(" Processed in: #{(Time.now-fetch_time).to_i}s")
147
- log([" Returned: %o", response.json.to_n])
148
- ReactiveRecord.run_blocks_to_load last_fetch_at
149
- ReactiveRecord::WhileLoading.loaded_at last_fetch_at
150
- ReactiveRecord::WhileLoading.quiet! if @pending_fetches.empty?
151
- end.fail do |response|
152
- log("Fetch failed", :error)
153
- ReactiveRecord.run_blocks_to_load(last_fetch_at, response.body)
154
- end
155
164
  @pending_fetches = []
156
165
  @pending_records = []
157
166
  @fetch_scheduled = nil
@@ -247,40 +256,31 @@ module ReactiveRecord
247
256
  backing_records.each { |id, record| record.saving! }
248
257
 
249
258
  promise = Promise.new
250
-
251
- HTTP.post(`window.ReactiveRecordEnginePath`+"/save",
252
- payload: {
253
- json: {
254
- models: models,
255
- associations: associations,
256
- validate: validate
257
- }.to_json
258
- }
259
- ).then do |response|
259
+ Operations::Save(models: models, associations: associations, validate: validate)
260
+ .then do |response|
260
261
  begin
261
- response.json[:models] = response.json[:saved_models].collect do |item|
262
+ response[:models] = response[:saved_models].collect do |item|
262
263
  backing_records[item[0]].ar_instance
263
264
  end
264
265
 
265
- if response.json[:success]
266
- response.json[:saved_models].each do | item |
267
- # was backing_records[item[0]].sync!(item[2])
268
- HyperMesh::LocalSync.after_save backing_records[item[0]].ar_instance, item[2]
266
+ if response[:success]
267
+ response[:saved_models].each do | item |
268
+ Broadcast.to_self backing_records[item[0]].ar_instance, item[2]
269
269
  end
270
270
  else
271
- log("Reactive Record Save Failed: #{response.json[:message]}", :error)
272
- response.json[:saved_models].each do | item |
271
+ log("Reactive Record Save Failed: #{response[:message]}", :error)
272
+ response[:saved_models].each do | item |
273
273
  log(" Model: #{item[1]}[#{item[0]}] Attributes: #{item[2]} Errors: #{item[3]}", :error) if item[3]
274
274
  end
275
275
  end
276
276
 
277
- response.json[:saved_models].each do | item |
277
+ response[:saved_models].each do | item |
278
278
  backing_records[item[0]].sync_unscoped_collection!
279
279
  backing_records[item[0]].errors! item[3]
280
280
  end
281
281
 
282
- yield response.json[:success], response.json[:message], response.json[:models] if block
283
- promise.resolve response.json
282
+ yield response[:success], response[:message], response[:models] if block
283
+ promise.resolve response # TODO this could be problematic... there was no .json here, so .... what's to do?
284
284
 
285
285
  backing_records.each { |id, record| record.saved! }
286
286
 
@@ -496,19 +496,11 @@ module ReactiveRecord
496
496
  promise = Promise.new
497
497
 
498
498
  if !data_loading? and (id or vector)
499
- HTTP.post(`window.ReactiveRecordEnginePath`+"/destroy",
500
- payload: {
501
- json: {
502
- model: ar_instance.model_name,
503
- id: id,
504
- vector: vector
505
- }.to_json
506
- }
507
- ).then do |response|
508
- #sync_unscoped_collection!
509
- HyperMesh::LocalSync.after_save ar_instance
510
- yield response.json[:success], response.json[:message] if block
511
- promise.resolve response.json
499
+ Operations::Destroy(model: ar_instance.model_name, id: id, vector: vector)
500
+ .then do |response|
501
+ Broadcast.to_self ar_instance
502
+ yield response[:success], response[:message] if block
503
+ promise.resolve response
512
504
  end
513
505
  else
514
506
  destroy_associations
@@ -0,0 +1,51 @@
1
+ module ReactiveRecord
2
+ module Operations
3
+ # fetch queued up records from the server
4
+ class Fetch < Hyperloop::ServerOp
5
+ param :acting_user, nils: true
6
+ param models: []
7
+ param associations: []
8
+ param :pending_fetches
9
+ step do
10
+ ReactiveRecord::ServerDataCache[
11
+ params.models.map(&:with_indifferent_access),
12
+ params.associations.map(&:with_indifferent_access),
13
+ params.pending_fetches,
14
+ params.acting_user
15
+ ]
16
+ end
17
+ end
18
+
19
+ class Save < Hyperloop::ServerOp
20
+ param :acting_user, nils: true
21
+ param models: []
22
+ param associations: []
23
+ param :validate, type: :boolean
24
+
25
+ step do
26
+ ReactiveRecord::Base.save_records(
27
+ params.models.map(&:with_indifferent_access),
28
+ params.associations.map(&:with_indifferent_access),
29
+ params.acting_user,
30
+ params.validate,
31
+ true
32
+ )
33
+ end
34
+ end
35
+
36
+ class Destroy < Hyperloop::ServerOp
37
+ param :acting_user, nils: true
38
+ param :model
39
+ param :id
40
+ param :vector
41
+ step do
42
+ ReactiveRecord::Base.destroy_record(
43
+ params.model,
44
+ params.id,
45
+ params.vector,
46
+ params.acting_user
47
+ )
48
+ end
49
+ end
50
+ end
51
+ end