hyper-mesh 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (469) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +27 -0
  3. data/.rspec +2 -0
  4. data/.rubocop.yml +11 -0
  5. data/.travis.yml +4 -0
  6. data/CODE_OF_CONDUCT.md +13 -0
  7. data/Gemfile +5 -0
  8. data/LICENSE.txt +21 -0
  9. data/README.md +396 -0
  10. data/Rakefile +6 -0
  11. data/app/controllers/reactive_record/application_controller.rb +4 -0
  12. data/app/controllers/reactive_record/reactive_record_controller.rb +49 -0
  13. data/bin/console +14 -0
  14. data/bin/setup +7 -0
  15. data/codeship.database.yml +18 -0
  16. data/config/routes.rb +7 -0
  17. data/docs/action_cable_quickstart.md +151 -0
  18. data/docs/authorization-policies.md +449 -0
  19. data/docs/client_side_scoping.md +103 -0
  20. data/docs/pusher_quickstart.md +0 -0
  21. data/docs/simple_poller_quickstart.md +121 -0
  22. data/docs/todo-example.md +116 -0
  23. data/docs/words-example.md +65 -0
  24. data/examples/action-cable/.gitignore +21 -0
  25. data/examples/action-cable/Gemfile +58 -0
  26. data/examples/action-cable/Gemfile.lock +247 -0
  27. data/examples/action-cable/README.md +24 -0
  28. data/examples/action-cable/Rakefile +6 -0
  29. data/examples/action-cable/app/assets/config/manifest.js +3 -0
  30. data/examples/action-cable/app/assets/javascripts/application.js +18 -0
  31. data/examples/action-cable/app/assets/stylesheets/application.css +15 -0
  32. data/examples/action-cable/app/controllers/application_controller.rb +3 -0
  33. data/examples/action-cable/app/controllers/test_controller.rb +6 -0
  34. data/examples/action-cable/app/models/models.rb +2 -0
  35. data/examples/action-cable/app/models/public/application_record.rb +3 -0
  36. data/examples/action-cable/app/models/public/word.rb +2 -0
  37. data/examples/action-cable/app/policies/application_policy.rb +6 -0
  38. data/examples/action-cable/app/views/components.rb +17 -0
  39. data/examples/action-cable/app/views/components/app.rb +18 -0
  40. data/examples/action-cable/app/views/layouts/application.html.erb +14 -0
  41. data/examples/action-cable/app/views/layouts/mailer.html.erb +13 -0
  42. data/examples/action-cable/app/views/layouts/mailer.text.erb +1 -0
  43. data/examples/action-cable/bin/bundle +3 -0
  44. data/examples/action-cable/bin/rails +9 -0
  45. data/examples/action-cable/bin/rake +9 -0
  46. data/examples/action-cable/bin/setup +34 -0
  47. data/examples/action-cable/bin/spring +15 -0
  48. data/examples/action-cable/bin/update +29 -0
  49. data/examples/action-cable/config.ru +5 -0
  50. data/examples/action-cable/config/application.rb +30 -0
  51. data/examples/action-cable/config/boot.rb +3 -0
  52. data/examples/action-cable/config/cable.yml +9 -0
  53. data/examples/action-cable/config/database.yml +25 -0
  54. data/examples/action-cable/config/environment.rb +5 -0
  55. data/examples/action-cable/config/environments/development.rb +45 -0
  56. data/examples/action-cable/config/environments/production.rb +86 -0
  57. data/examples/action-cable/config/environments/test.rb +42 -0
  58. data/examples/action-cable/config/initializers/application_controller_renderer.rb +6 -0
  59. data/examples/action-cable/config/initializers/assets.rb +11 -0
  60. data/examples/action-cable/config/initializers/backtrace_silencers.rb +7 -0
  61. data/examples/action-cable/config/initializers/cookies_serializer.rb +5 -0
  62. data/examples/action-cable/config/initializers/filter_parameter_logging.rb +4 -0
  63. data/examples/action-cable/config/initializers/inflections.rb +16 -0
  64. data/examples/action-cable/config/initializers/mime_types.rb +4 -0
  65. data/examples/action-cable/config/initializers/new_framework_defaults.rb +24 -0
  66. data/examples/action-cable/config/initializers/session_store.rb +3 -0
  67. data/examples/action-cable/config/initializers/synchromesh.rb +5 -0
  68. data/examples/action-cable/config/initializers/wrap_parameters.rb +14 -0
  69. data/examples/action-cable/config/locales/en.yml +23 -0
  70. data/examples/action-cable/config/puma.rb +47 -0
  71. data/examples/action-cable/config/routes.rb +5 -0
  72. data/examples/action-cable/config/secrets.yml +22 -0
  73. data/examples/action-cable/config/spring.rb +6 -0
  74. data/examples/action-cable/db/migrate/20160921223808_create_words.rb +9 -0
  75. data/examples/action-cable/db/schema.rb +21 -0
  76. data/examples/action-cable/log/.keep +0 -0
  77. data/examples/action-cable/public/404.html +67 -0
  78. data/examples/action-cable/public/422.html +67 -0
  79. data/examples/action-cable/public/500.html +66 -0
  80. data/examples/action-cable/public/apple-touch-icon-precomposed.png +0 -0
  81. data/examples/action-cable/public/apple-touch-icon.png +0 -0
  82. data/examples/action-cable/public/favicon.ico +0 -0
  83. data/examples/action-cable/public/robots.txt +5 -0
  84. data/examples/action-cable/rails_cache_dir2/C91/480/synchromesh_active_connections +0 -0
  85. data/examples/action-cable/tmp/.keep +0 -0
  86. data/examples/action-cable/vendor/assets/javascripts/.keep +0 -0
  87. data/examples/action-cable/vendor/assets/stylesheets/.keep +0 -0
  88. data/examples/simple-poller/.gitignore +21 -0
  89. data/examples/simple-poller/Gemfile +64 -0
  90. data/examples/simple-poller/Gemfile.lock +272 -0
  91. data/examples/simple-poller/README.md +24 -0
  92. data/examples/simple-poller/Rakefile +6 -0
  93. data/examples/simple-poller/app/assets/config/manifest.js +3 -0
  94. data/examples/simple-poller/app/assets/images/.keep +0 -0
  95. data/examples/simple-poller/app/assets/javascripts/application.js +20 -0
  96. data/examples/simple-poller/app/assets/javascripts/channels/.keep +0 -0
  97. data/examples/simple-poller/app/assets/stylesheets/application.css +15 -0
  98. data/examples/simple-poller/app/channels/application_cable/channel.rb +4 -0
  99. data/examples/simple-poller/app/channels/application_cable/connection.rb +4 -0
  100. data/examples/simple-poller/app/controllers/application_controller.rb +3 -0
  101. data/examples/simple-poller/app/controllers/concerns/.keep +0 -0
  102. data/examples/simple-poller/app/controllers/test_controller.rb +6 -0
  103. data/examples/simple-poller/app/helpers/application_helper.rb +2 -0
  104. data/examples/simple-poller/app/jobs/application_job.rb +2 -0
  105. data/examples/simple-poller/app/mailers/application_mailer.rb +4 -0
  106. data/examples/simple-poller/app/models/concerns/.keep +0 -0
  107. data/examples/simple-poller/app/models/models.rb +2 -0
  108. data/examples/simple-poller/app/models/public/.keep +0 -0
  109. data/examples/simple-poller/app/models/public/application_record.rb +3 -0
  110. data/examples/simple-poller/app/models/public/word.rb +2 -0
  111. data/examples/simple-poller/app/policies/application_policy.rb +5 -0
  112. data/examples/simple-poller/app/views/components.rb +18 -0
  113. data/examples/simple-poller/app/views/components/.keep +0 -0
  114. data/examples/simple-poller/app/views/components/app.rb +40 -0
  115. data/examples/simple-poller/app/views/layouts/application.html.erb +14 -0
  116. data/examples/simple-poller/app/views/layouts/mailer.html.erb +13 -0
  117. data/examples/simple-poller/app/views/layouts/mailer.text.erb +1 -0
  118. data/examples/simple-poller/bin/bundle +3 -0
  119. data/examples/simple-poller/bin/rails +9 -0
  120. data/examples/simple-poller/bin/rake +9 -0
  121. data/examples/simple-poller/bin/setup +34 -0
  122. data/examples/simple-poller/bin/spring +16 -0
  123. data/examples/simple-poller/bin/update +29 -0
  124. data/examples/simple-poller/config.ru +5 -0
  125. data/examples/simple-poller/config/application.rb +20 -0
  126. data/examples/simple-poller/config/boot.rb +3 -0
  127. data/examples/simple-poller/config/cable.yml +9 -0
  128. data/examples/simple-poller/config/database.yml +25 -0
  129. data/examples/simple-poller/config/environment.rb +5 -0
  130. data/examples/simple-poller/config/environments/development.rb +44 -0
  131. data/examples/simple-poller/config/environments/production.rb +86 -0
  132. data/examples/simple-poller/config/environments/test.rb +42 -0
  133. data/examples/simple-poller/config/initializers/application_controller_renderer.rb +6 -0
  134. data/examples/simple-poller/config/initializers/assets.rb +11 -0
  135. data/examples/simple-poller/config/initializers/backtrace_silencers.rb +7 -0
  136. data/examples/simple-poller/config/initializers/cookies_serializer.rb +5 -0
  137. data/examples/simple-poller/config/initializers/filter_parameter_logging.rb +4 -0
  138. data/examples/simple-poller/config/initializers/inflections.rb +16 -0
  139. data/examples/simple-poller/config/initializers/mime_types.rb +4 -0
  140. data/examples/simple-poller/config/initializers/new_framework_defaults.rb +24 -0
  141. data/examples/simple-poller/config/initializers/session_store.rb +3 -0
  142. data/examples/simple-poller/config/initializers/synchromesh.rb +15 -0
  143. data/examples/simple-poller/config/initializers/wrap_parameters.rb +14 -0
  144. data/examples/simple-poller/config/locales/en.yml +23 -0
  145. data/examples/simple-poller/config/puma.rb +47 -0
  146. data/examples/simple-poller/config/routes.rb +5 -0
  147. data/examples/simple-poller/config/secrets.yml +22 -0
  148. data/examples/simple-poller/config/spring.rb +6 -0
  149. data/examples/simple-poller/db/migrate/20161013220135_create_words.rb +9 -0
  150. data/examples/simple-poller/db/schema.rb +21 -0
  151. data/examples/simple-poller/db/seeds.rb +7 -0
  152. data/examples/simple-poller/lib/assets/.keep +0 -0
  153. data/examples/simple-poller/lib/tasks/.keep +0 -0
  154. data/examples/simple-poller/log/.keep +0 -0
  155. data/examples/simple-poller/public/404.html +67 -0
  156. data/examples/simple-poller/public/422.html +67 -0
  157. data/examples/simple-poller/public/500.html +66 -0
  158. data/examples/simple-poller/public/apple-touch-icon-precomposed.png +0 -0
  159. data/examples/simple-poller/public/apple-touch-icon.png +0 -0
  160. data/examples/simple-poller/public/favicon.ico +0 -0
  161. data/examples/simple-poller/public/robots.txt +5 -0
  162. data/examples/simple-poller/test/controllers/.keep +0 -0
  163. data/examples/simple-poller/test/fixtures/.keep +0 -0
  164. data/examples/simple-poller/test/fixtures/files/.keep +0 -0
  165. data/examples/simple-poller/test/fixtures/words.yml +7 -0
  166. data/examples/simple-poller/test/helpers/.keep +0 -0
  167. data/examples/simple-poller/test/integration/.keep +0 -0
  168. data/examples/simple-poller/test/mailers/.keep +0 -0
  169. data/examples/simple-poller/test/models/.keep +0 -0
  170. data/examples/simple-poller/test/models/word_test.rb +7 -0
  171. data/examples/simple-poller/test/test_helper.rb +10 -0
  172. data/examples/simple-poller/tmp/.keep +0 -0
  173. data/examples/simple-poller/vendor/assets/javascripts/.keep +0 -0
  174. data/examples/simple-poller/vendor/assets/stylesheets/.keep +0 -0
  175. data/examples/words/.gitignore +21 -0
  176. data/examples/words/Gemfile +58 -0
  177. data/examples/words/Gemfile.lock +247 -0
  178. data/examples/words/README.md +24 -0
  179. data/examples/words/Rakefile +6 -0
  180. data/examples/words/app/assets/config/manifest.js +3 -0
  181. data/examples/words/app/assets/javascripts/application.js +18 -0
  182. data/examples/words/app/assets/stylesheets/application.css +15 -0
  183. data/examples/words/app/controllers/application_controller.rb +3 -0
  184. data/examples/words/app/controllers/test_controller.rb +6 -0
  185. data/examples/words/app/models/models.rb +2 -0
  186. data/examples/words/app/models/public/application_record.rb +3 -0
  187. data/examples/words/app/models/public/word.rb +10 -0
  188. data/examples/words/app/policies/application_policy.rb +6 -0
  189. data/examples/words/app/views/components.rb +16 -0
  190. data/examples/words/app/views/components/app.rb +31 -0
  191. data/examples/words/app/views/layouts/application.html.erb +14 -0
  192. data/examples/words/app/views/layouts/mailer.html.erb +13 -0
  193. data/examples/words/app/views/layouts/mailer.text.erb +1 -0
  194. data/examples/words/bin/bundle +3 -0
  195. data/examples/words/bin/rails +9 -0
  196. data/examples/words/bin/rake +9 -0
  197. data/examples/words/bin/setup +34 -0
  198. data/examples/words/bin/spring +15 -0
  199. data/examples/words/bin/update +29 -0
  200. data/examples/words/config.ru +5 -0
  201. data/examples/words/config/application.rb +30 -0
  202. data/examples/words/config/boot.rb +3 -0
  203. data/examples/words/config/cable.yml +9 -0
  204. data/examples/words/config/database.yml +25 -0
  205. data/examples/words/config/environment.rb +5 -0
  206. data/examples/words/config/environments/development.rb +45 -0
  207. data/examples/words/config/environments/production.rb +86 -0
  208. data/examples/words/config/environments/test.rb +42 -0
  209. data/examples/words/config/initializers/application_controller_renderer.rb +6 -0
  210. data/examples/words/config/initializers/assets.rb +11 -0
  211. data/examples/words/config/initializers/backtrace_silencers.rb +7 -0
  212. data/examples/words/config/initializers/cookies_serializer.rb +5 -0
  213. data/examples/words/config/initializers/filter_parameter_logging.rb +4 -0
  214. data/examples/words/config/initializers/inflections.rb +16 -0
  215. data/examples/words/config/initializers/mime_types.rb +4 -0
  216. data/examples/words/config/initializers/new_framework_defaults.rb +24 -0
  217. data/examples/words/config/initializers/session_store.rb +3 -0
  218. data/examples/words/config/initializers/synchromesh.rb +5 -0
  219. data/examples/words/config/initializers/wrap_parameters.rb +14 -0
  220. data/examples/words/config/locales/en.yml +23 -0
  221. data/examples/words/config/puma.rb +47 -0
  222. data/examples/words/config/routes.rb +5 -0
  223. data/examples/words/config/secrets.yml +22 -0
  224. data/examples/words/config/spring.rb +6 -0
  225. data/examples/words/db/migrate/20160921223808_create_words.rb +9 -0
  226. data/examples/words/db/schema.rb +28 -0
  227. data/examples/words/log/.keep +0 -0
  228. data/examples/words/public/404.html +67 -0
  229. data/examples/words/public/422.html +67 -0
  230. data/examples/words/public/500.html +66 -0
  231. data/examples/words/public/apple-touch-icon-precomposed.png +0 -0
  232. data/examples/words/public/apple-touch-icon.png +0 -0
  233. data/examples/words/public/favicon.ico +0 -0
  234. data/examples/words/public/robots.txt +5 -0
  235. data/examples/words/tmp/.keep +0 -0
  236. data/examples/words/vendor/assets/javascripts/.keep +0 -0
  237. data/examples/words/vendor/assets/stylesheets/.keep +0 -0
  238. data/hyper-mesh.gemspec +82 -0
  239. data/lib/active_record_base.rb +152 -0
  240. data/lib/enumerable/pluck.rb +6 -0
  241. data/lib/hyper-mesh.rb +62 -0
  242. data/lib/hypermesh/version.rb +3 -0
  243. data/lib/opal/equality_patches.rb +15 -0
  244. data/lib/opal/parse_patch.rb +14 -0
  245. data/lib/opal/set_patches.rb +8 -0
  246. data/lib/reactive_record/active_record/aggregations.rb +69 -0
  247. data/lib/reactive_record/active_record/associations.rb +111 -0
  248. data/lib/reactive_record/active_record/base.rb +9 -0
  249. data/lib/reactive_record/active_record/class_methods.rb +177 -0
  250. data/lib/reactive_record/active_record/error.rb +26 -0
  251. data/lib/reactive_record/active_record/instance_methods.rb +129 -0
  252. data/lib/reactive_record/active_record/public_columns_hash.rb +19 -0
  253. data/lib/reactive_record/active_record/reactive_record/base.rb +520 -0
  254. data/lib/reactive_record/active_record/reactive_record/collection.rb +517 -0
  255. data/lib/reactive_record/active_record/reactive_record/column_types.rb +67 -0
  256. data/lib/reactive_record/active_record/reactive_record/dummy_value.rb +218 -0
  257. data/lib/reactive_record/active_record/reactive_record/isomorphic_base.rb +532 -0
  258. data/lib/reactive_record/active_record/reactive_record/reactive_set_relationship_helpers.rb +189 -0
  259. data/lib/reactive_record/active_record/reactive_record/scoped_collection.rb +62 -0
  260. data/lib/reactive_record/active_record/reactive_record/unscoped_collection.rb +16 -0
  261. data/lib/reactive_record/active_record/reactive_record/while_loading.rb +299 -0
  262. data/lib/reactive_record/engine.rb +13 -0
  263. data/lib/reactive_record/interval.rb +190 -0
  264. data/lib/reactive_record/permissions.rb +102 -0
  265. data/lib/reactive_record/pry.rb +13 -0
  266. data/lib/reactive_record/reactive_scope.rb +18 -0
  267. data/lib/reactive_record/scope_description.rb +108 -0
  268. data/lib/reactive_record/serializers.rb +7 -0
  269. data/lib/reactive_record/server_data_cache.rb +347 -0
  270. data/lib/reactive_record/version.rb +3 -0
  271. data/lib/sources/hyper-mesh/pusher.js +98 -0
  272. data/lib/synchromesh/action_cable.rb +39 -0
  273. data/lib/synchromesh/client_drivers.rb +357 -0
  274. data/lib/synchromesh/configuration.rb +40 -0
  275. data/lib/synchromesh/connection.rb +144 -0
  276. data/lib/synchromesh/policy.rb +504 -0
  277. data/lib/synchromesh/reactive_record/permission_patches.rb +43 -0
  278. data/lib/synchromesh/synchromesh.rb +155 -0
  279. data/lib/synchromesh/synchromesh_controller.rb +154 -0
  280. data/logo.jpg +0 -0
  281. data/path_release_steps.md +0 -0
  282. data/reactive_record_test_app/Gemfile +15 -0
  283. data/reactive_record_test_app/Gemfile.lock +209 -0
  284. data/reactive_record_test_app/README.rdoc +261 -0
  285. data/reactive_record_test_app/Rakefile +7 -0
  286. data/reactive_record_test_app/app/assets/javascripts/application.rb +5 -0
  287. data/reactive_record_test_app/app/assets/javascripts/components/another_component.rb +24 -0
  288. data/reactive_record_test_app/app/assets/javascripts/components/empty_component.rb +6 -0
  289. data/reactive_record_test_app/app/assets/javascripts/components/todo_item_component.js.rb +16 -0
  290. data/reactive_record_test_app/app/assets/javascripts/components/todos_component.js.rb +42 -0
  291. data/reactive_record_test_app/app/assets/javascripts/components/todos_main_component.rb +49 -0
  292. data/reactive_record_test_app/app/assets/javascripts/react_js_test_only.js +21618 -0
  293. data/reactive_record_test_app/app/assets/javascripts/reactive_record_config.js +2 -0
  294. data/reactive_record_test_app/app/assets/javascripts/spec/reactive_record_xspec.js.rb +42 -0
  295. data/reactive_record_test_app/app/assets/stylesheets/application.css +13 -0
  296. data/reactive_record_test_app/app/controllers/application_controller.rb +8 -0
  297. data/reactive_record_test_app/app/controllers/home_controller.rb +7 -0
  298. data/reactive_record_test_app/app/controllers/test_controller.rb +7 -0
  299. data/reactive_record_test_app/app/helpers/application_helper.rb +2 -0
  300. data/reactive_record_test_app/app/mailers/.gitkeep +0 -0
  301. data/reactive_record_test_app/app/models/.gitkeep +0 -0
  302. data/reactive_record_test_app/app/policies/application_policy.rb +5 -0
  303. data/reactive_record_test_app/app/views/components.rb +4 -0
  304. data/reactive_record_test_app/app/views/components/test.rb +18 -0
  305. data/reactive_record_test_app/app/views/home/index.html.erb +1 -0
  306. data/reactive_record_test_app/app/views/layouts/application.html.erb +17 -0
  307. data/reactive_record_test_app/app/views/models.rb +1 -0
  308. data/reactive_record_test_app/app/views/models/address.rb +13 -0
  309. data/reactive_record_test_app/app/views/models/comment.rb +19 -0
  310. data/reactive_record_test_app/app/views/models/todo_item.rb +36 -0
  311. data/reactive_record_test_app/app/views/models/user.rb +78 -0
  312. data/reactive_record_test_app/config.ru +33 -0
  313. data/reactive_record_test_app/config/application.rb +73 -0
  314. data/reactive_record_test_app/config/boot.rb +10 -0
  315. data/reactive_record_test_app/config/database.yml +25 -0
  316. data/reactive_record_test_app/config/environment.rb +5 -0
  317. data/reactive_record_test_app/config/environments/development.rb +43 -0
  318. data/reactive_record_test_app/config/environments/production.rb +70 -0
  319. data/reactive_record_test_app/config/environments/test.rb +41 -0
  320. data/reactive_record_test_app/config/initializers/backtrace_silencers.rb +7 -0
  321. data/reactive_record_test_app/config/initializers/inflections.rb +15 -0
  322. data/reactive_record_test_app/config/initializers/mime_types.rb +5 -0
  323. data/reactive_record_test_app/config/initializers/secret_token.rb +7 -0
  324. data/reactive_record_test_app/config/initializers/session_store.rb +8 -0
  325. data/reactive_record_test_app/config/initializers/wrap_parameters.rb +14 -0
  326. data/reactive_record_test_app/config/locales/en.yml +5 -0
  327. data/reactive_record_test_app/config/routes.rb +7 -0
  328. data/reactive_record_test_app/db/migrate/20150617002932_create_todo_items.rb +11 -0
  329. data/reactive_record_test_app/db/migrate/20150617134028_create_users.rb +14 -0
  330. data/reactive_record_test_app/db/migrate/20150729195556_add_address_to_user.rb +20 -0
  331. data/reactive_record_test_app/db/migrate/20150826142045_create_comments.rb +10 -0
  332. data/reactive_record_test_app/db/migrate/20150828172008_add_single_comment_to_todo_item.rb +5 -0
  333. data/reactive_record_test_app/db/migrate/20150908184118_add_address_id_to_user.rb +5 -0
  334. data/reactive_record_test_app/db/migrate/20150917220236_add_second_address_to_user.rb +10 -0
  335. data/reactive_record_test_app/db/migrate/20151009000111_add_test_data_attributes_to_user.rb +6 -0
  336. data/reactive_record_test_app/db/migrate/20160129182544_add_test_enum_to_user.rb +5 -0
  337. data/reactive_record_test_app/db/schema.rb +63 -0
  338. data/reactive_record_test_app/db/seeds.rb +60 -0
  339. data/reactive_record_test_app/public/404.html +26 -0
  340. data/reactive_record_test_app/public/422.html +26 -0
  341. data/reactive_record_test_app/public/500.html +25 -0
  342. data/reactive_record_test_app/public/favicon.ico +0 -0
  343. data/reactive_record_test_app/script/rails +6 -0
  344. data/reactive_record_test_app/spec-opal/active-record/aggregations_spec.rb +41 -0
  345. data/reactive_record_test_app/spec-opal/active-record/associations_spec.rb +75 -0
  346. data/reactive_record_test_app/spec-opal/active-record/base_spec.rb +126 -0
  347. data/reactive_record_test_app/spec-opal/active-record/dummy_value_spec.rb +27 -0
  348. data/reactive_record_test_app/spec-opal/active-record/edge_cases_spec.rb +116 -0
  349. data/reactive_record_test_app/spec-opal/active-record/enum_spec.rb +43 -0
  350. data/reactive_record_test_app/spec-opal/active-record/instance_methods_spec.rb +53 -0
  351. data/reactive_record_test_app/spec-opal/active-record/non_ar_aggregations_spec.rb +74 -0
  352. data/reactive_record_test_app/spec-opal/active-record/permissions_spec.rb +170 -0
  353. data/reactive_record_test_app/spec-opal/active-record/prerendering_spec.rb +49 -0
  354. data/reactive_record_test_app/spec-opal/active-record/reactive_record_load_spec.rb +23 -0
  355. data/reactive_record_test_app/spec-opal/active-record/rendering_spec.rb +221 -0
  356. data/reactive_record_test_app/spec-opal/active-record/save_spec.rb +125 -0
  357. data/reactive_record_test_app/spec-opal/active-record/scope_spec.rb +85 -0
  358. data/reactive_record_test_app/spec-opal/active-record/update_aggregations_spec.rb +76 -0
  359. data/reactive_record_test_app/spec-opal/active-record/update_attributes_spec.rb +186 -0
  360. data/reactive_record_test_app/spec-opal/active-record/virtual_methods_spec.rb +71 -0
  361. data/reactive_record_test_app/spec-opal/index.html.erb +11 -0
  362. data/reactive_record_test_app/spec-opal/spec_helper.js.rb +268 -0
  363. data/reactive_record_test_app/spec-opal/vendor/es5-shim.min.js +6 -0
  364. data/reactive_record_test_app/spec_dont_run/README.md +26 -0
  365. data/reactive_record_test_app/spec_dont_run/moved_to_main_spec_dir/zzzmany_to_many_spec_moved_to_main_suite.rb +30 -0
  366. data/reactive_record_test_app/spec_dont_run/moved_to_main_spec_dir/zzzrevert_record_spec_moved.rb +78 -0
  367. data/reactive_record_test_app/spec_dont_run/moved_to_main_spec_dir/zzzupdate_associations_spec_moved.rb +142 -0
  368. data/reactive_record_test_app/spec_dont_run/moved_to_main_spec_dir/zzzupdate_scopes_movedspec.rb +48 -0
  369. data/remote.md +115 -0
  370. data/spec/bin/firebug-2.0.13-fx.xpi +0 -0
  371. data/spec/component_helpers_xspec.rb +49 -0
  372. data/spec/factories/child_model.rb +5 -0
  373. data/spec/factories/comment.rb +5 -0
  374. data/spec/factories/test_models.rb +5 -0
  375. data/spec/factories/todo.rb +5 -0
  376. data/spec/factories/user.rb +5 -0
  377. data/spec/reactive_record/edge_cases_spec.rb +31 -0
  378. data/spec/reactive_record/factory.rb +62 -0
  379. data/spec/reactive_record/many_to_many_spec.rb +50 -0
  380. data/spec/reactive_record/play.rb +64 -0
  381. data/spec/reactive_record/pry_rescue_xspec.rb +48 -0
  382. data/spec/reactive_record/revert_spec.rb +112 -0
  383. data/spec/reactive_record/update_associations_spec.rb +189 -0
  384. data/spec/reactive_record/update_scopes_spec.rb +53 -0
  385. data/spec/spec_helper.rb +366 -0
  386. data/spec/support/component_helpers.rb +351 -0
  387. data/spec/synchromesh/column_types/column_type_spec.rb +302 -0
  388. data/spec/synchromesh/connection_spec.rb +144 -0
  389. data/spec/synchromesh/crud_access_regulation/broadcast_controls_access_spec.rb +105 -0
  390. data/spec/synchromesh/crud_access_regulation/model_policies_spec.rb +131 -0
  391. data/spec/synchromesh/examples/dictionary.rb +239 -0
  392. data/spec/synchromesh/examples/dictionary_with_client_scopes.rb +196 -0
  393. data/spec/synchromesh/examples/random_examples.rb +100 -0
  394. data/spec/synchromesh/examples/scoped_todos_spec.rb +167 -0
  395. data/spec/synchromesh/integration/authorization_spec.rb +111 -0
  396. data/spec/synchromesh/integration/default_scope_spec.rb +121 -0
  397. data/spec/synchromesh/integration/has_many_through_spec.rb +173 -0
  398. data/spec/synchromesh/integration/relationships_spec.rb +263 -0
  399. data/spec/synchromesh/integration/scope_spec.rb +553 -0
  400. data/spec/synchromesh/integration/synchromesh_spec.rb +80 -0
  401. data/spec/synchromesh/integration/test_components.rb +18 -0
  402. data/spec/synchromesh/integration/transports_spec.rb +308 -0
  403. data/spec/synchromesh/policies/auto_connect_spec.rb +60 -0
  404. data/spec/synchromesh/policies/auto_loader_spec.rb +34 -0
  405. data/spec/synchromesh/policies/policy_methods_spec.rb +85 -0
  406. data/spec/synchromesh/policies/regulate_all_broadcasts_spec.rb +315 -0
  407. data/spec/synchromesh/policies/regulate_broadcast_spec.rb +370 -0
  408. data/spec/synchromesh/policies/regulate_class_connection_spec.rb +50 -0
  409. data/spec/synchromesh/policies/regulate_instance_connection_spec.rb +66 -0
  410. data/spec/test_app/Gemfile +61 -0
  411. data/spec/test_app/Gemfile.lock +253 -0
  412. data/spec/test_app/Rakefile +6 -0
  413. data/spec/test_app/app/assets/javascripts/application.js +6 -0
  414. data/spec/test_app/app/assets/stylesheets/application.css +15 -0
  415. data/spec/test_app/app/controllers/application_controller.rb +13 -0
  416. data/spec/test_app/app/controllers/test_controller.rb +5 -0
  417. data/spec/test_app/app/models/_react_public_models.rb +2 -0
  418. data/spec/test_app/app/models/public/address.rb +13 -0
  419. data/spec/test_app/app/models/public/child_model.rb +3 -0
  420. data/spec/test_app/app/models/public/comment.rb +25 -0
  421. data/spec/test_app/app/models/public/test_model.rb +5 -0
  422. data/spec/test_app/app/models/public/todo.rb +6 -0
  423. data/spec/test_app/app/models/public/todo_item.rb +36 -0
  424. data/spec/test_app/app/models/public/user.rb +88 -0
  425. data/spec/test_app/app/policies/auto_loader_test_classa_policy.rb +3 -0
  426. data/spec/test_app/app/policies/auto_loader_test_classb_policy.rb +3 -0
  427. data/spec/test_app/app/policies/auto_loader_test_classc_policy.rb +3 -0
  428. data/spec/test_app/app/policies/auto_loader_test_classd_policy.rb +3 -0
  429. data/spec/test_app/app/views/components.rb +14 -0
  430. data/spec/test_app/app/views/components/show.rb +5 -0
  431. data/spec/test_app/app/views/layouts/application.html.erb +14 -0
  432. data/spec/test_app/bin/bundle +3 -0
  433. data/spec/test_app/bin/rails +4 -0
  434. data/spec/test_app/bin/rake +4 -0
  435. data/spec/test_app/bin/setup +29 -0
  436. data/spec/test_app/config.ru +4 -0
  437. data/spec/test_app/config/application.rb +42 -0
  438. data/spec/test_app/config/boot.rb +6 -0
  439. data/spec/test_app/config/cable.yml +10 -0
  440. data/spec/test_app/config/database.yml +47 -0
  441. data/spec/test_app/config/environment.rb +5 -0
  442. data/spec/test_app/config/environments/development.rb +41 -0
  443. data/spec/test_app/config/environments/production.rb +79 -0
  444. data/spec/test_app/config/environments/test.rb +42 -0
  445. data/spec/test_app/config/initializers/assets.rb +11 -0
  446. data/spec/test_app/config/initializers/backtrace_silencers.rb +7 -0
  447. data/spec/test_app/config/initializers/cookies_serializer.rb +3 -0
  448. data/spec/test_app/config/initializers/filter_parameter_logging.rb +4 -0
  449. data/spec/test_app/config/initializers/inflections.rb +16 -0
  450. data/spec/test_app/config/initializers/mime_types.rb +4 -0
  451. data/spec/test_app/config/initializers/session_store.rb +3 -0
  452. data/spec/test_app/config/initializers/synchromesh.rb +11 -0
  453. data/spec/test_app/config/initializers/wrap_parameters.rb +14 -0
  454. data/spec/test_app/config/locales/en.yml +23 -0
  455. data/spec/test_app/config/routes.rb +61 -0
  456. data/spec/test_app/config/secrets.yml +22 -0
  457. data/spec/test_app/db/development.sqlite3 +0 -0
  458. data/spec/test_app/db/migrate/20160731182106_create_test_models.rb +75 -0
  459. data/spec/test_app/db/schema.rb +88 -0
  460. data/spec/test_app/db/seeds.rb +7 -0
  461. data/spec/test_app/lib/assets/.keep +0 -0
  462. data/spec/test_app/log/.keep +0 -0
  463. data/spec/test_app/public/404.html +67 -0
  464. data/spec/test_app/public/422.html +67 -0
  465. data/spec/test_app/public/500.html +66 -0
  466. data/spec/test_app/public/favicon.ico +0 -0
  467. data/spec/vendor/es5-shim.min.js +6 -0
  468. data/terminal.md +66 -0
  469. metadata +1175 -0
