Skip to content

Commit 1801d7a

Browse files
committed
feat: CLI --only option
1 parent 9cc83df commit 1801d7a

File tree

4 files changed

+102
-77
lines changed

4 files changed

+102
-77
lines changed

lib/rails/diff.rb

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,12 @@ def file(*files, no_cache: false, commit: nil, new_app_options: nil)
2424
files.filter_map { |it| diff_with_header(it) }.join("\n")
2525
end
2626

27-
def generated(generator_name, *args, no_cache: false, skip: [], commit: nil, new_app_options: nil)
27+
def generated(generator_name, *args, no_cache: false, skip: [], only: [], commit: nil, new_app_options: nil)
2828
clear_cache if no_cache
2929
ensure_template_app_exists(commit, new_app_options)
3030
install_app_dependencies
3131

32-
generated_files(generator_name, *args, skip)
32+
generated_files(generator_name, *args, skip, only)
3333
.map { |it| diff_with_header(it) }
3434
.join("\n\n")
3535
end
@@ -98,11 +98,11 @@ def railsrc_options
9898

9999
def app_name = @app_name ||= File.basename(Dir.pwd)
100100

101-
def generated_files(generator_name, *args, skip)
101+
def generated_files(generator_name, *args, skip, only)
102102
Dir.chdir(template_app_path) do
103103
system!("bin/rails", "destroy", generator_name, *args)
104104
info "Running generator: rails generate #{generator_name} #{args.join(' ')}"
105-
FileTracker.new.track_new_files(template_app_path, skip) { system!("bin/rails", "generate", generator_name, *args) }
105+
FileTracker.new.track_new_files(template_app_path, skip, only) { system!("bin/rails", "generate", generator_name, *args) }
106106
.map { |it| it.delete_prefix("#{template_app_path}/") }
107107
end
108108
end
@@ -238,9 +238,16 @@ def file(*files)
238238

239239
desc "generated GENERATOR [args]", "Compare files that would be created by a Rails generator"
240240
option :skip, type: :array, desc: "Skip specific files or directories", aliases: ["-s"], default: []
241+
option :only, type: :array, desc: "Only include specific files or directories", aliases: ["-o"], default: []
241242
def generated(generator_name, *args)
242243
ENV["DEBUG"] = "true" if options[:debug]
243-
diff = Rails::Diff.generated(generator_name, *args, no_cache: options[:no_cache], skip: options[:skip], commit: options[:commit], new_app_options: options[:new_app_options])
244+
diff = Rails::Diff.generated(generator_name,
245+
*args,
246+
no_cache: options[:no_cache],
247+
skip: options[:skip],
248+
only: options[:only],
249+
commit: options[:commit],
250+
new_app_options: options[:new_app_options])
244251
return if diff.empty?
245252

246253
options[:fail] ? abort(diff) : puts(diff)

lib/rails/diff/file_tracker.rb

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,29 @@
11
# frozen_string_literal: true
22

33
class FileTracker
4-
def track_new_files(template_app_path, skip)
4+
def track_new_files(template_app_path, skip, only = [])
55
files_before = list_files(template_app_path)
66
yield
7-
files_after = list_files(template_app_path, skip)
7+
files_after = list_files(template_app_path, skip, only)
88
files_after - files_before
99
end
1010

1111
private
1212

13-
def list_files(dir, skip = [])
14-
Dir.glob("#{dir}/**/*", File::FNM_DOTMATCH).reject do |it|
15-
File.directory?(it) ||
16-
it.start_with?("#{dir}/.git") ||
17-
it.start_with?("#{dir}/tmp") ||
18-
it.start_with?("#{dir}/log") ||
19-
it.start_with?("#{dir}/test") ||
20-
skip.any? { |s| it.start_with?("#{dir}/#{s}") }
21-
end
13+
def list_files(dir, skip = [], only = [])
14+
files = Dir.glob("#{dir}/**/*", File::FNM_DOTMATCH).reject do |it|
15+
File.directory?(it) ||
16+
it.start_with?("#{dir}/.git") ||
17+
it.start_with?("#{dir}/tmp") ||
18+
it.start_with?("#{dir}/log") ||
19+
it.start_with?("#{dir}/test") ||
20+
skip.any? { |s| it.start_with?("#{dir}/#{s}") }
2221
end
22+
23+
if only.any?
24+
files.select { |it| only.any? { |o| it.start_with?("#{dir}/#{o}") } }
25+
else
26+
files
27+
end
28+
end
2329
end
Lines changed: 73 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1,65 +1,77 @@
1+
# frozen_string_literal: true
2+
13
require 'rails/diff/file_tracker'
24

