Skip to content

Commit

Permalink
Much better gemspec. [admin]
Browse files Browse the repository at this point in the history
  • Loading branch information
trans committed Oct 26, 2011
1 parent bae0b2a commit feaa494
Show file tree
Hide file tree
Showing 3 changed files with 153 additions and 103 deletions.
254 changes: 151 additions & 103 deletions .gemspec
Expand Up @@ -2,134 +2,182 @@

require 'yaml'

Gem::Specification.new do |gemspec|
module DotRuby

metadata = YAML.load_file('.ruby')
#
class GemSpec

manifest = Dir.glob('manifest{,.txt}', File::FNM_CASEFOLD).first
# Which revision of .ruby is this gemspec for?
REVISION = 0

scm = case
when File.directory?('.git')
:git
end

files = case
when manifest
File.readlines(manifest).
map{ |line| line.strip }.
reject{ |line| line.empty? || line[0,1] == '#' }
when scm == :git
`git ls-files -z`.split("\0")
else
Dir.glob('{**/}{.*,*}') # TODO: be more specific using standard locations ?
end.select{ |path| File.file?(path) }

patterns = {
:bin_files => 'bin/*',
:lib_files => 'lib/{**/}*.rb',
:ext_files => 'ext/{**/}extconf.rb',
:doc_files => '*.{txt,rdoc,md,markdown,tt,textile}',
:test_files => '{test/{**/}*_test.rb,spec/{**/}*_spec.rb}'
}

