unless defined? Gem require 'rubygems' require 'rubygems/specification' end module Gem @loaded_stacks = Hash.new { |h,k| h[k] = [] } class Specification attr_accessor :source, :location def load_paths require_paths.map {|p| File.join(full_gem_path, p) } end def groups @groups ||= [] end def git_version if @loaded_from && File.exist?(File.join(full_gem_path, ".git")) sha = Dir.chdir(full_gem_path){ `git rev-parse HEAD`.strip } branch = full_gem_path.split("-")[3] (branch && branch != sha) ? " #{branch}-#{sha[0...6]}" : " #{sha[0...6]}" end end def to_lock out = " #{name} (#{version})" out << (dependencies.empty? ? "\n" : ":\n") dependencies.sort_by {|d| d.name }.each do |dep| next if dep.type == :development out << " #{dep.to_lock}\n" end out end def to_gemfile(path = nil) gemfile = "source :gemcutter\n" gemfile << dependencies_to_gemfile(dependencies) gemfile << dependencies_to_gemfile(development_dependencies, :development) end def add_bundler_dependencies(*groups) groups = [:default] if groups.empty? Bundler.definition.dependencies.each do |dep| if dep.groups.include?(:development) self.add_development_dependency(dep.name, dep.requirement.to_s) elsif (dep.groups & groups).any? self.add_dependency(dep.name, dep.requirement.to_s) end end end private def dependencies_to_gemfile(dependencies, group = nil) gemfile = '' if dependencies.any? gemfile << "group #{group} do\n" if group dependencies.each do |dependency| gemfile << ' ' if group gemfile << %|gem "#{dependency.name}"| req = dependency.requirements_list.first gemfile << %|, "#{req}"| if req gemfile << "\n" end gemfile << "end\n" if group end gemfile end end class Dependency attr_accessor :source, :groups alias eql? == def to_yaml_properties instance_variables.reject { |p| ["@source", "@groups"].include?(p.to_s) } end def to_lock out = " #{name}" unless requirement == Gem::Requirement.default out << " (#{requirement.to_s})" end out end end end