lib/jeweler.rb in namelessjon-jeweler-0.6.2 vs lib/jeweler.rb in namelessjon-jeweler-0.6.5

- old
+ new

@@ -1,34 +1,231 @@ require 'date' +require 'rubygems/builder' -require 'jeweler/bumping' -require 'jeweler/versioning' +require 'jeweler/version' require 'jeweler/gemspec' require 'jeweler/errors' require 'jeweler/generator' -require 'jeweler/release' require 'jeweler/tasks' # A Jeweler helps you craft the perfect Rubygem. Give him a gemspec, and he takes care of the rest. class Jeweler - include Jeweler::Bumping - include Jeweler::Versioning - include Jeweler::Gemspec - include Jeweler::Release attr_reader :gemspec attr_accessor :base_dir def initialize(gemspec, base_dir = '.') raise(GemspecError, "Can't create a Jeweler with a nil gemspec") if gemspec.nil? @gemspec = gemspec @base_dir = base_dir + + if @gemspec.files.nil? || @gemspec.files.empty? + @gemspec.files = FileList["[A-Z]*.*", "{bin,generators,lib,test,spec}/**/*"] + end - @gemspec.files ||= FileList["[A-Z]*.*", "{bin,generators,lib,test,spec}/**/*"] + @gemspec.has_rdoc = true + @gemspec.rdoc_options << '--inline-source' << '--charset=UTF-8' + @gemspec.extra_rdoc_files ||= FileList["[A-Z]*.*"] if File.exists?(File.join(base_dir, '.git')) @repo = Git.open(base_dir) end + + @version = Jeweler::Version.new(@base_dir) end + + # Major version, as defined by the gemspec's Version module. + # For 1.5.3, this would return 1. + def major_version + @version.major + end + + # Minor version, as defined by the gemspec's Version module. + # For 1.5.3, this would return 5. + def minor_version + @version.minor + end + + # Patch version, as defined by the gemspec's Version module. + # For 1.5.3, this would return 5. + def patch_version + @version.patch + end + + # Human readable version, which is used in the gemspec. + def version + @version.to_s + end + + # Writes out the gemspec + def write_gemspec + self.refresh_version + + helper = gemspec_helper do |s| + s.version = self.version + s.date = Time.now + end + + helper.write + + puts "Generated: #{helper.path}" + end + + # Validates the project's gemspec from disk in an environment similar to how + # GitHub would build from it. See http://gist.github.com/16215 + def validate_gemspec + begin + gemspec_helper.parse + puts "#{gemspec_path} is valid." + rescue Exception => e + puts "#{gemspec_path} is invalid. See the backtrace for more details." + raise + end + end + + + # is the project's gemspec from disk valid? + def valid_gemspec? + gemspec_helper.valid? + end + + # parses the project's gemspec from disk without extra sanity checks + def unsafe_parse_gemspec(data = nil) + data ||= File.read(gemspec_path) + eval(data, binding, gemspec_path) + end + + def build_gem + parsed_gemspec = unsafe_parse_gemspec() + Gem::Builder.new(parsed_gemspec).build + + pkg_dir = File.join(@base_dir, 'pkg') + FileUtils.mkdir_p pkg_dir + + gem_filename = File.join(@base_dir, parsed_gemspec.file_name) + FileUtils.mv gem_filename, pkg_dir + end + + def install_gem + command = "sudo gem install #{gem_path}" + $stdout.puts "Executing #{command.inspect}:" + sh command + end + + # Bumps the patch version. + # + # 1.5.1 -> 1.5.2 + def bump_patch_version(options = {}) + options = version_writing_options(options) + + @version.bump_patch + @version.write + + commit_version if options[:commit] + end + + # Bumps the minor version. + # + # 1.5.1 -> 1.6.0 + def bump_minor_version(options = {}) + options = version_writing_options(options) + + @version.bump_minor + @version.write + + commit_version if options[:commit] + end + + # Bumps the major version. + # + # 1.5.1 -> 2.0.0 + def bump_major_version(options = {}) + options = version_writing_options(options) + + @version.bump_major + @version.write + + commit_version if options[:commit] + end + + # Bumps the version, to the specific major/minor/patch version, writing out the appropriate version.rb, and then reloads it. + def write_version(major, minor, patch, options = {}) + options = version_writing_options(options) + + @version.update_to major, minor, patch + @version.write + + @gemspec.version = @version.to_s + + commit_version if options[:commit] + end + + + def release + @repo.checkout('master') + + raise "Hey buddy, try committing them files first" if any_pending_changes? + + write_gemspec() + + @repo.add(gemspec_path) + $stdout.puts "Committing #{gemspec_path}" + @repo.commit("Regenerated gemspec for version #{version}") + + $stdout.puts "Pushing master to origin" + @repo.push + + $stdout.puts "Tagging #{release_tag}" + @repo.add_tag(release_tag) + + $stdout.puts "Pushing #{release_tag} to origin" + @repo.push('origin', release_tag) + end + + def release_tag + @release_tag ||= "v#{version}" + end + + protected + + def version_writing_options(options) + {:commit => true}.merge(options) + end + + def commit_version + if @repo + @repo.add('VERSION.yml') + @repo.commit("Version bump to #{version}", 'VERSION.yml') + end + end + + def refresh_version + @version.refresh + end + + def gemspec_helper(&block) + GemSpecHelper.new(@gemspec, @base_dir, &block) + end + + def gemspec_path + gemspec_helper.path + end + + def gem_path + parsed_gemspec = unsafe_parse_gemspec() + File.join(@base_dir, 'pkg', parsed_gemspec.file_name) + end + + def any_pending_changes? + unless ENV['JEWELER_DEBUG'].nil? || ENV['JEWELER_DEBUG'].squeeze == '' + require 'ruby-debug'; breakpoint + end + !(@repo.status.added.empty? && @repo.status.deleted.empty? && @repo.status.changed.empty?) + end + + protected + def any_pending_changes? + !(@repo.status.added.empty? && @repo.status.deleted.empty? && @repo.status.changed.empty?) + end end