buildr 1.3.1.1-java → 1.3.2-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 (45) hide show
  1. data/CHANGELOG +26 -0
  2. data/NOTICE +3 -5
  3. data/README +1 -0
  4. data/Rakefile +4 -3
  5. data/addon/buildr/nailgun.rb +3 -2
  6. data/addon/buildr/xmlbeans.rb +1 -1
  7. data/buildr.gemspec +7 -7
  8. data/doc/css/syntax.css +40 -31
  9. data/doc/pages/building.textile +0 -1
  10. data/doc/pages/contributing.textile +21 -1
  11. data/doc/pages/download.textile +18 -5
  12. data/doc/pages/getting_started.textile +23 -12
  13. data/doc/pages/index.textile +1 -1
  14. data/doc/pages/packaging.textile +10 -7
  15. data/doc/pages/projects.textile +3 -3
  16. data/doc/pages/whats_new.textile +19 -0
  17. data/doc/scripts/install-jruby.sh +1 -1
  18. data/doc/scripts/install-linux.sh +4 -4
  19. data/lib/buildr.rb +1 -9
  20. data/lib/buildr/core/application.rb +11 -0
  21. data/lib/buildr/core/application_cli.rb +6 -1
  22. data/lib/buildr/core/build.rb +1 -1
  23. data/lib/buildr/core/compile.rb +6 -6
  24. data/lib/buildr/core/project.rb +1 -0
  25. data/lib/buildr/core/test.rb +3 -3
  26. data/lib/buildr/core/transports.rb +4 -2
  27. data/lib/buildr/core/util.rb +2 -0
  28. data/lib/buildr/ide/idea7x.rb +13 -12
  29. data/lib/buildr/java/compilers.rb +2 -4
  30. data/lib/buildr/java/org/apache/buildr/JavaTestFilter.class +0 -0
  31. data/lib/buildr/java/org/apache/buildr/JavaTestFilter.java +4 -1
  32. data/lib/buildr/java/test_frameworks.rb +162 -3
  33. data/rakelib/apache.rake +14 -0
  34. data/rakelib/package.rake +28 -0
  35. data/rakelib/setup.rake +3 -2
  36. data/spec/compile_spec.rb +9 -8
  37. data/spec/java_test_frameworks_spec.rb +19 -0
  38. data/spec/project_spec.rb +12 -0
  39. data/spec/sandbox.rb +4 -0
  40. data/spec/scala_compilers_spec.rb +1 -12
  41. data/spec/scala_test_frameworks_spec.rb +216 -0
  42. data/spec/test_spec.rb +20 -4
  43. data/spec/transport_spec.rb +30 -14
  44. data/spec/version_requirement_spec.rb +5 -1
  45. metadata +23 -9
@@ -21,6 +21,20 @@ require 'sha1'
21
21
  # Tasks specific to Apache projects (license, release, etc).
22
22
  namespace 'apache' do
23
23
 
24
+ desc 'Upload snapshot packages over to people.apache.org'
25
+ task 'snapshot'=>'package' do
26
+ rm_rf 'snapshot' # Always start with empty directory
27
+ puts "Copying existing gems from Apache"
28
+ sh 'rsync', '--progress', '--recursive', 'people.apache.org:public_html/buildr/snapshot', './'
29
+ puts "Copying new gems over"
30
+ cp FileList['pkg/{*.gem,*.tgz,*.zip}'], 'snapshot/gems'
31
+ puts "Generating gem index ..."
32
+ sh 'gem', 'generate_index', '--directory', 'snapshot'
33
+ puts "Copying gem and index back to Apache"
34
+ sh 'rsync', '--progress', '--recursive', 'snapshot', 'people.apache.org:public_html/buildr/'
35
+ end
36
+
37
+
24
38
  desc 'Check that source files contain the Apache license'
25
39
  task 'license' do |task|
26
40
  print 'Checking that files contain the Apache license ... '
@@ -42,3 +42,31 @@ task 'uninstall' do |task|
42
42
  sh *args
43
43
  puts 'Done'
