stimulus_reflex 3.4.0.pre8 → 3.5.0.pre1

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 (47) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +639 -463
  3. data/CODE_OF_CONDUCT.md +6 -0
  4. data/Gemfile.lock +103 -100
  5. data/LATEST +1 -0
  6. data/README.md +14 -13
  7. data/app/channels/stimulus_reflex/channel.rb +62 -67
  8. data/lib/generators/USAGE +1 -1
  9. data/lib/generators/stimulus_reflex/{config_generator.rb → initializer_generator.rb} +3 -3
  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 +1 -1
  12. data/lib/generators/stimulus_reflex/templates/config/initializers/stimulus_reflex.rb +14 -0
  13. data/lib/stimulus_reflex.rb +11 -3
  14. data/lib/stimulus_reflex/broadcasters/broadcaster.rb +7 -4
  15. data/lib/stimulus_reflex/broadcasters/page_broadcaster.rb +2 -2
  16. data/lib/stimulus_reflex/broadcasters/selector_broadcaster.rb +12 -5
  17. data/lib/stimulus_reflex/cable_ready_channels.rb +30 -6
  18. data/lib/stimulus_reflex/callbacks.rb +98 -0
  19. data/lib/stimulus_reflex/concern_enhancer.rb +37 -0
  20. data/lib/stimulus_reflex/configuration.rb +3 -1
  21. data/lib/stimulus_reflex/element.rb +31 -7
  22. data/lib/stimulus_reflex/policies/reflex_invocation_policy.rb +28 -0
  23. data/lib/stimulus_reflex/reflex.rb +57 -57
  24. data/lib/stimulus_reflex/reflex_data.rb +79 -0
  25. data/lib/stimulus_reflex/reflex_factory.rb +31 -0
  26. data/lib/stimulus_reflex/request_parameters.rb +19 -0
  27. data/lib/stimulus_reflex/{logger.rb → utils/logger.rb} +6 -8
  28. data/lib/stimulus_reflex/{sanity_checker.rb → utils/sanity_checker.rb} +65 -10
  29. data/lib/stimulus_reflex/version.rb +1 -1
  30. data/lib/tasks/stimulus_reflex/install.rake +14 -7
  31. data/test/broadcasters/broadcaster_test.rb +2 -0
  32. data/test/broadcasters/broadcaster_test_case.rb +3 -1
  33. data/test/broadcasters/nothing_broadcaster_test.rb +7 -3
  34. data/test/broadcasters/page_broadcaster_test.rb +10 -4
  35. data/test/broadcasters/selector_broadcaster_test.rb +173 -55
  36. data/test/callbacks_test.rb +652 -0
  37. data/test/concern_enhancer_test.rb +54 -0
  38. data/test/element_test.rb +181 -0
  39. data/test/reflex_test.rb +7 -1
  40. data/test/test_helper.rb +10 -0
  41. data/test/tmp/app/reflexes/application_reflex.rb +1 -1
  42. data/test/tmp/app/reflexes/demo_reflex.rb +3 -2
  43. metadata +45 -36
  44. data/package.json +0 -57
  45. data/stimulus_reflex.gemspec +0 -40
  46. data/tags +0 -139
  47. data/yarn.lock +0 -4711
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "test_helper"
4
+
5
+ class StimulusReflex::ConcernTest < ActiveSupport::TestCase
6
+ module TestConcern
7
+ extend ActiveSupport::Concern
8
+ include StimulusReflex::ConcernEnhancer
9
+ end
10
+
11
+ class TestReflex < StimulusReflex::Reflex
12
+ include TestConcern
13
+
14
+ def initialize
15
+ end
16
+ end
17
+
18
+ class TestController < ActionController::Base
19
+ include TestConcern
20
+ end
21
+
22
+ class TestModel < ActiveRecord::Base
23
+ include TestConcern
24
+ end
25
+
26
+ test "included in a reflex it stubs controller and model methods" do
27
+ assert_nil TestReflex.helper_method
28
+ assert_nil TestReflex.before_action
29
+ assert_nil TestReflex.around_action
30
+ assert_nil TestReflex.after_action
31
+
32
+ assert_nil TestReflex.before_save
33
+ assert_nil TestReflex.around_save
34
+ assert_nil TestReflex.after_save
35
+
36
+ refute_nil TestReflex.before_reflex
37
+ end
38
+
39
+ test "included in a controller it stubs reflex methods" do
40
+ assert_nil TestController.before_reflex
41
+ assert_nil TestController.around_reflex
42
+ assert_nil TestController.after_reflex
43
+
44
+ refute_nil TestController.before_action
45
+ end
46
+
47
+ test "included in a model it stubs reflex methods" do
48
+ assert_nil TestModel.before_reflex
49
+ assert_nil TestModel.around_reflex
50
+ assert_nil TestModel.after_reflex
51
+
52
+ refute_nil TestModel.after_save
53
+ end
54
+ end
@@ -0,0 +1,181 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "test_helper"
4
+
5
+ class StimulusReflex::ElementTest < ActiveSupport::TestCase
6
+ element = StimulusReflex::Element.new({
7
+ "attrs" => {
8
+ "user" => "First User",
9
+ "user-id" => "1"
10
+ },
11
+ "dataset" => {
12
+ "dataset" => {
13
+ "data-post" => "The Post",
14
+ "data-post-id" => "2"
15
+ },
16
+ "datasetAll" => {}
17
+ }
18
+ })
19
+
20
+ test "should be able to access attributes on element itself" do
21
+ assert_equal "First User", element.user
22
+ assert_equal "First User", element["user"]
23
+ assert_equal "First User", element[:user]
24
+
25
+ assert_equal "1", element.user_id
26
+ assert_equal "1", element["user_id"]
27
+ assert_equal "1", element["user-id"]
28
+ assert_equal "1", element[:user_id]
29
+
30
+ assert_equal "The Post", element.data_post
31
+ assert_equal "The Post", element["data_post"]
32
+ assert_equal "The Post", element["data-post"]
33
+ assert_equal "The Post", element[:data_post]
34
+
35
+ assert_equal "2", element.data_post_id
36
+ assert_equal "2", element["data_post_id"]
37
+ assert_equal "2", element["data-post-id"]
38
+ assert_equal "2", element[:data_post_id]
39
+ end
40
+
41
+ test "should be able to access attributes via attributes" do
42
+ assert_equal "First User", element.attributes.user
43
+ assert_equal "First User", element.attributes["user"]
44
+ assert_equal "First User", element.attributes[:user]
45
+
46
+ assert_equal "1", element.attributes.user_id
47
+ assert_equal "1", element.attributes["user_id"]
48
+ assert_equal "1", element.attributes["user-id"]
49
+ assert_equal "1", element.attributes[:user_id]
50
+ end
51
+
52
+ test "should be able to access attributes via dataset" do
53
+ assert_equal "The Post", element.dataset.post
54
+ assert_equal "The Post", element.dataset["post"]
55
+ assert_equal "The Post", element.dataset[:post]
56
+
57
+ assert_equal "2", element.dataset.post_id
58
+ assert_equal "2", element.dataset["post-id"]
59
+ assert_equal "2", element.dataset["post_id"]
60
+ assert_equal "2", element.dataset[:post_id]
61
+ end
62
+
63
+ test "should be able to access attributes via data_attributes" do
64
+ assert_equal "The Post", element.data_attributes.post
65
+ assert_equal "The Post", element.data_attributes["post"]
66
+ assert_equal "The Post", element.data_attributes[:post]
67
+
68
+ assert_equal "2", element.data_attributes.post_id
69
+ assert_equal "2", element.data_attributes["post-id"]
70
+ assert_equal "2", element.data_attributes["post_id"]
71
+ assert_equal "2", element.data_attributes[:post_id]
72
+ end
73
+
74
+ test "should pluralize keys from datasetAll" do
75
+ data = {
76
+ "dataset" => {
77
+ "dataset" => {
78
+ "data-reflex" => "click",
79
+ "data-sex" => "male"
80
+ },
81
+ "datasetAll" => {
82
+ "data-reflex" => ["click"],
83
+ "data-post-id" => ["1", "2", "3", "4"],
84
+ "data-name" => ["steve", "bill", "steve", "mike"]
85
+ }
86
+ }
87
+ }
88
+
89
+ dataset_all_element = StimulusReflex::Element.new(data)
90
+
91
+ assert_equal "click", dataset_all_element.dataset.reflex
92
+ assert_equal "male", dataset_all_element.dataset.sex
93
+
94
+ assert_equal ["steve", "bill", "steve", "mike"], dataset_all_element.dataset.names
95
+ assert_equal ["1", "2", "3", "4"], dataset_all_element.dataset.post_ids
96
+ assert_equal ["click"], dataset_all_element.dataset.reflexes
97
+ end
98
+
99
+ test "should pluralize irregular words from datasetAll" do
100
+ data = {
101
+ "dataset" => {
102
+ "dataset" => {},
103
+ "datasetAll" => {
104
+ "data-cat" => ["cat"],
105
+ "data-child" => ["child"],
106
+ "data-women" => ["woman"],
107
+ "data-man" => ["man"],
108
+ "data-wolf" => ["wolf"],
109
+ "data-library" => ["library"],
110
+ "data-mouse" => ["mouse"]
111
+ }
112
+ }
113
+ }
114
+
115
+ pluralize_element = StimulusReflex::Element.new(data)
116
+
117
+ assert_equal ["cat"], pluralize_element.dataset.cats
118
+ assert_equal ["child"], pluralize_element.dataset.children
119
+ assert_equal ["woman"], pluralize_element.dataset.women
120
+ assert_equal ["man"], pluralize_element.dataset.men
121
+ assert_equal ["wolf"], pluralize_element.dataset.wolves
122
+ assert_equal ["library"], pluralize_element.dataset.libraries
123
+ assert_equal ["mouse"], pluralize_element.dataset.mice
124
+ end
125
+
126
+ test "should not pluralize plural key" do
127
+ data = {
128
+ "dataset" => {
129
+ "datasetAll" => {
130
+ "data-ids" => ["1", "2"]
131
+ }
132
+ }
133
+ }
134
+
135
+ assert_equal ["1", "2"], StimulusReflex::Element.new(data).dataset.ids
136
+ assert_nil StimulusReflex::Element.new(data).dataset.idss
137
+ end
138
+
139
+ test "should not build array with pluralized key" do
140
+ data = {
141
+ "dataset" => {
142
+ "dataset" => {
143
+ "data-ids" => "1"
144
+ }
145
+ }
146
+ }
147
+
148
+ assert_equal "1", StimulusReflex::Element.new(data).dataset.ids
149
+ end
150
+
151
+ test "should handle overlapping singluar and plural key names" do
152
+ data = {
153
+ "dataset" => {
154
+ "dataset" => {
155
+ "data-id" => "1",
156
+ "data-ids" => "2",
157
+ "data-post-id" => "9",
158
+ "data-post-ids" => "10",
159
+ "data-duplicate-value" => "19",
160
+ "data-duplicate-values" => "20"
161
+ },
162
+ "datasetAll" => {
163
+ "data-id" => ["3", "4"],
164
+ "data-post-ids" => ["11", "12"],
165
+ "data-duplicate-value" => ["20", "21", "22"]
166
+ }
167
+ }
168
+ }
169
+
170
+ overlapping_keys_element = StimulusReflex::Element.new(data)
171
+
172
+ assert_equal "1", overlapping_keys_element.dataset.id
173
+ assert_equal ["2", "3", "4"], overlapping_keys_element.dataset.ids
174
+
175
+ assert_equal "9", overlapping_keys_element.dataset.post_id
176
+ assert_equal ["10", "11", "12"], overlapping_keys_element.dataset.post_ids
177
+
178
+ assert_equal "19", overlapping_keys_element.dataset.duplicate_value
179
+ assert_equal ["20", "20", "21", "22"], overlapping_keys_element.dataset.duplicate_values
180
+ end
181
+ end
data/test/reflex_test.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative "test_helper"
2
4
 
