stimulus_reflex 3.4.1 → 3.5.0.pre3

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.

Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +664 -495
  3. data/Gemfile.lock +99 -95
  4. data/LATEST +1 -0
  5. data/README.md +17 -16
  6. data/app/channels/stimulus_reflex/channel.rb +44 -75
  7. data/lib/generators/USAGE +1 -1
  8. data/lib/generators/stimulus_reflex/{config_generator.rb → initializer_generator.rb} +3 -3
  9. data/lib/generators/stimulus_reflex/stimulus_reflex_generator.rb +5 -4
  10. data/lib/generators/stimulus_reflex/templates/app/reflexes/%file_name%_reflex.rb.tt +3 -2
  11. data/lib/generators/stimulus_reflex/templates/app/reflexes/application_reflex.rb.tt +11 -4
  12. data/lib/generators/stimulus_reflex/templates/config/initializers/stimulus_reflex.rb +21 -1
  13. data/lib/stimulus_reflex/broadcasters/broadcaster.rb +22 -18
  14. data/lib/stimulus_reflex/broadcasters/nothing_broadcaster.rb +6 -1
  15. data/lib/stimulus_reflex/broadcasters/page_broadcaster.rb +3 -5
  16. data/lib/stimulus_reflex/broadcasters/selector_broadcaster.rb +22 -16
  17. data/lib/stimulus_reflex/broadcasters/update.rb +23 -0
  18. data/lib/stimulus_reflex/cable_ready_channels.rb +10 -2
  19. data/lib/stimulus_reflex/callbacks.rb +55 -5
  20. data/lib/stimulus_reflex/concern_enhancer.rb +37 -0
  21. data/lib/stimulus_reflex/configuration.rb +4 -1
  22. data/lib/stimulus_reflex/dataset.rb +34 -0
  23. data/lib/stimulus_reflex/element.rb +20 -13
  24. data/lib/stimulus_reflex/policies/reflex_invocation_policy.rb +28 -0
  25. data/lib/stimulus_reflex/reflex.rb +41 -21
  26. data/lib/stimulus_reflex/reflex_data.rb +79 -0
  27. data/lib/stimulus_reflex/reflex_factory.rb +31 -0
  28. data/lib/stimulus_reflex/request_parameters.rb +19 -0
  29. data/lib/stimulus_reflex/utils/attribute_builder.rb +17 -0
  30. data/lib/stimulus_reflex/{logger.rb → utils/logger.rb} +6 -4
  31. data/lib/stimulus_reflex/utils/sanity_checker.rb +210 -0
  32. data/lib/stimulus_reflex/version.rb +1 -1
  33. data/lib/stimulus_reflex.rb +10 -2
  34. data/lib/tasks/stimulus_reflex/install.rake +54 -15
  35. data/test/broadcasters/broadcaster_test.rb +0 -1
  36. data/test/broadcasters/broadcaster_test_case.rb +25 -1
  37. data/test/broadcasters/nothing_broadcaster_test.rb +14 -20
  38. data/test/broadcasters/page_broadcaster_test.rb +31 -29
  39. data/test/broadcasters/selector_broadcaster_test.rb +165 -55
  40. data/test/callbacks_test.rb +652 -0
  41. data/test/concern_enhancer_test.rb +54 -0
  42. data/test/element_test.rb +254 -0
  43. data/test/generators/stimulus_reflex_generator_test.rb +8 -0
  44. data/test/reflex_test.rb +12 -1
  45. data/test/test_helper.rb +25 -1
  46. data/test/tmp/app/reflexes/application_reflex.rb +10 -3
  47. data/test/tmp/app/reflexes/{user_reflex.rb → demo_reflex.rb} +4 -12
  48. metadata +65 -36
  49. data/lib/stimulus_reflex/sanity_checker.rb +0 -154
  50. data/package.json +0 -57
  51. data/stimulus_reflex.gemspec +0 -42
  52. data/tags +0 -156
  53. data/yarn.lock +0 -4687
@@ -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
 
@@ -20,20 +20,21 @@ class StimulusReflex::PageBroadcasterTest < StimulusReflex::BroadcasterTestCase
20
20
 