glob_files = lambda { |pattern|
Dir.glob(pattern).select { |path|
File.file?(path) && files.include?(path)
#
PATTERNS = {
:bin_files => 'bin/*',
:lib_files => 'lib/{**/}*.rb',
:ext_files => 'ext/{**/}extconf.rb',
:doc_files => '*.{txt,rdoc,md,markdown,tt,textile}',
:test_files => '{test/{**/}*_test.rb,spec/{**/}*_spec.rb}'
}
}

#files = glob_files[patterns[:files]]

executables = glob_files[patterns[:bin_files]].map do |path|
File.basename(path)
end

extensions = glob_files[patterns[:ext_files]].map do |path|
File.basename(path)
end
#
def self.instance
new.to_gemspec
end

# build-out the gemspec
attr :metadata

case metadata['revision']
when 0
gemspec.name = metadata['name']
gemspec.version = metadata['version']
gemspec.summary = metadata['summary']
gemspec.description = metadata['description']
attr :manifest

metadata['authors'].each do |author|
gemspec.authors << author['name']
#
def initialize
@metadata = YAML.load_file('.ruby')
@manifest = Dir.glob('manifest{,.txt}', File::FNM_CASEFOLD).first
end

if author.has_key?('email')
if gemspec.email
gemspec.email << author['email']
else
gemspec.email = [author['email']]
#
def scm
@scm ||= \
case
when File.directory?('.git')
:git
end
end
end

gemspec.licenses = metadata['copyrights'].map{ |c| c['license'] }.compact
#
def files
@files ||= \
#glob_files[patterns[:files]]
case
when manifest
File.readlines(manifest).
map{ |line| line.strip }.
reject{ |line| line.empty? || line[0,1] == '#' }
when scm == :git
`git ls-files -z`.split("\0")
else
Dir.glob('{**/}{.*,*}') # TODO: be more specific using standard locations ?
end.select{ |path| File.file?(path) }
end

metadata['requirements'].each do |req|
name = req['name']
version = req['version']
groups = req['groups'] || []
#
def glob_files(pattern)
Dir.glob(pattern).select { |path|
File.file?(path) && files.include?(path)
}
end

case version
when /^(.*?)\+$/
version = ">= #{$1}"
when /^(.*?)\-$/
version = "< #{$1}"
when /^(.*?)\~$/
version = "~> #{$1}"
end
#
def patterns
PATTERNS
end

if groups.empty? or groups.include?('runtime')
# populate runtime dependencies
if gemspec.respond_to?(:add_runtime_dependency)
gemspec.add_runtime_dependency(name,*version)
else
gemspec.add_dependency(name,*version)
#
def executables
@executables ||= \
glob_files(patterns[:bin_files]).map do |path|
File.basename(path)
end
else
# populate development dependencies
if gemspec.respond_to?(:add_development_dependency)
gemspec.add_development_dependency(name,*version)
else
gemspec.add_dependency(name,*version)
end

def extensions
@extensions ||= \
glob_files(patterns[:ext_files]).map do |path|
File.basename(path)
end
end
end

# convert external dependencies into a requirements
if metadata['external_dependencies']
##gemspec.requirements = [] unless metadata['external_dependencies'].empty?
metadata['external_dependencies'].each do |req|
gemspec.requirements << req.to_s
end
#
def name
metadata['name'] || metadata['title'].downcase.gsub(/\W+/,'_')
end

# determine homepage from resources
homepage = metadata['resources'].find{ |key, url| key =~ /^home/ }
gemspec.homepage = homepage.last if homepage
#
def to_gemspec
Gem::Specification.new do |gemspec|
gemspec.name = name
gemspec.version = metadata['version']
gemspec.summary = metadata['summary']
gemspec.description = metadata['description']

metadata['authors'].each do |author|
gemspec.authors << author['name']

if author.has_key?('email')
if gemspec.email
gemspec.email << author['email']
else
gemspec.email = [author['email']]
end
end
end

gemspec.require_paths = metadata['load_path'] || ['lib']
gemspec.post_install_message = metadata['install_message']
gemspec.licenses = metadata['copyrights'].map{ |c| c['license'] }.compact

metadata['requirements'].each do |req|
name = req['name']
version = req['version']
groups = req['groups'] || []

case version
when /^(.*?)\+$/
version = ">= #{$1}"
when /^(.*?)\-$/
version = "< #{$1}"
when /^(.*?)\~$/
version = "~> #{$1}"
end

if groups.empty? or groups.include?('runtime')
# populate runtime dependencies
if gemspec.respond_to?(:add_runtime_dependency)
gemspec.add_runtime_dependency(name,*version)
else
gemspec.add_dependency(name,*version)
end
else
# populate development dependencies
if gemspec.respond_to?(:add_development_dependency)
gemspec.add_development_dependency(name,*version)
else
gemspec.add_dependency(name,*version)
end
end
end

# RubyGems specific metadata
gemspec.files = files
gemspec.extensions = extensions
gemspec.executables = executables
# convert external dependencies into a requirements
if metadata['external_dependencies']
##gemspec.requirements = [] unless metadata['external_dependencies'].empty?
metadata['external_dependencies'].each do |req|
gemspec.requirements << req.to_s
end
end

if Gem::VERSION < '1.7.'
gemspec.default_executable = gemspec.executables.first
end
# determine homepage from resources
homepage = metadata['resources'].find{ |key, url| key =~ /^home/ }
gemspec.homepage = homepage.last if homepage

gemspec.test_files = glob_files[patterns[:test_files]]
gemspec.require_paths = metadata['load_path'] || ['lib']
gemspec.post_install_message = metadata['install_message']

unless gemspec.files.include?('.document')
gemspec.extra_rdoc_files = glob_files[patterns[:doc_files]]
# RubyGems specific metadata
gemspec.files = files
gemspec.extensions = extensions
gemspec.executables = executables

if Gem::VERSION < '1.7.'
gemspec.default_executable = gemspec.executables.first
end

gemspec.test_files = glob_files(patterns[:test_files])

unless gemspec.files.include?('.document')
gemspec.extra_rdoc_files = glob_files(patterns[:doc_files])
end
end
end
end

end #class GemSpec

end

DotRuby::GemSpec.instance
1 change: 1 addition & 0 deletions .ruby
Expand Up @@ -39,6 +39,7 @@ created: '2006-01-01'
summary: XOXO Parser and Generator
title: XOXO
version: 1.2.0
name: xoxo
description: ! "XOXO is a Ruby XOXO parser and generator. It provides a Ruby API \nsimilar
to Marshal and YAML (though more specific) to load and dump\nXOXO[http://microformats.org/wiki/xoxo],
an simple, open outline\nformat written in standard XHTML and suitable for embedding
Expand Down
1 change: 1 addition & 0 deletions meta/name
@@ -0,0 +1 @@
xoxo

0 comments on commit feaa494

Please sign in to comment.