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.
Files changed (98) hide show
  1. data/CHANGELOG +42 -11
  2. data/Rakefile +5 -3
  3. data/_buildr +9 -31
  4. data/addon/buildr/cobertura.rb +5 -218
  5. data/addon/buildr/drb.rb +281 -0
  6. data/addon/buildr/emma.rb +5 -220
  7. data/addon/buildr/nailgun.rb +94 -686
  8. data/bin/buildr +0 -9
  9. data/buildr.gemspec +6 -6
  10. data/doc/images/favicon.png +0 -0
  11. data/doc/pages/contributing.textile +6 -4
  12. data/doc/pages/download.textile +11 -0
  13. data/doc/pages/extending.textile +2 -2
  14. data/doc/pages/getting_started.textile +4 -4
  15. data/doc/pages/index.textile +8 -11
  16. data/doc/pages/more_stuff.textile +50 -22
  17. data/doc/pages/packaging.textile +1 -1
  18. data/doc/pages/projects.textile +2 -2
  19. data/doc/pages/settings_profiles.textile +2 -2
  20. data/doc/pages/testing.textile +1 -1
  21. data/doc/pages/whats_new.textile +12 -0
  22. data/doc/site.haml +1 -0
  23. data/lib/buildr.rb +2 -4
  24. data/lib/buildr/core.rb +2 -0
  25. data/lib/buildr/core/application.rb +304 -149
  26. data/lib/buildr/core/checks.rb +3 -131
  27. data/lib/buildr/core/common.rb +0 -4
  28. data/lib/buildr/core/compile.rb +1 -7
  29. data/lib/buildr/core/environment.rb +0 -3
  30. data/lib/buildr/core/filter.rb +7 -3
  31. data/lib/buildr/core/generate.rb +50 -52
  32. data/lib/buildr/core/help.rb +2 -1
  33. data/lib/buildr/core/osx.rb +49 -0
  34. data/lib/buildr/core/progressbar.rb +1 -1
  35. data/lib/buildr/core/project.rb +7 -9
  36. data/lib/buildr/core/test.rb +4 -4
  37. data/lib/buildr/core/transports.rb +13 -30
  38. data/lib/buildr/core/util.rb +8 -3
  39. data/lib/buildr/groovy/bdd.rb +1 -0
  40. data/lib/buildr/groovy/compiler.rb +1 -1
  41. data/lib/buildr/ide/eclipse.rb +30 -20
  42. data/lib/buildr/ide/idea.rb +3 -2
  43. data/lib/buildr/ide/idea7x.rb +4 -2
  44. data/lib/buildr/java/ant.rb +1 -1
  45. data/lib/buildr/java/bdd.rb +9 -5
  46. data/lib/buildr/java/cobertura.rb +236 -0
  47. data/lib/buildr/java/commands.rb +2 -1
  48. data/lib/buildr/java/emma.rb +238 -0
  49. data/lib/buildr/java/jtestr_runner.rb.erb +2 -0
  50. data/lib/buildr/java/packaging.rb +6 -2
  51. data/lib/buildr/java/pom.rb +0 -4
  52. data/lib/buildr/java/test_result.rb +45 -15
  53. data/lib/buildr/java/tests.rb +14 -9
  54. data/lib/buildr/packaging.rb +5 -2
  55. data/lib/buildr/packaging/archive.rb +488 -0
  56. data/lib/buildr/packaging/artifact.rb +36 -7
  57. data/lib/buildr/packaging/artifact_namespace.rb +2 -2
  58. data/lib/buildr/packaging/gems.rb +3 -3
  59. data/lib/buildr/packaging/package.rb +1 -1
  60. data/lib/buildr/packaging/tar.rb +85 -3
  61. data/lib/buildr/packaging/version_requirement.rb +172 -0
  62. data/lib/buildr/packaging/zip.rb +24 -682
  63. data/lib/buildr/packaging/ziptask.rb +313 -0
  64. data/lib/buildr/scala/compiler.rb +1 -1
  65. data/lib/buildr/scala/tests.rb +2 -2
  66. data/rakelib/apache.rake +58 -8
  67. data/rakelib/package.rake +4 -1
  68. data/rakelib/rspec.rake +2 -2
  69. data/rakelib/rubyforge.rake +6 -3
  70. data/rakelib/scm.rake +1 -1
  71. data/rakelib/setup.rake +0 -5
  72. data/rakelib/stage.rake +4 -1
  73. data/spec/addon/drb_spec.rb +328 -0
  74. data/spec/core/application_spec.rb +29 -22
  75. data/spec/core/build_spec.rb +8 -0
  76. data/spec/core/checks_spec.rb +293 -311
  77. data/spec/core/common_spec.rb +8 -2
  78. data/spec/core/compile_spec.rb +17 -1
  79. data/spec/core/generate_spec.rb +33 -0
  80. data/spec/core/project_spec.rb +18 -10
  81. data/spec/core/test_spec.rb +24 -1
  82. data/spec/ide/eclipse_spec.rb +96 -28
  83. data/spec/java/ant.rb +5 -0
  84. data/spec/java/bdd_spec.rb +4 -4
  85. data/spec/{addon → java}/cobertura_spec.rb +3 -3
  86. data/spec/{addon → java}/emma_spec.rb +3 -3
  87. data/spec/java/java_spec.rb +9 -1
  88. data/spec/java/packaging_spec.rb +19 -2
  89. data/spec/{addon → java}/test_coverage_spec.rb +7 -1
  90. data/spec/java/tests_spec.rb +5 -0
  91. data/spec/packaging/archive_spec.rb +1 -1
  92. data/spec/{core → packaging}/artifact_namespace_spec.rb +2 -2
  93. data/spec/packaging/artifact_spec.rb +46 -5
  94. data/spec/packaging/packaging_spec.rb +1 -1
  95. data/spec/sandbox.rb +16 -14
  96. data/spec/spec_helpers.rb +26 -3
  97. metadata +20 -11
  98. data/lib/buildr/core/application_cli.rb +0 -139
