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
@@ -0,0 +1,652 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "test_helper"
4
+
5
+ # standard:disable Lint/ConstantDefinitionInBlock
6
+
7
+ class CallbacksTest < ActionCable::Channel::TestCase
8
+ tests StimulusReflex::Channel
9
+
10
+ setup do
11
+ stub_connection(session_id: SecureRandom.uuid)
12
+ def connection.env
13
+ @env ||= {}
14
+ end
15
+ end
16
+
17
+ test "basic before_reflex works" do
18
+ class BeforeCallbackReflex < StimulusReflex::Reflex
19
+ before_reflex :init_counter
20
+
21
+ def increment
22
+ @count += 1
23
+ end
24
+
25
+ private
26
+
27
+ def init_counter
28
+ @count = 5
29
+ end
30
+ end
31
+
32
+ reflex = BeforeCallbackReflex.new(subscribe, url: "https://test.stimulusreflex.com", method_name: :increment)
33
+ reflex.process(:increment)
34
+ assert_equal 6, reflex.instance_variable_get("@count")
35
+ end
36
+
37
+ test "before_reflex with block works" do
38
+ class BeforeBlockCallbackReflex < StimulusReflex::Reflex
39
+ before_reflex do
40
+ @count = 5
41
+ end
42
+
43
+ def increment
44
+ @count += 1
45
+ end
46
+ end
47
+
48
+ reflex = BeforeBlockCallbackReflex.new(subscribe, url: "https://test.stimulusreflex.com", method_name: :increment)
49
+ reflex.process(:increment)
50
+ assert_equal 6, reflex.instance_variable_get("@count")
51
+ end
52
+
53
+ test "basic after_reflex works" do
54
+ class AfterCallbackReflex < StimulusReflex::Reflex
55
+ after_reflex :reset
56
+
57
+ def increment
58
+ @count = 5
59
+ end
60
+
61
+ private
62
+
63
+ def reset
64
+ @count = 1
65
+ end
66
+ end
67
+
68
+ reflex = AfterCallbackReflex.new(subscribe, url: "https://test.stimulusreflex.com", method_name: :increment)
69
+ reflex.process(:increment)
70
+ assert_equal 1, reflex.instance_variable_get("@count")
71
+ end
72
+
73
+ test "after_reflex with block works" do
74
+ class AfterBlockCallbackReflex < StimulusReflex::Reflex
75
+ after_reflex do
76
+ @count = 1
77
+ end
78
+
79
+ def increment
80
+ @count = 5
81
+ end
82
+ end
83
+
84
+ reflex = AfterBlockCallbackReflex.new(subscribe, url: "https://test.stimulusreflex.com", method_name: :increment)
85
+ reflex.process(:increment)
86
+ assert_equal 1, reflex.instance_variable_get("@count")
87
+ end
88
+
89
+ test "basic around_reflex works" do
90
+ class AroundCallbackReflex < StimulusReflex::Reflex
91
+ around_reflex :around
92
+
93
+ def increment
94
+ @count += 8
95
+ end
96
+
97
+ private
98
+
99
+ def around
100
+ @count = 2
101
+ yield
102
+ @count += 4
103
+ end
104
+ end
105
+
106
+ reflex = AroundCallbackReflex.new(subscribe, url: "https://test.stimulusreflex.com", method_name: :increment)
107
+ reflex.process(:increment)
108
+ assert_equal 14, reflex.instance_variable_get("@count")
109
+ end
110
+
111
+ test "execute methods in order" do
112
+ class CallbackOrderReflex < StimulusReflex::Reflex
113
+ before_reflex :one
114
+ before_reflex :two, :three
115
+
116
+ def increment
117
+ end
118
+
119
+ private
120
+
121
+ def one
122
+ @count = 1
123
+ end
124
+
125
+ def two
126
+ @count = 2 if @count == 1
127
+ end
128
+
129
+ def three
130
+ @count = 3 if @count == 2
131
+ end
132
+ end
133
+
134
+ reflex = CallbackOrderReflex.new(subscribe, url: "https://test.stimulusreflex.com", method_name: :increment)
135
+ reflex.process(:increment)
136
+ assert_equal 3, reflex.instance_variable_get("@count")
137
+ end
138
+
139
+ test "basic if option works" do
140
+ class IfCallbackReflex < StimulusReflex::Reflex
141
+ before_reflex :init, if: :present
142
+ around_reflex :around, if: :blank
143
+ after_reflex :after, if: :present
144
+
145
+ def increment
146
+ @count += 8
147
+ end
148
+
149
+ private
150
+
151
+ def present
152
+ true
153
+ end
154
+
155
+ def blank
156
+ false
157
+ end
158
+
159
+ def init
160
+ @count = 5
161
+ end
162
+
163
+ def around
164
+ @count += 2
165
+ yield
166
+ @count += 4
167
+ end
168
+
169
+ def after
170
+ @count += 10
171
+ end
172
+ end
173
+
174
+ reflex = IfCallbackReflex.new(subscribe, url: "https://test.stimulusreflex.com", method_name: :increment)
175
+ reflex.process(:increment)
176
+ assert_equal 23, reflex.instance_variable_get("@count")
177
+ end
178
+
179
+ test "if option with proc/lambda works" do
180
+ class IfProcCallbackReflex < StimulusReflex::Reflex
181
+ before_reflex :init, if: -> { true }
182
+ around_reflex :around, if: lambda { false }
183
+ after_reflex :after, if: proc { true }
184
+
185
+ def increment
186
+ @count += 8
187
+ end
188
+
189
+ private
190
+
191
+ def init
192
+ @count = 5
193
+ end
194
+
195
+ def around
196
+ @count += 2
197
+ yield
198
+ @count += 4
199
+ end
200
+
201
+ def after
202
+ @count += 10
203
+ end
204
+ end
205
+
206
+ reflex = IfProcCallbackReflex.new(subscribe, url: "https://test.stimulusreflex.com", method_name: :increment)
207
+ reflex.process(:increment)
208
+ assert_equal 23, reflex.instance_variable_get("@count")
209
+ end
210
+
211
+ test "basic unless option works" do
212
+ class UnlessCallbackReflex < StimulusReflex::Reflex
213
+ before_reflex :init, unless: :blank
214
+ around_reflex :around, unless: :present
215
+ after_reflex :after, unless: :blank
216
+
217
+ def increment
218
+ @count += 8
219
+ end
220
+
221
+ private
222
+
223
+ def present
224
+ true
225
+ end
226
+
227
+ def blank
228
+ false
229
+ end
230
+
231
+ def init
232
+ @count = 5
233
+ end
234
+
235
+ def around
236
+ @count += 2
237
+ yield
238
+ @count += 4
239
+ end
240
+
241
+ def after
242
+ @count += 10
243
+ end
244
+ end
245
+
246
+ reflex = UnlessCallbackReflex.new(subscribe, url: "https://test.stimulusreflex.com", method_name: :increment)
247
+ reflex.process(:increment)
248
+ assert_equal 23, reflex.instance_variable_get("@count")
249
+ end
250
+
251
+ test "unless option with proc/lambda works" do
252
+ class UnlessProcCallbackReflex < StimulusReflex::Reflex
253
+ before_reflex :init, unless: -> { false }
254
+ around_reflex :around, unless: lambda { true }
255
+ after_reflex :after, unless: proc { false }
256
+
257
+ def increment
258
+ @count += 8
259
+ end
260
+
261
+ private
262
+
263
+ def init
264
+ @count = 5
265
+ end
266
+
267
+ def around
268
+ @count += 2
269
+ yield
270
+ @count += 4
271
+ end
272
+
273
+ def after
274
+ @count += 10
275
+ end
276
+ end
277
+
278
+ reflex = UnlessProcCallbackReflex.new(subscribe, url: "https://test.stimulusreflex.com", method_name: :increment)
279
+ reflex.process(:increment)
280
+ assert_equal 23, reflex.instance_variable_get("@count")
281
+ end
282
+
283
+ test "only option works" do
284
+ class OnlyCallbackReflex < StimulusReflex::Reflex
285
+ before_reflex :init
286
+ before_reflex :increment_bonus, only: :increment
287
+ before_reflex :decrement_bonus, only: [:decrement]
288
+
289
+ def increment
290
+ @count += 1
291
+ end
292
+
293
+ def decrement
294
+ @count -= 1
295
+ end
296
+
297
+ private
298
+
299
+ def init
300
+ @count = 0
301
+ end
302
+
303
+ def increment_bonus
304
+ @count += 5
305
+ end
306
+
307
+ def decrement_bonus
308
+ @count -= 7
309
+ end
310
+ end
311
+
312
+ reflex = OnlyCallbackReflex.new(subscribe, url: "https://test.stimulusreflex.com", method_name: :decrement)
313
+ reflex.process(:decrement)
314
+ assert_equal(-8, reflex.instance_variable_get("@count"))
315
+ end
316
+
317
+ test "except option works" do
318
+ class ExceptCallbackReflex < StimulusReflex::Reflex
319
+ before_reflex :init
320
+ before_reflex :increment_bonus, except: [:decrement]
321
+ before_reflex :decrement_bonus, except: :increment
322
+
323
+ def increment
324
+ @count += 1
325
+ end
326
+
327
+ def decrement
328
+ @count -= 1
329
+ end
330
+
331
+ private
332
+
333
+ def init
334
+ @count = 0
335
+ end
336
+
337
+ def increment_bonus
338
+ @count += 5
339
+ end
340
+
341
+ def decrement_bonus
342
+ @count -= 7
343
+ end
344
+ end
345
+
346
+ reflex = ExceptCallbackReflex.new(subscribe, url: "https://test.stimulusreflex.com", method_name: :increment)
347
+ reflex.process(:increment)
348
+ assert_equal 6, reflex.instance_variable_get("@count")
349
+
350
+ reflex = ExceptCallbackReflex.new(subscribe, url: "https://test.stimulusreflex.com", method_name: :decrement)
351
+ reflex.process(:decrement)
352
+ assert_equal(-8, reflex.instance_variable_get("@count"))
353
+ end
354
+
355
+ test "skip_before_reflex works" do
356
+ class SkipBeforeCallbackReflex < StimulusReflex::Reflex
357
+ before_reflex :blowup
358
+ before_reflex :init_counter
359
+ before_reflex :bonus
360
+
361
+ skip_before_reflex :blowup
362
+ skip_before_reflex :init_counter, if: -> { false }
363
+ skip_before_reflex :bonus, if: -> { true }
364
+
365
+ def increment
366
+ @count += 1
367
+ end
368
+
369
+ private
370
+
371
+ def blowup
372
+ raise StandardError
373
+ end
374
+
375
+ def init_counter
376
+ @count = 5
377
+ end
378
+
379
+ def bonus
380
+ @count += 100
381
+ end
382
+ end
383
+
384
+ reflex = SkipBeforeCallbackReflex.new(subscribe, url: "https://test.stimulusreflex.com", method_name: :increment)
385
+ reflex.process(:increment)
386
+ assert_equal 6, reflex.instance_variable_get("@count")
387
+ end
388
+
389
+ test "skip_after_reflex works" do
390
+ class SkipAfterCallbackReflex < StimulusReflex::Reflex
391
+ after_reflex :blowup
392
+ after_reflex :reset
393
+ after_reflex :clear
394
+
395
+ skip_after_reflex :blowup
396
+ skip_after_reflex :reset, if: -> { false }
397
+ skip_after_reflex :clear, if: -> { true }
398
+
399
+ def increment
400
+ @count = 0
401
+ end
402
+
403
+ private
404
+
405
+ def blowup
406
+ raise StandardError
407
+ end
408
+
409
+ def reset
410
+ @count += 1
411
+ end
412
+
413
+ def clear
414
+ @count += 10
415
+ end
416
+ end
417
+
418
+ reflex = SkipAfterCallbackReflex.new(subscribe, url: "https://test.stimulusreflex.com", method_name: :increment)
419
+ reflex.process(:increment)
420
+ assert_equal 1, reflex.instance_variable_get("@count")
421
+ end
422
+
423
+ test "skip_around_reflex works" do
424
+ class SkipAroundCallbackReflex < StimulusReflex::Reflex
425
+ around_reflex :blowup
426
+ around_reflex :around
427
+ around_reflex :bonus
428
+
429
+ skip_around_reflex :blowup
430
+ skip_around_reflex :around, if: -> { false }
431
+ skip_around_reflex :bonus, if: -> { true }
432
+
433
+ def increment
434
+ @count += 2
435
+ end
436
+
437
+ private
438
+
439
+ def blowup
440
+ raise StandardError
441
+ end
442
+
443
+ def around
444
+ @count = 1
445
+ yield
446
+ @count += 4
447
+ end
448
+
449
+ def bonus
450
+ @count += 100
451
+ yield
452
+ @count += 1000
453
+ end
454
+ end
455
+
456
+ reflex = SkipAroundCallbackReflex.new(subscribe, url: "https://test.stimulusreflex.com", method_name: :increment)
457
+ reflex.process(:increment)
458
+ assert_equal 7, reflex.instance_variable_get("@count")
459
+ end
460
+
461
+ test "skip_before_reflex works in inherited reflex" do
462
+ class SkipApplicationReflex < StimulusReflex::Reflex
463
+ before_reflex :blowup
464
+ before_reflex :init_counter
465
+
466
+ private
467
+
468
+ def blowup
469
+ raise StandardError
470
+ end
471
+
472
+ def init_counter
473
+ @count = 5
474
+ end
475
+ end
476
+
477
+ class InheritedSkipApplicationReflex < SkipApplicationReflex
478
+ skip_before_reflex :blowup
479
+
480
+ def increment
481
+ @count += 1
482
+ end
483
+ end
484
+
485
+ reflex = InheritedSkipApplicationReflex.new(subscribe, url: "https://test.stimulusreflex.com", method_name: :increment)
486
+ reflex.process(:increment)
487
+ assert_equal 6, reflex.instance_variable_get("@count")
488
+ end
489
+
490
+ test "basic prepend_before_reflex works" do
491
+ class SimplePrependBeforeCallbackReflex < StimulusReflex::Reflex
492
+ before_reflex :two
493
+ prepend_before_reflex :one
494
+
495
+ def increment
496
+ @count += 1 if @count == 2
497
+ end
498
+
499
+ private
500
+
501
+ def one
502
+ @count = 1
503
+ end
504
+
505
+ def two
506
+ @count += 1 if @count == 1
507
+ end
508
+ end
509
+
510
+ reflex = SimplePrependBeforeCallbackReflex.new(subscribe, url: "https://test.stimulusreflex.com", method_name: :increment)
511
+ reflex.process(:increment)
512
+ assert_equal 3, reflex.instance_variable_get("@count")
513
+ end
514
+
515
+ test "prepend_before_reflex with block works" do
516
+ class BlockPrependBeforeCallbackReflex < StimulusReflex::Reflex
517
+ before_reflex do
518
+ @count += 1 if @count == 1
519
+ end
520
+
521
+ prepend_before_reflex do
522
+ @count = 1
523
+ end
524
+
525
+ def increment
526
+ @count += 1 if @count == 2
527
+ end
528
+ end
529
+
530
+ reflex = BlockPrependBeforeCallbackReflex.new(subscribe, url: "https://test.stimulusreflex.com", method_name: :increment)
531
+ reflex.process(:increment)
532
+ assert_equal 3, reflex.instance_variable_get("@count")
533
+ end
534
+
535
+ test "basic prepend_before_reflex works in inherited reflex" do
536
+ class PrependBeforeCallbackReflex < StimulusReflex::Reflex
537
+ before_reflex :two
538
+
539
+ def increment
540
+ @count += 5 if @count == 4
541
+ end
542
+
543
+ private
544
+
545
+ def two
546
+ @count += 3 if @count == 1
547
+ end
548
+ end
549
+
550
+ class InheritedPrependBeforeCallbackReflex < PrependBeforeCallbackReflex
551
+ prepend_before_reflex :one
552
+
553
+ private
554
+
555
+ def one
556
+ @count = 1
557
+ end
558
+ end
559
+
560
+ reflex = InheritedPrependBeforeCallbackReflex.new(subscribe, url: "https://test.stimulusreflex.com", method_name: :increment)
561
+ reflex.process(:increment)
562
+ assert_equal 9, reflex.instance_variable_get("@count")
563
+ end
564
+
565
+ test "basic prepend_around_reflex works" do
566
+ class SimplePrependAroundCallbackReflex < StimulusReflex::Reflex
567
+ around_reflex :two
568
+ prepend_around_reflex :one
569
+
570
+ def increment
571
+ @count += 10
572
+ end
573
+
574
+ private
575
+
576
+ def one
577
+ @count = 1
578
+ yield
579
+ @count += 3 if @count == 23
580
+ end
581
+
582
+ def two
583
+ @count += 5 if @count == 1
584
+ yield
585
+ @count += 7 if @count == 16
586
+ end
587
+ end
588
+
589
+ reflex = SimplePrependAroundCallbackReflex.new(subscribe, url: "https://test.stimulusreflex.com", method_name: :increment)
590
+ reflex.process(:increment)
591
+ assert_equal 26, reflex.instance_variable_get("@count")
592
+ end
593
+
594
+ test "basic prepend_after_reflex works" do
595
+ class SimplePrependAfterCallbackReflex < StimulusReflex::Reflex
596
+ after_reflex :two
597
+ prepend_after_reflex :one
598
+
599
+ def increment
600
+ @count = 1
601
+ end
602
+
603
+ private
604
+
605
+ def one
606
+ @count += 3 if @count == 6
607
+ end
608
+
609
+ def two
610
+ @count += 5 if @count == 1
611
+ end
612
+ end
613
+
614
+ reflex = SimplePrependAfterCallbackReflex.new(subscribe, url: "https://test.stimulusreflex.com", method_name: :increment)
615
+ reflex.process(:increment)
616
+ assert_equal 9, reflex.instance_variable_get("@count")
617
+ end
618
+
619
+ test "append before_, around_ and after_reflex works" do
620
+ class AppendCallbackReflex < StimulusReflex::Reflex
621
+ append_before_reflex :before
622
+ append_around_reflex :around
623
+ append_after_reflex :after
624
+
625
+ def increment
626
+ @count += 5 if @count == 4
627
+ end
628
+
629
+ private
630
+
631
+ def before
632
+ @count = 1 unless @counts
633
+ end
634
+
635
+ def around
636
+ @count += 3 if @count == 1
637
+ yield
638
+ @count += 9 if @count == 16
639
+ end
640
+
641
+ def after
642
+ @count += 7 if @count == 9
643
+ end
644
+ end
645
+
646
+ reflex = AppendCallbackReflex.new(subscribe, url: "https://test.stimulusreflex.com", method_name: :increment)
647
+ reflex.process(:increment)
648
+ assert_equal 25, reflex.instance_variable_get("@count")
649
+ end
650
+ end
651
+
652
+ # standard:enable Lint/ConstantDefinitionInBlock
@@ -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