It’s often said that one of the hardest parts of software development is naming things. When I start working on a RubyGem, I often name it something that I end up not liking by the time I finish the Gem so I have to go through and rename a bunch of files, constants, and references.
I finally decided to write a script to make renaming even easier.
require 'pathname'
require 'fileutils'
class GemRename
def initialize(base_dir = ".")
@base_dir = Pathname.new(base_dir)
end
def constants(from:, to:)
update_file_contents(from, to)
end
def paths_and_contents(from:, to:)
rename_files_and_directories(from, to)
update_file_contents(from, to)
end
private
def rename_files_and_directories(old_name, new_name)
# Rename directories
@base_dir.glob("**/*#{old_name}*").select(&:directory?).each do |dir|
FileUtils.mv(dir, dir.to_s.gsub(old_name, new_name))
end
# Rename files
@base_dir.glob("**/*#{old_name}*").each do |file|
FileUtils.mv(file, file.to_s.gsub(old_name, new_name)) if file.file?
end
end
def update_file_contents(old_text, new_text)
@base_dir.glob("**/*").select(&:file?).each do |file|
text = File.read(file)
new_contents = text.gsub(old_text, new_text)
File.open(file, "w") { |f| f.puts new_contents }
end
end
end
# Usage Example
# rename = GemRename.new(".")
# rename.constants from: "OldGem", to: "NewGem"
# rename.paths_and_contents from: "old_gem", to: "new_gem"
To use interactively from a console, open irb
, paste the code above, and modify the code below with your old and new gem names:
rename = GemRename.new(".")
rename.constants from: "OldGem", to: "NewGem"
rename.paths_and_contents from: "old_gem", to: "new_gem"