buildr 1.3.3-java → 1.3.4-java

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. data/CHANGELOG +76 -0
  2. data/NOTICE +1 -1
  3. data/README.rdoc +9 -21
  4. data/Rakefile +17 -34
  5. data/_buildr +3 -12
  6. data/{doc/print.toc.yaml → _jbuildr} +14 -14
  7. data/addon/buildr/cobertura.rb +5 -219
  8. data/addon/buildr/drb.rb +281 -0
  9. data/addon/buildr/emma.rb +5 -221
  10. data/addon/buildr/nailgun.rb +93 -689
  11. data/bin/buildr +0 -9
  12. data/buildr.buildfile +4 -4
  13. data/buildr.gemspec +27 -21
  14. data/doc/_layouts/default.html +82 -0
  15. data/doc/_layouts/preface.html +22 -0
  16. data/doc/{pages/artifacts.textile → artifacts.textile} +82 -42
  17. data/doc/{pages/building.textile → building.textile} +89 -47
  18. data/doc/{pages/contributing.textile → contributing.textile} +53 -45
  19. data/doc/css/default.css +6 -5
  20. data/doc/css/print.css +17 -24
  21. data/doc/css/syntax.css +7 -36
  22. data/doc/download.textile +68 -0
  23. data/doc/{pages/extending.textile → extending.textile} +45 -24
  24. data/doc/{pages/getting_started.textile → getting_started.textile} +158 -88
  25. data/doc/images/asf-logo.gif +0 -0
  26. data/doc/images/note.png +0 -0
  27. data/doc/index.textile +47 -0
  28. data/doc/{pages/languages.textile → languages.textile} +108 -54
  29. data/doc/mailing_lists.textile +25 -0
  30. data/doc/{pages/more_stuff.textile → more_stuff.textile} +152 -73
  31. data/doc/{pages/packaging.textile → packaging.textile} +181 -96
  32. data/doc/preface.textile +28 -0
  33. data/doc/{pages/projects.textile → projects.textile} +55 -40
  34. data/doc/scripts/buildr-git.rb +364 -264
  35. data/doc/scripts/gitflow.rb +296 -0
  36. data/doc/scripts/install-jruby.sh +2 -2
  37. data/doc/scripts/install-linux.sh +6 -6
  38. data/doc/scripts/install-osx.sh +2 -2
  39. data/doc/{pages/settings_profiles.textile → settings_profiles.textile} +83 -45
  40. data/doc/{pages/testing.textile → testing.textile} +77 -41
  41. data/lib/buildr.rb +5 -5
  42. data/lib/buildr/core.rb +2 -0
  43. data/lib/buildr/core/application.rb +321 -151
  44. data/lib/buildr/core/build.rb +298 -167
  45. data/lib/buildr/core/checks.rb +4 -132
  46. data/lib/buildr/core/common.rb +1 -5
  47. data/lib/buildr/core/compile.rb +3 -9
  48. data/lib/buildr/core/environment.rb +12 -3
  49. data/lib/buildr/core/filter.rb +20 -18
  50. data/lib/buildr/core/generate.rb +36 -36
  51. data/lib/buildr/core/help.rb +2 -1
  52. data/lib/buildr/core/osx.rb +46 -0
  53. data/lib/buildr/core/progressbar.rb +1 -1
  54. data/lib/buildr/core/project.rb +7 -34
  55. data/lib/buildr/core/test.rb +12 -6
  56. data/lib/buildr/core/transports.rb +13 -11
  57. data/lib/buildr/core/util.rb +14 -23
  58. data/lib/buildr/groovy/bdd.rb +3 -2
  59. data/lib/buildr/groovy/compiler.rb +1 -1
  60. data/lib/buildr/ide/eclipse.rb +31 -21
  61. data/lib/buildr/ide/idea.rb +3 -2
  62. data/lib/buildr/ide/idea7x.rb +6 -4
  63. data/lib/buildr/java/ant.rb +3 -1
  64. data/lib/buildr/java/bdd.rb +9 -7
  65. data/lib/buildr/java/cobertura.rb +243 -0
  66. data/lib/buildr/java/compiler.rb +5 -4
  67. data/lib/buildr/java/emma.rb +244 -0
  68. data/lib/buildr/java/packaging.rb +11 -8
  69. data/lib/buildr/java/pom.rb +0 -4
  70. data/lib/buildr/java/rjb.rb +1 -1
  71. data/lib/buildr/java/test_result.rb +5 -7
  72. data/lib/buildr/java/tests.rb +17 -11
  73. data/lib/buildr/packaging.rb +5 -2
  74. data/lib/buildr/packaging/archive.rb +488 -0
  75. data/lib/buildr/packaging/artifact.rb +48 -29
  76. data/lib/buildr/packaging/artifact_namespace.rb +6 -6
  77. data/lib/buildr/packaging/gems.rb +4 -4
  78. data/lib/buildr/packaging/package.rb +3 -2
  79. data/lib/buildr/packaging/tar.rb +85 -3
  80. data/lib/buildr/packaging/version_requirement.rb +172 -0
  81. data/lib/buildr/packaging/zip.rb +24 -682
  82. data/lib/buildr/packaging/ziptask.rb +313 -0
  83. data/lib/buildr/scala.rb +5 -0
  84. data/lib/buildr/scala/bdd.rb +100 -0
  85. data/lib/buildr/scala/compiler.rb +45 -4
  86. data/lib/buildr/scala/tests.rb +12 -59
  87. data/rakelib/checks.rake +57 -0
  88. data/rakelib/doc.rake +58 -68
  89. data/rakelib/jekylltask.rb +110 -0
  90. data/rakelib/package.rake +35 -37
  91. data/rakelib/release.rake +119 -35
  92. data/rakelib/rspec.rake +29 -39
  93. data/rakelib/setup.rake +21 -59
  94. data/rakelib/stage.rake +184 -26
  95. data/spec/addon/drb_spec.rb +328 -0
  96. data/spec/core/application_spec.rb +32 -25
  97. data/spec/core/build_spec.rb +336 -126
  98. data/spec/core/checks_spec.rb +292 -310
  99. data/spec/core/common_spec.rb +8 -2
  100. data/spec/core/compile_spec.rb +17 -1
  101. data/spec/core/generate_spec.rb +3 -3
  102. data/spec/core/project_spec.rb +18 -10
  103. data/spec/core/test_spec.rb +8 -1
  104. data/spec/core/transport_spec.rb +40 -3
  105. data/spec/core/util_spec.rb +67 -0
  106. data/spec/ide/eclipse_spec.rb +96 -28
  107. data/spec/ide/idea7x_spec.rb +84 -0
  108. data/spec/java/ant.rb +5 -0
  109. data/spec/java/bdd_spec.rb +12 -3
  110. data/spec/{addon → java}/cobertura_spec.rb +6 -6
  111. data/spec/{addon → java}/emma_spec.rb +5 -6
  112. data/spec/java/java_spec.rb +12 -2
  113. data/spec/java/packaging_spec.rb +31 -2
  114. data/spec/{addon → java}/test_coverage_spec.rb +3 -3
  115. data/spec/java/tests_spec.rb +5 -0
  116. data/spec/packaging/archive_spec.rb +11 -1
  117. data/spec/{core → packaging}/artifact_namespace_spec.rb +10 -2
  118. data/spec/packaging/artifact_spec.rb +44 -3
  119. data/spec/packaging/packaging_spec.rb +1 -1
  120. data/spec/sandbox.rb +17 -14
  121. data/spec/scala/bdd_spec.rb +150 -0
  122. data/spec/scala/compiler_spec.rb +27 -0
  123. data/spec/scala/scala.rb +38 -0
  124. data/spec/scala/tests_spec.rb +78 -33
  125. data/spec/spec_helpers.rb +29 -5
  126. data/spec/version_requirement_spec.rb +6 -0
  127. metadata +176 -172
  128. data/DISCLAIMER +0 -7
  129. data/doc/images/apache-incubator-logo.png +0 -0
  130. data/doc/pages/download.textile +0 -51
  131. data/doc/pages/index.textile +0 -42
  132. data/doc/pages/mailing_lists.textile +0 -17
  133. data/doc/pages/recipes.textile +0 -103
  134. data/doc/pages/troubleshooting.textile +0 -103
  135. data/doc/pages/whats_new.textile +0 -323
  136. data/doc/print.haml +0 -51
  137. data/doc/site.haml +0 -56
  138. data/doc/site.toc.yaml +0 -47
  139. data/etc/git-svn-authors +0 -16
  140. data/lib/buildr/core/application_cli.rb +0 -139
  141. data/rakelib/apache.rake +0 -191
  142. data/rakelib/changelog.rake +0 -57
  143. data/rakelib/rubyforge.rake +0 -53
  144. data/rakelib/scm.rake +0 -49
