futurism 0.6.0 → 0.7.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/lib/futurism.rb +2 -0
- data/lib/futurism/channel.rb +8 -42
- data/lib/futurism/channel.rb~ +8 -42
- data/lib/futurism/helpers.rb~ +14 -6
- data/lib/futurism/message_verifier.rb +3 -1
- data/lib/futurism/resolver/controller.rb +21 -0
- data/lib/futurism/resolver/controller/renderer.rb +57 -0
- data/lib/futurism/resolver/controller/renderer.rb~ +57 -0
- data/lib/futurism/version.rb +1 -1
- metadata +5 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b49e6ebab4db767a2f7aaa4fbc6500ed4103787ea3abefc0489ef6a1536c4fec
|
4
|
+
data.tar.gz: 066ab614d937281fe22e5a6d17b8873370c29649815be1b966e2bc22e7cf4ed0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 638f1eb1bb3fb7304024282419ae2f3baa92a8e9cafe60d31ece08ba837925279005ce905b4acec2c68a6673f430b6b29fec8f4ee9fee5232539c2ea827f54ba
|
7
|
+
data.tar.gz: 5d9a0f5d66ee06ea62b6875b4cf19bab6a22c0b0f272ddacfbe2ad0f5d8f06b4a288c32a6863f5d9c4e65de4b9df3799343fff5a5086a06597e9b23a66c9ab53
|
data/lib/futurism.rb
CHANGED
data/lib/futurism/channel.rb
CHANGED
@@ -16,18 +16,20 @@ module Futurism
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def receive(data)
|
19
|
-
resources = data.fetch_values("signed_params", "sgids", "signed_controllers") { |_key| Array.new(data["signed_params"].length, nil) }.transpose
|
19
|
+
resources = data.fetch_values("signed_params", "sgids", "signed_controllers", "urls") { |_key| Array.new(data["signed_params"].length, nil) }.transpose
|
20
20
|
|
21
|
-
resources.each do |signed_params, sgid, signed_controller|
|
21
|
+
resources.each do |signed_params, sgid, signed_controller, url|
|
22
22
|
selector = "[data-signed-params='#{signed_params}']"
|
23
23
|
selector << "[data-sgid='#{sgid}']" if sgid.present?
|
24
24
|
|
25
|
-
|
26
|
-
|
27
|
-
|
25
|
+
controller = Resolver::Controller.from(signed_string: signed_controller)
|
26
|
+
renderer = Resolver::Controller::Renderer.for(controller: controller,
|
27
|
+
connection: connection,
|
28
|
+
url: url,
|
29
|
+
params: @params)
|
28
30
|
|
29
31
|
resource = lookup_resource(signed_params: signed_params, sgid: sgid)
|
30
|
-
html =
|
32
|
+
html = renderer.render(resource)
|
31
33
|
|
32
34
|
cable_ready[stream_name].outer_html(
|
33
35
|
selector: selector,
|
@@ -47,41 +49,5 @@ module Futurism
|
|
47
49
|
.verify(signed_params)
|
48
50
|
.deep_transform_values { |value| value.is_a?(String) && value.start_with?("gid://") ? GlobalID::Locator.locate(value) : value }
|
49
51
|
end
|
50
|
-
|
51
|
-
class ControllerLookup
|
52
|
-
include Futurism::MessageVerifier
|
53
|
-
|
54
|
-
def self.from(signed_string:)
|
55
|
-
new(signed_string)
|
56
|
-
end
|
57
|
-
|
58
|
-
def initialize(signed_string)
|
59
|
-
@signed_string = signed_string
|
60
|
-
end
|
61
|
-
|
62
|
-
def controller
|
63
|
-
if signed_string.present?
|
64
|
-
message_verifier
|
65
|
-
.verify(signed_string)
|
66
|
-
.to_s
|
67
|
-
.safe_constantize
|
68
|
-
else
|
69
|
-
default_controller
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
def setup_env!(connection:)
|
74
|
-
new_env = connection.env.merge(controller.renderer.instance_variable_get(:@env))
|
75
|
-
controller.renderer.instance_variable_set(:@env, new_env)
|
76
|
-
end
|
77
|
-
|
78
|
-
private
|
79
|
-
|
80
|
-
attr_reader :signed_string
|
81
|
-
|
82
|
-
def default_controller
|
83
|
-
Futurism.default_controller || ::ApplicationController
|
84
|
-
end
|
85
|
-
end
|
86
52
|
end
|
87
53
|
end
|
data/lib/futurism/channel.rb~
CHANGED
@@ -16,18 +16,20 @@ module Futurism
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def receive(data)
|
19
|
-
resources = data.fetch_values("signed_params", "sgids", "signed_controllers") { |_key| Array.new(data["signed_params"].length, nil) }.transpose
|
19
|
+
resources = data.fetch_values("signed_params", "sgids", "signed_controllers", "urls") { |_key| Array.new(data["signed_params"].length, nil) }.transpose
|
20
20
|
|
21
|
-
resources.each do |signed_params, sgid, signed_controller|
|
21
|
+
resources.each do |signed_params, sgid, signed_controller, url|
|
22
22
|
selector = "[data-signed-params='#{signed_params}']"
|
23
23
|
selector << "[data-sgid='#{sgid}']" if sgid.present?
|
24
24
|
|
25
|
-
|
26
|
-
|
27
|
-
|
25
|
+
controller = Resolver::Controller.from(signed_string: signed_controller)
|
26
|
+
renderer = Resolver::Controller::Renderer.for(controller: controller,
|
27
|
+
connection: connection,
|
28
|
+
url: url,
|
29
|
+
params: @params)
|
28
30
|
|
29
31
|
resource = lookup_resource(signed_params: signed_params, sgid: sgid)
|
30
|
-
html =
|
32
|
+
html = renderer.render(resource)
|
31
33
|
|
32
34
|
cable_ready[stream_name].outer_html(
|
33
35
|
selector: selector,
|
@@ -47,41 +49,5 @@ module Futurism
|
|
47
49
|
.verify(signed_params)
|
48
50
|
.deep_transform_values { |value| value.is_a?(String) && value.start_with?("gid://") ? GlobalID::Locator.locate(value) : value }
|
49
51
|
end
|
50
|
-
|
51
|
-
class ControllerLookup
|
52
|
-
include Futurism::MessageVerifier
|
53
|
-
|
54
|
-
def self.from(signed_string:)
|
55
|
-
new(signed_string)
|
56
|
-
end
|
57
|
-
|
58
|
-
def initialize(signed_string)
|
59
|
-
@signed_string = signed_string
|
60
|
-
end
|
61
|
-
|
62
|
-
def controller
|
63
|
-
if signed_string.present?
|
64
|
-
message_verifier
|
65
|
-
.verify(signed_string)
|
66
|
-
.to_s
|
67
|
-
.safe_constantize
|
68
|
-
else
|
69
|
-
default_controller
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
def setup(connection:)
|
74
|
-
new_env = connection.env.merge(controller.renderer.instance_variable_get(:@env))
|
75
|
-
controller.renderer.instance_variable_set(:@env, new_env)
|
76
|
-
end
|
77
|
-
|
78
|
-
private
|
79
|
-
|
80
|
-
attr_reader :signed_string
|
81
|
-
|
82
|
-
def default_controller
|
83
|
-
Futurism.default_controller || ::ApplicationController
|
84
|
-
end
|
85
|
-
end
|
86
52
|
end
|
87
53
|
end
|
data/lib/futurism/helpers.rb~
CHANGED
@@ -3,11 +3,10 @@ module Futurism
|
|
3
3
|
def futurize(records_or_string = nil, extends:, **options, &block)
|
4
4
|
if Rails.env.test? && Futurism.skip_in_test
|
5
5
|
if records_or_string.nil?
|
6
|
-
render
|
6
|
+
return render(**options)
|
7
7
|
else
|
8
|
-
render
|
8
|
+
return render(records_or_string, **options)
|
9
9
|
end
|
10
|
-
return
|
11
10
|
end
|
12
11
|
|
13
12
|
placeholder = capture(&block)
|
@@ -44,13 +43,15 @@ module Futurism
|
|
44
43
|
# wraps functionality for rendering a futurism element
|
45
44
|
class Element
|
46
45
|
include ActionView::Helpers
|
46
|
+
include Futurism::MessageVerifier
|
47
47
|
|
48
|
-
attr_reader :extends, :placeholder, :html_options, :data_attributes, :model, :options, :eager
|
48
|
+
attr_reader :extends, :placeholder, :html_options, :data_attributes, :model, :options, :eager, :controller
|
49
49
|
|
50
50
|
def initialize(extends:, placeholder:, options:)
|
51
51
|
@extends = extends
|
52
52
|
@placeholder = placeholder
|
53
53
|
@eager = options.delete(:eager)
|
54
|
+
@controller = options.delete(:controller)
|
54
55
|
@html_options = options.delete(:html_options) || {}
|
55
56
|
@data_attributes = html_options.fetch(:data, {}).except(:sgid, :signed_params)
|
56
57
|
@model = options.delete(:model)
|
@@ -61,7 +62,8 @@ module Futurism
|
|
61
62
|
data_attributes.merge({
|
62
63
|
signed_params: signed_params,
|
63
64
|
sgid: model && model.to_sgid.to_s,
|
64
|
-
eager: eager.presence
|
65
|
+
eager: eager.presence,
|
66
|
+
signed_controller: signed_controller
|
65
67
|
})
|
66
68
|
end
|
67
69
|
|
@@ -87,7 +89,13 @@ module Futurism
|
|
87
89
|
private
|
88
90
|
|
89
91
|
def signed_params
|
90
|
-
|
92
|
+
message_verifier.generate(transformed_options)
|
93
|
+
end
|
94
|
+
|
95
|
+
def signed_controller
|
96
|
+
return unless controller.present?
|
97
|
+
|
98
|
+
message_verifier.generate(controller.to_s)
|
91
99
|
end
|
92
100
|
end
|
93
101
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Futurism
|
2
|
+
module Resolver
|
3
|
+
class Controller
|
4
|
+
def self.from(signed_string:)
|
5
|
+
if signed_string.present?
|
6
|
+
Futurism::MessageVerifier
|
7
|
+
.message_verifier
|
8
|
+
.verify(signed_string)
|
9
|
+
.to_s
|
10
|
+
.safe_constantize
|
11
|
+
else
|
12
|
+
default_controller
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.default_controller
|
17
|
+
Futurism.default_controller || ::ApplicationController
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
module Futurism
|
2
|
+
module Resolver
|
3
|
+
class Controller
|
4
|
+
class Renderer
|
5
|
+
def self.for(controller:, connection:, url:, params:)
|
6
|
+
new(controller: controller, connection: connection, url: url, params: params).renderer
|
7
|
+
end
|
8
|
+
|
9
|
+
def initialize(controller:, connection:, url:, params:)
|
10
|
+
@controller = controller
|
11
|
+
@connection = connection
|
12
|
+
@url = url || ""
|
13
|
+
@params = params || {}
|
14
|
+
|
15
|
+
setup_env!
|
16
|
+
end
|
17
|
+
|
18
|
+
def renderer
|
19
|
+
@renderer ||= controller.renderer
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
attr_reader :controller, :connection, :url, :params
|
25
|
+
attr_writer :renderer
|
26
|
+
|
27
|
+
def setup_env!
|
28
|
+
if url.present?
|
29
|
+
uri = URI.parse(url)
|
30
|
+
path = ActionDispatch::Journey::Router::Utils.normalize_path(uri.path)
|
31
|
+
query_hash = Rack::Utils.parse_nested_query(uri.query)
|
32
|
+
|
33
|
+
path_params = Rails.application.routes.recognize_path(path)
|
34
|
+
|
35
|
+
self.renderer =
|
36
|
+
renderer.new(
|
37
|
+
"rack.request.query_hash" => query_hash,
|
38
|
+
"rack.request.query_string" => uri.query,
|
39
|
+
"ORIGINAL_SCRIPT_NAME" => "",
|
40
|
+
"ORIGINAL_FULLPATH" => path,
|
41
|
+
Rack::SCRIPT_NAME => "",
|
42
|
+
Rack::PATH_INFO => path,
|
43
|
+
Rack::REQUEST_PATH => path,
|
44
|
+
Rack::QUERY_STRING => uri.query,
|
45
|
+
ActionDispatch::Http::Parameters::PARAMETERS_KEY => params.symbolize_keys.merge(path_params).merge(query_hash)
|
46
|
+
)
|
47
|
+
end
|
48
|
+
|
49
|
+
# Copy connection env to renderer to fix some RACK related issues from gems like
|
50
|
+
# Warden or Devise
|
51
|
+
new_env = connection.env.merge(renderer.instance_variable_get(:@env))
|
52
|
+
renderer.instance_variable_set(:@env, new_env)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
module Futurism
|
2
|
+
module Resolver
|
3
|
+
class Controller
|
4
|
+
class Renderer
|
5
|
+
def self.for(controller:, connection:, url:, params:)
|
6
|
+
new(controller: controller, connection: connection, url: url, params: params).renderer
|
7
|
+
end
|
8
|
+
|
9
|
+
def initialize(controller:, connection:, url:, params:)
|
10
|
+
@controller = controller
|
11
|
+
@connection = connection
|
12
|
+
@url = url || ""
|
13
|
+
@params = params || {}
|
14
|
+
|
15
|
+
setup_env!
|
16
|
+
end
|
17
|
+
|
18
|
+
def renderer
|
19
|
+
@renderer ||= controller.renderer
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
attr_reader :controller, :connection, :url, :params
|
25
|
+
attr_writer :renderer
|
26
|
+
|
27
|
+
def setup_env!
|
28
|
+
if url.present?
|
29
|
+
uri = URI.parse(url)
|
30
|
+
path = ActionDispatch::Journey::Router::Utils.normalize_path(uri.path)
|
31
|
+
query_hash = Rack::Utils.parse_nested_query(uri.query)
|
32
|
+
|
33
|
+
path_params = Rails.application.routes.recognize_path(path)
|
34
|
+
|
35
|
+
self.renderer =
|
36
|
+
renderer.new(
|
37
|
+
"rack.request.query_hash" => query_hash,
|
38
|
+
"rack.request.query_string" => uri.query,
|
39
|
+
"ORIGINAL_SCRIPT_NAME" => "",
|
40
|
+
"ORIGINAL_FULLPATH" => path,
|
41
|
+
Rack::SCRIPT_NAME => "",
|
42
|
+
Rack::PATH_INFO => path,
|
43
|
+
Rack::REQUEST_PATH => path,
|
44
|
+
Rack::QUERY_STRING => uri.query,
|
45
|
+
ActionDispatch::Http::Parameters::PARAMETERS_KEY => path_params.reverse_merge(path_params)
|
46
|
+
)
|
47
|
+
end
|
48
|
+
|
49
|
+
# Copy connection env to renderer to fix some RACK related issues from gems like
|
50
|
+
# Warden or Devise
|
51
|
+
new_env = connection.env.merge(renderer.instance_variable_get(:@env))
|
52
|
+
renderer.instance_variable_set(:@env, new_env)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
data/lib/futurism/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: futurism
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Julian Rubisch
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-11-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: appraisal
|
@@ -108,20 +108,6 @@ dependencies:
|
|
108
108
|
- - ">="
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0'
|
111
|
-
- !ruby/object:Gem::Dependency
|
112
|
-
name: spy
|
113
|
-
requirement: !ruby/object:Gem::Requirement
|
114
|
-
requirements:
|
115
|
-
- - ">="
|
116
|
-
- !ruby/object:Gem::Version
|
117
|
-
version: '0'
|
118
|
-
type: :development
|
119
|
-
prerelease: false
|
120
|
-
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
requirements:
|
122
|
-
- - ">="
|
123
|
-
- !ruby/object:Gem::Version
|
124
|
-
version: '0'
|
125
111
|
- !ruby/object:Gem::Dependency
|
126
112
|
name: rack
|
127
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -184,6 +170,9 @@ files:
|
|
184
170
|
- lib/futurism/helpers.rb
|
185
171
|
- lib/futurism/helpers.rb~
|
186
172
|
- lib/futurism/message_verifier.rb
|
173
|
+
- lib/futurism/resolver/controller.rb
|
174
|
+
- lib/futurism/resolver/controller/renderer.rb
|
175
|
+
- lib/futurism/resolver/controller/renderer.rb~
|
187
176
|
- lib/futurism/shims/deep_transform_values.rb
|
188
177
|
- lib/futurism/version.rb
|
189
178
|
- lib/tasks/futurism_tasks.rake
|