stimulus_reflex 3.4.0.pre5 → 3.4.0

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 (37) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +78 -2
  3. data/Gemfile.lock +76 -73
  4. data/README.md +5 -8
  5. data/Rakefile +5 -5
  6. data/app/channels/stimulus_reflex/channel.rb +22 -0
  7. data/bin/console +1 -0
  8. data/lib/generators/stimulus_reflex/templates/app/javascript/controllers/%file_name%_controller.js.tt +14 -2
  9. data/lib/generators/stimulus_reflex/templates/app/javascript/controllers/application_controller.js.tt +10 -2
  10. data/lib/generators/stimulus_reflex/templates/app/reflexes/%file_name%_reflex.rb.tt +19 -9
  11. data/lib/generators/stimulus_reflex/templates/app/reflexes/application_reflex.rb.tt +2 -2
  12. data/lib/generators/stimulus_reflex/templates/config/initializers/stimulus_reflex.rb +10 -1
  13. data/lib/stimulus_reflex.rb +2 -1
  14. data/lib/stimulus_reflex/broadcasters/broadcaster.rb +2 -4
  15. data/lib/stimulus_reflex/broadcasters/page_broadcaster.rb +2 -1
  16. data/lib/stimulus_reflex/broadcasters/selector_broadcaster.rb +2 -2
  17. data/lib/stimulus_reflex/cable_ready_channels.rb +21 -0
  18. data/lib/stimulus_reflex/configuration.rb +2 -1
  19. data/lib/stimulus_reflex/reflex.rb +16 -6
  20. data/lib/stimulus_reflex/sanity_checker.rb +18 -4
  21. data/lib/stimulus_reflex/version.rb +1 -1
  22. data/lib/tasks/stimulus_reflex/install.rake +8 -3
  23. data/package.json +3 -3
  24. data/stimulus_reflex.gemspec +3 -1
  25. data/tags +95 -37
  26. data/test/broadcasters/broadcaster_test.rb +3 -6
  27. data/test/broadcasters/broadcaster_test_case.rb +15 -0
  28. data/test/broadcasters/nothing_broadcaster_test.rb +27 -26
  29. data/test/broadcasters/page_broadcaster_test.rb +56 -50
  30. data/test/broadcasters/selector_broadcaster_test.rb +57 -83
  31. data/test/reflex_test.rb +32 -0
  32. data/test/test_helper.rb +43 -2
  33. data/test/tmp/app/reflexes/application_reflex.rb +2 -2
  34. data/test/tmp/app/reflexes/demo_reflex.rb +34 -0
  35. data/yarn.lock +199 -226
  36. metadata +13 -8
  37. data/test/tmp/app/reflexes/posts_reflex.rb +0 -24
@@ -39,14 +39,22 @@ export default class extends Controller {
39
39
  }
40
40
 
41
41
  reflexSuccess (element, reflex, noop, reflexId) {
42
- // show success message etc...
42
+ // show success message
43
43
  }
44
44
 
45
45
  reflexError (element, reflex, error, reflexId) {
46
- // show error message etc...
46
+ // show error message
47
+ }
48
+
49
+ reflexHalted (element, reflex, error, reflexId) {
50
+ // handle aborted Reflex action
47
51
  }
48
52
 
49
53
  afterReflex (element, reflex, noop, reflexId) {
50
54
  // document.body.classList.remove('wait')
51
55
  }
56
+
57
+ finalizeReflex (element, reflex, noop, reflexId) {
58
+ // all operations have completed, animation etc is now safe
59
+ }
52
60
  }
@@ -3,24 +3,34 @@
3
3
  class <%= class_name %>Reflex < ApplicationReflex
4
4
  # Add Reflex methods in this file.
5
5
  #
6
- # All Reflex instances expose the following properties:
6
+ # All Reflex instances include CableReady::Broadcaster and expose the following properties:
7
7
  #
8
- # - connection - the ActionCable connection
9
- # - channel - the ActionCable channel
10
- # - request - an ActionDispatch::Request proxy for the socket connection
11
- # - session - the ActionDispatch::Session store for the current visitor
12
- # - url - the URL of the page that triggered the reflex
13
- # - element - a Hash like object that represents the HTML element that triggered the reflex
14
- # - params - parameters from the element's closest form (if any)
8
+ # - connection - the ActionCable connection
9
+ # - channel - the ActionCable channel
10
+ # - request - an ActionDispatch::Request proxy for the socket connection
11
+ # - session - the ActionDispatch::Session store for the current visitor
12
+ # - flash - the ActionDispatch::Flash::FlashHash for the current request
13
+ # - url - the URL of the page that triggered the reflex
14
+ # - params - parameters from the element's closest form (if any)
15
+ # - element - a Hash like object that represents the HTML element that triggered the reflex
16
+ # - signed - use a signed Global ID to map dataset attribute to a model eg. element.signed[:foo]
17
+ # - unsigned - use an unsigned Global ID to map dataset attribute to a model eg. element.unsigned[:foo]
18
+ # - cable_ready - a special cable_ready that can broadcast to the current visitor (no brackets needed)
19
+ # - reflex_id - a UUIDv4 that uniquely identies each Reflex
15
20
  #
16
21
  # Example:
17
22
  #
23
+ # before_reflex do
24
+ # # throw :abort # this will prevent the Reflex from continuing
25
+ # # learn more about callbacks at https://docs.stimulusreflex.com/lifecycle
26
+ # end
27
+ #
18
28
  # def example(argument=true)
19
29
  # # Your logic here...
20
30
  # # Any declared instance variables will be made available to the Rails controller and view.
21
31
  # end
22
32
  #
23
- # Learn more at: https://docs.stimulusreflex.com
33
+ # Learn more at: https://docs.stimulusreflex.com/reflexes#reflex-classes
24
34
 
25
35
  <% actions.each do |action| -%>
26
36
  def <%= action %>
@@ -1,12 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class ApplicationReflex < StimulusReflex::Reflex
4
- # Put application wide Reflex behavior in this file.
4
+ # Put application-wide Reflex behavior and callbacks in this file.
5
5
  #
6
6
  # Example:
