class Detroit::Gem
The Gem
tool is used to generate gemspec and gem packages for ruby projects.
This tool was designed for the standard toolchain supporting the following stations:
-
package
-
install
-
release
* reset
-
purge
Constants
- MANPAGE
Location of man_page for tool.
Attributes
True or false whether to write gemspec from project metadata (default is `false`).
The .gemspec filename (default looks-up `.gemspec` or `name.gemspec` file).
Whether to install the gem.
Package directory (defaults to `pkg`). Location of packages. This defaults to Project#pkg.
Version to release. Defaults to current version.
Public Instance Methods
# File lib/detroit-gem.rb, line 137 def assemble?(station, options={}) return true if station == :package return true if station == :install return true if station == :release return true if station == :reset return true if station == :purge return false end
Create a gem package.
# File lib/detroit-gem.rb, line 72 def build trace "gem build #{gemspec}" spec = load_gemspec package = ::Gem::Package.build(spec) mkdir_p(pkgdir) unless File.directory?(pkgdir) mv(package, pkgdir) end
# File lib/detroit-gem.rb, line 91 def install return unless install? package_files.each do |file| sh "gem install --no-rdoc --no-ri #{file}" end end
Whether to install the gem (default `false`).
# File lib/detroit-gem.rb, line 52 def install? @install end
Write gemspec if autospec
is true
and then build the gem.
# File lib/detroit-gem.rb, line 66 def package create_gemspec if autospec # TODO: should autospec be a generate phase? build end
# File lib/detroit-gem.rb, line 33 def prerequisite require 'rubygems' require 'rubygems/package' end
Remove package file(s).
@todo This code is a little loose. Can it be more specific about which
gem file(s) to remove?
# File lib/detroit-gem.rb, line 129 def purge package_files.each do |f| rm(f) report "Removed #{f}" end end
Push gem package to RubyGems.org (a la Gemcutter).
# File lib/detroit-gem.rb, line 101 def push if package_files.empty? report "No .gem packages found for version {version} at #{pkgdir}." else package_files.each do |file| sh "gem push #{file}" end end end
Same as push
.
# File lib/detroit-gem.rb, line 112 def release push end
Mark package files as outdated.
# File lib/detroit-gem.rb, line 117 def reset package_files.each do |f| utime(0 ,0, f) report "Reset #{f}" end end
Convert metadata to a gemspec and write to file
.
@param [String] file
Name of gemspec file (defaults to value of #gemspec).
@return [String] The file name.
# File lib/detroit-gem.rb, line 86 def spec(file=nil) create_gemspec(file) end
Private Instance Methods
Create a gemspec file from project metadata.
# File lib/detroit-gem.rb, line 171 def create_gemspec(file=nil) file = gemspec if !file #require 'gemdo/gemspec' yaml = project.to_gemspec.to_yaml File.open(file, 'w') do |f| f << yaml end status File.basename(file) + " updated." return file end
Initialize attribute defaults.
# File lib/detroit-gem.rb, line 149 def initialize_defaults super @autospec = false @pkgdir ||= (root + 'pkg').to_s #|| project.pkg @gemspec ||= lookup_gemspec @version = project.metadata.version end
Load gemspec file.
Returns a ::Gem::Specification.
# File lib/detroit-gem.rb, line 197 def load_gemspec file = gemspec if yaml?(file) ::Gem::Specification.from_yaml(File.new(file)) else ::Gem::Specification.load(file) end end
Lookup gemspec file. If not found returns default path.
Returns String of file path.
# File lib/detroit-gem.rb, line 185 def lookup_gemspec dot_gemspec = (project.root + '.gemspec').to_s if File.exist?(dot_gemspec) dot_gemspec.to_s else project.metadata.name + '.gemspec' end end
# File lib/detroit-gem.rb, line 161 def package_files Pathname.new(pkgdir).glob("*-#{version}.gem") end
Create gemspec if autospec
is true
.
# File lib/detroit-gem.rb, line 166 def prepackage create_gemspec if autospec end
If the gemspec a YAML gemspec?
# File lib/detroit-gem.rb, line 207 def yaml?(file) line = open(file) { |f| line = f.gets } line.index "!ruby/object:Gem::Specification" end