buildr 1.3.2 → 1.3.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (124) hide show
  1. data/CHANGELOG +66 -4
  2. data/{README → README.rdoc} +29 -16
  3. data/Rakefile +16 -20
  4. data/_buildr +38 -0
  5. data/addon/buildr/cobertura.rb +49 -45
  6. data/addon/buildr/emma.rb +238 -0
  7. data/addon/buildr/jetty.rb +1 -1
  8. data/addon/buildr/nailgun.rb +585 -661
  9. data/{lib/buildr/java → addon/buildr}/org/apache/buildr/BuildrNail$Main.class +0 -0
  10. data/{lib/buildr/java → addon/buildr}/org/apache/buildr/BuildrNail.class +0 -0
  11. data/{lib/buildr/java → addon/buildr}/org/apache/buildr/BuildrNail.java +0 -0
  12. data/bin/buildr +9 -2
  13. data/buildr.buildfile +53 -0
  14. data/buildr.gemspec +21 -14
  15. data/doc/css/default.css +51 -48
  16. data/doc/css/print.css +60 -55
  17. data/doc/images/favicon.png +0 -0
  18. data/doc/images/growl-icon.tiff +0 -0
  19. data/doc/images/project-structure.png +0 -0
  20. data/doc/pages/artifacts.textile +46 -156
  21. data/doc/pages/building.textile +63 -323
  22. data/doc/pages/contributing.textile +112 -102
  23. data/doc/pages/download.textile +19 -27
  24. data/doc/pages/extending.textile +27 -81
  25. data/doc/pages/getting_started.textile +44 -119
  26. data/doc/pages/index.textile +26 -47
  27. data/doc/pages/languages.textile +407 -0
  28. data/doc/pages/more_stuff.textile +92 -173
  29. data/doc/pages/packaging.textile +71 -239
  30. data/doc/pages/projects.textile +58 -233
  31. data/doc/pages/recipes.textile +19 -43
  32. data/doc/pages/settings_profiles.textile +39 -104
  33. data/doc/pages/testing.textile +41 -304
  34. data/doc/pages/troubleshooting.textile +29 -47
  35. data/doc/pages/whats_new.textile +69 -167
  36. data/doc/print.haml +0 -1
  37. data/doc/print.toc.yaml +1 -0
  38. data/doc/scripts/buildr-git.rb +1 -1
  39. data/doc/site.haml +1 -0
  40. data/doc/site.toc.yaml +8 -5
  41. data/{KEYS → etc/KEYS} +0 -0
  42. data/etc/git-svn-authors +16 -0
  43. data/lib/buildr.rb +2 -5
  44. data/lib/buildr/core/application.rb +192 -98
  45. data/lib/buildr/core/build.rb +140 -91
  46. data/lib/buildr/core/checks.rb +5 -5
  47. data/lib/buildr/core/common.rb +1 -1
  48. data/lib/buildr/core/compile.rb +12 -10
  49. data/lib/buildr/core/filter.rb +151 -46
  50. data/lib/buildr/core/generate.rb +9 -9
  51. data/lib/buildr/core/progressbar.rb +1 -1
  52. data/lib/buildr/core/project.rb +8 -7
  53. data/lib/buildr/core/test.rb +51 -26
  54. data/lib/buildr/core/transports.rb +22 -38
  55. data/lib/buildr/core/util.rb +78 -26
  56. data/lib/buildr/groovy.rb +18 -0
  57. data/lib/buildr/groovy/bdd.rb +105 -0
  58. data/lib/buildr/groovy/compiler.rb +138 -0
  59. data/lib/buildr/ide/eclipse.rb +102 -71
  60. data/lib/buildr/ide/idea.rb +7 -12
  61. data/lib/buildr/ide/idea7x.rb +7 -8
  62. data/lib/buildr/java.rb +4 -7
  63. data/lib/buildr/java/ant.rb +26 -5
  64. data/lib/buildr/java/bdd.rb +449 -0
  65. data/lib/buildr/java/commands.rb +9 -9
  66. data/lib/buildr/java/{compilers.rb → compiler.rb} +8 -90
  67. data/lib/buildr/java/jruby.rb +29 -11
  68. data/lib/buildr/java/jtestr_runner.rb.erb +116 -0
  69. data/lib/buildr/java/packaging.rb +23 -16
  70. data/lib/buildr/java/pom.rb +1 -1
  71. data/lib/buildr/java/rjb.rb +21 -8
  72. data/lib/buildr/java/test_result.rb +308 -0
  73. data/lib/buildr/java/tests.rb +324 -0
  74. data/lib/buildr/packaging/artifact.rb +12 -11
  75. data/lib/buildr/packaging/artifact_namespace.rb +7 -4
  76. data/lib/buildr/packaging/gems.rb +3 -3
  77. data/lib/buildr/packaging/zip.rb +13 -10
  78. data/lib/buildr/resources/buildr.icns +0 -0
  79. data/lib/buildr/scala.rb +19 -0
  80. data/lib/buildr/scala/compiler.rb +109 -0
  81. data/lib/buildr/scala/tests.rb +203 -0
  82. data/rakelib/apache.rake +71 -45
  83. data/rakelib/doc.rake +2 -2
  84. data/rakelib/package.rake +3 -2
  85. data/rakelib/rspec.rake +23 -21
  86. data/rakelib/setup.rake +34 -9
  87. data/rakelib/stage.rake +4 -1
  88. data/spec/addon/cobertura_spec.rb +77 -0
  89. data/spec/addon/emma_spec.rb +120 -0
  90. data/spec/addon/test_coverage_spec.rb +255 -0
  91. data/spec/{application_spec.rb → core/application_spec.rb} +82 -4
  92. data/spec/{artifact_namespace_spec.rb → core/artifact_namespace_spec.rb} +12 -1
  93. data/spec/core/build_spec.rb +415 -0
  94. data/spec/{checks_spec.rb → core/checks_spec.rb} +2 -2
  95. data/spec/{common_spec.rb → core/common_spec.rb} +119 -30
  96. data/spec/{compile_spec.rb → core/compile_spec.rb} +17 -13
  97. data/spec/core/generate_spec.rb +33 -0
  98. data/spec/{project_spec.rb → core/project_spec.rb} +9 -6
  99. data/spec/{test_spec.rb → core/test_spec.rb} +222 -28
  100. data/spec/{transport_spec.rb → core/transport_spec.rb} +5 -9
  101. data/spec/groovy/bdd_spec.rb +80 -0
  102. data/spec/{groovy_compilers_spec.rb → groovy/compiler_spec.rb} +1 -1
  103. data/spec/ide/eclipse_spec.rb +243 -0
  104. data/spec/{java_spec.rb → java/ant.rb} +7 -17
  105. data/spec/java/bdd_spec.rb +358 -0
  106. data/spec/{java_compilers_spec.rb → java/compiler_spec.rb} +1 -1
  107. data/spec/java/java_spec.rb +88 -0
  108. data/spec/{java_packaging_spec.rb → java/packaging_spec.rb} +65 -4
  109. data/spec/{java_test_frameworks_spec.rb → java/tests_spec.rb} +31 -10
  110. data/spec/{archive_spec.rb → packaging/archive_spec.rb} +12 -2
  111. data/spec/{artifact_spec.rb → packaging/artifact_spec.rb} +12 -5
  112. data/spec/{packaging_helper.rb → packaging/packaging_helper.rb} +0 -0
  113. data/spec/{packaging_spec.rb → packaging/packaging_spec.rb} +1 -1
  114. data/spec/sandbox.rb +22 -5
  115. data/spec/{scala_compilers_spec.rb → scala/compiler_spec.rb} +1 -1
  116. data/spec/{scala_test_frameworks_spec.rb → scala/tests_spec.rb} +11 -12
  117. data/spec/spec_helpers.rb +38 -17
  118. metadata +103 -70
  119. data/lib/buildr/java/bdd_frameworks.rb +0 -265
  120. data/lib/buildr/java/groovyc.rb +0 -137
  121. data/lib/buildr/java/test_frameworks.rb +0 -450
  122. data/spec/build_spec.rb +0 -193
  123. data/spec/java_bdd_frameworks_spec.rb +0 -238
  124. data/spec/spec.opts +0 -6
@@ -14,7 +14,7 @@
14
14
  # the License.
15
15
 
16
16
 
17
- require File.join(File.dirname(__FILE__), 'spec_helpers')
17
+ require File.join(File.dirname(__FILE__), '../spec_helpers')
18
18
 
19
19
  describe Buildr.method(:struct) do
20
20
  before do
@@ -110,42 +110,62 @@ describe Buildr.method(:download) do
110
110
  end
111
111
 
112
112
  it 'should accept a String and download from that URL' do
113
- download('http://localhost/download').tap do |task|
114
- task.source.should_receive(:read).and_yield [@content]
115
- task.invoke
116
- task.should contain(@content)
113
+ define 'foo' do
114
+ download('http://localhost/download').tap do |task|
115
+ task.source.should_receive(:read).and_yield [@content]
116
+ task.invoke
117
+ task.should contain(@content)
118
+ end
117
119
  end
118
120
  end
119
121
 
120
122
  it 'should accept a URI and download from that URL' do
121
- download(URI.parse('http://localhost/download')).tap do |task|
122
- task.source.should_receive(:read).and_yield [@content]
123
- task.invoke
124
- task.should contain(@content)
123
+ define 'foo' do
124
+ download(URI.parse('http://localhost/download')).tap do |task|
125
+ task.source.should_receive(:read).and_yield [@content]
126
+ task.invoke
127
+ task.should contain(@content)
128
+ end
125
129
  end
126
130
  end
127
131
 
128
132
  it 'should accept a path and String and download from that URL' do
129
- download('downloaded'=>'http://localhost/download').tap do |task|
130
- task.source.should_receive(:read).and_yield [@content]
131
- task.invoke
132
- task.should contain(@content)
133
+ define 'foo' do
134
+ download('downloaded'=>'http://localhost/download').tap do |task|
135
+ task.source.should_receive(:read).and_yield [@content]
136
+ task.invoke
137
+ task.should contain(@content)
138
+ end
139
+ end
140
+ end
141
+
142
+ it 'should accept an artifact and String and download from that URL' do
143
+ define 'foo' do
144
+ artifact('com.example:library:jar:2.0').tap do |artifact|
145
+ download(artifact=>'http://localhost/download').source.should_receive(:read).and_yield [@content]
146
+ artifact.invoke
147
+ artifact.should contain(@content)
148
+ end
133
149
  end
134
150
  end
135
151
 
136
152
  it 'should accept a path and URI and download from that URL' do
137
- download('downloaded'=>URI.parse('http://localhost/download')).tap do |task|
138
- task.source.should_receive(:read).and_yield [@content]
139
- task.invoke
140
- task.should contain(@content)
153
+ define 'foo' do
154
+ download('downloaded'=>URI.parse('http://localhost/download')).tap do |task|
155
+ task.source.should_receive(:read).and_yield [@content]
156
+ task.invoke
157
+ task.should contain(@content)
158
+ end
141
159
  end
142
160
  end
143
161
 
144
162
  it 'should create path for download' do
145
- download('path/downloaded'=>URI.parse('http://localhost/download')).tap do |task|
146
- task.source.should_receive(:read).and_yield [@content]
147
- task.invoke
148
- task.should contain(@content)
163
+ define 'foo' do
164
+ download('path/downloaded'=>URI.parse('http://localhost/download')).tap do |task|
165
+ task.source.should_receive(:read).and_yield [@content]
166
+ task.invoke
167
+ task.should contain(@content)
168
+ end
149
169
  end
150
170
  end
151
171
 
@@ -166,10 +186,12 @@ describe Buildr.method(:download) do
166
186
  end
167
187
 
168
188
  it 'should execute only if file does not already exist' do
169
- download('downloaded'=>'http://localhost/download').tap do |task|
170
- task.source.should_not_receive(:read)
171
- write task.to_s, 'not really'
172
- task.invoke
189
+ define 'foo' do
190
+ download('downloaded'=>'http://localhost/download').tap do |task|
191
+ task.source.should_not_receive(:read)
192
+ write task.to_s, 'not really'
193
+ task.invoke
194
+ end
173
195
  end
174
196
  end
175
197
 
@@ -282,7 +304,7 @@ describe Buildr::Filter do
282
304
 
283
305
  it 'should respond to :include and use these inclusion patterns' do
284
306
  @filter.from('src').into('target').include('file2', 'file3').run
285
- Dir['target/*'].should eql(['target/file2', 'target/file3'])
307
+ Dir['target/*'].sort.should eql(['target/file2', 'target/file3'])
286
308
  end
287
309
 
288
310
  it 'should respond to :exclude and return self' do
@@ -354,6 +376,43 @@ describe Buildr::Filter do
354
376
  end
355
377
  end
356
378
 
379
+ it 'should use erb when given a binding' do
380
+ 1.upto(4) { |i| write "src/file#{i}", "file#{i} with <%= key1 %> and <%= key2 * 2 %>" }
381
+ key1 = 'value1'
382
+ key2 = 12
383
+ @filter.from('src').into('target').using(binding).run
384
+ Dir['target/*'].each do |file|
385
+ read(file).should eql("#{File.basename(file)} with value1 and 24")
386
+ end
387
+ end
388
+
389
+ it 'should apply hash mapping using erb' do
390
+ 1.upto(4) { |i| write "src/file#{i}", "file#{i} with <%= key1 %> and <%= key2 * 2 %>" }
391
+ @filter.from('src').into('target').using(:erb, 'key1'=>'value1', 'key2'=> 12).run
392
+ Dir['target/*'].each do |file|
393
+ read(file).should eql("#{File.basename(file)} with value1 and 24")
394
+ end
395
+ end
396
+
397
+ it 'should use an object binding when using erb' do
398
+ 1.upto(4) { |i| write "src/file#{i}", "file#{i} with <%= key1 %> and <%= key2 * 2 %>" }
399
+ obj = Struct.new(:key1, :key2).new('value1', 12)
400
+ @filter.from('src').into('target').using(:erb, obj).run
401
+ Dir['target/*'].each do |file|
402
+ read(file).should eql("#{File.basename(file)} with value1 and 24")
403
+ end
404
+ end
405
+
406
+ it 'should use a given block context when using erb' do
407
+ 1.upto(4) { |i| write "src/file#{i}", "file#{i} with <%= key1 %> and <%= key2 * 2 %>" }
408
+ key1 = 'value1'
409
+ key2 = 12
410
+ @filter.from('src').into('target').using(:erb){}.run
411
+ Dir['target/*'].each do |file|
412
+ read(file).should eql("#{File.basename(file)} with value1 and 24")
413
+ end
414
+ end
415
+
357
416
  it 'should using Maven mapper by default' do
358
417
  @filter.using('key1'=>'value1', 'key2'=>'value2').mapper.should eql(:maven)
359
418
  end
@@ -430,6 +489,32 @@ describe Buildr::Filter do
430
489
  end
431
490
  end
432
491
 
492
+ describe Filter::Mapper do
493
+
494
+ module MooMapper
495
+ def moo_config(*args, &block)
496
+ raise ArgumentError, "Expected moo block" unless block_given?
497
+ { :moos => args, :callback => block }
498
+ end
499
+
500
+ def moo_transform(content, path = nil)
501
+ content.gsub(/moo+/i) do |str|
502
+ moos = yield :moos # same than config[:moos]
503
+ moo = moos[str.size - 3] || str
504
+ config[:callback].call(moo)
505
+ end
506
+ end
507
+ end
508
+
509
+ it 'should allow plugable mapping types' do
510
+ mapper = Filter::Mapper.new.extend(MooMapper)
511
+ mapper.using(:moo, 'ooone', 'twoo') do |str|
512
+ i = nil; str.capitalize.gsub(/\w/) { |s| s.send( (i = !i) ? 'upcase' : 'downcase' ) }
513
+ end
514
+ mapper.transform('Moo cow, mooo cows singing mooooo').should == 'OoOnE cow, TwOo cows singing MoOoOo'
515
+ end
516
+
517
+ end
433
518
 
434
519
  describe Buildr.method(:options) do
435
520
  it 'should return an Options object' do
@@ -446,7 +531,6 @@ describe Buildr.method(:options) do
446
531
  end
447
532
  end
448
533
 
449
-
450
534
  describe Buildr::Options, 'proxy.exclude' do
451
535
  before do
452
536
  options.proxy.http = 'http://myproxy:8080'
@@ -551,9 +635,14 @@ name1=with\tand\r
551
635
 
552
636
  name2=with\\nand\f
553
637
 
554
- name3=double\\hash
638
+ name3=double\\\\hash
555
639
  PROPS
556
- hash.should == {'name1'=>"with\tand\r", 'name2'=>"with\nand\f", 'name3'=>"double\\hash"}
640
+ hash.should == {'name1'=>"with\tand", 'name2'=>"with\nand\f", 'name3'=>'double\hash'}
641
+ end
642
+
643
+ it 'should ignore whitespace' do
644
+ hash = Hash.from_java_properties('name1 = value1')
645
+ hash.should == {'name1'=>'value1'}
557
646
  end
558
647
  end
559
648
 
@@ -567,7 +656,7 @@ describe Hash, '#to_java_properties' do
567
656
  end
568
657
 
569
658
  it 'should handle \t, \r, \n and \f' do
570
- props = {'name1'=>"with\tand\r", 'name2'=>"with\nand\f", 'name3'=>"double\\hash"}.to_java_properties
659
+ props = {'name1'=>"with\tand\r", 'name2'=>"with\nand\f", 'name3'=>'double\hash'}.to_java_properties
571
660
  props.split("\n").should include("name1=with\\tand\\r")
572
661
  props.split("\n").should include("name2=with\\nand\\f")
573
662
  props.split("\n").should include("name3=double\\\\hash")
@@ -14,7 +14,7 @@
14
14
  # the License.
15
15
 
16
16
 
17
- require File.join(File.dirname(__FILE__), 'spec_helpers')
17
+ require File.join(File.dirname(__FILE__), '../spec_helpers')
18
18
 
19
19
 
20
20
  module CompilerHelper
@@ -23,8 +23,8 @@ module CompilerHelper
23
23
  end
24
24
 
25
25
  def sources
26
- @sources ||= ['Test1.java', 'Test2.java'].map { |f| File.join('src/main/java', f) }.
27
- each { |src| write src, "class #{src.pathmap('%n')} {}" }
26
+ @sources ||= ['Test1.java', 'Test2.java'].map { |f| File.join('src/main/java/thepackage', f) }.
27
+ each { |src| write src, "package thepackage; class #{src.pathmap('%n')} {}" }
28
28
  end
29
29
 
30
30
  def jars
@@ -146,12 +146,12 @@ describe Buildr::CompileTask, '#sources' do
146
146
 
147
147
  it 'should allow files' do
148
148
  compile_task.from(sources).into('classes').invoke
149
- sources.each { |src| file(src.pathmap('classes/%n.class')).should exist }
149
+ sources.each { |src| file(src.pathmap('classes/thepackage/%n.class')).should exist }
150
150
  end
151
151
 
152
152
  it 'should allow directories' do
153
153
  compile_task.from(File.dirname(sources.first)).into('classes').invoke
154
- sources.each { |src| file(src.pathmap('classes/%n.class')).should exist }
154
+ sources.each { |src| file(src.pathmap('classes/thepackage/%n.class')).should exist }
155
155
  end
156
156
 
157
157
  it 'should allow tasks' do
@@ -179,7 +179,7 @@ describe Buildr::CompileTask, '#dependencies' do
179
179
 
180
180
  it 'should allow files' do
181
181
  compile_task.from(sources).with(jars).into('classes').invoke
182
- sources.each { |src| file(src.pathmap('classes/%n.class')).should exist }
182
+ sources.each { |src| file(src.pathmap('classes/thepackage/%n.class')).should exist }
183
183
  end
184
184
 
185
185
  it 'should allow tasks' do
@@ -261,7 +261,7 @@ describe Buildr::CompileTask, '#invoke' do
261
261
 
262
262
  it 'should compile into target directory' do
263
263
  compile_task.from(sources).into('code').invoke
264
- Dir['code/*.class'].should_not be_empty
264
+ Dir['code/thepackage/*.class'].should_not be_empty
265
265
  end
266
266
 
267
267
  it 'should compile only once' do
@@ -302,7 +302,9 @@ describe Buildr::CompileTask, '#invoke' do
302
302
  end
303
303
 
304
304
  it 'should force compilation if target empty' do
305
+ time = Time.now
305
306
  mkpath compile_task.target.to_s
307
+ File.utime(time - 1, time - 1, compile_task.target.to_s)
306
308
  lambda { compile_task.from(sources).invoke }.should run_task('foo:compile')
307
309
  end
308
310
 
@@ -310,15 +312,16 @@ describe Buildr::CompileTask, '#invoke' do
310
312
  # Simulate class files that are older than source files.
311
313
  time = Time.now
312
314
  sources.each { |src| File.utime(time + 1, time + 1, src) }
313
- sources.map { |src| src.pathmap("#{compile_task.target}/%n.class") }.
315
+ sources.map { |src| src.pathmap("#{compile_task.target}/thepackage/%n.class") }.
314
316
  each { |kls| write kls ; File.utime(time, time, kls) }
317
+ File.utime(time - 1, time - 1, project('foo').compile.target.to_s)
315
318
  lambda { compile_task.from(sources).invoke }.should run_task('foo:compile')
316
319
  end
317
320
 
318
321
  it 'should not force compilation if sources older than compiled' do
319
322
  # When everything has the same timestamp, nothing is compiled again.
320
323
  time = Time.now
321
- sources.map { |src| src.pathmap("#{compile_task.target}/%n.class") }.
324
+ sources.map { |src| src.pathmap("#{compile_task.target}/thepackage/%n.class") }.
322
325
  each { |kls| write kls ; File.utime(time, time, kls) }
323
326
  lambda { compile_task.from(sources).invoke }.should_not run_task('foo:compile')
324
327
  end
@@ -327,8 +330,9 @@ describe Buildr::CompileTask, '#invoke' do
327
330
  jars; project('jars').task("package").invoke
328
331
  # On my machine the times end up the same, so need to push dependencies in the past.
329
332
  time = Time.now
330
- sources.map { |src| src.pathmap("#{compile_task.target}/%n.class") }.
331
- each { |kls| write kls ; File.utime(time, time, kls) }
333
+ sources.map { |src| src.pathmap("#{compile_task.target}/thepackage/%n.class") }.
334
+ each { |kls| write kls ; File.utime(time - 1, time - 1, kls) }
335
+ File.utime(time - 1, time - 1, project('foo').compile.target.to_s)
332
336
  jars.each { |jar| File.utime(time + 1, time + 1, jar) }
333
337
  lambda { compile_task.from(sources).with(jars).invoke }.should run_task('foo:compile')
334
338
  end
@@ -337,7 +341,7 @@ describe Buildr::CompileTask, '#invoke' do
337
341
  jars; project('jars').task("package").invoke
338
342
  time = Time.now
339
343
  jars.each { |jar| File.utime(time - 1 , time - 1, jar) }
340
- sources.map { |src| File.utime(time, time, src); src.pathmap("#{compile_task.target}/%n.class") }.
344
+ sources.map { |src| File.utime(time, time, src); src.pathmap("#{compile_task.target}/thepackage/%n.class") }.
341
345
  each { |kls| write kls ; File.utime(time, time, kls) }
342
346
  lambda { compile_task.from(sources).with(jars).invoke }.should_not run_task('foo:compile')
343
347
  end
@@ -434,7 +438,7 @@ describe Project, '#compile' do
434
438
  lambda { project('foo').compile.invoke }.should run_task('foo:bar:compile')
435
439
  end
436
440
 
437
- it 'sould be a local task' do
441
+ it 'should be a local task' do
438
442
  write 'bar/src/main/java/Test.java', 'class Test {}'
439
443
  define('foo') { define 'bar' }
440
444
  lambda do
@@ -0,0 +1,33 @@
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 File.join(File.dirname(__FILE__), '../spec_helpers')
18
+
19
+
20
+ describe Buildr::Generate do
21
+
22
+ describe 'Generated buildfile' do
23
+ it 'should be a legal buildfile' do
24
+ File.open('buildfile', 'w') { |file| file.write Generate.from_directory(true).join("\n") }
25
+ lambda { Buildr.application.run }.should_not raise_error
26
+ end
27
+
28
+ it 'should not contain NEXT_VERSION because it was removed in buildr 1.3.3' do
29
+ buildfile = Generate.from_directory(true)
30
+ buildfile.each { |line| line.should_not include('NEXT_VERSION')}
31
+ end
32
+ end
33
+ end
@@ -14,7 +14,7 @@
14
14
  # the License.
15
15
 
16
16
 
17
- require File.join(File.dirname(__FILE__), 'spec_helpers')
17
+ require File.join(File.dirname(__FILE__), '../spec_helpers')
18
18
 
19
19
 
20
20
  describe Project do
@@ -644,6 +644,13 @@ describe Project, '#task' do
644
644
  define('foo') { task('bar') }
645
645
  project('foo').task('bar').name.should eql('foo:bar')
646
646
  end
647
+
648
+ it 'should ignore namespace if starting with color' do
649
+ define 'foo' do
650
+ task(':bar').name.should == 'bar'
651
+ end
652
+ Rake::Task.task_defined?('bar').should be_true
653
+ end
647
654
 
648
655
  it 'should accept single dependency' do
649
656
  define('foo') { task('bar'=>'baz') }
@@ -739,13 +746,9 @@ end
739
746
 
740
747
 
741
748
  describe Rake::Task, 'buildr:initialize' do
742
- it 'should be ready to run as the first task' do
743
- Buildr.application.top_level_tasks.first.should eql('buildr:initialize')
744
- end
745
-
746
749
  it 'should evaluate all project definitions' do
747
750
  defined = false
748
751
  Buildr.define('foo') { defined = true }
749
752
  lambda { task('buildr:initialize').invoke }.should change { defined }.to(true)
750
753
  end
751
- end
754
+ end
@@ -14,7 +14,17 @@
14
14
  # the License.
15
15
 
16
16
 
17
- require File.join(File.dirname(__FILE__), 'spec_helpers')
17
+ require File.join(File.dirname(__FILE__), '../spec_helpers')
18
+
19
+
20
+ module TestHelper
21
+ def touch_last_successful_test_run(test_task, timestamp = Time.now)
22
+ test_task.instance_eval do
23
+ record_successful_run
24
+ File.utime(timestamp, timestamp, last_successful_run_file)
25
+ end
26
+ end
27
+ end
18
28
 
19
29
 
20
30
  describe Buildr::TestTask do
@@ -188,6 +198,12 @@ describe Buildr::TestTask do
188
198
  project('foo').test.dependencies.should include(project('foo').compile.target)
189
199
  end
190
200
 
201
+ it 'should include the main compile target in its dependencies, even when using non standard directories' do
202
+ write 'src/java/Nothing.java', 'class Nothing {}'
203
+ define('foo') { compile path_to('src/java') }
204
+ project('foo').test.dependencies.should include(project('foo').compile.target)
205
+ end
206
+
191
207
  it 'should include the main resources target in its dependencies' do
192
208
  write 'src/main/resources/config.xml'
193
209
  define('foo').test.dependencies.should include(project('foo').resources.target)
@@ -203,6 +219,12 @@ describe Buildr::TestTask do
203
219
  project('foo').test.dependencies.should include(project('foo').test.compile.target)
204
220
  end
205
221
 
222
+ it 'should include the test compile target in its dependencies, even when using non standard directories' do
223
+ write 'src/test/Test.java', 'class Test {}'
224
+ define('foo') { test.compile path_to('src/test') }
225
+ project('foo').test.dependencies.should include(project('foo').test.compile.target)
226
+ end
227
+
206
228
  it 'should add test compile target ahead of regular compile target' do
207
229
  write 'src/main/java/Code.java'
208
230
  write 'src/test/java/Test.java'
@@ -223,6 +245,10 @@ describe Buildr::TestTask do
223
245
  depends = project('foo').test.dependencies
224
246
  depends.index(project('foo').test.resources.target).should < depends.index(project('foo').resources.target)
225
247
  end
248
+
249
+ it 'should not have a last successful run timestamp before the tests are run' do
250
+ test_task.timestamp.should == Rake::EARLY
251
+ end
226
252
 
227
253
  it 'should clean after itself (test files)' do
228
254
  define('foo') { test.compile.using(:javac) }
@@ -244,7 +270,7 @@ describe Buildr::TestTask, 'with no tests' do
244
270
  end
245
271
 
246
272
  it 'should report no failed tests' do
247
- lambda { verbose(true) { define('foo').test.invoke } }.should_not warn_that(/fail/i)
273
+ lambda { verbose(true) { define('foo').test.invoke } }.should_not show_error(/fail/i)
248
274
  end
249
275
 
250
276
  it 'should return no failed tests' do
@@ -284,7 +310,7 @@ describe Buildr::TestTask, 'with passing tests' do
284
310
  end
285
311
 
286
312
  it 'should report no failed tests' do
287
- lambda { verbose(true) { test_task.invoke } }.should_not warn_that(/fail/i)
313
+ lambda { verbose(true) { test_task.invoke } }.should_not show_error(/fail/i)
288
314
  end
289
315
 
290
316
  it 'should return passed tests' do
@@ -300,10 +326,17 @@ describe Buildr::TestTask, 'with passing tests' do
300
326
  it 'should execute teardown task' do
301
327
  lambda { test_task.invoke }.should run_task('foo:test:teardown')
302
328
  end
329
+
330
+ it 'should update the last successful run timestamp' do
331
+ before = Time.now ; test_task.invoke ; after = Time.now
332
+ (before-1..after+1).should include(test_task.timestamp)
333
+ end
303
334
  end
304
335
 
305
336
 
306
337
  describe Buildr::TestTask, 'with failed test' do
338
+ include TestHelper
339
+
307
340
  def test_task
308
341
  @test_task ||= begin
309
342
  define 'foo' do
@@ -322,7 +355,7 @@ describe Buildr::TestTask, 'with failed test' do
322
355
  end
323
356
 
324
357
  it 'should report failed tests' do
325
- lambda { verbose(true) { test_task.invoke rescue nil } }.should warn_that(/FailingTest/)
358
+ lambda { verbose(true) { test_task.invoke rescue nil } }.should show_error(/FailingTest/)
326
359
  end
327
360
 
328
361
  it 'should return failed tests' do
@@ -342,7 +375,7 @@ describe Buildr::TestTask, 'with failed test' do
342
375
 
343
376
  it 'should report failed tests even if fail_on_failure is false' do
344
377
  test_task.using(:fail_on_failure=>false)
345
- lambda { verbose(true) { test_task.invoke } }.should warn_that(/FailingTest/)
378
+ lambda { verbose(true) { test_task.invoke } }.should show_error(/FailingTest/)
346
379
  end
347
380
 
348
381
  it 'should return failed tests even if fail_on_failure is false' do
@@ -353,6 +386,13 @@ describe Buildr::TestTask, 'with failed test' do
353
386
  it 'should execute teardown task' do
354
387
  lambda { test_task.invoke rescue nil }.should run_task('foo:test:teardown')
355
388
  end
389
+
390
+ it 'should not update the last successful run timestamp' do
391
+ a_second_ago = Time.now - 1
392
+ touch_last_successful_test_run test_task, a_second_ago
393
+ test_task.invoke rescue nil
394
+ test_task.timestamp.should <= a_second_ago
395
+ end
356
396
  end
357
397
 
358
398
 
@@ -401,7 +441,7 @@ describe Buildr::Project, '#test' do
401
441
  end
402
442
  end
403
443
 
404
- it 'should clone options from parent project' do
444
+ it 'should clone options from parent project when using #using' do
405
445
  define 'foo' do
406
446
  define 'bar' do
407
447
  test.using :fail_on_failure=>false, :fork=>:each, :properties=>{ :foo=>'bar' }, :environment=>{ 'config'=>'config.yaml' }
@@ -409,9 +449,57 @@ describe Buildr::Project, '#test' do
409
449
  end.invoke
410
450
  test.options[:fail_on_failure].should be_true
411
451
  test.options[:fork].should == :once
412
- test.options[:properties].should be_empty
413
- test.options[:environment].should be_empty
452
+ test.options[:properties].should == {}
453
+ test.options[:environment].should == {}
454
+ end
455
+ end
456
+
457
+ it 'should clone options from parent project when using #options' do
458
+ define 'foo' do
459
+ define 'bar' do
460
+ test.options[:fail_on_failure] = false
461
+ test.options[:fork] = :each
462
+ test.options[:properties][:foo] = 'bar'
463
+ test.options[:environment]['config'] = 'config.yaml'
464
+ test.using :junit
465
+ end.invoke
466
+ test.options[:fail_on_failure].should be_true
467
+ test.options[:fork].should == :once
468
+ test.options[:properties].should == {}
469
+ test.options[:environment].should == {}
470
+ end
471
+ end
472
+
473
+ it 'should accept to set a test property in the top project' do
474
+ define 'foo' do
475
+ test.options[:properties][:foo] = 'bar'
414
476
  end
477
+ project('foo').test.options[:properties][:foo].should == 'bar'
478
+ end
479
+
480
+ it 'should accept to set a test property in a subproject' do
481
+ define 'foo' do
482
+ define 'bar' do
483
+ test.options[:properties][:bar] = 'baz'
484
+ end
485
+ end
486
+ project('foo:bar').test.options[:properties][:bar].should == 'baz'
487
+ end
488
+
489
+ it 'should not change options of unrelated projects when using #options' do
490
+ define 'foo' do
491
+ test.options[:properties][:foo] = 'bar'
492
+ end
493
+ define 'bar' do
494
+ test.options[:properties].should == {}
495
+ end
496
+ end
497
+
498
+ it "should run from project's build task" do
499
+ write 'src/main/java/Foo.java'
500
+ write 'src/test/java/FooTest.java'
501
+ define('foo')
502
+ lambda { task('foo:build').invoke }.should run_task('foo:test')
415
503
  end
416
504
  end
417
505
 
@@ -471,7 +559,7 @@ describe Buildr::Project, '#test.compile' do
471
559
  end
472
560
 
473
561
 
474
- describe Buildr::Project, 'test:resources' do
562
+ describe Buildr::Project, '#test.resources' do
475
563
  it 'should ignore resources unless they exist' do
476
564
  define('foo').test.resources.sources.should be_empty
477
565
  project('foo').test.resources.target.should be_nil
@@ -501,6 +589,99 @@ describe Buildr::Project, 'test:resources' do
501
589
  end
502
590
 
503
591
 
592
+ describe Buildr::TestTask, '#invoke' do
593
+ include TestHelper
594
+
595
+ def test_task
596
+ @test_task ||= define('foo') {
597
+ test.using(:junit)
598
+ test.instance_eval do
599
+ @framework.stub!(:tests).and_return(['PassingTest'])
600
+ @framework.stub!(:run).and_return(['PassingTest'])
601
+ end
602
+ }.test
603
+ end
604
+
605
+ it 'should require dependencies to exist' do
606
+ lambda { test_task.with('no-such.jar').invoke }.should \
607
+ raise_error(RuntimeError, /Don't know how to build/)
608
+ end
609
+
610
+ it 'should run all dependencies as prerequisites' do
611
+ file(File.expand_path('no-such.jar')) { task('prereq').invoke }
612
+ lambda { test_task.with('no-such.jar').invoke }.should run_tasks(['prereq', 'foo:test'])
613
+ end
614
+
615
+ it 'should run tests if they have never run' do
616
+ lambda { test_task.invoke }.should run_task('foo:test')
617
+ end
618
+
619
+ it 'should not run tests if test option is off' do
620
+ Buildr.options.test = false
621
+ lambda { test_task.invoke }.should_not run_task('foo:test')
622
+ end
623
+
624
+ describe 'when there was a successful test run already' do
625
+ before do
626
+ @a_second_ago = Time.now - 1
627
+ src = ['main/java/Foo.java', 'main/resources/config.xml', 'test/java/FooTest.java', 'test/resources/config-test.xml'].map { |f| File.join('src', f) }
628
+ target = ['classes/Foo.class', 'resources/config.xml', 'test/classes/FooTest.class', 'test/resources/config-test.xml'].map { |f| File.join('target', f) }
629
+ files = ['buildfile'] + src + target
630
+ files.each { |file| write file }
631
+ (files + files.map { |file| file.pathmap('%d') }).each { |file| File.utime(@a_second_ago, @a_second_ago, file) }
632
+ touch_last_successful_test_run test_task, @a_second_ago
633
+ end
634
+
635
+ it 'should not run tests if nothing changed' do
636
+ lambda { test_task.invoke }.should_not run_task('foo:test')
637
+ end
638
+
639
+ it 'should run tests if options.test is :all' do
640
+ Buildr.options.test = :all
641
+ lambda { test_task.invoke }.should run_task('foo:test')
642
+ end
643
+
644
+ it 'should run tests if main compile target changed' do
645
+ touch project('foo').compile.target.to_s
646
+ lambda { test_task.invoke }.should run_task('foo:test')
647
+ end
648
+
649
+ it 'should run tests if test compile target changed' do
650
+ touch test_task.compile.target.to_s
651
+ lambda { test_task.invoke }.should run_task('foo:test')
652
+ end
653
+
654
+ it 'should run tests if main resources changed' do
655
+ touch project('foo').resources.target.to_s
656
+ lambda { test_task.invoke }.should run_task('foo:test')
657
+ end
658
+
659
+ it 'should run tests if test resources changed' do
660
+ touch test_task.resources.target.to_s
661
+ lambda { test_task.invoke }.should run_task('foo:test')
662
+ end
663
+
664
+ it 'should run tests if compile-dependent project changed' do
665
+ write 'bar/src/main/java/Bar.java', 'public class Bar {}'
666
+ define('bar', :version=>'1.0', :base_dir=>'bar') { package :jar }
667
+ project('foo').compile.with project('bar')
668
+ lambda { test_task.invoke }.should run_task('foo:test')
669
+ end
670
+
671
+ it 'should run tests if test-dependent project changed' do
672
+ write 'bar/src/main/java/Bar.java', 'public class Bar {}'
673
+ define('bar', :version=>'1.0', :base_dir=>'bar') { package :jar }
674
+ test_task.with project('bar')
675
+ lambda { test_task.invoke }.should run_task('foo:test')
676
+ end
677
+
678
+ it 'should run tests if buildfile changed' do
679
+ touch 'buildfile'
680
+ lambda { test_task.invoke }.should run_task('foo:test')
681
+ end
682
+ end
683
+ end
684
+
504
685
  describe Rake::Task, 'test' do
505
686
  it 'should be recursive' do
506
687
  define('foo') { define 'bar' }
@@ -519,7 +700,7 @@ describe Rake::Task, 'test' do
519
700
  it 'should stop at first failure' do
520
701
  define('foo') { test { fail } }
521
702
  define('bar') { test { fail } }
522
- lambda { task('test').invoke rescue nil }.should run_tasks('bar:test').but_not('foo:test')
703
+ lambda { task('test').invoke rescue nil }.should run_tasks('foo:test').but_not('bar:test')
523
704
  end
524
705
 
525
706
  it 'should ignore failure if options.test is :all' do
@@ -567,6 +748,8 @@ end
567
748
 
568
749
 
569
750
  describe 'test rule' do
751
+ include TestHelper
752
+
570
753
  it 'should execute test task on local project' do
571
754
  define('foo') { define 'bar' }
572
755
  lambda { task('test:something').invoke }.should run_task('foo:test')
@@ -621,22 +804,31 @@ describe 'test rule' do
621
804
  it 'should execute only the named tests' do
622
805
  write 'src/test/java/TestSomething.java',
623
806
  'public class TestSomething extends junit.framework.TestCase { public void testNothing() {} }'
624
- write 'src/test/java/TestFails.java', 'class TestFails {}'
807
+ write 'src/test/java/TestFails.java',
808
+ 'public class TestFails extends junit.framework.TestCase { public void testFailure() { fail(); } }'
625
809
  define 'foo'
626
810
  task('test:Something').invoke
627
811
  end
628
- end
629
-
630
-
631
- describe Rake::Task, 'build' do
632
- it 'should run test task if test option is on' do
633
- Buildr.options.test = true
634
- lambda { task('build').invoke }.should run_tasks('test')
812
+
813
+ it 'should execute the named tests even if the test task is not needed' do
814
+ define 'foo' do
815
+ test.using(:junit)
816
+ test.instance_eval { @framework.stub!(:tests).and_return(['something', 'nothing']) }
817
+ end
818
+ touch_last_successful_test_run project('foo').test
819
+ task('test:something').invoke
820
+ project('foo').test.tests.should include('something')
635
821
  end
636
-
637
- it 'should not run test task if test option is off' do
638
- Buildr.options.test = false
639
- lambda { task('build').invoke }.should_not run_task('test')
822
+
823
+ it 'should not update the last successful test run timestamp' do
824
+ define 'foo' do
825
+ test.using(:junit)
826
+ test.instance_eval { @framework.stub!(:tests).and_return(['something', 'nothing']) }
827
+ end
828
+ a_second_ago = Time.now - 1
829
+ touch_last_successful_test_run project('foo').test, a_second_ago
830
+ task('test:something').invoke
831
+ project('foo').test.timestamp.should <= a_second_ago
640
832
  end
641
833
  end
642
834
 
@@ -668,7 +860,7 @@ describe Buildr::Options, 'test' do
668
860
 
669
861
  it 'should be true and warn for any other value' do
670
862
  ENV['TEST'] = 'funky'
671
- lambda { Buildr.options.test.should be(true) }.should warn_that(/expecting the environment variable/i)
863
+ lambda { Buildr.options.test.should be(true) }.should show_warning(/expecting the environment variable/i)
672
864
  end
673
865
  end
674
866
 
@@ -763,13 +955,13 @@ describe Rake::Task, 'integration' do
763
955
  it 'should run setup task before any project integration tests' do
764
956
  define('foo') { test.using :integration }
765
957
  define('bar') { test.using :integration }
766
- lambda { task('integration').invoke }.should run_tasks([integration.setup, 'bar:test', 'foo:test'])
958
+ lambda { task('integration').invoke }.should run_tasks([integration.setup, 'bar:test'], [integration.setup, 'foo:test'])
767
959
  end
768
960
 
769
961
  it 'should run teardown task after all project integrations tests' do
770
962
  define('foo') { test.using :integration }
771
963
  define('bar') { test.using :integration }
772
- lambda { task('integration').invoke }.should run_tasks(['bar:test', 'foo:test', integration.teardown])
964
+ lambda { task('integration').invoke }.should run_tasks(['bar:test', integration.teardown], ['foo:test', integration.teardown])
773
965
  end
774
966
 
775
967
  it 'should run test cases marked for integration' do
@@ -819,7 +1011,7 @@ describe Rake::Task, 'integration' do
819
1011
  define('bar') { test.using :integration=>false }
820
1012
  end
821
1013
  lambda { task('package').invoke }.should run_tasks(['foo:package', 'foo:test'],
822
- ['foo:bar:build', 'foo:bar:test', 'foo:bar:package'])
1014
+ ['foo:bar:test', 'foo:bar:package'])
823
1015
  end
824
1016
 
825
1017
  it 'should not execute by local package task if test=no' do
@@ -888,10 +1080,12 @@ describe 'integration rule' do
888
1080
  project('foo').test.tests.should_not include('baz')
889
1081
  end
890
1082
 
891
- it 'should execute only the named tasts' do
1083
+ it 'should execute only the named tests' do
892
1084
  write 'src/test/java/TestSomething.java',
893
1085
  'public class TestSomething extends junit.framework.TestCase { public void testNothing() {} }'
894
- write 'src/test/java/TestFails.java', 'class TestFails {}'
1086
+ write 'src/test/java/TestFails.java',
1087
+ 'public class TestFails extends junit.framework.TestCase { public void testFailure() { fail(); } }'
1088
+ define('foo') { test.using :junit, :integration }
895
1089
  task('integration:Something').invoke
896
1090
  end
897
1091
  end