Skip to content

Commit 3d5fb0d

Browse files
committed
fix rails stats not finding spec directories when CWD != Rails.root
1 parent 8b87925 commit 3d5fb0d

File tree

3 files changed

+35
-11
lines changed

3 files changed

+35
-11
lines changed

features/rails_stats.feature

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
Feature: Rails stats includes spec directories
2+
3+
Scenario: rails stats finds spec directories when run from a different working directory
4+
Given rails 8 or later is available
5+
Given a file named "spec/models/widget_spec.rb" with:
6+
"""ruby
7+
require "rails_helper"
8+
9+
RSpec.describe Widget, type: :model do
10+
it "works" do
11+
expect(true).to be true
12+
end
13+
end
14+
"""
15+
When I run `bash -c "APP=$PWD && cd /tmp && $APP/bin/rails stats"`
16+
Then the output should contain "Model spec"

features/step_definitions/additional_cli_steps.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,3 +43,9 @@
4343
pending "Action Mailbox is not available"
4444
end
4545
end
46+
47+
Given /rails 8 or later is available/ do
48+
unless ::Rails::VERSION::STRING >= "8.0.0"
49+
pending "Rails 8.0+ is required"
50+
end
51+
end

lib/rspec-rails.rb

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,19 @@ class Railtie < ::Rails::Railtie
1212

1313
# As of Rails 8.0.0 you can register directories to work with `rails stats`
1414
if ::Rails::VERSION::STRING >= "8.0.0"
15-
require 'rails/code_statistics'
16-
17-
dirs = Dir['./spec/**/*_spec.rb']
18-
.map { |f| f.sub(/^\.\/(spec\/\w+)\/.*/, '\\1') }
19-
.uniq
20-
.select { |f| File.directory?(f) }
21-
22-
Hash[dirs.map { |d| [d.split('/').last, d] }].each do |type, dir|
23-
name = type.singularize.capitalize
24-
25-
::Rails::CodeStatistics.register_directory "#{name} specs", dir, test_directory: true
15+
initializer "rspec_rails.code_statistics" do
16+
require 'rails/code_statistics'
17+
18+
root = ::Rails.root
19+
dirs = Dir[root.join('spec', '**', '*_spec.rb').to_s]
20+
.map { |f| f.sub(%r{^#{Regexp.escape(root.to_s)}/(spec/\w+)/.*}, '\\1') }
21+
.uniq
22+
.select { |f| File.directory?(root.join(f)) }
23+
24+
Hash[dirs.map { |d| [d.split('/').last, d] }].each do |type, dir|
25+
name = type.singularize.capitalize
26+
::Rails::CodeStatistics.register_directory "#{name} specs", root.join(dir).to_s, test_directory: true
27+
end
2628
end
2729
end
2830

0 commit comments

Comments
 (0)