3
5
  class StimulusReflex::ReflexTest < ActionCable::Channel::TestCase
@@ -8,7 +10,7 @@ class StimulusReflex::ReflexTest < ActionCable::Channel::TestCase
8
10
  def connection.env
9
11
  @env ||= {}
10
12
  end
11
- @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"})
12
14
  @reflex.controller_class.view_paths << Rails.root.join("test/views")
13
15
  end
14
16
 
@@ -23,4 +25,8 @@ class StimulusReflex::ReflexTest < ActionCable::Channel::TestCase
23
25
  test "render partial" do
24
26
  assert @reflex.render(partial: "/hello_partial", assigns: {message: "Testing 123"}) == "<p>Hello from partial! Testing 123</p>\n"
25
27
  end
28
+
29
+ test "dom_id" do
30
+ assert @reflex.dom_id(TestModel.new(id: 123)) == "#test_model_123"
31
+ end
26
32
  end
data/test/test_helper.rb CHANGED
@@ -4,6 +4,8 @@ ENV["RAILS_ENV"] ||= "test"
4
4
 
5
5
  require "minitest/mock"
6
6
  require "rails"
7
+ require "active_model"
8
+ require "active_record"
7
9
  require "action_controller"
8
10
  require "pry"
9
11
  require_relative "../lib/stimulus_reflex"
