Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
tree: 5b7f69566a
Fetching contributors…

Cannot retrieve contributors at this time

574 lines (468 sloc) 15.602 kb
module Spec
module Builders
def self.constantize(name)
name.gsub('-', '').upcase
end
def v(version)
Gem::Version.new(version)
end
def pl(platform)
Gem::Platform.new(platform)
end
def build_repo1
build_repo gem_repo1 do
build_gem "rack", %w(0.9.1 1.0.0) do |s|
s.executables = "rackup"
end
build_gem "thin" do |s|
s.add_dependency "rack"
end
build_gem "rack-obama" do |s|
s.add_dependency "rack"
end
build_gem "rack_middleware", "1.0" do |s|
s.add_dependency "rack", "0.9.1"
end
build_gem "rails", "2.3.2" do |s|
s.executables = "rails"
s.add_dependency "rake"
s.add_dependency "actionpack", "2.3.2"
s.add_dependency "activerecord", "2.3.2"
s.add_dependency "actionmailer", "2.3.2"
s.add_dependency "activeresource", "2.3.2"
end
build_gem "actionpack", "2.3.2" do |s|
s.add_dependency "activesupport", "2.3.2"
end
build_gem "activerecord", ["2.3.1", "2.3.2"] do |s|
s.add_dependency "activesupport", "2.3.2"
end
build_gem "actionmailer", "2.3.2" do |s|
s.add_dependency "activesupport", "2.3.2"
end
build_gem "activeresource", "2.3.2" do |s|
s.add_dependency "activesupport", "2.3.2"
end
build_gem "activesupport", %w(1.2.3 2.3.2 2.3.5)
build_gem "activemerchant" do |s|
s.add_dependency "activesupport", ">= 2.0.0"
end
build_gem "rails_fail" do |s|
s.add_dependency "activesupport", "= 1.2.3"
end
build_gem "missing_dep" do |s|
s.add_dependency "not_here"
end
build_gem "rspec", "1.2.7", :no_default => true do |s|
s.write "lib/spec.rb", "SPEC = '1.2.7'"
end
build_gem "rack-test", :no_default => true do |s|
s.write "lib/rack/test.rb", "RACK_TEST = '1.0'"
end
build_gem "platform_specific" do |s|
s.platform = Gem::Platform.local
s.write "lib/platform_specific.rb", "PLATFORM_SPECIFIC = '1.0.0 #{Gem::Platform.local}'"
end
build_gem "platform_specific" do |s|
s.platform = "java"
s.write "lib/platform_specific.rb", "PLATFORM_SPECIFIC = '1.0.0 JAVA'"
end
build_gem "platform_specific" do |s|
s.platform = "ruby"
s.write "lib/platform_specific.rb", "PLATFORM_SPECIFIC = '1.0.0 RUBY'"
end
build_gem "platform_specific" do |s|
s.platform = "x86-mswin32"
s.write "lib/platform_specific.rb", "PLATFORM_SPECIFIC = '1.0.0 MSWIN'"
end
build_gem "platform_specific" do |s|
s.platform = "x86-darwin-100"
s.write "lib/platform_specific.rb", "PLATFORM_SPECIFIC = '1.0.0 x86-darwin-100'"
end
build_gem "only_java" do |s|
s.platform = "java"
end
build_gem "nokogiri", "1.4.2"
build_gem "nokogiri", "1.4.2" do |s|
s.platform = "java"
s.write "lib/nokogiri.rb", "NOKOGIRI = '1.4.2 JAVA'"
s.add_dependency "weakling", ">= 0.0.3"
end
build_gem "weakling", "0.0.3"
build_gem "multiple_versioned_deps" do |s|
s.add_dependency "weakling", ">= 0.0.1", "< 0.1"
end
build_gem "not_released", "1.0.pre"
build_gem "has_prerelease", "1.0"
build_gem "has_prerelease", "1.1.pre"
build_gem "with_development_dependency" do |s|
s.add_development_dependency "activesupport", "= 2.3.5"
end
build_gem "with_implicit_rake_dep" do |s|
s.extensions << "Rakefile"
s.write "Rakefile", <<-RUBY
task :default do
path = File.expand_path("../lib", __FILE__)
FileUtils.mkdir_p(path)
File.open("\#{path}/implicit_rake_dep.rb", "w") do |f|
f.puts "IMPLICIT_RAKE_DEP = 'YES'"
end
end
RUBY
end
build_gem "another_implicit_rake_dep" do |s|
s.extensions << "Rakefile"
s.write "Rakefile", <<-RUBY
task :default do
path = File.expand_path("../lib", __FILE__)
FileUtils.mkdir_p(path)
File.open("\#{path}/another_implicit_rake_dep.rb", "w") do |f|
f.puts "ANOTHER_IMPLICIT_RAKE_DEP = 'YES'"
end
end
RUBY
end
build_gem "very_simple_binary" do |s|
s.add_c_extension
end
build_gem "bundler", "0.9" do |s|
s.executables = "bundle"
s.write "bin/bundle", "puts 'FAIL'"
end
# The bundler 0.8 gem has a rubygems plugin that always loads :(
build_gem "bundler", "0.8.1" do |s|
s.write "lib/bundler/omg.rb", ""
s.write "lib/rubygems_plugin.rb", "require 'bundler/omg' ; puts 'FAIL'"
end
# The yard gem iterates over Gem.source_index looking for plugins
build_gem "yard" do |s|
s.write "lib/yard.rb", <<-Y
Gem.source_index.find_name('').each do |gem|
puts gem.full_name
end
Y
end
# The rcov gem is platform mswin32, but has no arch
build_gem "rcov" do |s|
s.platform = Gem::Platform.new([nil, "mswin32", nil])
s.write "lib/rcov.rb", "RCOV = '1.0.0'"
end
build_gem "net-ssh"
build_gem "net-sftp", "1.1.1" do |s|
s.add_dependency "net-ssh", ">= 1.0.0", "< 1.99.0"
end
# Test comlicated gem dependencies for install
build_gem "net_a" do |s|
s.add_dependency "net_b"
s.add_dependency "net_build_extensions"
end
build_gem "net_b"
build_gem "net_build_extensions" do |s|
s.add_dependency "rake"
s.extensions << "Rakefile"
s.write "Rakefile", <<-RUBY
task :default do
path = File.expand_path("../lib", __FILE__)
FileUtils.mkdir_p(path)
File.open("\#{path}/net_build_extensions.rb", "w") do |f|
f.puts "NET_BUILD_EXTENSIONS = 'YES'"
end
end
RUBY
end
build_gem "net_c" do |s|
s.add_dependency "net_a"
s.add_dependency "net_d"
end
build_gem "net_d"
build_gem "net_e" do |s|
s.add_dependency "net_d"
end
build_gem "foo"
end
end
def build_repo2(&blk)
FileUtils.rm_rf gem_repo2
FileUtils.cp_r gem_repo1, gem_repo2
update_repo2(&blk) if block_given?
end
def build_repo3
build_repo gem_repo3 do
build_gem "rack"
end
FileUtils.rm_rf Dir[gem_repo3("prerelease*")]
end
def update_repo2
update_repo gem_repo2 do
build_gem "rack", "1.2" do |s|
s.executables = "rackup"
end
yield if block_given?
end
end
def build_repo(path, &blk)
return if File.directory?(path)
rake_path = Dir["#{Path.base_system_gems}/**/rake*.gem"].first
if rake_path
FileUtils.mkdir_p("#{path}/gems")
FileUtils.cp rake_path, "#{path}/gems/"
else
abort "You need to `rm -rf #{tmp}`"
end
update_repo(path, &blk)
end
def update_repo(path)
@_build_path = "#{path}/gems"
yield
@_build_path = nil
with_gem_path_as Path.base_system_gems do
chdir(path) { gem_command :generate_index }
end
end
def build_index(&block)
index = Bundler::Index.new
IndexBuilder.run(index, &block) if block_given?
index
end
def build_spec(name, version, platform = nil, &block)
Array(version).map do |v|
Gem::Specification.new do |s|
s.name = name
s.version = Gem::Version.new(v)
s.platform = platform
DepBuilder.run(s, &block) if block_given?
end
end
end
def build_dep(name, requirements = Gem::Requirement.default, type = :runtime)
Bundler::Dependency.new(name, :version => requirements)
end
def build_lib(name, *args, &blk)
build_with(LibBuilder, name, args, &blk)
end
def build_gem(name, *args, &blk)
build_with(GemBuilder, name, args, &blk)
end
def build_git(name, *args, &block)
opts = Hash === args.last ? args.last : {}
spec = build_with(GitBuilder, name, args, &block)
GitReader.new(opts[:path] || lib_path(spec.full_name))
end
def update_git(name, *args, &block)
build_with(GitUpdater, name, args, &block)
end
private
def build_with(builder, name, args, &blk)
@_build_path ||= nil
options = args.last.is_a?(Hash) ? args.pop : {}
versions = args.last || "1.0"
spec = nil
options[:path] ||= @_build_path
Array(versions).each do |version|
spec = builder.new(self, name, version)
yield spec if block_given?
spec._build(options)
end
spec
end
class IndexBuilder
include Builders
def self.run(index, &block)
new(index).run(&block)
end
def initialize(index)
@index = index
end
def run(&block)
instance_eval(&block)
end
def gem(*args, &block)
build_spec(*args, &block).each do |s|
@index << s
end
end
def platforms(platforms)
platforms.split(/\s+/).each do |platform|
platform = 'x86-mswin32' if platform == 'mswin32'
platform = Gem::Platform.new(platform)
if String === platform
class << platform
undef =~
alias =~ ==
end
end
yield Gem::Platform.new(platform)
end
end
def versions(versions)
versions.split(/\s+/).each { |version| yield v(version) }
end
end
class DepBuilder
include Builders
def self.run(spec, &block)
new(spec).run(&block)
end
def initialize(spec)
@spec = spec
end
def run(&block)
instance_eval(&block)
end
def runtime(name, requirements)
@spec.add_runtime_dependency(name, requirements)
end
alias dep runtime
end
class LibBuilder
def initialize(context, name, version)
@context = context
@name = name
@spec = Gem::Specification.new do |s|
s.name = name
s.version = version
s.summary = "This is just a fake gem for testing"
end
@files = {}
end
def method_missing(*args, &blk)
@spec.send(*args, &blk)
end
def write(file, source = "")
@files[file] = source
end
def executables=(val)
Array(val).each do |file|
write "bin/#{file}", "require '#{@name}' ; puts #{@name.upcase}"
end
@spec.executables = Array(val)
end
def add_c_extension
require_paths << 'ext'
extensions << "ext/extconf.rb"
write "ext/extconf.rb", <<-RUBY
require "mkmf"
# exit 1 unless with_config("simple")
extension_name = "very_simple_binary_c"
dir_config extension_name
create_makefile extension_name
RUBY
write "ext/very_simple_binary.c", <<-C
#include "ruby.h"
void Init_very_simple_binary_c() {
rb_define_module("VerySimpleBinaryInC");
}
C
end
def _build(options)
path = options[:path] || _default_path
if options[:rubygems_version]
@spec.rubygems_version = options[:rubygems_version]
def @spec.mark_version; end
def @spec.validate; end
end
case options[:gemspec]
when false
# do nothing
when :yaml
@files["#{name}.gemspec"] = @spec.to_yaml
else
@files["#{name}.gemspec"] = @spec.to_ruby
end
unless options[:no_default]
@files = _default_files.merge(@files)
end
@files.each do |file, source|
file = Pathname.new(path).join(file)
FileUtils.mkdir_p(file.dirname)
File.open(file, 'w') { |f| f.puts source }
end
@spec.files = @files.keys
path
end
def _default_files
@_default_files ||= { "lib/#{name}.rb" => "#{Builders.constantize(name)} = '#{version}'" }
end
def _default_path
@context.tmp('libs', @spec.full_name)
end
end
class GitBuilder < LibBuilder
def _build(options)
path = options[:path] || _default_path
super(options.merge(:path => path))
@context.chdir(path) do
@context.sys_exec "git init"
@context.sys_exec "git add *"
@context.sys_exec "git commit -m 'OMG INITIAL COMMIT'"
end
end
end
class GitUpdater < LibBuilder
WINDOWS = Config::CONFIG["host_os"] =~ %r!(msdos|mswin|djgpp|mingw)!
NULL = WINDOWS ? "NUL" : "/dev/null"
def silently(str)
@context.sys_exec "#{str} 2>#{NULL}"
end
def _build(options)
libpath = options[:path] || _default_path
@context.chdir(libpath) do
silently "git checkout master"
if branch = options[:branch]
raise "You can't specify `master` as the branch" if branch == "master"
if @context.sys_exec("git branch | grep #{branch}").empty?
silently("git branch #{branch}")
end
silently("git checkout #{branch}")
elsif tag = options[:tag]
@context.sys_exec("git tag #{tag}")
end
current_ref = context.sys_exec("git rev-parse HEAD").strip
_default_files.keys.each do |path|
_default_files[path] << "\n#{Builders.constantize(name)}_PREV_REF = '#{current_ref}'"
end
super(options.merge(:path => libpath))
@context.sys_exec("git add *")
@context.sys_exec("git commit -m \"BUMP\"")
end
end
end
class GitReader
attr_reader :path
def initialize(path)
@path = path
end
def ref_for(ref, len = nil)
ref = git "rev-parse #{ref}"
ref = ref[0..len] if len
ref
end
private
def git(cmd)
@context.chdir(@path) { @context.sys_exec("git #{cmd}").strip }
end
end
class GemBuilder < LibBuilder
def _build(opts)
lib_path = super(opts.merge(:path => @context.tmp(".tmp/#{@spec.full_name}"), :no_default => opts[:no_default]))
@context.chdir(lib_path) do
destination = opts[:path] || _default_path
FileUtils.mkdir_p(destination)
gemspec_path = "#{lib_path}/#{@spec.full_name}.omg.gemspec"
File.open(gemspec_path, "w") do |file|
file.puts @spec.to_ruby
end
@context.gem_command "build #{gemspec_path}"
if opts[:to_system]
@context.sys_exec "gem install --ignore-dependencies #{@spec.full_name}.gem"
else
FileUtils.mv("#{@context.pwd}/#{@spec.full_name}.gem", opts[:path] || _default_path)
end
end
end
def _default_path
@context.gem_repo1('gems')
end
end
end
end
Jump to Line
Something went wrong with that request. Please try again.