I know the code could be much improved, fx the add_gem has so far no support for an options hash. Perhaps this could be integrated into the original Rails::Generators::Actions in a new fork? I will also work on a 'txt-mutator' gem with a DSL for general-purpose code (text file) refactorings.
'thor-ext' updates and extends Rails::Generators::Actions with the following:
module ThorExtensions def append_line_to_file(path, *args, &block) if block_given? data = block else data = args.shift end append_file path, "#{data}\n" end
# add newline between each gem statement in Gemfile # Use Rails.root ? def cleanup_gemfile gsub_file 'Gemfile', /('|")gem/, "\1\ngem" end
def has_gem?(text, gem_name) if /\n[^#]*gem\s*('|")\s*#{Regexp.escape(gem_name)}\s*('|")/ i.match(text) true else false end end
def has_plugin?(plugin_name) File.directory?(File.join(Rails.root, "vendor/plugins/ #{plugin_name}")) end
def add_gem(gem_name, gem_version = nil) if !has_gem?(gemfile_txt, gem_name) gem_version_str = gem_version ? ", '#{gem_version}'" : '' append_line_to_file 'Gemfile', "gem '#{gem_name}'#{gem_version_str}" end end
def add_gems(gem_names) gem_names.each{|gem_name| add_gem(gem_name) } end
# Use Rails.root here? def gemfile_txt @gemfile_txt ||= File.open('Gemfile').read end end
# patch to add newline after gem '..' so we avoid a Gemfile like this: # gem 'abc' gem 'abd'... but instead have newlines after each. # Also only adds gem statement if gem statement not already present def gem(*args) ... in_root do if !has_gem?(gemfile_txt, gem_name) append_line_file "Gemfile", "gem #{parts.join(", ")}", :verbose => false end end end