21
21
  expected = {
22
22
  "cableReady" => true,
23
- "operations" => {
24
- "morph" => [
25
- {
26
- "selector" => "body",
27
- "html" => "New Content",
28
- "childrenOnly" => true,
29
- "permanentAttributeName" => nil,
30
- "stimulusReflex" => {
31
- "some" => :data,
32
- "morph" => :page
33
- }
34
- }
35
- ]
36
- }
23
+ "operations" => [
24
+ {
25
+ "selector" => "body",
26
+ "html" => "<div>New Content</div><div>Another Content</div>",
27
+ "payload" => {},
28
+ "childrenOnly" => true,
29
+ "permanentAttributeName" => nil,
30
+ "stimulusReflex" => {
31
+ "some" => :data,
32
+ "morph" => :page
33
+ },
34
+ "reflexId" => "666",
35
+ "operation" => "morph"
36
+ }
37
+ ]
37
38
  }
38
39
 
39
40
  assert_broadcast_on @reflex.stream_name, expected do
@@ -52,20 +53,21 @@ class StimulusReflex::PageBroadcasterTest < StimulusReflex::BroadcasterTestCase
52
53
 
53
54
  expected = {
54
55
  "cableReady" => true,
55
- "operations" => {
56
- "morph" => [
57
- {
58
- "selector" => "#foo",
59
- "html" => "New Content",
60
- "childrenOnly" => true,
61
- "permanentAttributeName" => nil,
62
- "stimulusReflex" => {
63
- "some" => :data,
64
- "morph" => :page
65
- }
66
- }
67
- ]
68
- }
56
+ "operations" => [
57
+ {
58
+ "selector" => "#foo",
59
+ "html" => "New Content",
60
+ "payload" => {},
61
+ "childrenOnly" => true,
62
+ "permanentAttributeName" => nil,
63
+ "stimulusReflex" => {
64
+ "some" => :data,
65
+ "morph" => :page
66
+ },
67
+ "reflexId" => "666",
68
+ "operation" => "morph"
69
+ }
70
+ ]
69
71
  }
70
72
 
71
73
  assert_broadcast_on @reflex.stream_name, expected do
