stimulus_reflex 2.1.2 → 2.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of stimulus_reflex might be problematic. Click here for more details.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f261317eba89f3aca406db338af66069b57121ef68188dd32c22a8b263c84c0d
4
- data.tar.gz: 16ead06810e664961d5d0bea297a82bfd109616c363eecb63e2211efbe0718e0
3
+ metadata.gz: 225d5ebaf25744294ea11566c1b1ea792b19141ec56d10a2017eb39407a1b346
4
+ data.tar.gz: 2d4afe1de7f8fd3e4f4d12fb29f4c51088713b69303b4c905c8a6cb1ad0385a9
5
5
  SHA512:
6
- metadata.gz: 43c62ef1ddec489d525dd429a78ee0113b215918ac4fa95192cf75fafe356b42705e775b29ccfa2ddf193833b3bc42d5e736828d97234353e2ae06bdd929bd63
7
- data.tar.gz: 0b5870db51f39af566c2eda1a574783dba205b9f37d1c07083d82a5df6ef6a0a63dde0b43ee0881492155715e945926452f529677b7951d10f27228471a80097
6
+ metadata.gz: c5bd0958b9eaabe325c8c65d81bead836dfb182f43059ea786a941eb9268920efbad8be79498e53bd97529bdea13fc2f24a382ceebf97a81c8ebcf70523d753d
7
+ data.tar.gz: 49c2bea2d9f35a3722c7e3cd4824441623a4660e46d0754a12906dcfe552c0474222af076f4bc096b89da45f1a3f3b4a0521270ab9f9856e069ad96325e1a9b5
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- stimulus_reflex (2.1.2)
4
+ stimulus_reflex (2.1.3)
5
5
  cable_ready (>= 4.0.7)
6
6
  nokogiri
