@@ -5,6 +5,7 @@ $:.unshift File.expand_path('lib', __dir__) # default template dir
55require_relative 'lib/rdoc/task'
66require 'bundler/gem_tasks'
77require 'rake/testtask'
8+ require 'rubocop/rake_task'
89
910task :test => [ :normal_test , :rubygems_test ]
1011
3738
3839Rake ::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" )
4242end
4343
4444Rake ::TestTask . new ( :rubygems_test ) do |t |
4545 t . verbose = true
46- t . deps = :generate
4746 t . pattern = "test/rdoc/rdoc_rubygems_hook_test.rb"
4847end
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
8868end
8969
90- task "#{ path } .gem" => package_parser_files
9170desc "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
94125task :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
98130end
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" ]
121143end
0 commit comments