@@ -34,6 +36,14 @@ class ActionDispatch::Request
34
36
  end
35
37
  end
36
38
 
39
+ class TestModel
40
+ include ActiveModel::Model
41
+ attr_accessor :id
42
+ def is_a?(klass)
43
+ klass == ActiveRecord::Base
44
+ end
45
+ end
46
+
37
47
  StimulusReflex.configuration.parent_channel = "ActionCable::Channel::Base"
38
48
  ActionCable::Server::Base.config.cable = {adapter: "test"}
39
49
  ActionCable::Server::Base.config.logger = Logger.new(nil)
@@ -8,5 +8,5 @@ class ApplicationReflex < StimulusReflex::Reflex
8
8
  # # If your ActionCable connection is: `identified_by :current_user`
9
9
  # delegate :current_user, to: :connection
10
10
  #
11
- # Learn more at: https://docs.stimulusreflex.com/reflexes#reflex-classes
11
+ # Learn more at: https://docs.stimulusreflex.com/rtfm/reflex-classes
12
12
  end
@@ -17,12 +17,13 @@ class DemoReflex < ApplicationReflex
17
17
  # - unsigned - use an unsigned Global ID to map dataset attribute to a model eg. element.unsigned[:foo]
18
18
  # - cable_ready - a special cable_ready that can broadcast to the current visitor (no brackets needed)