@@ -14,7 +14,9 @@
14
14
  # the License.
15
15
 
16
16
 
17
- require 'antwrap'
17
+ gem 'Antwrap'
18
+ autoload :Antwrap, 'antwrap'
19
+ autoload :Logger, 'logger'
18
20
  require 'buildr/core/project'
19
21
  require 'buildr/core/help'
20
22
 
@@ -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.3'
51
+ VERSION = '1.1.6'
50
52
 
51
53
  class << self
52
54
  def version
@@ -83,15 +85,15 @@ module Buildr
83
85
 
84
86
  spec_dir = task.project.path_to(:source, :spec, :ruby)
85
87
  report_dir = task.report_to.to_s
86
- FileUtils.rm_rf report_dir
87
- FileUtils.mkdir_p report_dir
88
+ rm_rf report_dir
89
+ mkdir_p report_dir
88
90
  ENV['CI_REPORTS'] = report_dir
89
91
 
90
92
  runner = runner_config
91
93
  runner.content = runner_content(binding)
92
94
 
93
95
  Buildr.write(runner.file, runner.content)
94
- FileUtils.rm_f runner.result
96
+ rm_f runner.result
95
97
 
96
98
  if RUBY_PLATFORM[/java/] && !options.fork
97
99
  runtime = new_runtime
