Parent

Box::Gem

RubyGems Package

Gem utility encapsulates RubyGems package creation.

Public Instance Methods

create_gemspec() click to toggle source
# Install gem package, creating the package if not already created.
#
# TODO: Endure that we even need a gem package using #out_of_date?

def install_gem
  file = package()
  sh "gem install #{file}"
end

# Uninstall gem package.
#
# TODO: Sepcify version?

def uninstall_gem
  i = metadata.package_name.rindex('-')
  name, version = metadata.package_name[0...i], metadata.package_name[i+1..-1]
  sh "gem uninstall #{name} -v #{version}"
end

# Create Gem::Specification # # TODO: Use POM::Project#to_gemspec. #

# File lib/box/packs/gem.rb, line 126
def create_gemspec
  # Make sure RubyGems is loaded.
  #begin
  #  Kernel.require 'rubygems/specification'
  #  ::Gem::manage_gems
  #rescue LoadError
  #  raise LoadError, "RubyGems is not installed?"
  #end

  # FIXME: this only works b/c of package staging
  #distribute = Dir.glob('**/*')
  #distribute = project.filelist
  distribute = manifest #.files

  if md = /(\w+).rubyforge.org/.match(metadata.homepage)
    rubyforge_project = md[1]
  else
    rubyforge_project = metadata.name  # b/c it has to be something according to Eric Hodel.
  end

  ::Gem::Specification.new do |spec|
    spec.name              = metadata.name
    spec.version           = metadata.version
    spec.summary           = metadata.summary
    spec.description       = metadata.description
    spec.authors           = [metadata.authors].flatten.compact.uniq
    spec.email             = metadata.contact #metadata.email
    spec.rubyforge_project = rubyforge_project
    spec.homepage          = metadata.homepage
    spec.platform          = metadata.platform  #'ruby'

    spec.require_paths     = [metadata.loadpath].flatten

    #if metadata.platform != 'ruby'
    #  spec.require_paths.concat(spec.require_paths.collect{ |d| File.join(d, platform) })
    #end

    spec.bindir = "bin"
    spec.executables  = metadata.executables
    spec.requirements = metadata.notes

    if metadata.require
      metadata.require.each do |d,v|
        d,v = *d.split(/\s+/) unless v
        spec.add_dependency(*[d,v].compact)
      end
    end

    spec.extensions = [metadata.extensions].flatten.compact

    # rdocs (argh!)

    readme = Dir.glob('README{,.txt}', File::FNM_CASEFOLD).first

    spec.has_rdoc = true #metadata.autodoc  # Make true always?

    rdocfiles = []
    rdocfiles << readme if readme
    rdocfiles.concat(Dir['[A-Z]*'] || [])  # metadata.document
    rdocfiles.uniq!
    spec.extra_rdoc_files = rdocfiles

    rdoc_options = ['--inline-source']
    rdoc_options.concat ["--title", "#{metadata.name} api"] #if metadata.title
    rdoc_options.concat ["--main", readme] if readme
    spec.rdoc_options = rdoc_options

    spec.files = distribute

    # TODO make test_files configurable (?)
    spec.test_files = distribute.select do |f|
      File.basename(f) =~ /test/ && File.extname(f) == '.rb'
    end
  end

end
extension() click to toggle source
# File lib/box/packs/gem.rb, line 31
def extension ; '.gem' ; end
package_build() click to toggle source

Create a RubyGems package.

This converts the project’s metadata into a gemspec and run’s it through the Gem::Builder. It does not shellout.

TODO: This uses staging too, like zip/tgz, should it?

# File lib/box/packs/gem.rb, line 42
def package_build
  require_rubygems

  status("gem build #{stage_folder}")

  return if dryrun?

  # <-- binary stuff here?

  file = nil
  #stage(extension) do
    gemspec = project.to_gemspec   #create_gemspec

    if gemspec?
      file = location / "#{gemspec.name}.gemspec"
      write(file, gemspec.to_yaml) #unless noop?
    end

    builder = ::Gem::Builder.new(gemspec)  # can we do this outside stage?

    status "gem built at #{stage_folder}"

    silence_stream(STDOUT, STDERR) do
      file = builder.build
    end

    file = file(file)
  #end

  #file = transfer(file, pack_folder)
  #report_package_built(file)

  return file
end
require_rubygems() click to toggle source
# Remove gem packages. This will remove all *.gem packages
# found in the package folder.
#
def clobber(options=nil)
  packages = Dir.glob(File.join(project.pack, '*.gem'))
  packages.each do |path|
    rm(path) if File.file?(path)
  end
end

# Require RubyGems library. #

# File lib/box/packs/gem.rb, line 91
def require_rubygems
  begin
    require 'rubygems/specification'
    #::Gem::manage_gems
    require 'pom/models/gemspec'
  rescue LoadError
    raise LoadError, "RubyGems is not installed."
  end
end

[Validate]

Generated with the Darkfish Rdoc Generator 2.