@@ -0,0 +1,504 @@
1
+ module HyperMesh
2
+
3
+ class InternalClassPolicy
4
+
5
+ def initialize(regulated_klass)
6
+ @regulated_klass = regulated_klass
7
+ end
8
+
9
+ EXPOSED_METHODS = [
10
+ :regulate_class_connection, :always_allow_connection, :regulate_instance_connections,
11
+ :regulate_all_broadcasts, :regulate_broadcast, :allow_change, :allow_create, :allow_read,
12
+ :allow_update, :allow_destroy
13
+ ]
14
+
15
+ def regulate_class_connection(*args, &regulation)
16
+ regulate(ClassConnectionRegulation, :class_connection, args, &regulation)
17
+ end
18
+
19
+ def always_allow_connection(*args)
20
+ regulate(ClassConnectionRegulation, nil, args) { true }
21
+ end
22
+
23
+ def regulate_instance_connections(*args, &regulation)
24
+ regulate(InstanceConnectionRegulation, :instance_connections, args, &regulation)
25
+ end
26
+
27
+ def regulate_all_broadcasts(*args, &regulation)
28
+ regulate(ChannelBroadcastRegulation, :all_broadcasts, args, &regulation)
29
+ end
30
+
31
+ def regulate_broadcast(*args, &regulation)
32
+ regulate(InstanceBroadcastRegulation, :broadcast, args, &regulation)
33
+ end
34
+
35
+
36
+ CHANGE_POLICIES = [:create, :update, :destroy]
37
+
38
+ def self.allow_policy(policy, method)
39
+ define_method "allow_#{policy}" do |*args, &regulation|
40
+ process_args(policy, [], args, regulation) do |model|
41
+ get_ar_model(model).class_eval { define_method("#{method}_permitted?", &regulation) }
42
+ end
43
+ end
44
+ end
45
+
46
+ CHANGE_POLICIES.each { |policy| allow_policy policy, policy }
47
+
48
+ allow_policy(:read, :view)
49
+
50
+ def allow_change(*args, &regulation)
51
+ process_args('change', [:on], args, regulation) do |model, opts|
52
+ model = get_ar_model(model)
53
+ opts[:on] ||= CHANGE_POLICIES
54
+ opts[:on].each do |policy|
55
+ check_valid_on_option policy
56
+ model.class_eval { define_method("#{policy}_permitted?", &regulation) }
57
+ end
58
+ end
59
+ end
60
+
61
+ def get_ar_model(str)
62
+ str.is_a?(Class) ? str : Object.const_get(str)
63
+ rescue
64
+ raise "#{str} is not a class"
65
+ end
66
+
67
+ def regulate(regulation_klass, policy, args, &regulation)
68
+ process_args(policy, regulation_klass.allowed_opts, args, regulation) do |regulated_klass, opts|
69
+ regulation_klass.add_regulation regulated_klass, opts, &regulation
70
+ end
71
+ end
72
+
73
+ def process_args(policy, allowed_opts, args, regulation)
74
+ raise "you must provide a block to the regulate_#{policy} method" unless regulation
75
+ *args, opts = args if args.last.is_a? Hash
76
+ opts ||= {}
77
+ args = process_to_opt(allowed_opts, opts, args)
78
+ args.each do |regulated_klass|
79
+ yield regulated_klass, opts
80
+ end
81
+ end
82
+
83
+ def process_to_opt(allowed_opts, opts, args)
84
+ opts.each do |opt, value|
85
+ unless opt == :to || allowed_opts.include?(opt)
86
+ raise "Unknown ':#{opt} => #{value}' option in policy definition"
87
+ end
88
+ end
89
+ if (to = opts[:to])
90
+ raise "option to: :#{to} is not recognized in allow_#{policy}" unless to == :all
91
+ raise "option to: :all cannot be used with other classes" unless args.empty?
92
+ [ActiveRecord::Base]
93
+ elsif args.empty?
94
+ [@regulated_klass]
95
+ else
96
+ args
97
+ end
98
+ end
99
+
100
+ def check_valid_on_option(policy)
101
+ unless CHANGE_POLICIES.include? policy
102
+ valid_policies = CHANGE_POLICIES.collect { |s| ":{s}" }.to_sentence
103
+ raise "only #{valid_policies} are allowed on the regulate_access :on option"
104
+ end
105
+ end
106
+
107
+ end
108
+
109
+ class Regulation
110
+
111
+ class << self
112
+
113
+ def add_regulation(klass, opts={}, &regulation)
114
+ klass = regulations[klass]
115
+ klass.opts.merge! opts
116
+ klass.regulations << regulation
117
+ klass
118
+ end
119
+
120
+ def regulations
121
+ @regulations ||= Hash.new do |hash, klass|
122
+ if klass.is_a? String
123
+ hash[klass] = new(klass)
124
+ elsif klass.is_a?(Class) && klass.name
125
+ hash[klass.name]
126
+ else
127
+ hash[klass.class.name]
128
+ end
129
+ end
130
+ end
131
+
132
+ def wrap_policy(policy, regulation)
133
+ begin
134
+ policy_klass = regulation.binding.receiver
135
+ rescue
136
+ raise "Could not determine the class when regulating. This is probably caused by doing something like &:send_all"
137
+ end
138
+ wrapped_policy = policy_klass.new(nil, nil)
139
+ wrapped_policy.synchromesh_internal_policy_object = policy
140
+ wrapped_policy
141
+ end
142
+
143
+ def allowed_opts
144
+ []
145
+ end
146
+
147
+ end
148
+
149
+ attr_reader :klass
150
+
151
+ def opts
152
+ @opts ||= {}
153
+ end
154
+
155
+ def regulations
156
+ @regulations ||= []
157
+ end
158
+
159
+ def regulate_for(acting_user)
160
+ Enumerator.new do |y|
161
+ regulations.each do |regulation|
162
+ y << acting_user.instance_eval(&regulation)
163
+ end
164
+ end
165
+ end
166
+
167
+ def auto_connect_disabled?
168
+ opts.has_key?(:auto_connect) && !opts[:auto_connect]
169
+ end
170
+
171
+ def initialize(klass)
172
+ @klass = klass
173
+ end
174
+
175
+ end
176
+
177
+ class ClassConnectionRegulation < Regulation
178
+
179
+ def connectable?(acting_user)
180
+ regulate_for(acting_user).all? unless regulations.empty? rescue nil
181
+ end
182
+
183
+ def self.connect(channel, acting_user)
184
+ raise "connection failed" unless regulations[channel].connectable?(acting_user)
185
+ end
186
+
187
+ def self.connections_for(acting_user, auto_connections_only)
188
+ regulations.collect do |channel, regulation|
189
+ next if auto_connections_only && regulation.auto_connect_disabled?
190
+ next if !regulation.connectable?(acting_user)
191
+ channel
192
+ end.compact
193
+ end
194
+
195
+ def self.allowed_opts
196
+ [:auto_connect]
197
+ end
198
+
199
+ end
200
+
201
+ class InstanceConnectionRegulation < Regulation
202
+
203
+ def connectable_to(acting_user, auto_connections_only)
204
+ return [] if auto_connections_only && auto_connect_disabled?
205
+ regulate_for(acting_user).entries.compact.flatten(1) rescue []
206
+ end
207
+
208
+ def self.connect(instance, acting_user)
209
+ unless regulations[instance].connectable_to(acting_user, false).include? instance
210
+ raise "connection failed"
211
+ end
212
+ end
213
+
214
+ def self.connections_for(acting_user, auto_connections_only)
215
+ regulations.collect do |_channel, regulation|
216
+ # the following was bizarelly passing true for auto_connections_only????
217
+ regulation.connectable_to(acting_user, auto_connections_only).collect do |obj|
218
+ if auto_connections_only
219
+ [obj.class.name, obj.id]
220
+ else
221
+ InternalPolicy.channel_to_string obj
222
+ end
223
+ end
224
+ end.flatten(1)
225
+ end
226
+
227
+ def self.allowed_opts
228
+ [:auto_connect]
229
+ end
230
+ end
231
+
232
+ class ChannelBroadcastRegulation < Regulation
233
+ class << self
234
+ def add_regulation(channel, opts={}, &regulation)
235
+ regulations_to_channels[regulation] << super
236
+ end
237
+
238
+ def broadcast(policy)
239
+ regulations_to_channels.each do |regulation, channels|
240
+ wrapped_policy = wrap_policy(policy, regulation)
241
+ channels.each do |channel|
242
+ regulation.call wrapped_policy
243
+ policy.send_unassigned_sets_to channel.klass
244
+ end
245
+ end
246
+ end
247
+
248
+ def regulations_to_channels
249
+ @regulations_to_channels ||= Hash.new { |hash, key| hash[key] = [] }
250
+ end
251
+ end
252
+ end
253
+
254
+ class InstanceBroadcastRegulation < Regulation
255
+ def self.broadcast(instance, policy)
256
+ regulations[instance].regulations.each do |regulation|
257
+ instance.instance_exec wrap_policy(policy, regulation), &regulation
258
+ end
259
+ if policy.has_unassigned_sets?
260
+ raise "#{instance.class.name} instance broadcast policy not sent to any channel"
261
+ end
262
+ end
263
+ end
264
+
265
+ module AutoConnect
266
+ def self.channels(session, acting_user)
267
+ channels = ClassConnectionRegulation.connections_for(acting_user, true) +
268
+ InstanceConnectionRegulation.connections_for(acting_user, true)
269
+ channels.each do |channel|
270
+ Connection.open(channel, session)
271
+ end
272
+ channels
273
+ end
274
+ end
275
+
276
+ class InternalPolicy
277
+
278
+ EXPOSED_METHODS = [:send_all, :send_all_but, :send_only, :obj]
279
+
280
+ def send_all
281
+ SendSet.new(self)
282
+ end
283
+
284
+ def send_all_but(*execeptions)
285
+ SendSet.new(self, exclude: execeptions)
286
+ end
287
+
288
+ def send_only(*white_list)
289
+ SendSet.new(self, white_list: white_list)
290
+ end
291
+
292
+ def obj
293
+ @obj
294
+ end
295
+
296
+ def self.regulate_connection(acting_user, channel_string)
297
+ channel = channel_string.split("-")
298
+ if channel.length > 1
299
+ id = channel[1..-1].join("-")
300
+ object = Object.const_get(channel[0]).find(id)
301
+ InstanceConnectionRegulation.connect(object, acting_user)
302
+ else
303
+ ClassConnectionRegulation.connect(channel[0], acting_user)
304
+ end
305
+ end
306
+
307
+ def self.regulate_broadcast(model, &block)
308
+ internal_policy = InternalPolicy.new(
309
+ model, model.attribute_names, Connection.active
310
+ )
311
+ ChannelBroadcastRegulation.broadcast(internal_policy)
312
+ InstanceBroadcastRegulation.broadcast(model, internal_policy)
313
+ internal_policy.broadcast &block
314
+ end
315
+
316
+ def initialize(obj, attribute_names, available_channels)
317
+ @obj = obj
318
+ attribute_names = attribute_names.map(&:to_sym).to_set
319
+ @unassigned_send_sets = []
320
+ @channel_sets = Hash.new { |hash, key| hash[key] = attribute_names }
321
+ @available_channels = available_channels
322
+ end
323
+
324
+ def channel_available?(channel)
325
+ channel && @available_channels.include?(channel_to_string(channel))
326
+ end
327
+
328
+ def id
329
+ @id ||= "#{self.object_id}-#{Time.now.to_f}"
330
+ end
331
+
332
+ def has_unassigned_sets?
333
+ !@unassigned_send_sets.empty?
334
+ end
335
+
336
+ def send_unassigned_sets_to(channel)
337
+ if channel_available?(channel) && has_unassigned_sets?
338
+ @channel_sets[channel] = @unassigned_send_sets.inject(@channel_sets[channel]) do |set, send_set|
339
+ send_set.merge(set)
340
+ end
341
+ end
342
+ @unassigned_send_sets = []
343
+ end
344
+
345
+ def add_unassigned_send_set(send_set)
346
+ @unassigned_send_sets << send_set
347
+ end
348
+
349
+ def send_set_to(send_set, channels)
350
+ channels.flatten(1).each do |channel|
351
+ merge_set(send_set, channel) if channel_available? channel
352
+ @unassigned_send_sets.delete(send_set)
353
+ end
354
+ end
355
+
356
+ def merge_set(send_set, channel)
357
+ return unless channel
358
+ channel = channel.name if channel.is_a?(Class) && channel.name
359
+ @channel_sets[channel] = send_set.merge(@channel_sets[channel])
360
+ end
361
+
362
+ def channel_list
363
+ @channel_sets.collect { |channel, _value| channel_to_string channel }
364
+ end
365
+
366
+ def self.channel_to_string(channel)
367
+ if channel.is_a?(Class) && channel.name
368
+ channel.name
369
+ elsif channel.is_a? String
370
+ channel
371
+ else
372
+ "#{channel.class.name}-#{channel.id}"
373
+ end
374
+ end
375
+
376
+ def channel_to_string(channel)
377
+ self.class.channel_to_string(channel)
378
+ end
379
+
380
+ def filter(h, attribute_set)
381
+ r = {}
382
+ h.each do |key, value|
383
+ r[key.to_sym] = value if attribute_set.member?(key.to_sym) || (key.to_sym == :id)
384
+ end unless attribute_set.empty?
385
+ #model_id = h[:id] || h["id"]
386
+ #r[:id] = model_id if model_id && !attribute_set.empty?
387
+ r
388
+ end
389
+
390
+ def send_message(header, channel, attribute_set, &block)
391
+ record = filter(@obj.react_serializer, attribute_set)
392
+ previous_changes = filter(@obj.previous_changes, attribute_set)
393
+ return if record.empty? && previous_changes.empty?
394
+ message = header.merge(
395
+ channel: channel_to_string(channel),
396
+ record: record,
397
+ previous_changes: previous_changes
398
+ )
399
+ yield message
400
+ end
401
+
402
+ def broadcast(&block)
403
+ klass = @obj.class
404
+ header = {broadcast_id: id, channels: channel_list, klass: klass.name}
405
+ @channel_sets.each do |channel, attribute_set|
406
+ send_message header, channel, attribute_set, &block
407
+ end
408
+ end
409
+ end
410
+
411
+ class SendSet
412
+
413
+ def to(*channels)
414
+ @policy.send_set_to(self, channels)
415
+ end
416
+
417
+ def initialize(policy, exclude: nil, white_list: nil)
418
+ @policy = policy
419
+ @policy.add_unassigned_send_set(self)
420
+ @excluded = exclude.map &:to_sym if exclude
421
+ @white_list = white_list.map &:to_sym if white_list
422
+ end
423
+
424
+ def merge(set)
425
+ set = set.difference(@excluded) if @excluded
426
+ set = set.intersection(@white_list) if @white_list
427
+ set
428
+ end
429
+
430
+ end
431
+
432
+ module ClassPolicyMethods
433
+ def synchromesh_internal_policy_object
434
+ @synchromesh_internal_policy_object ||= InternalClassPolicy.new(name || self)
435
+ end
436
+ InternalClassPolicy::EXPOSED_METHODS.each do |policy_method|
437
+ define_method policy_method do |*klasses, &block|
438
+ synchromesh_internal_policy_object.send policy_method, *klasses, &block
439
+ end unless respond_to? policy_method
440
+ end
441
+ end
442
+
443
+ module PolicyMethods
444
+ def self.included(base)
445
+ base.class_eval do
446
+ extend ClassPolicyMethods
447
+ end
448
+ end
449
+ attr_accessor :synchromesh_internal_policy_object
450
+ InternalPolicy::EXPOSED_METHODS.each do |method|
451
+ define_method method do |*args, &block|
452
+ synchromesh_internal_policy_object.send method, *args, &block
453
+ end unless respond_to? method
454
+ end
455
+ define_method :initialize do |*args|
456
+ end unless instance_methods(false).include?(:initialize)
457
+ end
458
+
459
+ module PolicyAutoLoader
460
+ def self.load(name, value)
461
+ const_get("#{name}Policy") if name && !(name =~ /Policy$/) && value.is_a?(Class)
462
+ rescue Exception => e
463
+ raise e if e.is_a?(LoadError) && e.message =~ /Unable to autoload constant #{name}Policy/
464
+ end
465
+ end
466
+ end
467
+
468
+ class Module
469
+ alias pre_synchromesh_const_set const_set
470
+
471
+ def const_set(name, value)
472
+ pre_synchromesh_const_set(name, value).tap do
473
+ HyperMesh::PolicyAutoLoader.load(name, value)
474
+ end
475
+ end
476
+ end
477
+
478
+ class Class
479
+
480
+ alias pre_synchromesh_inherited inherited
481
+
482
+ def inherited(child_class)
483
+ pre_synchromesh_inherited(child_class).tap do
484
+ HyperMesh::PolicyAutoLoader.load(child_class.name, child_class)
485
+ end
486
+ end
487
+
488
+ HyperMesh::ClassPolicyMethods.instance_methods.each do |method|
489
+ define_method method do |*args, &block|
490
+ if name =~ /Policy$/
491
+ @synchromesh_internal_policy_object = HyperMesh::InternalClassPolicy.new(name.gsub(/Policy$/,""))
492
+ include HyperMesh::PolicyMethods
493
+ send method, *args, &block
494
+ else
495
+ class << self
496
+ HyperMesh::ClassPolicyMethods.instance_methods.each do |method|
497
+ undef_method method
498
+ end
499
+ end
500
+ method_missing(method, *args, &block)
501
+ end
502
+ end unless respond_to? method
503
+ end
504
+ end