@@ -139,7 +141,7 @@ module Buildr
139
141
  fail msg unless jruby_installed?
140
142
  end
141
143
  end
142
-
144
+
143
145
  def jruby(*args)
144
146
  java_args = ['org.jruby.Main', *args]
145
147
  java_args << {} unless Hash === args.last
@@ -175,13 +177,13 @@ module Buildr
175
177
  end
176
178
  require 'rubygems'
177
179
  begin
178
- Kernel.gem name, version
180
+ Kernel.send :gem, name, version
179
181
  rescue LoadError, Gem::LoadError => e
180
182
  require 'rubygems/gem_runner'
181
183
  Gem.manage_gems
182
184
  args = ['install', name, '--version', version] + args
183
185
  Gem::GemRunner.new.run(args)
184
- Kernel.gem name, version
186
+ Kernel.send :gem, name, version
185
187
  end
186
188
  end
187
189
  }
@@ -0,0 +1,243 @@
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
+ VERSION = '1.9'
43
+
44
+ class << self
45
+
46
+ def version
47
+ Buildr.settings.build['cobertura'] || VERSION
48
+ end
49
+
50
+ def dependencies
51
+ @dependencies ||= [ "net.sourceforge.cobertura:cobertura:jar:#{version}", "log4j:log4j:jar:1.2.9",
52
+ "asm:asm:jar:2.2.1", "asm:asm-tree:jar:2.2.1", "oro:oro:jar:2.0.8"]
53
+ end
54
+
55
+ def report_to(file = nil)
56
+ File.expand_path(File.join(*["reports/cobertura", file.to_s].compact))
57
+ end
58
+
59
+ def data_file()
60
+ File.expand_path("reports/cobertura.ser")
61
+ end
62
+
63
+ end
64
+
65
+ class CoberturaConfig # :nodoc:
66
+
67
+ def initialize(project)
68
+ @project = project
69
+ end
70
+
71
+ attr_reader :project
72
+ private :project
73
+
74
+ attr_writer :data_file, :instrumented_dir, :report_dir
75
+
76
+ def data_file
77
+ @data_file ||= project.path_to(:reports, 'cobertura.ser')
78
+ end
79
+
80
+ def instrumented_dir
81
+ @instrumented_dir ||= project.path_to(:target, :instrumented, :classes)
82
+ end
83
+
84
+ def report_dir
85
+ @report_dir ||= project.path_to(:reports, :cobertura)
86
+ end
87
+
88
+ def report_to(file = nil)
89
+ File.expand_path(File.join(*[report_dir, file.to_s].compact))
90
+ end
91
+
92
+ # :call-seq:
93
+ # project.cobertura.include(*classPatterns)
94
+ #
95
+ def include(*classPatterns)
96
+ includes.push(*classPatterns.map { |p| String === p ? Regexp.new(p) : p })
97
+ self
98
+ end
99
+
100
+ def includes
101
+ @includeClasses ||= []
102
+ end
103
+
104
+ # :call-seq:
105
+ # project.cobertura.exclude(*classPatterns)
106
+ #
107
+ def exclude(*classPatterns)
108
+ excludes.push(*classPatterns.map { |p| String === p ? Regexp.new(p) : p })
109
+ self
110
+ end
111
+
112
+ def excludes
113
+ @excludeClasses ||= []
114
+ end
115
+
116
+ def sources
117
+ project.compile.sources
118
+ end
119
+ end
120
+
121
+ module CoberturaExtension # :nodoc:
122
+ include Buildr::Extension
123
+
124
+ def cobertura
125
+ @cobertura_config ||= CoberturaConfig.new(self)
126
+ end
127
+
128
+ after_define do |project|
129
+ cobertura = project.cobertura
130
+
131
+ namespace 'cobertura' do
132
+ unless project.compile.target.nil?
133
+ # Instrumented bytecode goes in a different directory. This task creates before running the test
134
+ # cases and monitors for changes in the generate bytecode.
135
+ instrumented = project.file(cobertura.instrumented_dir => project.compile.target) do |task|
136
+ mkdir_p task.to_s
137
+ unless project.compile.sources.empty?
138
+ info "Instrumenting classes with cobertura data file #{cobertura.data_file}"
139
+ Buildr.ant "cobertura" do |ant|
140
+ ant.taskdef :resource=>"tasks.properties",
141
+ :classpath=>Buildr.artifacts(Cobertura.dependencies).each(&:invoke).map(&:to_s).join(File::PATH_SEPARATOR)
142
+ ant.send "cobertura-instrument", :todir=>task.to_s, :datafile=>cobertura.data_file do
143
+ includes, excludes = cobertura.includes, cobertura.excludes
144
+
145
+ classes_dir = project.compile.target.to_s
146
+ if includes.empty? && excludes.empty?
147
+ ant.fileset :dir => classes_dir do
148
+ ant.include :name => "**/*.class"
149
+ end
150
+ else
151
+ includes = [//] if includes.empty?
152
+ Dir.glob(File.join(classes_dir, "**/*.class")) do |cls|
153
+ cls_name = cls.gsub(/#{classes_dir}\/?|\.class$/, '').gsub('/', '.')
154
+ if includes.any? { |p| p === cls_name } && !excludes.any? { |p| p === cls_name }
155
+ ant.fileset :file => cls
156
+ end
157
+ end
158
+ end
159
+ end
160
+ end
161
+ end
162
+ touch task.to_s
163
+ end
164
+
165
+ task 'instrument' => instrumented
166
+
167
+ # We now have two target directories with bytecode. It would make sense to remove compile.target
168
+ # and add instrumented instead, but apparently Cobertura only creates some of the classes, so
169
+ # we need both directories and instrumented must come first.
170
+ project.test.dependencies.unshift cobertura.instrumented_dir
171
+ project.test.with Cobertura.dependencies
172
+ project.test.options[:properties]["net.sourceforge.cobertura.datafile"] = cobertura.data_file
173
+
174
+ [:xml, :html].each do |format|
175
+ task format => ['instrument', 'test'] do
176
+ info "Creating test coverage reports in #{cobertura.report_to(format)}"
177
+ Buildr.ant "cobertura" do |ant|
178
+ ant.taskdef :resource=>"tasks.properties",
179
+ :classpath=>Buildr.artifacts(Cobertura.dependencies).each(&:invoke).map(&:to_s).join(File::PATH_SEPARATOR)
180
+ ant.send "cobertura-report", :format=>format,
181
+ :destdir=>cobertura.report_to(format), :datafile=>cobertura.data_file do
182
+ cobertura.sources.flatten.each do |src|
183
+ ant.fileset(:dir=>src.to_s) if File.exist?(src.to_s)
184
+ end
185
+ end
186
+ end
187
+ end
188
+ end
189
+ end
190
+
191
+ end
192
+
193
+ project.clean do
194
+ rm_rf [cobertura.report_to, cobertura.data_file, cobertura.instrumented_dir]
195
+ end
196
+
197
+ end
198
+
199
+ end
200
+
201
+ class Buildr::Project
202
+ include CoberturaExtension
203
+ end
204
+
205
+ namespace "cobertura" do
206
+
207
+ task "instrument" do
208
+ Buildr.projects.each do |project|
209
+ project.cobertura.data_file = data_file
210
+ project.test.options[:properties]["net.sourceforge.cobertura.datafile"] = data_file
211
+ instrument_task ="#{project.name}:cobertura:instrument"
212
+ task(instrument_task).invoke if Rake::Task.task_defined?(instrument_task)
213
+ end
214
+ end
215
+
216
+ [:xml, :html].each do |format|
217
+ report_target = report_to(format)
218
+ desc "Run the test cases and produce code coverage reports in #{report_target}"
219
+ task format => ["instrument", "test"] do
220
+ info "Creating test coverage reports in #{report_target}"
221
+ Buildr.ant "cobertura" do |ant|
222
+ ant.taskdef :resource=>"tasks.properties",
223
+ :classpath=>Buildr.artifacts(Cobertura.dependencies).each(&:invoke).map(&:to_s).join(File::PATH_SEPARATOR)
224
+ ant.send "cobertura-report", :destdir=>report_target, :format=>format, :datafile=>data_file do
225
+ Buildr.projects.map(&:cobertura).map(&:sources).flatten.each do |src|
226
+ ant.fileset :dir=>src.to_s if File.exist?(src.to_s)
227
+ end
228
+ end
229
+ end
230
+ end
231
+ end
232
+
233
+ task "clean" do
234
+ rm_rf [report_to, data_file]
235
+ end
236
+ end
237
+
238
+ task "clean" do
239
+ task("cobertura:clean").invoke if Dir.pwd == Rake.application.original_dir
240
+ end
241
+
242
+ end
243
+ end
@@ -31,12 +31,13 @@ module Buildr
31
31
  # Accepts the following options:
32
32
  # * :warnings -- Issue warnings when compiling. True when running in verbose mode.
33
33
  # * :debug -- Generates bytecode with debugging information. Set from the debug
34
- # environment variable/global option.
34
+ # environment variable/global option.
35
35
  # * :deprecation -- If true, shows deprecation messages. False by default.
36
36
  # * :source -- Source code compatibility.
37
37
  # * :target -- Bytecode compatibility.
38
38
  # * :lint -- Lint option is one of true, false (default), name (e.g. 'cast') or array.
39
- # * :other -- Array of options passed to the compiler (e.g. '-implicit:none')
39
+ # * :other -- Array of options passed to the compiler
40
+ # (e.g. ['-implicit:none', '-encoding', 'iso-8859-1'])
40
41
  class Javac < Base
41
42
 
42
43
  OPTIONS = [:warnings, :debug, :deprecation, :source, :target, :lint, :other]
@@ -116,9 +117,9 @@ module Buildr
116
117
  @sourcepath = []
117
118
  @files = FileList[]
118
119
  enhance do |task|
119
- rm_rf target.to_s, :verbose=>false
120
+ rm_rf target.to_s
120
121
  generate source_files, File.expand_path(target.to_s), options.merge(:classpath=>classpath, :sourcepath=>sourcepath)
121
- touch target.to_s, :verbose=>false
122
+ touch target.to_s
122
123
  end
123
124
  end
124
125
 
@@ -0,0 +1,244 @@
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>emma:html</code> and <code>emma:xml</code> tasks.
23
+ # Require explicitly using <code>require "buildr/emma"</code>.
24
+ #
25
+ # You can generate emma reports for a single project
26
+ # using the project name as prefix:
27
+ #
28
+ # project_name:emma:html
29
+ #
30
+ # You can also specify which classes to include/exclude from instrumentation by
31
+ # passing a class name regexp to the <code>emma.include</code> or
32
+ # <code>emma.exclude</code> methods.
33
+ #
34
+ # define 'someModule' do
35
+ # emma.include 'some.package.*'
36
+ # emma.exclude 'some.foo.util.SimpleUtil'
37
+ # end
38
+ module Emma
39
+
40
+ VERSION = '2.0.5312'
41
+
42
+ class << self
43
+
44
+ def version
45
+ Buildr.settings.build['emma'] || VERSION
46
+ end
47
+
48
+ def dependencies
49
+ @dependencies ||= ["emma:emma_ant:jar:#{version}", "emma:emma:jar:#{version}"]
50
+ end
51
+
52
+ def report_to format=nil
53
+ File.expand_path('reports/emma')
54
+ end
55
+
56
+ def data_file()
57
+ File.join(report_to, 'coverage.es')
58
+ end
59
+
60
+ def ant
61
+
62
+ Buildr.ant 'emma' do |ant|
63
+ ant.taskdef :resource=>'emma_ant.properties',
64
+ :classpath=>Buildr.artifacts(dependencies).each(&:invoke).map(&:to_s).join(File::PATH_SEPARATOR)
65
+ ant.emma :verbosity=>(Buildr.application.options.trace ? 'verbose' : 'warning') do
66
+ yield ant
67
+ end
68
+ end
69
+ end
70
+ end
71
+
72
+ class EmmaConfig # :nodoc:
73
+
74
+ def initialize(project)
75
+ @project = project
76
+ end
77
+
78
+ attr_reader :project
79
+ private :project
80
+
81
+ attr_writer :metadata_file, :coverage_file, :instrumented_dir, :report_dir
82
+
83
+ def coverage_file
84
+ @coverage_file ||= File.join(report_dir, 'coverage.ec')
85
+ end
86
+
87
+ def metadata_file
88
+ @metadata_file ||= File.join(report_dir, 'coverage.em')
89
+ end
90
+
91
+ def instrumented_dir
92
+ @instrumented_dir ||= project.path_to(:target, :instrumented, :classes)
93
+ end
94
+
95
+ def report_dir
96
+ @report_dir ||= project.path_to(:reports, :emma)
97
+ end
98
+
99
+ def report_to format
100
+ report_dir
101
+ end
102
+
103
+ # :call-seq:
104
+ # project.emma.include(*classPatterns)
105
+ #
106
+ def include(*classPatterns)
107
+ includes.push(*classPatterns)
108
+ self
109
+ end
110
+
111
+ def includes
112
+ @includeClasses ||= []
113
+ end
114
+
115
+ # :call-seq:
116
+ # project.emma.exclude(*classPatterns)
117
+ #
118
+ def exclude(*classPatterns)
119
+ excludes.push(*classPatterns)
120
+ self
121
+ end
122
+
123
+ def excludes
124
+ @excludeClasses ||= []
125
+ end
126
+
127
+ def sources
128
+ project.compile.sources
129
+ end
130
+ end
131
+
132
+ module EmmaExtension # :nodoc:
133
+ include Buildr::Extension
134
+
135
+ def emma
136
+ @emma_config ||= EmmaConfig.new(self)
137
+ end
138
+
139
+ after_define do |project|
140
+ emma = project.emma
141
+
142
+ namespace 'emma' do
143
+ unless project.compile.target.nil?
144
+ # Instrumented bytecode goes in a different directory. This task creates before running the test
145
+ # cases and monitors for changes in the generate bytecode.
146
+ instrumented = project.file(emma.instrumented_dir => project.compile.target) do |task|
147
+ unless project.compile.sources.empty?
148
+ info "Instrumenting classes with emma metadata file #{emma.metadata_file}"
149
+ Emma.ant do |ant|
150
+ ant.instr :instrpath=>project.compile.target.to_s, :destdir=>task.to_s, :metadatafile=>emma.metadata_file do
151
+ ant.filter :includes=>emma.includes.join(', ') unless emma.includes.empty?
152
+ ant.filter :excludes=>emma.excludes.join(', ') unless emma.excludes.empty?
153
+ end
154
+ end
155
+ touch task.to_s
156
+ end
157
+ end
158
+
159
+ task 'instrument' => instrumented
160
+
161
+ # We now have two target directories with bytecode.
162
+ project.test.dependencies.unshift emma.instrumented_dir
163
+ project.test.with Emma.dependencies
164
+ project.test.options[:properties]["emma.coverage.out.file"] = emma.coverage_file
165
+
166
+ [:xml, :html].each do |format|
167
+ task format => ['instrument', 'test'] do
168
+ missing_required_files = [emma.metadata_file, emma.coverage_file].reject { |f| File.exist?(f) }
169
+ if missing_required_files.empty?
170
+ info "Creating test coverage reports in #{emma.report_dir}"
171
+ mkdir_p emma.report_dir
172
+ Emma.ant do |ant|
173
+ ant.report do
174
+ ant.infileset :file=>emma.metadata_file
175
+ ant.infileset :file=>emma.coverage_file
176
+ ant.send format, :outfile=>File.join(emma.report_to(format),"coverage.#{format}")
177
+ ant.sourcepath do
178
+ emma.sources.flatten.each do |src|
179
+ ant.dirset(:dir=>src.to_s) if File.exist?(src.to_s)
180
+ end
181
+ end
182
+ end
183
+ end
184
+ else
185
+ info "No test coverage report for #{project}. Missing: #{missing_required_files.join(', ')}"
186
+ end
187
+ end
188
+ end
189
+ end
190
+ end
191
+
192
+ project.clean do
193
+ rm_rf [emma.report_dir, emma.coverage_file, emma.metadata_file, emma.instrumented_dir]
194
+ end
195
+
196
+ end
197
+
198
+ end
199
+
200
+ class Buildr::Project
201
+ include EmmaExtension
202
+ end
203
+
204
+ namespace "emma" do
205
+
206
+ Project.local_task('instrument') { |name| "Instrumenting #{name}" }
207
+
208
+ [:xml, :html].each do |format|
209
+ desc "Run the test cases and produce code coverage reports in #{format}"
210
+ task format => ['instrument', 'test'] do
211
+ info "Creating test coverage reports in #{format}"
212
+ mkdir_p report_to(format)
213
+ Emma.ant do |ant|
214
+ ant.merge :outfile=>data_file do
215
+ Buildr.projects.each do |project|
216
+ [project.emma.metadata_file, project.emma.coverage_file].each do |data_file|
217
+ ant.fileset :file=>data_file if File.exist?(data_file)
218
+ end
219
+ end
220
+ end
221
+ ant.report do
222
+ ant.infileset :file=>data_file
223
+ ant.send format, :outfile=>File.join(report_to(format), "coverage.#{format}")
224
+ ant.sourcepath do
225
+ Buildr.projects.map(&:emma).map(&:sources).flatten.map(&:to_s).each do |src|
226
+ ant.dirset :dir=>src if File.exist?(src)
227
+ end
228
+ end
229
+ end
230
+ end
231
+ end
232
+ end
233
+
234
+ task :clean do
235
+ rm_rf [report_to, data_file]
236
+ end
237
+ end
238
+
239
+ task :clean do
240
+ task('emma:clean').invoke if Dir.pwd == Rake.application.original_dir
241
+ end
242
+
243
+ end
244
+ end