19
19
  # - reflex_id - a UUIDv4 that uniquely identies each Reflex
20
+ # - tab_id - a UUIDv4 that uniquely identifies the browser tab
20
21
  #
21
22
  # Example:
22
23
  #
23
24
  # before_reflex do
24
25
  # # throw :abort # this will prevent the Reflex from continuing
25
- # # learn more about callbacks at https://docs.stimulusreflex.com/lifecycle
26
+ # # learn more about callbacks at https://docs.stimulusreflex.com/rtfm/lifecycle
26
27
  # end
27
28
  #
28
29
  # def example(argument=true)
@@ -30,5 +31,5 @@ class DemoReflex < ApplicationReflex
30
31
  # # Any declared instance variables will be made available to the Rails controller and view.
31
32
  # end
32
33
  #
33
- # Learn more at: https://docs.stimulusreflex.com/reflexes#reflex-classes
34
+ # Learn more at: https://docs.stimulusreflex.com/rtfm/reflex-classes
34
35
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stimulus_reflex
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.4.0.pre8
4
+ version: 3.5.0.pre1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nathan Hopkins
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-12-02 00:00:00.000000000 Z
11
+ date: 2021-06-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -70,16 +70,16 @@ dependencies:
70
70
  name: cable_ready
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ">="
73
+ - - '='
74
74
  - !ruby/object:Gem::Version
