module AddMagicComment

A simple library to prepend magic comments to all Ruby files in a given folder

Constants

EMPTY_LINE_PATTERN
EXTENSION_COMMENTS
MAGIC_COMMENT
MAGIC_COMMENT_PATTERN
MAGIC_COMMENT_PREFIX
SHEBANG_PATTERN

Public Class Methods

detect_newline(line) click to toggle source
# File lib/add_magic_comment.rb, line 65
def self.detect_newline(line)
  (line[/\R/] if line) || $/
end
process(argv) click to toggle source
# File lib/add_magic_comment.rb, line 25
def self.process(argv)
  directory = argv.first || Dir.pwd

  count = 0
  EXTENSION_COMMENTS.each do |pattern, comment|
    filename_pattern = File.join(directory, "**", "#{pattern}")
    Dir.glob(filename_pattern).each do |filename|
      File.open(filename, "rb+") do |file|
        lines = file.readlines
        newline = detect_newline(lines.first)
        next unless lines.any?
        count += 1

        if lines.first =~ SHEBANG_PATTERN
          shebang = lines.shift
        end

        # remove current magic comment(s)
        while lines.first && (lines.first.match(MAGIC_COMMENT_PATTERN) || lines.first.match(EMPTY_LINE_PATTERN))
          lines.shift
        end

        # add magic comment as the first line
        lines.unshift(comment.gsub("\n", newline))

        # put shebang back
        if shebang
          lines.unshift(shebang)
        end

        file.pos = 0
        file.print(*lines)
        file.truncate(file.pos)
      end
    end
  end

  puts "Magic comments added to #{count} source file(s)"
end