stimulus_reflex 3.4.2 → 3.5.0.pre0
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.
Potentially problematic release.
This version of stimulus_reflex might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.md +587 -495
- data/Gemfile.lock +120 -172
- data/LATEST +1 -0
- data/README.md +10 -10
- data/app/channels/stimulus_reflex/channel.rb +40 -62
- data/lib/generators/USAGE +1 -1
- data/lib/generators/stimulus_reflex/{config_generator.rb → initializer_generator.rb} +3 -3
- data/lib/generators/stimulus_reflex/templates/app/reflexes/%file_name%_reflex.rb.tt +3 -2
- data/lib/generators/stimulus_reflex/templates/app/reflexes/application_reflex.rb.tt +1 -1
- data/lib/generators/stimulus_reflex/templates/config/initializers/stimulus_reflex.rb +6 -1
- data/lib/stimulus_reflex/broadcasters/broadcaster.rb +7 -4
- data/lib/stimulus_reflex/broadcasters/page_broadcaster.rb +2 -2
- data/lib/stimulus_reflex/broadcasters/selector_broadcaster.rb +12 -5
- data/lib/stimulus_reflex/cable_ready_channels.rb +6 -2
- data/lib/stimulus_reflex/callbacks.rb +55 -5
- data/lib/stimulus_reflex/concern_enhancer.rb +37 -0
- data/lib/stimulus_reflex/configuration.rb +2 -1
- data/lib/stimulus_reflex/element.rb +31 -7
- data/lib/stimulus_reflex/policies/reflex_invocation_policy.rb +28 -0
- data/lib/stimulus_reflex/reflex.rb +35 -20
- data/lib/stimulus_reflex/reflex_data.rb +79 -0
- data/lib/stimulus_reflex/reflex_factory.rb +23 -54
- data/lib/stimulus_reflex/request_parameters.rb +19 -0
- data/lib/stimulus_reflex/{logger.rb → utils/logger.rb} +0 -2
- data/lib/stimulus_reflex/{sanity_checker.rb → utils/sanity_checker.rb} +58 -10
- data/lib/stimulus_reflex/version.rb +1 -1
- data/lib/stimulus_reflex.rb +8 -2
- data/lib/tasks/stimulus_reflex/install.rake +6 -4
- data/package.json +6 -5
- data/stimulus_reflex.gemspec +5 -5
- data/test/broadcasters/broadcaster_test_case.rb +1 -1
- data/test/broadcasters/nothing_broadcaster_test.rb +5 -3
- data/test/broadcasters/page_broadcaster_test.rb +8 -4
- data/test/broadcasters/selector_broadcaster_test.rb +171 -55
- data/test/callbacks_test.rb +652 -0
- data/test/concern_enhancer_test.rb +54 -0
- data/test/element_test.rb +181 -0
- data/test/reflex_test.rb +1 -1
- data/test/test_helper.rb +4 -34
- data/test/tmp/app/reflexes/application_reflex.rb +12 -0
- data/test/tmp/app/reflexes/user_reflex.rb +44 -0
- data/yarn.lock +1138 -919
- metadata +36 -23
- data/test/reflex_factory_test.rb +0 -79
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
class StimulusReflex::SanityChecker
|
4
|
+
LATEST_VERSION_FORMAT = /^(\d+\.\d+\.\d+)$/
|
4
5
|
NODE_VERSION_FORMAT = /(\d+\.\d+\.\d+.*):/
|
5
6
|
JSON_VERSION_FORMAT = /(\d+\.\d+\.\d+.*)"/
|
6
7
|
|
@@ -13,6 +14,8 @@ class StimulusReflex::SanityChecker
|
|
13
14
|
instance = new
|
14
15
|
instance.check_caching_enabled
|
15
16
|
instance.check_javascript_package_version
|
17
|
+
instance.check_default_url_config
|
18
|
+
instance.check_new_version_available
|
16
19
|
end
|
17
20
|
|
18
21
|
private
|
@@ -24,44 +27,80 @@ class StimulusReflex::SanityChecker
|
|
24
27
|
end
|
25
28
|
|
26
29
|
def called_by_generate_config?
|
27
|
-
ARGV.include? "stimulus_reflex:
|
30
|
+
ARGV.include? "stimulus_reflex:initializer"
|
28
31
|
end
|
29
32
|
end
|
30
33
|
|
31
34
|
def check_caching_enabled
|
32
35
|
unless caching_enabled?
|
33
36
|
warn_and_exit <<~WARN
|
34
|
-
|
37
|
+
StimulusReflex requires caching to be enabled. Caching allows the session to be modified during ActionCable requests.
|
35
38
|
To enable caching in development, run:
|
36
|
-
|
39
|
+
rails dev:cache
|
37
40
|
WARN
|
38
41
|
end
|
39
42
|
|
40
43
|
unless not_null_store?
|
41
44
|
warn_and_exit <<~WARN
|
42
|
-
|
45
|
+
StimulusReflex requires caching to be enabled. Caching allows the session to be modified during ActionCable requests.
|
43
46
|
But your config.cache_store is set to :null_store, so it won't work.
|
44
47
|
WARN
|
45
48
|
end
|
46
49
|
end
|
47
50
|
|
51
|
+
def check_default_url_config
|
52
|
+
unless default_url_config_set?
|
53
|
+
warn_and_exit <<~WARN
|
54
|
+
StimulusReflex strongly suggests that you set default_url_options in your environment files.
|
55
|
+
Otherwise, ActionController and ActionMailer will default to example.com when rendering route helpers.
|
56
|
+
You can set your URL options in config/environments/#{Rails.env}.rb
|
57
|
+
config.action_controller.default_url_options = {host: "localhost", port: 3000}
|
58
|
+
config.action_mailer.default_url_options = {host: "localhost", port: 3000}
|
59
|
+
Please update every environment with the appropriate URL. Typically, no port is necessary in production.
|
60
|
+
WARN
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
48
64
|
def check_javascript_package_version
|
49
65
|
if javascript_package_version.nil?
|
50
66
|
warn_and_exit <<~WARN
|
51
|
-
Can't locate the stimulus_reflex
|
67
|
+
Can't locate the stimulus_reflex npm package.
|
52
68
|
Either add it to your package.json as a dependency or use "yarn link stimulus_reflex" if you are doing development.
|
53
69
|
WARN
|
54
70
|
end
|
55
71
|
|
56
72
|
unless javascript_version_matches?
|
57
73
|
warn_and_exit <<~WARN
|
58
|
-
The
|
59
|
-
To update the
|
60
|
-
|
74
|
+
The stimulus_reflex npm package version (#{javascript_package_version}) does not match the Rubygem version (#{gem_version}).
|
75
|
+
To update the stimulus_reflex npm package:
|
76
|
+
yarn upgrade stimulus_reflex@#{gem_version}
|
61
77
|
WARN
|
62
78
|
end
|
63
79
|
end
|
64
80
|
|
81
|
+
def check_new_version_available
|
82
|
+
return unless Rails.env.development?
|
83
|
+
return if StimulusReflex.config.on_new_version_available == :ignore
|
84
|
+
return unless using_stable_release
|
85
|
+
begin
|
86
|
+
latest_version = URI.open("https://raw.githubusercontent.com/stimulusreflex/stimulus_reflex/master/LATEST", open_timeout: 1, read_timeout: 1).read.strip
|
87
|
+
if latest_version != StimulusReflex::VERSION
|
88
|
+
puts <<~WARN
|
89
|
+
|
90
|
+
There is a new version of StimulusReflex available!
|
91
|
+
Current: #{StimulusReflex::VERSION} Latest: #{latest_version}
|
92
|
+
|
93
|
+
If you upgrade, it is very important that you update BOTH Gemfile and package.json
|
94
|
+
Then, run `bundle install && yarn install` to update to #{latest_version}.
|
95
|
+
|
96
|
+
WARN
|
97
|
+
exit if StimulusReflex.config.on_new_version_available == :exit
|
98
|
+
end
|
99
|
+
rescue
|
100
|
+
puts "StimulusReflex #{StimulusReflex::VERSION} update check skipped: connection timeout"
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
65
104
|
private
|
66
105
|
|
67
106
|
def caching_enabled?
|
@@ -72,10 +111,20 @@ class StimulusReflex::SanityChecker
|
|
72
111
|
Rails.application.config.cache_store != :null_store
|
73
112
|
end
|
74
113
|
|
114
|
+
def default_url_config_set?
|
115
|
+
Rails.application.config.action_controller.default_url_options
|
116
|
+
end
|
117
|
+
|
75
118
|
def javascript_version_matches?
|
76
119
|
javascript_package_version == gem_version
|
77
120
|
end
|
78
121
|
|
122
|
+
def using_stable_release
|
123
|
+
stable = StimulusReflex::VERSION.match?(LATEST_VERSION_FORMAT)
|
124
|
+
puts "StimulusReflex #{StimulusReflex::VERSION} update check skipped: pre-release build" unless stable
|
125
|
+
stable
|
126
|
+
end
|
127
|
+
|
79
128
|
def gem_version
|
80
129
|
@_gem_version ||= StimulusReflex::VERSION.gsub(".pre", "-pre")
|
81
130
|
end
|
@@ -118,7 +167,6 @@ class StimulusReflex::SanityChecker
|
|
118
167
|
def exit_with_info
|
119
168
|
puts
|
120
169
|
|
121
|
-
# bundle exec rails generate stimulus_reflex:config
|
122
170
|
if File.exist?(initializer_path)
|
123
171
|
puts <<~INFO
|
124
172
|
If you know what you are doing and you want to start the application anyway,
|
@@ -139,7 +187,7 @@ class StimulusReflex::SanityChecker
|
|
139
187
|
|
140
188
|
Then open your initializer at
|
141
189
|
|
142
|
-
|
190
|
+
#{initializer_path}
|
143
191
|
|
144
192
|
and then add the following directive:
|
145
193
|
|
data/lib/stimulus_reflex.rb
CHANGED
@@ -1,27 +1,33 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "uri"
|
4
|
+
require "open-uri"
|
4
5
|
require "rack"
|
5
6
|
require "rails/engine"
|
6
7
|
require "active_support/all"
|
7
8
|
require "action_dispatch"
|
8
9
|
require "action_cable"
|
10
|
+
require "action_view"
|
9
11
|
require "nokogiri"
|
10
12
|
require "cable_ready"
|
11
13
|
require "stimulus_reflex/version"
|
12
14
|
require "stimulus_reflex/cable_ready_channels"
|
15
|
+
require "stimulus_reflex/concern_enhancer"
|
13
16
|
require "stimulus_reflex/configuration"
|
14
17
|
require "stimulus_reflex/callbacks"
|
18
|
+
require "stimulus_reflex/request_parameters"
|
15
19
|
require "stimulus_reflex/reflex"
|
20
|
+
require "stimulus_reflex/reflex_data"
|
16
21
|
require "stimulus_reflex/reflex_factory"
|
17
22
|
require "stimulus_reflex/element"
|
18
|
-
require "stimulus_reflex/sanity_checker"
|
19
23
|
require "stimulus_reflex/broadcasters/broadcaster"
|
20
24
|
require "stimulus_reflex/broadcasters/nothing_broadcaster"
|
21
25
|
require "stimulus_reflex/broadcasters/page_broadcaster"
|
22
26
|
require "stimulus_reflex/broadcasters/selector_broadcaster"
|
27
|
+
require "stimulus_reflex/policies/reflex_invocation_policy"
|
23
28
|
require "stimulus_reflex/utils/colorize"
|
24
|
-
require "stimulus_reflex/logger"
|
29
|
+
require "stimulus_reflex/utils/logger"
|
30
|
+
require "stimulus_reflex/utils/sanity_checker"
|
25
31
|
|
26
32
|
module StimulusReflex
|
27
33
|
class Engine < Rails::Engine
|
@@ -44,14 +44,16 @@ namespace :stimulus_reflex do
|
|
44
44
|
end
|
45
45
|
|
46
46
|
initialize_line = lines.find { |line| line.start_with?("StimulusReflex.initialize") }
|
47
|
-
lines << "
|
47
|
+
lines << "application.consumer = consumer\n"
|
48
|
+
lines << "StimulusReflex.initialize(application, { controller, isolate: true })\n" unless initialize_line
|
48
49
|
lines << "StimulusReflex.debug = process.env.RAILS_ENV === 'development'\n" unless initialize_line
|
49
50
|
File.open(filepath, "w") { |f| f.write lines.join }
|
50
51
|
|
51
52
|
filepath = Rails.root.join("config/environments/development.rb")
|
52
53
|
lines = File.open(filepath, "r") { |f| f.readlines }
|
53
54
|
unless lines.find { |line| line.include?("config.session_store") }
|
54
|
-
lines.
|
55
|
+
matches = lines.select { |line| line =~ /\A(Rails.application.configure do)/ }
|
56
|
+
lines.insert lines.index(matches.last).to_i + 1, " config.session_store :cache_store\n\n"
|
55
57
|
File.open(filepath, "w") { |f| f.write lines.join }
|
56
58
|
end
|
57
59
|
|
@@ -61,7 +63,7 @@ namespace :stimulus_reflex do
|
|
61
63
|
lines.delete_at 1
|
62
64
|
lines.insert 1, " adapter: redis\n"
|
63
65
|
lines.insert 2, " url: <%= ENV.fetch(\"REDIS_URL\") { \"redis://localhost:6379/1\" } %>\n"
|
64
|
-
lines.insert 3, " channel_prefix: " + File.basename(Rails.root.to_s).underscore + "_development\n"
|
66
|
+
lines.insert 3, " channel_prefix: " + File.basename(Rails.root.to_s).tr("\\", "").tr("-. ", "_").underscore + "_development\n"
|
65
67
|
File.open(filepath, "w") { |f| f.write lines.join }
|
66
68
|
end
|
67
69
|
|
@@ -71,7 +73,7 @@ namespace :stimulus_reflex do
|
|
71
73
|
|
72
74
|
puts
|
73
75
|
puts "StimulusReflex and CableReady have been successfully installed!"
|
74
|
-
puts "Go to https://docs.stimulusreflex.com/quickstart if you need help getting started."
|
76
|
+
puts "Go to https://docs.stimulusreflex.com/hello-world/quickstart if you need help getting started."
|
75
77
|
puts
|
76
78
|
end
|
77
79
|
end
|
data/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "stimulus_reflex",
|
3
|
-
"version": "3.4.
|
3
|
+
"version": "3.4.1",
|
4
4
|
"description": "Build reactive applications with the Rails tooling you already know and love.",
|
5
5
|
"keywords": [
|
6
6
|
"ruby",
|
@@ -20,11 +20,11 @@
|
|
20
20
|
],
|
21
21
|
"homepage": "https://docs.stimulusreflex.com/",
|
22
22
|
"bugs": {
|
23
|
-
"url": "https://github.com/
|
23
|
+
"url": "https://github.com/stimulusreflex/stimulus_reflex/issues"
|
24
24
|
},
|
25
25
|
"repository": {
|
26
26
|
"type": "git",
|
27
|
-
"url": "git+https://github.com:
|
27
|
+
"url": "git+https://github.com:stimulusreflex/stimulus_reflex.git"
|
28
28
|
},
|
29
29
|
"license": "MIT",
|
30
30
|
"author": "Nathan Hopkins <natehop@gmail.com>",
|
@@ -34,14 +34,14 @@
|
|
34
34
|
"postinstall": "node ./javascript/scripts/post_install.js",
|
35
35
|
"prettier-standard:check": "yarn run prettier-standard --check ./javascript/*.js ./javascript/**/*.js",
|
36
36
|
"prettier-standard:format": "yarn run prettier-standard ./javascript/*.js ./javascript/**/*.js",
|
37
|
-
"test": "yarn run mocha --require @babel/register --require esm ./javascript/test"
|
37
|
+
"test": "yarn run mocha --require @babel/register --require jsdom-global/register --require esm ./javascript/test"
|
38
38
|
},
|
39
39
|
"peerDependencies": {
|
40
40
|
"stimulus": ">= 1.1"
|
41
41
|
},
|
42
42
|
"dependencies": {
|
43
43
|
"@rails/actioncable": ">= 6.0",
|
44
|
-
"cable_ready": "
|
44
|
+
"cable_ready": "5.0.0-pre0"
|
45
45
|
},
|
46
46
|
"devDependencies": {
|
47
47
|
"@babel/core": "^7.6.2",
|
@@ -50,6 +50,7 @@
|
|
50
50
|
"assert": "^2.0.0",
|
51
51
|
"esm": "^3.2.25",
|
52
52
|
"jsdom": "^16.0.1",
|
53
|
+
"jsdom-global": "^3.0.2",
|
53
54
|
"mocha": "^8.0.1",
|
54
55
|
"prettier-standard": "^16.1.0",
|
55
56
|
"stimulus": ">= 1.1"
|
data/stimulus_reflex.gemspec
CHANGED
@@ -8,7 +8,7 @@ Gem::Specification.new do |gem|
|
|
8
8
|
gem.version = StimulusReflex::VERSION
|
9
9
|
gem.authors = ["Nathan Hopkins"]
|
10
10
|
gem.email = ["natehop@gmail.com"]
|
11
|
-
gem.homepage = "https://github.com/
|
11
|
+
gem.homepage = "https://github.com/stimulusreflex/stimulus_reflex"
|
12
12
|
gem.summary = "Build reactive applications with the Rails tooling you already know and love."
|
13
13
|
gem.post_install_message = <<~MESSAGE
|
14
14
|
Friendly reminder: When updating the stimulus_reflex gem,
|
@@ -18,8 +18,8 @@ Gem::Specification.new do |gem|
|
|
18
18
|
MESSAGE
|
19
19
|
|
20
20
|
gem.metadata = {
|
21
|
-
"bug_tracker_uri" => "https://github.com/
|
22
|
-
"changelog_uri" => "https://github.com/
|
21
|
+
"bug_tracker_uri" => "https://github.com/stimulusreflex/stimulus_reflex/issues",
|
22
|
+
"changelog_uri" => "https://github.com/stimulusreflex/stimulus_reflex/CHANGELOG.md",
|
23
23
|
"documentation_uri" => "https://docs.stimulusreflex.com",
|
24
24
|
"homepage_uri" => gem.homepage,
|
25
25
|
"source_code_uri" => gem.homepage
|
@@ -32,11 +32,11 @@ Gem::Specification.new do |gem|
|
|
32
32
|
gem.add_dependency "nokogiri"
|
33
33
|
gem.add_dependency "rails", ">= 5.2"
|
34
34
|
gem.add_dependency "redis"
|
35
|
-
gem.add_dependency "cable_ready", "
|
35
|
+
gem.add_dependency "cable_ready", "5.0.0.pre0"
|
36
36
|
|
37
37
|
gem.add_development_dependency "bundler", "~> 2.0"
|
38
38
|
gem.add_development_dependency "pry-nav"
|
39
39
|
gem.add_development_dependency "pry"
|
40
40
|
gem.add_development_dependency "rake"
|
41
|
-
gem.add_development_dependency "standardrb"
|
41
|
+
gem.add_development_dependency "standardrb", "~> 1.0"
|
42
42
|
end
|
@@ -10,6 +10,6 @@ class StimulusReflex::BroadcasterTestCase < ActionCable::Channel::TestCase
|
|
10
10
|
def connection.env
|
11
11
|
@env ||= {}
|
12
12
|
end
|
13
|
-
@reflex = StimulusReflex::Reflex.new(subscribe, url: "https://test.stimulusreflex.com")
|
13
|
+
@reflex = StimulusReflex::Reflex.new(subscribe, url: "https://test.stimulusreflex.com", client_attributes: {reflex_id: "666"})
|
14
14
|
end
|
15
15
|
end
|
@@ -13,7 +13,8 @@ class StimulusReflex::NothingBroadcasterTest < StimulusReflex::BroadcasterTestCa
|
|
13
13
|
{
|
14
14
|
"name" => "stimulus-reflex:server-message",
|
15
15
|
"detail" => {
|
16
|
-
"reflexId" =>
|
16
|
+
"reflexId" => "666",
|
17
|
+
"payload" => {},
|
17
18
|
"stimulusReflex" => {
|
18
19
|
"some" => :data,
|
19
20
|
"morph" => :nothing,
|
@@ -22,14 +23,15 @@ class StimulusReflex::NothingBroadcasterTest < StimulusReflex::BroadcasterTestCa
|
|
22
23
|
"body" => nil
|
23
24
|
}
|
24
25
|
}
|
25
|
-
}
|
26
|
+
},
|
27
|
+
"reflexId" => "666"
|
26
28
|
}
|
27
29
|
]
|
28
30
|
}
|
29
31
|
}
|
30
32
|
|
31
33
|
assert_broadcast_on @reflex.stream_name, expected do
|
32
|
-
broadcaster.broadcast nil, some
|
34
|
+
broadcaster.broadcast nil, {:some => :data, "reflexId" => "666"}
|
33
35
|
end
|
34
36
|
end
|
35
37
|
end
|
@@ -12,7 +12,7 @@ class StimulusReflex::PageBroadcasterTest < StimulusReflex::BroadcasterTestCase
|
|
12
12
|
test "performs a page morph on body" do
|
13
13
|
class << @reflex.controller.response
|
14
14
|
def body
|
15
|
-
"<html><head></head><body>New Content</body></html>"
|
15
|
+
"<html><head></head><body><div>New Content</div><div>Another Content</div></body></html>"
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
@@ -24,13 +24,15 @@ class StimulusReflex::PageBroadcasterTest < StimulusReflex::BroadcasterTestCase
|
|
24
24
|
"morph" => [
|
25
25
|
{
|
26
26
|
"selector" => "body",
|
27
|
-
"html" => "New Content",
|
27
|
+
"html" => "<div>New Content</div><div>Another Content</div>",
|
28
|
+
"payload" => {},
|
28
29
|
"childrenOnly" => true,
|
29
30
|
"permanentAttributeName" => nil,
|
30
31
|
"stimulusReflex" => {
|
31
32
|
"some" => :data,
|
32
33
|
"morph" => :page
|
33
|
-
}
|
34
|
+
},
|
35
|
+
"reflexId" => "666"
|
34
36
|
}
|
35
37
|
]
|
36
38
|
}
|
@@ -57,12 +59,14 @@ class StimulusReflex::PageBroadcasterTest < StimulusReflex::BroadcasterTestCase
|
|
57
59
|
{
|
58
60
|
"selector" => "#foo",
|
59
61
|
"html" => "New Content",
|
62
|
+
"payload" => {},
|
60
63
|
"childrenOnly" => true,
|
61
64
|
"permanentAttributeName" => nil,
|
62
65
|
"stimulusReflex" => {
|
63
66
|
"some" => :data,
|
64
67
|
"morph" => :page
|
65
|
-
}
|
68
|
+
},
|
69
|
+
"reflexId" => "666"
|
66
70
|
}
|
67
71
|
]
|
68
72
|
}
|
@@ -1,57 +1,173 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
# "
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
3
|
+
require_relative "broadcaster_test_case"
|
4
|
+
|
5
|
+
module StimulusReflex
|
6
|
+
class SelectorBroadcasterTest < StimulusReflex::BroadcasterTestCase
|
7
|
+
test "morphs the contents of an element if the selector(s) are present in both original and morphed html fragments" do
|
8
|
+
broadcaster = StimulusReflex::SelectorBroadcaster.new(@reflex)
|
9
|
+
broadcaster.append_morph("#foo", '<div id="foo"><div>bar</div><div>baz</div></div>')
|
10
|
+
|
11
|
+
expected = {
|
12
|
+
"cableReady" => true,
|
13
|
+
"operations" => {
|
14
|
+
"morph" => [
|
15
|
+
{
|
16
|
+
"selector" => "#foo",
|
17
|
+
"html" => "<div>bar</div><div>baz</div>",
|
18
|
+
"payload" => {},
|
19
|
+
"childrenOnly" => true,
|
20
|
+
"permanentAttributeName" => nil,
|
21
|
+
"stimulusReflex" => {
|
22
|
+
"some" => "data",
|
23
|
+
"morph" => "selector"
|
24
|
+
},
|
25
|
+
"reflexId" => "666"
|
26
|
+
}
|
27
|
+
]
|
28
|
+
}
|
29
|
+
}
|
30
|
+
|
31
|
+
assert_broadcast_on @reflex.stream_name, expected do
|
32
|
+
broadcaster.broadcast nil, some: :data
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
test "replaces the contents of an element and ignores permanent-attributes if the selector(s) aren't present in the replacing html fragment" do
|
37
|
+
broadcaster = StimulusReflex::SelectorBroadcaster.new(@reflex)
|
38
|
+
broadcaster.append_morph("#foo", '<div id="baz"><span>bar</span></div>')
|
39
|
+
|
40
|
+
expected = {
|
41
|
+
"cableReady" => true,
|
42
|
+
"operations" => {
|
43
|
+
"innerHtml" => [
|
44
|
+
{
|
45
|
+
"selector" => "#foo",
|
46
|
+
"html" => '<div id="baz"><span>bar</span></div>',
|
47
|
+
"payload" => {},
|
48
|
+
"stimulusReflex" => {
|
49
|
+
"some" => "data",
|
50
|
+
"morph" => "selector"
|
51
|
+
},
|
52
|
+
"reflexId" => "666"
|
53
|
+
}
|
54
|
+
]
|
55
|
+
}
|
56
|
+
}
|
57
|
+
|
58
|
+
assert_broadcast_on @reflex.stream_name, expected do
|
59
|
+
broadcaster.broadcast nil, some: :data
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
test "morphs the contents of an element to an empty string if no content specified" do
|
64
|
+
broadcaster = StimulusReflex::SelectorBroadcaster.new(@reflex)
|
65
|
+
broadcaster.append_morph("#foo", nil)
|
66
|
+
|
67
|
+
expected = {
|
68
|
+
"cableReady" => true,
|
69
|
+
"operations" => {
|
70
|
+
"innerHtml" => [
|
71
|
+
{
|
72
|
+
"selector" => "#foo",
|
73
|
+
"html" => "",
|
74
|
+
"payload" => {},
|
75
|
+
"stimulusReflex" => {
|
76
|
+
"some" => "data",
|
77
|
+
"morph" => "selector"
|
78
|
+
},
|
79
|
+
"reflexId" => "666"
|
80
|
+
}
|
81
|
+
]
|
82
|
+
}
|
83
|
+
}
|
84
|
+
|
85
|
+
assert_broadcast_on @reflex.stream_name, expected do
|
86
|
+
broadcaster.broadcast nil, some: :data
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
test "morphs the contents of an element to an empty string if empty specified" do
|
91
|
+
broadcaster = StimulusReflex::SelectorBroadcaster.new(@reflex)
|
92
|
+
broadcaster.append_morph("#foo", "")
|
93
|
+
|
94
|
+
expected = {
|
95
|
+
"cableReady" => true,
|
96
|
+
"operations" => {
|
97
|
+
"innerHtml" => [
|
98
|
+
{
|
99
|
+
"selector" => "#foo",
|
100
|
+
"html" => "",
|
101
|
+
"payload" => {},
|
102
|
+
"stimulusReflex" => {
|
103
|
+
"some" => "data",
|
104
|
+
"morph" => "selector"
|
105
|
+
},
|
106
|
+
"reflexId" => "666"
|
107
|
+
}
|
108
|
+
]
|
109
|
+
}
|
110
|
+
}
|
111
|
+
|
112
|
+
assert_broadcast_on @reflex.stream_name, expected do
|
113
|
+
broadcaster.broadcast nil, some: :data
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
test "morphs the contents of an element to an empty string if no content specified, hash form" do
|
118
|
+
broadcaster = StimulusReflex::SelectorBroadcaster.new(@reflex)
|
119
|
+
broadcaster.append_morph({"#foo": nil}, nil)
|
120
|
+
|
121
|
+
expected = {
|
122
|
+
"cableReady" => true,
|
123
|
+
"operations" => {
|
124
|
+
"innerHtml" => [
|
125
|
+
{
|
126
|
+
"selector" => "#foo",
|
127
|
+
"html" => "",
|
128
|
+
"payload" => {},
|
129
|
+
"stimulusReflex" => {
|
130
|
+
"some" => "data",
|
131
|
+
"morph" => "selector"
|
132
|
+
},
|
133
|
+
"reflexId" => "666"
|
134
|
+
}
|
135
|
+
]
|
136
|
+
}
|
137
|
+
}
|
138
|
+
|
139
|
+
assert_broadcast_on @reflex.stream_name, expected do
|
140
|
+
broadcaster.broadcast nil, some: :data
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
test "morphs the contents of an element to specified HTML, hash form" do
|
145
|
+
broadcaster = StimulusReflex::SelectorBroadcaster.new(@reflex)
|
146
|
+
broadcaster.append_morph({"#foo": '<div id="foo"><div>bar</div><div>baz</div></div>'}, nil)
|
147
|
+
|
148
|
+
expected = {
|
149
|
+
"cableReady" => true,
|
150
|
+
"operations" => {
|
151
|
+
"morph" => [
|
152
|
+
{
|
153
|
+
"selector" => "#foo",
|
154
|
+
"html" => "<div>bar</div><div>baz</div>",
|
155
|
+
"payload" => {},
|
156
|
+
"childrenOnly" => true,
|
157
|
+
"permanentAttributeName" => nil,
|
158
|
+
"stimulusReflex" => {
|
159
|
+
"some" => "data",
|
160
|
+
"morph" => "selector"
|
161
|
+
},
|
162
|
+
"reflexId" => "666"
|
163
|
+
}
|
164
|
+
]
|
165
|
+
}
|
166
|
+
}
|
167
|
+
|
168
|
+
assert_broadcast_on @reflex.stream_name, expected do
|
169
|
+
broadcaster.broadcast nil, some: :data
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|