hyper-mesh 0.6.0 → 1.0.0.lap22

Sign up to get free protection for your applications and to get access to all the features.
Files changed (722) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +12 -4
  3. data/.travis.yml +25 -2
  4. data/DOCS.md +722 -0
  5. data/Gemfile +2 -8
  6. data/README.md +32 -264
  7. data/Rakefile +7 -5
  8. data/dciy.toml +3 -0
  9. data/hyper-mesh.gemspec +59 -81
  10. data/lib/active_record_base.rb +3 -3
  11. data/lib/hypermesh/version.rb +1 -1
  12. data/lib/opal/parse_patch.rb +1 -1
  13. data/lib/reactive_record/active_record/aggregations.rb +1 -1
  14. data/lib/reactive_record/active_record/associations.rb +1 -5
  15. data/lib/reactive_record/active_record/class_methods.rb +6 -23
  16. data/lib/reactive_record/active_record/instance_methods.rb +30 -10
  17. data/lib/reactive_record/active_record/public_columns_hash.rb +27 -8
  18. data/lib/reactive_record/active_record/reactive_record/collection.rb +1 -1
  19. data/lib/reactive_record/active_record/reactive_record/column_types.rb +7 -1
  20. data/lib/reactive_record/active_record/reactive_record/dummy_value.rb +28 -15
  21. data/lib/reactive_record/active_record/reactive_record/isomorphic_base.rb +23 -12
  22. data/lib/reactive_record/active_record/reactive_record/while_loading.rb +84 -53
  23. data/lib/reactive_record/engine.rb +1 -1
  24. data/lib/reactive_record/server_data_cache.rb +99 -44
  25. metadata +101 -984
  26. data/docs/action_cable_quickstart.md +0 -134
  27. data/docs/activerecord_api.md +0 -275
  28. data/docs/authorization-policies.md +0 -502
  29. data/docs/client_side_scoping.md +0 -103
  30. data/docs/configuration_details.md +0 -33
  31. data/docs/pusher_faker_quickstart.md +0 -56
  32. data/docs/pusher_quickstart.md +0 -44
  33. data/docs/simple_poller_quickstart.md +0 -31
  34. data/docs/todo-example.md +0 -118
  35. data/docs/word_game.md +0 -28
  36. data/docs/words-example.md +0 -67
  37. data/examples/action-cable-production-mode/.gitignore +0 -21
  38. data/examples/action-cable-production-mode/Gemfile +0 -57
  39. data/examples/action-cable-production-mode/Gemfile.lock +0 -231
  40. data/examples/action-cable-production-mode/README.md +0 -24
  41. data/examples/action-cable-production-mode/Rakefile +0 -6
  42. data/examples/action-cable-production-mode/app/assets/config/manifest.js +0 -3
  43. data/examples/action-cable-production-mode/app/assets/images/.keep +0 -0
  44. data/examples/action-cable-production-mode/app/assets/javascripts/application.js +0 -20
  45. data/examples/action-cable-production-mode/app/assets/javascripts/cable.js +0 -13
  46. data/examples/action-cable-production-mode/app/assets/javascripts/channels/.keep +0 -0
  47. data/examples/action-cable-production-mode/app/assets/stylesheets/application.css +0 -15
  48. data/examples/action-cable-production-mode/app/channels/application_cable/channel.rb +0 -4
  49. data/examples/action-cable-production-mode/app/channels/application_cable/connection.rb +0 -4
  50. data/examples/action-cable-production-mode/app/controllers/application_controller.rb +0 -3
  51. data/examples/action-cable-production-mode/app/controllers/test_controller.rb +0 -5
  52. data/examples/action-cable-production-mode/app/models/models.rb +0 -2
  53. data/examples/action-cable-production-mode/app/models/public/application_record.rb +0 -3
  54. data/examples/action-cable-production-mode/app/models/public/word.rb +0 -2
  55. data/examples/action-cable-production-mode/app/policies/application_policy.rb +0 -14
  56. data/examples/action-cable-production-mode/app/views/components.rb +0 -16
  57. data/examples/action-cable-production-mode/app/views/components/app.rb +0 -18
  58. data/examples/action-cable-production-mode/app/views/layouts/application.html.erb +0 -14
  59. data/examples/action-cable-production-mode/bin/bundle +0 -3
  60. data/examples/action-cable-production-mode/bin/rails +0 -9
  61. data/examples/action-cable-production-mode/bin/rake +0 -9
  62. data/examples/action-cable-production-mode/bin/setup +0 -34
  63. data/examples/action-cable-production-mode/bin/spring +0 -16
  64. data/examples/action-cable-production-mode/bin/update +0 -29
  65. data/examples/action-cable-production-mode/config.ru +0 -5
  66. data/examples/action-cable-production-mode/config/application.rb +0 -18
  67. data/examples/action-cable-production-mode/config/boot.rb +0 -3
  68. data/examples/action-cable-production-mode/config/cable.yml +0 -9
  69. data/examples/action-cable-production-mode/config/database.yml +0 -25
  70. data/examples/action-cable-production-mode/config/environment.rb +0 -5
  71. data/examples/action-cable-production-mode/config/environments/development.rb +0 -56
  72. data/examples/action-cable-production-mode/config/environments/production.rb +0 -89
  73. data/examples/action-cable-production-mode/config/environments/test.rb +0 -42
  74. data/examples/action-cable-production-mode/config/initializers/application_controller_renderer.rb +0 -6
  75. data/examples/action-cable-production-mode/config/initializers/assets.rb +0 -11
  76. data/examples/action-cable-production-mode/config/initializers/backtrace_silencers.rb +0 -7
  77. data/examples/action-cable-production-mode/config/initializers/cookies_serializer.rb +0 -5
  78. data/examples/action-cable-production-mode/config/initializers/filter_parameter_logging.rb +0 -4
  79. data/examples/action-cable-production-mode/config/initializers/hyper_mesh.rb +0 -4
  80. data/examples/action-cable-production-mode/config/initializers/inflections.rb +0 -16
  81. data/examples/action-cable-production-mode/config/initializers/mime_types.rb +0 -4
  82. data/examples/action-cable-production-mode/config/initializers/new_framework_defaults.rb +0 -24
  83. data/examples/action-cable-production-mode/config/initializers/session_store.rb +0 -3
  84. data/examples/action-cable-production-mode/config/initializers/wrap_parameters.rb +0 -14
  85. data/examples/action-cable-production-mode/config/locales/en.yml +0 -23
  86. data/examples/action-cable-production-mode/config/puma.rb +0 -47
  87. data/examples/action-cable-production-mode/config/routes.rb +0 -5
  88. data/examples/action-cable-production-mode/config/secrets.yml +0 -22
  89. data/examples/action-cable-production-mode/config/spring.rb +0 -6
  90. data/examples/action-cable-production-mode/db/migrate/20161114213840_create_words.rb +0 -9
  91. data/examples/action-cable-production-mode/db/schema.rb +0 -34
  92. data/examples/action-cable-production-mode/db/seeds.rb +0 -7
  93. data/examples/action-cable-production-mode/lib/assets/.keep +0 -0
  94. data/examples/action-cable-production-mode/lib/tasks/.keep +0 -0
  95. data/examples/action-cable-production-mode/public/404.html +0 -67
  96. data/examples/action-cable-production-mode/public/422.html +0 -67
  97. data/examples/action-cable-production-mode/public/500.html +0 -66
  98. data/examples/action-cable-production-mode/public/apple-touch-icon-precomposed.png +0 -0
  99. data/examples/action-cable-production-mode/public/apple-touch-icon.png +0 -0
  100. data/examples/action-cable-production-mode/public/assets/.sprockets-manifest-3e9abd3ee8ba47c39a55b61ae37ed9e1.json +0 -1
  101. data/examples/action-cable-production-mode/public/favicon.ico +0 -0
  102. data/examples/action-cable-production-mode/public/robots.txt +0 -5
  103. data/examples/action-cable-production-mode/test/controllers/.keep +0 -0
  104. data/examples/action-cable-production-mode/test/fixtures/.keep +0 -0
  105. data/examples/action-cable-production-mode/test/fixtures/files/.keep +0 -0
  106. data/examples/action-cable-production-mode/test/fixtures/words.yml +0 -7
  107. data/examples/action-cable-production-mode/test/helpers/.keep +0 -0
  108. data/examples/action-cable-production-mode/test/integration/.keep +0 -0
  109. data/examples/action-cable-production-mode/test/mailers/.keep +0 -0
  110. data/examples/action-cable-production-mode/test/models/.keep +0 -0
  111. data/examples/action-cable-production-mode/test/models/word_test.rb +0 -7
  112. data/examples/action-cable-production-mode/test/test_helper.rb +0 -10
  113. data/examples/action-cable-production-mode/vendor/assets/javascripts/.keep +0 -0
  114. data/examples/action-cable-production-mode/vendor/assets/stylesheets/.keep +0 -0
  115. data/examples/action-cable/.gitignore +0 -21
  116. data/examples/action-cable/Gemfile +0 -58
  117. data/examples/action-cable/Gemfile.lock +0 -248
  118. data/examples/action-cable/README.md +0 -24
  119. data/examples/action-cable/Rakefile +0 -6
  120. data/examples/action-cable/app/assets/config/manifest.js +0 -3
  121. data/examples/action-cable/app/assets/images/.keep +0 -0
  122. data/examples/action-cable/app/assets/javascripts/application.js +0 -20
  123. data/examples/action-cable/app/assets/javascripts/cable.js +0 -13
  124. data/examples/action-cable/app/assets/javascripts/channels/.keep +0 -0
  125. data/examples/action-cable/app/assets/stylesheets/application.css +0 -15
  126. data/examples/action-cable/app/channels/application_cable/channel.rb +0 -4
  127. data/examples/action-cable/app/channels/application_cable/connection.rb +0 -4
  128. data/examples/action-cable/app/controllers/application_controller.rb +0 -3
  129. data/examples/action-cable/app/controllers/test_controller.rb +0 -5
  130. data/examples/action-cable/app/models/models.rb +0 -2
  131. data/examples/action-cable/app/models/public/.keep +0 -0
  132. data/examples/action-cable/app/models/public/application_record.rb +0 -3
  133. data/examples/action-cable/app/models/public/word.rb +0 -2
  134. data/examples/action-cable/app/policies/application_policy.rb +0 -14
  135. data/examples/action-cable/app/views/components.rb +0 -16
  136. data/examples/action-cable/app/views/components/app.rb +0 -18
  137. data/examples/action-cable/app/views/layouts/application.html.erb +0 -14
  138. data/examples/action-cable/bin/bundle +0 -3
  139. data/examples/action-cable/bin/rails +0 -9
  140. data/examples/action-cable/bin/rake +0 -9
  141. data/examples/action-cable/bin/setup +0 -34
  142. data/examples/action-cable/bin/spring +0 -16
  143. data/examples/action-cable/bin/update +0 -29
  144. data/examples/action-cable/config.ru +0 -5
  145. data/examples/action-cable/config/application.rb +0 -20
  146. data/examples/action-cable/config/boot.rb +0 -3
  147. data/examples/action-cable/config/cable.yml +0 -9
  148. data/examples/action-cable/config/database.yml +0 -25
  149. data/examples/action-cable/config/environment.rb +0 -5
  150. data/examples/action-cable/config/environments/development.rb +0 -56
  151. data/examples/action-cable/config/environments/production.rb +0 -86
  152. data/examples/action-cable/config/environments/test.rb +0 -42
  153. data/examples/action-cable/config/initializers/application_controller_renderer.rb +0 -6
  154. data/examples/action-cable/config/initializers/assets.rb +0 -11
  155. data/examples/action-cable/config/initializers/backtrace_silencers.rb +0 -7
  156. data/examples/action-cable/config/initializers/cookies_serializer.rb +0 -5
  157. data/examples/action-cable/config/initializers/filter_parameter_logging.rb +0 -4
  158. data/examples/action-cable/config/initializers/hyperloop.rb +0 -4
  159. data/examples/action-cable/config/initializers/inflections.rb +0 -16
  160. data/examples/action-cable/config/initializers/mime_types.rb +0 -4
  161. data/examples/action-cable/config/initializers/new_framework_defaults.rb +0 -24
  162. data/examples/action-cable/config/initializers/session_store.rb +0 -3
  163. data/examples/action-cable/config/initializers/wrap_parameters.rb +0 -14
  164. data/examples/action-cable/config/locales/en.yml +0 -23
  165. data/examples/action-cable/config/puma.rb +0 -47
  166. data/examples/action-cable/config/routes.rb +0 -5
  167. data/examples/action-cable/config/secrets.yml +0 -22
  168. data/examples/action-cable/config/spring.rb +0 -6
  169. data/examples/action-cable/db/migrate/20161114213840_create_words.rb +0 -9
  170. data/examples/action-cable/db/schema.rb +0 -34
  171. data/examples/action-cable/db/seeds.rb +0 -7
  172. data/examples/action-cable/lib/assets/.keep +0 -0
  173. data/examples/action-cable/lib/tasks/.keep +0 -0
  174. data/examples/action-cable/public/404.html +0 -67
  175. data/examples/action-cable/public/422.html +0 -67
  176. data/examples/action-cable/public/500.html +0 -66
  177. data/examples/action-cable/public/apple-touch-icon-precomposed.png +0 -0
  178. data/examples/action-cable/public/apple-touch-icon.png +0 -0
  179. data/examples/action-cable/public/favicon.ico +0 -0
  180. data/examples/action-cable/public/robots.txt +0 -5
  181. data/examples/action-cable/test/controllers/.keep +0 -0
  182. data/examples/action-cable/test/fixtures/.keep +0 -0
  183. data/examples/action-cable/test/fixtures/files/.keep +0 -0
  184. data/examples/action-cable/test/fixtures/words.yml +0 -7
  185. data/examples/action-cable/test/helpers/.keep +0 -0
  186. data/examples/action-cable/test/integration/.keep +0 -0
  187. data/examples/action-cable/test/mailers/.keep +0 -0
  188. data/examples/action-cable/test/models/.keep +0 -0
  189. data/examples/action-cable/test/models/word_test.rb +0 -7
  190. data/examples/action-cable/test/test_helper.rb +0 -10
  191. data/examples/action-cable/vendor/assets/javascripts/.keep +0 -0
  192. data/examples/action-cable/vendor/assets/stylesheets/.keep +0 -0
  193. data/examples/pusher-fake/.gitignore +0 -21
  194. data/examples/pusher-fake/Gemfile +0 -59
  195. data/examples/pusher-fake/Gemfile.lock +0 -262
  196. data/examples/pusher-fake/README.md +0 -24
  197. data/examples/pusher-fake/Rakefile +0 -6
  198. data/examples/pusher-fake/app/assets/config/manifest.js +0 -3
  199. data/examples/pusher-fake/app/assets/images/.keep +0 -0
  200. data/examples/pusher-fake/app/assets/javascripts/application.js +0 -21
  201. data/examples/pusher-fake/app/assets/stylesheets/application.css +0 -15
  202. data/examples/pusher-fake/app/controllers/application_controller.rb +0 -3
  203. data/examples/pusher-fake/app/controllers/test_controller.rb +0 -5
  204. data/examples/pusher-fake/app/models/models.rb +0 -2
  205. data/examples/pusher-fake/app/models/public/.keep +0 -0
  206. data/examples/pusher-fake/app/models/public/application_record.rb +0 -3
  207. data/examples/pusher-fake/app/models/public/word.rb +0 -2
  208. data/examples/pusher-fake/app/policies/application_policy.rb +0 -14
  209. data/examples/pusher-fake/app/views/components.rb +0 -16
  210. data/examples/pusher-fake/app/views/components/app.rb +0 -18
  211. data/examples/pusher-fake/app/views/layouts/application.html.erb +0 -14
  212. data/examples/pusher-fake/bin/bundle +0 -3
  213. data/examples/pusher-fake/bin/rails +0 -9
  214. data/examples/pusher-fake/bin/rake +0 -9
  215. data/examples/pusher-fake/bin/setup +0 -34
  216. data/examples/pusher-fake/bin/spring +0 -16
  217. data/examples/pusher-fake/bin/update +0 -29
  218. data/examples/pusher-fake/config.ru +0 -5
  219. data/examples/pusher-fake/config/application.rb +0 -20
  220. data/examples/pusher-fake/config/boot.rb +0 -3
  221. data/examples/pusher-fake/config/database.yml +0 -25
  222. data/examples/pusher-fake/config/environment.rb +0 -5
  223. data/examples/pusher-fake/config/environments/development.rb +0 -56
  224. data/examples/pusher-fake/config/environments/production.rb +0 -86
  225. data/examples/pusher-fake/config/environments/test.rb +0 -42
  226. data/examples/pusher-fake/config/initializers/application_controller_renderer.rb +0 -6
  227. data/examples/pusher-fake/config/initializers/assets.rb +0 -11
  228. data/examples/pusher-fake/config/initializers/backtrace_silencers.rb +0 -7
  229. data/examples/pusher-fake/config/initializers/cookies_serializer.rb +0 -5
  230. data/examples/pusher-fake/config/initializers/filter_parameter_logging.rb +0 -4
  231. data/examples/pusher-fake/config/initializers/hyper_mesh.rb +0 -21
  232. data/examples/pusher-fake/config/initializers/inflections.rb +0 -16
  233. data/examples/pusher-fake/config/initializers/mime_types.rb +0 -4
  234. data/examples/pusher-fake/config/initializers/new_framework_defaults.rb +0 -24
  235. data/examples/pusher-fake/config/initializers/session_store.rb +0 -3
  236. data/examples/pusher-fake/config/initializers/wrap_parameters.rb +0 -14
  237. data/examples/pusher-fake/config/locales/en.yml +0 -23
  238. data/examples/pusher-fake/config/puma.rb +0 -47
  239. data/examples/pusher-fake/config/routes.rb +0 -5
  240. data/examples/pusher-fake/config/secrets.yml +0 -22
  241. data/examples/pusher-fake/config/spring.rb +0 -6
  242. data/examples/pusher-fake/db/migrate/20161114213840_create_words.rb +0 -9
  243. data/examples/pusher-fake/db/schema.rb +0 -34
  244. data/examples/pusher-fake/db/seeds.rb +0 -7
  245. data/examples/pusher-fake/lib/assets/.keep +0 -0
  246. data/examples/pusher-fake/lib/tasks/.keep +0 -0
  247. data/examples/pusher-fake/public/404.html +0 -67
  248. data/examples/pusher-fake/public/422.html +0 -67
  249. data/examples/pusher-fake/public/500.html +0 -66
  250. data/examples/pusher-fake/public/apple-touch-icon-precomposed.png +0 -0
  251. data/examples/pusher-fake/public/apple-touch-icon.png +0 -0
  252. data/examples/pusher-fake/public/favicon.ico +0 -0
  253. data/examples/pusher-fake/public/robots.txt +0 -5
  254. data/examples/pusher-fake/test/controllers/.keep +0 -0
  255. data/examples/pusher-fake/test/fixtures/.keep +0 -0
  256. data/examples/pusher-fake/test/fixtures/files/.keep +0 -0
  257. data/examples/pusher-fake/test/fixtures/words.yml +0 -7
  258. data/examples/pusher-fake/test/helpers/.keep +0 -0
  259. data/examples/pusher-fake/test/integration/.keep +0 -0
  260. data/examples/pusher-fake/test/mailers/.keep +0 -0
  261. data/examples/pusher-fake/test/models/.keep +0 -0
  262. data/examples/pusher-fake/test/models/word_test.rb +0 -7
  263. data/examples/pusher-fake/test/test_helper.rb +0 -10
  264. data/examples/pusher-fake/vendor/assets/javascripts/.keep +0 -0
  265. data/examples/pusher-fake/vendor/assets/stylesheets/.keep +0 -0
  266. data/examples/pusher/.gitignore +0 -21
  267. data/examples/pusher/Gemfile +0 -58
  268. data/examples/pusher/Gemfile.lock +0 -236
  269. data/examples/pusher/README.md +0 -24
  270. data/examples/pusher/Rakefile +0 -6
  271. data/examples/pusher/app/assets/config/manifest.js +0 -3
  272. data/examples/pusher/app/assets/images/.keep +0 -0
  273. data/examples/pusher/app/assets/javascripts/application.js +0 -21
  274. data/examples/pusher/app/assets/stylesheets/application.css +0 -15
  275. data/examples/pusher/app/controllers/application_controller.rb +0 -3
  276. data/examples/pusher/app/controllers/test_controller.rb +0 -5
  277. data/examples/pusher/app/models/models.rb +0 -2
  278. data/examples/pusher/app/models/public/.keep +0 -0
  279. data/examples/pusher/app/models/public/application_record.rb +0 -3
  280. data/examples/pusher/app/models/public/word.rb +0 -2
  281. data/examples/pusher/app/policies/application_policy.rb +0 -14
  282. data/examples/pusher/app/views/components.rb +0 -16
  283. data/examples/pusher/app/views/components/app.rb +0 -18
  284. data/examples/pusher/app/views/layouts/application.html.erb +0 -14
  285. data/examples/pusher/bin/bundle +0 -3
  286. data/examples/pusher/bin/rails +0 -9
  287. data/examples/pusher/bin/rake +0 -9
  288. data/examples/pusher/bin/setup +0 -34
  289. data/examples/pusher/bin/spring +0 -16
  290. data/examples/pusher/bin/update +0 -29
  291. data/examples/pusher/config.ru +0 -5
  292. data/examples/pusher/config/application.rb +0 -20
  293. data/examples/pusher/config/boot.rb +0 -3
  294. data/examples/pusher/config/database.yml +0 -25
  295. data/examples/pusher/config/environment.rb +0 -5
  296. data/examples/pusher/config/environments/development.rb +0 -56
  297. data/examples/pusher/config/environments/production.rb +0 -86
  298. data/examples/pusher/config/environments/test.rb +0 -42
  299. data/examples/pusher/config/initializers/application_controller_renderer.rb +0 -6
  300. data/examples/pusher/config/initializers/assets.rb +0 -11
  301. data/examples/pusher/config/initializers/backtrace_silencers.rb +0 -7
  302. data/examples/pusher/config/initializers/cookies_serializer.rb +0 -5
  303. data/examples/pusher/config/initializers/filter_parameter_logging.rb +0 -4
  304. data/examples/pusher/config/initializers/hyper_mesh.rb +0 -10
  305. data/examples/pusher/config/initializers/inflections.rb +0 -16
  306. data/examples/pusher/config/initializers/mime_types.rb +0 -4
  307. data/examples/pusher/config/initializers/new_framework_defaults.rb +0 -24
  308. data/examples/pusher/config/initializers/session_store.rb +0 -3
  309. data/examples/pusher/config/initializers/wrap_parameters.rb +0 -14
  310. data/examples/pusher/config/locales/en.yml +0 -23
  311. data/examples/pusher/config/puma.rb +0 -47
  312. data/examples/pusher/config/routes.rb +0 -5
  313. data/examples/pusher/config/secrets.yml +0 -22
  314. data/examples/pusher/config/spring.rb +0 -6
  315. data/examples/pusher/db/migrate/20161114213840_create_words.rb +0 -9
  316. data/examples/pusher/db/schema.rb +0 -34
  317. data/examples/pusher/db/seeds.rb +0 -7
  318. data/examples/pusher/lib/assets/.keep +0 -0
  319. data/examples/pusher/lib/tasks/.keep +0 -0
  320. data/examples/pusher/public/404.html +0 -67
  321. data/examples/pusher/public/422.html +0 -67
  322. data/examples/pusher/public/500.html +0 -66
  323. data/examples/pusher/public/apple-touch-icon-precomposed.png +0 -0
  324. data/examples/pusher/public/apple-touch-icon.png +0 -0
  325. data/examples/pusher/public/favicon.ico +0 -0
  326. data/examples/pusher/public/robots.txt +0 -5
  327. data/examples/pusher/test/controllers/.keep +0 -0
  328. data/examples/pusher/test/fixtures/.keep +0 -0
  329. data/examples/pusher/test/fixtures/files/.keep +0 -0
  330. data/examples/pusher/test/fixtures/words.yml +0 -7
  331. data/examples/pusher/test/helpers/.keep +0 -0
  332. data/examples/pusher/test/integration/.keep +0 -0
  333. data/examples/pusher/test/mailers/.keep +0 -0
  334. data/examples/pusher/test/models/.keep +0 -0
  335. data/examples/pusher/test/models/word_test.rb +0 -7
  336. data/examples/pusher/test/test_helper.rb +0 -10
  337. data/examples/pusher/vendor/assets/javascripts/.keep +0 -0
  338. data/examples/pusher/vendor/assets/stylesheets/.keep +0 -0
  339. data/examples/simple-poller/.gitignore +0 -21
  340. data/examples/simple-poller/Gemfile +0 -57
  341. data/examples/simple-poller/Gemfile.lock +0 -229
  342. data/examples/simple-poller/README.md +0 -24
  343. data/examples/simple-poller/Rakefile +0 -6
  344. data/examples/simple-poller/app/assets/config/manifest.js +0 -3
  345. data/examples/simple-poller/app/assets/images/.keep +0 -0
  346. data/examples/simple-poller/app/assets/javascripts/application.js +0 -21
  347. data/examples/simple-poller/app/assets/stylesheets/application.css +0 -15
  348. data/examples/simple-poller/app/controllers/application_controller.rb +0 -3
  349. data/examples/simple-poller/app/controllers/test_controller.rb +0 -5
  350. data/examples/simple-poller/app/models/models.rb +0 -2
  351. data/examples/simple-poller/app/models/public/.keep +0 -0
  352. data/examples/simple-poller/app/models/public/application_record.rb +0 -3
  353. data/examples/simple-poller/app/models/public/word.rb +0 -2
  354. data/examples/simple-poller/app/policies/application_policy.rb +0 -14
  355. data/examples/simple-poller/app/views/components.rb +0 -16
  356. data/examples/simple-poller/app/views/components/app.rb +0 -18
  357. data/examples/simple-poller/app/views/layouts/application.html.erb +0 -14
  358. data/examples/simple-poller/bin/bundle +0 -3
  359. data/examples/simple-poller/bin/rails +0 -9
  360. data/examples/simple-poller/bin/rake +0 -9
  361. data/examples/simple-poller/bin/setup +0 -34
  362. data/examples/simple-poller/bin/spring +0 -16
  363. data/examples/simple-poller/bin/update +0 -29
  364. data/examples/simple-poller/config.ru +0 -5
  365. data/examples/simple-poller/config/application.rb +0 -20
  366. data/examples/simple-poller/config/boot.rb +0 -3
  367. data/examples/simple-poller/config/database.yml +0 -25
  368. data/examples/simple-poller/config/environment.rb +0 -5
  369. data/examples/simple-poller/config/environments/development.rb +0 -56
  370. data/examples/simple-poller/config/environments/production.rb +0 -86
  371. data/examples/simple-poller/config/environments/test.rb +0 -42
  372. data/examples/simple-poller/config/initializers/application_controller_renderer.rb +0 -6
  373. data/examples/simple-poller/config/initializers/assets.rb +0 -11
  374. data/examples/simple-poller/config/initializers/backtrace_silencers.rb +0 -7
  375. data/examples/simple-poller/config/initializers/cookies_serializer.rb +0 -5
  376. data/examples/simple-poller/config/initializers/filter_parameter_logging.rb +0 -4
  377. data/examples/simple-poller/config/initializers/hyper_mesh.rb +0 -9
  378. data/examples/simple-poller/config/initializers/inflections.rb +0 -16
  379. data/examples/simple-poller/config/initializers/mime_types.rb +0 -4
  380. data/examples/simple-poller/config/initializers/new_framework_defaults.rb +0 -24
  381. data/examples/simple-poller/config/initializers/session_store.rb +0 -3
  382. data/examples/simple-poller/config/initializers/wrap_parameters.rb +0 -14
  383. data/examples/simple-poller/config/locales/en.yml +0 -23
  384. data/examples/simple-poller/config/puma.rb +0 -47
  385. data/examples/simple-poller/config/routes.rb +0 -5
  386. data/examples/simple-poller/config/secrets.yml +0 -22
  387. data/examples/simple-poller/config/spring.rb +0 -6
  388. data/examples/simple-poller/db/migrate/20161114213840_create_words.rb +0 -9
  389. data/examples/simple-poller/db/schema.rb +0 -34
  390. data/examples/simple-poller/db/seeds.rb +0 -7
  391. data/examples/simple-poller/lib/assets/.keep +0 -0
  392. data/examples/simple-poller/lib/tasks/.keep +0 -0
  393. data/examples/simple-poller/public/404.html +0 -67
  394. data/examples/simple-poller/public/422.html +0 -67
  395. data/examples/simple-poller/public/500.html +0 -66
  396. data/examples/simple-poller/public/apple-touch-icon-precomposed.png +0 -0
  397. data/examples/simple-poller/public/apple-touch-icon.png +0 -0
  398. data/examples/simple-poller/public/favicon.ico +0 -0
  399. data/examples/simple-poller/public/robots.txt +0 -5
  400. data/examples/simple-poller/test/controllers/.keep +0 -0
  401. data/examples/simple-poller/test/fixtures/.keep +0 -0
  402. data/examples/simple-poller/test/fixtures/files/.keep +0 -0
  403. data/examples/simple-poller/test/fixtures/words.yml +0 -7
  404. data/examples/simple-poller/test/helpers/.keep +0 -0
  405. data/examples/simple-poller/test/integration/.keep +0 -0
  406. data/examples/simple-poller/test/mailers/.keep +0 -0
  407. data/examples/simple-poller/test/models/.keep +0 -0
  408. data/examples/simple-poller/test/models/word_test.rb +0 -7
  409. data/examples/simple-poller/test/test_helper.rb +0 -10
  410. data/examples/simple-poller/vendor/assets/javascripts/.keep +0 -0
  411. data/examples/simple-poller/vendor/assets/stylesheets/.keep +0 -0
  412. data/examples/word-game/.gitignore +0 -21
  413. data/examples/word-game/Gemfile +0 -57
  414. data/examples/word-game/Gemfile.lock +0 -241
  415. data/examples/word-game/README.md +0 -24
  416. data/examples/word-game/Rakefile +0 -6
  417. data/examples/word-game/app/assets/config/manifest.js +0 -3
  418. data/examples/word-game/app/assets/images/.keep +0 -0
  419. data/examples/word-game/app/assets/javascripts/application.js +0 -20
  420. data/examples/word-game/app/assets/javascripts/cable.js +0 -13
  421. data/examples/word-game/app/assets/javascripts/channels/.keep +0 -0
  422. data/examples/word-game/app/assets/stylesheets/application.css +0 -15
  423. data/examples/word-game/app/channels/application_cable/channel.rb +0 -4
  424. data/examples/word-game/app/channels/application_cable/connection.rb +0 -4
  425. data/examples/word-game/app/controllers/application_controller.rb +0 -3
  426. data/examples/word-game/app/controllers/concerns/.keep +0 -0
  427. data/examples/word-game/app/helpers/application_helper.rb +0 -2
  428. data/examples/word-game/app/jobs/application_job.rb +0 -2
  429. data/examples/word-game/app/mailers/application_mailer.rb +0 -4
  430. data/examples/word-game/app/models/application_record.rb +0 -3
  431. data/examples/word-game/app/models/concerns/.keep +0 -0
  432. data/examples/word-game/app/models/models.rb +0 -2
  433. data/examples/word-game/app/models/public/.keep +0 -0
  434. data/examples/word-game/app/policies/application_policy.rb +0 -14
  435. data/examples/word-game/app/views/components.rb +0 -16
  436. data/examples/word-game/app/views/components/.keep +0 -0
  437. data/examples/word-game/app/views/layouts/application.html.erb +0 -14
  438. data/examples/word-game/app/views/layouts/mailer.html.erb +0 -13
  439. data/examples/word-game/app/views/layouts/mailer.text.erb +0 -1
  440. data/examples/word-game/bin/bundle +0 -3
  441. data/examples/word-game/bin/rails +0 -9
  442. data/examples/word-game/bin/rake +0 -9
  443. data/examples/word-game/bin/setup +0 -34
  444. data/examples/word-game/bin/spring +0 -16
  445. data/examples/word-game/bin/update +0 -29
  446. data/examples/word-game/config.ru +0 -5
  447. data/examples/word-game/config/application.rb +0 -20
  448. data/examples/word-game/config/boot.rb +0 -3
  449. data/examples/word-game/config/cable.yml +0 -9
  450. data/examples/word-game/config/database.yml +0 -25
  451. data/examples/word-game/config/environment.rb +0 -5
  452. data/examples/word-game/config/environments/development.rb +0 -56
  453. data/examples/word-game/config/environments/production.rb +0 -86
  454. data/examples/word-game/config/environments/test.rb +0 -42
  455. data/examples/word-game/config/initializers/application_controller_renderer.rb +0 -6
  456. data/examples/word-game/config/initializers/assets.rb +0 -11
  457. data/examples/word-game/config/initializers/backtrace_silencers.rb +0 -7
  458. data/examples/word-game/config/initializers/cookies_serializer.rb +0 -5
  459. data/examples/word-game/config/initializers/filter_parameter_logging.rb +0 -4
  460. data/examples/word-game/config/initializers/hyper_mesh.rb +0 -4
  461. data/examples/word-game/config/initializers/inflections.rb +0 -16
  462. data/examples/word-game/config/initializers/mime_types.rb +0 -4
  463. data/examples/word-game/config/initializers/new_framework_defaults.rb +0 -24
  464. data/examples/word-game/config/initializers/session_store.rb +0 -3
  465. data/examples/word-game/config/initializers/wrap_parameters.rb +0 -14
  466. data/examples/word-game/config/locales/en.yml +0 -23
  467. data/examples/word-game/config/puma.rb +0 -47
  468. data/examples/word-game/config/routes.rb +0 -4
  469. data/examples/word-game/config/secrets.yml +0 -22
  470. data/examples/word-game/config/spring.rb +0 -6
  471. data/examples/word-game/db/seeds.rb +0 -7
  472. data/examples/word-game/lib/assets/.keep +0 -0
  473. data/examples/word-game/lib/tasks/.keep +0 -0
  474. data/examples/word-game/public/404.html +0 -67
  475. data/examples/word-game/public/422.html +0 -67
  476. data/examples/word-game/public/500.html +0 -66
  477. data/examples/word-game/public/apple-touch-icon-precomposed.png +0 -0
  478. data/examples/word-game/public/apple-touch-icon.png +0 -0
  479. data/examples/word-game/public/favicon.ico +0 -0
  480. data/examples/word-game/public/robots.txt +0 -5
  481. data/examples/word-game/test/controllers/.keep +0 -0
  482. data/examples/word-game/test/fixtures/.keep +0 -0
  483. data/examples/word-game/test/fixtures/files/.keep +0 -0
  484. data/examples/word-game/test/helpers/.keep +0 -0
  485. data/examples/word-game/test/integration/.keep +0 -0
  486. data/examples/word-game/test/mailers/.keep +0 -0
  487. data/examples/word-game/test/models/.keep +0 -0
  488. data/examples/word-game/test/test_helper.rb +0 -10
  489. data/examples/word-game/vendor/assets/javascripts/.keep +0 -0
  490. data/examples/word-game/vendor/assets/stylesheets/.keep +0 -0
  491. data/examples/words/.gitignore +0 -21
  492. data/examples/words/Gemfile +0 -59
  493. data/examples/words/Gemfile.lock +0 -248
  494. data/examples/words/README.md +0 -24
  495. data/examples/words/Rakefile +0 -6
  496. data/examples/words/app/assets/config/manifest.js +0 -3
  497. data/examples/words/app/assets/javascripts/application.js +0 -18
  498. data/examples/words/app/assets/stylesheets/application.css +0 -15
  499. data/examples/words/app/controllers/application_controller.rb +0 -3
  500. data/examples/words/app/controllers/test_controller.rb +0 -6
  501. data/examples/words/app/models/models.rb +0 -2
  502. data/examples/words/app/models/public/application_record.rb +0 -3
  503. data/examples/words/app/models/public/word.rb +0 -10
  504. data/examples/words/app/policies/application_policy.rb +0 -6
  505. data/examples/words/app/views/components.rb +0 -18
  506. data/examples/words/app/views/components/app.rb +0 -31
  507. data/examples/words/app/views/layouts/application.html.erb +0 -14
  508. data/examples/words/app/views/layouts/mailer.html.erb +0 -13
  509. data/examples/words/app/views/layouts/mailer.text.erb +0 -1
  510. data/examples/words/bin/bundle +0 -3
  511. data/examples/words/bin/rails +0 -9
  512. data/examples/words/bin/rake +0 -9
  513. data/examples/words/bin/setup +0 -34
  514. data/examples/words/bin/spring +0 -15
  515. data/examples/words/bin/update +0 -29
  516. data/examples/words/config.ru +0 -5
  517. data/examples/words/config/application.rb +0 -30
  518. data/examples/words/config/boot.rb +0 -3
  519. data/examples/words/config/cable.yml +0 -9
  520. data/examples/words/config/database.yml +0 -25
  521. data/examples/words/config/environment.rb +0 -5
  522. data/examples/words/config/environments/development.rb +0 -45
  523. data/examples/words/config/environments/production.rb +0 -86
  524. data/examples/words/config/environments/test.rb +0 -42
  525. data/examples/words/config/initializers/application_controller_renderer.rb +0 -6
  526. data/examples/words/config/initializers/assets.rb +0 -11
  527. data/examples/words/config/initializers/backtrace_silencers.rb +0 -7
  528. data/examples/words/config/initializers/cookies_serializer.rb +0 -5
  529. data/examples/words/config/initializers/filter_parameter_logging.rb +0 -4
  530. data/examples/words/config/initializers/hyper_mesh.rb +0 -14
  531. data/examples/words/config/initializers/inflections.rb +0 -16
  532. data/examples/words/config/initializers/mime_types.rb +0 -4
  533. data/examples/words/config/initializers/new_framework_defaults.rb +0 -24
  534. data/examples/words/config/initializers/session_store.rb +0 -3
  535. data/examples/words/config/initializers/wrap_parameters.rb +0 -14
  536. data/examples/words/config/locales/en.yml +0 -23
  537. data/examples/words/config/puma.rb +0 -47
  538. data/examples/words/config/routes.rb +0 -5
  539. data/examples/words/config/secrets.yml +0 -22
  540. data/examples/words/config/spring.rb +0 -6
  541. data/examples/words/db/migrate/20160921223808_create_words.rb +0 -9
  542. data/examples/words/db/schema.rb +0 -28
  543. data/examples/words/public/404.html +0 -67
  544. data/examples/words/public/422.html +0 -67
  545. data/examples/words/public/500.html +0 -66
  546. data/examples/words/public/apple-touch-icon-precomposed.png +0 -0
  547. data/examples/words/public/apple-touch-icon.png +0 -0
  548. data/examples/words/public/favicon.ico +0 -0
  549. data/examples/words/public/robots.txt +0 -5
  550. data/examples/words/vendor/assets/javascripts/.keep +0 -0
  551. data/examples/words/vendor/assets/stylesheets/.keep +0 -0
  552. data/reactive_record_test_app/Gemfile +0 -20
  553. data/reactive_record_test_app/Gemfile.lock +0 -269
  554. data/reactive_record_test_app/Rakefile +0 -7
  555. data/reactive_record_test_app/app/assets/javascripts/application.rb +0 -3
  556. data/reactive_record_test_app/app/assets/javascripts/bigdecimal.rb +0 -1
  557. data/reactive_record_test_app/app/assets/javascripts/reactive_record_config.js +0 -2
  558. data/reactive_record_test_app/app/assets/stylesheets/application.css +0 -13
  559. data/reactive_record_test_app/app/controllers/application_controller.rb +0 -8
  560. data/reactive_record_test_app/app/controllers/home_controller.rb +0 -7
  561. data/reactive_record_test_app/app/helpers/application_helper.rb +0 -2
  562. data/reactive_record_test_app/app/models/models.rb.erb +0 -6
  563. data/reactive_record_test_app/app/models/public/address.rb +0 -13
  564. data/reactive_record_test_app/app/models/public/comment.rb +0 -19
  565. data/reactive_record_test_app/app/models/public/todo_item.rb +0 -36
  566. data/reactive_record_test_app/app/models/public/user.rb +0 -78
  567. data/reactive_record_test_app/config.ru +0 -33
  568. data/reactive_record_test_app/config/application.rb +0 -75
  569. data/reactive_record_test_app/config/boot.rb +0 -10
  570. data/reactive_record_test_app/config/database.yml +0 -25
  571. data/reactive_record_test_app/config/environment.rb +0 -5
  572. data/reactive_record_test_app/config/environments/development.rb +0 -43
  573. data/reactive_record_test_app/config/initializers/backtrace_silencers.rb +0 -7
  574. data/reactive_record_test_app/config/initializers/hyper_mesh_legacy_behavior.rb +0 -5
  575. data/reactive_record_test_app/config/initializers/inflections.rb +0 -15
  576. data/reactive_record_test_app/config/initializers/mime_types.rb +0 -5
  577. data/reactive_record_test_app/config/initializers/secret_token.rb +0 -7
  578. data/reactive_record_test_app/config/initializers/session_store.rb +0 -8
  579. data/reactive_record_test_app/config/initializers/wrap_parameters.rb +0 -14
  580. data/reactive_record_test_app/config/locales/en.yml +0 -5
  581. data/reactive_record_test_app/config/routes.rb +0 -6
  582. data/reactive_record_test_app/db/migrate/20150617002932_create_todo_items.rb +0 -11
  583. data/reactive_record_test_app/db/migrate/20150617134028_create_users.rb +0 -14
  584. data/reactive_record_test_app/db/migrate/20150729195556_add_address_to_user.rb +0 -20
  585. data/reactive_record_test_app/db/migrate/20150826142045_create_comments.rb +0 -10
  586. data/reactive_record_test_app/db/migrate/20150828172008_add_single_comment_to_todo_item.rb +0 -5
  587. data/reactive_record_test_app/db/migrate/20150908184118_add_address_id_to_user.rb +0 -5
  588. data/reactive_record_test_app/db/migrate/20150917220236_add_second_address_to_user.rb +0 -10
  589. data/reactive_record_test_app/db/migrate/20151009000111_add_test_data_attributes_to_user.rb +0 -6
  590. data/reactive_record_test_app/db/migrate/20160129182544_add_test_enum_to_user.rb +0 -5
  591. data/reactive_record_test_app/db/schema.rb +0 -63
  592. data/reactive_record_test_app/db/seeds.rb +0 -66
  593. data/reactive_record_test_app/public/404.html +0 -26
  594. data/reactive_record_test_app/public/422.html +0 -26
  595. data/reactive_record_test_app/public/500.html +0 -25
  596. data/reactive_record_test_app/public/favicon.ico +0 -0
  597. data/reactive_record_test_app/script/rails +0 -6
  598. data/reactive_record_test_app/spec-opal/active-record/aggregations_spec.rb +0 -41
  599. data/reactive_record_test_app/spec-opal/active-record/associations_spec.rb +0 -75
  600. data/reactive_record_test_app/spec-opal/active-record/base_spec.rb +0 -126
  601. data/reactive_record_test_app/spec-opal/active-record/dummy_value_spec.rb +0 -27
  602. data/reactive_record_test_app/spec-opal/active-record/edge_cases_spec.rb +0 -116
  603. data/reactive_record_test_app/spec-opal/active-record/enum_spec.rb +0 -43
  604. data/reactive_record_test_app/spec-opal/active-record/instance_methods_spec.rb +0 -53
  605. data/reactive_record_test_app/spec-opal/active-record/non_ar_aggregations_spec.rb +0 -74
  606. data/reactive_record_test_app/spec-opal/active-record/reactive_record_load_spec.rb +0 -23
  607. data/reactive_record_test_app/spec-opal/active-record/rendering_spec.rb +0 -230
  608. data/reactive_record_test_app/spec-opal/active-record/save_spec.rb +0 -124
  609. data/reactive_record_test_app/spec-opal/active-record/scope_spec.rb +0 -85
  610. data/reactive_record_test_app/spec-opal/active-record/update_aggregations_spec.rb +0 -76
  611. data/reactive_record_test_app/spec-opal/active-record/update_attributes_spec.rb +0 -186
  612. data/reactive_record_test_app/spec-opal/active-record/virtual_methods_spec.rb +0 -71
  613. data/reactive_record_test_app/spec-opal/index.html.erb +0 -11
  614. data/reactive_record_test_app/spec-opal/spec_helper.js.rb +0 -268
  615. data/reactive_record_test_app/spec-opal/test_spec.rb +0 -7
  616. data/reactive_record_test_app/spec-opal/vendor/es5-shim.min.js +0 -6
  617. data/reactive_record_test_app/spec_dont_run/README.md +0 -33
  618. data/reactive_record_test_app/spec_dont_run/active_record_broken/permissions_spec.rb +0 -170
  619. data/reactive_record_test_app/spec_dont_run/active_record_broken/prerendering_spec.rb +0 -50
  620. data/reactive_record_test_app/spec_dont_run/moved_to_main_spec_dir/zzzmany_to_many_spec_moved_to_main_suite.rb +0 -30
  621. data/reactive_record_test_app/spec_dont_run/moved_to_main_spec_dir/zzzrevert_record_spec_moved.rb +0 -78
  622. data/reactive_record_test_app/spec_dont_run/moved_to_main_spec_dir/zzzupdate_associations_spec_moved.rb +0 -142
  623. data/reactive_record_test_app/spec_dont_run/moved_to_main_spec_dir/zzzupdate_scopes_movedspec.rb +0 -48
  624. data/spec/batch1/aaa-unit_tests/connection_movedspec.rb +0 -144
  625. data/spec/batch1/aaa-unit_tests/dummy_value_spec.rb +0 -26
  626. data/spec/batch1/column_types/column_type_spec.rb +0 -318
  627. data/spec/batch1/crud_access_regulation/broadcast_controls_access_spec.rb +0 -99
  628. data/spec/batch1/crud_access_regulation/model_policies_spec.rb +0 -133
  629. data/spec/batch1/misc/access_like_hash_spec.rb +0 -43
  630. data/spec/batch1/misc/while_loading_spec.rb +0 -196
  631. data/spec/batch1/policies/regulate_all_broadcasts_spec.rb +0 -315
  632. data/spec/batch1/policies/regulate_broadcast_spec.rb +0 -370
  633. data/spec/batch2/authorization_spec.rb +0 -112
  634. data/spec/batch2/default_scope_spec.rb +0 -121
  635. data/spec/batch2/has_many_through_spec.rb +0 -169
  636. data/spec/batch2/relationships_spec.rb +0 -263
  637. data/spec/batch3/auto_load_itself_spec.rb +0 -24
  638. data/spec/batch3/edge_cases_spec.rb +0 -31
  639. data/spec/batch3/finder_method_spec.rb +0 -67
  640. data/spec/batch3/many_to_many_spec.rb +0 -50
  641. data/spec/batch3/pry_rescue_xspec.rb +0 -48
  642. data/spec/batch3/readme.txt +0 -0
  643. data/spec/batch3/revert_spec.rb +0 -113
  644. data/spec/batch3/save_while_loading_spec.rb +0 -44
  645. data/spec/batch3/update_associations_spec.rb +0 -189
  646. data/spec/batch3/update_scopes_spec.rb +0 -54
  647. data/spec/batch4/saving_during_commit_spec.rb +0 -64
  648. data/spec/batch4/scope_spec.rb +0 -581
  649. data/spec/batch4/scoped_todos_spec.rb +0 -167
  650. data/spec/batch4/synchromesh_spec.rb +0 -80
  651. data/spec/bin/firebug-2.0.13-fx.xpi +0 -0
  652. data/spec/component_helpers_xspec.rb +0 -49
  653. data/spec/examples/dictionary.rb +0 -239
  654. data/spec/examples/dictionary_with_client_scopes.rb +0 -196
  655. data/spec/examples/random_examples.rb +0 -133
  656. data/spec/factories/child_model.rb +0 -5
  657. data/spec/factories/comment.rb +0 -5
  658. data/spec/factories/test_models.rb +0 -5
  659. data/spec/factories/todo.rb +0 -5
  660. data/spec/factories/user.rb +0 -5
  661. data/spec/play_ground.rb +0 -64
  662. data/spec/reactive_record_factory.rb +0 -62
  663. data/spec/spec_helper.rb +0 -372
  664. data/spec/support/component_helpers.rb +0 -351
  665. data/spec/test_app/Gemfile +0 -66
  666. data/spec/test_app/Gemfile.lock +0 -303
  667. data/spec/test_app/Rakefile +0 -6
  668. data/spec/test_app/app/assets/javascripts/application.js +0 -6
  669. data/spec/test_app/app/assets/stylesheets/application.css +0 -15
  670. data/spec/test_app/app/controllers/application_controller.rb +0 -13
  671. data/spec/test_app/app/controllers/test_controller.rb +0 -5
  672. data/spec/test_app/app/models/_react_public_models.rb +0 -2
  673. data/spec/test_app/app/models/public/address.rb +0 -13
  674. data/spec/test_app/app/models/public/child_model.rb +0 -3
  675. data/spec/test_app/app/models/public/comment.rb +0 -25
  676. data/spec/test_app/app/models/public/test_model.rb +0 -5
  677. data/spec/test_app/app/models/public/todo.rb +0 -6
  678. data/spec/test_app/app/models/public/todo_item.rb +0 -36
  679. data/spec/test_app/app/models/public/user.rb +0 -88
  680. data/spec/test_app/app/policies/auto_loader_test_classa_policy.rb +0 -3
  681. data/spec/test_app/app/policies/auto_loader_test_classb_policy.rb +0 -3
  682. data/spec/test_app/app/policies/auto_loader_test_classc_policy.rb +0 -3
  683. data/spec/test_app/app/policies/auto_loader_test_classd_policy.rb +0 -3
  684. data/spec/test_app/app/views/components.rb +0 -13
  685. data/spec/test_app/app/views/components/show.rb +0 -5
  686. data/spec/test_app/app/views/layouts/application.html.erb +0 -14
  687. data/spec/test_app/bin/bundle +0 -3
  688. data/spec/test_app/bin/rails +0 -4
  689. data/spec/test_app/bin/rake +0 -4
  690. data/spec/test_app/bin/setup +0 -29
  691. data/spec/test_app/config.ru +0 -4
  692. data/spec/test_app/config/application.rb +0 -44
  693. data/spec/test_app/config/boot.rb +0 -6
  694. data/spec/test_app/config/cable.yml +0 -10
  695. data/spec/test_app/config/database.yml +0 -47
  696. data/spec/test_app/config/environment.rb +0 -5
  697. data/spec/test_app/config/environments/development.rb +0 -41
  698. data/spec/test_app/config/environments/production.rb +0 -79
  699. data/spec/test_app/config/environments/test.rb +0 -42
  700. data/spec/test_app/config/initializers/assets.rb +0 -11
  701. data/spec/test_app/config/initializers/backtrace_silencers.rb +0 -7
  702. data/spec/test_app/config/initializers/cookies_serializer.rb +0 -3
  703. data/spec/test_app/config/initializers/filter_parameter_logging.rb +0 -4
  704. data/spec/test_app/config/initializers/inflections.rb +0 -16
  705. data/spec/test_app/config/initializers/mime_types.rb +0 -4
  706. data/spec/test_app/config/initializers/session_store.rb +0 -3
  707. data/spec/test_app/config/initializers/synchromesh.rb +0 -11
  708. data/spec/test_app/config/initializers/wrap_parameters.rb +0 -14
  709. data/spec/test_app/config/locales/en.yml +0 -23
  710. data/spec/test_app/config/routes.rb +0 -61
  711. data/spec/test_app/config/secrets.yml +0 -22
  712. data/spec/test_app/db/development.sqlite3 +0 -0
  713. data/spec/test_app/db/migrate/20160731182106_create_test_models.rb +0 -75
  714. data/spec/test_app/db/schema.rb +0 -88
  715. data/spec/test_app/db/seeds.rb +0 -7
  716. data/spec/test_app/lib/assets/.keep +0 -0
  717. data/spec/test_app/public/404.html +0 -67
  718. data/spec/test_app/public/422.html +0 -67
  719. data/spec/test_app/public/500.html +0 -66
  720. data/spec/test_app/public/favicon.ico +0 -0
  721. data/spec/test_components.rb +0 -18
  722. data/spec/vendor/es5-shim.min.js +0 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e11e5ce6a75be65a400c9faec573c5a2a041cfd0