@@ -83,7 +83,8 @@ module Java
83
83
  end
84
84
  cmd_args << '-source' << options[:source] if options[:source]
85
85
  classpath = classpath_from(options)
86
- Java.tools_jar { |tools| classpath << tools }
86
+ tools = Java.tools_jar
87
+ classpath << tools if tools
87
88
  cmd_args << '-classpath' << classpath.join(File::PATH_SEPARATOR) unless classpath.empty?
88
89
  cmd_args += files
89
90
  unless Buildr.application.options.dryrun
@@ -0,0 +1,238 @@
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
+ class << self
41
+
42
+ REQUIRES = ['emma:emma_ant:jar:2.0.5312', 'emma:emma:jar:2.0.5312'] unless const_defined?('REQUIRES')
43
+
44
+ def requires()
45
+ @requires ||= Buildr.artifacts(REQUIRES).each(&:invoke).map(&:to_s)
46
+ end
47
+
48
+ def report_to format=nil
49
+ File.expand_path('reports/emma')
50
+ end
51
+
52
+ def data_file()
53
+ File.join(report_to, 'coverage.es')
54
+ end
55
+
56
+ def ant
57
+ Buildr.ant 'emma' do |ant|
58
+ ant.taskdef :classpath=>requires.join(File::PATH_SEPARATOR), :resource=>'emma_ant.properties'
59
+ ant.emma :verbosity=>(Buildr.application.options.trace ? 'verbose' : 'warning') do
60
+ yield ant
61
+ end
62
+ end
63
+ end
64
+ end
65
+
66
+ class EmmaConfig # :nodoc:
67
+
68
+ def initialize(project)
69
+ @project = project
70
+ end
71
+
72
+ attr_reader :project
73
+ private :project
74
+
75
+ attr_writer :metadata_file, :coverage_file, :instrumented_dir, :report_dir
76
+
77
+ def coverage_file
78
+ @coverage_file ||= File.join(report_dir, 'coverage.ec')
79
+ end
80
+
81
+ def metadata_file
82
+ @metadata_file ||= File.join(report_dir, 'coverage.em')
83
+ end
84
+
85
+ def instrumented_dir
86
+ @instrumented_dir ||= project.path_to(:target, :instrumented, :classes)
87
+ end
88
+
89
+ def report_dir
90
+ @report_dir ||= project.path_to(:reports, :emma)
91
+ end
92
+
93
+ def report_to format
94
+ report_dir
95
+ end
96
+
97
+ # :call-seq:
98
+ # project.emma.include(*classPatterns)
99
+ #
100
+ def include(*classPatterns)
101
+ includes.push(*classPatterns)
102
+ self
103
+ end
104
+
105
+ def includes
106
+ @includeClasses ||= []
107
+ end
108
+
109
+ # :call-seq:
110
+ # project.emma.exclude(*classPatterns)
111
+ #
112
+ def exclude(*classPatterns)
113
+ excludes.push(*classPatterns)
114
+ self
115
+ end
116
+
117
+ def excludes
118
+ @excludeClasses ||= []
119
+ end
120
+
121
+ def sources
122
+ project.compile.sources
123
+ end
124
+ end
125
+
126
+ module EmmaExtension # :nodoc:
127
+ include Buildr::Extension
128
+
129
+ def emma
130
+ @emma_config ||= EmmaConfig.new(self)
131
+ end
132
+
133
+ after_define do |project|
134
+ emma = project.emma
135
+
136
+ namespace 'emma' do
137
+ unless project.compile.target.nil?
138
+ # Instrumented bytecode goes in a different directory. This task creates before running the test
139
+ # cases and monitors for changes in the generate bytecode.
140
+ instrumented = project.file(emma.instrumented_dir => project.compile.target) do |task|
141
+ unless project.compile.sources.empty?
142
+ info "Instrumenting classes with emma metadata file #{emma.metadata_file}"
143
+ Emma.ant do |ant|
144
+ ant.instr :instrpath=>project.compile.target.to_s, :destdir=>task.to_s, :metadatafile=>emma.metadata_file do
145
+ ant.filter :includes=>emma.includes.join(', ') unless emma.includes.empty?
146
+ ant.filter :excludes=>emma.excludes.join(', ') unless emma.excludes.empty?
147
+ end
148
+ end
149
+ touch task.to_s, :verbose=>false
150
+ end
151
+ end
152
+
153
+ task 'instrument' => instrumented
154
+
155
+ # We now have two target directories with bytecode.
156
+ project.test.dependencies.unshift emma.instrumented_dir
157
+ project.test.with Emma.requires
158
+ project.test.options[:properties]["emma.coverage.out.file"] = emma.coverage_file
159
+
160
+ [:xml, :html].each do |format|
161
+ task format => ['instrument', 'test'] do
162
+ missing_required_files = [emma.metadata_file, emma.coverage_file].reject { |f| File.exist?(f) }
163
+ if missing_required_files.empty?
164
+ info "Creating test coverage reports in #{emma.report_dir}"
165
+ mkdir_p emma.report_dir, :verbose=>false
166
+ Emma.ant do |ant|
167
+ ant.report do
168
+ ant.infileset :file=>emma.metadata_file
169
+ ant.infileset :file=>emma.coverage_file
170
+ ant.send format, :outfile=>File.join(emma.report_to(format),"coverage.#{format}")
171
+ ant.sourcepath do
172
+ emma.sources.flatten.each do |src|
173
+ ant.dirset(:dir=>src.to_s) if File.exist?(src.to_s)
174
+ end
175
+ end
176
+ end
177
+ end
178
+ else
179
+ info "No test coverage report for #{project}. Missing: #{missing_required_files.join(', ')}"
180
+ end
181
+ end
182
+ end
183
+ end
184
+ end
185
+
186
+ project.clean do
187
+ rm_rf [emma.report_dir, emma.coverage_file, emma.metadata_file, emma.instrumented_dir], :verbose=>false
188
+ end
189
+
190
+ end
191
+
192
+ end
193
+
194
+ class Buildr::Project
195
+ include EmmaExtension
196
+ end
197
+
198
+ namespace "emma" do
199
+
200
+ Project.local_task('instrument') { |name| "Instrumenting #{name}" }
201
+
202
+ [:xml, :html].each do |format|
203
+ desc "Run the test cases and produce code coverage reports in #{format}"
204
+ task format => ['instrument', 'test'] do
205
+ info "Creating test coverage reports in #{format}"
206
+ mkdir_p report_to(format), :verbose=>false
207
+ Emma.ant do |ant|
208
+ ant.merge :outfile=>data_file do
209
+ Buildr.projects.each do |project|
210
+ [project.emma.metadata_file, project.emma.coverage_file].each do |data_file|
211
+ ant.fileset :file=>data_file if File.exist?(data_file)
212
+ end
213
+ end
214
+ end
215
+ ant.report do
216
+ ant.infileset :file=>data_file
217
+ ant.send format, :outfile=>File.join(report_to(format), "coverage.#{format}")
218
+ ant.sourcepath do
219
+ Buildr.projects.map(&:emma).map(&:sources).flatten.map(&:to_s).each do |src|
220
+ ant.dirset :dir=>src if File.exist?(src)
221
+ end
222
+ end
223
+ end
224
+ end
225
+ end
226
+ end
227
+
228
+ task :clean do
229
+ rm_rf [report_to, data_file], :verbose=>false
230
+ end
231
+ end
232
+
233
+ task :clean do
234
+ task('emma:clean').invoke if Dir.pwd == Rake.application.original_dir
235
+ end
236
+
237
+ end
238
+ end
@@ -107,6 +107,8 @@ rescue => e
107
107
  Buildr::TestFramework::TestResult::Error.dump_yaml('<%= runner.result %>', e) rescue \
