Skip to content

Commit 914f7de

Browse files
justin808claude
andauthored
Fix bin/dev NameError: missing PackerUtils require (#2070)
## Summary Fixes bin/dev failing with `uninitialized constant ReactOnRails::PackerUtils (NameError)` by adding missing require statement to `pack_generator.rb`. ## Problem When running `bin/dev` in a generated app or spec/dummy, it failed with: ``` /lib/react_on_rails/dev/pack_generator.rb:30:in 'ReactOnRails::Dev::PackGenerator.generate': uninitialized constant ReactOnRails::PackerUtils (NameError) ``` The issue: `pack_generator.rb` was using `ReactOnRails::PackerUtils` without requiring it. ## Solution - Added `require_relative "../packer_utils"` to `lib/react_on_rails/dev/pack_generator.rb` - Added integration tests to verify all required modules are accessible when loading `react_on_rails/dev` - Added test to ensure `PackerUtils` is available without `NameError` ## Testing - ✅ Added integration test in `dev_spec.rb` to verify bin/dev dependencies load correctly - ✅ Added module dependencies test in `pack_generator_spec.rb` to catch missing requires - ✅ All existing tests still pass - ✅ RuboCop passes ## Impact This fix ensures `bin/dev` works for: - All newly generated apps (using the template) - The spec/dummy test app - Any existing apps using beta.10 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Tests** * Added integration tests to verify development tooling components are properly loaded and accessible at runtime. * **Chores** * Updated internal dependency management for development utilities. <sub>✏️ Tip: You can customize this high-level summary in your review settings.</sub> <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Co-authored-by: Claude <[email protected]>
1 parent b547ef9 commit 914f7de

File tree

10 files changed

+138
-0
lines changed

10 files changed

+138
-0
lines changed

Steepfile

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ target :lib do
2828
check "lib/react_on_rails.rb"
2929
check "lib/react_on_rails/configuration.rb"
3030
check "lib/react_on_rails/controller.rb"
31+
check "lib/react_on_rails/dev/file_manager.rb"
32+
check "lib/react_on_rails/dev/pack_generator.rb"
33+
check "lib/react_on_rails/dev/process_manager.rb"
34+
check "lib/react_on_rails/dev/server_manager.rb"
3135
check "lib/react_on_rails/git_utils.rb"
3236
check "lib/react_on_rails/helper.rb"
3337
check "lib/react_on_rails/packer_utils.rb"

lib/react_on_rails/dev/pack_generator.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
require "English"
44
require "stringio"
5+
require_relative "../packer_utils"
56

67
module ReactOnRails
78
module Dev

lib/react_on_rails/dev/server_manager.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
require "English"
44
require "open3"
55
require "rainbow"
6+
require_relative "../packer_utils"
67

78
module ReactOnRails
89
module Dev
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
module ReactOnRails
2+
module Dev
3+
class FileManager
4+
def self.cleanup_stale_files: () -> bool
5+
6+
private
7+
8+
def self.cleanup_overmind_sockets: () -> bool
9+
def self.cleanup_rails_pid_file: () -> bool
10+
def self.overmind_running?: () -> bool
11+
def self.process_running?: (Integer) -> bool
12+
def self.remove_file_if_exists: (String, String) -> bool
13+
end
14+
end
15+
end
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
module ReactOnRails
2+
module Dev
3+
class PackGenerator
4+
def self.generate: (?verbose: bool) -> void
5+
6+
private
7+
8+
def self.run_pack_generation: (?silent: bool) -> bool
9+
def self.should_run_directly?: () -> bool
10+
def self.rails_available?: () -> bool
11+
def self.run_rake_task_directly: (?silent: bool) -> bool
12+
def self.load_rake_tasks: () -> void
13+
def self.prepare_rake_task: () -> untyped
14+
def self.capture_output: (bool) { () -> bool } -> bool
15+
def self.handle_rake_error: (Exception, bool) -> void
16+
def self.run_via_bundle_exec: (?silent: bool) -> (bool | nil)
17+
end
18+
end
19+
end
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
module ReactOnRails
2+
module Dev
3+
class ProcessManager
4+
VERSION_CHECK_TIMEOUT: Integer
5+
6+
def self.installed?: (String) -> bool
7+
def self.ensure_procfile: (String) -> void
8+
def self.run_with_process_manager: (String) -> void
9+
10+
private
11+
12+
def self.installed_in_current_context?: (String) -> bool
13+
def self.version_flags_for: (String) -> Array[String]
14+
def self.run_process_if_available: (String, Array[String]) -> bool
15+
def self.run_process_outside_bundle: (String, Array[String]) -> bool
16+
def self.process_available_in_system?: (String) -> bool
17+
def self.with_unbundled_context: () { () -> untyped } -> untyped
18+
def self.show_process_manager_installation_help: () -> void
19+
def self.valid_procfile_path?: (String) -> bool
20+
end
21+
end
22+
end
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
module ReactOnRails
2+
module Dev
3+
class ServerManager
4+
type mode = :development | :production_like | :static | :hmr
5+
6+
def self.start: (mode, String?, ?verbose: bool, ?route: String?, ?rails_env: String?) -> void
7+
def self.kill_processes: () -> void
8+
def self.development_processes: () -> Hash[String, String]
9+
def self.kill_running_processes: () -> bool
10+
def self.find_process_pids: (String) -> Array[Integer]
11+
def self.terminate_processes: (Array[Integer]) -> void
12+
def self.kill_port_processes: (Array[Integer]) -> bool
13+
def self.find_port_pids: (Integer) -> Array[Integer]
14+
def self.cleanup_socket_files: () -> bool
15+
def self.print_kill_summary: (bool) -> void
16+
def self.show_help: () -> void
17+
def self.run_from_command_line: (?Array[String]) -> void
18+
19+
private
20+
21+
def self.help_usage: () -> String
22+
def self.help_commands: () -> String
23+
def self.help_options: () -> String
24+
def self.help_customization: () -> String
25+
def self.help_mode_details: () -> String
26+
def self.help_troubleshooting: () -> String
27+
def self.run_production_like: (?_verbose: bool, ?route: String?, ?rails_env: String?) -> void
28+
def self.run_static_development: (String, ?verbose: bool, ?route: String?) -> void
29+
def self.run_development: (String, ?verbose: bool, ?route: String?) -> void
30+
def self.print_server_info: (String, Array[String], ?Integer, ?route: String?) -> void
31+
def self.print_procfile_info: (String, ?route: String?) -> void
32+
def self.procfile_port: (String) -> Integer
33+
def self.box_border: (Integer) -> String
34+
def self.box_bottom: (Integer) -> String
35+
def self.box_empty_line: (Integer) -> String
36+
def self.format_box_line: (String, Integer) -> String
37+
end
38+
end
39+
end

spec/react_on_rails/binstubs/dev_spec.rb

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
RSpec.describe "bin/dev script" do
66
let(:script_path) { "lib/generators/react_on_rails/templates/base/base/bin/dev" }
7+
let(:dummy_dev_path) { "spec/dummy/bin/dev" }
78

89
# To suppress stdout during tests
910
original_stderr = $stderr
@@ -58,4 +59,28 @@ def setup_script_execution_for_tool_tests
5859

5960
load script_path
6061
end
62+
63+
# Integration test: verify bin/dev can load without NameError
64+
describe "integration test" do
65+
it "spec/dummy/bin/dev can load the template script without errors" do
66+
# This test verifies that all required dependencies are properly loaded
67+
# when bin/dev is executed, catching issues like missing require statements
68+
expect(File.exist?(dummy_dev_path)).to be true
69+
expect(File.exist?(script_path)).to be true
70+
71+
# Verify the dummy script references the template
72+
dummy_content = File.read(dummy_dev_path)
73+
expect(dummy_content).to include(script_path)
74+
end
75+
76+
it "can require react_on_rails/dev and access all necessary modules" do
77+
# This catches missing require statements in pack_generator.rb and other files
78+
# If PackerUtils isn't required, this would fail with NameError
79+
require "react_on_rails/dev"
80+
81+
expect { ReactOnRails::Dev::ServerManager }.not_to raise_error
82+
expect { ReactOnRails::Dev::PackGenerator }.not_to raise_error
83+
expect { ReactOnRails::PackerUtils }.not_to raise_error
84+
end
85+
end
6186
end

spec/react_on_rails/dev/pack_generator_spec.rb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,15 @@
44
require "react_on_rails/dev/pack_generator"
55

66
RSpec.describe ReactOnRails::Dev::PackGenerator do
7+
# Integration test: verify PackerUtils is properly required
8+
describe "module dependencies" do
9+
it "can access ReactOnRails::PackerUtils without errors" do
10+
# This test ensures the require statement is present in pack_generator.rb
11+
# If the require is missing, this will raise NameError: uninitialized constant
12+
expect { ReactOnRails::PackerUtils }.not_to raise_error
13+
end
14+
end
15+
716
describe ".generate" do
817
context "when shakapacker precompile hook is configured" do
918
before do

spec/react_on_rails/generators/generator_helper_spec.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313
let(:mock_manager) { instance_double("PackageJson::Manager") } # rubocop:disable RSpec/VerifiedDoubleReference
1414

1515
before do
16+
# Stub PackageJson constant so instance_double can reference it
17+
stub_const("PackageJson", Class.new) unless defined?(PackageJson)
18+
1619
allow(self).to receive(:package_json).and_return(mock_package_json)
1720
allow(mock_package_json).to receive(:manager).and_return(mock_manager)
1821
end

0 commit comments

Comments
 (0)