File: update_error_map.rake

package info (click to toggle)
yard 0.9.37-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 5,720 kB
  • sloc: ruby: 31,354; javascript: 7,608; makefile: 21
file content (53 lines) | stat: -rw-r--r-- 1,562 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# frozen_string_literal: true

# Script to generate the Error class name map in:
# lib/yard/handlers/c/base.rb

require 'open-uri'
require 'stringio'

desc 'Update the error class names map'
task :update_error_map do

  ERROR_C_URL = 'https://raw.githubusercontent.com/ruby/ruby/master/error.c'

  INIT_MATCH = /void\s+Init_Exception\(void\)\s*\{(.+?)^\}/m
  NAME_MATCH = /(\w+)\s*=\s*rb_define_class\("([^"]+)"/

  $stderr.puts "Downloading #{ERROR_C_URL} ..."
  content = open(ERROR_C_URL) { |io| io.read }

  $stderr.puts "Extracting class names ..."
  init_source = content.match(INIT_MATCH).captures.first
  map = init_source.scan(NAME_MATCH).sort_by { |key, value| key }

  $stderr.puts "Generating new lookup table ..."
  indent = '  ' * 4
  source = StringIO.new
  source.puts "#{indent}ERROR_CLASS_NAMES = {"
  map.each do |variable, name|
    source.puts "#{indent}  '#{variable}' => '#{name}',"
  end
  source.puts "#{indent}}"

  $stderr.puts source.string

  $stderr.puts "Patching 'lib/yard/handlers/c/base.rb' ..."
  CLASS_NAME_MAP_MATCH = /^\s+ERROR_CLASS_NAMES = {[^}]+}/

  PROJECT_PATH = File.expand_path('..', __dir__)
  C_BASE_HANDLER = File.join(PROJECT_PATH, 'lib/yard/handlers/c/base.rb')

  File.open(C_BASE_HANDLER, 'r+') { |file|
    content = file.read
    # .rstrip is added to avoid adding new empty lines due to the new lines
    # added by `.puts` when building the string.
    content.gsub!(CLASS_NAME_MAP_MATCH, source.string.rstrip)
    file.rewind
    file.truncate(0)
    file.write(content)
  }

  $stderr.puts "Done!"

end