corundum 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/doc/README +2 -0
- data/doc/Specifications +6 -0
- data/doc/coverage/assets/0.5.3/app.js +88 -0
- data/doc/coverage/assets/0.5.3/fancybox/blank.gif +0 -0
- data/doc/coverage/assets/0.5.3/fancybox/fancy_close.png +0 -0
- data/doc/coverage/assets/0.5.3/fancybox/fancy_loading.png +0 -0
- data/doc/coverage/assets/0.5.3/fancybox/fancy_nav_left.png +0 -0
- data/doc/coverage/assets/0.5.3/fancybox/fancy_nav_right.png +0 -0
- data/doc/coverage/assets/0.5.3/fancybox/fancy_shadow_e.png +0 -0
- data/doc/coverage/assets/0.5.3/fancybox/fancy_shadow_n.png +0 -0
- data/doc/coverage/assets/0.5.3/fancybox/fancy_shadow_ne.png +0 -0
- data/doc/coverage/assets/0.5.3/fancybox/fancy_shadow_nw.png +0 -0
- data/doc/coverage/assets/0.5.3/fancybox/fancy_shadow_s.png +0 -0
- data/doc/coverage/assets/0.5.3/fancybox/fancy_shadow_se.png +0 -0
- data/doc/coverage/assets/0.5.3/fancybox/fancy_shadow_sw.png +0 -0
- data/doc/coverage/assets/0.5.3/fancybox/fancy_shadow_w.png +0 -0
- data/doc/coverage/assets/0.5.3/fancybox/fancy_title_left.png +0 -0
- data/doc/coverage/assets/0.5.3/fancybox/fancy_title_main.png +0 -0
- data/doc/coverage/assets/0.5.3/fancybox/fancy_title_over.png +0 -0
- data/doc/coverage/assets/0.5.3/fancybox/fancy_title_right.png +0 -0
- data/doc/coverage/assets/0.5.3/fancybox/fancybox-x.png +0 -0
- data/doc/coverage/assets/0.5.3/fancybox/fancybox-y.png +0 -0
- data/doc/coverage/assets/0.5.3/fancybox/fancybox.png +0 -0
- data/doc/coverage/assets/0.5.3/fancybox/jquery.fancybox-1.3.1.css +363 -0
- data/doc/coverage/assets/0.5.3/fancybox/jquery.fancybox-1.3.1.pack.js +44 -0
- data/doc/coverage/assets/0.5.3/favicon_green.png +0 -0
- data/doc/coverage/assets/0.5.3/favicon_red.png +0 -0
- data/doc/coverage/assets/0.5.3/favicon_yellow.png +0 -0
- data/doc/coverage/assets/0.5.3/highlight.css +129 -0
- data/doc/coverage/assets/0.5.3/highlight.pack.js +1 -0
- data/doc/coverage/assets/0.5.3/jquery-1.6.2.min.js +18 -0
- data/doc/coverage/assets/0.5.3/jquery.dataTables.min.js +152 -0
- data/doc/coverage/assets/0.5.3/jquery.timeago.js +141 -0
- data/doc/coverage/assets/0.5.3/jquery.url.js +174 -0
- data/doc/coverage/assets/0.5.3/loading.gif +0 -0
- data/doc/coverage/assets/0.5.3/magnify.png +0 -0
- data/doc/coverage/assets/0.5.3/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- data/doc/coverage/assets/0.5.3/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
- data/doc/coverage/assets/0.5.3/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
- data/doc/coverage/assets/0.5.3/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/doc/coverage/assets/0.5.3/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
- data/doc/coverage/assets/0.5.3/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
- data/doc/coverage/assets/0.5.3/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
- data/doc/coverage/assets/0.5.3/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
- data/doc/coverage/assets/0.5.3/smoothness/images/ui-icons_222222_256x240.png +0 -0
- data/doc/coverage/assets/0.5.3/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
- data/doc/coverage/assets/0.5.3/smoothness/images/ui-icons_454545_256x240.png +0 -0
- data/doc/coverage/assets/0.5.3/smoothness/images/ui-icons_888888_256x240.png +0 -0
- data/doc/coverage/assets/0.5.3/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
- data/doc/coverage/assets/0.5.3/smoothness/jquery-ui-1.8.4.custom.css +295 -0
- data/doc/coverage/assets/0.5.3/stylesheet.css +383 -0
- data/doc/coverage/index.html +6511 -0
- data/lib/corundum.rb +130 -0
- data/lib/corundum/email.rb +92 -0
- data/lib/corundum/gem_building.rb +34 -0
- data/lib/corundum/gemcutter.rb +110 -0
- data/lib/corundum/gemspec_sanity.rb +32 -0
- data/lib/corundum/rspec.rb +135 -0
- data/lib/corundum/rubyforge.rb +95 -0
- data/lib/corundum/simplecov.rb +123 -0
- data/lib/corundum/tasklib.rb +57 -0
- data/lib/corundum/tasklibs.rb +8 -0
- data/lib/corundum/version_control.rb +36 -0
- data/lib/corundum/version_control/monotone.rb +126 -0
- data/lib/corundum/yardoc.rb +33 -0
- data/spec/bogus_spec.rb +3 -0
- data/spec/smoking_spec.rb +29 -0
- data/spec_help/file-sandbox.rb +164 -0
- data/spec_help/gem_test_suite.rb +17 -0
- data/spec_help/spec_helper.rb +4 -0
- data/spec_help/ungemmer.rb +36 -0
- metadata +292 -0
data/lib/corundum.rb
ADDED
@@ -0,0 +1,130 @@
|
|
1
|
+
require 'corundum/tasklib'
|
2
|
+
|
3
|
+
#require 'rubygems'
|
4
|
+
#require 'rubygems/installer'
|
5
|
+
|
6
|
+
module Corundum
|
7
|
+
extend Rake::DSL
|
8
|
+
|
9
|
+
class Toolkit < TaskLib
|
10
|
+
def default_configuration(namespace)
|
11
|
+
@configuration.marshal_load(
|
12
|
+
:namespace => namespace,
|
13
|
+
:finished_dir => "corundum",
|
14
|
+
:finished_files => OpenStruct.new,
|
15
|
+
|
16
|
+
:browser => "chromium",
|
17
|
+
:gemspec => nil,
|
18
|
+
:gemspec_path => nil,
|
19
|
+
:email => OpenStruct.new(
|
20
|
+
:servers => [ OpenStruct.new({ :server => "ruby-lang.org", :helo => "gmail.com" }) ],
|
21
|
+
:announce_to_email => "ruby-talk@ruby-lang.org"
|
22
|
+
),
|
23
|
+
:package_dir => "pkg",
|
24
|
+
:files => OpenStruct.new(:code => nil, :test => nil, :docs => nil),
|
25
|
+
:file_lists => OpenStruct.new(:code => nil, :test => nil, :docs => nil, :all => nil),
|
26
|
+
:rubyforge => OpenStruct.new(),
|
27
|
+
:doc_dir => "rubydoc"
|
28
|
+
)
|
29
|
+
end
|
30
|
+
|
31
|
+
def load_gemspec
|
32
|
+
@configuration.gemspec_path ||= guess_gemspec
|
33
|
+
@configuration.gemspec ||= Gem::Specification::load(@configuration.gemspec_path)
|
34
|
+
return @configuration.gemspec
|
35
|
+
end
|
36
|
+
|
37
|
+
def resolve_configuration
|
38
|
+
load_gemspec
|
39
|
+
|
40
|
+
@configuration.finished_files.build ||= File::join(
|
41
|
+
@configuration.finished_dir, "build_#{@configuration.gemspec.version}")
|
42
|
+
@configuration.finished_files.qa ||= File::join(
|
43
|
+
@configuration.finished_dir, "qa_#{@configuration.gemspec.version}")
|
44
|
+
@configuration.finished_files.package ||= File::join(
|
45
|
+
@configuration.finished_dir, "package_#{@configuration.gemspec.version}")
|
46
|
+
@configuration.finished_files.release ||= File::join(
|
47
|
+
@configuration.finished_dir, "release_#{@configuration.gemspec.version}")
|
48
|
+
@configuration.finished_files.press ||= File::join(
|
49
|
+
@configuration.finished_dir, "press_#{@configuration.gemspec.version}")
|
50
|
+
|
51
|
+
@configuration.files.code ||= @configuration.gemspec.files.grep(%r{^lib/})
|
52
|
+
@configuration.files.test ||= @configuration.gemspec.files.grep(%r{^spec/})
|
53
|
+
@configuration.files.docs ||= @configuration.gemspec.files.grep(%r{^doc/})
|
54
|
+
|
55
|
+
@configuration.file_lists.code ||= FileList['lib/**/*.rb']
|
56
|
+
@configuration.file_lists.test ||= FileList['test/**/*.rb','spec/**/*.rb','features/**/*.rb']
|
57
|
+
@configuration.file_lists.docs ||= FileList['doc/**/*.rb']
|
58
|
+
@configuration.file_lists.all ||=
|
59
|
+
@configuration.file_lists.code +
|
60
|
+
@configuration.file_lists.test +
|
61
|
+
@configuration.file_lists.docs
|
62
|
+
|
63
|
+
@configuration.rubyforge.group_id ||= @configuration.gemspec.rubyforge_project
|
64
|
+
@configuration.rubyforge.package_id ||= @configuration.gemspec.name.downcase
|
65
|
+
@configuration.rubyforge.release_name ||= @configuration.gemspec.full_name
|
66
|
+
@configuration.rubyforge.home_page ||= @configuration.gemspec.homepage
|
67
|
+
@configuration.rubyforge.project_page ||= "http://rubyforge.org/project/#{@configuration.gemspec.rubyforge_project}/"
|
68
|
+
end
|
69
|
+
|
70
|
+
def guess_gemspec
|
71
|
+
speclist = Dir[File.expand_path("*.gemspec", Rake::original_dir)]
|
72
|
+
if speclist.length == 0
|
73
|
+
puts "Found no *.gemspec files"
|
74
|
+
exit 1
|
75
|
+
elsif speclist.length > 1
|
76
|
+
puts "Found too many *.gemspec files: #{speclist.inspect}"
|
77
|
+
exit 1
|
78
|
+
end
|
79
|
+
speclist[0]
|
80
|
+
end
|
81
|
+
|
82
|
+
def define
|
83
|
+
in_namespace do
|
84
|
+
directory @configuration.finished_dir
|
85
|
+
|
86
|
+
desc "Run preflight checks"
|
87
|
+
task :preflight
|
88
|
+
|
89
|
+
desc "Run quality assurance tasks"
|
90
|
+
task :qa => :preflight
|
91
|
+
file @configuration.finished_files.qa => [:qa, @configuration.finished_dir] do |task|
|
92
|
+
touch task.name
|
93
|
+
end
|
94
|
+
|
95
|
+
desc "Build the package"
|
96
|
+
task :build => @configuration.finished_files.qa
|
97
|
+
file @configuration.finished_files.build => [:build, @configuration.finished_dir] do |task|
|
98
|
+
touch task.name
|
99
|
+
end
|
100
|
+
|
101
|
+
desc "Push package out to the world"
|
102
|
+
task :release => @configuration.finished_files.build
|
103
|
+
file @configuration.finished_files.release => [:release, @configuration.finished_dir] do |task|
|
104
|
+
touch task.name
|
105
|
+
end
|
106
|
+
|
107
|
+
desc "Announce publication"
|
108
|
+
task :press => @configuration.finished_files.release
|
109
|
+
file @configuration.finished_files.press => [:press, @configuration.finished_dir] do |task|
|
110
|
+
touch task.name
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
def old_define
|
116
|
+
|
117
|
+
task @publishing.namespace => "#{@gem_building.namespace}:push"
|
118
|
+
task "#{@publishing.namespace}:docs" => "#{@documentation.namespace}:docs"
|
119
|
+
task "#{@publishing.namespace}:rubyforge" => ["#{@quality_assurance.namespace}:sign_off", "#{@gem_building.namespace}:package"]
|
120
|
+
|
121
|
+
require 'corundum/press'
|
122
|
+
Press.new(@press.namespace) do |press|
|
123
|
+
press.rubyforge = @rubyforge
|
124
|
+
press.gemspec = @configuration.gemspec
|
125
|
+
press.announce_to_email = @email.announce_to_email
|
126
|
+
press.email_servers = @email.servers
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
require 'corundum/tasklib'
|
2
|
+
|
3
|
+
module Corundum
|
4
|
+
class Email < TaskLib
|
5
|
+
def default_namespace
|
6
|
+
:email
|
7
|
+
end
|
8
|
+
|
9
|
+
def receive_tasklibs(toolkit)
|
10
|
+
@toolkit = toolkit
|
11
|
+
end
|
12
|
+
|
13
|
+
def default_configuration(namespace, toolkit_config)
|
14
|
+
@configuration.namespace = namespace
|
15
|
+
@configuration.rubyforge = toolkit_config.rubyforge
|
16
|
+
@configuration.email_servers = []
|
17
|
+
@configuration.gemspec = toolkit_config.gemspec
|
18
|
+
@configuration.announce_to_email = nil
|
19
|
+
@configuration.urls = OpenStruct.new
|
20
|
+
end
|
21
|
+
|
22
|
+
def resolve_configuration
|
23
|
+
@configuration.urls.home_page ||=
|
24
|
+
@configuration.gemspec.homepage
|
25
|
+
|
26
|
+
@configuration.urls.project_page ||=
|
27
|
+
@configuration.rubyforge.project_page
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
def announcement
|
32
|
+
changes = ""
|
33
|
+
begin
|
34
|
+
File::open("./Changelog", "r") do |changelog|
|
35
|
+
changes = "Changes:\n\n"
|
36
|
+
changes += changelog.read
|
37
|
+
end
|
38
|
+
rescue Exception
|
39
|
+
end
|
40
|
+
|
41
|
+
urls = "Project: #{@configuration.urls.project_page}\n" +
|
42
|
+
"Homepage: #{@configuration.urls.home_page}"
|
43
|
+
|
44
|
+
subject = "#{@configuration.gemspec.name} #{@configuration.gemspec.version} Released"
|
45
|
+
title = "#{@configuration.gemspec.name} version #{@configuration.gemspec.version} has been released!"
|
46
|
+
body = "#{@configuration.gemspec.description}\n\n#{changes}\n\n#{urls}"
|
47
|
+
|
48
|
+
return subject, title, body
|
49
|
+
end
|
50
|
+
|
51
|
+
def define
|
52
|
+
desc 'Announce release on email'
|
53
|
+
task @configuration.namespace => ["#{@configuration.namespace.to_s}:rubyforge", "#{@configuration.namespace.to_s}:email"]
|
54
|
+
namespace @configuration.namespace do
|
55
|
+
file "email.txt" do |t|
|
56
|
+
require 'mailfactory'
|
57
|
+
|
58
|
+
subject, title, body= announcement
|
59
|
+
|
60
|
+
mail = MailFactory.new
|
61
|
+
mail.To = @configuration.announce_to_email
|
62
|
+
mail.From = @configuration.gemspec.email
|
63
|
+
mail.Subject = "[ANN] " + subject
|
64
|
+
mail.text = [title, body].join("\n\n")
|
65
|
+
|
66
|
+
File.open(t.name, "w") do |mailfile|
|
67
|
+
mailfile.write mail.to_s
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
task :email => "email.txt" do
|
72
|
+
require 'net/smtp'
|
73
|
+
|
74
|
+
@configuration.email_servers.each do |server_config|
|
75
|
+
begin
|
76
|
+
File::open("email.txt", "r") do |email|
|
77
|
+
Net::SMTP.start(server_config[:server], 25, server_config[:helo], server_config[:username], server_config[:password]) do |smtp|
|
78
|
+
smtp.data do |mta|
|
79
|
+
mta.write(email.read)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
break
|
84
|
+
rescue Object => ex
|
85
|
+
puts ex.message
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'corundum/tasklib'
|
2
|
+
|
3
|
+
module Corundum
|
4
|
+
class GemBuilding < TaskLib
|
5
|
+
def receive_tasklibs(toolkit)
|
6
|
+
@toolkit = toolkit
|
7
|
+
end
|
8
|
+
|
9
|
+
def default_configuration(namespace, toolkit_config)
|
10
|
+
@configuration.namespace = namespace || :package
|
11
|
+
@configuration.gemspec = toolkit_config.gemspec
|
12
|
+
@configuration.qa_finished_file = toolkit_config.finished_files.qa
|
13
|
+
@configuration.package_dir = "pkg"
|
14
|
+
end
|
15
|
+
|
16
|
+
def define
|
17
|
+
require 'rubygems/package_task'
|
18
|
+
|
19
|
+
in_namespace do
|
20
|
+
package = Gem::PackageTask.new(@configuration.gemspec) do |t|
|
21
|
+
t.need_tar_gz = true
|
22
|
+
t.need_tar_bz2 = true
|
23
|
+
t.package_dir = @configuration.package_dir
|
24
|
+
end
|
25
|
+
|
26
|
+
task(:package).prerequisites.each do |package_type|
|
27
|
+
file package_type => @configuration.qa_finished_file
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
task :build => in_namespace("gem")
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
require 'corundum/tasklib'
|
2
|
+
|
3
|
+
module Corundum
|
4
|
+
class GemCutter < TaskLib
|
5
|
+
def receive_tasklibs(toolkit, build)
|
6
|
+
@toolkit = toolkit
|
7
|
+
@build = build
|
8
|
+
end
|
9
|
+
|
10
|
+
def default_configuration(namespace, toolkit_config, build_config)
|
11
|
+
@configuration.namespace = namespace || :gemcutter
|
12
|
+
@configuration.gemspec = toolkit_config.gemspec
|
13
|
+
@configuration.build_finished_path = toolkit_config.finished_files.build
|
14
|
+
@configuration.gem_path = nil
|
15
|
+
@configuration.gem_name = nil
|
16
|
+
@configuration.package_dir = build_config.package_dir
|
17
|
+
end
|
18
|
+
|
19
|
+
def resolve_configuration
|
20
|
+
@configuration.gem_path ||=
|
21
|
+
File::join(@configuration.package_dir, @configuration.gemspec.file_name)
|
22
|
+
|
23
|
+
@configuration.gem_name ||= @configuration.gemspec.full_name
|
24
|
+
end
|
25
|
+
|
26
|
+
module CommandTweaks
|
27
|
+
def setup_args(args = nil)
|
28
|
+
args ||= []
|
29
|
+
handle_options(args)
|
30
|
+
end
|
31
|
+
|
32
|
+
def gem_list=(list)
|
33
|
+
@configuration.gems = list
|
34
|
+
end
|
35
|
+
|
36
|
+
def get_all_gem_names
|
37
|
+
return @configuration.gems if defined?(@configuration.gems)
|
38
|
+
super
|
39
|
+
end
|
40
|
+
|
41
|
+
def get_one_gem_name
|
42
|
+
return @configuration.gems.first if defined?(@configuration.gems)
|
43
|
+
super
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def get_command(klass, args=nil)
|
48
|
+
cmd = klass.new
|
49
|
+
cmd.extend(CommandTweaks)
|
50
|
+
cmd.setup_args(args)
|
51
|
+
cmd
|
52
|
+
end
|
53
|
+
|
54
|
+
def define
|
55
|
+
in_namespace do
|
56
|
+
task :uninstall do |t|
|
57
|
+
when_writing("Uninstalling #{@configuration.gem_name}") do
|
58
|
+
require "rubygems/commands/uninstall_command"
|
59
|
+
uninstall = get_command Gem::Commands::UninstallCommand
|
60
|
+
uninstall.options[:args] = [@configuration.gem_path]
|
61
|
+
uninstall.execute
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
task :install => [@configuration.gem_path] do |t|
|
66
|
+
when_writing("Installing #{@configuration.gem_path}") do
|
67
|
+
require "rubygems/commands/install_command"
|
68
|
+
install = get_command Gem::Commands::InstallCommand
|
69
|
+
install.options[:args] = [@configuration.gem_path]
|
70
|
+
install.execute
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
task :reinstall => [:uninstall, :install]
|
75
|
+
|
76
|
+
task :dependencies_available do
|
77
|
+
checker = Gem::SpecFetcher.new
|
78
|
+
@configuration.gemspec.runtime_dependencies.each do |dep|
|
79
|
+
fulfilling = checker.find_matching(dep,false,false,false)
|
80
|
+
if fulfilling.empty?
|
81
|
+
fail "Dependency #{dep} is unfulfilled remotely"
|
82
|
+
else
|
83
|
+
puts "Remotely fulfilled: #{dep}" if verbose
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
task :is_unpushed do
|
89
|
+
checker = Gem::SpecFetcher.new
|
90
|
+
dep = Gem::Dependency.new(@configuration.gemspec.name, "= #{@configuration.gemspec.version}")
|
91
|
+
fulfilling = checker.find_matching(dep,false,false,true)
|
92
|
+
unless fulfilling.empty?
|
93
|
+
fail "Gem #{@configuration.gemspec.full_name} is already pushed"
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
desc 'Push a gem up to Gemcutter'
|
98
|
+
task :push => [:dependencies_available, :is_unpushed] do
|
99
|
+
require "rubygems/commands/push_command"
|
100
|
+
push = get_command(Gem::Commands::PushCommand)
|
101
|
+
push.options[:args] = [@configuration.gem_path]
|
102
|
+
push.execute
|
103
|
+
end
|
104
|
+
task :push => @configuration.build_finished_path
|
105
|
+
end
|
106
|
+
task :release => in_namespace(:push)
|
107
|
+
task :preflight => in_namespace(:dependencies_available, :is_unpushed)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'corundum/tasklib'
|
2
|
+
|
3
|
+
module Corundum
|
4
|
+
class GemspecSanity < TaskLib
|
5
|
+
def default_namespace
|
6
|
+
:gemspec_sanity
|
7
|
+
end
|
8
|
+
|
9
|
+
def receive_tasklibs(toolkit)
|
10
|
+
@toolkit = toolkit
|
11
|
+
end
|
12
|
+
|
13
|
+
def default_configuration(namespace, toolkit_config)
|
14
|
+
@configuration.namespace = namespace
|
15
|
+
@configuration.gemspec = toolkit_config.gemspec
|
16
|
+
end
|
17
|
+
|
18
|
+
def define
|
19
|
+
in_namespace do
|
20
|
+
task :files_exist do
|
21
|
+
missing = @configuration.gemspec.files.find_all do |path|
|
22
|
+
not File::exists?(path)
|
23
|
+
end
|
24
|
+
|
25
|
+
fail "Files mentioned in gemspec are missing: #{missing.join(", ")}" unless missing.empty?
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
task :preflight => in_namespace(:files_exist)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,135 @@
|
|
1
|
+
require 'corundum/tasklib'
|
2
|
+
require 'rspec/core'
|
3
|
+
|
4
|
+
module Corundum
|
5
|
+
#TODO: this should take two command generators as arguments: the test runner,
|
6
|
+
#and the coverage tool - then the various tasks are the result of the
|
7
|
+
#collaboration of those two.
|
8
|
+
#
|
9
|
+
class RSpec < TaskLib
|
10
|
+
def receive_tasklibs(toolkit)
|
11
|
+
@toolkit = toolkit
|
12
|
+
end
|
13
|
+
|
14
|
+
def default_configuration(namespace, toolkit_config)
|
15
|
+
@configuration.task_options = OpenStruct.new(
|
16
|
+
:pattern => nil,
|
17
|
+
:ruby_opts => nil,
|
18
|
+
:rspec_opts => nil,
|
19
|
+
:warning => false,
|
20
|
+
:verbose => true,
|
21
|
+
:fail_on_error => true,
|
22
|
+
:ruby_opts => [],
|
23
|
+
:rspec_opts => %w{--format documentation --out last_run --color --format documentation},
|
24
|
+
:failure_message => "Spec examples failed.",
|
25
|
+
:files_to_run => nil
|
26
|
+
)
|
27
|
+
|
28
|
+
@configuration.namespace = namespace || :rspec
|
29
|
+
@configuration.gemspec_path = toolkit_config.gemspec_path
|
30
|
+
@configuration.qa_finished_path = toolkit_config.qa_finished_path
|
31
|
+
end
|
32
|
+
|
33
|
+
def resolve_configuration
|
34
|
+
@configuration.task_options.rspec_configs = @configuration.task_options.rspec_opts
|
35
|
+
@configuration.task_options.rspec_opts = []
|
36
|
+
@configuration.task_options.rspec_path ||= 'rspec'
|
37
|
+
@configuration.task_options.rspec_path = %x"which #{@configuration.task_options.rspec_path}".chomp
|
38
|
+
@configuration.task_options.pattern ||= './spec{,/*/**}/*_spec.rb'
|
39
|
+
@configuration.task_options.files_to_run ||= "spec"
|
40
|
+
end
|
41
|
+
|
42
|
+
#XXX some point in the future, there needs to be a composible command
|
43
|
+
#object
|
44
|
+
def ruby_command(options)
|
45
|
+
cmd_parts = []
|
46
|
+
cmd_parts << RUBY
|
47
|
+
cmd_parts << options.ruby_opts
|
48
|
+
cmd_parts << "-w" if options.warning?
|
49
|
+
if /^1\.8/ =~ RUBY_VERSION
|
50
|
+
cmd_parts << "-S"
|
51
|
+
end
|
52
|
+
return cmd_parts
|
53
|
+
end
|
54
|
+
|
55
|
+
def runner_command(options)
|
56
|
+
cmd_parts = []
|
57
|
+
cmd_parts << options.rspec_path
|
58
|
+
cmd_parts << options.rspec_opts
|
59
|
+
cmd_parts << options.files_to_run
|
60
|
+
return cmd_parts
|
61
|
+
end
|
62
|
+
|
63
|
+
def full_command(options)
|
64
|
+
cmd_parts = ruby_command(options) + runner_command(options)
|
65
|
+
return cmd_parts.flatten.compact.reject{|part| part.nil? or part.empty?}.join(" ")
|
66
|
+
end
|
67
|
+
|
68
|
+
def custom_options
|
69
|
+
options = @configuration.task_options.dup
|
70
|
+
yield(options)
|
71
|
+
return options
|
72
|
+
end
|
73
|
+
|
74
|
+
def define_spec_task(name)
|
75
|
+
options = if block_given?
|
76
|
+
custom_options{|options| yield(options) if block_given?}
|
77
|
+
else
|
78
|
+
@configuration.task_options
|
79
|
+
end
|
80
|
+
task name do
|
81
|
+
RakeFileUtils.send(:verbose, verbose) do
|
82
|
+
if options.files_to_run.empty?
|
83
|
+
puts "No examples matching #{options.pattern} could be found"
|
84
|
+
else
|
85
|
+
begin
|
86
|
+
cmd = full_command(options)
|
87
|
+
puts cmd if options.verbose
|
88
|
+
success = system(cmd)
|
89
|
+
rescue
|
90
|
+
puts options.failure_message if options.failure_message
|
91
|
+
end
|
92
|
+
raise("ruby #{cmd} failed") if options.fail_on_error unless success
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def define
|
99
|
+
desc "Run failing examples if any exist, otherwise, run the whole suite"
|
100
|
+
task @configuration.namespace => "#{@configuration.namespace}:quick"
|
101
|
+
|
102
|
+
in_namespace do
|
103
|
+
desc "Always run every spec"
|
104
|
+
define_spec_task(:all)
|
105
|
+
|
106
|
+
desc "Generate specifications documentation"
|
107
|
+
define_spec_task(:doc) do |t|
|
108
|
+
t.rspec_opts = %w{-o /dev/null -f d -o doc/Specifications}
|
109
|
+
t.failure_message = "Failed generating specification docs"
|
110
|
+
t.verbose = false
|
111
|
+
end
|
112
|
+
|
113
|
+
desc "Run only failing examples listed in last_run"
|
114
|
+
define_spec_task(:quick) do |t|
|
115
|
+
examples = []
|
116
|
+
begin
|
117
|
+
File.open("last_run", "r") do |fail_list|
|
118
|
+
fail_list.lines.grep(%r{^\s*\d+\)\s*(.*)}) do |line|
|
119
|
+
examples << $1.gsub(/'/){"[']"}
|
120
|
+
end
|
121
|
+
end
|
122
|
+
rescue
|
123
|
+
end
|
124
|
+
unless examples.empty?
|
125
|
+
t.rspec_opts << "--example"
|
126
|
+
t.rspec_opts << "\"#{examples.join("|")}\""
|
127
|
+
end
|
128
|
+
t.failure_message = "Spec examples failed."
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
task :qa => in_namespace(:doc)
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|