Skip to content

Commit 11b093a

Browse files
authored
Commit generated files (#1410)
Closes #1107 and will likely prevent issues like https://bugs.ruby-lang.org/issues/21541 in the future With ignoring generated files in the source control, we always need one extra step to make the gem usable, which limits how the gem can be distributed (#1107) and make post-distribution issues easier to happen (which are in general harder to fix too). If gems like ~~`prism` and~~ `rbs` and `debug` can avoid this issue by committing generated files and verifying them on CI, I think we should do that too.
1 parent 069fbf6 commit 11b093a

File tree

9 files changed

+20757
-56
lines changed

9 files changed

+20757
-56
lines changed

.github/workflows/lint.yml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,3 @@ jobs:
2727
bundler-cache: true
2828
- name: Run rubocop
2929
run: bundle exec rubocop
30-
- name: Sanity check for the format_generated_files task
31-
run: bundle exec rake generate format_generated_files
32-

.github/workflows/test.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ jobs:
5050
with:
5151
ruby-version: ${{ matrix.ruby }}
5252
bundler-cache: true # 'bundle install' and cache
53+
- name: Verify generated parser files
54+
run: bundle exec rake verify_generated
5355
- name: Run test
5456
run: bundle exec rake
5557
env:

.gitignore

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,6 @@
88
/TAGS
99
/html
1010
/_site
11-
/lib/rdoc/rd/block_parser.rb
12-
/lib/rdoc/rd/inline_parser.rb
13-
/lib/rdoc/markdown.rb
14-
/lib/rdoc/markdown/literals.rb
1511
/pkg
1612
/tmp
1713
Gemfile.lock

Gemfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ source 'https://rubygems.org'
33
gemspec
44

55
gem 'rake'
6-
gem 'racc', '> 1.4.10'
6+
gem 'racc', '1.8.1'
77
gem 'kpeg', '>= 1.3.3'
88
gem 'test-unit'
99
gem 'test-unit-ruby-core'

Rakefile

Lines changed: 70 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ $:.unshift File.expand_path('lib', __dir__) # default template dir
55
require_relative 'lib/rdoc/task'
66
require 'bundler/gem_tasks'
77
require 'rake/testtask'
8+
require 'rubocop/rake_task'
89

910
task :test => [:normal_test, :rubygems_test]
1011

@@ -37,63 +38,94 @@ end
3738

3839
Rake::TestTask.new(:normal_test) do |t|
3940
t.verbose = true
40-
t.deps = :generate
4141
t.test_files = FileList["test/**/*_test.rb"].exclude("test/rdoc/rdoc_rubygems_hook_test.rb")
4242
end
4343

4444
Rake::TestTask.new(:rubygems_test) do |t|
4545
t.verbose = true
46-
t.deps = :generate
4746
t.pattern = "test/rdoc/rdoc_rubygems_hook_test.rb"
4847
end
4948

50-
path = "pkg/#{Bundler::GemHelper.gemspec.full_name}"
51-
52-
package_parser_files = PARSER_FILES.map do |parser_file|
53-
name = File.basename(parser_file, File.extname(parser_file))
54-
_path = File.dirname(parser_file)
55-
package_parser_file = "#{path}/#{name}.rb"
56-
parsed_file = "#{_path}/#{name}.rb"
57-
58-
file package_parser_file => parsed_file # ensure copy runs before racc
59-
60-
package_parser_file
61-
end
62-
63-
parsed_files = PARSER_FILES.map do |parser_file|
49+
def generate_parser_file(parser_file)
6450
ext = File.extname(parser_file)
6551
parsed_file = "#{parser_file.chomp(ext)}.rb"
6652

67-
file parsed_file => parser_file do |t|
68-
puts "Generating #{parsed_file}..."
69-
case ext
70-
when '.ry' # need racc
71-
racc = Gem.bin_path 'racc', 'racc'
72-
rb_file = parser_file.gsub(/\.ry\z/, ".rb")
73-
ruby "#{racc} -l -E -o #{rb_file} #{parser_file}"
74-
File.open(rb_file, 'r+') do |f|
75-
newtext = "# frozen_string_literal: true\n#{f.read}"
76-
f.rewind
77-
f.write newtext
78-
end
79-
when '.kpeg' # need kpeg
80-
kpeg = Gem.bin_path 'kpeg', 'kpeg'
81-
rb_file = parser_file.gsub(/\.kpeg\z/, ".rb")
82-
ruby "#{kpeg} -fsv -o #{rb_file} #{parser_file}"
83-
File.write(rb_file, File.read(rb_file).gsub(/ +$/, '')) # remove trailing spaces
53+
puts "Generating #{parsed_file}..."
54+
case ext
55+
when '.ry' # need racc
56+
sh "bundle", "exec", "racc", "-l", "-E", "-o", parsed_file, parser_file
57+
File.open(parsed_file, 'r+') do |f|
58+
newtext = "# frozen_string_literal: true\n#{f.read}"
59+
f.rewind
60+
f.write newtext
8461
end
62+
when '.kpeg' # need kpeg
63+
sh "bundle", "exec", "kpeg", "-fsv", "-o", parsed_file, parser_file
64+
File.write(parsed_file, File.read(parsed_file).gsub(/ +$/, '')) # remove trailing spaces
8565
end
8666

8767
parsed_file
8868
end
8969

90-
task "#{path}.gem" => package_parser_files
9170
desc "Generate all files used racc and kpeg"
92-
task :generate => parsed_files
71+
task :generate do
72+
generated_files = PARSER_FILES.map { |f| generate_parser_file(f) }
73+
74+
# Run RuboCop autocorrect on generated files
75+
require 'rubocop'
76+
cli = RuboCop::CLI.new
77+
cli.run([
78+
"--config=.generated_files_rubocop.yml",
79+
"--autocorrect",
80+
*generated_files
81+
])
82+
end
83+
84+
desc "Verify that generated parser files are up to date"
85+
# Note: This task generates files to verify changes in the parser files.
86+
# So the result is not deterministic with multiple runs.
87+
# We can improve this by using a temporary directory and checking the diff but it's more complex to maintain.
88+
task :verify_generated do
89+
parsed_files = PARSER_FILES.map { |f| f.sub(/\.(ry|kpeg)\z/, '.rb') }
90+
91+
# Save current state of generated files
92+
original_content = {}
93+
parsed_files.each do |file|
94+
original_content[file] = File.read(file)
95+
end
96+
97+
# Generate files from current source
98+
Rake::Task[:generate].invoke
99+
100+
# Check if any files changed
101+
changed_files = []
102+
parsed_files.each do |file|
103+
unless File.exist?(file)
104+
abort "Generated file #{file} does not exist!"
105+
end
106+
107+
new_content = File.read(file)
108+
if original_content[file] != new_content
109+
changed_files << file
110+
end
111+
end
112+
113+
if changed_files.empty?
114+
puts "Generated parser files are up to date."
115+
else
116+
puts "Generated parser files are out of date!"
117+
puts "Please run 'rake generate' to update the files."
118+
puts
119+
puts "Files that are out of date:"
120+
changed_files.each { |f| puts " - #{f}" }
121+
exit 1
122+
end
123+
end
93124

94125
task :clean do
95-
parsed_files.each do |path|
96-
File.delete(path) if File.exist?(path)
126+
PARSER_FILES.each do |parser_file|
127+
parsed_file = parser_file.sub(/\.(ry|kpeg)\z/, '.rb')
128+
File.delete(parsed_file) if File.exist?(parsed_file)
97129
end
98130
end
99131

@@ -106,16 +138,6 @@ namespace :build do
106138
abort("Expected Ruby to be cloned under the same parent directory as RDoc to use this task")
107139
end
108140

109-
mv("#{path}.gem", target)
110-
end
111-
end
112-
113-
begin
114-
require 'rubocop/rake_task'
115-
rescue LoadError
116-
else
117-
RuboCop::RakeTask.new(:format_generated_files) do |t|
118-
t.options = parsed_files + ["--config=.generated_files_rubocop.yml"]
141+
mv("pkg/#{Bundler::GemHelper.gemspec.full_name}.gem", target)
119142
end
120-
task :build => [:generate, "format_generated_files:autocorrect"]
121143
end

0 commit comments

Comments
 (0)