75
- version: '4.4'
75
+ version: 5.0.0.pre1
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ">="
80
+ - - '='
81
81
  - !ruby/object:Gem::Version
82
- version: '4.4'
82
+ version: 5.0.0.pre1
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: bundler
85
85
  requirement: !ruby/object:Gem::Requirement
@@ -140,17 +140,17 @@ dependencies:
140
140
  name: standardrb
141
141
  requirement: !ruby/object:Gem::Requirement
142
142
  requirements:
143
- - - ">="
143
+ - - "~>"
144
144
  - !ruby/object:Gem::Version
145
- version: '0'
145
+ version: '1.0'
146
146
  type: :development
147
147
  prerelease: false
148
148
  version_requirements: !ruby/object:Gem::Requirement
149
149
  requirements:
150
- - - ">="
150
+ - - "~>"
151
151
  - !ruby/object:Gem::Version
152
- version: '0'
153
- description:
152
+ version: '1.0'
153
+ description:
154
154
  email:
155
155
  - natehop@gmail.com
156
156
  executables: []
@@ -161,6 +161,7 @@ files:
161
161
  - CODE_OF_CONDUCT.md
162
162
  - Gemfile
163
163
  - Gemfile.lock
164
+ - LATEST
164
165
  - LICENSE.txt
165
166
  - README.md
166
167
  - Rakefile
@@ -171,7 +172,7 @@ files:
171
172
  - bin/setup
172
173
  - bin/standardize
173
174
  - lib/generators/USAGE
174
- - lib/generators/stimulus_reflex/config_generator.rb
175
+ - lib/generators/stimulus_reflex/initializer_generator.rb
175
176
  - lib/generators/stimulus_reflex/stimulus_reflex_generator.rb
176
177
  - lib/generators/stimulus_reflex/templates/app/javascript/controllers/%file_name%_controller.js.tt
177
178
  - lib/generators/stimulus_reflex/templates/app/javascript/controllers/application_controller.js.tt
@@ -184,42 +185,47 @@ files:
184
185
  - lib/stimulus_reflex/broadcasters/page_broadcaster.rb
185
186
  - lib/stimulus_reflex/broadcasters/selector_broadcaster.rb
186
187
  - lib/stimulus_reflex/cable_ready_channels.rb
188
+ - lib/stimulus_reflex/callbacks.rb
189
+ - lib/stimulus_reflex/concern_enhancer.rb
187
190
  - lib/stimulus_reflex/configuration.rb
188
191
  - lib/stimulus_reflex/element.rb
189
- - lib/stimulus_reflex/logger.rb
192
+ - lib/stimulus_reflex/policies/reflex_invocation_policy.rb
190
193
  - lib/stimulus_reflex/reflex.rb
191
- - lib/stimulus_reflex/sanity_checker.rb
194
+ - lib/stimulus_reflex/reflex_data.rb
195
+ - lib/stimulus_reflex/reflex_factory.rb
196
+ - lib/stimulus_reflex/request_parameters.rb
192
197
  - lib/stimulus_reflex/utils/colorize.rb
198
+ - lib/stimulus_reflex/utils/logger.rb
199
+ - lib/stimulus_reflex/utils/sanity_checker.rb
193
200
  - lib/stimulus_reflex/version.rb
194
201
  - lib/tasks/stimulus_reflex/install.rake