4
- data.tar.gz: 668e0d6ba99c79b60e465d3f5ac81c0075227a84
3
+ metadata.gz: 8a3f02dc7409012e66ee49ff4db2f4cf02ec7c85
4
+ data.tar.gz: 32671a9f75a0f055f008ad14d37b44ac28d1857f
5
5
  SHA512:
6
- metadata.gz: c411a44824a8ee05b8f5d473fe0ef0897775b90a01184c4865a533c05b191f5b192f4703ae29499d37a21bd748adef06a8d52feb3ff1b7070d4926bc56a8ee86
7
- data.tar.gz: bf2321ac67c2f8127d6bf115fc4d0066c878685f560c16b68662d0162dde7cb089ebb1bb0cbfd2601469e638795dde2010b421d27d8c9113d3ba61efce3c5495
6
+ metadata.gz: 24cc931546b2f95946db0ae5fb176d580ae4e1198063f03304d5454f285a7e000847c4a0b6db939cf3a479d16909ad266f8a5d800c266ca8c166ecf4abb193e7
7
+ data.tar.gz: ba0798c845d4035db45b81f7a31d9e6da86fbbdac35cadcd9f261aaa52a19b41a91ae68524224759f334e4672d4ffd044b28c250e4ea472b3f7698540d227190
data/.gitignore CHANGED
@@ -7,10 +7,11 @@
7
7
  /pkg/
