New gem 'thor-ext' with addons and patches for updating the Gemfile

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