@@ -5,6 +5,7 @@ $:.unshift File.expand_path('lib', __dir__) # default template dir
5
5
require_relative 'lib/rdoc/task'
6
6
require 'bundler/gem_tasks'
7
7
require 'rake/testtask'
8
+ require 'rubocop/rake_task'
8
9
9
10
task :test => [ :normal_test , :rubygems_test ]
10
11
37
38
38
39
Rake ::TestTask . new ( :normal_test ) do |t |
39
40
t . verbose = true
40
- t . deps = :generate
41
41
t . test_files = FileList [ "test/**/*_test.rb" ] . exclude ( "test/rdoc/rdoc_rubygems_hook_test.rb" )
42
42
end
43
43
44
44
Rake ::TestTask . new ( :rubygems_test ) do |t |
45
45
t . verbose = true
46
- t . deps = :generate
47
46
t . pattern = "test/rdoc/rdoc_rubygems_hook_test.rb"
48
47
end
49
48
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 )
64
50
ext = File . extname ( parser_file )
65
51
parsed_file = "#{ parser_file . chomp ( ext ) } .rb"
66
52
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
84
61
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
85
65
end
86
66
87
67
parsed_file
88
68
end
89
69
90
- task "#{ path } .gem" => package_parser_files
91
70
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
93
124
94
125
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 )
97
129
end
98
130
end
99
131
@@ -106,16 +138,6 @@ namespace :build do
106
138
abort ( "Expected Ruby to be cloned under the same parent directory as RDoc to use this task" )
107
139
end
108
140
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 )
119
142
end
120
- task :build => [ :generate , "format_generated_files:autocorrect" ]
121
143
end
0 commit comments