lib/rake_ext/project.rb in ruby_ext-0.4.24 vs lib/rake_ext/project.rb in ruby_ext-0.4.25
- old
+ new
@@ -1,69 +1,32 @@
+# fixing known YAML problem with gems
require 'yaml'
require 'psych'
YAML::ENGINE.yamler = 'syck'
-#
-# parse_dependencies_for
-#
-def parse_project_gemfile
- required_gems, required_fake_gems = [], []
- gem_file = "#{project_dir}/lib/#{project[:name]}/gems.rb"
- if File.exist? gem_file
- # puts "Parsing gemfile #{gem_file}"
-
- code = File.open(gem_file){|f| f.read}
-
- stub_class = Class.new
- stub_class.send(:define_method, :gem){|*args| required_gems << args}
- stub_class.send(:define_method, :fake_gem){|*args| required_fake_gems << args}
- stub = stub_class.new
- stub.instance_eval code, __FILE__, __LINE__
- end
-
- return required_gems, required_fake_gems
-end
-
-
#
-# Install gems
+# Helper for releasing gem, add following code to Your Rakefile:
#
-namespace :gem do
- desc "Install gem required by project"
- task :install do
- gems, fake_gems = parse_project_gemfile
- gems.each do |name, version|
- puts "Installing gem #{name} #{version}"
- %x(gem install #{name}#{" -v #{version}" if version} --ignore-dependencies)
- end
- end
-
- desc "List all gems required by project"
- task :list do
- puts "Gems required for #{project[:official_name]}:"
- gems, fake_gems = parse_project_gemfile
- puts(gems + fake_gems)
- end
-
- desc "Install all gem required by project (including fake gems)"
- task :install_all do
- gems, fake_gems = parse_project_gemfile
- (gems + fake_gems).each do |name, version|
- puts "Installing gem #{name} #{version}"
- %x(gem install #{name} #{"-v #{version}" if version})
- end
- end
-end
-
+# project(
+# name: "fake_gem",
+# gem: true,
+# summary: "Makes any directory looks like Ruby Gem",
+#
+# bin: 'bin',
+# executables: ['fake_gem'],
+# dirs: %w(bin),
#
-# Gem Spec, for sample look at Rakefile
+# author: "Alexey Petrushin",
+# homepage: "http://github.com/alexeypetrushin/fake_gem"
+# )
+#
+# use "rake gem" to release gem
#
-require 'rake/clean'
-require 'rake/gempackagetask'
-require 'tmpdir'
+require 'rubygems/specification'
+
class GemHelper
class << self
def next_version gem_name
%x(gem list --remote #{gem_name}).scan /#{gem_name} \((\d+\.\d+\.\d+)\)/ do |s|
v = s.first.split('.').collect{|d| d.to_i}
@@ -71,12 +34,31 @@
return v.join('.')
end
return '0.0.1'
end
- def prepare_gem_metadata
- spec = Gem::Specification.new do |s|
+ def parse_project_gemfile
+ required_gems, required_fake_gems = [], []
+ gem_file = "#{project_dir}/lib/#{project[:name]}/gems.rb"
+
+ if File.exist? gem_file
+ # puts "Parsing gemfile #{gem_file}"
+
+ code = File.open(gem_file){|f| f.read}
+
+ stub_class = Class.new
+ stub_class.send(:define_method, :gem){|*args| required_gems << args}
+ stub_class.send(:define_method, :fake_gem){|*args| required_fake_gems << args}
+ stub = stub_class.new
+ stub.instance_eval code, __FILE__, __LINE__
+ end
+
+ return required_gems, required_fake_gems
+ end
+
+ def gemspec
+ Gem::Specification.new do |s|
gems, fake_gems = parse_project_gemfile
gems = gems + fake_gems
gems.each{|name_version| s.add_dependency *name_version}
@@ -97,43 +79,57 @@
)
s.bindir = options.delete(:bin) if options.include? :bin
s.version = options.delete(:version) || GemHelper.next_version(name)
- # s.name = options[:name)
- # s.author = options[:author)
- # s.homepage = options[:homepage)
-
options.each{|k, v| s.send "#{k}=", v}
end
-
- Rake::GemPackageTask.new(spec) do |p|
- p.need_tar = true if RUBY_PLATFORM !~ /mswin/
- p.need_zip = true
- p.package_dir = package_dir
- end
end
-
- def package_dir
- Dir.tmpdir + "/#{project[:official_name]}_tmp"
- end
end
end
namespace :gem do
- task :ensure_gem do
- GemHelper.prepare_gem_metadata
+ desc "Build and release gem"
+ task :release do
+ puts ' configuring'
+ gemspec = GemHelper.gemspec
+ gemspec_file = "#{gemspec.name}.gemspec"
+ File.open(gemspec_file, 'w'){|f| f.write gemspec.to_ruby}
+
+ puts ' building'
+ %x(gem build #{gemspec_file})
+
+ puts ' pushing'
+ gem_file = Dir.glob("#{gemspec.name}*.gem").first
+ %x"gem push #{gem_file}"
+
+ puts ' cleaning'
+ [gemspec_file, gem_file].each{|f| File.delete f if File.exist? f}
+
+ puts " #{gemspec.name} #{gemspec.version} successfully released"
end
- task push: :ensure_gem do
- gem_file = Dir.glob("#{GemHelper.package_dir}/#{project[:official_name]}*.gem").first
- system "gem push #{gem_file}"
+ desc "Install gem required by project"
+ task :install do
+ gems, fake_gems = parse_project_gemfile
+ gems.each do |name, version|
+ puts "Installing gem #{name} #{version}"
+ %x(gem install #{name}#{" -v #{version}" if version}) # --ignore-dependencies)
+ end
+ end
+
+ desc "List all gems required by project"
+ task :list do
+ puts "Gems required for #{project[:official_name]}:"
+ gems, fake_gems = parse_project_gemfile
+ puts(gems + fake_gems)
end
-
- task clean: :ensure_gem do
- GemHelper.prepare_gem_metadata
- system "rm -r #{GemHelper.package_dir}"
- end
- desc "Build and publish project as gem"
- task release: [:ensure_gem, :gem, :push, :clean]
+ desc "Install all gem required by project (including fake gems)"
+ task :install_all do
+ gems, fake_gems = parse_project_gemfile
+ (gems + fake_gems).each do |name, version|
+ puts "Installing gem #{name} #{version}"
+ %x(gem install #{name} #{"-v #{version}" if version})
+ end
+ end
end
\ No newline at end of file