7
7
  #
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
11
+ # Learn more at: https://docs.stimulusreflex.com/reflexes#reflex-classes
12
12
  end
@@ -12,9 +12,18 @@ StimulusReflex.configure do |config|
12
12
 
13
13
  # Customize server-side Reflex logging format, with optional colorization:
14
14
  # Available tokens: session_id, session_id_full, reflex_info, operation, reflex_id, reflex_id_full, mode, selector, operation_counter, connection_id, connection_id_full, timestamp
15
- # Available colors: green, yellow, blue, magenta, cyan, white
15
+ # Available colors: red, green, yellow, blue, magenta, cyan, white
16
16
  # You can also use attributes from your ActionCable Connection's identifiers that resolve to valid ActiveRecord models
17
17
  # eg. if your connection is `identified_by :current_user` and your User model has an email attribute, you can access r.email (it will display `-` if the user isn't logged in)
18
+ # Learn more at: https://docs.stimulusreflex.com/troubleshooting#stimulusreflex-logging
18
19
 
19
20
  # config.logging = proc { "[#{session_id}] #{operation_counter.magenta} #{reflex_info.green} -> #{selector.cyan} via #{mode} Morph (#{operation.yellow})" }
21
+
22
+ # Optimized for speed, StimulusReflex doesn't enable Rack middleware by default.
23
+ # If you are using Page Morphs and your app uses Rack middleware to rewrite part of the request path, you must enable those middleware modules in StimulusReflex.
24
+ #
25
+ # Learn more about registering Rack middleware in Rails here: https://guides.rubyonrails.org/rails_on_rack.html#configuring-middleware-stack
26
+
27
+ # config.middleware.use FirstRackMiddleware
28
+ # config.middleware.use SecondRackMiddleware
20
29
  end
@@ -9,6 +9,7 @@ require "action_cable"
9
9
  require "nokogiri"
10
10
  require "cable_ready"
11
11
  require "stimulus_reflex/version"
12
+ require "stimulus_reflex/cable_ready_channels"
12
13
  require "stimulus_reflex/configuration"
13
14
  require "stimulus_reflex/reflex"
14
15
  require "stimulus_reflex/element"
@@ -23,7 +24,7 @@ require "stimulus_reflex/logger"
23
24
  module StimulusReflex
24
25
  class Engine < Rails::Engine
25
26
  initializer "stimulus_reflex.sanity_check" do
26
- SanityChecker.check!
27
+ SanityChecker.check! unless Rails.env.production?
27
28
  end
28
29
  end
29
30
  end
@@ -2,10 +2,8 @@
2
2
 
3
3
  module StimulusReflex
4
4
  class Broadcaster
5
- include CableReady::Broadcaster
6
-
7
5
  attr_reader :reflex, :logger, :operations
8
- delegate :permanent_attribute_name, :stream_name, to: :reflex
6
+ delegate :cable_ready, :permanent_attribute_name, to: :reflex
9
7
 
10
8
  def initialize(reflex)
11
9
  @reflex = reflex
@@ -28,7 +26,7 @@ module StimulusReflex
28
26
  def broadcast_message(subject:, body: nil, data: {}, error: nil)
29
27
  logger.error "\e[31m#{body}\e[0m" if subject == "error"
30
28
  operations << ["document", :dispatch_event]
