Skip to content

Instantly share code, notes, and snippets.

@cldwalker
Created May 10, 2010 20:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cldwalker/396462 to your computer and use it in GitHub Desktop.
Save cldwalker/396462 to your computer and use it in GitHub Desktop.
Builds gemspecs for multiple gems based on a YAML config.
# GemspecBuilder builds a Gem::Specification object by looking up a gem's config in the config file ~/.gems.yml.
# GemspecBuilder assumes the current directory's basename is the gem name (unless told otherwise) and needs to be
# run inside the gem's root directory in order for the gemspec to build correctly.
#
# The builder merges the default gemspec hash in config[:default] with any gem-specific configuration in config[:gems][gem_name].
# Gemspec hashes are assumed to have the same attribute-value pairs as Gem::Specification objects (described here:
# http://rubygems.rubyforge.org/rdoc/Gem/Specification.html). The only difference is the :files attribute which takes globbed expressions
# and is converted with Dir.glob.
#
# For an example config see mine: http://github.com/cldwalker/dotfiles/blob/master/.gems.yml
# All config keys are assumed to be symbols.
# Valid config keys are:
# * :default: default gemspec hash with keys being valid Gem::Specification attributes
# * :gems: hash of gem names mapped to their gemspec hashes
class GemspecBuilder
class <<self
def build(name_or_hash=nil)
spec_hash = name_or_hash.is_a?(Hash) ? name_or_hash : gem_config(name_or_hash)
gemspec = Gem::Specification.new
spec_hash.each do |k,v|
if gemspec.respond_to?("#{k}=")
gemspec.send("#{k}=", v)
elsif gemspec.respond_to?(k)
gemspec.send(k, v)
end
end
gemspec.files = Dir[*gemspec.files].uniq
gemspec
end
def gem_config(gem_name=nil)
gem_name = (gem_name || detect_gem).to_sym
local_config = config[:gems][gem_name] || {}
hash = default_config.merge(local_config).merge(:name=>gem_name.to_s)
post_gem_config(hash)
hash
end
# clone config entry if config value is a symbol i.e. :summary => :description
def post_gem_config(hash)
hash.each do |k,v|
if v.is_a?(Symbol)
hash[k] = hash[v]
end
end
end
def default_config
config[:default] || {}
end
def config
@config ||= YAML::load_file(config_file)
end
def config_file
File.join(ENV['HOME'], '.gems.yml')
end
def detect_gem
File.basename(Dir.pwd)
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment