def define_spec
self.spec = Gem::Specification.new do |s|
dirs = Dir['lib']
manifest = read_manifest
abort [
"Manifest is missing or couldn't be read.",
"The Manifest is kind of a big deal.",
"Maybe you're using a gem packaged by a linux project.",
"It seems like they enjoy breaking other people's code."
].join "\n" unless manifest
s.name = name
s.version = version if version
s.summary = summary
s.email = email
s.homepage = case urls
when Hash then
urls["home"] || urls.values.first
when Array then
urls.first
else
raise "unknown urls format: #{urls.inspect}"
end
s.rubyforge_project = rubyforge_name
s.description = description
s.files = manifest
s.executables = s.files.grep(/^bin/) { |f| File.basename(f) }
s.bindir = "bin"
s.require_paths = dirs unless dirs.empty?
s.rdoc_options = ['--main', readme_file]
s.post_install_message = post_install_message
s.test_files = Dir[*self.test_globs].uniq
missing "Manifest.txt" if s.files.empty?
case author
when Array
s.authors = author
else
s.author = author
end
s.extra_rdoc_files += s.files.grep(/(txt|rdoc)$/)
s.extra_rdoc_files.reject! { |f| f =~ %r%^(test|spec|vendor|template|data|tmp)/% }
s.extra_rdoc_files += @extra_rdoc_files
end
unless self.version then
version = nil
version_re = /VERSION += +([\"\'])([\d][\w\.]+)\1/
spec.files.each do |file|
next unless File.exist? file
version = File.read_utf(file)[version_re, 2] rescue nil
break if version
end
spec.version = self.version = version if version
unless self.version then
spec.version = self.version = "0.borked"
warn "** Add 'VERSION = \"x.y.z\"' to your code,"
warn " add a version to your hoe spec,"
warn " or fix your Manifest.txt"
end
end
spec.licenses = licenses unless licenses.empty?
spec_extras.each do |msg, val|
case val
when Proc
val.call spec.send(msg)
else
spec.send "#{msg}=", val
end
end
end