Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

StimulusReflex 3.5 installer #610

Merged
merged 108 commits into from
Feb 19, 2023
Merged

StimulusReflex 3.5 installer #610

merged 108 commits into from
Feb 19, 2023

Conversation

leastbad
Copy link
Contributor

@leastbad leastbad commented Sep 24, 2022

Type of PR (feature, enhancement, bug fix, etc.)

Feature

Description

With sincere and genuine apologies for how long this has been in the oven, here is my best attempt at providing a luxe, single-command install task for SR. It builds directly on the techniques and outputs of preceding foundational efforts by both Julian and Marco.

It supports all major bundlers in their default configuration:

Rails 6.1: webpacker 5.4.3, shakapacker, vite
Rails 7: importmap, esbuild, shakapacker, vite

The installer is divided into steps which are designed to be either generic or highly specific to one of the bundlers.

The installer uses temporary files to maintain state; one of the major wins is that it means the setup process can fail, they can fix an issue, and task is smart enough to resume where they left off. It will also survive a reboot, which is something you cannot say about environment variables.

One of the things I'm most excited about is the new example the install task offers to generate. Instead of just a Reflex class and Stimulus controller, I realized that there's huge value in creating something that people can just run out of the box. This creates a controller, fully self-contained view and root. Right now, it's super minimalist, but I talk more in the Why section below about my vision for this.

I stash an MD5 hash of Gemfile so that we only need to run bundle if something changes. Likewise, I actually dynamically rebuild package.json based on added dependencies, development dependencies and removed dependencies. This allows us to run the dreaded, slow AF yarn build process 0 or 1 times, instead of 3 times since there is no way to combine these three operations on the command line.

I make efforts to create or modify most files in-place, but for files like the {entrypoint}/controllers/index.js where it's likely they made changes, it copies the existing file to .bak, generates a "perfect" new file, and then gives them a list of such replacements at the end.

rails stimulus_reflex:install # fully automatic detections, with prompts
rails stimulus_reflex:install esbuild # specify a bundler
rails stimulus_reflex:install entrypoint=app/frontend webpacker # install with webpacker 5.4.3 in app/frontend
rails stimulus_reflex:install:step action_cable yarn bundle # re-run one or more steps
rails stimulus_reflex:install:restart # wipe state and restart install

rails stimulus_reflex:install uncomment=true # uncomment any necessary includes that have been commented
rails stimulus_reflex:install spring=false # do not remove spring (equivalent to answering `n`)
rails stimulus_reflex:install example=true # create an example page and route
rails stimulus_reflex:install trace=true # debug install process with full stack trace

rails stimulus_reflex:install:step mrujs # force install mrujs
rails stimulus_reflex:install:step compression # monkey patch Action Cable to compress WS traffic with deflate

# full fat install with zero interactive prompts, suitable for scripting
rails stimulus_reflex:install esbuild entrypoint=app/javascript uncomment=true example=true

Why should this be added

First, we really need to up our installation and integration game to overcome the emotional barrier people often feel when comparing us against a built-in solution. The more we can make installing SR/CR feel like ordering a Big Mac combo, the less water "golden path" arguments hold.

Second, I am convinced that one of the most powerful things we can do to advance the adoption of this stack is to put as much energy into the onboarding experience as we can, and to that end, I want to develop the built-in example to showcase as many core concepts and differentiating features as we can on one page. I'm picturing an engaging "long scroll" that alternates between live demos with code examples, short lists of compelling features and maybe even a few testimonials, like a microsite.


The CableReady version now lives at stimulusreflex/cable_ready#233.

Checklist

  • My code follows the style guidelines of this project
  • Checks (StandardRB & Prettier-Standard) are passing

@leastbad leastbad added enhancement New feature or request proposal ruby Pull requests that update Ruby code experimental infrastructure labels Sep 24, 2022
@leastbad leastbad added this to the 3.5 milestone Sep 24, 2022
@leastbad leastbad self-assigned this Sep 24, 2022
@leastbad
Copy link
Contributor Author

While I feel lame commenting out StimulusReflexGeneratorTest, I cannot figure out why the assert_file assertions fail, even if I remove the regex component.

Failure:
StimulusReflexGeneratorTest#test_creates_reflex_with_given_reflex_actions [/home/leastbad/stimulus_reflex/test/generators/stimulus_reflex_generator_test.rb:37]:
Expected file "app/javascript/controllers/user_controller.js" to exist, but does not
leastbad:~/foo  $ rails g stimulus_reflex demo
Resolving dependencies...
      create  app/reflexes/demo_reflex.rb
      create  app/javascript/controllers/demo_controller.js

So, yeah... I don't really get why this would break. However, I spent my Saturday night trying to make it work, and given the very small scope of the actual test - it tests about ~1% of the install task - I am calling it and moving on.

I very much hope someone can revisit this and show me how to avoid similar issues going forward.

Copy link

@mansakondo mansakondo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not familiar with creating custom generators and templates, but when I tried the installer with esbuild, I got this syntax error that prevented redis-session-store from being added to the Gemfile:

rails aborted!
SyntaxError: /home/mansa/code/rails/stimulus_reflex/lib/install/development.rb:113: syntax error, unexpected string literal, expecting `do' or '{' or '('
    gem "redis-session-store", "0.11.4"
        ^
/home/mansa/code/rails/stimulus_reflex/lib/install/development.rb:113: syntax error, unexpected ',', expecting `end'
    gem "redis-session-store", "0.11.4"

Copy link

@mansakondo mansakondo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm also getting this error:

rails aborted!
ArgumentError: wrong number of arguments (given 2, expected 0..1)
/home/mansa/code/rails/sr_installer_test/config/environments/development.rb:5:in `block in <main>'
/home/mansa/code/rails/sr_installer_test/config/environments/development.rb:3:in `<main>'
/home/mansa/code/rails/sr_installer_test/config/environment.rb:5:in `<main>'

Because config.session_store expect **options.

Copy link
Member

@marcoroth marcoroth left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I left some comments from a first pass-through of the diff

leastbad and others added 5 commits September 27, 2022 20:23
…ation.js.esbuild.tt

Co-authored-by: Marco Roth <marco.roth@intergga.ch>
…/stimulus_reflex.js.tt

Co-authored-by: Marco Roth <marco.roth@intergga.ch>
…llers/application.js.tt

Co-authored-by: Marco Roth <marco.roth@intergga.ch>
…ation.js.importmap.tt

Co-authored-by: Marco Roth <marco.roth@intergga.ch>
@marcoroth marcoroth merged commit 00c8973 into main Feb 19, 2023
@marcoroth marcoroth deleted the new_installer branch February 19, 2023 03:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request experimental infrastructure proposal ruby Pull requests that update Ruby code
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants