module Rails::Generators::Actions

def gem(*args)


gem "my_gem", git: "https://example.com/my_gem.git", branch: "master"
# Edge my_gem

Outputs:

gem "my_gem", comment: "Edge my_gem", git: "https://example.com/my_gem.git", branch: "master"

+gem+ declaration in the +Gemfile+. For example:
Any additional options passed to this method will be appended to the

The URL of the git repository for the gem.
[+:git+]

The gem group in the +Gemfile+ that the gem belongs to.
[+:group+]

gem "my_gem"
# Second line.
# First line.

Outputs:

gem "my_gem", comment: "First line.\nSecond line."

Outputs a comment above the +gem+ declaration in the +Gemfile+.
[+:comment+]

gem "my_gem", ">= 1.1", "< 2.0"

gem name:
Alternatively, can be specified as one or more arguments following the

gem "my_gem", version: [">= 1.1", "< 2.0"]
gem "my_gem", version: "~> 1.1"

array of strings:
The version constraints for the gem, specified as a string or an
[+:version+]

==== Options

install the gem.
Note that this method only adds the gem to the +Gemfile+; it does not

gem "rspec", comment: "Put this comment above the gem declaration"
gem "RedCloth", ">= 4.1.0", "< 4.2.0"
gem "rails", "3.0", git: "https://github.com/rails/rails"
gem "technoweenie-restful-authentication", lib: "restful-authentication", source: "http://gems.github.com/"
gem "rspec", group: :test

Adds a +gem+ declaration to the +Gemfile+ for the specified gem.
def gem(*args)
  options = args.extract_options!
  name, *versions = args
  # Set the message to be shown in logs. Uses the git repo if one is given,
  # otherwise use name (version).
  parts, message = [ quote(name) ], name.dup
  # Output a comment above the gem declaration.
  comment = options.delete(:comment)
  if versions = versions.any? ? versions : options.delete(:version)
    _versions = Array(versions)
    _versions.each do |version|
      parts << quote(version)
    end
    message << " (#{_versions.join(", ")})"
  end
  message = options[:git] if options[:git]
  log :gemfile, message
  parts << quote(options) unless options.empty?
  in_root do
    str = []
    if comment
      comment.each_line do |comment_line|
        str << indentation
        str << "# #{comment_line}"
      end
      str << "\n"
    end
    str << indentation
    str << "gem #{parts.join(", ")}"
    append_file_with_newline "Gemfile", str.join, verbose: false
  end
end