195
- - package.json
196
- - stimulus_reflex.gemspec
197
- - tags
198
202
  - test/broadcasters/broadcaster_test.rb
199
203
  - test/broadcasters/broadcaster_test_case.rb
200
204
  - test/broadcasters/nothing_broadcaster_test.rb
201
205
  - test/broadcasters/page_broadcaster_test.rb
202
206
  - test/broadcasters/selector_broadcaster_test.rb
207
+ - test/callbacks_test.rb
208
+ - test/concern_enhancer_test.rb
209
+ - test/element_test.rb
203
210
  - test/generators/stimulus_reflex_generator_test.rb
204
211
  - test/reflex_test.rb
205
212
  - test/test_helper.rb
206
213
  - test/tmp/app/reflexes/application_reflex.rb
207
214
  - test/tmp/app/reflexes/demo_reflex.rb
208
- - yarn.lock
209
- homepage: https://github.com/hopsoft/stimulus_reflex
215
+ homepage: https://github.com/stimulusreflex/stimulus_reflex
210
216
  licenses:
211
217
  - MIT
212
218
  metadata:
213
- bug_tracker_uri: https://github.com/hopsoft/stimulus_reflex/issues
214
- changelog_uri: https://github.com/hopsoft/stimulus_reflex/CHANGELOG.md
219
+ bug_tracker_uri: https://github.com/stimulusreflex/stimulus_reflex/issues
220
+ changelog_uri: https://github.com/stimulusreflex/stimulus_reflex/CHANGELOG.md
215
221
  documentation_uri: https://docs.stimulusreflex.com
216
- homepage_uri: https://github.com/hopsoft/stimulus_reflex
217
- source_code_uri: https://github.com/hopsoft/stimulus_reflex
218
- post_install_message: |
219
- Friendly reminder: When updating the stimulus_reflex gem,
220
- don't forget to update your npm package as well.
222
+ homepage_uri: https://github.com/stimulusreflex/stimulus_reflex
223
+ source_code_uri: https://github.com/stimulusreflex/stimulus_reflex
224
+ post_install_message: |+
225
+ Get support for StimulusReflex and CableReady on Discord:
226
+
227
+ https://discord.gg/stimulus-reflex
221
228
 
222
- See https://www.npmjs.com/package/stimulus_reflex
223
229
  rdoc_options: []
224
230
  require_paths:
225
231
  - lib
@@ -234,18 +240,21 @@ required_rubygems_version: !ruby/object:Gem::Requirement
234
240
  - !ruby/object:Gem::Version
235
241
  version: 1.3.1
236
242
  requirements: []
237
- rubygems_version: 3.1.2
238
- signing_key:
243
+ rubygems_version: 3.1.6
244
+ signing_key:
239
245
  specification_version: 4
240
246
  summary: Build reactive applications with the Rails tooling you already know and love.
241
247
  test_files:
242
- - test/reflex_test.rb
243
- - test/test_helper.rb
244
248
  - test/generators/stimulus_reflex_generator_test.rb
245
- - test/tmp/app/reflexes/demo_reflex.rb
246
- - test/tmp/app/reflexes/application_reflex.rb
247
- - test/broadcasters/broadcaster_test.rb
248
- - test/broadcasters/selector_broadcaster_test.rb
249
+ - test/element_test.rb
249
250
  - test/broadcasters/page_broadcaster_test.rb
250
251
  - test/broadcasters/broadcaster_test_case.rb
252
+ - test/broadcasters/broadcaster_test.rb
253
+ - test/broadcasters/selector_broadcaster_test.rb
251
254
  - test/broadcasters/nothing_broadcaster_test.rb
255
+ - test/reflex_test.rb
256
+ - test/test_helper.rb
257
+ - test/callbacks_test.rb
258
+ - test/tmp/app/reflexes/demo_reflex.rb
259
+ - test/tmp/app/reflexes/application_reflex.rb
260
+ - test/concern_enhancer_test.rb