8
8
  /spec/reports/
9
9
  tmp/
10
- /spec/test_app/tmp/
11
- /spec/test_app/db/test.sqlite3
12
- /spec/test_app/log/test.log
13
- /spec/test_app/log/development.log
10
+ spec/test_app/tmp/
11
+ spec/test_app/db/test.sqlite3
12
+ spec/test_app/log/test.log
13
+ spec/test_app/log/development.log
14
+ spec/test_app/Gemfile.lock
14
15
  /synchromesh-simple-poller-store
15
16
  /synchromesh-pusher-channel-store
16
17
  /Gemfile.lock
@@ -26,3 +27,10 @@ reactive_record_test_app/tmp/
26
27
  reactive_record_test_app/.sass-cache
27
28
  .DS_Store
28
29
  public/assets/*
30
+
31
+ # ignore gems
32
+ *.gem
33
+
34
+ # ingore Idea
35
+ .idea
36
+ .vscode
@@ -1,4 +1,27 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.2.2
4
- before_install: gem install bundler -v 1.10.6
3
+ - ruby
4
+ services:
5
+ - mysql
6
+ env:
7
+ - HYPER_DEV_GEM_SOURCE="https://gems.ruby-hyperloop.org" TZ=Europe/Berlin
8
+ before_install:
9
+ - sudo apt-get install -y fonts-liberation
10
+ - wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
11
+ - sudo dpkg -i google-chrome*.deb
12
+ - gem install bundler
13
+ before_script:
14
+ - cd spec/test_app
15
+ - bundle update
16
+ - rails db:setup
17
+ - cd ../../
18
+ - chromedriver-update
19
+ - ls -lR ~/.chromedriver-helper/
20
+ script: bundle exec rspec
21
+ gemfile:
22
+ - gemfiles/opal_0_10_react-rails_2_3.gemfile
23
+ - gemfiles/opal_0_10_react-rails_2_4.gemfile
24
+ - gemfiles/opal_0_11_react-rails_2_4.gemfile
25
+ matrix:
26
+ allow_failures:
27
+ - gemfile: gemfiles/opal_0_11_react-rails_2_4.gemfile
data/DOCS.md ADDED
@@ -0,0 +1,722 @@
1
+ # Hyperloop Models
2
+
3
+ Hyperloop **Models** are implemented in the **HyperModel Gem**.
4
+
5
+ In Hyperloop, your ActiveRecord Models are available in your Isomorphic code.
6
+
7
+ Components, Operations, and Stores have CRUD access to your server side ActiveRecord Models, using the standard ActiveRecord API.
8
+
9
+ In addition, Hyperloop implements push notifications (via a number of possible technologies) so changes to records on the server are dynamically pushed to all authorized clients.
10
+
11
+ In other words, one browser creates, updates, or destroys a Model, and the changes are persisted in ActiveRecord models and then broadcast to all other authorized clients.
12
+
13
+ + The `hyper-model` gem provides ActiveRecord Models to Hyperloop's Isomorphic architecture.
14
+ + You access your Model data in your Components, Operations, and Stores just like you would on the server or in an ERB or HAML view file.
15
+ + If an optional push transport is connected Hyperloop broadcasts any changes made to your ActiveRecord models as they are persisted on the server or updated by one of the authorized clients.
16
+ + Some Models can be designated as *server-only* which means they are not available to the Isomorphic code.
17
+
18
+ For example, consider a simple model called `Dictionary` which might be part of Wiktionary type app.
19
+
20
+ ```ruby
21
+ class Dictionary < ActiveRecord::Base
22
+
23
+ # attributes
24
+ # word: string
25
+ # definition: text
26
+ # pronunciation: string
27
+
28
+ scope :defined, -> { 'definition IS NOT NULL AND pronunciation IS NOT NULL' }
29
+ end
30
+ ```
31
+
32
+ Here is a very simple Hyperloop Component that shows a random word from the dictionary:
33
+
34
+ ```ruby
35
+ class WordOfTheDay < Hyperloop::Component
36
+
37
+ def pick_entry!
38
+ # pick a random word and assign the selected record to entry
39
+ @entry = Dictionary.defined.all[rand(Dictionary.defined.count)]
40
+ force_update! # redraw our component when the word changes
41
+ # Notice that we use standard ActiveRecord constructs to select our
42
+ # random entry value
43
+ end
44
+
45
+ # pick an initial entry before we mount our component...
46
+ before_mount :pick_entry
47
+
48
+ # Again in our render block we use the standard ActiveRecord API, such
49
+ # as the 'defined' scope, and the 'word', 'pronunciation', and
50
+ # 'definition' attribute getters.
51
+ render(DIV) do
52
+ DIV { "total definitions: #{Dictionary.defined.count}" }
53
+ DIV do
54
+ DIV { @entry.word }
55
+ DIV { @entry.pronunciation }
56
+ DIV { @entry.definition }
57
+ BUTTON { 'pick another' }.on(:click) { pick_entry! }
58
+ end
59
+ end
60
+ ```
61
+
62
+ For complete examples with *push* updates, see any of the apps in the `examples` directory, or build your own in 5 minutes following one of the quickstart guides:
63
+
64
+ ## Isomorphic Models
65
+
66
+ Depending on the architecture of your application, you may decide that some of your models should be Isomorphic and some should remain server-only. The consideration will be that your Isomorphic models will be compiled by Opal to JavaScript and accessible on he client (without the need for a boilerplate API) - Hyperloop takes care of the communication between your server-side models and their client-side compiled versions and you can use Policy to govern access to the models.
67
+
68
+ In order for Hyperloop to see your Models (and his make them Isomorphic) you need to move them to the `hyperloop/models` folder. Only models in this folder will be seen by Hyperloop and compiled to Javascript. Once a Model is on this folder it ill be accessable to both your client and server code.
69
+
70
+ | **Location of Models** | **Scope** |
71
+ | ------------------------- |---------------|
72
+ | `app\models` | Server-side code only |
73
+ | `app\hyperloop\models` | Isomorphic code (client and server) |
74
+
75
+ ### Rails 5.1.x
76
+
77
+ Upto Rails 4.2, all models inherited from `ActiveRecord::Base`. But starting from Rails 5, all models will inherit from `ApplicationRecord`.
78
+
79
+ To accommodate this change, the following file has been automatically added to models in Rails 5 applications.
80
+
81
+ ```ruby
82
+ # app/models/application_record.rb
83
+ class ApplicationRecord < ActiveRecord::Base
84
+ self.abstract_class = true
85
+ end
86
+ ```
87
+
88
+ For Hyperloop to see this change, this file needs to be moved (or copied if you have some server-side models) to the `apps/hyperloop` folder.
89
+
90
+ ## ActiveRecord API
91
+
92
+ Hyperloop uses a subset of the standard ActiveRecord API to give your Isomorphic Components, Operations and Stores access to your server side Models. As much as possible Hyperloop follows the syntax and semantics of ActiveRecord.
93
+
94
+ ### Interfacing to React
95
+
96
+ Hyperloop integrates with React (through Components) to deliver your Model data to the client without you having to create extra APIs or specialized controllers. The key idea of React is that when state (or params) change, the portions of the display effected by this data will be updated.
97
+
98
+ Hyperloop automatically creates React state objects that will be updated as server side data is loaded or changes. When these states change the associated parts of the display will be updated.
99
+
100
+ A brief overview of how this works will help you understand the how Hypeloop gets the job done.
101
+
102
+ #### Rendering Cycle
103
+
104
+ On the UI you will be reading models in order to display data.
105
+
106
+ If during the rendering of the display the Model data is not yet loaded, placeholder values (the default values from the `columns_hash`) will be returned by Hyperloop.
107
+
108
+ Hyperloop then keeps track of where these placeholders (or `DummyValue`s) are displayed, and when they do get loaded, those parts of the display will re-render.
109
+
110
+ If later the data changes (either due to local user actions, or receiving push updates) then again any parts of the display that were dependent on the current values will be re-rendered.
111
+
112
+ You normally do not have to be aware of this. Just access your Models using the normal scopes and finders, then compute values and display attributes as you would on the server. Initially the display will show the placeholder values and then will be replaced with the real values.
113
+
114
+ #### Prerendering
115
+
116
+ During server-side pre-rendering, Hyperloop has direct access to the server so on initial page load all the values will be loaded and present.
117
+
118
+ #### Lazy Loading
119
+
120
+ Hyperloop lazy loads values, and does not load any thing until an explicit displayable value is requested. For example `Todo.all` will have no action, but `Todo.all.pluck[:title]` will return an array of titles.
121
+
122
+ At the end of the rendering cycle the set of all values requested will be merged into a tree structure and sent to the server, returning the minimum amount of data needed.
123
+
124
+ #### Load Cycle Methods
125
+
126
+ There are a number of methods that allow you to interact with this load cycle when needed. These are documented [below](#other-methods-for-interacting-with-the-load-and-render-cycle).
127
+
128
+ ### Class Methods
129
+
130
+ #### New and Create
131
+
132
+ `new`: Takes a hash of attributes and initializes a new unsaved record. The values of any attributes not specified in the hash will be taken from the Models default values specified in the `columns_hash`.
133
+
134
+ If `new` is passed a native javascript object it will be treated as a hash and converted accordingly.
135
+
136
+ `create`: Short hand for `new(...).save`. See the `save` instance method for details on how saving is done.
137
+
138
+ #### Scoping and Finding
139
+
140
+ `scope` and `default_scope`: Hyperloop adds four new options to these methods: `joins`, `client`, `select` and `server`. The `joins` option provides information on how the scope will be joined with other models. The `client` and `select` options allow scoping to be done on the client side to offload this from the server, and the `server` option is there just for symmetry with the other options.
141
+
142
+ ```ruby
143
+ # the active scope proc is executed on the server
144
+ scope :active, -> () { where(completed: true) }
145
+
146
+ # if the scope does a join (or include) this must be indicated
147
+ # using the joins: option.
148
+ scope :with_recent_comments,
149
+ -> { joins(:comments).where('comment.created_at >= ?', Time.now-1.week) },
150
+ joins: ['comments'] # or joins: 'comments'
151
+
152
+ # the server side proc can be indicated by the server: option
153
+ # an optional client side proc can be provided to compute the scope
154
+ # locally at the client
155
+ scope :completed,
156
+ server: -> { where(complete: true) }
157
+ client: -> { complete } # return true if the record should be included
158
+ ```
159
+
160
+ `unscoped` and `all`: These builtin scopes work just like standard ActiveRecord.
161
+
162
+ ```ruby
163
+ Word.all.each { |word| LI { word.text }}
164
+ ```
165
+
166
+ BTW: to save typing you can skip the `all`: Models will respond like enumerators.
167
+
168
+ `find`: takes an id and delivers the corresponding record.
169
+
170
+ `find_by`: takes a single item hash indicating an attribute value pair to find.
171
+
172
+ `find_by_...`: i.e. `find_by_first_name` these methods will find the first record with a matching attribute.
173
+
174
+ ```ruby
175
+ Word.find_by_text('hello') # short for Word.find_by(text: 'hello')
176
+ ```
177
+
178
+ `limit` and `offset`: These builtin scopes behave as they do on the server:
179
+
180
+ ```ruby
181
+ Word.offset(500).limit(20) # get words 500-519
182
+ ```
183
+
184
+ #### Relationships and Aggregations
185
+
186
+ `belongs_to, has_many, has_one`: These all work as on the server. **However it is important that you fully specify both sides of the relationship.**
187
+
188
+ ```ruby
189
+ class Todo < ActiveRecord::Base
190
+ belongs_to :assigned_to, class_name: 'User'
191
+ end
192
+
193
+ class User < ActiveRecord::Base
194
+ has_many :todos, foreign_key: 'assigned_to_id'
195
+ end
196
+ ```
197
+
198
+ Note that on the client the linkages between relationships are live and direct. In the above example this works:
199
+
200
+ ```ruby
201
+ Todo.create(assigned_to: some_user)
202
+ ```
203
+
204
+ but this may not:
205
+
206
+ ```ruby
207
+ Todo.create(assigned_to_id: some_user.id)
208
+ ```
209
+
210
+ `composed_of`: You can create aggregate models like ActiveRecord.
211
+
212
+ Similar to the linkages in relationships, aggregate records are represented on the client as actual independent objects.
213
+
214
+ #### Defining server methods
215
+
216
+ Normally an application defined instance method will run on the client and the server:
217
+
218
+ ```ruby
219
+ class User < ActiveRecord::Base
220
+ def full_name
221
+ "#{first_name} #{last_name}"
222
+ end
223
+ end
224
+ ```
225
+
226
+ Sometimes it is desirable to only run the method on the server. This can be done using the `server_method` macro:
227
+
228
+ ```ruby
229
+ class User < ActiveRecord::Base
230
+ server_method :full_name, default: '' do
231
+ "#{first_name} #{last_name}"
232
+ end
233
+ end
234
+ ```
235
+
236
+ When the method is first called on the client the default value will be returned, and there will be a reactive update when the true value is returned from the server.
237
+
238
+ To force the value to be recomputed at the server append a `!` to the end of the name, otherwise the last value returned from the server will continue to be returned.
239
+
240
+ #### Model Information
241
+
242
+ `column_names`: returns a list of the database columns.
243
+
244
+ `columns_hash`: returns the details of the columns specification. Note that on the server `columns_hash` returns a hash of objects specifying column information. On the client the entire structure is just one big hash of hashes.
245
+
246
+ `abstract_class=`, `abstract_class?`, `primary_key`, `primary_key=`, `inheritance_column`, `inheritance_column=`, `model_name`: All work as on the server. See ActiveRecord documentation for more info.
247
+
248
+ ### Instance Methods
249
+
250
+ #### Attribute and Relationship Getter and Setters
251
+
252
+ All attributes have an associated getter and setter. All relationships have a getter. All `belongs_to` relationships also have a setter. `has_many` relationships can be updated using the push (`<<`) operator or using the `delete` method.
253
+
254
+ ```ruby
255
+ puts my_todo.title
256
+ my_todo.title = "neutitle"
257
+ my_todo.comments << a_new_comment
258
+ a_new_comment.todo == my_todo # true!
259
+ ```
260
+
261
+ In addition if the attribute getter ends with a bang (!) then this will force a fetch of the attribute from the server. This is typically not necessary if push updates are configured.
262
+
263
+ #### Saving
264
+
265
+ The `save` method works like ActiveRecord save, *except* it returns a promise that is resolved when the save completes (or fails.)
266
+
267
+ ```ruby
268
+ my_todo.save(validate: false).then do |result|
269
+ # result is a hash with {success: ..., message: , models: ....}
270
+ end
271
+ ```
272
+
273
+ After a save operation completes the models will have an `errors` hash (just like on the server) with any validation problems.
274
+
275
+ During the save operation the method `saving?` will return `true`. This can be used to instead of (or with) the promise to update the screen:
276
+
277
+ ```ruby
278
+ render do
279
+ ...
280
+ if some_model.saving?
281
+ ... display please wait ...
282
+ elsif some_model.errors.any?
283
+ ... highlight the errors ...
284
+ else
285
+ ... display data ...
286
+ end
287
+ ...
288
+ end
289
+ ```
290
+
291
+ #### Destroy
292
+
293
+ Like `save` destroy returns a promise that is resolved when the destroy completes.
294
+
295
+ After the destroy completes the record's `destroyed?` method will return true.
296
+
297
+ #### Other Instance Methods
298
+
299
+ `new?` returns true if the model is new and not yet saved.
300
+
301
+ `primary_key` returns the primary key for the model
302
+
303
+ `id` returns the value of the primary key for this instance
304
+
305
+ `model_name` returns the model_name.
306
+
307
+ `revert` Undoes any unsaved changes to the instance.
308
+
309
+ `changed?` returns true if any attributes have changed (always true for a new model)
310
+
311
+ `dup` duplicate the instance.
312
+
313
+ `==` two instances are the same if it is known that they reference the same underlying table row.
314
+
315
+ `..._changed?` (i.e. name_changed?) returns true if the specific attribute has changed.
316
+
317
+ `itself` returns the record, but will override lazy loading and force a load of at least the model's id.
318
+
319
+ ### Load and Render Cycle
320
+
321
+ #### loading? and loaded?
322
+
323
+ All Ruby objects will respond to these methods. If you want to put up a "Please Wait" message, spinner, etc, you can use the `loaded?` or `loading?` method to determine if the object represents a real loaded value or not. Any value for which `loaded?` returns `false` (or `loading?` returns `true`) will eventually load and cause a re-render
324
+
325
+ #### Hyperloop::Model.load method
326
+
327
+ Sometimes it is necessary to insure values are loaded outside of the rendering cycle. For this you can use the `Hyperloop::Model.load` method:
328
+
329
+ ```ruby
330
+ Hyperloop::Model.load do
331
+ x = my_model.some_attribute
332
+ OtherModel.find(x+12).other_attribute
333
+ # code in here can be arbitrarily complex and load
334
+ # will re-execute it until all values are loaded
335
+ # the final expression is passed to the promise
336
+ end.then |result|
337
+ puts result
338
+ end
339
+ ```
340
+
341
+ #### Force Loading Attributes
342
+
343
+ Normally you will simply display attributes as part of the render method, and when the values are loaded from the server the component will re-render.
344
+
345
+ Sometimes outside of the render method you may need to insure an attribute (or a server side method) is loaded before proceeding. This is typically when you are building some kind of higher level store.
346
+
347
+ The `load` method takes a list of attributes (symbols) and will insure these are loaded. Load returns a promise that is resolved when the load completes, or can be passed a block that will execute when the load completes.
348
+
349
+ ```ruby
350
+ before_mount do
351
+ Todo.find(1).load(:name).then do |name|
352
+ @name = name;
353
+ state.loaded! true
354
+ end
355
+ end
356
+ ```
357
+
358
+ Think hard about how you are using this, as Hyperloop already acts as flux store, and is managing state for you. It may be you are just creating a redundant store!
359
+
360
+ ## Client Side Scoping
361
+
362
+ By default scopes will be recalculated on the server. For simple scopes that do not use joins or includes no additional action needs to be taken to make scopes work with Hyperloop. For scopes that do use joins, or if you want to offload the scoping computation from the server to the client read this section.
363
+
364
+ ## ActiveRecord Scope Enhancement
365
+
366
+ When the client receives notification that a record has changed Hyperloop finds the set of currently rendered scopes that might be effected, and requests them to be updated from the server.
367
+
368
+ On the server scopes are a useful way to structure code. **On the client** scopes are vital as they limit the amount of data loaded, viewed, and updated in the browser. Consider a factory floor management system that shows *job* state as work flows through the factory. There may be millions of jobs that a production floor browser is authorized to view, but at any time there are probably only 50 being shown. Using ActiveRecord scopes is the way Hyperloop keeps the data requested by the browser limited to a reasonable amount.
369
+
370
+ To make scopes work efficiently on the client Hyperloop adds some features to the ActiveRecord `scope` and `default_scope` macros. Note you must use the `scope` macro (and not class methods) for things to work with Hyperloop.
371
+
372
+ The additional features are accessed via the `:joins`, `:client`, and `:select` options.
373
+
374
+ The `:joins` option tells the Hyperloop client which models are joined with the scope. *You must add a `:joins` option if the scope has any data base join operations in it, otherwise if a joined model changes, Hyperloop will not know to update the scope.*
375
+
376
+ The `:client` and `:select` options provide the client a way to update scopes without having to contact the server. Unlike the `:joins` option this is an optimization and is not required for scopes to work.
377
+
378
+ ```ruby
379
+ class Todo < ActiveRecord::Base
380
+
381
+ # Standard ActiveRecord form:
382
+ # the proc will be evaluated as normal on the server, and as needed updates
383
+ # will be requested from the clients
384
+
385
+ scope :active, -> () { where(completed: true) }
386
+
387
+ # In the simple form the scope will be reevaluated if the model that is
388
+ # being scoped changes, and if the scope is currently being used to render data.
389
+
390
+ # If the scope joins with other data you will need to specify this by
391
+ # passing a relationship or array of relationships to the `joins` option.
392
+
393
+ scope :with_recent_comments,
394
+ -> { joins(:comments).where('comment.created_at >= ?', Time.now-1.week) },
395
+ joins: ['comments'] # or joins: 'comments'
396
+
397
+ # Now with_recent_comments will be re-evaluated whenever a Todo record, or a Comment
398
+ # joined with a Todo change.
399
+
400
+ # Normally whenever Hyperloop detects that a scope may be effected by a changed
401
+ # model, it will request the scope be re-evaluated on the server. To offload this
402
+ # computation to the client provide a client side scope method:
403
+
404
+ scope :with_recent_comments,
405
+ -> { joins(:comments).where('comment.created_at >= ?', Time.now-1.week) },
406
+ joins: ['comments']
407
+ client: -> { comments.detect { |comment| comment.created_at >= Time.now-1.week }
408
+
409
+ # The client proc is executed on each candidate record, and if it returns true the record
410
+ # will be added to the scope.
411
+
412
+ # Instead of a client proc you can provide a select proc, which will receive the entire
413
+ # collection which can then be filtered and sorted.
414
+
415
+ scope :sort_by_created_at,
416
+ -> { order('created_at DESC') }
417
+ select: -> { sort { |a, b| b.created_at <=> a.created_at }}
418
+
419
+ # To keep things tidy you can specify the server scope proc with the :server option
420
+
421
+ scope :completed,
422
+ server: -> { where(complete: true) }
423
+ client: -> { complete }
424
+
425
+ # The expressions in the joins array can be arbitrary sequences of relationships and
426
+ # scopes such as 'comments.author'.
427
+
428
+ scope :with_managers_comments,
429
+ server: -> { ... }
430
+ joins: ['comments.author', 'owner']
431
+ client: -> { comments.detect { |comment| comment.author == owner.manager }}}
432
+
433
+ # You can also use the client, select, server, and joins option with the default_scope macro
434
+
435
+ default_scope server: -> { where(deleted: false).order('updated_at DESC') }
436
+ select: -> { select { |r| !r.deleted }.sort { |a, b| b <=> a } }
437
+
438
+ # NOTE: it is highly recommend to provide a client proc with default_scopes. Otherwise
439
+ # every change is going to require a server interaction regardless of what other client procs
440
+ # you provide.
441
+
442
+ end
443
+ ```
444
+
445
+ #### How it works
446
+
447
+ Consider this scope on the Todo model
448
+
449
+ ```ruby
450
+ scope :with_managers_comments,
451
+ server: -> { joins(owner: :manager, comments: :author).where('managers_users.id = authors_comments.id').distinct },
452
+ client: -> { comments.detect { |comment| comment.author == owner.manager }}
453
+ joins: ['comments.author', 'owner']
454
+ ```
455
+
456
+ The joins 'comments.author' relationship is inverted so that we have User 'has_many' Comments which 'belongs_to' Todos.
457
+
458
+ Thus we now know that whenever a User or a Comment changes this may effect our with_managers_comments scope
459
+
460
+ Likewise 'owner' becomes User 'has_many' Todos.
461
+
462
+ Lets say that a user changes teams and now has a new manager. This means according to the relationships that the
463
+ User model will change (i.e. there will be a new manager_id in the User model) and thus all Todos belonging to that
464
+ User are subject to evaluation.
465
+
466
+ While the server side proc efficiently delivers all the objects in the scope, the client side proc just needs to incrementally update the scope.
467
+
468
+ ## Configuring the Transport
469
+
470
+ Hyperloop implements push notifications (via a number of possible technologies) so changes to records on the server are dynamically pushed to all authorized clients.
471
+
472
+ The can be accomplished by configuring **one** of the push technologies below:
473
+
474
+ | Push Technology | When to choose this... |
475
+ |---------------------------|--------------------|
476
+ | [Simple Polling](#setting-up-simple-polling) | The easiest push transport is the built-in simple poller. This is great for demos or trying out Hyperloop but because it is constantly polling it is not suitable for production systems or any kind of real debug or test activities. |
477
+ | [Action Cable](#setting-up-action-cable) | If you are using Rails 5 this is the perfect route to go. Action Cable is a production ready transport built into Rails 5. |
478
+ | [Pusher.com](#setting-up-pusher-com) | Pusher.com is a commercial push notification service with a free basic offering. The technology works well but does require a connection to the internet at all times. |
479
+ | [Pusher Fake](#setting-up-pusher-fake) | The Pusher-Fake gem will provide a transport using the same protocol as pusher.com but you can use it to locally test an app that will be put into production using pusher.com. |
480
+
481
+ ### Setting up Simple Polling
482
+
483
+ The easiest push transport is the built-in simple poller. This is great for demos or trying out Hyperloop but because it is constantly polling it is not suitable for production systems or any kind of real debug or test activities.
484
+
485
+ Simply add this initializer:
486
+
487
+ ```ruby
488
+ #config/initializers/hyperloop.rb
489
+ Hyperloop.configuration do |config|
490
+ config.transport = :simple_poller
491
+ # options
492
+ # config.opts = {
493
+ # seconds_between_poll: 5, # default is 0.5 you may need to increase if testing with Selenium
494
+ # seconds_polled_data_will_be_retained: 1.hour # clears channel data after this time, default is 5 minutes
495
+ # }
496
+ end
497
+ ```
498
+
499
+ That's it. Hyperloop will use simple polling for the push transport.
500
+
501
+ --------------------
502
+
503
+ ### Setting up Action Cable
504
+
505
+ To configure Hyperloop to use Action Cable, add this initializer:
506
+
507
+ ```ruby
508
+ #config/initializers/hyperloop.rb
509
+ Hyperloop.configuration do |config|
510
+ config.transport = :action_cable
511
+ end
512
+ ```
513
+
514
+ If you are already using ActionCable in your app that is fine, as Hyperloop will not interfere with your existing connections.
515
+
516
+ **Otherwise** go through the following steps to setup ActionCable.
517
+
518
+ Firstly, make sure the `action_cable` js file is required in your assets.
519
+
520
+ Typically `app/assets/javascripts/application.js` will finish with a `require_tree .` and this will pull in the `cable.js` file which will pull in `action_cable.js`
521
+
522
+ However at a minimum if `application.js` simply does a `require action_cable` that will be sufficient for Hyperloop.
523
+
524
+ Make sure you have a cable.yml file:
525
+
526
+ ```yml
527
+ # config/cable.yml
528
+ development:
529
+ adapter: async
530
+
531
+ test:
532
+ adapter: async
533
+
534
+ production:
535
+ adapter: redis
536
+ url: redis://localhost:6379/1
537
+ ```
538
+
539
+ Set allowed request origins (optional):
540
+
541
+ **By default action cable will only allow connections from localhost:3000 in development.** If you are going to something other than localhost:3000 you need to add something like this to your config:
542
+
543
+ ```ruby
544
+ # config/environments/development.rb
545
+ Rails.application.configure do
546
+ config.action_cable.allowed_request_origins = ['http://localhost:3000', 'http://localhost:5000']
547
+ end
548
+ ```
549
+
550
+ That's it. Hyperloop will use Action Cable as the push transport.
551
+
552
+ ----------------
553
+
554
+ ### Setting up Pusher.com
555
+
556
+ [Pusher.com](https://pusher.com/) provides a production ready push transport for your App. You can combine this with [Pusher-Fake](/docs/pusher_faker_quickstart.md) for local testing as well. You can get a free pusher account and API keys at [https://pusher.com](https://pusher.com)
557
+
558
+ First add the Pusher and HyperLoop gems to your Rails app:
559
+
560
+ add `gem 'pusher'` to your Gemfile.
561
+
562
+ Next Add the pusher js file to your application.js file:
563
+
564
+ ```ruby
565
+ # app/assets/javascript/application.js
566
+ ...
567
+ //= require 'hyperloop/pusher'
568
+ //= require_tree .
569
+ ```
570
+
571
+ Finally set the transport:
572
+
573
+ ```ruby
574
+ # config/initializers/Hyperloop.rb
575
+ Hyperloop.configuration do |config|
576
+ config.transport = :pusher
577
+ config.channel_prefix = "Hyperloop"
578
+ config.opts = {
579
+ app_id: "2....9",
580
+ key: "f.....g",
581
+ secret: "1.......3"
582
+ }
583
+ end
584
+ ```
585
+
586
+ That's it. You should be all set for push notifications using Pusher.com.
587
+
588
+ -------------------------
589
+ ### Setting up Pusher Fake
590
+
591
+ The [Pusher-Fake](https://github.com/tristandunn/pusher-fake) gem will provide a transport using the same protocol as pusher.com. You can use it to locally test an app that will be put into production using pusher.com.
592
+
593
+ Firstly add the Pusher, Pusher-Fake and HyperLoop gems to your Rails app
594
+
595
+ - add `gem 'pusher'` to your Gemfile.
596
+ - add `gem 'pusher-fake'` to the development and test sections of your Gemfile.
597
+
598
+ Next add the pusher js file to your application.js file
599
+
600
+ ```ruby
601
+ # app/assets/javascript/application.js
602
+ ...
603
+ //= require 'hyperloop/pusher'
604
+ //= require_tree .
605
+ ```
606
+
607
+ Add this initializer to set the transport:
608
+
609
+ ```ruby
610
+ # typically app/config/initializers/Hyperloop.rb
611
+ # or you can do a similar setup in your tests (see this gem's specs)
612
+ require 'pusher'
613
+ require 'pusher-fake'
614
+ # Assign any values to the Pusher app_id, key, and secret config values.
615
+ # These can be fake values or the real values for your pusher account.
616
+ Pusher.app_id = "MY_TEST_ID" # you use the real or fake values
617
+ Pusher.key = "MY_TEST_KEY"
618
+ Pusher.secret = "MY_TEST_SECRET"
619
+ # The next line actually starts the pusher-fake server (see the Pusher-Fake readme for details.)
620
+ require 'pusher-fake/support/base' # if using pusher with rspec change this to pusher-fake/support/rspec
621
+ # now copy over the credentials, and merge with PusherFake's config details
622
+ Hyperloop.configuration do |config|
623
+ config.transport = :pusher
624
+ config.channel_prefix = "Hyperloop"
625
+ config.opts = {
626
+ app_id: Pusher.app_id,
627
+ key: Pusher.key,
628
+ secret: Pusher.secret
629
+ }.merge(PusherFake.configuration.web_options)
630
+ end
631
+ ```
632
+
633
+ That's it. You should be all set for push notifications using Pusher Fake.
634
+
635
+ ## Debugging
636
+
637
+ Sometimes you need to figure out what connections are available, or what attributes are readable etc.
638
+
639
+ Its usually all to do with your policies, but perhaps you just need a little investigation.
640
+
641
+ TODO check rr has become hyperloop (as below)
642
+
643
+ You can bring up a console within the controller context by browsing `localhost:3000/hyperloop/console`
644
+
645
+ **Note: change `rr` to wherever you are mounting Hyperloop in your routes file.**
646
+
647
+ **Note: in rails 4, you will need to add the gem 'web-console' to your development section**
648
+
649
+ Within the context you have access to `session.id` and current `acting_user` which you will need, plus some helper methods to reduce typing
650
+
651
+ - Getting auto connection channels:
652
+ `channels(session_id = session.id, user = acting_user)`
653
+ e.g. `channels` returns all channels connecting to this session and user providing nil as the acting_user will test if connections can be made without there being a logged in user.
654
+
655
+ - Can a specific class connection be made:
656
+ `can_connect?(channel, user = acting_user)`
657
+ e.g. `can_connect? Todo` returns true if current acting_user can connect to the Todo class. You can also provide the class name as a string.
658
+
659
+ - Can a specific instance connection be made:
660
+ `can_connect?(channel, user = acting_user)`
661
+ e.g. `can_connect? Todo.first` returns true if current acting_user can connect to the first Todo Model. You can also provide the instance in the form 'Todo-123'
662
+
663
+ - What attributes are accessible for a Model instance:
664
+ `viewable_attributes(instance, user = acting_user)`
665
+
666
+ - Can the attribute be viewed:
667
+ `view_permitted?(instance, attribute, user = acting_user)`
668
+
669
+ - Can a Model be created/updated/destroyed:
670
+ `create_permitted?(instance, user = acting_user)`
671
+ e.g. `create_permitted?(Todo.new, nil)` can anybody save a new todo?
672
+ e.g. `destroy_permitted?(Todo.last)` can the acting_user destroy the last Todo
673
+
674
+ You can of course simulate server side changes to your Models through this console like any other console. For example
675
+
676
+ `Todo.new.save` will broadcast the changes to the Todo Model to any authorized channels.
677
+
678
+ ## Common Errors
679
+
680
+ - **No policy class**
681
+ If you don't define a policy file, nothing will happen because nothing will get connected. By default Hyperloop will look for a `ApplicationPolicy` class.
682
+
683
+ - **Wrong version of pusher-fake** (pusher-fake/base vs. pusher-fake/rspec) See the Pusher-Fake gem repo for details.
684
+
685
+ - Forgetting to add `require pusher` in application.js file
686
+ this results in an error like this:
687
+ ```text
688
+ Exception raised while rendering #<TopLevelRailsComponent:0x53e>
689
+ ReferenceError: Pusher is not defined
690
+ ```
691
+ To resolve make sure you `require 'pusher'` in your application.js file if using pusher. DO NOT require pusher from your components manifest as this will cause prerendering to fail.
692
+
693
+ - **No create/update/destroy policies**
694
+ You must explicitly allow changes to the Models to be made by the client. If you don't you will see 500 responses from the server when you try to update. To open all access do this in your application policy: `allow_change(to: :all, on: [:create, :update, :destroy]) { true }`
695
+
696
+ - **Cannot connect to real pusher account**
697
+ If you are trying to use a real pusher account (not pusher-fake) but see errors like this
698
+ ```text
699
+ pusher.self.js?body=1:62 WebSocket connection to
700
+ 'wss://127.0.0.1/app/PUSHER_API_KEY?protocol=7&client=js&version=3.0.0&flash=false'
701
+ failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED
702
+ ```
703
+ Check to see if you are including the pusher-fake gem.
704
+ Hyperloop will always try to use pusher-fake if it sees the gem included. Remove it and you should be good to go. See [issue #5](https://github.com/hyper-react/HyperMesh/issues/5) for more details.
705
+
706
+ - **Cannot connect with ActionCable.**
707
+ Make sure that `config.action_cable.allowed_request_origins` includes the url you use for development (including the port) and that you are using `Puma`.
708
+
709
+ - **Attributes are not being converted from strings, or do not have their default values**
710
+ Eager loading is probably turned off. Hyperloop needs to eager load `hyperloop/models` so it can find all the column information for all Isomorphic models.
711
+
712
+ - **When starting rails you get a message on the rails console `couldn't find file 'browser'`**
713
+ The `hyper-component` v0.10.0 gem removed the dependency on opal-browser. You will have to add the 'opal-browser' gem to your Gemfile.
714
+
715
+ - **On page load you get a message about super class mismatch for `DummyValue`**
716
+ You are still have the old `reactive-record` gem in your Gemfile, remove it from your gemfile and your components manifest.
717
+
718
+ - **On page load you get a message about no method `session` for `nil`**
719
+ You are still referencing the old reactive-ruby or reactrb gems either directly or indirectly though a gem like reactrb-router. Replace any gems like `reactrb-router` with `hyper-router`. You can also just remove `reactrb`, as `hyper-model` will be included by the `hyper-model` gem.
720
+
721
+ - **You keep seeing the message `WebSocket connection to 'ws://localhost:3000/cable' failed: WebSocket is closed before the connection is established.`** every few seconds in the console.
722
+ There are probably lots of reasons for this, but it means ActionCable can't get itself going. One reason is that you are trying to run with Passenger instead of Puma, and trying to use `async` mode in cable.yml file. `async` mode requires Puma.