From 37d635bfdfb39d0e496eabf31270c0cdaea5acce Mon Sep 17 00:00:00 2001 From: Justin Gordon Date: Mon, 8 Dec 2025 17:59:48 -1000 Subject: [PATCH 1/4] Fix CI change detection for generator files MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The ci-changes-detector script was failing to properly detect changes to generator files because: 1. The "Ruby source code" pattern (react_on_rails/lib/**/*.rb) matched generator files before the "Generators" pattern could match them 2. Generator spec files (react_on_rails/spec/react_on_rails/generators/*) were not included in the Generators pattern at all This fix: - Moves the Generators pattern BEFORE Ruby source code so it catches generator files first (bash case statements use first-match-wins) - Adds generator spec paths to the Generators pattern - Adds clarifying comments about pattern ordering Now when generator files or generator specs change, the `run_generators` flag is properly set to true, triggering the appropriate CI workflows. Fixes #2187 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- script/ci-changes-detector | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/script/ci-changes-detector b/script/ci-changes-detector index 56179d91c9..3d8a4fbaa8 100755 --- a/script/ci-changes-detector +++ b/script/ci-changes-detector @@ -75,24 +75,24 @@ while IFS= read -r file; do # Don't change DOCS_ONLY flag, just continue ;; + # Generators (MUST be before Ruby source code to avoid being caught by lib/**/*.rb) + react_on_rails/lib/generators/*|react_on_rails/lib/generators/**/*|react_on_rails/spec/react_on_rails/generators/*|react_on_rails/spec/react_on_rails/generators/**/*|rakelib/example_type.rb|rakelib/examples_config.yml|rakelib/shakapacker_examples.rake|.github/workflows/examples.yml) + DOCS_ONLY=false + GENERATORS_CHANGED=true + ;; + # Ruby source code react_on_rails/lib/*.rb|react_on_rails/lib/**/*.rb|Gemfile|Gemfile.lock|rakelib/run_rspec.rake|rakelib/node_package.rake|rakelib/dummy_apps.rake) DOCS_ONLY=false RUBY_CHANGED=true ;; - # Ruby gem-specific specs + # Ruby gem-specific specs (MUST be after Generators to avoid catching generator specs) react_on_rails/spec/react_on_rails/*|react_on_rails/spec/react_on_rails/**/*|.github/workflows/gem-tests.yml) DOCS_ONLY=false RSPEC_CHANGED=true ;; - # Generators - react_on_rails/lib/generators/*|react_on_rails/lib/generators/**/*|rakelib/example_type.rb|rakelib/examples_config.yml|rakelib/shakapacker_examples.rake|.github/workflows/examples.yml) - DOCS_ONLY=false - GENERATORS_CHANGED=true - ;; - # JavaScript/TypeScript source (including tests, scripts, and package files) package.json|yarn.lock|packages/react-on-rails/src/*|packages/react-on-rails/src/**/*|packages/react-on-rails/tests/*|packages/react-on-rails/tests/**/*|packages/react-on-rails/scripts/*|packages/react-on-rails/scripts/**/*|packages/react-on-rails/package.json|packages/react-on-rails/tsconfig.json|.github/workflows/package-js-tests.yml) DOCS_ONLY=false From 3e55c99a74be64e170e8e87c4cf480adab3bd965 Mon Sep 17 00:00:00 2001 From: Justin Gordon Date: Mon, 8 Dec 2025 18:14:47 -1000 Subject: [PATCH 2/4] Improve ci-changes-detector comments MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Remove outdated TODO comment about duplicating to pro (Pro has no generators) - Clarify RSpec pattern comment to explain it catches ALL specs 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- script/ci-changes-detector | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/script/ci-changes-detector b/script/ci-changes-detector index 3d8a4fbaa8..0541196572 100755 --- a/script/ci-changes-detector +++ b/script/ci-changes-detector @@ -59,7 +59,7 @@ RUBY_CHANGED=false RSPEC_CHANGED=false SPEC_DUMMY_CHANGED=false JS_CHANGED=false -GENERATORS_CHANGED=false # needs to be duplicated to pro +GENERATORS_CHANGED=false PRO_RUBY_CHANGED=false PRO_RSPEC_CHANGED=false PRO_JS_CHANGED=false @@ -87,7 +87,7 @@ while IFS= read -r file; do RUBY_CHANGED=true ;; - # Ruby gem-specific specs (MUST be after Generators to avoid catching generator specs) + # Ruby gem-specific specs (MUST be after Generators since this pattern catches ALL specs including generator specs) react_on_rails/spec/react_on_rails/*|react_on_rails/spec/react_on_rails/**/*|.github/workflows/gem-tests.yml) DOCS_ONLY=false RSPEC_CHANGED=true From 2d3df938f0b55e71b6f46194745a23d4ca592bb6 Mon Sep 17 00:00:00 2001 From: Justin Gordon Date: Mon, 8 Dec 2025 18:28:37 -1000 Subject: [PATCH 3/4] Trigger gem tests when generator files change MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Generator unit tests (spec/react_on_rails/generators/*_spec.rb) are run by gem-tests.yml, which checks run_ruby_tests. Previously, generator file changes only set run_generators (used by examples.yml) but not run_ruby_tests, so generator specs wouldn't run. Now GENERATORS_CHANGED also triggers RUN_RUBY_TESTS=true. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- script/ci-changes-detector | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/ci-changes-detector b/script/ci-changes-detector index 0541196572..14adfcd3b0 100755 --- a/script/ci-changes-detector +++ b/script/ci-changes-detector @@ -255,7 +255,7 @@ if [ "$LINT_CONFIG_CHANGED" = true ] || [ "$RUBY_CHANGED" = true ] || [ "$JS_CHA RUN_LINT=true fi -if [ "$RUBY_CHANGED" = true ] || [ "$RSPEC_CHANGED" = true ]; then +if [ "$RUBY_CHANGED" = true ] || [ "$RSPEC_CHANGED" = true ] || [ "$GENERATORS_CHANGED" = true ]; then RUN_RUBY_TESTS=true fi From a95ce8a080abab144e69e079053a7290fd9190c0 Mon Sep 17 00:00:00 2001 From: Justin Gordon Date: Mon, 8 Dec 2025 18:40:09 -1000 Subject: [PATCH 4/4] Rename RUBY_CHANGED to RUBY_CORE_CHANGED for clarity MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The variable name RUBY_CHANGED was ambiguous since generators are also Ruby files. Renaming to RUBY_CORE_CHANGED makes it clear this refers to non-generator lib files (react_on_rails/lib/**/*.rb excluding react_on_rails/lib/generators/). This clarifies the logic in the condition: if RUBY_CORE_CHANGED || RSPEC_CHANGED || GENERATORS_CHANGED Each flag now clearly represents a distinct category of Ruby code. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- script/ci-changes-detector | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/script/ci-changes-detector b/script/ci-changes-detector index 14adfcd3b0..391a2d1429 100755 --- a/script/ci-changes-detector +++ b/script/ci-changes-detector @@ -55,12 +55,12 @@ fi DOCS_ONLY=true LINT_CONFIG_CHANGED=false PRO_LINT_CONFIG_CHANGED=false -RUBY_CHANGED=false +RUBY_CORE_CHANGED=false RSPEC_CHANGED=false SPEC_DUMMY_CHANGED=false JS_CHANGED=false GENERATORS_CHANGED=false -PRO_RUBY_CHANGED=false +PRO_RUBY_CORE_CHANGED=false PRO_RSPEC_CHANGED=false PRO_JS_CHANGED=false PRO_DUMMY_CHANGED=false @@ -81,10 +81,10 @@ while IFS= read -r file; do GENERATORS_CHANGED=true ;; - # Ruby source code + # Ruby core source code (non-generator lib files) react_on_rails/lib/*.rb|react_on_rails/lib/**/*.rb|Gemfile|Gemfile.lock|rakelib/run_rspec.rake|rakelib/node_package.rake|rakelib/dummy_apps.rake) DOCS_ONLY=false - RUBY_CHANGED=true + RUBY_CORE_CHANGED=true ;; # Ruby gem-specific specs (MUST be after Generators since this pattern catches ALL specs including generator specs) @@ -108,7 +108,7 @@ while IFS= read -r file; do # React on Rails Pro source code react_on_rails_pro/lib/*|react_on_rails_pro/lib/**/*) DOCS_ONLY=false - PRO_RUBY_CHANGED=true + PRO_RUBY_CORE_CHANGED=true ;; # JavaScript/TypeScript Pro source (including tests, scripts, and package files) @@ -151,11 +151,11 @@ while IFS= read -r file; do # Changes to CI infrastructure should trigger tests to validate the changes work script/*|script/**/*|bin/*|bin/**/*|.github/workflows/*|.github/actions/*|.github/actions/**/*|lefthook.yml) DOCS_ONLY=false - RUBY_CHANGED=true # Trigger all tests for CI infrastructure changes + RUBY_CORE_CHANGED=true # Trigger all tests for CI infrastructure changes JS_CHANGED=true SPEC_DUMMY_CHANGED=true GENERATORS_CHANGED=true - PRO_RUBY_CHANGED=true + PRO_RUBY_CORE_CHANGED=true PRO_JS_CHANGED=true PRO_DUMMY_CHANGED=true ;; @@ -223,14 +223,14 @@ if [ "$DOCS_ONLY" = true ]; then fi echo "Changed file categories:" -[ "$RUBY_CHANGED" = true ] && echo -e "${YELLOW} • Ruby source code${NC}" +[ "$RUBY_CORE_CHANGED" = true ] && echo -e "${YELLOW} • Ruby core source code${NC}" [ "$JS_CHANGED" = true ] && echo -e "${YELLOW} • JavaScript/TypeScript code${NC}" [ "$RSPEC_CHANGED" = true ] && echo -e "${YELLOW} • RSpec tests${NC}" [ "$SPEC_DUMMY_CHANGED" = true ] && echo -e "${YELLOW} • Dummy app${NC}" [ "$GENERATORS_CHANGED" = true ] && echo -e "${YELLOW} • Generators${NC}" [ "$PRO_JS_CHANGED" = true ] && echo -e "${YELLOW} • React on Rails Pro JavaScript/TypeScript${NC}" [ "$PRO_RSPEC_CHANGED" = true ] && echo -e "${YELLOW} • React on Rails Pro RSpec tests${NC}" -[ "$PRO_RUBY_CHANGED" = true ] && echo -e "${YELLOW} • React on Rails Pro Ruby source code${NC}" +[ "$PRO_RUBY_CORE_CHANGED" = true ] && echo -e "${YELLOW} • React on Rails Pro Ruby core source code${NC}" [ "$PRO_DUMMY_CHANGED" = true ] && echo -e "${YELLOW} • React on Rails Pro Dummy app${NC}" [ "$PRO_NODE_RENDERER_CHANGED" = true ] && echo -e "${YELLOW} • React on Rails Pro Node Renderer package${NC}" [ "$LINT_CONFIG_CHANGED" = true ] && echo -e "${YELLOW} • Lint/format configuration${NC}" @@ -251,11 +251,11 @@ RUN_PRO_TESTS=false RUN_PRO_DUMMY_TESTS=false RUN_PRO_NODE_RENDERER_TESTS=false -if [ "$LINT_CONFIG_CHANGED" = true ] || [ "$RUBY_CHANGED" = true ] || [ "$JS_CHANGED" = true ] || [ "$SPEC_DUMMY_CHANGED" = true ]; then +if [ "$LINT_CONFIG_CHANGED" = true ] || [ "$RUBY_CORE_CHANGED" = true ] || [ "$JS_CHANGED" = true ] || [ "$SPEC_DUMMY_CHANGED" = true ]; then RUN_LINT=true fi -if [ "$RUBY_CHANGED" = true ] || [ "$RSPEC_CHANGED" = true ] || [ "$GENERATORS_CHANGED" = true ]; then +if [ "$RUBY_CORE_CHANGED" = true ] || [ "$RSPEC_CHANGED" = true ] || [ "$GENERATORS_CHANGED" = true ]; then RUN_RUBY_TESTS=true fi @@ -263,7 +263,7 @@ if [ "$JS_CHANGED" = true ]; then RUN_JS_TESTS=true fi -if [ "$SPEC_DUMMY_CHANGED" = true ] || [ "$RUBY_CHANGED" = true ] || [ "$JS_CHANGED" = true ]; then +if [ "$SPEC_DUMMY_CHANGED" = true ] || [ "$RUBY_CORE_CHANGED" = true ] || [ "$JS_CHANGED" = true ]; then RUN_DUMMY_TESTS=true fi @@ -271,19 +271,19 @@ if [ "$GENERATORS_CHANGED" = true ]; then RUN_GENERATORS=true fi -if [ "$PRO_LINT_CONFIG_CHANGED" = true ] || [ "$PRO_RUBY_CHANGED" = true ] || [ "$PRO_JS_CHANGED" = true ] || [ "$PRO_DUMMY_CHANGED" = true ] || [ "$RUBY_CHANGED" = true ]; then +if [ "$PRO_LINT_CONFIG_CHANGED" = true ] || [ "$PRO_RUBY_CORE_CHANGED" = true ] || [ "$PRO_JS_CHANGED" = true ] || [ "$PRO_DUMMY_CHANGED" = true ] || [ "$RUBY_CORE_CHANGED" = true ]; then RUN_PRO_LINT=true fi -if [ "$PRO_RUBY_CHANGED" = true ] || [ "$PRO_RSPEC_CHANGED" = true ] || [ "$PRO_JS_CHANGED" = true ] || [ "$RUBY_CHANGED" = true ]; then +if [ "$PRO_RUBY_CORE_CHANGED" = true ] || [ "$PRO_RSPEC_CHANGED" = true ] || [ "$PRO_JS_CHANGED" = true ] || [ "$RUBY_CORE_CHANGED" = true ]; then RUN_PRO_TESTS=true fi -if [ "$PRO_DUMMY_CHANGED" = true ] || [ "$PRO_RUBY_CHANGED" = true ] || [ "$PRO_JS_CHANGED" = true ] || [ "$RUBY_CHANGED" = true ]; then +if [ "$PRO_DUMMY_CHANGED" = true ] || [ "$PRO_RUBY_CORE_CHANGED" = true ] || [ "$PRO_JS_CHANGED" = true ] || [ "$RUBY_CORE_CHANGED" = true ]; then RUN_PRO_DUMMY_TESTS=true fi -if [ "$PRO_NODE_RENDERER_CHANGED" = true ] || [ "$PRO_JS_CHANGED" = true ] || [ "$RUBY_CHANGED" = true ]; then +if [ "$PRO_NODE_RENDERER_CHANGED" = true ] || [ "$PRO_JS_CHANGED" = true ] || [ "$RUBY_CORE_CHANGED" = true ]; then RUN_PRO_NODE_RENDERER_TESTS=true fi