hyper-mesh 0.4.0 → 0.5.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.
- checksums.yaml +4 -4
- data/README.md +59 -204
- data/config/routes.rb +1 -1
- data/docs/action_cable_quickstart.md +13 -36
- data/docs/configuration_details.md +62 -0
- data/docs/pusher_faker_quickstart.md +28 -0
- data/docs/pusher_quickstart.md +17 -0
- data/docs/simple_poller_quickstart.md +5 -0
- data/examples/words/Gemfile +4 -3
- data/examples/words/Gemfile.lock +33 -32
- data/examples/words/app/views/components.rb +4 -2
- data/examples/words/config/initializers/hyper_mesh.rb +14 -0
- data/examples/words/config/routes.rb +1 -1
- data/hyper-mesh-0.4.0.gem +0 -0
- data/lib/hyper-mesh.rb +2 -1
- data/lib/hypermesh/version.rb +1 -1
- data/lib/reactive_record/active_record/public_columns_hash.rb +2 -2
- data/lib/reactive_record/active_record/reactive_record/isomorphic_base.rb +1 -1
- data/lib/reactive_record/engine.rb +2 -4
- data/lib/reactive_record/permissions.rb +30 -7
- data/lib/synchromesh/client_drivers.rb +3 -5
- data/lib/synchromesh/connection.rb +34 -8
- data/lib/synchromesh/synchromesh.rb +11 -7
- data/lib/synchromesh/synchromesh_controller.rb +9 -1
- data/path_release_steps.md +9 -0
- data/reactive_record_test_app/Gemfile +2 -1
- data/reactive_record_test_app/Gemfile.lock +6 -6
- data/reactive_record_test_app/config/application.rb +0 -1
- data/reactive_record_test_app/config/initializers/hyper_mesh_legacy_behavior.rb +5 -0
- data/reactive_record_test_app/config/routes.rb +3 -3
- data/spec/reactive_record/edge_cases_spec.rb +1 -1
- data/spec/reactive_record/many_to_many_spec.rb +1 -1
- data/spec/reactive_record/revert_spec.rb +1 -0
- data/spec/reactive_record/update_associations_spec.rb +1 -0
- data/spec/reactive_record/update_scopes_spec.rb +1 -0
- data/spec/synchromesh/crud_access_regulation/broadcast_controls_access_spec.rb +0 -6
- data/spec/synchromesh/crud_access_regulation/model_policies_spec.rb +8 -6
- data/spec/synchromesh/integration/has_many_through_spec.rb +0 -4
- data/spec/test_app/config/routes.rb +1 -1
- data/work-in-progress-drinking.png +0 -0
- metadata +8 -4
- data/examples/words/config/initializers/synchromesh.rb +0 -5
- data/lib/synchromesh/reactive_record/permission_patches.rb +0 -43
@@ -244,8 +244,8 @@ module HyperMesh
|
|
244
244
|
prerender_footer do |controller|
|
245
245
|
if defined?(PusherFake)
|
246
246
|
path = ::Rails.application.routes.routes.detect do |route|
|
247
|
-
route.app ==
|
248
|
-
(route.app.respond_to?(:app) && route.app.app ==
|
247
|
+
route.app == HyperMesh::Engine ||
|
248
|
+
(route.app.respond_to?(:app) && route.app.app == HyperMesh::Engine)
|
249
249
|
end.path.spec
|
250
250
|
pusher_fake_js = PusherFake.javascript(
|
251
251
|
auth: { headers: { 'X-CSRF-Token' => controller.send(:form_authenticity_token) } },
|
@@ -277,14 +277,12 @@ module HyperMesh
|
|
277
277
|
end
|
278
278
|
|
279
279
|
isomorphic_method(:get_public_columns_hash) do |f|
|
280
|
-
f.when_on_client {
|
280
|
+
f.when_on_client { opts[:public_columns_hash] || {} }
|
281
281
|
f.send_to_server
|
282
282
|
f.when_on_server { ActiveRecord::Base.public_columns_hash }
|
283
283
|
end
|
284
284
|
|
285
285
|
def self.public_columns_hash
|
286
|
-
# return {} unless @opts && @opts[:public_columns_hash]
|
287
|
-
# @opts[:public_columns_hash]
|
288
286
|
@public_columns_hash ||= get_public_columns_hash
|
289
287
|
end
|
290
288
|
|
@@ -1,6 +1,30 @@
|
|
1
1
|
module HyperMesh
|
2
|
+
module AutoCreate
|
3
|
+
def needs_init?
|
4
|
+
return true unless connection.tables.include?(table_name)
|
5
|
+
return false if HyperMesh.on_console?
|
6
|
+
return true if defined?(Rails::Server)
|
7
|
+
return true unless Connection.root_path
|
8
|
+
uri = URI("#{Connection.root_path}server_up")
|
9
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
10
|
+
request = Net::HTTP::Get.new(uri.path)
|
11
|
+
if uri.scheme == 'https'
|
12
|
+
http.use_ssl = true
|
13
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
14
|
+
end
|
15
|
+
http.request(request) && return rescue true
|
16
|
+
end
|
17
|
+
|
18
|
+
def create_table(*args, &block)
|
19
|
+
connection.create_table(table_name, *args, &block) if needs_init?
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
2
23
|
class Connection < ActiveRecord::Base
|
3
24
|
class QueuedMessage < ActiveRecord::Base
|
25
|
+
|
26
|
+
extend AutoCreate
|
27
|
+
|
4
28
|
self.table_name = 'synchromesh_queued_messages'
|
5
29
|
|
6
30
|
do_not_synchronize
|
@@ -29,17 +53,17 @@ module HyperMesh
|
|
29
53
|
end
|
30
54
|
end
|
31
55
|
|
56
|
+
extend AutoCreate
|
57
|
+
|
32
58
|
def self.build_tables
|
33
|
-
|
34
|
-
connection.create_table(:synchromesh_connections, force: true) do |t|
|
59
|
+
create_table(force: true) do |t|
|
35
60
|
t.string :channel
|
36
61
|
t.string :session
|
37
62
|
t.datetime :created_at
|
38
63
|
t.datetime :expires_at
|
39
64
|
t.datetime :refresh_at
|
40
65
|
end
|
41
|
-
|
42
|
-
connection.create_table(:synchromesh_queued_messages, force: true) do |t|
|
66
|
+
QueuedMessage.create_table(force: true) do |t|
|
43
67
|
t.text :data
|
44
68
|
t.integer :connection_id
|
45
69
|
end
|
@@ -80,16 +104,16 @@ module HyperMesh
|
|
80
104
|
attr_accessor :transport
|
81
105
|
|
82
106
|
def active
|
83
|
-
|
84
|
-
|
107
|
+
unless HyperMesh.on_console?
|
108
|
+
expired.delete_all
|
109
|
+
refresh_connections if needs_refresh?
|
110
|
+
end
|
85
111
|
all.pluck(:channel).uniq
|
86
112
|
end
|
87
113
|
|
88
114
|
def open(channel, session = nil, root_path = nil)
|
89
115
|
self.root_path = root_path
|
90
116
|
find_or_create_by(channel: channel, session: session)
|
91
|
-
rescue Exception => e
|
92
|
-
binding.pry
|
93
117
|
end
|
94
118
|
|
95
119
|
def send_to_channel(channel, data)
|
@@ -128,6 +152,8 @@ module HyperMesh
|
|
128
152
|
|
129
153
|
def root_path
|
130
154
|
QueuedMessage.root_path
|
155
|
+
rescue
|
156
|
+
nil
|
131
157
|
end
|
132
158
|
|
133
159
|
def refresh_connections
|
@@ -5,18 +5,24 @@ module HyperMesh
|
|
5
5
|
|
6
6
|
extend Configuration
|
7
7
|
|
8
|
+
def self.initialize_policies
|
9
|
+
config_reset unless @config_reset_called
|
10
|
+
end
|
11
|
+
|
8
12
|
def self.config_reset
|
9
|
-
|
13
|
+
@config_reset_called = true
|
10
14
|
Object.send(:remove_const, :Application) if @fake_application_defined
|
11
15
|
policy = begin
|
12
16
|
Object.const_get 'ApplicationPolicy'
|
13
17
|
rescue Exception => e
|
14
|
-
raise e unless e.is_a?(NameError) && e.message == "uninitialized constant ApplicationPolicy"
|
18
|
+
#raise e unless e.is_a?(NameError) && e.message == "uninitialized constant ApplicationPolicy"
|
19
|
+
rescue LoadError
|
15
20
|
end
|
16
21
|
application = begin
|
17
22
|
Object.const_get('Application')
|
23
|
+
rescue LoadError
|
18
24
|
rescue Exception => e
|
19
|
-
raise e unless e.is_a?(NameError) && e.message == "uninitialized constant Application"
|
25
|
+
#raise e unless e.is_a?(NameError) && e.message == "uninitialized constant Application"
|
20
26
|
end if policy
|
21
27
|
if policy && !application
|
22
28
|
Object.const_set 'Application', Class.new
|
@@ -93,9 +99,7 @@ module HyperMesh
|
|
93
99
|
end
|
94
100
|
|
95
101
|
def self.on_console?
|
96
|
-
defined?(Rails::Console)
|
97
|
-
#defined?(ActionCable::Server::Base) &&
|
98
|
-
#ActionCable::Server::Base.config.cable['adapter'] == 'async'
|
102
|
+
defined?(Rails::Console)
|
99
103
|
end
|
100
104
|
|
101
105
|
def self.send_to_server(channel, data)
|
@@ -105,7 +109,7 @@ module HyperMesh
|
|
105
109
|
uri = URI("#{Connection.root_path}console_update")
|
106
110
|
http = Net::HTTP.new(uri.host, uri.port)
|
107
111
|
request = Net::HTTP::Post.new(uri.path, 'Content-Type' => 'application/json')
|
108
|
-
if uri.scheme
|
112
|
+
if uri.scheme == 'https'
|
109
113
|
http.use_ssl = true
|
110
114
|
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
111
115
|
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
module ReactiveRecord
|
2
|
-
Engine.routes.append do
|
2
|
+
::HyperMesh::Engine.routes.append do
|
3
|
+
HyperMesh.initialize_policies
|
3
4
|
|
4
5
|
module ::WebConsole
|
5
6
|
class Middleware
|
@@ -30,6 +31,7 @@ module ReactiveRecord
|
|
30
31
|
end if defined?(::Rails::Rack::Logger)
|
31
32
|
|
32
33
|
class HyperMeshController < ::ApplicationController
|
34
|
+
|
33
35
|
protect_from_forgery except: [:console_update]
|
34
36
|
|
35
37
|
def client_id
|
@@ -134,6 +136,10 @@ module ReactiveRecord
|
|
134
136
|
head :unauthorized
|
135
137
|
end
|
136
138
|
|
139
|
+
def server_up
|
140
|
+
head :no_content
|
141
|
+
end
|
142
|
+
|
137
143
|
end unless defined? HyperMeshController
|
138
144
|
|
139
145
|
match 'synchromesh-subscribe/:client_id/:channel',
|
@@ -150,5 +156,7 @@ module ReactiveRecord
|
|
150
156
|
to: 'hyper_mesh#debug_console', via: :get
|
151
157
|
match 'console_update',
|
152
158
|
to: 'hyper_mesh#console_update', via: :post
|
159
|
+
match 'server_up',
|
160
|
+
to: 'hyper_mesh#server_up', via: :get
|
153
161
|
end
|
154
162
|
end
|
data/path_release_steps.md
CHANGED
@@ -0,0 +1,9 @@
|
|
1
|
+
|
2
|
+
For example assuming you are releasing fix to 0.8.18
|
3
|
+
|
4
|
+
1. Checkout 0-8-stable
|
5
|
+
2. Update tests, fix the bug and commit the changes.
|
6
|
+
3. Build & Release to RubyGems (Remember the version in version.rb should already be 0.8.19)
|
7
|
+
4. Create a tag 'v0.8.19' pointing to that commit.
|
8
|
+
5. Bump the version in 0-8-stable to 0.8.20 so it will be ready for the next patch level release.
|
9
|
+
6. Commit the version bump, and do a `git push --tags` so the new tag goes up
|
@@ -8,13 +8,11 @@ GIT
|
|
8
8
|
opal-rspec (~> 0.5.0)
|
9
9
|
|
10
10
|
PATH
|
11
|
-
remote:
|
11
|
+
remote: ../
|
12
12
|
specs:
|
13
|
-
hyper-mesh (0.
|
13
|
+
hyper-mesh (0.5.0)
|
14
14
|
activerecord (>= 0.3.0)
|
15
15
|
hyper-react (>= 0.10.0)
|
16
|
-
hyper-trace (0.3.1)
|
17
|
-
opal
|
18
16
|
|
19
17
|
GEM
|
20
18
|
remote: http://rubygems.org/
|
@@ -66,7 +64,7 @@ GEM
|
|
66
64
|
coderay (1.1.1)
|
67
65
|
coffee-script-source (1.10.0)
|
68
66
|
concurrent-ruby (1.0.2)
|
69
|
-
connection_pool (2.2.
|
67
|
+
connection_pool (2.2.1)
|
70
68
|
debug_inspector (0.0.2)
|
71
69
|
erubis (2.7.0)
|
72
70
|
execjs (2.7.0)
|
@@ -77,6 +75,7 @@ GEM
|
|
77
75
|
opal (>= 0.8.0)
|
78
76
|
opal-activesupport (>= 0.2.0)
|
79
77
|
react-rails
|
78
|
+
hyper-trace (0.3.1)
|
80
79
|
i18n (0.7.0)
|
81
80
|
interception (0.5)
|
82
81
|
jquery-cookie-rails (1.3.1.1)
|
@@ -126,7 +125,7 @@ GEM
|
|
126
125
|
pry-rescue (1.4.4)
|
127
126
|
interception (>= 0.5)
|
128
127
|
pry
|
129
|
-
rack (1.6.
|
128
|
+
rack (1.6.5)
|
130
129
|
rack-test (0.6.3)
|
131
130
|
rack (>= 1.0)
|
132
131
|
rails (4.2.7.1)
|
@@ -197,6 +196,7 @@ DEPENDENCIES
|
|
197
196
|
opal (~> 0.9.0)
|
198
197
|
opal-rails
|
199
198
|
opal-rspec-rails!
|
199
|
+
pry
|
200
200
|
pry-rails
|
201
201
|
pry-rescue
|
202
202
|
rails
|
@@ -9,8 +9,8 @@ describe "reactive-record edge cases", js: true do
|
|
9
9
|
stub_const 'TestApplication', Class.new
|
10
10
|
stub_const 'TestApplicationPolicy', Class.new
|
11
11
|
TestApplicationPolicy.class_eval do
|
12
|
+
always_allow_connection
|
12
13
|
regulate_all_broadcasts { |policy| policy.send_all }
|
13
|
-
allow_change(to: :all, on: [:create, :update, :destroy]) { true }
|
14
14
|
end
|
15
15
|
size_window(:small, :portrait)
|
16
16
|
end
|
@@ -14,8 +14,8 @@ describe "many to many associations", js: true do
|
|
14
14
|
stub_const 'TestApplication', Class.new
|
15
15
|
stub_const 'TestApplicationPolicy', Class.new
|
16
16
|
TestApplicationPolicy.class_eval do
|
17
|
+
always_allow_connection
|
17
18
|
regulate_all_broadcasts { |policy| policy.send_all }
|
18
|
-
allow_change(to: :all, on: [:create, :update, :destroy]) { true }
|
19
19
|
end
|
20
20
|
size_window(:small, :portrait)
|
21
21
|
end
|
@@ -15,6 +15,7 @@ RSpec::Steps.steps "reverting records", js: true do
|
|
15
15
|
stub_const 'TestApplication', Class.new
|
16
16
|
stub_const 'TestApplicationPolicy', Class.new
|
17
17
|
TestApplicationPolicy.class_eval do
|
18
|
+
always_allow_connection
|
18
19
|
regulate_all_broadcasts { |policy| policy.send_all }
|
19
20
|
allow_change(to: :all, on: [:create, :update, :destroy]) { true }
|
20
21
|
end
|
@@ -15,6 +15,7 @@ RSpec::Steps.steps "updating associations", js: true do
|
|
15
15
|
stub_const 'TestApplication', Class.new
|
16
16
|
stub_const 'TestApplicationPolicy', Class.new
|
17
17
|
TestApplicationPolicy.class_eval do
|
18
|
+
always_allow_connection
|
18
19
|
regulate_all_broadcasts { |policy| policy.send_all }
|
19
20
|
allow_change(to: :all, on: [:create, :update, :destroy]) { true }
|
20
21
|
end
|
@@ -15,6 +15,7 @@ RSpec::Steps.steps "updating scopes", js: true do
|
|
15
15
|
stub_const 'TestApplication', Class.new
|
16
16
|
stub_const 'TestApplicationPolicy', Class.new
|
17
17
|
TestApplicationPolicy.class_eval do
|
18
|
+
always_allow_connection
|
18
19
|
regulate_all_broadcasts { |policy| policy.send_all }
|
19
20
|
allow_change(to: :all, on: [:create, :update, :destroy]) { true }
|
20
21
|
end
|
@@ -3,12 +3,6 @@ require 'synchromesh/integration/test_components'
|
|
3
3
|
|
4
4
|
describe "regulate access allowed" do
|
5
5
|
|
6
|
-
before(:all) do
|
7
|
-
HyperMesh.configuration do |config|
|
8
|
-
config.transport = :none
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
6
|
context "basic tests" do
|
13
7
|
before(:each) do
|
14
8
|
# spec_helper resets the policy system after each test so we have to setup
|
@@ -3,11 +3,6 @@ require 'synchromesh/integration/test_components'
|
|
3
3
|
|
4
4
|
describe "regulate access allowed" do
|
5
5
|
|
6
|
-
before(:all) do
|
7
|
-
HyperMesh.configuration do |config|
|
8
|
-
config.transport = :none
|
9
|
-
end
|
10
|
-
end
|
11
6
|
|
12
7
|
before(:each) do
|
13
8
|
stub_const 'DummyModel', Class.new(ActiveRecord::Base)
|
@@ -17,7 +12,14 @@ describe "regulate access allowed" do
|
|
17
12
|
end
|
18
13
|
|
19
14
|
after(:each) do
|
20
|
-
|
15
|
+
class ActiveRecord::Base
|
16
|
+
def view_permitted?(attribute)
|
17
|
+
HyperMesh::InternalPolicy.accessible_attributes_for(self, acting_user).include? attribute.to_sym
|
18
|
+
end
|
19
|
+
[:create, :update, :destroy].each do |access|
|
20
|
+
define_method("#{access}_permitted?".to_sym) { false }
|
21
|
+
end
|
22
|
+
end
|
21
23
|
end
|
22
24
|
|
23
25
|
HyperMesh::InternalClassPolicy::CHANGE_POLICIES.each do |policy|
|
@@ -158,10 +158,6 @@ RSpec::Steps.steps "has_many through relationships", js: true do
|
|
158
158
|
end
|
159
159
|
|
160
160
|
it "can destroy an existing relationship from the server" do
|
161
|
-
evaluate_ruby do
|
162
|
-
PhysicianSchedule.hypertrace instrument: :all
|
163
|
-
ReactiveRecord::Base.hypertrace instrument: :all
|
164
|
-
end
|
165
161
|
@a1.destroy
|
166
162
|
page.should have_content("Dr. Stop has a total of 1 appointments with: B. Legg")
|
167
163
|
page.should have_content("Dr. Faith has no appointments.")
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'hyper-mesh'
|
2
2
|
|
3
3
|
Rails.application.routes.draw do
|
4
|
-
mount
|
4
|
+
mount HyperMesh::Engine => "/rr"
|
5
5
|
# The priority is based upon order of creation: first created -> highest priority.
|
6
6
|
# See how all your routes lay out with "rake routes".
|
7
7
|
|
Binary file
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hyper-mesh
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mitch VanDuyn
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-11-
|
11
|
+
date: 2016-11-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -600,6 +600,8 @@ files:
|
|
600
600
|
- docs/action_cable_quickstart.md
|
601
601
|
- docs/authorization-policies.md
|
602
602
|
- docs/client_side_scoping.md
|
603
|
+
- docs/configuration_details.md
|
604
|
+
- docs/pusher_faker_quickstart.md
|
603
605
|
- docs/pusher_quickstart.md
|
604
606
|
- docs/simple_poller_quickstart.md
|
605
607
|
- docs/todo-example.md
|
@@ -794,11 +796,11 @@ files:
|
|
794
796
|
- examples/words/config/initializers/backtrace_silencers.rb
|
795
797
|
- examples/words/config/initializers/cookies_serializer.rb
|
796
798
|
- examples/words/config/initializers/filter_parameter_logging.rb
|
799
|
+
- examples/words/config/initializers/hyper_mesh.rb
|
797
800
|
- examples/words/config/initializers/inflections.rb
|
798
801
|
- examples/words/config/initializers/mime_types.rb
|
799
802
|
- examples/words/config/initializers/new_framework_defaults.rb
|
800
803
|
- examples/words/config/initializers/session_store.rb
|
801
|
-
- examples/words/config/initializers/synchromesh.rb
|
802
804
|
- examples/words/config/initializers/wrap_parameters.rb
|
803
805
|
- examples/words/config/locales/en.yml
|
804
806
|
- examples/words/config/puma.rb
|
@@ -818,6 +820,7 @@ files:
|
|
818
820
|
- examples/words/tmp/.keep
|
819
821
|
- examples/words/vendor/assets/javascripts/.keep
|
820
822
|
- examples/words/vendor/assets/stylesheets/.keep
|
823
|
+
- hyper-mesh-0.4.0.gem
|
821
824
|
- hyper-mesh.gemspec
|
822
825
|
- lib/active_record_base.rb
|
823
826
|
- lib/enumerable/pluck.rb
|
@@ -857,7 +860,6 @@ files:
|
|
857
860
|
- lib/synchromesh/configuration.rb
|
858
861
|
- lib/synchromesh/connection.rb
|
859
862
|
- lib/synchromesh/policy.rb
|
860
|
-
- lib/synchromesh/reactive_record/permission_patches.rb
|
861
863
|
- lib/synchromesh/synchromesh.rb
|
862
864
|
- lib/synchromesh/synchromesh_controller.rb
|
863
865
|
- logo.jpg
|
@@ -901,6 +903,7 @@ files:
|
|
901
903
|
- reactive_record_test_app/config/environments/production.rb
|
902
904
|
- reactive_record_test_app/config/environments/test.rb
|
903
905
|
- reactive_record_test_app/config/initializers/backtrace_silencers.rb
|
906
|
+
- reactive_record_test_app/config/initializers/hyper_mesh_legacy_behavior.rb
|
904
907
|
- reactive_record_test_app/config/initializers/inflections.rb
|
905
908
|
- reactive_record_test_app/config/initializers/mime_types.rb
|
906
909
|
- reactive_record_test_app/config/initializers/secret_token.rb
|
@@ -1049,6 +1052,7 @@ files:
|
|
1049
1052
|
- spec/test_app/public/favicon.ico
|
1050
1053
|
- spec/vendor/es5-shim.min.js
|
1051
1054
|
- terminal.md
|
1055
|
+
- work-in-progress-drinking.png
|
1052
1056
|
homepage: https://github.com/reactive-ruby/hyper-mesh
|
1053
1057
|
licenses:
|
1054
1058
|
- MIT
|