task/gemgem.rb in gem-path-0.6.1 vs task/gemgem.rb in gem-path-0.6.2
- old
+ new
@@ -1,34 +1,36 @@
module Gemgem
class << self
- attr_accessor :dir, :spec, :spec_create
+ attr_accessor :dir, :spec, :submodules, :spec_create
end
module_function
def gem_tag ; "#{spec.name}-#{spec.version}" ; end
def gem_path ; "#{pkg_dir}/#{gem_tag}.gem" ; end
def spec_path ; "#{dir}/#{spec.name}.gemspec" ; end
def pkg_dir ; "#{dir}/pkg" ; end
def escaped_dir; @escaped_dir ||= Regexp.escape(dir); end
- def init dir, &block
+ def init dir, options={}, &block
self.dir = dir
- $LOAD_PATH.unshift("#{dir}/lib")
ENV['RUBYLIB'] = "#{dir}/lib:#{ENV['RUBYLIB']}"
ENV['PATH'] = "#{dir}/bin:#{ENV['PATH']}"
+ self.submodules = options[:submodules] || []
self.spec_create = block
+
+ $LOAD_PATH.unshift("#{dir}/lib", *submodules_libs)
end
def create
spec = Gem::Specification.new do |s|
s.authors = ['Lin Jen-Shin (godfat)']
s.email = ['godfat (XD) godfat.org']
s.description = description.join
s.summary = description.first
- s.license = readme['LICENSE'].sub(/.+\n\n/, '').lines.first.strip
+ s.license = license
s.date = Time.now.strftime('%Y-%m-%d')
s.files = gem_files
s.test_files = test_files
s.executables = bin_files
@@ -36,10 +38,113 @@
spec_create.call(spec)
spec.homepage ||= "https://github.com/godfat/#{spec.name}"
self.spec = spec
end
+ def gem_install
+ require 'rubygems/commands/install_command'
+ # read ~/.gemrc
+ Gem.use_paths(Gem.configuration[:gemhome], Gem.configuration[:gempath])
+ Gem::Command.extra_args = Gem.configuration[:gem]
+
+ # setup install options
+ cmd = Gem::Commands::InstallCommand.new
+ cmd.handle_options([])
+
+ # install
+ install = Gem::Installer.new(gem_path, cmd.options)
+ install.install
+ puts "\e[35mGem installed: \e[33m#{strip_path(install.gem_dir)}\e[0m"
+ end
+
+ def gem_spec
+ create
+ write
+ end
+
+ def gem_build
+ require 'fileutils'
+ require 'rubygems/package'
+ gem = nil
+ Dir.chdir(dir) do
+ gem = Gem::Package.build(Gem::Specification.load(spec_path))
+ FileUtils.mkdir_p(pkg_dir)
+ FileUtils.mv(gem, pkg_dir) # gem is relative path, but might be ok
+ end
+ puts "\e[35mGem built: \e[33m#{strip_path("#{pkg_dir}/#{gem}")}\e[0m"
+ end
+
+ def gem_release
+ sh_git('tag', gem_tag)
+ sh_git('push')
+ sh_git('push', '--tags')
+ sh_gem('push', gem_path)
+ end
+
+ def gem_check
+ unless git('status', '--porcelain').empty?
+ puts("\e[35mWorking copy is not clean.\e[0m")
+ exit(3)
+ end
+
+ ver = spec.version.to_s
+
+ if ENV['VERSION'].nil?
+ puts("\e[35mExpected " \
+ "\e[33mVERSION\e[35m=\e[33m#{ver}\e[0m")
+ exit(1)
+
+ elsif ENV['VERSION'] != ver
+ puts("\e[35mExpected \e[33mVERSION\e[35m=\e[33m#{ver} " \
+ "\e[35mbut got\n " \
+ "\e[33mVERSION\e[35m=\e[33m#{ENV['VERSION']}\e[0m")
+ exit(2)
+ end
+ end
+
+ def test
+ return if test_files.empty?
+
+ if ENV['COV'] || ENV['CI']
+ require 'simplecov'
+ if ENV['CI']
+ begin
+ require 'coveralls'
+ SimpleCov.formatter = Coveralls::SimpleCov::Formatter
+ rescue LoadError => e
+ puts "Cannot load coveralls, skip: #{e}"
+ end
+ end
+ SimpleCov.start do
+ add_filter('test/')
+ add_filter('test.rb')
+ submodules_libs.each(&method(:add_filter))
+ end
+ end
+
+ test_files.each{ |file| require "#{dir}/#{file[0..-4]}" }
+ end
+
+ def clean
+ return if ignored_files.empty?
+
+ require 'fileutils'
+ trash = File.expand_path("~/.Trash/#{spec.name}")
+ puts "Move the following files into: \e[35m#{strip_path(trash)}\e[33m"
+
+ ignored_files.each do |file|
+ from = "#{dir}/#{file}"
+ to = "#{trash}/#{File.dirname(file)}"
+ puts strip_path(from)
+
+ FileUtils.mkdir_p(to)
+ FileUtils.mv(from, to)
+ end
+
+ print "\e[0m"
+ end
+
def write
File.open(spec_path, 'w'){ |f| f << split_lines(spec.to_ruby) }
end
def split_lines ruby
@@ -55,17 +160,21 @@
def strip_path path
strip_home_path(strip_cwd_path(path))
end
def strip_home_path path
- path.sub(ENV['HOME'], '~')
+ path.sub(/\A#{Regexp.escape(ENV['HOME'])}\//, '~/')
end
def strip_cwd_path path
- path.sub(Dir.pwd, '.')
+ path.sub(/\A#{Regexp.escape(Dir.pwd)}\//, '')
end
+ def submodules_libs
+ submodules.map{ |path| "#{dir}/#{path}/lib" }
+ end
+
def git *args
`git --git-dir=#{dir}/.git #{args.join(' ')}`
end
def sh_git *args
@@ -97,10 +206,15 @@
def description
# JRuby String#lines is returning an enumerator
@description ||= (readme['DESCRIPTION']||'').sub(/.+\n\n/, '').lines.to_a
end
+ def license
+ readme['LICENSE'].sub(/.+\n\n/, '').lines.first.
+ split(/[()]/).map(&:strip).reject(&:empty?).last
+ end
+
def all_files
@all_files ||= fold_files(glob).sort
end
def fold_files files
@@ -117,11 +231,12 @@
}
end
def gem_files
@gem_files ||= all_files.reject{ |f|
- f =~ ignored_pattern && !git_files.include?(f)
+ f =~ submodules_pattern ||
+ (f =~ ignored_pattern && !git_files.include?(f))
}
end
def test_files
@test_files ||= gem_files.grep(%r{^test/(.+?/)*test_.+?\.rb$})
@@ -149,10 +264,19 @@
else
Regexp.new(expand_patterns(gitignore).join('|'))
end
end
+ def submodules_pattern
+ @submodules_pattern ||= if submodules.empty?
+ /^$/
+ else
+ Regexp.new(submodules.map{ |path|
+ "^#{Regexp.escape(path)}/" }.join('|'))
+ end
+ end
+
def expand_patterns pathes
# http://git-scm.com/docs/gitignore
pathes.flat_map{ |path|
# we didn't implement negative pattern for now
Regexp.escape(path).sub(%r{^/}, '^').gsub(/\\\*/, '[^/]*')
@@ -171,85 +295,41 @@
namespace :gem do
desc 'Install gem'
task :install => [:build] do
- Gemgem.sh_gem('install', Gemgem.gem_path)
+ Gemgem.gem_install
end
desc 'Build gem'
task :build => [:spec] do
- require 'fileutils'
- require 'rubygems/package'
- gem = nil
- Dir.chdir(Gemgem.dir) do
- gem = Gem::Package.build(Gem::Specification.load(Gemgem.spec_path))
- FileUtils.mkdir_p(Gemgem.pkg_dir)
- FileUtils.mv(gem, Gemgem.pkg_dir) # gem is relative path, but might be ok
- end
- puts "\e[35mGem built: \e[33m" \
- "#{Gemgem.strip_path("#{Gemgem.pkg_dir}/#{gem}")}\e[0m"
+ Gemgem.gem_build
end
desc 'Generate gemspec'
task :spec do
- Gemgem.create
- Gemgem.write
+ Gemgem.gem_spec
end
desc 'Release gem'
task :release => [:spec, :check, :build] do
- Gemgem.module_eval do
- sh_git('tag', Gemgem.gem_tag)
- sh_git('push')
- sh_git('push', '--tags')
- sh_gem('push', Gemgem.gem_path)
- end
+ Gemgem.gem_release
end
task :check do
- ver = Gemgem.spec.version.to_s
-
- if ENV['VERSION'].nil?
- puts("\e[35mExpected " \
- "\e[33mVERSION\e[35m=\e[33m#{ver}\e[0m")
- exit(1)
-
- elsif ENV['VERSION'] != ver
- puts("\e[35mExpected \e[33mVERSION\e[35m=\e[33m#{ver} " \
- "\e[35mbut got\n " \
- "\e[33mVERSION\e[35m=\e[33m#{ENV['VERSION']}\e[0m")
- exit(2)
- end
+ Gemgem.gem_check
end
end # of gem namespace
desc 'Run tests'
task :test do
- next if Gemgem.test_files.empty?
- Gemgem.test_files.each{ |file| require "#{Gemgem.dir}/#{file[0..-4]}" }
+ Gemgem.test
end
desc 'Trash ignored files'
task :clean => ['gem:spec'] do
- next if Gemgem.ignored_files.empty?
-
- require 'fileutils'
- trash = File.expand_path("~/.Trash/#{Gemgem.spec.name}")
- puts "Move the following files into:" \
- " \e[35m#{Gemgem.strip_path(trash)}\e[33m"
-
- Gemgem.ignored_files.each do |file|
- from = "#{Gemgem.dir}/#{file}"
- to = "#{trash}/#{File.dirname(file)}"
- puts Gemgem.strip_path(from)
-
- FileUtils.mkdir_p(to)
- FileUtils.mv(from, to)
- end
-
- print "\e[0m"
+ Gemgem.clean
end
task :default do
# Is there a reliable way to do this in the current process?
# It failed miserably before between Rake versions...