stimulus_reflex 3.4.1 → 3.5.0.pre3

Sign up to get free protection for your applications and to get access to all the features.

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