@@ -1,57 +1,167 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # require_relative "broadcaster_test_case"
4
-
5
- # class StimulusReflex::SelectorBroadcasterTest < StimulusReflex::BroadcasterTestCase
6
- # test "morphs the contents of an element if the selector(s) are present in both original and morphed html fragments" do
7
- # broadcaster = StimulusReflex::SelectorBroadcaster.new(@reflex)
8
- # broadcaster.append_morph("#foo", "<div id=\"foo\"><span>bar</span></div>")
9
-
10
- # expected = {
11
- # "cableReady" => true,
12
- # "operations" => {
13
- # "morph" => [
14
- # {
15
- # "selector" => "#foo",
16
- # "html" => "<span>bar</span>",
17
- # "childrenOnly" => true,
18
- # "permanentAttributeName" => nil,
19
- # "stimulusReflex" => {
20
- # "some" => :data,
21
- # "morph" => :selector
22
- # }
23
- # }
24
- # ]
25
- # }
26
- # }
27
-
28
- # assert_broadcast_on @reflex.stream_name, expected do
29
- # broadcaster.broadcast nil, some: :data
30
- # end
31
- # end
32
-
33
- # test "replaces the contents of an element and ignores permanent-attributes if the selector(s) aren't present in the replacing html fragment" do
34
- # broadcaster = StimulusReflex::SelectorBroadcaster.new(@reflex)
35
- # broadcaster.append_morph("#foo", "<div id=\"baz\"><span>bar</span></div>")
36
-
37
- # expected = {
38
- # "cableReady" => true,
39
- # "operations" => {
40
- # "innerHtml" => [
41
- # {
42
- # "selector" => "#foo",
43
- # "html" => "<div id=\"baz\"><span>bar</span></div>",
44
- # "stimulusReflex" => {
45
- # "some" => :data,
46
- # "morph" => :selector
47
- # }
48
- # }
49
- # ]
50
- # }
51
- # }
52
-
53
- # assert_broadcast_on @reflex.stream_name, expected do
54
- # broadcaster.broadcast nil, some: :data
55
- # end
56
- # end
57
- # end
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
+ {
15
+ "selector" => "#foo",
16
+ "html" => "<div>bar</div><div>baz</div>",
17
+ "payload" => {},
18
+ "childrenOnly" => true,
19
+ "permanentAttributeName" => nil,
20
+ "stimulusReflex" => {
21
+ "some" => "data",
22
+ "morph" => "selector"
23
+ },
24
+ "reflexId" => "666",
25
+ "operation" => "morph"
26
+ }
27
+ ]
28
+ }
29
+
30
+ assert_broadcast_on @reflex.stream_name, expected do
31
+ broadcaster.broadcast nil, some: :data
32
+ end
33
+ end
34
+
35
+ test "replaces the contents of an element and ignores permanent-attributes if the selector(s) aren't present in the replacing html fragment" do
36
+ broadcaster = StimulusReflex::SelectorBroadcaster.new(@reflex)
37
+ broadcaster.append_morph("#foo", '<div id="baz"><span>bar</span></div>')
38
+
39
+ expected = {
40
+ "cableReady" => true,
41
+ "operations" => [
42
+ {
43
+ "selector" => "#foo",
44
+ "html" => '<div id="baz"><span>bar</span></div>',
45
+ "payload" => {},
46
+ "stimulusReflex" => {
47
+ "some" => "data",
48
+ "morph" => "selector"
49
+ },
50
+ "reflexId" => "666",
51
+ "operation" => "innerHtml"
52
+ }
53
+ ]
54
+ }
55
+
56
+ assert_broadcast_on @reflex.stream_name, expected do
57
+ broadcaster.broadcast nil, some: :data
58
+ end
59
+ end
60
+
61
+ test "morphs the contents of an element to an empty string if no content specified" do
62
+ broadcaster = StimulusReflex::SelectorBroadcaster.new(@reflex)
63
+ broadcaster.append_morph("#foo", nil)
64
+
65
+ expected = {
66
+ "cableReady" => true,
67
+ "operations" => [
68
+ {
69
+ "selector" => "#foo",
70
+ "html" => "",
71
+ "payload" => {},
72
+ "stimulusReflex" => {
73
+ "some" => "data",
74
+ "morph" => "selector"
75
+ },
76
+ "reflexId" => "666",
77
+ "operation" => "innerHtml"
78
+ }
79
+ ]
80
+ }
81
+
82
+ assert_broadcast_on @reflex.stream_name, expected do
83
+ broadcaster.broadcast nil, some: :data
84
+ end
85
+ end
86
+
87
+ test "morphs the contents of an element to an empty string if empty specified" do
88
+ broadcaster = StimulusReflex::SelectorBroadcaster.new(@reflex)
89
+ broadcaster.append_morph("#foo", "")
90
+
91
+ expected = {
92
+ "cableReady" => true,
93
+ "operations" => [
94
+ {
95
+ "selector" => "#foo",
96
+ "html" => "",
97
+ "payload" => {},
98
+ "stimulusReflex" => {
99
+ "some" => "data",
100
+ "morph" => "selector"
101
+ },
102
+ "reflexId" => "666",
103
+ "operation" => "innerHtml"
104
+ }
105
+ ]
106
+ }
107
+
108
+ assert_broadcast_on @reflex.stream_name, expected do
109
+ broadcaster.broadcast nil, some: :data
110
+ end
111
+ end
112
+
113
+ test "morphs the contents of an element to an empty string if no content specified, hash form" do
114
+ broadcaster = StimulusReflex::SelectorBroadcaster.new(@reflex)
115
+ broadcaster.append_morph({"#foo": nil}, nil)
116
+
117
+ expected = {
118
+ "cableReady" => true,
119
+ "operations" => [
120
+ {
121
+ "selector" => "#foo",
122
+ "html" => "",
123
+ "payload" => {},
124
+ "stimulusReflex" => {
125
+ "some" => "data",
126
+ "morph" => "selector"
127
+ },
128
+ "reflexId" => "666",
129
+ "operation" => "innerHtml"
130
+ }
131
+ ]
132
+ }
133
+
134
+ assert_broadcast_on @reflex.stream_name, expected do
135
+ broadcaster.broadcast nil, some: :data
136
+ end
137
+ end
138
+
139
+ test "morphs the contents of an element to specified HTML, hash form" do
140
+ broadcaster = StimulusReflex::SelectorBroadcaster.new(@reflex)
141
+ broadcaster.append_morph({"#foo": '<div id="foo"><div>bar</div><div>baz</div></div>'}, nil)
142
+
143
+ expected = {
144
+ "cableReady" => true,
145
+ "operations" => [
146
+ {
147
+ "selector" => "#foo",
148
+ "html" => "<div>bar</div><div>baz</div>",
149
+ "payload" => {},
150
+ "childrenOnly" => true,
151
+ "permanentAttributeName" => nil,
152
+ "stimulusReflex" => {
153
+ "some" => "data",
154
+ "morph" => "selector"
155
+ },
156
+ "reflexId" => "666",
157
+ "operation" => "morph"
158
+ }
159
+ ]
160
+ }
161
+
162
+ assert_broadcast_on @reflex.stream_name, expected do
163
+ broadcaster.broadcast nil, some: :data
164
+ end
165
+ end
166
+ end
167
+ end