7
7
  rack
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- [![Lines of Code](http://img.shields.io/badge/lines_of_code-465-brightgreen.svg?style=flat)](http://blog.codinghorror.com/the-best-code-is-no-code-at-all/)
1
+ [![Lines of Code](http://img.shields.io/badge/lines_of_code-516-brightgreen.svg?style=flat)](http://blog.codinghorror.com/the-best-code-is-no-code-at-all/)
2
2
  [![Maintainability](https://api.codeclimate.com/v1/badges/2b24fdbd1ae37a24bedb/maintainability)](https://codeclimate.com/github/hopsoft/stimulus_reflex/maintainability)
3
3
  ![Prettier-Standard](https://github.com/hopsoft/stimulus_reflex/workflows/Prettier-Standard/badge.svg)
4
4
  ![StandardRB](https://github.com/hopsoft/stimulus_reflex/workflows/StandardRB/badge.svg)
data/Rakefile CHANGED
@@ -1,9 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "bundler/gem_tasks"
4
+ require "rails/test_unit/runner"
4
5
 
5
6
  task default: [:test]
6
7
 
7
- task :test do
8
- exec "cd javascript && yarn run test"
8
+ task :test do |task|
9
+ return 1 unless system("cd javascript && yarn run test")
10
+ Rails::TestUnit::Runner.run
11
+ end
12
+
13
+ task :test_ruby do |task|
14
+ Rails::TestUnit::Runner.run
9
15
  end
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'rake' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ require "pathname"
12
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
13
+ Pathname.new(__FILE__).realpath)
14
+
15
+ bundle_binstub = File.expand_path("../bundle", __FILE__)
16
+
17
+ if File.file?(bundle_binstub)
18
+ if /This file was generated by Bundler/.match?(File.read(bundle_binstub, 300))
19
+ load(bundle_binstub)
20
+ else
21
+ abort("Your `bin/bundle` was not generated by Bundler, so this binstub cannot run.
22
+ Replace `bin/bundle` by running `bundle binstubs bundler --force`, then run this command again.")
23
+ end
24
+ end
25
+
26
+ require "rubygems"
27
+ require "bundler/setup"
28
+
29
+ load Gem.bin_path("rake", "rake")
@@ -1,4 +1,4 @@
1
1
  #!/usr/bin/env bash
2
2
 
3
3
  bundle exec standardrb --fix
4
- cd ./javascript && yarn run prettier-standard stimulus_reflex.js test/*.js
4
+ cd ./javascript && yarn run prettier-standard --lint javascript/*.js test/*.js
@@ -0,0 +1,14 @@
1
+ Description:
2
+ Generate boilerplate files to help get you up and running with StimulusReflex
3
+
4
+ Example:
5
+ rails generate stimulus_reflex User
6
+
7
+ This will create, but not overwrite the following files:
8
+
9
+ app/javascript/controllers/application_controller.js
10
+ app/javascript/controllers/user_controller.js
11
+ app/reflexes/application_reflex.rb
12
+ app/reflexes/user_reflex.rb
13
+
14
+ Don't forget to setup the application: https://docs.stimulusreflex.com/setup
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails/generators"
4
+
5
+ class StimulusReflexGenerator < Rails::Generators::NamedBase
6
+ source_root File.expand_path("templates", __dir__)
7
+
8
+ def initialize_reflexes
9
+ copy_reflex_files
10
+ end
11
+
12
+ def initialize_controllers
13
+ copy_controller_files
14
+ end
15
+
16
+ private
17
+
18
+ CONTROLLER_BASE_PATH = "app/javascript/controllers"
19
+ REFLEX_BASE_PATH = "app/reflexes"
20
+
21
+ def copy_reflex_files
22
+ template "application_reflex.rb", File.join(REFLEX_BASE_PATH, "application_reflex.rb")
23
+ template "custom_reflex.rb", File.join(REFLEX_BASE_PATH, "#{name.underscore}_reflex.rb")
24
+ end
25
+
26
+ def copy_controller_files
27
+ template "application_controller.js", File.join(CONTROLLER_BASE_PATH, "application_controller.js")
28
+ template "custom_controller.js", File.join(CONTROLLER_BASE_PATH, "#{name.underscore}_controller.js")
29
+ end
30
+ end
@@ -0,0 +1,59 @@
1
+ import { Controller } from 'stimulus'
2
+ import StimulusReflex from 'stimulus_reflex'
3
+
4
+ /* This is your application's ApplicationController.
5
+ * All StimulusReflex controllers should inherit from this class.
6
+ *
7
+ * Example:
8
+ *
9
+ * import ApplicationController from './application_controller'
10
+ *
11
+ * export default class extends ApplicationController { ... }
12
+ *
13
+ * Learn more at: https://docs.stimulusreflex.com
14
+ */
15
+ export default class extends Controller {
16
+ connect () {
17
+ StimulusReflex.register(this)
18
+ }
19
+
20
+ /* Application wide lifecycle methods.
21
+ * Use these methods to handle lifecycle concerns for the entire application.
22
+ * Using the lifecycle is optional, so feel free to delete these stubs if you don't need them.
23
+ *
24
+ * Arguments:
25
+ *
26
+ * element - the element that triggered the reflex
27
+ * may be different than the Stimulus controller's this.element
28
+ *
29
+ * reflex - the name of the reflex e.g. "ExampleReflex#demo"
30
+ *
31
+ * error - error message from the server
32
+ */
33
+
34
+ beforeReflex (element, reflex) {
35
+ // document.body.classList.add('wait')
36
+ }
37
+
38
+ reflexSuccess (element, reflex, error) {
39
+ // show success message etc...
40
+ }
41
+
42
+ reflexError (element, reflex, error) {
43
+ // show error message etc...
44
+ }
45
+
46
+ afterReflex (element, reflex) {
47
+ // document.body.classList.remove('wait')
48
+
49
+ const focusElement = this.element.querySelector('[autofocus]')
50
+ if (focusElement) {
51
+ focusElement.focus()
52
+
53
+ // shenanigans to ensure that the cursor is placed at the end of the existing value
54
+ const value = focusElement.value
55
+ focusElement.value = ''
56
+ focusElement.value = value
57
+ }
58
+ }
59
+ }
@@ -0,0 +1,12 @@
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: :channel
10
+ #
11
+ # Learn more at: https://docs.stimulusreflex.com
12
+ end
@@ -0,0 +1,37 @@
1
+ import ApplicationController from './application_controller'
2
+
3
+ /* This is the custom StimulusReflex controller for <%= @name.classify %>Reflex.
4
+ * Learn more at: https://docs.stimulusreflex.com
5
+ */
6
+ export default class extends ApplicationController {
7
+ /* Reflex specific lifecycle methods.
8
+ * Use methods similar to this example to handle lifecycle concerns for a specific Reflex method.
9
+ * Using the lifecycle is optional, so feel free to delete these stubs if you don't need them.
10
+ *
11
+ * Example:
12
+ *
13
+ * <a href="#" data-reflex="<%= @name.classify %>Reflex#example">Example</a>
14
+ *
15
+ * Arguments:
16
+ *
17
+ * element - the element that triggered the reflex
18
+ * may be different than the Stimulus controller's this.element
19
+ *
20
+ * reflex - the name of the reflex e.g. "<%= @name.classify %>Reflex#example"
21
+ *
22
+ * error - error message from the server
23
+ */
24
+
25
+ // beforeUpdate(element, reflex) {
26
+ // element.innerText = 'Updating...'
27
+ // }
28
+
29
+ // updateSuccess(element, reflex) {
30
+ // element.innerText = 'Updated Successfully.'
31
+ // }
32
+
33
+ // updateError(element, reflex, error) {
34
+ // console.error('updateError', error);
35
+ // element.innerText = 'Updated Failed!'
36
+ // }
37
+ }
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ class <%= @name.classify %>Reflex < 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
+ #
15
+ # Example:
16
+ #
17
+ # def example(argument=true)
18
+ # # Your logic here...
19
+ # # Any declared instance variables will be made available to the Rails controller and view.
20
+ # end
21
+ #
22
+ # Learn more at: https://docs.stimulusreflex.com
23
+ end
@@ -12,6 +12,7 @@ require "stimulus_reflex/version"
12
12
  require "stimulus_reflex/reflex"
13
13
  require "stimulus_reflex/element"
14
14
  require "stimulus_reflex/channel"
15
+ require "generators/stimulus_reflex_generator"
15
16
 
16
17
  module StimulusReflex
17
18
  class Engine < Rails::Engine
@@ -19,7 +19,7 @@ class StimulusReflex::Channel < ActionCable::Channel::Base
19
19
  def receive(data)
20
20
  url = data["url"].to_s
21
21
  selectors = (data["selectors"] || []).select(&:present?)
22
- selectors = ["body"] if selectors.blank?
22
+ selectors = data["selectors"] = ["body"] if selectors.blank?
23
23
  target = data["target"].to_s
24
24
  reflex_name, method_name = target.split("#")
25
25
  reflex_name = reflex_name.classify
@@ -100,15 +100,14 @@ class StimulusReflex::Channel < ActionCable::Channel::Base
100
100
 
101
101
  def broadcast_morphs(selectors, data, html)
102
102
  document = Nokogiri::HTML(html)
103
+ selectors = selectors.select { |s| document.css(s).present? }
103
104
  selectors.each do |selector|
104
- match = document.css(selector)
105
- next if match.blank?
106
105
  cable_ready[stream_name].morph(
107
106
  selector: selector,
108
- html: match.inner_html,
107
+ html: document.css(selector).inner_html,
109
108
  children_only: true,
110
109
  permanent_attribute_name: "data-reflex-permanent",
111
- stimulus_reflex: data
110
+ stimulus_reflex: data.merge(last: selector == selectors.last)
112
111
  )
113
112
  end
114
113
  cable_ready.broadcast
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module StimulusReflex
4
- VERSION = "2.1.2"
4
+ VERSION = "2.1.3"
5
5
  end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "fileutils"
4
+
5
+ namespace :stimulus_reflex do
6
+ desc "Install StimulusReflex in this application"
7
+ task install: :environment do
8
+ system "bundle exec rails webpacker:install:stimulus"
9
+ system "yarn add stimulus_reflex"
10
+
11
+ FileUtils.mkdir_p Rails.root.join("app/javascript/controllers"), verbose: true
12
+ FileUtils.mkdir_p Rails.root.join("app/reflexes"), verbose: true
13
+
14
+ filepath = Rails.root.join("app/javascript/controllers/index.js")
15
+ puts "Updating #{filepath}"
16
+ lines = File.open(filepath, "r") { |f| f.readlines }
17
+ import_line = lines.find { |line| line.start_with?("import StimulusReflex") }
18
+ initialize_line = lines.find { |line| line.start_with?("StimulusReflex.initialize") }
19
+ unless import_line
20
+ matches = lines.select { |line| line =~ /\A(require|import)/ }
21
+ lines.insert lines.index(matches.last).to_i + 1, "import StimulusReflex from 'stimulus_reflex'\n"
22
+ end
23
+ lines << "StimulusReflex.initialize(application)\n" unless initialize_line
24
+ File.open(filepath, "w") { |f| f.write lines.join }
25
+
26
+ system "bundle exec rails generate stimulus_reflex example"
27
+ end
28
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails/generators/test_case"
4
+ require_relative "../test_helper"
5
+
6
+ class StimulusReflexGeneratorTest < Rails::Generators::TestCase
7
+ tests StimulusReflexGenerator
8
+ destination File.expand_path("../../tmp", __FILE__)
9
+ setup :prepare_destination
10
+
11
+ test "creates named controller and reflex files" do
12
+ run_generator %w[demo]
13
+ assert_file "app/javascript/controllers/application_controller.js"
14
+ assert_file "app/javascript/controllers/demo_controller.js", /DemoReflex/
15
+ assert_file "app/reflexes/application_reflex.rb"
16
+ assert_file "app/reflexes/demo_reflex.rb", /DemoReflex/
17
+ end
18
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ ENV["RAILS_ENV"] ||= "test"
4
+ require_relative "../lib/stimulus_reflex"
@@ -0,0 +1,12 @@
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: :channel
10
+ #
11
+ # Learn more at: https://docs.stimulusreflex.com
12
+ end
@@ -0,0 +1,23 @@
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
+ #
15
+ # Example:
16
+ #
17
+ # def example(argument=true)
18
+ # # Your logic here...
19
+ # # Any declared instance variables will be made available to the Rails controller and view.
20
+ # end
21
+ #
22
+ # Learn more at: https://docs.stimulusreflex.com
23
+ end
metadata CHANGED
@@ -1,15 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stimulus_reflex
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.2
4
+ version: 2.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nathan Hopkins
8
- - Ron Cooke
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2019-10-09 00:00:00.000000000 Z
11
+ date: 2019-10-16 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: rack
@@ -140,7 +139,6 @@ dependencies:
140
139
  description:
141
140
  email:
142
141
  - natehop@gmail.com
143
- - brasco@thebrascode.com
144
142
  executables: []
145
143
  extensions: []
146
144
  extra_rdoc_files: []
@@ -153,13 +151,25 @@ files:
153
151
  - Rakefile
154
152
  - bin/console
155
153
  - bin/loc
154
+ - bin/rake
156
155
  - bin/setup
157
156
  - bin/standardize
157
+ - lib/generators/USAGE
158
+ - lib/generators/stimulus_reflex_generator.rb
159
+ - lib/generators/templates/application_controller.js
160
+ - lib/generators/templates/application_reflex.rb
161
+ - lib/generators/templates/custom_controller.js
162
+ - lib/generators/templates/custom_reflex.rb
158
163
  - lib/stimulus_reflex.rb
159
164
  - lib/stimulus_reflex/channel.rb
160
165
  - lib/stimulus_reflex/element.rb
161
166
  - lib/stimulus_reflex/reflex.rb
162
167
  - lib/stimulus_reflex/version.rb
168
+ - lib/tasks/stimulus_reflex/install.rake
169
+ - test/generators/stimulus_reflex_generator_test.rb
170
+ - test/test_helper.rb
171
+ - test/tmp/app/reflexes/application_reflex.rb
172
+ - test/tmp/app/reflexes/demo_reflex.rb
163
173
  homepage: https://github.com/hopsoft/stimulus_reflex
164
174
  licenses:
165
175
  - MIT
@@ -182,5 +192,9 @@ requirements: []
182
192
  rubygems_version: 3.0.3
183
193
  signing_key:
184
194
  specification_version: 4
185
- summary: Build reactive Single Page Applications (SPAs) with Rails and Stimulus
186
- test_files: []
195
+ summary: Build reactive applications with the Rails tooling you already know and love.
196
+ test_files:
197
+ - test/test_helper.rb
198
+ - test/generators/stimulus_reflex_generator_test.rb
199
+ - test/tmp/app/reflexes/demo_reflex.rb
200
+ - test/tmp/app/reflexes/application_reflex.rb