35
RSpec.describe FileTracker do
4-
context "integration tests" do
5-
let(:temp_dir) { Dir.mktmpdir }
6-
7-
after do
8-
FileUtils.remove_entry(temp_dir)
9-
end
10-
11-
it "tracks newly created files" do
12-
FileUtils.touch("#{temp_dir}/file1.rb")
13-
file_tracker = FileTracker.new
14-
15-
new_files = file_tracker.track_new_files(temp_dir, []) do
16-
FileUtils.touch("#{temp_dir}/file2.rb")
17-
FileUtils.touch("#{temp_dir}/file3.rb")
18-
end
19-
20-
expect(new_files).to contain_exactly("#{temp_dir}/file2.rb", "#{temp_dir}/file3.rb")
21-
end
22-
23-
it "excludes skipped files" do
24-
FileUtils.touch("#{temp_dir}/file1.rb")
25-
file_tracker = FileTracker.new
26-
27-
new_files = file_tracker.track_new_files(temp_dir, ["file2.rb"]) do
28-
FileUtils.touch("#{temp_dir}/file2.rb")
29-
FileUtils.touch("#{temp_dir}/file3.rb")
30-
end
31-
32-
expect(new_files).to contain_exactly("#{temp_dir}/file3.rb")
33-
end
34-
35-
it "ignores files in special directories" do
36-
FileUtils.mkdir_p("#{temp_dir}/.git")
37-
FileUtils.mkdir_p("#{temp_dir}/tmp")
38-
FileUtils.mkdir_p("#{temp_dir}/log")
39-
FileUtils.touch("#{temp_dir}/file1.rb")
40-
file_tracker = FileTracker.new
41-
42-
new_files = file_tracker.track_new_files(temp_dir, []) do
43-
FileUtils.touch("#{temp_dir}/.git/config")
44-
FileUtils.touch("#{temp_dir}/tmp/cache")
45-
FileUtils.touch("#{temp_dir}/log/development.log")
46-
FileUtils.touch("#{temp_dir}/file2.rb")
47-
end
48-
49-
expect(new_files).to contain_exactly("#{temp_dir}/file2.rb")
50-
end
51-
52-
it "handles nested directories" do
53-
FileUtils.touch("#{temp_dir}/file1.rb")
54-
file_tracker = FileTracker.new
55-
56-
new_files = file_tracker.track_new_files(temp_dir, []) do
57-
FileUtils.mkdir_p("#{temp_dir}/nested/dir")
58-
FileUtils.touch("#{temp_dir}/nested/file2.rb")
59-
FileUtils.touch("#{temp_dir}/nested/dir/file3.rb")
60-
end
61-
62-
expect(new_files).to contain_exactly("#{temp_dir}/nested/file2.rb", "#{temp_dir}/nested/dir/file3.rb")
63-
end
6+
context 'integration tests' do
7+
let(:temp_dir) { Dir.mktmpdir }
8+
9+
after do
10+
FileUtils.remove_entry(temp_dir)
11+
end
12+
13+
it 'tracks newly created files' do
14+
FileUtils.touch("#{temp_dir}/file1.rb")
15+
file_tracker = FileTracker.new
16+
17+
new_files = file_tracker.track_new_files(temp_dir, []) do
18+
FileUtils.touch("#{temp_dir}/file2.rb")
19+
FileUtils.touch("#{temp_dir}/file3.rb")
20+
end
21+
22+
expect(new_files).to contain_exactly("#{temp_dir}/file2.rb", "#{temp_dir}/file3.rb")
23+
end
24+
25+
it 'excludes skipped files' do
26+
FileUtils.touch("#{temp_dir}/file1.rb")
27+
file_tracker = FileTracker.new
28+
29+
new_files = file_tracker.track_new_files(temp_dir, ['file2.rb']) do
30+
FileUtils.touch("#{temp_dir}/file2.rb")
31+
FileUtils.touch("#{temp_dir}/file3.rb")
32+
end
33+
34+
expect(new_files).to contain_exactly("#{temp_dir}/file3.rb")
35+
end
36+
37+
it 'handles files with --only option' do
38+
FileUtils.touch("#{temp_dir}/file1.rb")
39+
file_tracker = FileTracker.new
40+
new_files = file_tracker.track_new_files(temp_dir, [], ['file2.rb']) do
41+
FileUtils.touch("#{temp_dir}/file2.rb")
42+
FileUtils.touch("#{temp_dir}/file3.rb")
43+
end
44+
expect(new_files).to contain_exactly("#{temp_dir}/file2.rb")
45+
end
46+
47+
it 'ignores files in special directories' do
48+
FileUtils.mkdir_p("#{temp_dir}/.git")
49+
FileUtils.mkdir_p("#{temp_dir}/tmp")
50+
FileUtils.mkdir_p("#{temp_dir}/log")
51+
FileUtils.touch("#{temp_dir}/file1.rb")
52+
file_tracker = FileTracker.new
53+
54+
new_files = file_tracker.track_new_files(temp_dir, []) do
55+
FileUtils.touch("#{temp_dir}/.git/config")
56+
FileUtils.touch("#{temp_dir}/tmp/cache")
57+
FileUtils.touch("#{temp_dir}/log/development.log")
58+
FileUtils.touch("#{temp_dir}/file2.rb")
59+
end
60+
61+
expect(new_files).to contain_exactly("#{temp_dir}/file2.rb")
62+
end
63+
64+
it 'handles nested directories' do
65+
FileUtils.touch("#{temp_dir}/file1.rb")
66+
file_tracker = FileTracker.new
67+
68+
new_files = file_tracker.track_new_files(temp_dir, []) do
69+
FileUtils.mkdir_p("#{temp_dir}/nested/dir")
70+
FileUtils.touch("#{temp_dir}/nested/file2.rb")
71+
FileUtils.touch("#{temp_dir}/nested/dir/file3.rb")
72+
end
73+
74+
expect(new_files).to contain_exactly("#{temp_dir}/nested/file2.rb", "#{temp_dir}/nested/dir/file3.rb")
6475
end
65-
end
76+
end
77+
end

spec/integration/rails/diff_spec.rb

Whitespace-only changes.

0 commit comments

Comments
 (0)