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