108
108
  puts "-[--- ERROR ---]-", e.class, e.message, *e.backtrace
109
109
  end
110
+
111
+ exit 0 # let buildr find the erros from the result yaml
110
112
 
111
113
  # Local Variables:
112
114
  # mode: ruby
@@ -25,7 +25,7 @@ module Buildr
25
25
 
26
26
  class Manifest
27
27
 
28
- STANDARD_HEADER = "Manifest-Version: 1.0\nCreated-By: Buildr\n"
28
+ STANDARD_HEADER = { 'Manifest-Version'=>'1.0', 'Created-By'=>'Buildr' }
29
29
  LINE_SEPARATOR = /\r\n|\n|\r[^\n]/ #:nodoc:
30
30
  SECTION_SEPARATOR = /(#{LINE_SEPARATOR}){2}/ #:nodoc:
31
31
 
@@ -97,6 +97,10 @@ module Buildr
97
97
  else
98
98
  fail 'Invalid manifest, expecting Hash, Array, file name/task or proc/method.'
99
99
  end
100
+ # Add Manifest-Version and Created-By, if not specified.
101
+ STANDARD_HEADER.each do |name, value|
102
+ sections.first[name] ||= value
103
+ end
100
104
  end
101
105
 
102
106
  # The sections of this manifest.
@@ -171,7 +175,7 @@ module Buildr
171
175
  @manifest_tmp = Tempfile.new('MANIFEST.MF')
172
176
  self.manifest = File.read(manifest.to_s) if String === manifest || Rake::Task === manifest
173
177
  self.manifest = Manifest.new(manifest) unless Manifest === manifest
174
- @manifest_tmp.write Manifest::STANDARD_HEADER
178
+ #@manifest_tmp.write Manifest::STANDARD_HEADER
175
179
  @manifest_tmp.write manifest.to_s
176
180
  @manifest_tmp.write "\n"
177
181
  @manifest_tmp.rewind
@@ -14,10 +14,6 @@
14
14
  # the License.
15
15
 
16
16
 
17
- require 'xmlsimple'
18
- require 'buildr/packaging'
19
-
20
-
21
17
  module Buildr
22
18
  class POM
23
19
 
@@ -13,7 +13,6 @@
13
13
  # License for the specific language governing permissions and limitations under
14
14
  # the License.
15
15
 
16
- require 'yaml'
17
16
 
18
17
  module Buildr #:nodoc:
19
18
  module TestFramework
@@ -27,6 +26,7 @@ module Buildr #:nodoc:
27
26
  def initialize(message, backtrace)
28
27
  @message = message
29
28
  @backtrace = backtrace
29
+ set_backtrace backtrace
30
30
  end
31
31
 
32
32
  def self.dump_yaml(file, e)
@@ -59,9 +59,12 @@ module Buildr #:nodoc:
59
59
  def initialize(options, where)
60
60
  @options = options
61
61
  @where = where
62
+ @result = Hash.new
63
+ @result[:succeeded] = []
64
+ @result[:failed] = []
62
65
  end
63
66
 
64
- %w[ example_started example_passed example_failed example_pending
67
+ %w[ example_started
65
68
  start_dump dump_failure dump_summary dump_pending ].each do |meth|
66
69
  module_eval "def #{meth}(*args); end"
67
70
  end
@@ -70,24 +73,38 @@ module Buildr #:nodoc:
70
73
  @example_group = example_group
71
74
  end
72
75
 
76
+ def example_passed(example)
77
+ end
78
+
79
+ def example_pending(example, counter, failure)
80
+ end
81
+
82
+ def example_failed(example, counter, failure)
83
+ if example_group.respond_to?(:spec_path)
84
+ result.failed << example_group.spec_path.gsub(/:\d+$/, '')
85
+ else
86
+ path = path_from_bt(failure.exception.backtrace)
87
+ result.failed << path if path
88
+ end
89
+ end
90
+
73
91
  def start(example_count)
74
92
  @result = TestResult.new
75
93
  end
76
94
 
77
- def close
95
+ def path_from_bt(ary)
78
96
  files = options.files
79
- failure_from_bt = lambda do |ary|
80
- test = nil
81
- ary.find do |bt|
82
- bt = bt.split(':').first.strip
83
- test = bt if files.include?(bt)
84
- end
85
- test
86
- end
87
- options.reporter.instance_variable_get(:@failures).each do |failure|
88
- result.failed << files.delete(failure_from_bt[failure.exception.backtrace])
97
+ test = nil
98
+ ary.find do |bt|
99
+ bt = bt.split(':').first.strip
100
+ test = bt if files.include?(bt)
89
101
  end
90
- result.succeeded |= files
102
+ test
103
+ end
104
+
105
+ def close
106
+ files = options.files
107
+ result.succeeded = files - result.failed
91
108
 
92
109
  FileUtils.mkdir_p(File.dirname(where))
93
110
  File.open(where, 'w') { |f| f.puts YAML.dump(result) }
@@ -238,8 +255,21 @@ module Buildr #:nodoc:
238
255
  nil
239
256
  when Test::Unit::Failure
240
257
  Error.new(fault.message, fault.location)
241
- when Test::Unit::Error, Expectations::Results::Error, Spec::Runner::Reporter::Failure
258
+ when Test::Unit::Error
259
+ if fault.exception.is_a?(NativeException)
260
+ exception = fault.exception.cause
261
+ bt = exception.stack_trace.to_a
262
+ else
263
+ exception = fault.exception
264
+ bt = exception.backtrace
265
+ end
266
+ Error.new(exception.message, bt)
267
+ when Expectations::Results::Error
242
268
  fault.exception
269
+ when Spec::Runner::Reporter::Failure
270
+ ex = fault.exception
271
+ fault.example.instance_variable_get(:@_implementation).to_s =~ /@(.+:\d+)/
272
+ Error.new(ex.message, [$1.to_s] + ex.backtrace)
243
273
  when Expectations::Results
244
274
  file = fault.file
245
275
  line = fault.line
@@ -301,17 +301,22 @@ module Buildr
301
301
  end
302
302
 
303
303
  def run(tests, dependencies) #:nodoc:
304
- cmd_args = [ 'org.testng.TestNG', '-sourcedir', task.compile.sources.join(';'), '-suitename', task.send(:project).name ]
304
+ cmd_args = [ 'org.testng.TestNG', '-sourcedir', task.compile.sources.join(';'), '-suitename', task.project.id ]
305
305
  cmd_args << '-d' << task.report_to.to_s
306
+ # run all tests in the same suite
307
+ cmd_args << '-testclass' << tests
306
308
  cmd_options = { :properties=>options[:properties], :java_args=>options[:java_args],
307
- :classpath=>dependencies }
308
- tests.inject([]) do |passed, test|
309
- begin
310
- Java::Commands.java cmd_args, '-testclass', test, cmd_options.merge(:name=>test)
311
- passed << test
312
- rescue
313
- passed
314
- end
309
+ :classpath=>dependencies, :name => "TestNG in #{task.send(:project).name}" }
310
+
311
+ begin
312
+ Java::Commands.java cmd_args, cmd_options
313
+ return tests
314
+ rescue
315
+ # testng-failed.xml contains the list of failed tests *only*
316
+ report = File.read(File.join(task.report_to.to_s, 'testng-failed.xml'))
317
+ failed = report.scan(/<class name="(.*)">/im).flatten
318
+ # return the list of passed tests
319
+ return tests - failed
315
320
  end
316
321
  end
317
322
 
@@ -14,8 +14,11 @@
14
14
  # the License.
15
15
 
16
16
 
17
- require 'buildr/packaging/zip'
18
- require 'buildr/packaging/tar'
19
17
  require 'buildr/packaging/artifact'
20
18
  require 'buildr/packaging/package'
19
+ require 'buildr/packaging/archive'
20
+ require 'buildr/packaging/ziptask'
21
+ require 'buildr/packaging/tar'
21
22
  require 'buildr/packaging/gems'
23
+ autoload :Zlib, 'zlib'
24
+ autoload :Zip, 'buildr/packaging/zip'