class MG

Attributes

gemspec[RW]

Public Class Methods

new(gemspec) click to toggle source
# File lib/mg.rb, line 8
def initialize(gemspec)
  @gemspec = gemspec

  define_tasks
end

Public Instance Methods

name() click to toggle source
# File lib/mg.rb, line 14
def name
  spec.name
end
spec() click to toggle source
# File lib/mg.rb, line 18
def spec
  @spec ||= begin
    require "rubygems/specification"
    eval File.read(gemspec)
  end
end

Private Instance Methods

define_tasks() click to toggle source
# File lib/mg.rb, line 30
def define_tasks
  directory "dist/"
  CLOBBER.include("dist")

  desc "Build and install as local gem"
  task "gem:install" => package(".gem") do
    sh "gem install #{package(".gem")}"
  end

  desc "Build gem into dist/"
  task :gem => package('.gem')

  desc "Build gem and tarball into dist/"
  task :package => %w(.gem .tar.gz).map { |ext| package(ext) }

  desc "Build the tarball in dist/"
  file package(".tar.gz") => "dist/" do |f|
    sh <<-SH
      git archive \
        --prefix=#{name}-#{spec.version}/ \
        --format=tar \
        HEAD | gzip > #{f.name}
      SH
  end

  desc "Build the gem in dist/"
  file package(".gem") => "dist/" do |f|
    sh "gem build #{name}.gemspec"
    mv File.basename(f.name), f.name
  end

  desc "Push the gem to RubyGems.org"
  task "gem:publish" => package(".gem") do
    Rake::Task[:test].invoke if Rake::Task.task_defined?(:test)
    Rake::Task[:spec].invoke if Rake::Task.task_defined?(:spec)

    sh "gem push #{package(".gem")}"
  end

  # Legacy
  task :gemcutter => :publish
end
package(ext="") click to toggle source
# File lib/mg.rb, line 26
def package(ext="")
  "dist/#{spec.name}-#{spec.version}" + ext
end