vic-buildr 1.3.3 → 1.3.4
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +42 -11
- data/Rakefile +5 -3
- data/_buildr +9 -31
- data/addon/buildr/cobertura.rb +5 -218
- data/addon/buildr/drb.rb +281 -0
- data/addon/buildr/emma.rb +5 -220
- data/addon/buildr/nailgun.rb +94 -686
- data/bin/buildr +0 -9
- data/buildr.gemspec +6 -6
- data/doc/images/favicon.png +0 -0
- data/doc/pages/contributing.textile +6 -4
- data/doc/pages/download.textile +11 -0
- data/doc/pages/extending.textile +2 -2
- data/doc/pages/getting_started.textile +4 -4
- data/doc/pages/index.textile +8 -11
- data/doc/pages/more_stuff.textile +50 -22
- data/doc/pages/packaging.textile +1 -1
- data/doc/pages/projects.textile +2 -2
- data/doc/pages/settings_profiles.textile +2 -2
- data/doc/pages/testing.textile +1 -1
- data/doc/pages/whats_new.textile +12 -0
- data/doc/site.haml +1 -0
- data/lib/buildr.rb +2 -4
- data/lib/buildr/core.rb +2 -0
- data/lib/buildr/core/application.rb +304 -149
- data/lib/buildr/core/checks.rb +3 -131
- data/lib/buildr/core/common.rb +0 -4
- data/lib/buildr/core/compile.rb +1 -7
- data/lib/buildr/core/environment.rb +0 -3
- data/lib/buildr/core/filter.rb +7 -3
- data/lib/buildr/core/generate.rb +50 -52
- data/lib/buildr/core/help.rb +2 -1
- data/lib/buildr/core/osx.rb +49 -0
- data/lib/buildr/core/progressbar.rb +1 -1
- data/lib/buildr/core/project.rb +7 -9
- data/lib/buildr/core/test.rb +4 -4
- data/lib/buildr/core/transports.rb +13 -30
- data/lib/buildr/core/util.rb +8 -3
- data/lib/buildr/groovy/bdd.rb +1 -0
- data/lib/buildr/groovy/compiler.rb +1 -1
- data/lib/buildr/ide/eclipse.rb +30 -20
- data/lib/buildr/ide/idea.rb +3 -2
- data/lib/buildr/ide/idea7x.rb +4 -2
- data/lib/buildr/java/ant.rb +1 -1
- data/lib/buildr/java/bdd.rb +9 -5
- data/lib/buildr/java/cobertura.rb +236 -0
- data/lib/buildr/java/commands.rb +2 -1
- data/lib/buildr/java/emma.rb +238 -0
- data/lib/buildr/java/jtestr_runner.rb.erb +2 -0
- data/lib/buildr/java/packaging.rb +6 -2
- data/lib/buildr/java/pom.rb +0 -4
- data/lib/buildr/java/test_result.rb +45 -15
- data/lib/buildr/java/tests.rb +14 -9
- data/lib/buildr/packaging.rb +5 -2
- data/lib/buildr/packaging/archive.rb +488 -0
- data/lib/buildr/packaging/artifact.rb +36 -7
- data/lib/buildr/packaging/artifact_namespace.rb +2 -2
- data/lib/buildr/packaging/gems.rb +3 -3
- data/lib/buildr/packaging/package.rb +1 -1
- data/lib/buildr/packaging/tar.rb +85 -3
- data/lib/buildr/packaging/version_requirement.rb +172 -0
- data/lib/buildr/packaging/zip.rb +24 -682
- data/lib/buildr/packaging/ziptask.rb +313 -0
- data/lib/buildr/scala/compiler.rb +1 -1
- data/lib/buildr/scala/tests.rb +2 -2
- data/rakelib/apache.rake +58 -8
- data/rakelib/package.rake +4 -1
- data/rakelib/rspec.rake +2 -2
- data/rakelib/rubyforge.rake +6 -3
- data/rakelib/scm.rake +1 -1
- data/rakelib/setup.rake +0 -5
- data/rakelib/stage.rake +4 -1
- data/spec/addon/drb_spec.rb +328 -0
- data/spec/core/application_spec.rb +29 -22
- data/spec/core/build_spec.rb +8 -0
- data/spec/core/checks_spec.rb +293 -311
- data/spec/core/common_spec.rb +8 -2
- data/spec/core/compile_spec.rb +17 -1
- data/spec/core/generate_spec.rb +33 -0
- data/spec/core/project_spec.rb +18 -10
- data/spec/core/test_spec.rb +24 -1
- data/spec/ide/eclipse_spec.rb +96 -28
- data/spec/java/ant.rb +5 -0
- data/spec/java/bdd_spec.rb +4 -4
- data/spec/{addon → java}/cobertura_spec.rb +3 -3
- data/spec/{addon → java}/emma_spec.rb +3 -3
- data/spec/java/java_spec.rb +9 -1
- data/spec/java/packaging_spec.rb +19 -2
- data/spec/{addon → java}/test_coverage_spec.rb +7 -1
- data/spec/java/tests_spec.rb +5 -0
- data/spec/packaging/archive_spec.rb +1 -1
- data/spec/{core → packaging}/artifact_namespace_spec.rb +2 -2
- data/spec/packaging/artifact_spec.rb +46 -5
- data/spec/packaging/packaging_spec.rb +1 -1
- data/spec/sandbox.rb +16 -14
- data/spec/spec_helpers.rb +26 -3
- metadata +20 -11
- data/lib/buildr/core/application_cli.rb +0 -139
data/lib/buildr/core/test.rb
CHANGED
@@ -191,7 +191,7 @@ module Buildr
|
|
191
191
|
@forced_need = false
|
192
192
|
parent_task = Project.parent_task(name)
|
193
193
|
if parent_task.respond_to?(:options)
|
194
|
-
@options = OpenObject.new { |hash, key| parent_task.options[key].clone rescue parent_task.options[key] }
|
194
|
+
@options = OpenObject.new { |hash, key| hash[key] = parent_task.options[key].clone rescue hash[key] = parent_task.options[key] }
|
195
195
|
else
|
196
196
|
@options = OpenObject.new(default_options)
|
197
197
|
end
|
@@ -629,9 +629,9 @@ module Buildr
|
|
629
629
|
# Use this method to return the integration tests task, or enhance it with a block to execute.
|
630
630
|
#
|
631
631
|
# There is one integration tests task you can execute directly, or as a result of running the package
|
632
|
-
# task (or tasks that depend on it, like install and
|
632
|
+
# task (or tasks that depend on it, like install and upload). It contains all the tests marked with
|
633
633
|
# :integration=>true, all other tests are considered unit tests and run by the test task before packaging.
|
634
|
-
# So essentially: build=>test=>packaging=>integration=>install/
|
634
|
+
# So essentially: build=>test=>packaging=>integration=>install/upload.
|
635
635
|
#
|
636
636
|
# You add new tests from projects that define integration tests using the regular test task,
|
637
637
|
# but with the following addition:
|
@@ -658,7 +658,7 @@ module Buildr
|
|
658
658
|
class Options
|
659
659
|
|
660
660
|
# Runs tests after the build when true (default). This forces tests to execute
|
661
|
-
# after the build, including when running build related tasks like install,
|
661
|
+
# after the build, including when running build related tasks like install, upload and release.
|
662
662
|
#
|
663
663
|
# Set to false to not run any tests. Set to :all to run all tests, ignoring failures.
|
664
664
|
#
|
@@ -14,37 +14,20 @@
|
|
14
14
|
# the License.
|
15
15
|
|
16
16
|
|
17
|
-
require '
|
17
|
+
require 'uri'
|
18
18
|
require 'net/http'
|
19
|
-
|
19
|
+
Net.autoload :HTTPS, 'net/https'
|
20
20
|
# PATCH: On Windows, Net::SSH 2.0.2 attempts to load the Pageant DLLs which break on JRuby.
|
21
|
-
$LOADED_FEATURES
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
require 'tempfile'
|
29
|
-
require 'buildr/core/progressbar'
|
30
|
-
|
31
|
-
|
32
|
-
# Monkeypatching: SFTP never defines the mkdir method on its session or the underlying
|
33
|
-
# driver, it just redirect calls through method_missing. Rake, on the other hand, decides
|
34
|
-
# to define mkdir on Object, and so routes our calls to FileUtils.
|
35
|
-
module Net #:nodoc:all
|
36
|
-
class Session
|
37
|
-
def mkdir(path, attrs = {})
|
38
|
-
method_missing :mkdir, path, attrs
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
class SFTP::Protocol::Driver
|
43
|
-
def mkdir(first, path, attrs = {})
|
44
|
-
method_missing :mkdir, first, path, attrs
|
45
|
-
end
|
46
|
-
end
|
21
|
+
$LOADED_FEATURES << 'net/ssh/authentication/pageant.rb' if RUBY_PLATFORM =~ /java/
|
22
|
+
gem 'net-ssh' ; Net.autoload :SSH, 'net/ssh'
|
23
|
+
gem 'net-sftp' ; Net.autoload :SFTP, 'net/sftp'
|
24
|
+
autoload :CGI, 'cgi'
|
25
|
+
module Digest
|
26
|
+
autoload :MD5, 'digest/md5'
|
27
|
+
autoload :SHA1, 'digest/sha1'
|
47
28
|
end
|
29
|
+
require 'stringio'
|
30
|
+
autoload :ProgressBar, 'buildr/core/progressbar'
|
48
31
|
|
49
32
|
|
50
33
|
# Not quite open-uri, but similar. Provides read and write methods for the resource represented by the URI.
|
@@ -173,7 +156,7 @@ module URI
|
|
173
156
|
read({:progress=>verbose}.merge(options || {}).merge(:modified=>modified)) { |chunk| temp.write chunk }
|
174
157
|
end
|
175
158
|
mkpath File.dirname(target)
|
176
|
-
|
159
|
+
FileUtils.mv temp.path, target
|
177
160
|
when File
|
178
161
|
read({:progress=>verbose}.merge(options || {}).merge(:modified=>target.mtime)) { |chunk| target.write chunk }
|
179
162
|
target.flush
|
@@ -566,7 +549,7 @@ module URI
|
|
566
549
|
end
|
567
550
|
real_path.tap do |path|
|
568
551
|
mkpath File.dirname(path)
|
569
|
-
|
552
|
+
FileUtils.mv temp.path, path
|
570
553
|
end
|
571
554
|
end
|
572
555
|
|
data/lib/buildr/core/util.rb
CHANGED
@@ -16,7 +16,12 @@
|
|
16
16
|
|
17
17
|
require 'rbconfig'
|
18
18
|
require 'pathname'
|
19
|
-
|
19
|
+
autoload :Tempfile, 'tempfile'
|
20
|
+
autoload :YAML, 'yaml'
|
21
|
+
autoload :REXML, 'rexml/document'
|
22
|
+
gem 'xml-simple' ; autoload :XmlSimple, 'xmlsimple'
|
23
|
+
gem 'builder' ; autoload :Builder, 'builder' # A different kind of buildr, one we use to create XML.
|
24
|
+
require 'highline/import'
|
20
25
|
|
21
26
|
|
22
27
|
module Buildr
|
@@ -31,7 +36,7 @@ module Buildr
|
|
31
36
|
# In order to determine if we are running on a windows OS,
|
32
37
|
# prefer this function instead of using Gem.win_platform?.
|
33
38
|
#
|
34
|
-
# Gem.win_platform? only checks
|
39
|
+
# Gem.win_platform? only checks these RUBY_PLATFORM global,
|
35
40
|
# that in some cases like when running on JRuby is not
|
36
41
|
# succifient for our purpose:
|
37
42
|
#
|
@@ -286,4 +291,4 @@ class Hash
|
|
286
291
|
}.join("\n")
|
287
292
|
end
|
288
293
|
|
289
|
-
end
|
294
|
+
end
|
data/lib/buildr/groovy/bdd.rb
CHANGED
@@ -19,7 +19,7 @@ module Buildr::Groovy
|
|
19
19
|
# Groovyc compiler:
|
20
20
|
# compile.using(:groovyc)
|
21
21
|
#
|
22
|
-
# You need to require 'buildr/
|
22
|
+
# You need to require 'buildr/groovy/compiler' if you need to use this compiler.
|
23
23
|
#
|
24
24
|
# Used by default if .groovy files are found in the src/main/groovy directory (or src/test/groovy)
|
25
25
|
# and sets the target directory to target/classes (or target/test/classes).
|
data/lib/buildr/ide/eclipse.rb
CHANGED
@@ -25,16 +25,16 @@ module Buildr
|
|
25
25
|
|
26
26
|
first_time do
|
27
27
|
# Global task "eclipse" generates artifacts for all projects.
|
28
|
-
desc
|
29
|
-
Project.local_task
|
28
|
+
desc 'Generate Eclipse artifacts for all projects'
|
29
|
+
Project.local_task 'eclipse'=>'artifacts'
|
30
30
|
end
|
31
31
|
|
32
32
|
before_define do |project|
|
33
|
-
project.recursive_task(
|
33
|
+
project.recursive_task('eclipse')
|
34
34
|
end
|
35
35
|
|
36
36
|
after_define do |project|
|
37
|
-
eclipse = project.task(
|
37
|
+
eclipse = project.task('eclipse')
|
38
38
|
|
39
39
|
# Check if project has scala facet
|
40
40
|
scala = project.compile.language == :scala
|
@@ -42,17 +42,18 @@ module Buildr
|
|
42
42
|
# Only for projects that we support
|
43
43
|
supported_languages = [:java, :scala]
|
44
44
|
supported_packaging = %w(jar war rar mar aar)
|
45
|
-
if (supported_languages.include?
|
45
|
+
if (supported_languages.include?(project.compile.language) ||
|
46
|
+
supported_languages.include?(project.test.compile.language) ||
|
46
47
|
project.packages.detect { |pkg| supported_packaging.include?(pkg.type.to_s) })
|
47
|
-
eclipse.enhance [ file(project.path_to(
|
48
|
+
eclipse.enhance [ file(project.path_to('.classpath')), file(project.path_to('.project')) ]
|
48
49
|
|
49
50
|
# The only thing we need to look for is a change in the Buildfile.
|
50
|
-
file(project.path_to(
|
51
|
+
file(project.path_to('.classpath')=>Buildr.application.buildfile) do |task|
|
51
52
|
info "Writing #{task.name}"
|
52
53
|
|
53
54
|
m2repo = Buildr::Repositories.instance.local
|
54
55
|
|
55
|
-
File.open(task.name,
|
56
|
+
File.open(task.name, 'w') do |file|
|
56
57
|
classpathentry = ClasspathEntryWriter.new project, file
|
57
58
|
classpathentry.write do
|
58
59
|
# Note: Use the test classpath since Eclipse compiles both "main" and "test" classes using the same classpath
|
@@ -82,7 +83,7 @@ module Buildr
|
|
82
83
|
# Classpath elements from other projects
|
83
84
|
classpathentry.src_projects project_libs
|
84
85
|
|
85
|
-
classpathentry.output project.compile.target
|
86
|
+
classpathentry.output project.compile.target if project.compile.target
|
86
87
|
classpathentry.lib libs
|
87
88
|
classpathentry.var m2_libs, 'M2_REPO', m2repo
|
88
89
|
|
@@ -93,9 +94,9 @@ module Buildr
|
|
93
94
|
end
|
94
95
|
|
95
96
|
# The only thing we need to look for is a change in the Buildfile.
|
96
|
-
file(project.path_to(
|
97
|
+
file(project.path_to('.project')=>Buildr.application.buildfile) do |task|
|
97
98
|
info "Writing #{task.name}"
|
98
|
-
File.open(task.name,
|
99
|
+
File.open(task.name, 'w') do |file|
|
99
100
|
xml = Builder::XmlMarkup.new(:target=>file, :indent=>2)
|
100
101
|
xml.projectDescription do
|
101
102
|
xml.name project.id
|
@@ -103,17 +104,17 @@ module Buildr
|
|
103
104
|
xml.buildSpec do
|
104
105
|
if scala
|
105
106
|
xml.buildCommand do
|
106
|
-
xml.name
|
107
|
+
xml.name 'ch.epfl.lamp.sdt.core.scalabuilder'
|
107
108
|
end
|
108
109
|
else
|
109
110
|
xml.buildCommand do
|
110
|
-
xml.name
|
111
|
+
xml.name 'org.eclipse.jdt.core.javabuilder'
|
111
112
|
end
|
112
113
|
end
|
113
114
|
end
|
114
115
|
xml.natures do
|
115
|
-
xml.nature
|
116
|
-
xml.nature
|
116
|
+
xml.nature 'ch.epfl.lamp.sdt.core.scalanature' if scala
|
117
|
+
xml.nature 'org.eclipse.jdt.core.javanature'
|
117
118
|
end
|
118
119
|
end
|
119
120
|
end
|
@@ -149,7 +150,7 @@ module Buildr
|
|
149
150
|
end
|
150
151
|
|
151
152
|
# Write a classpathentry of kind 'src'.
|
152
|
-
#
|
153
|
+
# Accept an array of absolute paths or a task.
|
153
154
|
def src arg
|
154
155
|
if [:sources, :target].all? { |message| arg.respond_to?(message) }
|
155
156
|
src_from_task arg
|
@@ -159,10 +160,10 @@ module Buildr
|
|
159
160
|
end
|
160
161
|
|
161
162
|
# Write a classpathentry of kind 'src' for dependent projects.
|
162
|
-
#
|
163
|
+
# Accept an array of projects.
|
163
164
|
def src_projects project_libs
|
164
165
|
project_libs.map(&:id).sort.uniq.each do |project_id|
|
165
|
-
@xml.classpathentry :kind=>'src', :combineaccessrules=>
|
166
|
+
@xml.classpathentry :kind=>'src', :combineaccessrules=>'false', :path=>"/#{project_id}"
|
166
167
|
end
|
167
168
|
end
|
168
169
|
|
@@ -170,9 +171,18 @@ module Buildr
|
|
170
171
|
@xml.classpathentry :kind=>'output', :path=>relative(target)
|
171
172
|
end
|
172
173
|
|
174
|
+
# Write a classpathentry of kind 'var' (variable) for a library in a local repo.
|
175
|
+
# * +libs+ is an array of library paths.
|
176
|
+
# * +var_name+ is a variable name as defined in Eclipse (e.g., 'M2_REPO').
|
177
|
+
# * +var_value+ is the value of this variable (e.g., '/home/me/.m2').
|
178
|
+
# E.g., <tt>var([lib1, lib2], 'M2_REPO', '/home/me/.m2/repo')</tt>
|
173
179
|
def var libs, var_name, var_value
|
174
|
-
libs.
|
175
|
-
|
180
|
+
libs.each do |lib_path|
|
181
|
+
lib_artifact = file(lib_path)
|
182
|
+
source_path = lib_artifact.sources_artifact.to_s
|
183
|
+
relative_lib_path = lib_path.sub(var_value, var_name)
|
184
|
+
relative_source_path = source_path.sub(var_value, var_name)
|
185
|
+
@xml.classpathentry :kind=>'var', :path=>relative_lib_path, :sourcepath=>relative_source_path
|
176
186
|
end
|
177
187
|
end
|
178
188
|
|
data/lib/buildr/ide/idea.rb
CHANGED
@@ -17,7 +17,6 @@
|
|
17
17
|
require 'buildr/core/project'
|
18
18
|
require 'buildr/packaging'
|
19
19
|
require 'stringio'
|
20
|
-
require 'rexml/document'
|
21
20
|
|
22
21
|
|
23
22
|
module Buildr
|
@@ -130,7 +129,9 @@ module Buildr
|
|
130
129
|
xml.root :url=>"jar://#{path}!/"
|
131
130
|
end
|
132
131
|
xml.JAVADOC
|
133
|
-
xml.SOURCES
|
132
|
+
xml.SOURCES do
|
133
|
+
xml.root :url=>"jar://#{path.sub(/\.jar$/, "-sources.jar")}!/"
|
134
|
+
end
|
134
135
|
end
|
135
136
|
end
|
136
137
|
end
|
data/lib/buildr/ide/idea7x.rb
CHANGED
@@ -17,7 +17,7 @@
|
|
17
17
|
require 'buildr/core/project'
|
18
18
|
require 'buildr/packaging'
|
19
19
|
require 'stringio'
|
20
|
-
|
20
|
+
|
21
21
|
|
22
22
|
module Buildr
|
23
23
|
module Idea7x #:nodoc:
|
@@ -160,7 +160,9 @@ module Buildr
|
|
160
160
|
xml.root :url=> path
|
161
161
|
end
|
162
162
|
xml.JAVADOC
|
163
|
-
xml.SOURCES
|
163
|
+
xml.SOURCES do
|
164
|
+
xml.root :url=>"jar://#{path.sub(/\.jar$/, "-sources.jar")}!/"
|
165
|
+
end
|
164
166
|
end
|
165
167
|
end
|
166
168
|
end
|
data/lib/buildr/java/ant.rb
CHANGED
data/lib/buildr/java/bdd.rb
CHANGED
@@ -13,9 +13,11 @@
|
|
13
13
|
# License for the specific language governing permissions and limitations under
|
14
14
|
# the License.
|
15
15
|
|
16
|
+
|
16
17
|
require 'buildr/java/tests'
|
17
18
|
require 'buildr/java/test_result'
|
18
19
|
|
20
|
+
|
19
21
|
module Buildr
|
20
22
|
|
21
23
|
# Mixin for test frameworks using src/spec/{lang}
|
@@ -46,7 +48,7 @@ module Buildr
|
|
46
48
|
module TestFramework::JRubyBased
|
47
49
|
extend self
|
48
50
|
|
49
|
-
VERSION = '1.1.
|
51
|
+
VERSION = '1.1.3'
|
50
52
|
|
51
53
|
class << self
|
52
54
|
def version
|
@@ -269,8 +271,9 @@ module Buildr
|
|
269
271
|
Buildr::TestFramework::TestResult::Error.guard('<%= runner.file %>') do
|
270
272
|
::Spec::Runner::CommandLine.run($rspec_options)
|
271
273
|
end
|
274
|
+
exit 0 # let buildr figure the result from the yaml file
|
272
275
|
}
|
273
|
-
Filter::Mapper.new(:erb, binding).
|
276
|
+
Filter::Mapper.new(:erb, binding).transform(runner_erb)
|
274
277
|
end
|
275
278
|
|
276
279
|
end
|
@@ -365,14 +368,15 @@ module Buildr
|
|
365
368
|
|
366
369
|
def runner_config
|
367
370
|
runner = super
|
368
|
-
|
369
|
-
|
371
|
+
# JtestR 0.3.1 comes with rspec 1.1.4 (and any other jtestr dependency) included,
|
372
|
+
# so the rspec version used depends on the jtestr jar.
|
373
|
+
runner.requires.unshift 'jtestr'
|
370
374
|
runner
|
371
375
|
end
|
372
376
|
|
373
377
|
def runner_content(binding)
|
374
378
|
runner_erb = File.join(File.dirname(__FILE__), 'jtestr_runner.rb.erb')
|
375
|
-
Filter::Mapper.new(:erb, binding).
|
379
|
+
Filter::Mapper.new(:erb, binding).transform(File.read(runner_erb), runner_erb)
|
376
380
|
end
|
377
381
|
|
378
382
|
end
|
@@ -0,0 +1,236 @@
|
|
1
|
+
# Licensed to the Apache Software Foundation (ASF) under one or more
|
2
|
+
# contributor license agreements. See the NOTICE file distributed with this
|
3
|
+
# work for additional information regarding copyright ownership. The ASF
|
4
|
+
# licenses this file to you under the Apache License, Version 2.0 (the
|
5
|
+
# "License"); you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
12
|
+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
13
|
+
# License for the specific language governing permissions and limitations under
|
14
|
+
# the License.
|
15
|
+
|
16
|
+
|
17
|
+
require 'buildr/java'
|
18
|
+
|
19
|
+
|
20
|
+
module Buildr
|
21
|
+
|
22
|
+
# Provides the <code>cobertura:html</code> and <code>cobertura:xml</code> tasks.
|
23
|
+
# Require explicitly using <code>require "buildr/cobertura"</code>.
|
24
|
+
#
|
25
|
+
# You can generate cobertura reports for a single project
|
26
|
+
# using the project name as prefix:
|
27
|
+
#
|
28
|
+
# project_name:cobertura:html
|
29
|
+
#
|
30
|
+
# You can also specify which classes to include/exclude from instrumentation by
|
31
|
+
# passing a class name regexp to the <code>cobertura.include</code> or
|
32
|
+
# <code>cobertura.exclude</code> methods.
|
33
|
+
#
|
34
|
+
# define 'someModule' do
|
35
|
+
# cobertura.include 'some.package.*'
|
36
|
+
# cobertura.include /some.(foo|bar).*/
|
37
|
+
# cobertura.exclude 'some.foo.util.SimpleUtil'
|
38
|
+
# cobertura.exclude /*.Const(ants)?/i
|
39
|
+
# end
|
40
|
+
module Cobertura
|
41
|
+
|
42
|
+
class << self
|
43
|
+
|
44
|
+
REQUIRES = ["net.sourceforge.cobertura:cobertura:jar:1.9", "log4j:log4j:jar:1.2.9",
|
45
|
+
"asm:asm:jar:2.2.1", "asm:asm-tree:jar:2.2.1", "oro:oro:jar:2.0.8"] unless const_defined?('REQUIRES')
|
46
|
+
|
47
|
+
def requires()
|
48
|
+
@requires ||= Buildr.artifacts(REQUIRES).each(&:invoke).map(&:to_s)
|
49
|
+
end
|
50
|
+
|
51
|
+
def report_to(file = nil)
|
52
|
+
File.expand_path(File.join(*["reports/cobertura", file.to_s].compact))
|
53
|
+
end
|
54
|
+
|
55
|
+
def data_file()
|
56
|
+
File.expand_path("reports/cobertura.ser")
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
class CoberturaConfig # :nodoc:
|
62
|
+
|
63
|
+
def initialize(project)
|
64
|
+
@project = project
|
65
|
+
end
|
66
|
+
|
67
|
+
attr_reader :project
|
68
|
+
private :project
|
69
|
+
|
70
|
+
attr_writer :data_file, :instrumented_dir, :report_dir
|
71
|
+
|
72
|
+
def data_file
|
73
|
+
@data_file ||= project.path_to(:reports, 'cobertura.ser')
|
74
|
+
end
|
75
|
+
|
76
|
+
def instrumented_dir
|
77
|
+
@instrumented_dir ||= project.path_to(:target, :instrumented, :classes)
|
78
|
+
end
|
79
|
+
|
80
|
+
def report_dir
|
81
|
+
@report_dir ||= project.path_to(:reports, :cobertura)
|
82
|
+
end
|
83
|
+
|
84
|
+
def report_to(file = nil)
|
85
|
+
File.expand_path(File.join(*[report_dir, file.to_s].compact))
|
86
|
+
end
|
87
|
+
|
88
|
+
# :call-seq:
|
89
|
+
# project.cobertura.include(*classPatterns)
|
90
|
+
#
|
91
|
+
def include(*classPatterns)
|
92
|
+
includes.push(*classPatterns.map { |p| String === p ? Regexp.new(p) : p })
|
93
|
+
self
|
94
|
+
end
|
95
|
+
|
96
|
+
def includes
|
97
|
+
@includeClasses ||= []
|
98
|
+
end
|
99
|
+
|
100
|
+
# :call-seq:
|
101
|
+
# project.cobertura.exclude(*classPatterns)
|
102
|
+
#
|
103
|
+
def exclude(*classPatterns)
|
104
|
+
excludes.push(*classPatterns.map { |p| String === p ? Regexp.new(p) : p })
|
105
|
+
self
|
106
|
+
end
|
107
|
+
|
108
|
+
def excludes
|
109
|
+
@excludeClasses ||= []
|
110
|
+
end
|
111
|
+
|
112
|
+
def sources
|
113
|
+
project.compile.sources
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
module CoberturaExtension # :nodoc:
|
118
|
+
include Buildr::Extension
|
119
|
+
|
120
|
+
def cobertura
|
121
|
+
@cobertura_config ||= CoberturaConfig.new(self)
|
122
|
+
end
|
123
|
+
|
124
|
+
after_define do |project|
|
125
|
+
cobertura = project.cobertura
|
126
|
+
|
127
|
+
namespace 'cobertura' do
|
128
|
+
unless project.compile.target.nil?
|
129
|
+
# Instrumented bytecode goes in a different directory. This task creates before running the test
|
130
|
+
# cases and monitors for changes in the generate bytecode.
|
131
|
+
instrumented = project.file(cobertura.instrumented_dir => project.compile.target) do |task|
|
132
|
+
mkdir_p task.to_s, :verbose => false
|
133
|
+
unless project.compile.sources.empty?
|
134
|
+
info "Instrumenting classes with cobertura data file #{cobertura.data_file}"
|
135
|
+
Buildr.ant "cobertura" do |ant|
|
136
|
+
ant.taskdef :classpath=>Cobertura.requires.join(File::PATH_SEPARATOR), :resource=>"tasks.properties"
|
137
|
+
ant.send "cobertura-instrument", :todir=>task.to_s, :datafile=>cobertura.data_file do
|
138
|
+
includes, excludes = cobertura.includes, cobertura.excludes
|
139
|
+
|
140
|
+
classes_dir = project.compile.target.to_s
|
141
|
+
if includes.empty? && excludes.empty?
|
142
|
+
ant.fileset :dir => classes_dir do
|
143
|
+
ant.include :name => "**/*.class"
|
144
|
+
end
|
145
|
+
else
|
146
|
+
includes = [//] if includes.empty?
|
147
|
+
Dir.glob(File.join(classes_dir, "**/*.class")) do |cls|
|
148
|
+
cls_name = cls.gsub(/#{classes_dir}\/?|\.class$/, '').gsub('/', '.')
|
149
|
+
if includes.any? { |p| p === cls_name } && !excludes.any? { |p| p === cls_name }
|
150
|
+
ant.fileset :file => cls
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
157
|
+
touch task.to_s, :verbose=>false
|
158
|
+
end
|
159
|
+
|
160
|
+
task 'instrument' => instrumented
|
161
|
+
|
162
|
+
# We now have two target directories with bytecode. It would make sense to remove compile.target
|
163
|
+
# and add instrumented instead, but apparently Cobertura only creates some of the classes, so
|
164
|
+
# we need both directories and instrumented must come first.
|
165
|
+
project.test.dependencies.unshift cobertura.instrumented_dir
|
166
|
+
project.test.with Cobertura.requires
|
167
|
+
project.test.options[:properties]["net.sourceforge.cobertura.datafile"] = cobertura.data_file
|
168
|
+
|
169
|
+
[:xml, :html].each do |format|
|
170
|
+
task format => ['instrument', 'test'] do
|
171
|
+
info "Creating test coverage reports in #{cobertura.report_to(format)}"
|
172
|
+
Buildr.ant "cobertura" do |ant|
|
173
|
+
ant.taskdef :classpath=>Cobertura.requires.join(File::PATH_SEPARATOR), :resource=>"tasks.properties"
|
174
|
+
ant.send "cobertura-report", :format=>format,
|
175
|
+
:destdir=>cobertura.report_to(format), :datafile=>cobertura.data_file do
|
176
|
+
cobertura.sources.flatten.each do |src|
|
177
|
+
ant.fileset(:dir=>src.to_s) if File.exist?(src.to_s)
|
178
|
+
end
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
end
|
186
|
+
|
187
|
+
project.clean do
|
188
|
+
rm_rf [cobertura.report_to, cobertura.data_file, cobertura.instrumented_dir], :verbose=>false
|
189
|
+
end
|
190
|
+
|
191
|
+
end
|
192
|
+
|
193
|
+
end
|
194
|
+
|
195
|
+
class Buildr::Project
|
196
|
+
include CoberturaExtension
|
197
|
+
end
|
198
|
+
|
199
|
+
namespace "cobertura" do
|
200
|
+
|
201
|
+
task "instrument" do
|
202
|
+
Buildr.projects.each do |project|
|
203
|
+
project.cobertura.data_file = data_file
|
204
|
+
project.test.options[:properties]["net.sourceforge.cobertura.datafile"] = data_file
|
205
|
+
instrument_task ="#{project.name}:cobertura:instrument"
|
206
|
+
task(instrument_task).invoke if Rake::Task.task_defined?(instrument_task)
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
[:xml, :html].each do |format|
|
211
|
+
report_target = report_to(format)
|
212
|
+
desc "Run the test cases and produce code coverage reports in #{report_target}"
|
213
|
+
task format => ["instrument", "test"] do
|
214
|
+
info "Creating test coverage reports in #{report_target}"
|
215
|
+
Buildr.ant "cobertura" do |ant|
|
216
|
+
ant.taskdef :classpath=>requires.join(File::PATH_SEPARATOR), :resource=>"tasks.properties"
|
217
|
+
ant.send "cobertura-report", :destdir=>report_target, :format=>format, :datafile=>data_file do
|
218
|
+
Buildr.projects.map(&:cobertura).map(&:sources).flatten.each do |src|
|
219
|
+
ant.fileset :dir=>src.to_s if File.exist?(src.to_s)
|
220
|
+
end
|
221
|
+
end
|
222
|
+
end
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
226
|
+
task "clean" do
|
227
|
+
rm_rf [report_to, data_file], :verbose=>false
|
228
|
+
end
|
229
|
+
end
|
230
|
+
|
231
|
+
task "clean" do
|
232
|
+
task("cobertura:clean").invoke if Dir.pwd == Rake.application.original_dir
|
233
|
+
end
|
234
|
+
|
235
|
+
end
|
236
|
+
end
|