stimulus_reflex 3.3.0.pre1 → 3.3.0.pre6

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.

@@ -0,0 +1,80 @@
1
+ # frozen_string_literal: true
2
+
3
+ class StimulusReflex::SanityChecker
4
+ NODE_VERSION_FORMAT = /(\d+\.\d+\.\d+.*):/
5
+ JSON_VERSION_FORMAT = /(\d+\.\d+\.\d+.*)"/
6
+
7
+ def self.check!
8
+ instance = new
9
+ instance.check_caching_enabled
10
+ instance.check_javascript_package_version
11
+ end
12
+
13
+ def check_caching_enabled
14
+ unless caching_enabled?
15
+ puts <<~WARN
16
+ WARNING: Stimulus Reflex requires caching to be enabled. Caching allows the session to be modified during ActionCable requests.
17
+ To enable caching in development, run:
18
+ rails dev:cache
19
+ WARN
20
+ end
21
+ end
22
+
23
+ def check_javascript_package_version
24
+ if javascript_package_version.nil?
25
+ puts <<~WARN
26
+ WARNING: Can't locate the stimulus_reflex NPM package.
27
+ Either add it to your package.json as a dependency or use "yarn link stimulus_reflex" if you are doing development.
28
+ WARN
29
+ end
30
+
31
+ unless javascript_version_matches?
32
+ puts <<~WARN
33
+ WARNING: The Stimulus Reflex javascript package version (#{javascript_package_version}) does not match the Rubygem version (#{gem_version}).
34
+ To update the Stimulus Reflex npm package:
35
+ yarn upgrade stimulus_reflex@#{gem_version}
36
+ WARN
37
+ end
38
+ end
39
+
40
+ private
41
+
42
+ def caching_enabled?
43
+ Rails.application.config.action_controller.perform_caching &&
44
+ Rails.application.config.cache_store != :null_store
45
+ end
46
+
47
+ def javascript_version_matches?
48
+ javascript_package_version == gem_version
49
+ end
50
+
51
+ def gem_version
52
+ @_gem_version ||= StimulusReflex::VERSION.gsub(".pre", "-pre")
53
+ end
54
+
55
+ def javascript_package_version
56
+ return @_js_version if defined?(@_js_version)
57
+ @_js_version = find_javascript_package_version
58
+ end
59
+
60
+ def find_javascript_package_version
61
+ if (match = search_file(yarn_lock_path, regex: /^stimulus_reflex/))
62
+ match[NODE_VERSION_FORMAT, 1]
63
+ elsif (match = search_file(yarn_link_path, regex: /version/))
64
+ match[JSON_VERSION_FORMAT, 1]
65
+ end
66
+ end
67
+
68
+ def search_file(path, regex:)
69
+ return unless File.exist?(path)
70
+ File.foreach(path).grep(regex).first
71
+ end
72
+
73
+ def yarn_lock_path
74
+ Rails.root.join("yarn.lock")
75
+ end
76
+
77
+ def yarn_link_path
78
+ Rails.root.join("node_modules", "stimulus_reflex", "package.json")
79
+ end
80
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module StimulusReflex
4
- VERSION = "3.3.0.pre1"
4
+ VERSION = "3.3.0.pre6"
5
5
  end
@@ -1,12 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "fileutils"
4
+ require "stimulus_reflex/version"
4
5
 
5
6
  namespace :stimulus_reflex do
6
7
  desc "Install StimulusReflex in this application"
7
8
  task install: :environment do
8
9
  system "bundle exec rails webpacker:install:stimulus"
9
- system "yarn add stimulus_reflex"
10
+ gem_version = StimulusReflex::VERSION.gsub(".pre", "-pre")
11
+ system "yarn add stimulus_reflex@#{gem_version}"
10
12
 
11
13
  FileUtils.mkdir_p Rails.root.join("app/javascript/controllers"), verbose: true
12
14
  FileUtils.mkdir_p Rails.root.join("app/reflexes"), verbose: true
@@ -50,6 +52,16 @@ namespace :stimulus_reflex do
50
52
  File.open(filepath, "w") { |f| f.write lines.join }
51
53
  end
52
54
 
55
+ filepath = Rails.root.join("config/cable.yml")
56
+ lines = File.open(filepath, "r") { |f| f.readlines }
57
+ if lines[1].include?("adapter: async")
58
+ lines.delete_at 1
59
+ lines.insert 1, " adapter: redis\n"
60
+ lines.insert 2, " url: <%= ENV.fetch(\"REDIS_URL\") { \"redis://localhost:6379/1\" } %>\n"
61
+ lines.insert 3, " channel_prefix: " + Rails.application.class.module_parent.to_s.underscore + "_development\n"
62
+ File.open(filepath, "w") { |f| f.write lines.join }
63
+ end
64
+
53
65
  system "bundle exec rails generate stimulus_reflex example"
54
66
  system "rails dev:cache" unless Rails.root.join("tmp", "caching-dev.txt").exist?
55
67
  end
@@ -11,7 +11,7 @@ class StimulusReflexGeneratorTest < Rails::Generators::TestCase
11
11
  test "creates singular named controller and reflex files" do
12
12
  run_generator %w[demo]
13
13
  assert_file "app/javascript/controllers/application_controller.js"
14
- assert_file "app/javascript/controllers/demo_controller.js", /DemoReflex/
14
+ assert_file "app/javascript/controllers/demo_controller.js", /Demo/
15
15
  assert_file "app/reflexes/application_reflex.rb"
16
16
  assert_file "app/reflexes/demo_reflex.rb", /DemoReflex/
17
17
  end
@@ -19,7 +19,7 @@ class StimulusReflexGeneratorTest < Rails::Generators::TestCase
19
19
  test "creates plural named controller and reflex files" do
20
20
  run_generator %w[posts]
21
21
  assert_file "app/javascript/controllers/application_controller.js"
22
- assert_file "app/javascript/controllers/posts_controller.js", /PostsReflex/
22
+ assert_file "app/javascript/controllers/posts_controller.js", /Posts/
23
23
  assert_file "app/reflexes/application_reflex.rb"
24
24
  assert_file "app/reflexes/posts_reflex.rb", /PostsReflex/
25
25
  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.3.0.pre1
4
+ version: 3.3.0.pre6
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-07-08 00:00:00.000000000 Z
11
+ date: 2020-09-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: 4.1.2
69
+ - !ruby/object:Gem::Dependency
70
+ name: redis
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: bundler
71
85
  requirement: !ruby/object:Gem::Requirement
@@ -136,7 +150,7 @@ dependencies:
136
150
  - - ">="
137
151
  - !ruby/object:Gem::Version
138
152
  version: '0'
139
- description:
153
+ description:
140
154
  email:
141
155
  - natehop@gmail.com
142
156
  executables: []
@@ -162,22 +176,18 @@ files:
162
176
  - lib/generators/templates/app/reflexes/%file_name%_reflex.rb.tt
163
177
  - lib/generators/templates/app/reflexes/application_reflex.rb.tt
164
178
  - lib/stimulus_reflex.rb
165
- - lib/stimulus_reflex/broadcaster.rb
179
+ - lib/stimulus_reflex/broadcasters/broadcaster.rb
180
+ - lib/stimulus_reflex/broadcasters/nothing_broadcaster.rb
181
+ - lib/stimulus_reflex/broadcasters/page_broadcaster.rb
182
+ - lib/stimulus_reflex/broadcasters/selector_broadcaster.rb
166
183
  - lib/stimulus_reflex/channel.rb
167
184
  - lib/stimulus_reflex/element.rb
168
- - lib/stimulus_reflex/morph_mode.rb
169
- - lib/stimulus_reflex/morph_mode/nothing_morph_mode.rb
170
- - lib/stimulus_reflex/morph_mode/page_morph_mode.rb
171
- - lib/stimulus_reflex/morph_mode/selector_morph_mode.rb
172
185
  - lib/stimulus_reflex/reflex.rb
186
+ - lib/stimulus_reflex/sanity_checker.rb
173
187
  - lib/stimulus_reflex/version.rb
174
188
  - lib/tasks/stimulus_reflex/install.rake
175
- - stimulus_reflex.gemspec
176
- - tags
177
189
  - test/generators/stimulus_reflex_generator_test.rb
178
190
  - test/test_helper.rb
179
- - test/tmp/app/reflexes/application_reflex.rb
180
- - test/tmp/app/reflexes/demo_reflex.rb
181
191
  homepage: https://github.com/hopsoft/stimulus_reflex
182
192
  licenses:
183
193
  - MIT
@@ -206,12 +216,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
206
216
  - !ruby/object:Gem::Version
207
217
  version: 1.3.1
208
218
  requirements: []
209
- rubygems_version: 3.0.3
210
- signing_key:
219
+ rubygems_version: 3.0.6
220
+ signing_key:
211
221
  specification_version: 4
212
222
  summary: Build reactive applications with the Rails tooling you already know and love.
213
223
  test_files:
214
- - test/test_helper.rb
215
224
  - test/generators/stimulus_reflex_generator_test.rb
216
- - test/tmp/app/reflexes/demo_reflex.rb
217
- - test/tmp/app/reflexes/application_reflex.rb
225
+ - test/test_helper.rb
@@ -1,53 +0,0 @@
1
- module StimulusReflex
2
- module Broadcaster
3
- include CableReady::Broadcaster
4
-
5
- def render_page_and_broadcast_morph(reflex, selectors, data = {})
6
- html = render_page(reflex)
7
- broadcast_morphs selectors, data, html if html.present?
8
- end
9
-
10
- def render_page(reflex)
11
- reflex.controller.process reflex.url_params[:action]
12
- reflex.controller.response.body
13
- end
14
-
15
- def broadcast_morphs(selectors, data, html)
16
- document = Nokogiri::HTML(html)
17
- selectors = selectors.select { |s| document.css(s).present? }
18
- selectors.each do |selector|
19
- cable_ready[stream_name].morph(
20
- selector: selector,
21
- html: document.css(selector).inner_html,
22
- children_only: true,
23
- permanent_attribute_name: data["permanent_attribute_name"],
24
- stimulus_reflex: data.merge({
25
- last: selector == selectors.last,
26
- morph_mode: "page"
27
- })
28
- )
29
- end
30
- cable_ready.broadcast
31
- end
32
-
33
- def broadcast_message(subject:, body: nil, data: {})
34
- message = {
35
- subject: subject,
36
- body: body
37
- }
38
-
39
- logger.error "\e[31m#{body}\e[0m" if subject == "error"
40
-
41
- data[:morph_mode] = "page"
42
- data[:server_message] = message
43
- data[:morph_mode] = "selector" if subject == "selector"
44
- data[:morph_mode] = "nothing" if subject == "nothing"
45
-
46
- cable_ready[stream_name].dispatch_event(
47
- name: "stimulus-reflex:server-message",
48
- detail: {stimulus_reflex: data}
49
- )
50
- cable_ready.broadcast
51
- end
52
- end
53
- end
@@ -1,19 +0,0 @@
1
- module StimulusReflex
2
- class MorphMode
3
- include StimulusReflex::Broadcaster
4
-
5
- attr_accessor :stream_name
6
-
7
- def page?
8
- false
9
- end
10
-
11
- def nothing?
12
- false
13
- end
14
-
15
- def selector?
16
- false
17
- end
18
- end
19
- end
@@ -1,15 +0,0 @@
1
- module StimulusReflex
2
- class PageMorphMode < MorphMode
3
- def broadcast(reflex, selectors, data)
4
- render_page_and_broadcast_morph reflex, selectors, data
5
- end
6
-
7
- def to_sym
8
- :page
9
- end
10
-
11
- def page?
12
- true
13
- end
14
- end
15
- end
@@ -1,15 +0,0 @@
1
- module StimulusReflex
2
- class SelectorMorphMode < MorphMode
3
- def broadcast(reflex, selectors, data)
4
- broadcast_message subject: "selector", data: data
5
- end
6
-
7
- def to_sym
8
- :selector
9
- end
10
-
11
- def selector?
12
- true
13
- end
14
- end
15
- end
@@ -1,39 +0,0 @@
1
- require File.expand_path("../lib/stimulus_reflex/version", __FILE__)
2
-
3
- Gem::Specification.new do |gem|
4
- gem.name = "stimulus_reflex"
5
- gem.license = "MIT"
6
- gem.version = StimulusReflex::VERSION
7
- gem.authors = ["Nathan Hopkins"]
8
- gem.email = ["natehop@gmail.com"]
9
- gem.homepage = "https://github.com/hopsoft/stimulus_reflex"
10
- gem.summary = "Build reactive applications with the Rails tooling you already know and love."
11
- gem.post_install_message = <<~MESSAGE
12
- Friendly reminder: When updating the stimulus_reflex gem,
13
- don't forget to update your npm package as well.
14
-
15
- See https://www.npmjs.com/package/stimulus_reflex
16
- MESSAGE
17
-
18
- gem.metadata = {
19
- "bug_tracker_uri" => "https://github.com/hopsoft/stimulus_reflex/issues",
20
- "changelog_uri" => "https://github.com/hopsoft/stimulus_reflex/CHANGELOG.md",
21
- "documentation_uri" => "https://docs.stimulusreflex.com",
22
- "homepage_uri" => gem.homepage,
23
- "source_code_uri" => gem.homepage
24
- }
25
-
26
- gem.files = Dir["lib/**/*", "bin/*", "[A-Z]*"]
27
- gem.test_files = Dir["test/**/*.rb"]
28
-
29
- gem.add_dependency "rack"
30
- gem.add_dependency "nokogiri"
31
- gem.add_dependency "rails", ">= 5.2"
32
- gem.add_dependency "cable_ready", ">= 4.1.2"
33
-
34
- gem.add_development_dependency "bundler", "~> 2.0"
35
- gem.add_development_dependency "pry-nav"
36
- gem.add_development_dependency "pry"
37
- gem.add_development_dependency "rake"
38
- gem.add_development_dependency "standardrb"
39
- end
data/tags DELETED
@@ -1,42 +0,0 @@
1
- !_TAG_FILE_FORMAT 2 /extended format; --format=1 will not append ;" to lines/
2
- !_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/
3
- !_TAG_PROGRAM_AUTHOR Darren Hiebert /dhiebert@users.sourceforge.net/
4
- !_TAG_PROGRAM_NAME Exuberant Ctags //
5
- !_TAG_PROGRAM_URL http://ctags.sourceforge.net /official site/
6
- !_TAG_PROGRAM_VERSION 5.8 //
7
- ApplicationReflex lib/generators/templates/application_reflex.rb /^class ApplicationReflex < StimulusReflex::Reflex$/;" c
8
- ApplicationReflex test/tmp/app/reflexes/application_reflex.rb /^class ApplicationReflex < StimulusReflex::Reflex$/;" c
9
- DemoReflex test/tmp/app/reflexes/demo_reflex.rb /^class DemoReflex < ApplicationReflex$/;" c
10
- Engine lib/stimulus_reflex.rb /^ class Engine < Rails::Engine$/;" c class:StimulusReflex
11
- StimulusReflex lib/stimulus_reflex.rb /^module StimulusReflex$/;" m
12
- StimulusReflex lib/stimulus_reflex/channel.rb /^class StimulusReflex::Channel < ActionCable::Channel::Base$/;" c
13
- StimulusReflex lib/stimulus_reflex/element.rb /^class StimulusReflex::Element$/;" c
14
- StimulusReflex lib/stimulus_reflex/reflex.rb /^class StimulusReflex::Reflex$/;" c
15
- StimulusReflex lib/stimulus_reflex/version.rb /^module StimulusReflex$/;" m
16
- StimulusReflexGenerator lib/generators/stimulus_reflex_generator.rb /^class StimulusReflexGenerator < Rails::Generators::NamedBase$/;" c
17
- StimulusReflexGeneratorTest test/generators/stimulus_reflex_generator_test.rb /^class StimulusReflexGeneratorTest < Rails::Generators::TestCase$/;" c
18
- broadcast_error lib/stimulus_reflex/channel.rb /^ def broadcast_error(message, data = {})$/;" f class:StimulusReflex
19
- broadcast_morphs lib/stimulus_reflex/channel.rb /^ def broadcast_morphs(selectors, data, html)$/;" f class:StimulusReflex
20
- build_request lib/stimulus_reflex/channel.rb /^ def build_request$/;" f class:StimulusReflex
21
- commit_session lib/stimulus_reflex/channel.rb /^ def commit_session(request, response)$/;" f class:StimulusReflex
22
- copy_controller_files lib/generators/stimulus_reflex_generator.rb /^ def copy_controller_files$/;" f class:StimulusReflexGenerator
23
- copy_reflex_files lib/generators/stimulus_reflex_generator.rb /^ def copy_reflex_files$/;" f class:StimulusReflexGenerator
24
- dataset lib/stimulus_reflex/element.rb /^ def dataset$/;" f class:StimulusReflex
25
- delegate_call_to_reflex lib/stimulus_reflex/channel.rb /^ def delegate_call_to_reflex(reflex, method_name, arguments = [])$/;" f class:StimulusReflex
26
- exception_message_with_backtrace lib/stimulus_reflex/channel.rb /^ def exception_message_with_backtrace(exception)$/;" f class:StimulusReflex
27
- export.reflexAttribute javascript/schema.js /^ reflexAttribute: 'data-reflex',$/;" p
28
- export.reflexPermanentAttribute javascript/schema.js /^ reflexPermanentAttribute: 'data-reflex-permanent',$/;" p
29
- export.reflexRootAttribute javascript/schema.js /^ reflexRootAttribute: 'data-reflex-root'$/;" p
30
- findConsumer javascript/consumer.js /^function findConsumer (object, depth = 0) {$/;" f
31
- initialize lib/stimulus_reflex/element.rb /^ def initialize(attrs = {})$/;" f class:StimulusReflex
32
- initialize lib/stimulus_reflex/reflex.rb /^ def initialize(channel, url: nil, element: nil, selectors: [])$/;" f class:StimulusReflex
33
- initialize_controllers lib/generators/stimulus_reflex_generator.rb /^ def initialize_controllers$/;" f class:StimulusReflexGenerator
34
- initialize_reflexes lib/generators/stimulus_reflex_generator.rb /^ def initialize_reflexes$/;" f class:StimulusReflexGenerator
35
- is_reflex? lib/stimulus_reflex/channel.rb /^ def is_reflex?(reflex_class)$/;" f class:StimulusReflex
36
- receive lib/stimulus_reflex/channel.rb /^ def receive(data)$/;" f class:StimulusReflex
37
- render_page lib/stimulus_reflex/channel.rb /^ def render_page(reflex)$/;" f class:StimulusReflex
38
- render_page_and_broadcast_morph lib/stimulus_reflex/channel.rb /^ def render_page_and_broadcast_morph(reflex, selectors, data = {})$/;" f class:StimulusReflex
39
- request lib/stimulus_reflex/reflex.rb /^ def request$/;" f class:StimulusReflex
40
- stream_name lib/stimulus_reflex/channel.rb /^ def stream_name$/;" f class:StimulusReflex
41
- subscribed lib/stimulus_reflex/channel.rb /^ def subscribed$/;" f class:StimulusReflex
42
- url_params lib/stimulus_reflex/reflex.rb /^ def url_params$/;" f class:StimulusReflex
@@ -1,12 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class ApplicationReflex < StimulusReflex::Reflex
4
- # Put application wide Reflex behavior in this file.
5
- #
6
- # Example:
7
- #
8
- # # If your ActionCable connection is: `identified_by :current_user`
9
- # delegate :current_user, to: :connection
10
- #
11
- # Learn more at: https://docs.stimulusreflex.com
12
- end
@@ -1,25 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class DemoReflex < ApplicationReflex
4
- # Add Reflex methods in this file.
5
- #
6
- # All Reflex instances expose the following properties:
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)
15
- #
16
- # Example:
17
- #
18
- # def example(argument=true)
19
- # # Your logic here...
20
- # # Any declared instance variables will be made available to the Rails controller and view.
21
- # end
22
- #
23
- # Learn more at: https://docs.stimulusreflex.com
24
-
25
- end