31
- cable_ready[stream_name].dispatch_event(
29
+ cable_ready.dispatch_event(
32
30
  name: "stimulus-reflex:server-message",
33
31
  detail: {
34
32
  reflexId: data["reflexId"],
@@ -13,7 +13,7 @@ module StimulusReflex
13
13
  selectors.each do |selector|
14
14
  operations << [selector, :morph]
15
15
  html = document.css(selector).inner_html
16
- cable_ready[stream_name].morph(
16
+ cable_ready.morph(
17
17
  selector: selector,
18
18
  html: html,
19
19
  children_only: true,
@@ -23,6 +23,7 @@ module StimulusReflex
23
23
  })
24
24
  )
25
25
  end
26
+
26
27
  cable_ready.broadcast
27
28
  end
28
29
 
@@ -12,7 +12,7 @@ module StimulusReflex
12
12
  match = fragment.at_css(selector)
13
13
  if match.present?
14
14
  operations << [selector, :morph]
15
- cable_ready[stream_name].morph(
15
+ cable_ready.morph(
16
16
  selector: selector,
17
17
  html: match.inner_html,
18
18
  children_only: true,
@@ -23,7 +23,7 @@ module StimulusReflex
23
23
  )
24
24
  else
25
25
  operations << [selector, :inner_html]
26
- cable_ready[stream_name].inner_html(
26
+ cable_ready.inner_html(
27
27
  selector: selector,
28
28
  html: fragment.to_html,
29
29
  stimulus_reflex: data.merge({
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module StimulusReflex
4
+ class CableReadyChannels
5
+ stimulus_reflex_channel_methods = CableReady::Channels.instance.operations.keys + [:broadcast, :broadcast_to]
6
+ delegate(*stimulus_reflex_channel_methods, to: "stimulus_reflex_channel")
7
+ delegate :[], to: "cable_ready_channels"
8
+
9
+ def initialize(stream_name)
10
+ @stream_name = stream_name
11
+ end
12
+
13
+ def cable_ready_channels
14
+ CableReady::Channels.instance
15
+ end
16
+
17
+ def stimulus_reflex_channel
18
+ CableReady::Channels.instance[@stream_name]
19
+ end
20
+ end
21
+ end
@@ -14,7 +14,7 @@ module StimulusReflex
14
14
  end
15
15
 
16
16
  class Configuration
17
- attr_accessor :on_failed_sanity_checks, :parent_channel, :logging
17
+ attr_accessor :on_failed_sanity_checks, :parent_channel, :logging, :middleware
18
18
 
19
19
  DEFAULT_LOGGING = proc { "[#{session_id}] #{operation_counter.magenta} #{reflex_info.green} -> #{selector.cyan} via #{mode} Morph (#{operation.yellow})" }
20
20
 
@@ -22,6 +22,7 @@ module StimulusReflex
22
22
  @on_failed_sanity_checks = :exit
23
23
  @parent_channel = "ApplicationCable::Channel"
24
24
  @logging = DEFAULT_LOGGING
25
+ @middleware = ActionDispatch::MiddlewareStack.new
25
26
  end
26
27
  end
27
28
  end
@@ -5,7 +5,6 @@ ClientAttributes = Struct.new(:reflex_id, :reflex_controller, :xpath, :c_xpath,
5
5
  class StimulusReflex::Reflex
6
6
  include ActiveSupport::Rescuable
7
7
  include ActiveSupport::Callbacks
8
- include CableReady::Broadcaster
9
8
 
10
9
  define_callbacks :process, skip_after_callbacks_if_terminated: true
11
10
 
@@ -45,14 +44,16 @@ class StimulusReflex::Reflex
45
44
  end
46
45
  end
47
46
 
48
- attr_reader :channel, :url, :element, :selectors, :method_name, :broadcaster, :client_attributes, :logger
47
+ attr_reader :cable_ready, :channel, :url, :element, :selectors, :method_name, :broadcaster, :client_attributes, :logger
49
48
 
50
49
  alias_method :action_name, :method_name # for compatibility with controller libraries like Pundit that expect an action name
51
50
 
52
51
  delegate :connection, :stream_name, to: :channel
53
- delegate :flash, :session, to: :request
52
+ delegate :controller_class, :flash, :session, to: :request
54
53
  delegate :broadcast, :broadcast_message, to: :broadcaster
55
54
  delegate :reflex_id, :reflex_controller, :xpath, :c_xpath, :permanent_attribute_name, to: :client_attributes
55
+ delegate :render, to: :controller_class
56
+ delegate :dom_id, to: "ActionView::RecordIdentifier"
56
57
 
57
58
  def initialize(channel, url: nil, element: nil, selectors: [], method_name: nil, params: {}, client_attributes: {})
58
59
  @channel = channel
@@ -64,6 +65,7 @@ class StimulusReflex::Reflex
64
65
  @broadcaster = StimulusReflex::PageBroadcaster.new(self)
65
66
  @logger = StimulusReflex::Logger.new(self)
66
67
  @client_attributes = ClientAttributes.new(client_attributes)
68
+ @cable_ready = StimulusReflex::CableReadyChannels.new(stream_name)
67
69
  self.params
68
70
  end
69
71
 
@@ -86,6 +88,14 @@ class StimulusReflex::Reflex
86
88
  )
87
89
 
88
90
  env = connection.env.merge(mock_env)
91
+
92
+ middleware = StimulusReflex.config.middleware
93
+
94
+ if middleware.any?
95
+ stack = middleware.build(Rails.application.routes)
96
+ stack.call(env)
97
+ end
98
+
89
99
  req = ActionDispatch::Request.new(env)
90
100
 
91
101
  path_params = Rails.application.routes.recognize_path_with_request(req, url, req.env[:extras] || {})
@@ -114,11 +124,11 @@ class StimulusReflex::Reflex
114
124
 
115
125
  def controller
116
126
  @controller ||= begin
117
- request.controller_class.new.tap do |c|
127
+ controller_class.new.tap do |c|
118
128
  c.instance_variable_set :"@stimulus_reflex", true
119
129
  instance_variables.each { |name| c.instance_variable_set name, instance_variable_get(name) }
120
- c.request = request
121
- c.response = ActionDispatch::Response.new
130
+ c.set_request! request
131
+ c.set_response! controller_class.make_response!(request)
122
132
  end
123
133
  end
124
134
  end
@@ -1,11 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class StimulusReflex::SanityChecker
4
+ NODE_VERSION_FORMAT = /(\d+\.\d+\.\d+.*):/
4
5
  JSON_VERSION_FORMAT = /(\d+\.\d+\.\d+.*)"/
5
6
 
6
7
  class << self
7
8
  def check!
8
9
  return if StimulusReflex.config.on_failed_sanity_checks == :ignore
10
+ return if called_by_installer?
9
11
  return if called_by_generate_config?
10
12
 
11
13
  instance = new
@@ -15,6 +17,12 @@ class StimulusReflex::SanityChecker
15
17
 
16
18
  private
17
19
 
20
+ def called_by_installer?
21
+ Rake.application.top_level_tasks.include? "stimulus_reflex:install"
22
+ rescue
23
+ false
24
+ end
25
+
18
26
  def called_by_generate_config?
19
27
  ARGV.include? "stimulus_reflex:config"
20
28
  end
@@ -79,6 +87,8 @@ class StimulusReflex::SanityChecker
79
87
  def find_javascript_package_version
80
88
  if (match = search_file(package_json_path, regex: /version/))
81
89
  match[JSON_VERSION_FORMAT, 1]
90
+ elsif (match = search_file(yarn_lock_path, regex: /^stimulus_reflex/))
91
+ match[NODE_VERSION_FORMAT, 1]
82
92
  end
83
93
  end
84
94
 
@@ -91,6 +101,10 @@ class StimulusReflex::SanityChecker
91
101
  Rails.root.join("node_modules", "stimulus_reflex", "package.json")
92
102
  end
93
103
 
104
+ def yarn_lock_path
105
+ Rails.root.join("yarn.lock")
106
+ end
107
+
94
108
  def initializer_path
95
109
  @_initializer_path ||= Rails.root.join("config", "initializers", "stimulus_reflex.rb")
96
110
  end
@@ -120,13 +134,13 @@ class StimulusReflex::SanityChecker
120
134
  puts <<~INFO
121
135
  If you know what you are doing and you want to start the application anyway,
122
136
  you can create a StimulusReflex initializer with the command:
123
-
137
+
124
138
  bundle exec rails generate stimulus_reflex:config
125
-
139
+
126
140
  Then open your initializer at
127
-
141
+
128
142
  <RAILS_ROOT>/config/initializers/stimulus_reflex.rb
129
-
143
+
130
144
  and then add the following directive:
131
145
 
132
146
  StimulusReflex.configure do |config|
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module StimulusReflex
4
- VERSION = "3.4.0.pre5"
4
+ VERSION = "3.4.0"
5
5
  end
@@ -6,9 +6,10 @@ require "stimulus_reflex/version"
6
6
  namespace :stimulus_reflex do
7
7
  desc "Install StimulusReflex in this application"
8
8
  task install: :environment do
9
- system "bundle exec rails webpacker:install:stimulus"
9
+ system "rails dev:cache" unless Rails.root.join("tmp", "caching-dev.txt").exist?
10
10
  gem_version = StimulusReflex::VERSION.gsub(".pre", "-pre")
11
11
  system "yarn add stimulus_reflex@#{gem_version}"
12
+ system "bundle exec rails webpacker:install:stimulus"
12
13
  main_folder = defined?(Webpacker) ? Webpacker.config.source_path.to_s.gsub("#{Rails.root}/", "") : "app/javascript"
13
14
 
14
15
  FileUtils.mkdir_p Rails.root.join("#{main_folder}/controllers"), verbose: true
@@ -39,7 +40,7 @@ namespace :stimulus_reflex do
39
40
 
40
41
  unless lines.find { |line| line.start_with?("import controller") }
41
42
  matches = lines.select { |line| line =~ /\A(require|import)/ }
42
- lines.insert lines.index(matches.last).to_i + 1, "import controller from './application_controller'\n"
43
+ lines.insert lines.index(matches.last).to_i + 1, "import controller from '../controllers/application_controller'\n"
43
44
  end
44
45
 
45
46
  initialize_line = lines.find { |line| line.start_with?("StimulusReflex.initialize") }
@@ -67,6 +68,10 @@ namespace :stimulus_reflex do
67
68
  system "bundle exec rails generate stimulus_reflex example"
68
69
  puts "Generating default StimulusReflex configuration file into your application config/initializers directory"
69
70
  system "bundle exec rails generate stimulus_reflex:config"
70
- system "rails dev:cache" unless Rails.root.join("tmp", "caching-dev.txt").exist?
71
+
72
+ puts
73
+ puts "StimulusReflex and CableReady have been successfully installed!"
74
+ puts "Go to https://docs.stimulusreflex.com/quickstart if you need help getting started."
75
+ puts
71
76
  end
72
77
  end
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "stimulus_reflex",
3
- "version": "3.4.0-pre4",
3
+ "version": "3.4.0-pre9",
4
4
  "description": "Build reactive applications with the Rails tooling you already know and love.",
5
5
  "keywords": [
6
6
  "ruby",
@@ -41,7 +41,7 @@
41
41
  },
42
42
  "dependencies": {
43
43
  "@rails/actioncable": ">= 6.0",
44
- "cable_ready": ">= 4.3.0"
44
+ "cable_ready": ">= 4.4"
45
45
  },
46
46
  "devDependencies": {
47
47
  "@babel/core": "^7.6.2",
@@ -52,6 +52,6 @@
52
52
  "jsdom": "^16.0.1",
53
53
  "mocha": "^8.0.1",
54
54
  "prettier-standard": "^16.1.0",
55
- "stimulus": "^1.1.1"
55
+ "stimulus": ">= 1.1"
56
56
  }
57
57
  }
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require File.expand_path("../lib/stimulus_reflex/version", __FILE__)
2
4
 
3
5
  Gem::Specification.new do |gem|
@@ -30,7 +32,7 @@ Gem::Specification.new do |gem|
30
32
  gem.add_dependency "nokogiri"
31
33
  gem.add_dependency "rails", ">= 5.2"
32
34
  gem.add_dependency "redis"
33
- gem.add_dependency "cable_ready", ">= 4.3.0"
35
+ gem.add_dependency "cable_ready", ">= 4.4"
34
36
 
35
37
  gem.add_development_dependency "bundler", "~> 2.0"
36
38
  gem.add_development_dependency "pry-nav"
data/tags CHANGED
@@ -4,95 +4,153 @@
4
4
  !_TAG_PROGRAM_NAME Exuberant Ctags //
5
5
  !_TAG_PROGRAM_URL http://ctags.sourceforge.net /official site/
6
6
  !_TAG_PROGRAM_VERSION 5.8 //
7
+ ActionDispatch test/test_helper.rb /^class ActionDispatch::Request$/;" c
8
+ ApplicationController test/test_helper.rb /^class ApplicationController < ActionController::Base; end$/;" c
7
9
  ApplicationReflex test/tmp/app/reflexes/application_reflex.rb /^class ApplicationReflex < StimulusReflex::Reflex$/;" c
8
10
  Broadcaster lib/stimulus_reflex/broadcasters/broadcaster.rb /^ class Broadcaster$/;" c class:StimulusReflex
9
- CompareXML lib/stimulus_reflex/compare_xml.rb /^module CompareXML$/;" m
11
+ CableReadyChannels lib/stimulus_reflex/cable_ready_channels.rb /^ class CableReadyChannels$/;" c class:StimulusReflex
12
+ Colorize lib/stimulus_reflex/utils/colorize.rb /^ module Colorize$/;" m class:StimulusReflex.Utils
13
+ ConfigGenerator lib/generators/stimulus_reflex/config_generator.rb /^ class ConfigGenerator < Rails::Generators::Base$/;" c class:StimulusReflex
14
+ Configuration lib/stimulus_reflex/configuration.rb /^ class Configuration$/;" c
10
15
  Engine lib/stimulus_reflex.rb /^ class Engine < Rails::Engine$/;" c class:StimulusReflex
16
+ Logger lib/stimulus_reflex/logger.rb /^ class Logger$/;" c class:StimulusReflex
11
17
  NothingBroadcaster lib/stimulus_reflex/broadcasters/nothing_broadcaster.rb /^ class NothingBroadcaster < Broadcaster$/;" c class:StimulusReflex
12
18
  PageBroadcaster lib/stimulus_reflex/broadcasters/page_broadcaster.rb /^ class PageBroadcaster < Broadcaster$/;" c class:StimulusReflex
13
19
  SelectorBroadcaster lib/stimulus_reflex/broadcasters/selector_broadcaster.rb /^ class SelectorBroadcaster < Broadcaster$/;" c class:StimulusReflex
20
+ SessionMock test/test_helper.rb /^class SessionMock$/;" c
21
+ StimulusReflex app/channels/stimulus_reflex/channel.rb /^class StimulusReflex::Channel < StimulusReflex.configuration.parent_channel.constantize$/;" c
22
+ StimulusReflex lib/generators/stimulus_reflex/config_generator.rb /^module StimulusReflex$/;" m
14
23
  StimulusReflex lib/stimulus_reflex.rb /^module StimulusReflex$/;" m
15
24
  StimulusReflex lib/stimulus_reflex/broadcasters/broadcaster.rb /^module StimulusReflex$/;" m
16
25
  StimulusReflex lib/stimulus_reflex/broadcasters/nothing_broadcaster.rb /^module StimulusReflex$/;" m
17
26
  StimulusReflex lib/stimulus_reflex/broadcasters/page_broadcaster.rb /^module StimulusReflex$/;" m
18
27
  StimulusReflex lib/stimulus_reflex/broadcasters/selector_broadcaster.rb /^module StimulusReflex$/;" m
19
- StimulusReflex lib/stimulus_reflex/channel.rb /^class StimulusReflex::Channel < ActionCable::Channel::Base$/;" c
28
+ StimulusReflex lib/stimulus_reflex/cable_ready_channels.rb /^module StimulusReflex$/;" m
29
+ StimulusReflex lib/stimulus_reflex/configuration.rb /^module StimulusReflex$/;" m
20
30
  StimulusReflex lib/stimulus_reflex/element.rb /^class StimulusReflex::Element < OpenStruct$/;" c
31
+ StimulusReflex lib/stimulus_reflex/logger.rb /^module StimulusReflex$/;" m
21
32
  StimulusReflex lib/stimulus_reflex/reflex.rb /^class StimulusReflex::Reflex$/;" c
33
+ StimulusReflex lib/stimulus_reflex/sanity_checker.rb /^class StimulusReflex::SanityChecker$/;" c
34
+ StimulusReflex lib/stimulus_reflex/utils/colorize.rb /^module StimulusReflex$/;" m
22
35
  StimulusReflex lib/stimulus_reflex/version.rb /^module StimulusReflex$/;" m
23
- StimulusReflexGenerator lib/generators/stimulus_reflex_generator.rb /^class StimulusReflexGenerator < Rails::Generators::NamedBase$/;" c
36
+ StimulusReflex test/broadcasters/broadcaster_test.rb /^class StimulusReflex::BroadcasterTest < StimulusReflex::BroadcasterTestCase$/;" c
37
+ StimulusReflex test/broadcasters/broadcaster_test_case.rb /^class StimulusReflex::BroadcasterTestCase < ActionCable::Channel::TestCase$/;" c
38
+ StimulusReflex test/broadcasters/nothing_broadcaster_test.rb /^class StimulusReflex::NothingBroadcasterTest < StimulusReflex::BroadcasterTestCase$/;" c
39
+ StimulusReflex test/broadcasters/page_broadcaster_test.rb /^class StimulusReflex::PageBroadcasterTest < StimulusReflex::BroadcasterTestCase$/;" c
40
+ StimulusReflex test/reflex_test.rb /^class StimulusReflex::ReflexTest < ActionCable::Channel::TestCase$/;" c
41
+ StimulusReflexGenerator lib/generators/stimulus_reflex/stimulus_reflex_generator.rb /^class StimulusReflexGenerator < Rails::Generators::NamedBase$/;" c
24
42
  StimulusReflexGeneratorTest test/generators/stimulus_reflex_generator_test.rb /^class StimulusReflexGeneratorTest < Rails::Generators::TestCase$/;" c
43
+ TestApp test/test_helper.rb /^class TestApp < Rails::Application$/;" c
44
+ TestController test/test_helper.rb /^class TestController < ApplicationController$/;" c
25
45
  UserReflex test/tmp/app/reflexes/user_reflex.rb /^class UserReflex < ApplicationReflex$/;" c
26
- addDifference lib/stimulus_reflex/compare_xml.rb /^ def addDifference(node1, node2, diff1, diff2, opts, differences)$/;" f class:CompareXML
46
+ Utils lib/stimulus_reflex/utils/colorize.rb /^ module Utils$/;" m class:StimulusReflex
27
47
  add_callback lib/stimulus_reflex/reflex.rb /^ def add_callback(kind, *args, &block)$/;" f class:StimulusReflex
28
48
  after_reflex lib/stimulus_reflex/reflex.rb /^ def after_reflex(*args, &block)$/;" f class:StimulusReflex
49
+ append_morph lib/stimulus_reflex/broadcasters/selector_broadcaster.rb /^ def append_morph(selectors, html)$/;" f class:StimulusReflex.SelectorBroadcaster
29
50
  around_reflex lib/stimulus_reflex/reflex.rb /^ def around_reflex(*args, &block)$/;" f class:StimulusReflex
30
- attrContentExcluded? lib/stimulus_reflex/compare_xml.rb /^ def attrContentExcluded?(a1, a2, opts)$/;" f class:CompareXML
31
- attrNameExcluded? lib/stimulus_reflex/compare_xml.rb /^ def attrNameExcluded?(a1, a2, opts)$/;" f class:CompareXML
32
- attrsExcluded? lib/stimulus_reflex/compare_xml.rb /^ def attrsExcluded?(a1, a2, opts)$/;" f class:CompareXML
33
51
  before_reflex lib/stimulus_reflex/reflex.rb /^ def before_reflex(*args, &block)$/;" f class:StimulusReflex
52
+ body test/broadcasters/page_broadcaster_test.rb /^ def body$/;" f
34
53
  broadcast lib/stimulus_reflex/broadcasters/broadcaster.rb /^ def broadcast(*args)$/;" f class:StimulusReflex.Broadcaster
35
54
  broadcast lib/stimulus_reflex/broadcasters/nothing_broadcaster.rb /^ def broadcast(_, data)$/;" f class:StimulusReflex.NothingBroadcaster
36
55
  broadcast lib/stimulus_reflex/broadcasters/page_broadcaster.rb /^ def broadcast(selectors, data)$/;" f class:StimulusReflex.PageBroadcaster
37
56
  broadcast lib/stimulus_reflex/broadcasters/selector_broadcaster.rb /^ def broadcast(_, data = {})$/;" f class:StimulusReflex.SelectorBroadcaster
38
- broadcast_message lib/stimulus_reflex/broadcasters/broadcaster.rb /^ def broadcast_message(subject:, body: nil, data: {})$/;" f class:StimulusReflex.Broadcaster
39
- collapse lib/stimulus_reflex/compare_xml.rb /^ def collapse(text)$/;" f class:CompareXML
40
- commit_session lib/stimulus_reflex/channel.rb /^ def commit_session(reflex)$/;" f class:StimulusReflex
41
- compareAttributeSets lib/stimulus_reflex/compare_xml.rb /^ def compareAttributeSets(n1, n2, a1_set, a2_set, opts, differences)$/;" f class:CompareXML
42
- compareAttributes lib/stimulus_reflex/compare_xml.rb /^ def compareAttributes(n1, n2, a1, a2, opts, differences, status = EQUIVALENT)$/;" f class:CompareXML
43
- compareChildren lib/stimulus_reflex/compare_xml.rb /^ def compareChildren(n1_set, n2_set, opts, differences, diffchildren = false, status = EQUIVALENT)$/;" f class:CompareXML
44
- compareCommentNodes lib/stimulus_reflex/compare_xml.rb /^ def compareCommentNodes(n1, n2, opts, differences, status = EQUIVALENT)$/;" f class:CompareXML
45
- compareDocumentNodes lib/stimulus_reflex/compare_xml.rb /^ def compareDocumentNodes(n1, n2, opts, differences, childopts = {}, diffchildren = false, status = EQUIVALENT)$/;" f class:CompareXML
46
- compareElementNodes lib/stimulus_reflex/compare_xml.rb /^ def compareElementNodes(n1, n2, opts, differences, childopts = {}, diffchildren = false, status = EQUIVALENT)$/;" f class:CompareXML
47
- compareNodes lib/stimulus_reflex/compare_xml.rb /^ def compareNodes(n1, n2, opts, differences, childopts = {}, diffchildren = false, status = EQUIVALENT)$/;" f class:CompareXML
48
- compareSortedAttributeSets lib/stimulus_reflex/compare_xml.rb /^ def compareSortedAttributeSets(n1, n2, a1_set, a2_set, opts, differences, status = EQUIVALENT)$/;" f class:CompareXML
49
- compareTextNodes lib/stimulus_reflex/compare_xml.rb /^ def compareTextNodes(n1, n2, opts, differences, status = EQUIVALENT)$/;" f class:CompareXML
50
- compareUnsortedAttributeSets lib/stimulus_reflex/compare_xml.rb /^ def compareUnsortedAttributeSets(n1, n2, a1_set, a2_set, opts, differences, status = EQUIVALENT)$/;" f class:CompareXML
57
+ broadcast_message lib/stimulus_reflex/broadcasters/broadcaster.rb /^ def broadcast_message(subject:, body: nil, data: {}, error: nil)$/;" f class:StimulusReflex.Broadcaster
58
+ cable_ready_channels lib/stimulus_reflex/cable_ready_channels.rb /^ def cable_ready_channels$/;" f class:StimulusReflex.CableReadyChannels
59
+ caching_enabled? lib/stimulus_reflex/sanity_checker.rb /^ def caching_enabled?$/;" f
60
+ called_by_generate_config? lib/stimulus_reflex/sanity_checker.rb /^ def called_by_generate_config?$/;" f class:StimulusReflex
61
+ called_by_installer? lib/stimulus_reflex/sanity_checker.rb /^ def called_by_installer?$/;" f class:StimulusReflex
62
+ check! lib/stimulus_reflex/sanity_checker.rb /^ def check!$/;" f class:StimulusReflex
63
+ check_caching_enabled lib/stimulus_reflex/sanity_checker.rb /^ def check_caching_enabled$/;" f
64
+ check_javascript_package_version lib/stimulus_reflex/sanity_checker.rb /^ def check_javascript_package_version$/;" f
65
+ commit_session app/channels/stimulus_reflex/channel.rb /^ def commit_session(reflex)$/;" f class:StimulusReflex
66
+ config_logging lib/stimulus_reflex/logger.rb /^ def config_logging$/;" f class:StimulusReflex.Logger
67
+ configuration lib/stimulus_reflex/configuration.rb /^ def configuration$/;" f class:StimulusReflex
68
+ configure lib/stimulus_reflex/configuration.rb /^ def configure$/;" f class:StimulusReflex
69
+ connection_id lib/stimulus_reflex/logger.rb /^ def connection_id$/;" f class:StimulusReflex.Logger
70
+ connection_id_full lib/stimulus_reflex/logger.rb /^ def connection_id_full$/;" f class:StimulusReflex.Logger
51
71
  controller lib/stimulus_reflex/reflex.rb /^ def controller$/;" f
52
- copy_application_files lib/generators/stimulus_reflex_generator.rb /^ def copy_application_files$/;" f class:StimulusReflexGenerator
72
+ copy_application_files lib/generators/stimulus_reflex/stimulus_reflex_generator.rb /^ def copy_application_files$/;" f class:StimulusReflexGenerator
73
+ copy_config_file lib/generators/stimulus_reflex/config_generator.rb /^ def copy_config_file$/;" f class:StimulusReflex.ConfigGenerator
53
74
  dataset lib/stimulus_reflex/element.rb /^ def dataset$/;" f class:StimulusReflex
54
75
  default_reflex lib/stimulus_reflex/reflex.rb /^ def default_reflex$/;" f
55
- delegate_call_to_reflex lib/stimulus_reflex/channel.rb /^ def delegate_call_to_reflex(reflex, method_name, arguments = [])$/;" f class:StimulusReflex
76
+ delegate_call_to_reflex app/channels/stimulus_reflex/channel.rb /^ def delegate_call_to_reflex(reflex, method_name, arguments = [])$/;" f class:StimulusReflex
56
77
  do_more_stuff test/tmp/app/reflexes/user_reflex.rb /^ def do_more_stuff$/;" f class:UserReflex
57
78
  do_stuff test/tmp/app/reflexes/user_reflex.rb /^ def do_stuff$/;" f class:UserReflex
58
- enqueue_message lib/stimulus_reflex/broadcasters/broadcaster.rb /^ def enqueue_message(subject:, body: nil, data: {})$/;" f class:StimulusReflex.Broadcaster
59
- equivalent? lib/stimulus_reflex/compare_xml.rb /^ def equivalent?(n1, n2, opts = {}, childopts = {}, diffchildren = false)$/;" f class:CompareXML
60
- error javascript/log.js /^function error (response) {$/;" f
61
- exception_message_with_backtrace lib/stimulus_reflex/channel.rb /^ def exception_message_with_backtrace(exception)$/;" f class:StimulusReflex
62
- execute lib/generators/stimulus_reflex_generator.rb /^ def execute$/;" f class:StimulusReflexGenerator
79
+ env test/broadcasters/broadcaster_test_case.rb /^ def connection.env$/;" F class:StimulusReflex
80
+ env test/reflex_test.rb /^ def connection.env$/;" F class:StimulusReflex
81
+ exception_message_with_backtrace app/channels/stimulus_reflex/channel.rb /^ def exception_message_with_backtrace(exception)$/;" f class:StimulusReflex
82
+ execute lib/generators/stimulus_reflex/stimulus_reflex_generator.rb /^ def execute$/;" f class:StimulusReflexGenerator
83
+ exit_with_info lib/stimulus_reflex/sanity_checker.rb /^ def exit_with_info$/;" f
63
84
  export.reflexAttribute javascript/schema.js /^ reflexAttribute: 'data-reflex',$/;" p
64
85
  export.reflexDatasetAttribute javascript/schema.js /^ reflexDatasetAttribute: 'data-reflex-dataset'$/;" p
65
86
  export.reflexPermanentAttribute javascript/schema.js /^ reflexPermanentAttribute: 'data-reflex-permanent',$/;" p
66
87
  export.reflexRootAttribute javascript/schema.js /^ reflexRootAttribute: 'data-reflex-root',$/;" p
67
88
  findConsumer javascript/consumer.js /^function findConsumer (object, depth = 0) {$/;" f
68
- function.success javascript/log.js /^function success (response, options = { halted: false }) {$/;" f
89
+ find_javascript_package_version lib/stimulus_reflex/sanity_checker.rb /^ def find_javascript_package_version$/;" f
90
+ fix_environment! app/channels/stimulus_reflex/channel.rb /^ def fix_environment!$/;" f class:StimulusReflex
91
+ function.error javascript/log.js /^function error (event) {$/;" f
92
+ gem_version lib/stimulus_reflex/sanity_checker.rb /^ def gem_version$/;" f
69
93
  halted? lib/stimulus_reflex/reflex.rb /^ def halted?$/;" f
94
+ index test/test_helper.rb /^ def index$/;" f class:TestController
70
95
  initialize lib/stimulus_reflex/broadcasters/broadcaster.rb /^ def initialize(reflex)$/;" f class:StimulusReflex.Broadcaster
96
+ initialize lib/stimulus_reflex/cable_ready_channels.rb /^ def initialize(stream_name)$/;" f class:StimulusReflex.CableReadyChannels
97
+ initialize lib/stimulus_reflex/configuration.rb /^ def initialize$/;" f class:Configuration
71
98
  initialize lib/stimulus_reflex/element.rb /^ def initialize(data = {})$/;" f class:StimulusReflex
72
- initialize lib/stimulus_reflex/reflex.rb /^ def initialize(channel, url: nil, element: nil, selectors: [], method_name: nil, permanent_attribute_name: nil, params: {})$/;" f
73
- is_reflex? lib/stimulus_reflex/channel.rb /^ def is_reflex?(reflex_class)$/;" f class:StimulusReflex
99
+ initialize lib/stimulus_reflex/logger.rb /^ def initialize(reflex)$/;" f class:StimulusReflex.Logger
100
+ initialize lib/stimulus_reflex/reflex.rb /^ def initialize(channel, url: nil, element: nil, selectors: [], method_name: nil, params: {}, client_attributes: {})$/;" f
101
+ initializer_path lib/stimulus_reflex/sanity_checker.rb /^ def initializer_path$/;" f
102
+ is_reflex? app/channels/stimulus_reflex/channel.rb /^ def is_reflex?(reflex_class)$/;" f class:StimulusReflex
103
+ javascript_package_version lib/stimulus_reflex/sanity_checker.rb /^ def javascript_package_version$/;" f
104
+ javascript_version_matches? lib/stimulus_reflex/sanity_checker.rb /^ def javascript_version_matches?$/;" f
105
+ load! test/test_helper.rb /^ def load!$/;" f class:SessionMock
106
+ method_missing lib/stimulus_reflex/logger.rb /^ def method_missing method$/;" f class:StimulusReflex.Logger
107
+ mode lib/stimulus_reflex/logger.rb /^ def mode$/;" f class:StimulusReflex.Logger
74
108
  morph lib/stimulus_reflex/reflex.rb /^ def morph(selectors, html = "")$/;" f
75
109
  morphs lib/stimulus_reflex/broadcasters/selector_broadcaster.rb /^ def morphs$/;" f class:StimulusReflex.SelectorBroadcaster
76
- nodeExcluded? lib/stimulus_reflex/compare_xml.rb /^ def nodeExcluded?(n, opts)$/;" f class:CompareXML
77
110
  normalize_callback_option! lib/stimulus_reflex/reflex.rb /^ def normalize_callback_option!(options, from, to)$/;" f class:StimulusReflex
78
111
  normalize_callback_options! lib/stimulus_reflex/reflex.rb /^ def normalize_callback_options!(options)$/;" f class:StimulusReflex
112
+ not_null_store? lib/stimulus_reflex/sanity_checker.rb /^ def not_null_store?$/;" f
79
113
  nothing? lib/stimulus_reflex/broadcasters/broadcaster.rb /^ def nothing?$/;" f class:StimulusReflex.Broadcaster
80
114
  nothing? lib/stimulus_reflex/broadcasters/nothing_broadcaster.rb /^ def nothing?$/;" f class:StimulusReflex.NothingBroadcaster
81
- object_with_indifferent_access lib/stimulus_reflex/channel.rb /^ def object_with_indifferent_access(object)$/;" f class:StimulusReflex
115
+ object_with_indifferent_access app/channels/stimulus_reflex/channel.rb /^ def object_with_indifferent_access(object)$/;" f class:StimulusReflex
116
+ operation lib/stimulus_reflex/logger.rb /^ def operation$/;" f class:StimulusReflex.Logger
117
+ operation_counter lib/stimulus_reflex/logger.rb /^ def operation_counter$/;" f class:StimulusReflex.Logger
118
+ package_json_path lib/stimulus_reflex/sanity_checker.rb /^ def package_json_path$/;" f
82
119
  page? lib/stimulus_reflex/broadcasters/broadcaster.rb /^ def page?$/;" f class:StimulusReflex.Broadcaster
83
120
  page? lib/stimulus_reflex/broadcasters/page_broadcaster.rb /^ def page?$/;" f class:StimulusReflex.PageBroadcaster
84
- page_cache lib/stimulus_reflex/channel.rb /^ def page_cache$/;" f class:StimulusReflex
85
121
  params lib/stimulus_reflex/reflex.rb /^ def params$/;" f
122
+ print lib/stimulus_reflex/logger.rb /^ def print$/;" f class:StimulusReflex.Logger
123
+ private_instance_methods lib/stimulus_reflex/logger.rb /^ def private_instance_methods$/;" f class:StimulusReflex.Logger
86
124
  process lib/stimulus_reflex/reflex.rb /^ def process(name, *args)$/;" f
87
- receive lib/stimulus_reflex/channel.rb /^ def receive(data)$/;" f class:StimulusReflex
125
+ receive app/channels/stimulus_reflex/channel.rb /^ def receive(data)$/;" f class:StimulusReflex
126
+ reflex javascript/lifecycle.js /^ const detail = { reflex: target, controller, reflexId }$/;" p
127
+ reflex_id lib/stimulus_reflex/logger.rb /^ def reflex_id$/;" f class:StimulusReflex.Logger
128
+ reflex_id_full lib/stimulus_reflex/logger.rb /^ def reflex_id_full$/;" f class:StimulusReflex.Logger
129
+ reflex_info lib/stimulus_reflex/logger.rb /^ def reflex_info$/;" f class:StimulusReflex.Logger
130
+ request javascript/log.js /^function request (reflexId, target, args, controller, element) {$/;" f
88
131
  request lib/stimulus_reflex/reflex.rb /^ def request$/;" f
132
+ request.success javascript/log.js /^function success (event) {$/;" f
133
+ respond_to_missing? lib/stimulus_reflex/logger.rb /^ def respond_to_missing? method$/;" f class:StimulusReflex.Logger
134
+ search_file lib/stimulus_reflex/sanity_checker.rb /^ def search_file(path, regex:)$/;" f
135
+ selector lib/stimulus_reflex/logger.rb /^ def selector$/;" f class:StimulusReflex.Logger
89
136
  selector? lib/stimulus_reflex/broadcasters/broadcaster.rb /^ def selector?$/;" f class:StimulusReflex.Broadcaster
90
137
  selector? lib/stimulus_reflex/broadcasters/selector_broadcaster.rb /^ def selector?$/;" f class:StimulusReflex.SelectorBroadcaster
91
- stream_name lib/stimulus_reflex/channel.rb /^ def stream_name$/;" f class:StimulusReflex
92
- subscribed lib/stimulus_reflex/channel.rb /^ def subscribed$/;" f class:StimulusReflex
138
+ session test/test_helper.rb /^ def session$/;" f class:ActionDispatch
139
+ session_id lib/stimulus_reflex/logger.rb /^ def session_id$/;" f class:StimulusReflex.Logger
140
+ session_id_full lib/stimulus_reflex/logger.rb /^ def session_id_full$/;" f class:StimulusReflex.Logger
141
+ signed lib/stimulus_reflex/element.rb /^ def signed$/;" f class:StimulusReflex
142
+ stimulus_reflex_channel lib/stimulus_reflex/cable_ready_channels.rb /^ def stimulus_reflex_channel$/;" f class:StimulusReflex.CableReadyChannels
143
+ stream_name app/channels/stimulus_reflex/channel.rb /^ def stream_name$/;" f class:StimulusReflex
144
+ subscribed app/channels/stimulus_reflex/channel.rb /^ def subscribed$/;" f class:StimulusReflex
145
+ timestamp lib/stimulus_reflex/logger.rb /^ def timestamp$/;" f class:StimulusReflex.Logger
146
+ to_s lib/stimulus_reflex/broadcasters/broadcaster.rb /^ def to_s$/;" f class:StimulusReflex.Broadcaster
147
+ to_s lib/stimulus_reflex/broadcasters/nothing_broadcaster.rb /^ def to_s$/;" f class:StimulusReflex.NothingBroadcaster
148
+ to_s lib/stimulus_reflex/broadcasters/page_broadcaster.rb /^ def to_s$/;" f class:StimulusReflex.PageBroadcaster
149
+ to_s lib/stimulus_reflex/broadcasters/selector_broadcaster.rb /^ def to_s$/;" f class:StimulusReflex.SelectorBroadcaster
93
150
  to_sym lib/stimulus_reflex/broadcasters/broadcaster.rb /^ def to_sym$/;" f class:StimulusReflex.Broadcaster
94
151
  to_sym lib/stimulus_reflex/broadcasters/nothing_broadcaster.rb /^ def to_sym$/;" f class:StimulusReflex.NothingBroadcaster
95
152
  to_sym lib/stimulus_reflex/broadcasters/page_broadcaster.rb /^ def to_sym$/;" f class:StimulusReflex.PageBroadcaster
96
153
  to_sym lib/stimulus_reflex/broadcasters/selector_broadcaster.rb /^ def to_sym$/;" f class:StimulusReflex.SelectorBroadcaster
154
+ unsigned lib/stimulus_reflex/element.rb /^ def unsigned$/;" f class:StimulusReflex
97
155
  update test/tmp/app/reflexes/user_reflex.rb /^ def update$/;" f class:UserReflex
98
- url_params lib/stimulus_reflex/reflex.rb /^ def url_params$/;" f
156
+ warn_and_exit lib/stimulus_reflex/sanity_checker.rb /^ def warn_and_exit(text)$/;" f