44
44
  end
45
+
46
+
47
+ desc 'Look for new dependencies, check transitive dependencies'
48
+ task 'dependency' do
49
+ # Find if anything has a more recent dependency. These are not errors, just reports.
50
+ for dep in spec.dependencies
51
+ current = Gem::SourceInfoCache.search(dep, true, true).last
52
+ latest = Gem::SourceInfoCache.search(Gem::Dependency.new(dep.name, '>0'), true, true).last
53
+ puts "A new version of #{dep.name} is available, #{latest.version} replaces #{current.version}" if latest.version > current.version
54
+ end
55
+
56
+ # Returns orderd list of transitive dependencies for the given dependency.
57
+ transitive = lambda { |depend|
58
+ dep_spec = Gem::SourceIndex.from_installed_gems.search(depend).last
59
+ dep_spec.dependencies.map { |trans| transitive[trans].push(trans) }.flatten.uniq }
60
+ # For each dependency, make sure *all* its transitive dependencies are listed
61
+ # as a Buildr dependency, and order is preserved.
62
+ spec.dependencies.each_with_index do |dep, index|
63
+ puts "checking #{dep.name}"
64
+ for trans in transitive[dep]
65
+ matching = spec.dependencies.find { |existing| trans =~ existing }
66
+ fail "#{trans} required by #{dep} and missing from spec" unless matching
67
+ fail "#{trans} must come before #{dep} in dependency list" unless spec.dependencies.index(matching) < index
68
+ end
69
+ end
70
+ end
71
+
72
+ task 'stage:check'=>'dependency'
@@ -36,15 +36,16 @@ def which(name)
36
36
  end
37
37
 
38
38
 
39
- def install_gem(name, ver_requirement = nil)
39
+ def install_gem(name, ver_requirement = ['> 0'])
40
40
  dep = Gem::Dependency.new(name, ver_requirement)
41
41
  rb_bin = File.join(Config::CONFIG['bindir'], Config::CONFIG['ruby_install_name'])
42
42
  if Gem::SourceIndex.from_installed_gems.search(dep).empty?
43
43
  spec = Gem::SourceInfoCache.search(dep, true, true).last
44
44
  fail "#{dep} not found in local or remote repository!" unless spec
45
- puts "Installing #{spec} ..."
45
+ puts "Installing #{spec.full_name} ..."
46
46
  args = [rb_bin, '-S', 'gem', 'install', spec.name, '-v', spec.version.to_s]
47
47
  args.unshift('sudo', 'env', 'JAVA_HOME=' + ENV['JAVA_HOME']) unless windows?
48
+ args = args.map{|a| a.inspect}.join(' ') if windows?
48
49
  sh *args
49
50
  end
50
51
  end
@@ -23,19 +23,18 @@ module CompilerHelper
23
23
  end
24
24
 
25
25
  def sources
26
- @sources ||= ['Test1.java', 'Test2.java'].map { |f| File.join('src/java', f) }.
26
+ @sources ||= ['Test1.java', 'Test2.java'].map { |f| File.join('src/main/java', f) }.
27
27
  each { |src| write src, "class #{src.pathmap('%n')} {}" }
28
28
  end
29
29
 
30
30
  def jars
31
31
  @jars ||= begin
32
- write 'src/main/java/Dependency.java', 'class Dependency { }'
33
- define 'jars', :version=>'1.0' do
34
- compile.into('dependency')
32
+ write 'jars/src/main/java/Dependency.java', 'class Dependency { }'
33
+ define 'jars', :version=>'1.0', :base_dir => 'jars' do
35
34
  package(:jar, :id=>'jar1')
36
35
  package(:jar, :id=>'jar2')
37
36
  end
38
- project('jars').packages.each(&:invoke).map(&:to_s)
37
+ project('jars').packages.map(&:to_s)
39
38
  end
40
39
  end
41
40
  end
@@ -188,7 +187,7 @@ describe Buildr::CompileTask, '#dependencies' do
188
187
  end
189
188
 
190
189
  it 'should allow artifacts' do
191
- artifact('group:id:jar:1.0') { |task| mkpath File.dirname(task.to_s) ; cp jars.first.to_s, task.to_s }
190
+ artifact('group:id:jar:1.0') { |task| mkpath File.dirname(task.to_s) ; cp jars.first.to_s, task.to_s }.enhance jars
192
191
  compile_task.from(sources).with('group:id:jar:1.0').into('classes').invoke
193
192
  end
194
193
 
@@ -325,6 +324,7 @@ describe Buildr::CompileTask, '#invoke' do
325
324
  end
326
325
 
327
326
  it 'should force compilation if dependencies newer than compiled' do
327
+ jars; project('jars').task("package").invoke
328
328
  # On my machine the times end up the same, so need to push dependencies in the past.
329
329
  time = Time.now
330
330
  sources.map { |src| src.pathmap("#{compile_task.target}/%n.class") }.
@@ -334,10 +334,11 @@ describe Buildr::CompileTask, '#invoke' do
334
334
  end
335
335
 
336
336
  it 'should not force compilation if dependencies older than compiled' do
337
+ jars; project('jars').task("package").invoke
337
338
  time = Time.now
338
- sources.map { |src| src.pathmap("#{compile_task.target}/%n.class") }.
339
+ 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") }.
339
341
  each { |kls| write kls ; File.utime(time, time, kls) }
340
- jars.each { |jar| File.utime(time - 1, time - 1, jar) }
341
342
  lambda { compile_task.from(sources).with(jars).invoke }.should_not run_task('foo:compile')
342
343
  end
343
344
 
@@ -121,6 +121,25 @@ describe Buildr::JUnit do
121
121
  project('foo').test.tests.should eql(['InnerClassTest'])
122
122
  end
123
123
 
124
+ it 'should ignore abstract classes' do
125
+ write 'src/test/java/AbstractClassTest.java', <<-JAVA
126
+ public abstract class AbstractClassTest extends junit.framework.TestCase {
127
+ public void testNothing() { }
128
+ }
129
+ JAVA
130
+ define('foo').test.invoke
131
+ project('foo').test.tests.should be_empty
132
+ end
133
+
134
+ it 'should ignore classes with no tests in them' do
135
+ write 'src/test/java/NoTests.java', <<-JAVA
136
+ public class NoTests {
137
+ }
138
+ JAVA
139
+ define('foo').test.invoke
140
+ project('foo').test.tests.should be_empty
141
+ end
142
+
124
143
  it 'should pass when JUnit test case passes' do
125
144
  write 'src/test/java/PassingTest.java', <<-JAVA
126
145
  public class PassingTest extends junit.framework.TestCase {
@@ -194,6 +194,18 @@ describe Layout do
194
194
  @layout[:foo, :bar] = 'none'
195
195
  @layout.expand(:foo, :bar).should eql('none')
196
196
  end
197
+
198
+ it 'should map strings to path' do
199
+ @layout[:foo, "bar"] = 'none'
200
+ @layout.expand(:foo, :bar).should eql('none')
201
+ @layout.expand(:foo, 'bar').should eql('none')
202
+ end
203
+
204
+ it 'should ignore nil elements' do
205
+ @layout[:foo, :bar] = 'none'
206
+ @layout.expand(:foo, nil, :bar).should eql('none')
207
+ @layout.expand(nil, :foo).should eql('foo')
208
+ end
197
209
 
198
210
  it 'should return nil if path not mapped' do
199
211
  @layout[:foo].should be_nil
@@ -19,8 +19,12 @@
19
19
  # repository and cache these across test cases.
20
20
  Buildr.application.instance_eval { @rakefile = File.expand_path('buildfile') }
21
21
  repositories.remote << 'http://repo1.maven.org/maven2'
22
+ repositories.remote << 'http://scala-tools.org/repo-releases'
23
+
22
24
  require 'buildr/java/groovyc'
23
25
  Java.load # Anything added to the classpath.
26
+ task('buildr:scala:download').invoke
27
+ Buildr::ScalaTest::ENABLED = true
24
28
  artifacts(TestFramework.frameworks.map(&:dependencies).flatten).each { |a| file(a).invoke }
25
29
 
26
30
  ENV['HOME'] = File.expand_path('tmp/home')
@@ -177,21 +177,11 @@ describe 'scalac compiler options' do
177
177
  scalac_args.should_not include('-optimise')
178
178
  end
179
179
 
180
- it 'should not set source option by default' do
181
- compile_task.options.source.should be_nil
182
- scalac_args.should_not include('-source')
183
- end
184
-
185
180
  it 'should not set target option by default' do
186
181
  compile_task.options.target.should be_nil
187
182
  scalac_args.should_not include('-target')
188
183
  end
189
184
 
190
- it 'should use -source nn argument if source option set' do
191
- compile_task.using(:source=>'1.5')
192
- scalac_args.should include('-source', '1.5')
193
- end
194
-
195
185
  it 'should use -target:xxx argument if target option set' do
196
186
  compile_task.using(:target=>'1.5')
197
187
  scalac_args.should include('-target:jvm-1.5')
@@ -219,13 +209,12 @@ describe 'scalac compiler options' do
219
209
 
220
210
  it 'should inherit options from parent' do
221
211
  define 'foo' do
222
- compile.using(:warnings=>true, :debug=>true, :deprecation=>true, :source=>'1.5', :target=>'1.4')
212
+ compile.using(:warnings=>true, :debug=>true, :deprecation=>true, :target=>'1.4')
223
213
  define 'bar' do
224
214
  compile.using(:scalac)
225
215
  compile.options.warnings.should be_true
226
216
  compile.options.debug.should be_true
227
217
  compile.options.deprecation.should be_true
228
- compile.options.source.should eql('1.5')
229
218
  compile.options.target.should eql('1.4')
230
219
  end
231
220
  end
@@ -0,0 +1,216 @@
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
+ # TODO's
21
+ # -test w/ Specs
22
+ # -test w/ ScalaCheck
23
+ # -failing test
24
+ # -test passing System props
25
+ # -test passing ENV variables
26
+ # -test exclude group
27
+ # -test include Suite's
28
+ # -test exclude Suite's
29
+
30
+
31
+ describe Buildr::ScalaTest do
32
+ it 'should be the default test framework when test cases are in Scala' do
33
+ write 'src/test/scala/com/example/MySuite.scala', <<-SCALA
34
+ package com.example
35
+ import org.scalatest.FunSuite
36
+ class MySuite extends FunSuite {
37
+ test("addition") {
38
+ val sum = 1 + 1
39
+ assert(sum === 2)
40
+ }
41
+ }
42
+ SCALA
43
+ define 'foo'
44
+ project('foo').test.framework.should eql(:scalatest)
45
+ end
46
+
47
+ it 'should be picked if the test language is Scala' do
48
+ define 'foo' do
49
+ test.compile.using(:scalac)
50
+ test.framework.should eql(:scalatest)
51
+ end
52
+ end
53
+
54
+ it 'should include Scalatest dependencies' do
55
+ define('foo') { test.using(:scalatest) }
56
+ project('foo').test.compile.dependencies.should include(*artifacts(ScalaTest::REQUIRES))
57
+ project('foo').test.dependencies.should include(*artifacts(ScalaTest::REQUIRES))
58
+ end
59
+
60
+ it 'should include JMock dependencies' do
61
+ define('foo') { test.using(:scalatest) }
62
+ project('foo').test.compile.dependencies.should include(*artifacts(JMock::REQUIRES))
63
+ project('foo').test.dependencies.should include(*artifacts(JMock::REQUIRES))
64
+ end
65
+
66
+ it 'should include Specs dependencies' do
67
+ define('foo') { test.using(:scalatest) }
68
+ project('foo').test.compile.dependencies.should include(*artifacts(ScalaSpecs::REQUIRES))
69
+ project('foo').test.dependencies.should include(*artifacts(ScalaSpecs::REQUIRES))
70
+ end
71
+
72
+ it 'should include ScalaCheck dependencies' do
73
+ define('foo') { test.using(:scalatest) }
74
+ project('foo').test.compile.dependencies.should include(*artifacts(ScalaCheck::REQUIRES))
75
+ project('foo').test.dependencies.should include(*artifacts(ScalaCheck::REQUIRES))
76
+ end
77
+
78
+ it 'should include public classes extending org.scalatest.FunSuite' do
79
+ write 'src/test/scala/com/example/MySuite.scala', <<-SCALA
80
+ package com.example
81
+ import org.scalatest.FunSuite
82
+ class MySuite extends FunSuite {
83
+ test("addition") {
84
+ val sum = 1 + 1
85
+ assert(sum === 2)
86
+ }
87
+ }
88
+ SCALA
89
+ define('foo').test.invoke
90
+ project('foo').test.tests.should include('com.example.MySuite')
91
+ end
92
+
93
+ it 'should ignore classes not extending org.scalatest.FunSuite' do
94
+ write 'src/test/scala/com/example/NotASuite.scala', <<-SCALA
95
+ package com.example
96
+ class Another {
97
+ }
98
+ SCALA
99
+ define('foo').test.invoke
100
+ project('foo').test.tests.should be_empty
101
+ end
102
+
103
+ it 'should ignore inner classes' do
104
+ write 'src/test/scala/com/example/InnerClassTest.scala', <<-SCALA
105
+ package com.example
106
+ import org.scalatest.FunSuite
107
+ class InnerClassTest extends FunSuite {
108
+ test("addition") {
109
+ val sum = 1 + 1
110
+ assert(sum === 2)
111
+ }
112
+
113
+ class InnerSuite extends FunSuite {
114
+ test("addition") {
115
+ val sum = 1 + 1
116
+ assert(sum === 2)
117
+ }
118
+ }
119
+ }
120
+ SCALA
121
+ define('foo').test.invoke
122
+ project('foo').test.tests.should eql(['com.example.InnerClassTest'])
123
+ end
124
+
125
+ it 'should pass when ScalaTest test case passes' do
126
+ write 'src/test/scala/PassingSuite.scala', <<-SCALA
127
+ class PassingSuite extends org.scalatest.FunSuite {
128
+ test("addition") {
129
+ val sum = 1 + 1
130
+ assert(sum === 2)
131
+ }
132
+ }
133
+ SCALA
134
+ lambda { define('foo').test.invoke }.should_not raise_error
135
+ end
136
+
137
+ it 'should fail when ScalaTest test case fails' do
138
+ write 'src/test/scala/FailingSuite.scala', <<-SCALA
139
+ class FailingSuite extends org.scalatest.FunSuite {
140
+ test("failing") {
141
+ assert(false)
142
+ }
143
+ }
144
+ SCALA
145
+ lambda { define('foo').test.invoke }.should raise_error(RuntimeError, /Tests failed/) rescue nil
146
+ end
147
+
148
+ it 'should report failed test names' do
149
+ write 'src/test/scala/FailingSuite.scala', <<-SCALA
150
+ class FailingSuite extends org.scalatest.FunSuite {
151
+ test("failing") {
152
+ assert(false)
153
+ }
154
+ }
155
+ SCALA
156
+ define('foo').test.invoke rescue
157
+ project('foo').test.failed_tests.should include('FailingSuite')
158
+ end
159
+
160
+ it 'should report to reports/scalatest/TEST-TestSuiteName.txt' do
161
+ write 'src/test/scala/PassingSuite.scala', <<-SCALA
162
+ class PassingSuite extends org.scalatest.FunSuite {
163
+ test("passing") {
164
+ assert(true)
165
+ }
166
+ }
167
+ SCALA
168
+ define 'foo' do
169
+ test.report_to.should be(file('reports/scalatest'))
170
+ end
171
+ project('foo').test.invoke
172
+ project('foo').file('reports/scalatest/TEST-PassingSuite.txt').should exist
173
+ end
174
+
175
+ it 'should pass properties to Suite' do
176
+ write 'src/test/scala/PropertyTestSuite.scala', <<-SCALA
177
+ import org.scalatest._
178
+ class PropertyTestSuite extends FunSuite {
179
+ var properties = Map[String, Any]()
180
+ test("testProperty") {
181
+ assert(properties("name") === "value")
182
+ }
183
+
184
+ protected override def runTests(testName: Option[String], reporter: Reporter, stopper: Stopper,
185
+ includes: Set[String], excludes: Set[String], properties: Map[String, Any]) {
186
+ this.properties = properties;
187
+ super.runTests(testName, reporter, stopper, includes, excludes, properties)
188
+ }
189
+ }
190
+ SCALA
191
+ define('foo').test.using :properties=>{ 'name'=>'value' }
192
+ project('foo').test.invoke
193
+ end
194
+
195
+ it 'should set current directory' do
196
+ mkpath 'baz'
197
+ expected = File.expand_path('baz')
198
+ expected.gsub!('/', '\\') if expected =~ /^[A-Z]:/ # Java returns back slashed paths for windows
199
+ write 'baz/src/test/scala/CurrentDirectoryTestSuite.scala', <<-SCALA
200
+ class CurrentDirectoryTestSuite extends org.scalatest.FunSuite {
201
+ test("testCurrentDirectory") {
202
+ assert("value" === System.getenv("NAME"))
203
+ assert(#{expected.inspect} === new java.io.File(".").getCanonicalPath())
204
+ }
205
+ }
206
+ SCALA
207
+ define 'bar' do
208
+ define 'baz' do
209
+ test.include 'CurrentDirectoryTest'
210
+ end
211
+ end
212
+ project('bar:baz').test.invoke
213
+ end
214
+
215
+ end
216
+
@@ -189,7 +189,7 @@ describe Buildr::TestTask do
189
189
  end
190
190
 
191
191
  it 'should include the main resources target in its dependencies' do
192
- write 'src/main/resources/test'
192
+ write 'src/main/resources/config.xml'
193
193
  define('foo').test.dependencies.should include(project('foo').resources.target)
194
194
  end
195
195
 
@@ -203,11 +203,27 @@ describe Buildr::TestTask do
203
203
  project('foo').test.dependencies.should include(project('foo').test.compile.target)
204
204
  end
205
205
 
206
+ it 'should add test compile target ahead of regular compile target' do
207
+ write 'src/main/java/Code.java'
208
+ write 'src/test/java/Test.java'
209
+ define 'foo'
210
+ depends = project('foo').test.dependencies
211
+ depends.index(project('foo').test.compile.target).should < depends.index(project('foo').compile.target)
212
+ end
213
+
206
214
  it 'should include the test resources target in its dependencies' do
207
- write 'src/test/resources/test'
215
+ write 'src/test/resources/config.xml'
208
216
  define('foo').test.dependencies.should include(project('foo').test.resources.target)
209
217
  end
210
218
 
219
+ it 'should add test resource target ahead of regular resource target' do
220
+ write 'src/main/resources/config.xml'
221
+ write 'src/test/resources/config.xml'
222
+ define 'foo'
223
+ depends = project('foo').test.dependencies
224
+ depends.index(project('foo').test.resources.target).should < depends.index(project('foo').resources.target)
225
+ end
226
+
211
227
  it 'should clean after itself (test files)' do
212
228
  define('foo') { test.compile.using(:javac) }
213
229
  mkpath project('foo').test.compile.target.to_s
@@ -467,9 +483,9 @@ describe Buildr::Project, 'test:resources' do
467
483
  end
468
484
 
469
485
  it 'should copy to the resources target directory' do
470
- write 'src/test/resources/foo', 'Foo'
486
+ write 'src/test/resources/config.xml', '</xml>'
471
487
  define('foo', :target=>'targeted').test.invoke
472
- file('targeted/test/resources/foo').should contain('Foo')
488
+ file('targeted/test/resources/config.xml').should contain('</xml>')
473
489
  end
474
490
 
475
491
  it 'should create target directory even if no files to copy' do