hyper-mesh 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +27 -0
- data/.rspec +2 -0
- data/.rubocop.yml +11 -0
- data/.travis.yml +4 -0
- data/CODE_OF_CONDUCT.md +13 -0
- data/Gemfile +5 -0
- data/LICENSE.txt +21 -0
- data/README.md +396 -0
- data/Rakefile +6 -0
- data/app/controllers/reactive_record/application_controller.rb +4 -0
- data/app/controllers/reactive_record/reactive_record_controller.rb +49 -0
- data/bin/console +14 -0
- data/bin/setup +7 -0
- data/codeship.database.yml +18 -0
- data/config/routes.rb +7 -0
- data/docs/action_cable_quickstart.md +151 -0
- data/docs/authorization-policies.md +449 -0
- data/docs/client_side_scoping.md +103 -0
- data/docs/pusher_quickstart.md +0 -0
- data/docs/simple_poller_quickstart.md +121 -0
- data/docs/todo-example.md +116 -0
- data/docs/words-example.md +65 -0
- data/examples/action-cable/.gitignore +21 -0
- data/examples/action-cable/Gemfile +58 -0
- data/examples/action-cable/Gemfile.lock +247 -0
- data/examples/action-cable/README.md +24 -0
- data/examples/action-cable/Rakefile +6 -0
- data/examples/action-cable/app/assets/config/manifest.js +3 -0
- data/examples/action-cable/app/assets/javascripts/application.js +18 -0
- data/examples/action-cable/app/assets/stylesheets/application.css +15 -0
- data/examples/action-cable/app/controllers/application_controller.rb +3 -0
- data/examples/action-cable/app/controllers/test_controller.rb +6 -0
- data/examples/action-cable/app/models/models.rb +2 -0
- data/examples/action-cable/app/models/public/application_record.rb +3 -0
- data/examples/action-cable/app/models/public/word.rb +2 -0
- data/examples/action-cable/app/policies/application_policy.rb +6 -0
- data/examples/action-cable/app/views/components.rb +17 -0
- data/examples/action-cable/app/views/components/app.rb +18 -0
- data/examples/action-cable/app/views/layouts/application.html.erb +14 -0
- data/examples/action-cable/app/views/layouts/mailer.html.erb +13 -0
- data/examples/action-cable/app/views/layouts/mailer.text.erb +1 -0
- data/examples/action-cable/bin/bundle +3 -0
- data/examples/action-cable/bin/rails +9 -0
- data/examples/action-cable/bin/rake +9 -0
- data/examples/action-cable/bin/setup +34 -0
- data/examples/action-cable/bin/spring +15 -0
- data/examples/action-cable/bin/update +29 -0
- data/examples/action-cable/config.ru +5 -0
- data/examples/action-cable/config/application.rb +30 -0
- data/examples/action-cable/config/boot.rb +3 -0
- data/examples/action-cable/config/cable.yml +9 -0
- data/examples/action-cable/config/database.yml +25 -0
- data/examples/action-cable/config/environment.rb +5 -0
- data/examples/action-cable/config/environments/development.rb +45 -0
- data/examples/action-cable/config/environments/production.rb +86 -0
- data/examples/action-cable/config/environments/test.rb +42 -0
- data/examples/action-cable/config/initializers/application_controller_renderer.rb +6 -0
- data/examples/action-cable/config/initializers/assets.rb +11 -0
- data/examples/action-cable/config/initializers/backtrace_silencers.rb +7 -0
- data/examples/action-cable/config/initializers/cookies_serializer.rb +5 -0
- data/examples/action-cable/config/initializers/filter_parameter_logging.rb +4 -0
- data/examples/action-cable/config/initializers/inflections.rb +16 -0
- data/examples/action-cable/config/initializers/mime_types.rb +4 -0
- data/examples/action-cable/config/initializers/new_framework_defaults.rb +24 -0
- data/examples/action-cable/config/initializers/session_store.rb +3 -0
- data/examples/action-cable/config/initializers/synchromesh.rb +5 -0
- data/examples/action-cable/config/initializers/wrap_parameters.rb +14 -0
- data/examples/action-cable/config/locales/en.yml +23 -0
- data/examples/action-cable/config/puma.rb +47 -0
- data/examples/action-cable/config/routes.rb +5 -0
- data/examples/action-cable/config/secrets.yml +22 -0
- data/examples/action-cable/config/spring.rb +6 -0
- data/examples/action-cable/db/migrate/20160921223808_create_words.rb +9 -0
- data/examples/action-cable/db/schema.rb +21 -0
- data/examples/action-cable/log/.keep +0 -0
- data/examples/action-cable/public/404.html +67 -0
- data/examples/action-cable/public/422.html +67 -0
- data/examples/action-cable/public/500.html +66 -0
- data/examples/action-cable/public/apple-touch-icon-precomposed.png +0 -0
- data/examples/action-cable/public/apple-touch-icon.png +0 -0
- data/examples/action-cable/public/favicon.ico +0 -0
- data/examples/action-cable/public/robots.txt +5 -0
- data/examples/action-cable/rails_cache_dir2/C91/480/synchromesh_active_connections +0 -0
- data/examples/action-cable/tmp/.keep +0 -0
- data/examples/action-cable/vendor/assets/javascripts/.keep +0 -0
- data/examples/action-cable/vendor/assets/stylesheets/.keep +0 -0
- data/examples/simple-poller/.gitignore +21 -0
- data/examples/simple-poller/Gemfile +64 -0
- data/examples/simple-poller/Gemfile.lock +272 -0
- data/examples/simple-poller/README.md +24 -0
- data/examples/simple-poller/Rakefile +6 -0
- data/examples/simple-poller/app/assets/config/manifest.js +3 -0
- data/examples/simple-poller/app/assets/images/.keep +0 -0
- data/examples/simple-poller/app/assets/javascripts/application.js +20 -0
- data/examples/simple-poller/app/assets/javascripts/channels/.keep +0 -0
- data/examples/simple-poller/app/assets/stylesheets/application.css +15 -0
- data/examples/simple-poller/app/channels/application_cable/channel.rb +4 -0
- data/examples/simple-poller/app/channels/application_cable/connection.rb +4 -0
- data/examples/simple-poller/app/controllers/application_controller.rb +3 -0
- data/examples/simple-poller/app/controllers/concerns/.keep +0 -0
- data/examples/simple-poller/app/controllers/test_controller.rb +6 -0
- data/examples/simple-poller/app/helpers/application_helper.rb +2 -0
- data/examples/simple-poller/app/jobs/application_job.rb +2 -0
- data/examples/simple-poller/app/mailers/application_mailer.rb +4 -0
- data/examples/simple-poller/app/models/concerns/.keep +0 -0
- data/examples/simple-poller/app/models/models.rb +2 -0
- data/examples/simple-poller/app/models/public/.keep +0 -0
- data/examples/simple-poller/app/models/public/application_record.rb +3 -0
- data/examples/simple-poller/app/models/public/word.rb +2 -0
- data/examples/simple-poller/app/policies/application_policy.rb +5 -0
- data/examples/simple-poller/app/views/components.rb +18 -0
- data/examples/simple-poller/app/views/components/.keep +0 -0
- data/examples/simple-poller/app/views/components/app.rb +40 -0
- data/examples/simple-poller/app/views/layouts/application.html.erb +14 -0
- data/examples/simple-poller/app/views/layouts/mailer.html.erb +13 -0
- data/examples/simple-poller/app/views/layouts/mailer.text.erb +1 -0
- data/examples/simple-poller/bin/bundle +3 -0
- data/examples/simple-poller/bin/rails +9 -0
- data/examples/simple-poller/bin/rake +9 -0
- data/examples/simple-poller/bin/setup +34 -0
- data/examples/simple-poller/bin/spring +16 -0
- data/examples/simple-poller/bin/update +29 -0
- data/examples/simple-poller/config.ru +5 -0
- data/examples/simple-poller/config/application.rb +20 -0
- data/examples/simple-poller/config/boot.rb +3 -0
- data/examples/simple-poller/config/cable.yml +9 -0
- data/examples/simple-poller/config/database.yml +25 -0
- data/examples/simple-poller/config/environment.rb +5 -0
- data/examples/simple-poller/config/environments/development.rb +44 -0
- data/examples/simple-poller/config/environments/production.rb +86 -0
- data/examples/simple-poller/config/environments/test.rb +42 -0
- data/examples/simple-poller/config/initializers/application_controller_renderer.rb +6 -0
- data/examples/simple-poller/config/initializers/assets.rb +11 -0
- data/examples/simple-poller/config/initializers/backtrace_silencers.rb +7 -0
- data/examples/simple-poller/config/initializers/cookies_serializer.rb +5 -0
- data/examples/simple-poller/config/initializers/filter_parameter_logging.rb +4 -0
- data/examples/simple-poller/config/initializers/inflections.rb +16 -0
- data/examples/simple-poller/config/initializers/mime_types.rb +4 -0
- data/examples/simple-poller/config/initializers/new_framework_defaults.rb +24 -0
- data/examples/simple-poller/config/initializers/session_store.rb +3 -0
- data/examples/simple-poller/config/initializers/synchromesh.rb +15 -0
- data/examples/simple-poller/config/initializers/wrap_parameters.rb +14 -0
- data/examples/simple-poller/config/locales/en.yml +23 -0
- data/examples/simple-poller/config/puma.rb +47 -0
- data/examples/simple-poller/config/routes.rb +5 -0
- data/examples/simple-poller/config/secrets.yml +22 -0
- data/examples/simple-poller/config/spring.rb +6 -0
- data/examples/simple-poller/db/migrate/20161013220135_create_words.rb +9 -0
- data/examples/simple-poller/db/schema.rb +21 -0
- data/examples/simple-poller/db/seeds.rb +7 -0
- data/examples/simple-poller/lib/assets/.keep +0 -0
- data/examples/simple-poller/lib/tasks/.keep +0 -0
- data/examples/simple-poller/log/.keep +0 -0
- data/examples/simple-poller/public/404.html +67 -0
- data/examples/simple-poller/public/422.html +67 -0
- data/examples/simple-poller/public/500.html +66 -0
- data/examples/simple-poller/public/apple-touch-icon-precomposed.png +0 -0
- data/examples/simple-poller/public/apple-touch-icon.png +0 -0
- data/examples/simple-poller/public/favicon.ico +0 -0
- data/examples/simple-poller/public/robots.txt +5 -0
- data/examples/simple-poller/test/controllers/.keep +0 -0
- data/examples/simple-poller/test/fixtures/.keep +0 -0
- data/examples/simple-poller/test/fixtures/files/.keep +0 -0
- data/examples/simple-poller/test/fixtures/words.yml +7 -0
- data/examples/simple-poller/test/helpers/.keep +0 -0
- data/examples/simple-poller/test/integration/.keep +0 -0
- data/examples/simple-poller/test/mailers/.keep +0 -0
- data/examples/simple-poller/test/models/.keep +0 -0
- data/examples/simple-poller/test/models/word_test.rb +7 -0
- data/examples/simple-poller/test/test_helper.rb +10 -0
- data/examples/simple-poller/tmp/.keep +0 -0
- data/examples/simple-poller/vendor/assets/javascripts/.keep +0 -0
- data/examples/simple-poller/vendor/assets/stylesheets/.keep +0 -0
- data/examples/words/.gitignore +21 -0
- data/examples/words/Gemfile +58 -0
- data/examples/words/Gemfile.lock +247 -0
- data/examples/words/README.md +24 -0
- data/examples/words/Rakefile +6 -0
- data/examples/words/app/assets/config/manifest.js +3 -0
- data/examples/words/app/assets/javascripts/application.js +18 -0
- data/examples/words/app/assets/stylesheets/application.css +15 -0
- data/examples/words/app/controllers/application_controller.rb +3 -0
- data/examples/words/app/controllers/test_controller.rb +6 -0
- data/examples/words/app/models/models.rb +2 -0
- data/examples/words/app/models/public/application_record.rb +3 -0
- data/examples/words/app/models/public/word.rb +10 -0
- data/examples/words/app/policies/application_policy.rb +6 -0
- data/examples/words/app/views/components.rb +16 -0
- data/examples/words/app/views/components/app.rb +31 -0
- data/examples/words/app/views/layouts/application.html.erb +14 -0
- data/examples/words/app/views/layouts/mailer.html.erb +13 -0
- data/examples/words/app/views/layouts/mailer.text.erb +1 -0
- data/examples/words/bin/bundle +3 -0
- data/examples/words/bin/rails +9 -0
- data/examples/words/bin/rake +9 -0
- data/examples/words/bin/setup +34 -0
- data/examples/words/bin/spring +15 -0
- data/examples/words/bin/update +29 -0
- data/examples/words/config.ru +5 -0
- data/examples/words/config/application.rb +30 -0
- data/examples/words/config/boot.rb +3 -0
- data/examples/words/config/cable.yml +9 -0
- data/examples/words/config/database.yml +25 -0
- data/examples/words/config/environment.rb +5 -0
- data/examples/words/config/environments/development.rb +45 -0
- data/examples/words/config/environments/production.rb +86 -0
- data/examples/words/config/environments/test.rb +42 -0
- data/examples/words/config/initializers/application_controller_renderer.rb +6 -0
- data/examples/words/config/initializers/assets.rb +11 -0
- data/examples/words/config/initializers/backtrace_silencers.rb +7 -0
- data/examples/words/config/initializers/cookies_serializer.rb +5 -0
- data/examples/words/config/initializers/filter_parameter_logging.rb +4 -0
- data/examples/words/config/initializers/inflections.rb +16 -0
- data/examples/words/config/initializers/mime_types.rb +4 -0
- data/examples/words/config/initializers/new_framework_defaults.rb +24 -0
- data/examples/words/config/initializers/session_store.rb +3 -0
- data/examples/words/config/initializers/synchromesh.rb +5 -0
- data/examples/words/config/initializers/wrap_parameters.rb +14 -0
- data/examples/words/config/locales/en.yml +23 -0
- data/examples/words/config/puma.rb +47 -0
- data/examples/words/config/routes.rb +5 -0
- data/examples/words/config/secrets.yml +22 -0
- data/examples/words/config/spring.rb +6 -0
- data/examples/words/db/migrate/20160921223808_create_words.rb +9 -0
- data/examples/words/db/schema.rb +28 -0
- data/examples/words/log/.keep +0 -0
- data/examples/words/public/404.html +67 -0
- data/examples/words/public/422.html +67 -0
- data/examples/words/public/500.html +66 -0
- data/examples/words/public/apple-touch-icon-precomposed.png +0 -0
- data/examples/words/public/apple-touch-icon.png +0 -0
- data/examples/words/public/favicon.ico +0 -0
- data/examples/words/public/robots.txt +5 -0
- data/examples/words/tmp/.keep +0 -0
- data/examples/words/vendor/assets/javascripts/.keep +0 -0
- data/examples/words/vendor/assets/stylesheets/.keep +0 -0
- data/hyper-mesh.gemspec +82 -0
- data/lib/active_record_base.rb +152 -0
- data/lib/enumerable/pluck.rb +6 -0
- data/lib/hyper-mesh.rb +62 -0
- data/lib/hypermesh/version.rb +3 -0
- data/lib/opal/equality_patches.rb +15 -0
- data/lib/opal/parse_patch.rb +14 -0
- data/lib/opal/set_patches.rb +8 -0
- data/lib/reactive_record/active_record/aggregations.rb +69 -0
- data/lib/reactive_record/active_record/associations.rb +111 -0
- data/lib/reactive_record/active_record/base.rb +9 -0
- data/lib/reactive_record/active_record/class_methods.rb +177 -0
- data/lib/reactive_record/active_record/error.rb +26 -0
- data/lib/reactive_record/active_record/instance_methods.rb +129 -0
- data/lib/reactive_record/active_record/public_columns_hash.rb +19 -0
- data/lib/reactive_record/active_record/reactive_record/base.rb +520 -0
- data/lib/reactive_record/active_record/reactive_record/collection.rb +517 -0
- data/lib/reactive_record/active_record/reactive_record/column_types.rb +67 -0
- data/lib/reactive_record/active_record/reactive_record/dummy_value.rb +218 -0
- data/lib/reactive_record/active_record/reactive_record/isomorphic_base.rb +532 -0
- data/lib/reactive_record/active_record/reactive_record/reactive_set_relationship_helpers.rb +189 -0
- data/lib/reactive_record/active_record/reactive_record/scoped_collection.rb +62 -0
- data/lib/reactive_record/active_record/reactive_record/unscoped_collection.rb +16 -0
- data/lib/reactive_record/active_record/reactive_record/while_loading.rb +299 -0
- data/lib/reactive_record/engine.rb +13 -0
- data/lib/reactive_record/interval.rb +190 -0
- data/lib/reactive_record/permissions.rb +102 -0
- data/lib/reactive_record/pry.rb +13 -0
- data/lib/reactive_record/reactive_scope.rb +18 -0
- data/lib/reactive_record/scope_description.rb +108 -0
- data/lib/reactive_record/serializers.rb +7 -0
- data/lib/reactive_record/server_data_cache.rb +347 -0
- data/lib/reactive_record/version.rb +3 -0
- data/lib/sources/hyper-mesh/pusher.js +98 -0
- data/lib/synchromesh/action_cable.rb +39 -0
- data/lib/synchromesh/client_drivers.rb +357 -0
- data/lib/synchromesh/configuration.rb +40 -0
- data/lib/synchromesh/connection.rb +144 -0
- data/lib/synchromesh/policy.rb +504 -0
- data/lib/synchromesh/reactive_record/permission_patches.rb +43 -0
- data/lib/synchromesh/synchromesh.rb +155 -0
- data/lib/synchromesh/synchromesh_controller.rb +154 -0
- data/logo.jpg +0 -0
- data/path_release_steps.md +0 -0
- data/reactive_record_test_app/Gemfile +15 -0
- data/reactive_record_test_app/Gemfile.lock +209 -0
- data/reactive_record_test_app/README.rdoc +261 -0
- data/reactive_record_test_app/Rakefile +7 -0
- data/reactive_record_test_app/app/assets/javascripts/application.rb +5 -0
- data/reactive_record_test_app/app/assets/javascripts/components/another_component.rb +24 -0
- data/reactive_record_test_app/app/assets/javascripts/components/empty_component.rb +6 -0
- data/reactive_record_test_app/app/assets/javascripts/components/todo_item_component.js.rb +16 -0
- data/reactive_record_test_app/app/assets/javascripts/components/todos_component.js.rb +42 -0
- data/reactive_record_test_app/app/assets/javascripts/components/todos_main_component.rb +49 -0
- data/reactive_record_test_app/app/assets/javascripts/react_js_test_only.js +21618 -0
- data/reactive_record_test_app/app/assets/javascripts/reactive_record_config.js +2 -0
- data/reactive_record_test_app/app/assets/javascripts/spec/reactive_record_xspec.js.rb +42 -0
- data/reactive_record_test_app/app/assets/stylesheets/application.css +13 -0
- data/reactive_record_test_app/app/controllers/application_controller.rb +8 -0
- data/reactive_record_test_app/app/controllers/home_controller.rb +7 -0
- data/reactive_record_test_app/app/controllers/test_controller.rb +7 -0
- data/reactive_record_test_app/app/helpers/application_helper.rb +2 -0
- data/reactive_record_test_app/app/mailers/.gitkeep +0 -0
- data/reactive_record_test_app/app/models/.gitkeep +0 -0
- data/reactive_record_test_app/app/policies/application_policy.rb +5 -0
- data/reactive_record_test_app/app/views/components.rb +4 -0
- data/reactive_record_test_app/app/views/components/test.rb +18 -0
- data/reactive_record_test_app/app/views/home/index.html.erb +1 -0
- data/reactive_record_test_app/app/views/layouts/application.html.erb +17 -0
- data/reactive_record_test_app/app/views/models.rb +1 -0
- data/reactive_record_test_app/app/views/models/address.rb +13 -0
- data/reactive_record_test_app/app/views/models/comment.rb +19 -0
- data/reactive_record_test_app/app/views/models/todo_item.rb +36 -0
- data/reactive_record_test_app/app/views/models/user.rb +78 -0
- data/reactive_record_test_app/config.ru +33 -0
- data/reactive_record_test_app/config/application.rb +73 -0
- data/reactive_record_test_app/config/boot.rb +10 -0
- data/reactive_record_test_app/config/database.yml +25 -0
- data/reactive_record_test_app/config/environment.rb +5 -0
- data/reactive_record_test_app/config/environments/development.rb +43 -0
- data/reactive_record_test_app/config/environments/production.rb +70 -0
- data/reactive_record_test_app/config/environments/test.rb +41 -0
- data/reactive_record_test_app/config/initializers/backtrace_silencers.rb +7 -0
- data/reactive_record_test_app/config/initializers/inflections.rb +15 -0
- data/reactive_record_test_app/config/initializers/mime_types.rb +5 -0
- data/reactive_record_test_app/config/initializers/secret_token.rb +7 -0
- data/reactive_record_test_app/config/initializers/session_store.rb +8 -0
- data/reactive_record_test_app/config/initializers/wrap_parameters.rb +14 -0
- data/reactive_record_test_app/config/locales/en.yml +5 -0
- data/reactive_record_test_app/config/routes.rb +7 -0
- data/reactive_record_test_app/db/migrate/20150617002932_create_todo_items.rb +11 -0
- data/reactive_record_test_app/db/migrate/20150617134028_create_users.rb +14 -0
- data/reactive_record_test_app/db/migrate/20150729195556_add_address_to_user.rb +20 -0
- data/reactive_record_test_app/db/migrate/20150826142045_create_comments.rb +10 -0
- data/reactive_record_test_app/db/migrate/20150828172008_add_single_comment_to_todo_item.rb +5 -0
- data/reactive_record_test_app/db/migrate/20150908184118_add_address_id_to_user.rb +5 -0
- data/reactive_record_test_app/db/migrate/20150917220236_add_second_address_to_user.rb +10 -0
- data/reactive_record_test_app/db/migrate/20151009000111_add_test_data_attributes_to_user.rb +6 -0
- data/reactive_record_test_app/db/migrate/20160129182544_add_test_enum_to_user.rb +5 -0
- data/reactive_record_test_app/db/schema.rb +63 -0
- data/reactive_record_test_app/db/seeds.rb +60 -0
- data/reactive_record_test_app/public/404.html +26 -0
- data/reactive_record_test_app/public/422.html +26 -0
- data/reactive_record_test_app/public/500.html +25 -0
- data/reactive_record_test_app/public/favicon.ico +0 -0
- data/reactive_record_test_app/script/rails +6 -0
- data/reactive_record_test_app/spec-opal/active-record/aggregations_spec.rb +41 -0
- data/reactive_record_test_app/spec-opal/active-record/associations_spec.rb +75 -0
- data/reactive_record_test_app/spec-opal/active-record/base_spec.rb +126 -0
- data/reactive_record_test_app/spec-opal/active-record/dummy_value_spec.rb +27 -0
- data/reactive_record_test_app/spec-opal/active-record/edge_cases_spec.rb +116 -0
- data/reactive_record_test_app/spec-opal/active-record/enum_spec.rb +43 -0
- data/reactive_record_test_app/spec-opal/active-record/instance_methods_spec.rb +53 -0
- data/reactive_record_test_app/spec-opal/active-record/non_ar_aggregations_spec.rb +74 -0
- data/reactive_record_test_app/spec-opal/active-record/permissions_spec.rb +170 -0
- data/reactive_record_test_app/spec-opal/active-record/prerendering_spec.rb +49 -0
- data/reactive_record_test_app/spec-opal/active-record/reactive_record_load_spec.rb +23 -0
- data/reactive_record_test_app/spec-opal/active-record/rendering_spec.rb +221 -0
- data/reactive_record_test_app/spec-opal/active-record/save_spec.rb +125 -0
- data/reactive_record_test_app/spec-opal/active-record/scope_spec.rb +85 -0
- data/reactive_record_test_app/spec-opal/active-record/update_aggregations_spec.rb +76 -0
- data/reactive_record_test_app/spec-opal/active-record/update_attributes_spec.rb +186 -0
- data/reactive_record_test_app/spec-opal/active-record/virtual_methods_spec.rb +71 -0
- data/reactive_record_test_app/spec-opal/index.html.erb +11 -0
- data/reactive_record_test_app/spec-opal/spec_helper.js.rb +268 -0
- data/reactive_record_test_app/spec-opal/vendor/es5-shim.min.js +6 -0
- data/reactive_record_test_app/spec_dont_run/README.md +26 -0
- data/reactive_record_test_app/spec_dont_run/moved_to_main_spec_dir/zzzmany_to_many_spec_moved_to_main_suite.rb +30 -0
- data/reactive_record_test_app/spec_dont_run/moved_to_main_spec_dir/zzzrevert_record_spec_moved.rb +78 -0
- data/reactive_record_test_app/spec_dont_run/moved_to_main_spec_dir/zzzupdate_associations_spec_moved.rb +142 -0
- data/reactive_record_test_app/spec_dont_run/moved_to_main_spec_dir/zzzupdate_scopes_movedspec.rb +48 -0
- data/remote.md +115 -0
- data/spec/bin/firebug-2.0.13-fx.xpi +0 -0
- data/spec/component_helpers_xspec.rb +49 -0
- data/spec/factories/child_model.rb +5 -0
- data/spec/factories/comment.rb +5 -0
- data/spec/factories/test_models.rb +5 -0
- data/spec/factories/todo.rb +5 -0
- data/spec/factories/user.rb +5 -0
- data/spec/reactive_record/edge_cases_spec.rb +31 -0
- data/spec/reactive_record/factory.rb +62 -0
- data/spec/reactive_record/many_to_many_spec.rb +50 -0
- data/spec/reactive_record/play.rb +64 -0
- data/spec/reactive_record/pry_rescue_xspec.rb +48 -0
- data/spec/reactive_record/revert_spec.rb +112 -0
- data/spec/reactive_record/update_associations_spec.rb +189 -0
- data/spec/reactive_record/update_scopes_spec.rb +53 -0
- data/spec/spec_helper.rb +366 -0
- data/spec/support/component_helpers.rb +351 -0
- data/spec/synchromesh/column_types/column_type_spec.rb +302 -0
- data/spec/synchromesh/connection_spec.rb +144 -0
- data/spec/synchromesh/crud_access_regulation/broadcast_controls_access_spec.rb +105 -0
- data/spec/synchromesh/crud_access_regulation/model_policies_spec.rb +131 -0
- data/spec/synchromesh/examples/dictionary.rb +239 -0
- data/spec/synchromesh/examples/dictionary_with_client_scopes.rb +196 -0
- data/spec/synchromesh/examples/random_examples.rb +100 -0
- data/spec/synchromesh/examples/scoped_todos_spec.rb +167 -0
- data/spec/synchromesh/integration/authorization_spec.rb +111 -0
- data/spec/synchromesh/integration/default_scope_spec.rb +121 -0
- data/spec/synchromesh/integration/has_many_through_spec.rb +173 -0
- data/spec/synchromesh/integration/relationships_spec.rb +263 -0
- data/spec/synchromesh/integration/scope_spec.rb +553 -0
- data/spec/synchromesh/integration/synchromesh_spec.rb +80 -0
- data/spec/synchromesh/integration/test_components.rb +18 -0
- data/spec/synchromesh/integration/transports_spec.rb +308 -0
- data/spec/synchromesh/policies/auto_connect_spec.rb +60 -0
- data/spec/synchromesh/policies/auto_loader_spec.rb +34 -0
- data/spec/synchromesh/policies/policy_methods_spec.rb +85 -0
- data/spec/synchromesh/policies/regulate_all_broadcasts_spec.rb +315 -0
- data/spec/synchromesh/policies/regulate_broadcast_spec.rb +370 -0
- data/spec/synchromesh/policies/regulate_class_connection_spec.rb +50 -0
- data/spec/synchromesh/policies/regulate_instance_connection_spec.rb +66 -0
- data/spec/test_app/Gemfile +61 -0
- data/spec/test_app/Gemfile.lock +253 -0
- data/spec/test_app/Rakefile +6 -0
- data/spec/test_app/app/assets/javascripts/application.js +6 -0
- data/spec/test_app/app/assets/stylesheets/application.css +15 -0
- data/spec/test_app/app/controllers/application_controller.rb +13 -0
- data/spec/test_app/app/controllers/test_controller.rb +5 -0
- data/spec/test_app/app/models/_react_public_models.rb +2 -0
- data/spec/test_app/app/models/public/address.rb +13 -0
- data/spec/test_app/app/models/public/child_model.rb +3 -0
- data/spec/test_app/app/models/public/comment.rb +25 -0
- data/spec/test_app/app/models/public/test_model.rb +5 -0
- data/spec/test_app/app/models/public/todo.rb +6 -0
- data/spec/test_app/app/models/public/todo_item.rb +36 -0
- data/spec/test_app/app/models/public/user.rb +88 -0
- data/spec/test_app/app/policies/auto_loader_test_classa_policy.rb +3 -0
- data/spec/test_app/app/policies/auto_loader_test_classb_policy.rb +3 -0
- data/spec/test_app/app/policies/auto_loader_test_classc_policy.rb +3 -0
- data/spec/test_app/app/policies/auto_loader_test_classd_policy.rb +3 -0
- data/spec/test_app/app/views/components.rb +14 -0
- data/spec/test_app/app/views/components/show.rb +5 -0
- data/spec/test_app/app/views/layouts/application.html.erb +14 -0
- data/spec/test_app/bin/bundle +3 -0
- data/spec/test_app/bin/rails +4 -0
- data/spec/test_app/bin/rake +4 -0
- data/spec/test_app/bin/setup +29 -0
- data/spec/test_app/config.ru +4 -0
- data/spec/test_app/config/application.rb +42 -0
- data/spec/test_app/config/boot.rb +6 -0
- data/spec/test_app/config/cable.yml +10 -0
- data/spec/test_app/config/database.yml +47 -0
- data/spec/test_app/config/environment.rb +5 -0
- data/spec/test_app/config/environments/development.rb +41 -0
- data/spec/test_app/config/environments/production.rb +79 -0
- data/spec/test_app/config/environments/test.rb +42 -0
- data/spec/test_app/config/initializers/assets.rb +11 -0
- data/spec/test_app/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/test_app/config/initializers/cookies_serializer.rb +3 -0
- data/spec/test_app/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/test_app/config/initializers/inflections.rb +16 -0
- data/spec/test_app/config/initializers/mime_types.rb +4 -0
- data/spec/test_app/config/initializers/session_store.rb +3 -0
- data/spec/test_app/config/initializers/synchromesh.rb +11 -0
- data/spec/test_app/config/initializers/wrap_parameters.rb +14 -0
- data/spec/test_app/config/locales/en.yml +23 -0
- data/spec/test_app/config/routes.rb +61 -0
- data/spec/test_app/config/secrets.yml +22 -0
- data/spec/test_app/db/development.sqlite3 +0 -0
- data/spec/test_app/db/migrate/20160731182106_create_test_models.rb +75 -0
- data/spec/test_app/db/schema.rb +88 -0
- data/spec/test_app/db/seeds.rb +7 -0
- data/spec/test_app/lib/assets/.keep +0 -0
- data/spec/test_app/log/.keep +0 -0
- data/spec/test_app/public/404.html +67 -0
- data/spec/test_app/public/422.html +67 -0
- data/spec/test_app/public/500.html +66 -0
- data/spec/test_app/public/favicon.ico +0 -0
- data/spec/vendor/es5-shim.min.js +6 -0
- data/terminal.md +66 -0
- metadata +1175 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: e0d8993f6335ea2a758fc5f9c04765659e5ea02a
|
4
|
+
data.tar.gz: 57749d3dd923e09ce67aa9bffe10ea5dc1009dd6
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 368fde4b81e66211bc22f42df68d06e9349187c8720f108bfec40758ddc7d8d0584fe6a76895a09aa095148fdd1362f1bd9fd7084c92f127eea9fa5937256533
|
7
|
+
data.tar.gz: aa7b20249a6ad4e8947e0870d15ab46ef842d571ced932c7517ff8193bb03c96a5138a1cab121f1d3960e9c3008a266414cd05d057293f137b26c8b1ee93c8b8
|
data/.gitignore
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
/.bundle/
|
2
|
+
/.yardoc
|
3
|
+
/_yardoc/
|
4
|
+
/.byebug_history
|
5
|
+
/coverage/
|
6
|
+
/doc/
|
7
|
+
/pkg/
|
8
|
+
/spec/reports/
|
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
|
14
|
+
/synchromesh-simple-poller-store
|
15
|
+
/synchromesh-pusher-channel-store
|
16
|
+
/Gemfile.lock
|
17
|
+
/examples/action-cable/rails_cache_dir/
|
18
|
+
rails_cache_dir/
|
19
|
+
|
20
|
+
.bundle/
|
21
|
+
log/*.log
|
22
|
+
pkg/
|
23
|
+
reactive_record_test_app/db/*.sqlite3
|
24
|
+
reactive_record_test_app/log/
|
25
|
+
reactive_record_test_app/tmp/
|
26
|
+
reactive_record_test_app/.sass-cache
|
27
|
+
.DS_Store
|
data/.rspec
ADDED
data/.rubocop.yml
ADDED
data/.travis.yml
ADDED
data/CODE_OF_CONDUCT.md
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
# Contributor Code of Conduct
|
2
|
+
|
3
|
+
As contributors and maintainers of this project, we pledge to respect all people who contribute through reporting issues, posting feature requests, updating documentation, submitting pull requests or patches, and other activities.
|
4
|
+
|
5
|
+
We are committed to making participation in this project a harassment-free experience for everyone, regardless of level of experience, gender, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, ethnicity, age, or religion.
|
6
|
+
|
7
|
+
Examples of unacceptable behavior by participants include the use of sexual language or imagery, derogatory comments or personal attacks, trolling, public or private harassment, insults, or other unprofessional conduct.
|
8
|
+
|
9
|
+
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct. Project maintainers who do not follow the Code of Conduct may be removed from the project team.
|
10
|
+
|
11
|
+
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by opening an issue or contacting one or more of the project maintainers.
|
12
|
+
|
13
|
+
This Code of Conduct is adapted from the [Contributor Covenant](http://contributor-covenant.org), version 1.0.0, available at [http://contributor-covenant.org/version/1/0/0/](http://contributor-covenant.org/version/1/0/0/)
|
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2016 Mitch VanDuyn
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,396 @@
|
|
1
|
+
# ![](https://avatars3.githubusercontent.com/u/15810526?v=3&s=40&raw=true)HyperMesh
|
2
|
+
|
3
|
+
HyperMesh gives your HyperReact components CRUD access to your ActiveRecord models on the client, using the the standard ActiveRecord API.
|
4
|
+
Furthermore HyperMesh implements push notifications (via a number of possible
|
5
|
+
technologies) so changes to records on the server are dynamically pushed to all authorised clients.
|
6
|
+
|
7
|
+
*Its Isomorphic Ruby in action.*
|
8
|
+
|
9
|
+
In other words browser 1 creates, updates, or destroys a model, and the changes are persisted in
|
10
|
+
active record models and then broadcast to all other authorised clients.
|
11
|
+
|
12
|
+
## Quick Start Guides
|
13
|
+
|
14
|
+
Use one of the following guides if you are in a hurry to get going.
|
15
|
+
|
16
|
+
If you don't care about synchronizing clients (i.e you just want a simple single client CRUD type application) use this
|
17
|
+
[guide.](docs/no_synchronization_quickstart.md)
|
18
|
+
|
19
|
+
Otherwise you will need to choose a data push transport. The following guides add the additional configuration
|
20
|
+
information needed to get two way push communications back to the clients.
|
21
|
+
|
22
|
+
The easiest way to setup client push is to use the Pusher-Fake gem. Get started with this [guide.](docs/pusher_faker_quickstart.md)
|
23
|
+
|
24
|
+
If you are already using Pusher follow this [guide.](docs/pusher_quickstart.md)
|
25
|
+
|
26
|
+
If you are on Rails 5 already, and want to try ActionCable use this [guide.](docs/action_cable_quickstart.md)
|
27
|
+
|
28
|
+
All of the above use websockets. For ultimate simplicity use Polling as explained [here.](docs/simple_poller_quickstart.md)
|
29
|
+
|
30
|
+
## Overview
|
31
|
+
|
32
|
+
+ HyperMesh is built on top of HyperReact.
|
33
|
+
+ HyperReact is a Ruby DSL (Domain Specific Language) to build [React.js](https://facebook.github.io/react/) UI components in Ruby. As data changes on the client (either from user interactions or external events) HyperReact re-draws whatever parts of the display is needed.
|
34
|
+
+ HyperMesh provides a [flux dispatcher and data store](https://facebook.github.io/flux/docs/overview.html) backed by [Rails Active Record models](http://guides.rubyonrails.org/active_record_basics.html). You access your model data in your HyperReact components just like you would on the server or in an ERB or HAML view file.
|
35
|
+
+ If a push transport is connected HyperMesh broadcasts any changes to your ActiveRecord models as they are persisted on the server.
|
36
|
+
|
37
|
+
For example consider a simple model called `Dictionary` which might be part of Wiktionary type app.
|
38
|
+
|
39
|
+
```ruby
|
40
|
+
class Dictionary < ActiveRecord::Base
|
41
|
+
|
42
|
+
# attributes
|
43
|
+
# word: string
|
44
|
+
# definition: text
|
45
|
+
# pronunciation: string
|
46
|
+
|
47
|
+
scope :defined, -> { 'definition IS NOT NULL AND pronunciation IS NOT NULL' }
|
48
|
+
end
|
49
|
+
```
|
50
|
+
|
51
|
+
Here is a very simple HyperReact component that shows a random word from the dictionary:
|
52
|
+
|
53
|
+
```ruby
|
54
|
+
class WordOfTheDay < React::Component::Base
|
55
|
+
|
56
|
+
def pick_entry!
|
57
|
+
# pick a random word and assign the selected record to entry
|
58
|
+
|
59
|
+
@entry = Dictionary.defined.all[rand(Dictionary.defined.count)]
|
60
|
+
force_update! # redraw our component when the word changes
|
61
|
+
|
62
|
+
# Notice that we use standard ActiveRecord constructs to select our
|
63
|
+
# random entry value
|
64
|
+
end
|
65
|
+
|
66
|
+
# before we mount (draw the first time) our component pick an entry...
|
67
|
+
|
68
|
+
before_mount :pick_entry
|
69
|
+
|
70
|
+
# Again in our render block we use the standard ActiveRecord API, such
|
71
|
+
# as the 'defined' scope, and the 'word', 'pronunciation', & 'definition'
|
72
|
+
# attribute getters.
|
73
|
+
|
74
|
+
render(DIV) do
|
75
|
+
DIV { "total definitions: #{Dictionary.defined.count}" }
|
76
|
+
DIV do
|
77
|
+
DIV { @entry.word }
|
78
|
+
DIV { @entry.pronunciation }
|
79
|
+
DIV { @entry.definition }
|
80
|
+
BUTTON { 'pick another' }.on(:click) { pick_entry! }
|
81
|
+
end
|
82
|
+
end
|
83
|
+
```
|
84
|
+
|
85
|
+
|
86
|
+
|
87
|
+
A minimal HyperMesh configuration consists of a simple initializer file, and at least one *Policy* class that will *authorize* who gets to see what.
|
88
|
+
|
89
|
+
The initializer file specifies what transport will be used. Currently you can use [Pusher](http://pusher.com), ActionCable (if using Rails 5), Pusher-Fake (for development) or a Simple Poller for testing etc.
|
90
|
+
|
91
|
+
HyperMesh also adds some features to the `ActiveRecord` `scope` method to manage scopes updates. Details [here.](docs/client_side_scoping.md)
|
92
|
+
|
93
|
+
## Authorization
|
94
|
+
|
95
|
+
Each application defines a number of *channels* and *authorization policies* for those channels and the data sent over the channels.
|
96
|
+
|
97
|
+
Policies are defined with *Policy* classes. These are similar and compatible with [Pundit](https://github.com/elabs/pundit) but
|
98
|
+
you do not need to use the pundit gem (but can if you want.)
|
99
|
+
|
100
|
+
Examples:
|
101
|
+
|
102
|
+
```ruby
|
103
|
+
class ApplicationPolicy
|
104
|
+
# define policies for the Application
|
105
|
+
|
106
|
+
# all clients can connect to the Application
|
107
|
+
always_allow_connection
|
108
|
+
end
|
109
|
+
|
110
|
+
class ProductionCenterPolicy
|
111
|
+
# define policies for the ProductionCenter model
|
112
|
+
|
113
|
+
# any time a ProductionCenter model is updated
|
114
|
+
# broadcast the total_jobs_shipped attribute over the
|
115
|
+
# application channel (i.e. this is public data anybody can see)
|
116
|
+
regulate_broadcast do |policy|
|
117
|
+
policy.send_only(:total_jobs_shipped).to(Application)
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
class UserPolicy
|
122
|
+
# define policies for the User channel and Model
|
123
|
+
|
124
|
+
# connect a channel for each logged in user
|
125
|
+
regulate_instance_connection { self }
|
126
|
+
|
127
|
+
# users can see all but one field of their own data
|
128
|
+
regulate_broadcast do |policy|
|
129
|
+
policy.send_all_but(:gross_margin_contribution).to(self)
|
130
|
+
end
|
131
|
+
end
|
132
|
+
```
|
133
|
+
|
134
|
+
For complete details see [Authorization Policies](docs/authorization-policies.md)
|
135
|
+
|
136
|
+
## Installation
|
137
|
+
|
138
|
+
If you do not already have hyper-react installed, then use the reactrb-rails-generator gem to setup hyper-react, reactive-record and associated gems.
|
139
|
+
|
140
|
+
Then add this line to your application's Gemfile:
|
141
|
+
|
142
|
+
```ruby
|
143
|
+
gem 'HyperMesh'
|
144
|
+
```
|
145
|
+
|
146
|
+
And then execute:
|
147
|
+
|
148
|
+
$ bundle install
|
149
|
+
|
150
|
+
Also you must `require 'hyper-tracemesh'` from your client side code. The easiest way is to
|
151
|
+
find the `require 'reactive-record'` line (typically in `components.rb`) and replace it with
|
152
|
+
`require 'HyperMesh'`.
|
153
|
+
|
154
|
+
## Configuration
|
155
|
+
|
156
|
+
Add an initializer like this:
|
157
|
+
|
158
|
+
```ruby
|
159
|
+
# for rails this would go in: config/initializers/HyperMesh.rb
|
160
|
+
HyperMesh.configuration do |config|
|
161
|
+
config.transport = :simple_poller # or :none, action_cable, :pusher - see below)
|
162
|
+
end
|
163
|
+
# for a minimal setup you will need to define at least one channel, which you can do
|
164
|
+
# in the same file as your initializer.
|
165
|
+
# Normally you would put these policies in the app/policies/ directory
|
166
|
+
class ApplicationPolicy
|
167
|
+
# allow all clients to connect to the Application channel
|
168
|
+
regulate_connection { true } # or always_allow_connection for short
|
169
|
+
# broadcast all model changes over the Application channel *DANGEROUS*
|
170
|
+
regulate_all_broadcasts { |policy| policy.send_all }
|
171
|
+
end
|
172
|
+
```
|
173
|
+
|
174
|
+
### Action Cable Configuration
|
175
|
+
|
176
|
+
If you are on Rails 5 you can use ActionCable out of the box.
|
177
|
+
|
178
|
+
```ruby
|
179
|
+
#config/initializers/HyperMesh.rb
|
180
|
+
HyperMesh.configuration do |config|
|
181
|
+
config.transport = :action_cable
|
182
|
+
end
|
183
|
+
```
|
184
|
+
|
185
|
+
If you have not yet setup action cable all you have to do is include the `action_cable` js file in your assets
|
186
|
+
|
187
|
+
```javascript
|
188
|
+
//application.js
|
189
|
+
...
|
190
|
+
//= require action_cable
|
191
|
+
...
|
192
|
+
```
|
193
|
+
|
194
|
+
The rest of the setup will be handled by HyperMesh.
|
195
|
+
|
196
|
+
HyperMesh will not interfere with any ActionCable connections and channels you may have already defined.
|
197
|
+
|
198
|
+
### Pusher Configuration
|
199
|
+
|
200
|
+
Add `gem 'pusher'` to your gem file, and add `//= require 'HyperMesh/pusher'` to your application.js file.
|
201
|
+
|
202
|
+
```ruby
|
203
|
+
# typically config/initializers/HyperMesh.rb
|
204
|
+
HyperMesh.configuration do |config|
|
205
|
+
config.transport = :pusher
|
206
|
+
config.opts = {
|
207
|
+
app_id: '2xxxx2',
|
208
|
+
key: 'dxxxxxxxxxxxxxxxxxx9',
|
209
|
+
secret: '2xxxxxxxxxxxxxxxxxx2',
|
210
|
+
encrypted: false # optional defaults to true
|
211
|
+
}
|
212
|
+
config.channel_prefix = 'syncromesh' # or any other string you want
|
213
|
+
end
|
214
|
+
```
|
215
|
+
|
216
|
+
### Pusher-Fake
|
217
|
+
|
218
|
+
You can also use the [Pusher-Fake](https://github.com/tristandunn/pusher-fake) gem while in development. Setup is a little tricky. First
|
219
|
+
add `gem 'pusher-fake'` to the development and/or test section of your gem file. Then setup your config file:
|
220
|
+
|
221
|
+
```ruby
|
222
|
+
# typically config/initializers/HyperMesh.rb
|
223
|
+
# or you can do a similar setup in your tests (see this gem's specs)
|
224
|
+
require 'pusher'
|
225
|
+
require 'pusher-fake'
|
226
|
+
# The app_id, key, and secret need to be assigned directly to Pusher
|
227
|
+
# so PusherFake will work.
|
228
|
+
Pusher.app_id = "MY_TEST_ID" # you use the real or fake values
|
229
|
+
Pusher.key = "MY_TEST_KEY"
|
230
|
+
Pusher.secret = "MY_TEST_SECRET"
|
231
|
+
# The next line actually starts the pusher-fake server (see the Pusher-Fake readme for details.)
|
232
|
+
require 'pusher-fake/support/base' # if using pusher with rspec change this to pusher-fake/support/rspec
|
233
|
+
# now copy over the credentials, and merge with PusherFake's config details
|
234
|
+
HyperMesh.configuration do |config|
|
235
|
+
config.transport = :pusher
|
236
|
+
config.channel_prefix = "HyperMesh"
|
237
|
+
config.opts = {
|
238
|
+
app_id: Pusher.app_id,
|
239
|
+
key: Pusher.key,
|
240
|
+
secret: Pusher.secret
|
241
|
+
}.merge(PusherFake.configuration.web_options)
|
242
|
+
end
|
243
|
+
```
|
244
|
+
|
245
|
+
### Simple Poller Details
|
246
|
+
|
247
|
+
Setup your config like this:
|
248
|
+
```ruby
|
249
|
+
HyperMesh.configuration do |config|
|
250
|
+
config.transport = :simple_poller
|
251
|
+
config.channel_prefix = "HyperMesh"
|
252
|
+
config.opts = {
|
253
|
+
seconds_between_poll: 5, # default is 0.5 you may need to increase if testing with Selenium
|
254
|
+
seconds_polled_data_will_be_retained: 1.hour # clears channel data after this time, default is 5 minutes
|
255
|
+
}
|
256
|
+
end
|
257
|
+
```
|
258
|
+
|
259
|
+
## The Cache store
|
260
|
+
|
261
|
+
HyperMesh uses the rails cache to keep track of what connections are alive in a transport independent fashion. Rails 5 by default will have caching off in development mode.
|
262
|
+
|
263
|
+
Check in `config/development.rb` and make sure that `cache_store` is never being set to `:null_store`.
|
264
|
+
|
265
|
+
If you would like to be able to interact via
|
266
|
+
the `rails console` you should set the store to be something like this:
|
267
|
+
|
268
|
+
```ruby
|
269
|
+
# config/development.rb
|
270
|
+
Rails.application.configure do
|
271
|
+
...
|
272
|
+
config.cache_store = :file_store, './rails_cache_dir'
|
273
|
+
...
|
274
|
+
end
|
275
|
+
```
|
276
|
+
|
277
|
+
## Common Errors
|
278
|
+
|
279
|
+
- No policy class:
|
280
|
+
If you don't define a policy file, nothing will happen because nothing will get connected.
|
281
|
+
By default HyperMesh will look for a `ApplicationPolicy` class.
|
282
|
+
|
283
|
+
- Wrong version of pusher-fake (pusher-fake/base vs. pusher-fake/rspec)
|
284
|
+
See the Pusher-Fake gem repo for details.
|
285
|
+
|
286
|
+
- Forgetting to add require pusher in application.js file
|
287
|
+
this results in an error like this:
|
288
|
+
```text
|
289
|
+
Exception raised while rendering #<TopLevelRailsComponent:0x53e>
|
290
|
+
ReferenceError: Pusher is not defined
|
291
|
+
```
|
292
|
+
To resolve make sure you `require 'pusher'` in your application.js file if using pusher.
|
293
|
+
|
294
|
+
- No create/update/destroy policies
|
295
|
+
You must explicitly allow changes to the models to be made by the client. If you don't you will
|
296
|
+
see 500 responses from the server when you try to update. To open all access do this in
|
297
|
+
your application policy: `allow_change(to: :all, on: [:create, :update, :destroy]) { true }`
|
298
|
+
|
299
|
+
- `Cannot Run HyperMesh with cache_store == :null_store`
|
300
|
+
You will get this error on boot if you are trying to use the :null cache.
|
301
|
+
See notes above on why you cannot use the :null cache store.
|
302
|
+
|
303
|
+
- Cannot connect to real pusher account:
|
304
|
+
If you are trying to use a real pusher account (not pusher-fake) but see errors like this
|
305
|
+
```text
|
306
|
+
pusher.self.js?body=1:62 WebSocket connection to
|
307
|
+
'wss://127.0.0.1/app/PUSHER_API_KEY?protocol=7&client=js&version=3.0.0&flash=false'
|
308
|
+
failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED
|
309
|
+
```
|
310
|
+
Check to see if you are including the pusher-fake gem.
|
311
|
+
HyperMesh 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.
|
312
|
+
|
313
|
+
- Cannot connect with ActionCable. Make sure that `config.action_cable.allowed_request_origins` includes the url you use for development (including the port) and that you are useing `Puma`.
|
314
|
+
|
315
|
+
- Attributes are not being converted from strings, or do not have their default values
|
316
|
+
Eager loading is probably turned off. HyperMesh needs to eager load `models/public` so it can find all the column information for all public models.
|
317
|
+
|
318
|
+
## Debugging
|
319
|
+
|
320
|
+
Sometimes you need to figure out what connections are available, or what attributes are readable etc.
|
321
|
+
|
322
|
+
Its all to do with your policies, but perhaps you just need a little investigation.
|
323
|
+
|
324
|
+
You can bring up a console within the controller context by browsing `localhost:3000/rr/console`
|
325
|
+
|
326
|
+
*Note: change `rr` to wherever you are mounting reactive record in your routes file.*
|
327
|
+
|
328
|
+
*Note: in rails 4, you will need to add the gem 'web-console' to your development section*
|
329
|
+
|
330
|
+
Within the context you have access to `session.id` and current `acting_user` which you will need, plus some helper methods to reduce typing
|
331
|
+
|
332
|
+
- Getting auto connection channels:
|
333
|
+
`channels(session_id = session.id, user = acting_user)`
|
334
|
+
e.g. `channels` returns all channels connecting to this session and user
|
335
|
+
providing nil as the acting_user will test if connections can be made without there being a logged in user.
|
336
|
+
|
337
|
+
- Can a specific class connection be made:
|
338
|
+
`can_connect?(channel, user = acting_user)`
|
339
|
+
e.g. `can_connect? Todo` returns true if current acting_user can connect to the Todo class
|
340
|
+
You can also provide the class name as a string.
|
341
|
+
|
342
|
+
- Can a specific instance connection be made:
|
343
|
+
`can_connect?(channel, user = acting_user)`
|
344
|
+
e.g. `can_connect? Todo.first` returns true if current acting_user can connect to the first Todo model.
|
345
|
+
You can also provide the instance in the form 'Todo-123'
|
346
|
+
|
347
|
+
- What attributes are accessible for a model instance:
|
348
|
+
`viewable_attributes(instance, user = acting_user)`
|
349
|
+
|
350
|
+
- Can the attribute be viewed:
|
351
|
+
`view_permitted?(instance, attribute, user = acting_user)`
|
352
|
+
|
353
|
+
- Can a model be created/updated/destroyed:
|
354
|
+
`create_permitted?(instance, user = acting_user)`
|
355
|
+
e.g. `create_permitted?(Todo.new, nil)` can anybody save a new todo?
|
356
|
+
e.g. `destroy_permitted?(Todo.last)` can the acting_user destroy the last Todo
|
357
|
+
|
358
|
+
You can of course simulate server side changes to your models through this console like any other console. For example
|
359
|
+
|
360
|
+
`Todo.new.save` will broadcast the changes to the Todo model to any authorized channels.
|
361
|
+
|
362
|
+
## Development
|
363
|
+
|
364
|
+
The original `ReactiveRecord` specs were written in opal-rspec. These are being migrated to
|
365
|
+
use server rspec with isomorphic helpers. There are about 150 of the original tests left and to run
|
366
|
+
these you
|
367
|
+
|
368
|
+
1. cd to `reactive_record_spec/test_app`
|
369
|
+
2. do a bundle install/update as needed,
|
370
|
+
3. rake db:reset db:test:prepare,
|
371
|
+
4. start the server: `bundle exec rails s`,
|
372
|
+
5. then visit localhost/spec-opal.
|
373
|
+
|
374
|
+
If you want to help **PLEASE** consider spending an hour and migrate a spec file to the new format. You can
|
375
|
+
find examples by looking in the `spec/reactive_record/` directory and matching to the original file in
|
376
|
+
`reactive_record_test_app/spec_dont_run/moved_to_main_spec_dir`
|
377
|
+
|
378
|
+
The remaining tests are run in the more traditional `bundle exec rake`
|
379
|
+
|
380
|
+
or
|
381
|
+
|
382
|
+
```
|
383
|
+
bundle exec rspec spec
|
384
|
+
```
|
385
|
+
|
386
|
+
You can run the specs in firefox by adding `DRIVER=ff` (best for debugging.) You can add `SHOW_LOGS=true` if running in poltergeist (the default) to see what is going on, but ff is a lot better for debug.
|
387
|
+
|
388
|
+
|
389
|
+
## Contributing
|
390
|
+
|
391
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/reactive-ruby/HyperMesh. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](contributor-covenant.org) code of conduct.
|
392
|
+
|
393
|
+
|
394
|
+
## License
|
395
|
+
|
396
|
+
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|