novoda-buildr 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (187) hide show
  1. data/CHANGELOG +1050 -0
  2. data/LICENSE +176 -0
  3. data/NOTICE +26 -0
  4. data/README.rdoc +134 -0
  5. data/Rakefile +45 -0
  6. data/_buildr +29 -0
  7. data/_jbuildr +29 -0
  8. data/addon/buildr/antlr.rb +65 -0
  9. data/addon/buildr/cobertura.rb +22 -0
  10. data/addon/buildr/drb.rb +281 -0
  11. data/addon/buildr/emma.rb +22 -0
  12. data/addon/buildr/hibernate.rb +142 -0
  13. data/addon/buildr/javacc.rb +85 -0
  14. data/addon/buildr/jdepend.rb +60 -0
  15. data/addon/buildr/jetty.rb +248 -0
  16. data/addon/buildr/jibx.rb +86 -0
  17. data/addon/buildr/nailgun.rb +221 -0
  18. data/addon/buildr/openjpa.rb +90 -0
  19. data/addon/buildr/org/apache/buildr/BuildrNail$Main.class +0 -0
  20. data/addon/buildr/org/apache/buildr/BuildrNail.class +0 -0
  21. data/addon/buildr/org/apache/buildr/BuildrNail.java +41 -0
  22. data/addon/buildr/org/apache/buildr/JettyWrapper$1.class +0 -0
  23. data/addon/buildr/org/apache/buildr/JettyWrapper$BuildrHandler.class +0 -0
  24. data/addon/buildr/org/apache/buildr/JettyWrapper.class +0 -0
  25. data/addon/buildr/org/apache/buildr/JettyWrapper.java +144 -0
  26. data/addon/buildr/xmlbeans.rb +93 -0
  27. data/bin/buildr +19 -0
  28. data/buildr.buildfile +58 -0
  29. data/buildr.gemspec +65 -0
  30. data/doc/_config.yml +1 -0
  31. data/doc/_layouts/default.html +88 -0
  32. data/doc/_layouts/preface.html +22 -0
  33. data/doc/artifacts.textile +211 -0
  34. data/doc/building.textile +245 -0
  35. data/doc/contributing.textile +252 -0
  36. data/doc/css/default.css +236 -0
  37. data/doc/css/print.css +101 -0
  38. data/doc/css/syntax.css +23 -0
  39. data/doc/download.textile +90 -0
  40. data/doc/extending.textile +205 -0
  41. data/doc/images/1442160941-frontcover.jpg +0 -0
  42. data/doc/images/asf-logo.gif +0 -0
  43. data/doc/images/asf-logo.png +0 -0
  44. data/doc/images/buildr-hires.png +0 -0
  45. data/doc/images/buildr.png +0 -0
  46. data/doc/images/favicon.png +0 -0
  47. data/doc/images/growl-icon.tiff +0 -0
  48. data/doc/images/note.png +0 -0
  49. data/doc/images/project-structure.png +0 -0
  50. data/doc/images/tip.png +0 -0
  51. data/doc/images/zbuildr.png +0 -0
  52. data/doc/images/zbuildr.tif +0 -0
  53. data/doc/index.textile +69 -0
  54. data/doc/installing.textile +265 -0
  55. data/doc/languages.textile +459 -0
  56. data/doc/mailing_lists.textile +25 -0
  57. data/doc/more_stuff.textile +457 -0
  58. data/doc/packaging.textile +429 -0
  59. data/doc/preface.textile +54 -0
  60. data/doc/projects.textile +276 -0
  61. data/doc/quick_start.textile +210 -0
  62. data/doc/scripts/buildr-git.rb +512 -0
  63. data/doc/scripts/gitflow.rb +296 -0
  64. data/doc/scripts/install-jruby.sh +44 -0
  65. data/doc/scripts/install-linux.sh +72 -0
  66. data/doc/scripts/install-osx.sh +52 -0
  67. data/doc/settings_profiles.textile +287 -0
  68. data/doc/testing.textile +233 -0
  69. data/etc/KEYS +151 -0
  70. data/lib/buildr.rb +36 -0
  71. data/lib/buildr/core.rb +35 -0
  72. data/lib/buildr/core/application.rb +662 -0
  73. data/lib/buildr/core/build.rb +463 -0
  74. data/lib/buildr/core/checks.rb +254 -0
  75. data/lib/buildr/core/common.rb +150 -0
  76. data/lib/buildr/core/compile.rb +608 -0
  77. data/lib/buildr/core/environment.rb +129 -0
  78. data/lib/buildr/core/filter.rb +363 -0
  79. data/lib/buildr/core/generate.rb +195 -0
  80. data/lib/buildr/core/help.rb +119 -0
  81. data/lib/buildr/core/osx.rb +46 -0
  82. data/lib/buildr/core/progressbar.rb +156 -0
  83. data/lib/buildr/core/project.rb +971 -0
  84. data/lib/buildr/core/shell.rb +198 -0
  85. data/lib/buildr/core/test.rb +774 -0
  86. data/lib/buildr/core/transports.rb +559 -0
  87. data/lib/buildr/core/util.rb +449 -0
  88. data/lib/buildr/groovy.rb +19 -0
  89. data/lib/buildr/groovy/bdd.rb +106 -0
  90. data/lib/buildr/groovy/compiler.rb +138 -0
  91. data/lib/buildr/groovy/shell.rb +48 -0
  92. data/lib/buildr/ide.rb +19 -0
  93. data/lib/buildr/ide/eclipse.rb +424 -0
  94. data/lib/buildr/ide/eclipse.rb~ +424 -0
  95. data/lib/buildr/ide/eclipse/java.rb +53 -0
  96. data/lib/buildr/ide/eclipse/plugin.rb +71 -0
  97. data/lib/buildr/ide/eclipse/scala.rb +68 -0
  98. data/lib/buildr/ide/idea.ipr.template +300 -0
  99. data/lib/buildr/ide/idea.rb +190 -0
  100. data/lib/buildr/ide/idea7x.ipr.template +290 -0
  101. data/lib/buildr/ide/idea7x.rb +212 -0
  102. data/lib/buildr/java.rb +23 -0
  103. data/lib/buildr/java/ant.rb +94 -0
  104. data/lib/buildr/java/bdd.rb +464 -0
  105. data/lib/buildr/java/cobertura.rb +274 -0
  106. data/lib/buildr/java/commands.rb +217 -0
  107. data/lib/buildr/java/compiler.rb +349 -0
  108. data/lib/buildr/java/deprecated.rb +141 -0
  109. data/lib/buildr/java/emma.rb +244 -0
  110. data/lib/buildr/java/jruby.rb +117 -0
  111. data/lib/buildr/java/jtestr_runner.rb.erb +118 -0
  112. data/lib/buildr/java/org/apache/buildr/JavaTestFilter.class +0 -0
  113. data/lib/buildr/java/org/apache/buildr/JavaTestFilter.java +142 -0
  114. data/lib/buildr/java/packaging.rb +717 -0
  115. data/lib/buildr/java/pom.rb +174 -0
  116. data/lib/buildr/java/rjb.rb +155 -0
  117. data/lib/buildr/java/test_result.rb +327 -0
  118. data/lib/buildr/java/tests.rb +341 -0
  119. data/lib/buildr/java/version_requirement.rb +172 -0
  120. data/lib/buildr/packaging.rb +24 -0
  121. data/lib/buildr/packaging/archive.rb +491 -0
  122. data/lib/buildr/packaging/artifact.rb +750 -0
  123. data/lib/buildr/packaging/artifact_namespace.rb +980 -0
  124. data/lib/buildr/packaging/artifact_search.rb +140 -0
  125. data/lib/buildr/packaging/gems.rb +106 -0
  126. data/lib/buildr/packaging/package.rb +241 -0
  127. data/lib/buildr/packaging/tar.rb +186 -0
  128. data/lib/buildr/packaging/version_requirement.rb +172 -0
  129. data/lib/buildr/packaging/zip.rb +73 -0
  130. data/lib/buildr/packaging/ziptask.rb +316 -0
  131. data/lib/buildr/resources/buildr.icns +0 -0
  132. data/lib/buildr/scala.rb +25 -0
  133. data/lib/buildr/scala/bdd.rb +114 -0
  134. data/lib/buildr/scala/compiler.rb +196 -0
  135. data/lib/buildr/scala/org/apache/buildr/SpecsSingletonRunner$.class +0 -0
  136. data/lib/buildr/scala/org/apache/buildr/SpecsSingletonRunner.class +0 -0
  137. data/lib/buildr/scala/org/apache/buildr/SpecsSingletonRunner.scala +35 -0
  138. data/lib/buildr/scala/shell.rb +60 -0
  139. data/lib/buildr/scala/tests.rb +157 -0
  140. data/lib/buildr/shell.rb +180 -0
  141. data/rakelib/all-in-one.rake +84 -0
  142. data/rakelib/checks.rake +57 -0
  143. data/rakelib/doc.rake +92 -0
  144. data/rakelib/jekylltask.rb +120 -0
  145. data/rakelib/package.rake +73 -0
  146. data/rakelib/release.rake +152 -0
  147. data/rakelib/rspec.rake +73 -0
  148. data/rakelib/setup.rake +54 -0
  149. data/rakelib/stage.rake +214 -0
  150. data/spec/addon/drb_spec.rb +328 -0
  151. data/spec/core/application_spec.rb +509 -0
  152. data/spec/core/build_spec.rb +678 -0
  153. data/spec/core/checks_spec.rb +519 -0
  154. data/spec/core/common_spec.rb +670 -0
  155. data/spec/core/compile_spec.rb +624 -0
  156. data/spec/core/extension_spec.rb +201 -0
  157. data/spec/core/generate_spec.rb +33 -0
  158. data/spec/core/project_spec.rb +762 -0
  159. data/spec/core/test_spec.rb +1175 -0
  160. data/spec/core/transport_spec.rb +537 -0
  161. data/spec/core/util_spec.rb +67 -0
  162. data/spec/groovy/bdd_spec.rb +80 -0
  163. data/spec/groovy/compiler_spec.rb +240 -0
  164. data/spec/ide/eclipse_spec.rb +650 -0
  165. data/spec/ide/idea7x_spec.rb +84 -0
  166. data/spec/java/ant_spec.rb +33 -0
  167. data/spec/java/bdd_spec.rb +379 -0
  168. data/spec/java/cobertura_spec.rb +85 -0
  169. data/spec/java/compiler_spec.rb +446 -0
  170. data/spec/java/emma_spec.rb +119 -0
  171. data/spec/java/java_spec.rb +124 -0
  172. data/spec/java/packaging_spec.rb +1140 -0
  173. data/spec/java/test_coverage_helper.rb +257 -0
  174. data/spec/java/tests_spec.rb +493 -0
  175. data/spec/packaging/archive_spec.rb +538 -0
  176. data/spec/packaging/artifact_namespace_spec.rb +697 -0
  177. data/spec/packaging/artifact_spec.rb +802 -0
  178. data/spec/packaging/packaging_helper.rb +63 -0
  179. data/spec/packaging/packaging_spec.rb +684 -0
  180. data/spec/sandbox.rb +148 -0
  181. data/spec/scala/bdd_spec.rb +119 -0
  182. data/spec/scala/compiler_spec.rb +284 -0
  183. data/spec/scala/scala.rb +38 -0
  184. data/spec/scala/tests_spec.rb +263 -0
  185. data/spec/spec_helpers.rb +340 -0
  186. data/spec/version_requirement_spec.rb +143 -0
  187. metadata +384 -0
@@ -0,0 +1,119 @@
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__), 'test_coverage_helper')
18
+ Sandbox.require_optional_extension 'buildr/java/emma'
19
+ artifacts(Buildr::Emma::dependencies).map(&:invoke)
20
+
21
+
22
+ describe Buildr::Emma do
23
+ before do
24
+ # Reloading the extension because the sandbox removes all its actions
25
+ Buildr.module_eval { remove_const :Emma }
26
+ load File.expand_path('../lib/buildr/java/emma.rb')
27
+ @tool_module = Buildr::Emma
28
+ end
29
+
30
+ it_should_behave_like 'test coverage tool'
31
+
32
+ describe 'project-specific' do
33
+ describe 'metadata file' do
34
+ it 'should have a default value' do
35
+ define('foo').emma.metadata_file.should point_to_path('reports/emma/coverage.em')
36
+ end
37
+
38
+ it 'should be overridable' do
39
+ define('foo') { emma.metadata_file = path_to('target/metadata.emma') }
40
+ project('foo').emma.metadata_file.should point_to_path('target/metadata.emma')
41
+ end
42
+
43
+ it 'should be created during instrumentation' do
44
+ write 'src/main/java/Foo.java', 'public class Foo {}'
45
+ define('foo')
46
+ task('foo:emma:instrument').invoke
47
+ file(project('foo').emma.metadata_file).should exist
48
+ end
49
+ end
50
+
51
+ describe 'coverage file' do
52
+ it 'should have a default value' do
53
+ define('foo').emma.coverage_file.should point_to_path('reports/emma/coverage.ec')
54
+ end
55
+
56
+ it 'should be overridable' do
57
+ define('foo') { emma.coverage_file = path_to('target/coverage.emma') }
58
+ project('foo').emma.coverage_file.should point_to_path('target/coverage.emma')
59
+ end
60
+
61
+ it 'should be created during test' do
62
+ write 'src/main/java/Foo.java', 'public class Foo {}'
63
+ write_test :for=>'Foo', :in=>'src/test/java'
64
+ define('foo')
65
+ task('foo:test').invoke
66
+ file(project('foo').emma.coverage_file).should exist
67
+ end
68
+ end
69
+
70
+ describe 'instrumentation' do
71
+ before do
72
+ ['Foo', 'Bar'].each { |cls| write File.join('src/main/java', "#{cls}.java"), "public class #{cls} {}" }
73
+ end
74
+
75
+ it 'should instrument only included classes' do
76
+ define('foo') { emma.include 'Foo' }
77
+ task("foo:emma:instrument").invoke
78
+ Dir.chdir('target/instrumented/classes') { Dir.glob('*').sort.should == ['Foo.class'] }
79
+ end
80
+
81
+ it 'should not instrument excluded classes' do
82
+ define('foo') { emma.exclude 'Foo' }
83
+ task("foo:emma:instrument").invoke
84
+ Dir.chdir('target/instrumented/classes') { Dir.glob('*').sort.should == ['Bar.class'] }
85
+ end
86
+
87
+ it 'should instrument classes that are included but not excluded' do
88
+ write 'src/main/java/Baz.java', 'public class Baz {}'
89
+ define('foo') { emma.include('Ba*').exclude('*ar') }
90
+ task("foo:emma:instrument").invoke
91
+ Dir.chdir('target/instrumented/classes') { Dir.glob('*').sort.should == ['Baz.class'] }
92
+ end
93
+ end
94
+
95
+ describe 'reports' do
96
+ before do
97
+ write 'src/main/java/Foo.java', 'public class Foo {}'
98
+ write_test :for=>'Foo', :in=>'src/test/java'
99
+ end
100
+
101
+ describe 'in html' do
102
+ it 'should inform the user if no coverage data' do
103
+ rm 'src/test/java/FooTest.java'
104
+ define('foo')
105
+ lambda { task('foo:emma:html').invoke }.
106
+ should show_info(/No test coverage report for foo. Missing: #{project('foo').emma.coverage_file}/)
107
+ end
108
+ end
109
+
110
+ describe 'in xml' do
111
+ it 'should have an xml file' do
112
+ define('foo')
113
+ task('foo:emma:xml').invoke
114
+ file(File.join(project('foo').emma.report_dir, 'coverage.xml')).should exist
115
+ end
116
+ end
117
+ end
118
+ end
119
+ end
@@ -0,0 +1,124 @@
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
+ unless RUBY_PLATFORM =~ /java/
21
+ describe ENV, 'JAVA_HOME on OS X' do
22
+ before do
23
+ @old_home, ENV['JAVA_HOME'] = ENV['JAVA_HOME'], nil
24
+ @old_env_java = Object.module_eval { remove_const :ENV_JAVA }
25
+ Config::CONFIG.should_receive(:[]).with('host_os').and_return('darwin0.9')
26
+ end
27
+
28
+ it 'should point to default JVM' do
29
+ load File.expand_path('../lib/buildr/java/rjb.rb')
30
+ ENV['JAVA_HOME'].should == '/System/Library/Frameworks/JavaVM.framework/Home'
31
+ end
32
+
33
+ it 'should use value of environment variable if specified' do
34
+ ENV['JAVA_HOME'] = '/System/Library/Frameworks/JavaVM.specified'
35
+ load File.expand_path('../lib/buildr/java/rjb.rb')
36
+ ENV['JAVA_HOME'].should == '/System/Library/Frameworks/JavaVM.specified'
37
+ end
38
+
39
+ after do
40
+ ENV['JAVA_HOME'] = @old_home
41
+ ENV_JAVA.replace @old_env_java
42
+ end
43
+ end
44
+ end
45
+
46
+
47
+ describe Java, '#tools_jar' do
48
+ before do
49
+ @old_home = ENV['JAVA_HOME']
50
+ end
51
+
52
+ describe 'when JAVA_HOME points to a JDK' do
53
+ before do
54
+ Java.instance_eval { @tools_jar = nil }
55
+ write 'jdk/lib/tools.jar'
56
+ ENV['JAVA_HOME'] = File.expand_path('jdk')
57
+ end
58
+
59
+ it 'should return the path to tools.jar' do
60
+ Java.tools_jar.should point_to_path('jdk/lib/tools.jar')
61
+ end
62
+ end
63
+
64
+ describe 'when JAVA_HOME points to a JRE inside a JDK' do
65
+ before do
66
+ Java.instance_eval { @tools_jar = nil }
67
+ write 'jdk/lib/tools.jar'
68
+ ENV['JAVA_HOME'] = File.expand_path('jdk/jre')
69
+ end
70
+
71
+ it 'should return the path to tools.jar' do
72
+ Java.tools_jar.should point_to_path('jdk/lib/tools.jar')
73
+ end
74
+ end
75
+
76
+ describe 'when there is no tools.jar' do
77
+ before do
78
+ Java.instance_eval { @tools_jar = nil }
79
+ ENV['JAVA_HOME'] = File.expand_path('jdk')
80
+ end
81
+
82
+ it 'should return nil' do
83
+ Java.tools_jar.should be_nil
84
+ end
85
+ end
86
+
87
+ after do
88
+ ENV['JAVA_HOME'] = @old_home
89
+ end
90
+ end
91
+
92
+ describe Java, '#java' do
93
+ before do
94
+ @old_home = ENV['JAVA_HOME']
95
+ end
96
+
97
+ describe 'when JAVA_HOME points to an invalid JRE/JDK installation' do
98
+ before do
99
+ write 'jdk'
100
+ ENV['JAVA_HOME'] = File.expand_path('jdk')
101
+ end
102
+
103
+ it 'should fail with an error message mentioning JAVA_HOME' do
104
+ begin
105
+ Java.java ['-version']
106
+ fail 'Java.java did not fail with JAVA_HOME pointing to invalid JRE/JDK installation'
107
+ rescue => error
108
+ error.message.to_s.should match(/JAVA_HOME/)
109
+ end
110
+ end
111
+ end
112
+
113
+ after do
114
+ ENV['JAVA_HOME'] = @old_home
115
+ end
116
+ end
117
+
118
+
119
+ describe Java::JavaWrapper do
120
+ it 'should be removed in version 1.5 since it was deprecated in version 1.3' do
121
+ Buildr::VERSION.should < '1.5'
122
+ lambda { Java::JavaWrapper }.should_not raise_error
123
+ end
124
+ end
@@ -0,0 +1,1140 @@
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
+ require File.join(File.dirname(__FILE__), '../packaging/packaging_helper')
19
+
20
+
21
+ describe Project, '#manifest' do
22
+ it 'should include user name' do
23
+ ENV['USER'] = 'MysteriousJoe'
24
+ define('foo').manifest['Build-By'].should eql('MysteriousJoe')
25
+ end
26
+
27
+ it 'should include JDK version' do
28
+ define('foo').manifest['Build-Jdk'].should =~ /^1\.\d+\.\w+$/
29
+ end
30
+
31
+ it 'should include project comment' do
32
+ desc 'My Project'
33
+ define('foo').manifest['Implementation-Title'].should eql('My Project')
34
+ end
35
+
36
+ it 'should include project name if no comment' do
37
+ define('foo').manifest['Implementation-Title'].should eql('foo')
38
+ end
39
+
40
+ it 'should include project version' do
41
+ define('foo', :version=>'2.1').manifest['Implementation-Version'].should eql('2.1')
42
+ end
43
+
44
+ it 'should not include project version unless specified' do
45
+ define('foo').manifest['Implementation-Version'].should be_nil
46
+ end
47
+
48
+ it 'should inherit from parent project' do
49
+ define('foo', :version=>'2.1') { define 'bar' }
50
+ project('foo:bar').manifest['Implementation-Version'].should eql('2.1')
51
+ end
52
+
53
+ end
54
+
55
+
56
+ shared_examples_for 'package with manifest' do
57
+ before do
58
+ @long_line = 'No line may be longer than 72 bytes (not characters), in its UTF8-encoded form. If a value would make the initial line longer than this, it should be continued on extra lines (each starting with a single SPACE).'
59
+ end
60
+
61
+ def package_with_manifest(manifest = nil)
62
+ packaging = @packaging
63
+ @project = define('foo', :version=>'1.2') do
64
+ package packaging
65
+ package(packaging).with(:manifest=>manifest) unless manifest.nil?
66
+ end
67
+ end
68
+
69
+ def inspect_manifest(package = nil)
70
+ package ||= project('foo').package(@packaging)
71
+ package.invoke
72
+ yield Buildr::Packaging::Java::Manifest.from_zip(package)
73
+ end
74
+
75
+ it 'should include default header when no options specified' do
76
+ ENV['USER'] = 'MysteriousJoe'
77
+ package_with_manifest # Nothing for default.
78
+ inspect_manifest do |manifest|
79
+ manifest.sections.size.should be(1)
80
+ manifest.main.should == {
81
+ 'Manifest-Version' =>'1.0',
82
+ 'Created-By' =>'Buildr',
83
+ 'Implementation-Title' =>@project.name,
84
+ 'Implementation-Version' =>'1.2',
85
+ 'Build-Jdk' =>ENV_JAVA['java.version'],
86
+ 'Build-By' =>'MysteriousJoe'
87
+ }
88
+ end
89
+ end
90
+
91
+ it 'should not exist when manifest=false' do
92
+ package_with_manifest false
93
+ @project.package(@packaging).invoke
94
+ Zip::ZipFile.open(@project.package(@packaging).to_s) do |zip|
95
+ zip.file.exist?('META-INF/MANIFEST.MF').should be_false
96
+ end
97
+ end
98
+
99
+ it 'should generate a new manifest for a file that does not have one' do
100
+ Zip::ZipOutputStream.open 'tmp.zip' do |zip|
101
+ zip.put_next_entry 'empty.txt'
102
+ end
103
+ begin
104
+ manifest = Buildr::Packaging::Java::Manifest.from_zip('tmp.zip')
105
+ manifest.each do |key, val|
106
+ Buildr::Packaging::Java::Manifest::STANDARD_HEADER.should include(key)
107
+ end
108
+ ensure
109
+ rm 'tmp.zip'
110
+ end
111
+ end
112
+
113
+ it 'should map manifest from hash' do
114
+ package_with_manifest 'Foo'=>1, :bar=>'Bar'
115
+ inspect_manifest do |manifest|
116
+ manifest.sections.size.should be(1)
117
+ manifest.main['Manifest-Version'].should eql('1.0')
118
+ manifest.main['Created-By'].should eql('Buildr')
119
+ manifest.main['Foo'].should eql('1')
120
+ manifest.main['bar'].should eql('Bar')
121
+ end
122
+ end
123
+
124
+ it 'should end hash manifest with EOL' do
125
+ package_with_manifest 'Foo'=>1, :bar=>'Bar'
126
+ package = project('foo').package(@packaging)
127
+ package.invoke
128
+ Zip::ZipFile.open(package.to_s) { |zip| zip.file.read('META-INF/MANIFEST.MF').should =~ /#{Buildr::Packaging::Java::Manifest::LINE_SEPARATOR}$/ }
129
+ end
130
+
131
+ it 'should break hash manifest lines longer than 72 characters using continuations' do
132
+ package_with_manifest 'foo'=>@long_line
133
+ package = project('foo').package(@packaging)
134
+ inspect_manifest do |manifest|
135
+ manifest.main['foo'].should == @long_line
136
+ end
137
+ end
138
+
139
+ it 'should map manifest from array' do
140
+ package_with_manifest [ { :foo=>'first' }, { :bar=>'second' } ]
141
+ inspect_manifest do |manifest|
142
+ manifest.sections.size.should be(2)
143
+ manifest.main['Manifest-Version'].should eql('1.0')
144
+ manifest.main['foo'].should eql('first')
145
+ manifest.sections.last['bar'].should eql('second')
146
+ end
147
+ end
148
+
149
+ it 'should end array manifest with EOL' do
150
+ package_with_manifest [ { :foo=>'first' }, { :bar=>'second' } ]
151
+ package = project('foo').package(@packaging)
152
+ package.invoke
153
+ Zip::ZipFile.open(package.to_s) { |zip| zip.file.read('META-INF/MANIFEST.MF')[-1].should == ?\n }
154
+ end
155
+
156
+ it 'should break array manifest lines longer than 72 characters using continuations' do
157
+ package_with_manifest ['foo'=>@long_line]
158
+ package = project('foo').package(@packaging)
159
+ inspect_manifest do |manifest|
160
+ manifest.main['foo'].should == @long_line
161
+ end
162
+ end
163
+
164
+ it 'should put Name: at beginning of section' do
165
+ package_with_manifest [ {}, { 'Name'=>'first', :Foo=>'first', :bar=>'second' } ]
166
+ package = project('foo').package(@packaging)
167
+ package.invoke
168
+ inspect_manifest do |manifest|
169
+ manifest.sections[1]["Name"].should == "first"
170
+ end
171
+ end
172
+
173
+ it 'should create manifest from proc' do
174
+ package_with_manifest lambda { 'Meta: data' }
175
+ inspect_manifest do |manifest|
176
+ manifest.sections.size.should be(1)
177
+ manifest.main['Manifest-Version'].should eql('1.0')
178
+ manifest.main['Meta'].should eql('data')
179
+ end
180
+ end
181
+
182
+ it 'should create manifest from file' do
183
+ write 'MANIFEST.MF', 'Meta: data'
184
+ package_with_manifest 'MANIFEST.MF'
185
+ inspect_manifest do |manifest|
186
+ manifest.sections.size.should be(1)
187
+ manifest.main['Meta'].should eql('data')
188
+ end
189
+ end
190
+
191
+ it 'should not add manifest version twice' do
192
+ write 'MANIFEST.MF', 'Manifest-Version: 1.9'
193
+ package_with_manifest 'MANIFEST.MF'
194
+ package ||= project('foo').package(@packaging)
195
+ package.invoke
196
+ Zip::ZipFile.open(package.to_s) do |zip|
197
+ zip.read('META-INF/MANIFEST.MF').scan(/(Manifest-Version)/m).size.should == 1
198
+ end
199
+ end
200
+
201
+ it 'should give precedence to version specified in manifest file' do
202
+ write 'MANIFEST.MF', 'Manifest-Version: 1.9'
203
+ package_with_manifest 'MANIFEST.MF'
204
+ inspect_manifest do |manifest|
205
+ manifest.main['Manifest-Version'].should == '1.9'
206
+ end
207
+ end
208
+
209
+ it 'should create manifest from task' do
210
+ file 'MANIFEST.MF' do |task|
211
+ write task.to_s, 'Meta: data'
212
+ end
213
+ package_with_manifest 'MANIFEST.MF'
214
+ inspect_manifest do |manifest|
215
+ manifest.sections.size.should be(1)
216
+ manifest.main['Manifest-Version'].should eql('1.0')
217
+ manifest.main['Meta'].should eql('data')
218
+ end
219
+ end
220
+
221
+ it 'should respond to with() and accept manifest' do
222
+ write 'DISCLAIMER'
223
+ mkpath 'target/classes'
224
+ packaging = @packaging
225
+ define('foo', :version=>'1.0') { package(packaging).with :manifest=>{'Foo'=>'data'} }
226
+ inspect_manifest { |manifest| manifest.main['Foo'].should eql('data') }
227
+ end
228
+
229
+ it 'should include META-INF directory' do
230
+ packaging = @packaging
231
+ package = define('foo', :version=>'1.0') { package(packaging) }.packages.first
232
+ package.invoke
233
+ Zip::ZipFile.open(package.to_s) do |zip|
234
+ zip.entries.map(&:to_s).should include('META-INF/')
235
+ end
236
+ end
237
+
238
+ it 'should inherit manifest from parent project' do
239
+ packaging = @packaging
240
+ package = nil
241
+ define('foo', :version => '1.0') do
242
+ manifest['Foo'] = '1'
243
+ package(packaging)
244
+ define('bar', :version => '1.0') do
245
+ manifest['bar'] = 'Bar'
246
+ package(:jar)
247
+ package = packages.first
248
+ end
249
+ end
250
+ inspect_manifest(package) do |manifest|
251
+ manifest.sections.size.should be(1)
252
+ manifest.main['Manifest-Version'].should eql('1.0')
253
+ manifest.main['Created-By'].should eql('Buildr')
254
+ manifest.main['Foo'].should eql('1')
255
+ manifest.main['bar'].should eql('Bar')
256
+ end
257
+ end
258
+
259
+ it 'should not modify manifest of parent project' do
260
+ packaging = @packaging
261
+ define('foo', :version => '1.0') do
262
+ manifest['Foo'] = '1'
263
+ package(packaging)
264
+ define('bar', :version => '1.0') do
265
+ manifest['bar'] = 'Bar'
266
+ package(:jar)
267
+ end
268
+ define('baz', :version => '1.0') do
269
+ manifest['baz'] = 'Baz'
270
+ package(:jar)
271
+ end
272
+ end
273
+ inspect_manifest(project('foo').packages.first) do |manifest|
274
+ manifest.sections.size.should be(1)
275
+ manifest.main['Manifest-Version'].should eql('1.0')
276
+ manifest.main['Created-By'].should eql('Buildr')
277
+ manifest.main['Foo'].should eql('1')
278
+ manifest.main['bar'].should be_nil
279
+ manifest.main['baz'].should be_nil
280
+ end
281
+ inspect_manifest(project('foo:bar').packages.first) do |manifest|
282
+ manifest.sections.size.should be(1)
283
+ manifest.main['Manifest-Version'].should eql('1.0')
284
+ manifest.main['Created-By'].should eql('Buildr')
285
+ manifest.main['Foo'].should eql('1')
286
+ manifest.main['bar'].should eql('Bar')
287
+ manifest.main['baz'].should be_nil
288
+ end
289
+ inspect_manifest(project('foo:baz').packages.first) do |manifest|
290
+ manifest.sections.size.should be(1)
291
+ manifest.main['Manifest-Version'].should eql('1.0')
292
+ manifest.main['Created-By'].should eql('Buildr')
293
+ manifest.main['Foo'].should eql('1')
294
+ manifest.main['baz'].should eql('Baz')
295
+ manifest.main['bar'].should be_nil
296
+ end
297
+ end
298
+ end
299
+
300
+
301
+ describe Project, '#meta_inf' do
302
+ it 'should by an array' do
303
+ define('foo').meta_inf.should be_kind_of(Array)
304
+ end
305
+
306
+ it 'should include LICENSE file if found' do
307
+ write 'LICENSE'
308
+ define('foo').meta_inf.first.should point_to_path('LICENSE')
309
+ end
310
+
311
+ it 'should be empty unless LICENSE exists' do
312
+ define('foo').meta_inf.should be_empty
313
+ end
314
+
315
+ it 'should inherit from parent project' do
316
+ write 'LICENSE'
317
+ define('foo') { define 'bar' }
318
+ project('foo:bar').meta_inf.first.should point_to_path('LICENSE')
319
+ end
320
+
321
+ it 'should expect LICENSE file parent project' do
322
+ write 'bar/LICENSE'
323
+ define('foo') { define 'bar' }
324
+ project('foo:bar').meta_inf.should be_empty
325
+ end
326
+ end
327
+
328
+
329
+ describe 'package with meta_inf', :shared=>true do
330
+
331
+ def package_with_meta_inf(meta_inf = nil)
332
+ packaging = @packaging
333
+ @project = Buildr.define('foo', :version=>'1.2') do
334
+ package packaging
335
+ package(packaging).with(:meta_inf=>meta_inf) if meta_inf
336
+ end
337
+ end
338
+
339
+ def inspect_meta_inf
340
+ package = project('foo').package(@packaging)
341
+ package.invoke
342
+ assumed = Array(@meta_inf_ignore)
343
+ Zip::ZipFile.open(package.to_s) do |zip|
344
+ entries = zip.entries.map(&:name).select { |f| File.dirname(f) == 'META-INF' }.map { |f| File.basename(f) }
345
+ assumed.each { |f| entries.should include(f) }
346
+ yield entries - assumed if block_given?
347
+ end
348
+ end
349
+
350
+ it 'should default to LICENSE file' do
351
+ write 'LICENSE'
352
+ package_with_meta_inf
353
+ inspect_meta_inf { |files| files.should eql(['LICENSE']) }
354
+ end
355
+
356
+ it 'should be empty if no LICENSE file' do
357
+ package_with_meta_inf
358
+ inspect_meta_inf { |files| files.should be_empty }
359
+ end
360
+
361
+ it 'should include file specified by :meta_inf option' do
362
+ write 'README'
363
+ package_with_meta_inf 'README'
364
+ inspect_meta_inf { |files| files.should eql(['README']) }
365
+ end
366
+
367
+ it 'should include files specified by :meta_inf option' do
368
+ files = ['README', 'DISCLAIMER'].each { |file| write file }
369
+ package_with_meta_inf files
370
+ inspect_meta_inf { |files| files.should eql(files) }
371
+ end
372
+
373
+ it 'should include file task specified by :meta_inf option' do
374
+ file('README') { |task| write task.to_s }
375
+ package_with_meta_inf file('README')
376
+ inspect_meta_inf { |files| files.should eql(['README']) }
377
+ end
378
+
379
+ it 'should include file tasks specified by :meta_inf option' do
380
+ files = ['README', 'DISCLAIMER'].each { |file| file(file) { |task| write task.to_s } }
381
+ package_with_meta_inf files.map { |f| file(f) }
382
+ inspect_meta_inf { |files| files.should eql(files) }
383
+ end
384
+
385
+ it 'should complain if cannot find file' do
386
+ package_with_meta_inf 'README'
387
+ lambda { inspect_meta_inf }.should raise_error(RuntimeError, /README/)
388
+ end
389
+
390
+ it 'should complain if cannot build task' do
391
+ file('README') { fail 'Failed' }
392
+ package_with_meta_inf 'README'
393
+ lambda { inspect_meta_inf }.should raise_error(RuntimeError, /Failed/)
394
+ end
395
+
396
+ it 'should respond to with() and accept manifest and meta_inf' do
397
+ write 'DISCLAIMER'
398
+ mkpath 'target/classes'
399
+ packaging = @packaging
400
+ define('foo', :version=>'1.0') { package(packaging).with :meta_inf=>'DISCLAIMER' }
401
+ inspect_meta_inf { |files| files.should eql(['DISCLAIMER']) }
402
+ end
403
+ end
404
+
405
+
406
+ describe Packaging, 'jar' do
407
+ it_should_behave_like 'packaging'
408
+ before { @packaging = :jar }
409
+ it_should_behave_like 'package with manifest'
410
+ it_should_behave_like 'package with meta_inf'
411
+ before { @meta_inf_ignore = 'MANIFEST.MF' }
412
+
413
+ it 'should use files from compile directory if nothing included' do
414
+ write 'src/main/java/Test.java', 'class Test {}'
415
+ define('foo', :version=>'1.0') { package(:jar) }
416
+ project('foo').package(:jar).invoke
417
+ Zip::ZipFile.open(project('foo').package(:jar).to_s) do |jar|
418
+ jar.entries.map(&:to_s).sort.should include('META-INF/MANIFEST.MF', 'Test.class')
419
+ end
420
+ end
421
+
422
+ it 'should use files from resources directory if nothing included' do
423
+ write 'src/main/resources/test/important.properties'
424
+ define('foo', :version=>'1.0') { package(:jar) }
425
+ project('foo').package(:jar).invoke
426
+ Zip::ZipFile.open(project('foo').package(:jar).to_s) do |jar|
427
+ jar.entries.map(&:to_s).sort.should include('test/important.properties')
428
+ end
429
+ end
430
+
431
+ it 'should include class directories' do
432
+ write 'src/main/java/code/Test.java', 'package code ; class Test {}'
433
+ define('foo', :version=>'1.0') { package(:jar) }
434
+ project('foo').package(:jar).invoke
435
+ Zip::ZipFile.open(project('foo').package(:jar).to_s) do |jar|
436
+ jar.entries.map(&:to_s).sort.should include('code/')
437
+ end
438
+ end
439
+
440
+ it 'should include resource files starting with dot' do
441
+ write 'src/main/resources/test/.config'
442
+ define('foo', :version=>'1.0') { package(:jar) }
443
+ project('foo').package(:jar).invoke
444
+ Zip::ZipFile.open(project('foo').package(:jar).to_s) do |jar|
445
+ jar.entries.map(&:to_s).sort.should include('test/.config')
446
+ end
447
+ end
448
+
449
+ it 'should include empty resource directories' do
450
+ mkpath 'src/main/resources/empty'
451
+ define('foo', :version=>'1.0') { package(:jar) }
452
+ project('foo').package(:jar).invoke
453
+ Zip::ZipFile.open(project('foo').package(:jar).to_s) do |jar|
454
+ jar.entries.map(&:to_s).sort.should include('empty/')
455
+ end
456
+ end
457
+
458
+ it 'should raise error when calling with() with nil value' do
459
+ lambda {
460
+ define('foo', :version=>'1.0') { package(:jar).with(nil) }
461
+ }.should raise_error
462
+ end
463
+ end
464
+
465
+
466
+ describe Packaging, 'war' do
467
+ it_should_behave_like 'packaging'
468
+ before { @packaging = :war }
469
+ it_should_behave_like 'package with manifest'
470
+ it_should_behave_like 'package with meta_inf'
471
+ before { @meta_inf_ignore = 'MANIFEST.MF' }
472
+
473
+ def make_jars
474
+ artifact('group:id:jar:1.0') { |t| write t.to_s }
475
+ artifact('group:id:jar:2.0') { |t| write t.to_s }
476
+ end
477
+
478
+ def inspect_war
479
+ project('foo').package(:war).invoke
480
+ Zip::ZipFile.open(project('foo').package(:war).to_s) do |war|
481
+ yield war.entries.map(&:to_s).sort
482
+ end
483
+ end
484
+
485
+ it 'should use files from webapp directory if nothing included' do
486
+ write 'src/main/webapp/test.html'
487
+ define('foo', :version=>'1.0') { package(:war) }
488
+ inspect_war { |files| files.should include('test.html') }
489
+ end
490
+
491
+ it 'should accept files from :classes option' do
492
+ write 'src/main/java/Test.java', 'class Test {}'
493
+ write 'classes/test'
494
+ define('foo', :version=>'1.0') { package(:war).with(:classes=>'classes') }
495
+ inspect_war { |files| files.should include('WEB-INF/classes/test') }
496
+ end
497
+
498
+ it 'should use files from compile directory if nothing included' do
499
+ write 'src/main/java/Test.java', 'class Test {}'
500
+ define('foo', :version=>'1.0') { package(:war) }
501
+ inspect_war { |files| files.should include('WEB-INF/classes/Test.class') }
502
+ end
503
+
504
+ it 'should ignore compile directory if no source files to compile' do
505
+ define('foo', :version=>'1.0') { package(:war) }
506
+ inspect_war { |files| files.should_not include('target/classes') }
507
+ end
508
+
509
+ it 'should include only specified classes directories' do
510
+ write 'src/main/java'
511
+ define('foo', :version=>'1.0') { package(:war).with :classes=>_('additional') }
512
+ project('foo').package(:war).classes.should_not include(project('foo').file('target/classes'))
513
+ project('foo').package(:war).classes.should include(project('foo').file('additional'))
514
+ end
515
+
516
+ it 'should use files from resources directory if nothing included' do
517
+ write 'src/main/resources/test/important.properties'
518
+ define('foo', :version=>'1.0') { package(:war) }
519
+ inspect_war { |files| files.should include('WEB-INF/classes/test/important.properties') }
520
+ end
521
+
522
+ it 'should include empty resource directories' do
523
+ mkpath 'src/main/resources/empty'
524
+ define('foo', :version=>'1.0') { package(:war) }
525
+ inspect_war { |files| files.should include('WEB-INF/classes/empty/') }
526
+ end
527
+
528
+ it 'should accept file from :libs option' do
529
+ make_jars
530
+ define('foo', :version=>'1.0') { package(:war).with(:libs=>'group:id:jar:1.0') }
531
+ inspect_war { |files| files.should include('META-INF/MANIFEST.MF', 'WEB-INF/lib/id-1.0.jar') }
532
+ end
533
+
534
+ it 'should accept file from :libs option' do
535
+ make_jars
536
+ define('foo', :version=>'1.0') { package(:war).with(:libs=>['group:id:jar:1.0', 'group:id:jar:2.0']) }
537
+ inspect_war { |files| files.should include('META-INF/MANIFEST.MF', 'WEB-INF/lib/id-1.0.jar', 'WEB-INF/lib/id-2.0.jar') }
538
+ end
539
+
540
+ it 'should use artifacts from compile classpath if no libs specified' do
541
+ make_jars
542
+ define('foo', :version=>'1.0') { compile.with 'group:id:jar:1.0', 'group:id:jar:2.0' ; package(:war) }
543
+ inspect_war { |files| files.should include('META-INF/MANIFEST.MF', 'WEB-INF/lib/id-1.0.jar', 'WEB-INF/lib/id-2.0.jar') }
544
+ end
545
+
546
+ it 'should include only specified libraries' do
547
+ define 'foo', :version=>'1.0' do
548
+ compile.with 'group:id:jar:1.0'
549
+ package(:war).with :libs=>'additional:id:jar:1.0'
550
+ end
551
+ project('foo').package(:war).libs.should_not include(artifact('group:id:jar:1.0'))
552
+ project('foo').package(:war).libs.should include(artifact('additional:id:jar:1.0'))
553
+ end
554
+
555
+ end
556
+
557
+
558
+ describe Packaging, 'aar' do
559
+ it_should_behave_like 'packaging'
560
+ before { @packaging = :aar }
561
+ it_should_behave_like 'package with manifest'
562
+ it_should_behave_like 'package with meta_inf'
563
+ before do
564
+ write 'src/main/axis2/services.xml'
565
+ @meta_inf_ignore = ['MANIFEST.MF', 'services.xml']
566
+ end
567
+
568
+ def make_jars
569
+ artifact('group:id:jar:1.0') { |t| write t.to_s }
570
+ artifact('group:id:jar:2.0') { |t| write t.to_s }
571
+ end
572
+
573
+ def inspect_aar
574
+ project('foo').package(:aar).invoke
575
+ Zip::ZipFile.open(project('foo').package(:aar).to_s) do |aar|
576
+ yield aar.entries.map(&:to_s).sort
577
+ end
578
+ end
579
+
580
+ it 'should automatically include services.xml and any *.wsdl files under src/main/axis2' do
581
+ write 'src/main/axis2/my-service.wsdl'
582
+ define('foo', :version=>'1.0') { package(:aar) }
583
+ inspect_aar { |files| files.should include('META-INF/MANIFEST.MF', 'META-INF/services.xml', 'META-INF/my-service.wsdl') }
584
+ end
585
+
586
+ it 'should accept files from :include option' do
587
+ write 'test'
588
+ define('foo', :version=>'1.0') { package(:aar).include 'test' }
589
+ inspect_aar { |files| files.should include('META-INF/MANIFEST.MF', 'test') }
590
+ end
591
+
592
+ it 'should use files from compile directory if nothing included' do
593
+ write 'src/main/java/Test.java', 'class Test {}'
594
+ define('foo', :version=>'1.0') { package(:aar) }
595
+ inspect_aar { |files| files.should include('Test.class') }
596
+ end
597
+
598
+ it 'should use files from resources directory if nothing included' do
599
+ write 'src/main/resources/test/important.properties'
600
+ define('foo', :version=>'1.0') { package(:aar) }
601
+ inspect_aar { |files| files.should include('test/important.properties') }
602
+ end
603
+
604
+ it 'should include empty resource directories' do
605
+ mkpath 'src/main/resources/empty'
606
+ define('foo', :version=>'1.0') { package(:aar) }
607
+ inspect_aar { |files| files.should include('empty/') }
608
+ end
609
+
610
+ it 'should accept file from :libs option' do
611
+ make_jars
612
+ define('foo', :version=>'1.0') { package(:aar).with :libs=>'group:id:jar:1.0' }
613
+ inspect_aar { |files| files.should include('META-INF/MANIFEST.MF', 'lib/id-1.0.jar') }
614
+ end
615
+
616
+ it 'should accept file from :libs option' do
617
+ make_jars
618
+ define('foo', :version=>'1.0') { package(:aar).with :libs=>['group:id:jar:1.0', 'group:id:jar:2.0'] }
619
+ inspect_aar { |files| files.should include('META-INF/MANIFEST.MF', 'lib/id-1.0.jar', 'lib/id-2.0.jar') }
620
+ end
621
+
622
+ it 'should NOT use artifacts from compile classpath if no libs specified' do
623
+ make_jars
624
+ define('foo', :version=>'1.0') { compile.with 'group:id:jar:1.0', 'group:id:jar:2.0' ; package(:aar) }
625
+ inspect_aar { |files| files.should include('META-INF/MANIFEST.MF') }
626
+ end
627
+
628
+ it 'should return all libraries from libs attribute' do
629
+ define 'foo', :version=>'1.0' do
630
+ compile.with 'group:id:jar:1.0'
631
+ package(:aar).with :libs=>'additional:id:jar:1.0'
632
+ end
633
+ project('foo').package(:aar).libs.should_not include(artifact('group:id:jar:1.0'))
634
+ project('foo').package(:aar).libs.should include(artifact('additional:id:jar:1.0'))
635
+ end
636
+
637
+ end
638
+
639
+
640
+ describe Packaging, 'ear' do
641
+ it_should_behave_like 'packaging'
642
+ before { @packaging = :ear }
643
+ it_should_behave_like 'package with manifest'
644
+ it_should_behave_like 'package with meta_inf'
645
+ before { @meta_inf_ignore = ['MANIFEST.MF', 'application.xml'] }
646
+
647
+ def inspect_ear
648
+ project('foo').package(:ear).invoke
649
+ Zip::ZipFile.open(project('foo').package(:ear).to_s) do |ear|
650
+ yield ear.entries.map(&:to_s).sort
651
+ end
652
+ end
653
+
654
+ def inspect_application_xml
655
+ project('foo').package(:ear).invoke
656
+ Zip::ZipFile.open(project('foo').package(:ear).to_s) do |ear|
657
+ yield REXML::Document.new(ear.read('META-INF/application.xml')).root
658
+ end
659
+ end
660
+
661
+ def inspect_classpath(package)
662
+ project('foo').package(:ear).invoke
663
+ Zip::ZipFile.open(project('foo').package(:ear).to_s) do |ear|
664
+ File.open('tmp.zip', 'wb') do |tmp|
665
+ tmp.write ear.file.read(package)
666
+ end
667
+ manifest = Buildr::Packaging::Java::Manifest.from_zip('tmp.zip')
668
+ yield manifest.main['Class-Path'].split(' ')
669
+ end
670
+ end
671
+
672
+ it 'should set display name from project id' do
673
+ define 'foo', :version=>'1.0' do
674
+ package(:ear).display_name.should eql('foo')
675
+ define 'bar' do
676
+ package(:ear).display_name.should eql('foo-bar')
677
+ end
678
+ end
679
+ end
680
+
681
+ it 'should set display name in application.xml' do
682
+ define 'foo', :version=>'1.0' do
683
+ package(:ear)
684
+ end
685
+ inspect_application_xml { |xml| xml.get_text('/application/display-name').should == 'foo' }
686
+ end
687
+
688
+ it 'should accept different display name' do
689
+ define 'foo', :version=>'1.0' do
690
+ package(:ear).display_name = 'bar'
691
+ end
692
+ inspect_application_xml { |xml| xml.get_text('/application/display-name').should == 'bar' }
693
+ end
694
+
695
+ it 'should map WARs to /war directory' do
696
+ define 'foo', :version=>'1.0' do
697
+ package(:ear) << package(:war)
698
+ end
699
+ inspect_ear { |files| files.should include('war/foo-1.0.war') }
700
+ end
701
+
702
+ it 'should map EJBs to /ejb directory' do
703
+ define 'foo', :version=>'1.0' do
704
+ package(:ear).add :ejb=>package(:jar)
705
+ end
706
+ inspect_ear { |files| files.should include('ejb/foo-1.0.jar') }
707
+ end
708
+
709
+ it 'should not modify original artifact for its components' do
710
+ define 'one', :version => '1.0' do
711
+ write 'src/main/resources/one.txt', '1'
712
+ package(:jar)
713
+ end
714
+
715
+ define 'two', :version => '1.0' do
716
+ write 'src/main/resources/two.txt', '2'
717
+ package(:jar)
718
+ end
719
+
720
+ define 'foo', :version => '1.0' do
721
+ package(:ear).add project(:one).package(:jar)
722
+ package(:ear).add :ejb => project(:two).package(:jar)
723
+ end
724
+
725
+ inspect_ear { |files| files.should include('lib/one-1.0.jar', 'ejb/two-1.0.jar') }
726
+
727
+ Buildr::Packaging::Java::Manifest.from_zip(project('one').package(:jar)).main['Class-Path'].should be_nil
728
+ Buildr::Packaging::Java::Manifest.from_zip(project('two').package(:jar)).main['Class-Path'].should be_nil
729
+
730
+ inspect_classpath 'ejb/two-1.0.jar' do |classpath|
731
+ classpath.should include('../lib/one-1.0.jar')
732
+ end
733
+ end
734
+
735
+ it 'should map JARs to /lib directory' do
736
+ define 'foo', :version=>'1.0' do
737
+ package(:ear) << package(:jar)
738
+ end
739
+ inspect_ear { |files| files.should include('lib/foo-1.0.jar') }
740
+ end
741
+
742
+ it 'should accept component type with :type option' do
743
+ define 'foo', :version=>'1.0' do
744
+ package(:ear).add package(:jar), :type=>:ejb
745
+ end
746
+ inspect_ear { |files| files.should include('ejb/foo-1.0.jar') }
747
+ end
748
+
749
+ it 'should accept component and its type as type=>artifact' do
750
+ define 'foo', :version=>'1.0' do
751
+ package(:ear).add :ejb=>package(:jar)
752
+ end
753
+ inspect_ear { |files| files.should include('ejb/foo-1.0.jar') }
754
+ end
755
+
756
+ it 'should map typed JARs to /jar directory' do
757
+ define 'foo', :version=>'1.0' do
758
+ package(:ear).add :jar=>package(:jar)
759
+ end
760
+ inspect_ear { |files| files.should include('jar/foo-1.0.jar') }
761
+ end
762
+
763
+ it 'should add multiple components at a time using the type=>component style' do
764
+ define 'bar', :version => '1.5' do
765
+ package(:war) # must be added as a webapp
766
+ package(:jar) # must be added as a shared lib
767
+ package(:zip) # this one should be excluded
768
+ end
769
+ define 'baz', :version => '1.5' do
770
+ package(:jar, :id => 'one')
771
+ package(:jar, :id => 'two')
772
+ end
773
+ define 'foo', :version => '1.0' do
774
+ package(:ear).add :lib => project('baz'),
775
+ :war => project('bar').package(:war),
776
+ :ejb => project('bar').package(:jar)
777
+ end
778
+ inspect_ear do |files|
779
+ files.should include(*%w{ lib/one-1.5.jar lib/two-1.5.jar war/bar-1.5.war ejb/bar-1.5.jar })
780
+ files.should_not satisfy { files.any? { |f| f =~ /\.zip$/ } }
781
+ end
782
+ end
783
+
784
+ it 'should add all EAR supported packages when given a project argument' do
785
+ define 'bar', :version => '1.5' do
786
+ package(:war) # must be added as a webapp
787
+ package(:jar) # must be added as a shared lib
788
+ package(:zip) # this one should be excluded
789
+ end
790
+ define 'baz', :version => '1.5' do
791
+ package(:war)
792
+ package(:jar)
793
+ end
794
+ define 'foo', :version => '1.0' do
795
+ package(:ear).add projects(:bar, :baz)
796
+ end
797
+ inspect_ear do |files|
798
+ files.should include('war/bar-1.5.war', 'lib/bar-1.5.jar', 'lib/baz-1.5.jar', 'war/baz-1.5.war')
799
+ files.should_not satisfy { files.any? { |f| f =~ /\.zip$/ } }
800
+ end
801
+ end
802
+
803
+ it 'should complain about unknown component type' do
804
+ define 'foo', :version=>'1.0' do
805
+ lambda { package(:ear).add package(:zip) }.should raise_error(RuntimeError, /ear component/i)
806
+ end
807
+ end
808
+
809
+ it 'should allow unknown component types with explicit type' do
810
+ define 'foo', :version=>'1.0' do
811
+ package(:ear).add :lib=>package(:zip)
812
+ end
813
+ inspect_ear { |files| files.should include('lib/foo-1.0.zip') }
814
+ end
815
+
816
+ it 'should accept alternative directory name' do
817
+ define 'foo', :version=>'1.0' do
818
+ package(:ear).add package(:jar), :path=>'trash'
819
+ end
820
+ inspect_ear { |files| files.should include('trash/foo-1.0.jar') }
821
+ end
822
+
823
+ it 'should accept customization of directory map' do
824
+ define 'foo', :version=>'1.0' do
825
+ package(:ear).dirs[:jar] = 'jarred'
826
+ package(:ear).add :jar=>package(:jar)
827
+ end
828
+ inspect_ear { |files| files.should include('jarred/foo-1.0.jar') }
829
+ end
830
+
831
+ it 'should accept customization of directory map with nil paths in application.xml' do
832
+ define 'foo', :version=>'1.0' do
833
+ package(:ear).dirs[:war] = nil
834
+ package(:ear).add :war=>package(:war)
835
+ package(:ear).add package(:jar)
836
+ end
837
+ inspect_ear { |files| files.should include('foo-1.0.war') }
838
+ inspect_application_xml do |xml|
839
+ xml.get_text("/application/module[@id='foo']/web/web-uri").to_s.should eql('foo-1.0.war')
840
+ end
841
+ end
842
+
843
+ it 'should accept customization of directory map with nil paths in the classpath' do
844
+ define 'foo', :version=>'1.0' do
845
+ package(:ear).dirs[:lib] = nil
846
+ package(:ear).add :war=>package(:war)
847
+ package(:ear) << package(:jar)
848
+ end
849
+ inspect_classpath 'war/foo-1.0.war' do |classpath|
850
+ classpath.should include('../foo-1.0.jar')
851
+ end
852
+ end
853
+
854
+ it 'should list WAR components in application.xml' do
855
+ define 'foo', :version=>'1.0' do
856
+ package(:ear) << package(:war) << package(:war, :id=>'bar')
857
+ end
858
+ inspect_application_xml do |xml|
859
+ xml.get_elements("/application/module[@id='foo'][web]").should_not be_empty
860
+ xml.get_elements("/application/module[@id='bar'][web]").should_not be_empty
861
+ end
862
+ end
863
+
864
+ it 'should specify web-uri for WAR components in application.xml' do
865
+ define 'foo', :version=>'1.0' do
866
+ package(:ear) << package(:war)
867
+ package(:ear).add package(:war, :id=>'bar'), :path=>'ws'
868
+ end
869
+ inspect_application_xml do |xml|
870
+ xml.get_text("/application/module[@id='foo']/web/web-uri").to_s.should eql('war/foo-1.0.war')
871
+ xml.get_text("/application/module[@id='bar']/web/web-uri").to_s.should eql('ws/bar-1.0.war')
872
+ end
873
+ end
874
+
875
+ it 'should specify context-root for WAR components in application.xml' do
876
+ define 'foo', :version=>'1.0' do
877
+ package(:ear) << package(:war)
878
+ package(:ear).add package(:war, :id=>'bar')
879
+ end
880
+ inspect_application_xml do |xml|
881
+ xml.get_text("/application/module[@id='foo']/web/context-root").to_s.should eql('/foo')
882
+ xml.get_text("/application/module[@id='bar']/web/context-root").to_s.should eql('/bar')
883
+ end
884
+ end
885
+
886
+ it 'should accept context-root for WAR components in application.xml' do
887
+ define 'foo', :version=>'1.0' do
888
+ package(:ear).add package(:war), :context_root=>'rooted'
889
+ end
890
+ inspect_application_xml do |xml|
891
+ xml.get_text("/application/module[@id='foo']/web/context-root").to_s.should eql('/rooted')
892
+ end
893
+ end
894
+
895
+ it 'should allow disabling the context root' do
896
+ define 'foo', :version=>'1.0' do
897
+ package(:ear).add package(:war), :context_root=>false
898
+ end
899
+ inspect_application_xml do |xml|
900
+ xml.get_elements("/application/module[@id='foo']/web/context-root").should be_empty
901
+ end
902
+ end
903
+
904
+ it 'should list EJB components in application.xml' do
905
+ define 'foo', :version=>'1.0' do
906
+ package(:ear).add :ejb=>package(:jar)
907
+ package(:ear).add :ejb=>package(:jar, :id=>'bar')
908
+ end
909
+ inspect_application_xml do |xml|
910
+ xml.get_text("/application/module[@id='foo']/ejb").to_s.should eql('ejb/foo-1.0.jar')
911
+ xml.get_text("/application/module[@id='bar']/ejb").to_s.should eql('ejb/bar-1.0.jar')
912
+ end
913
+ end
914
+
915
+ it 'should list JAR components in application.xml' do
916
+ define 'foo', :version=>'1.0' do
917
+ package(:ear) << { :jar=>package(:jar) } << { :jar=>package(:jar, :id=>'bar') }
918
+ end
919
+ inspect_application_xml do |xml|
920
+ jars = xml.get_elements('/application/jar').map(&:texts).map(&:join)
921
+ jars.should include('jar/foo-1.0.jar', 'jar/bar-1.0.jar')
922
+ end
923
+ end
924
+
925
+ it 'should update WAR component classpath to include libraries' do
926
+ define 'foo', :version=>'1.0' do
927
+ package(:ear) << package(:jar, :id=>'lib1') << package(:jar, :id=>'lib2')
928
+ package(:ear).add package(:war)
929
+ end
930
+ inspect_classpath 'war/foo-1.0.war' do |classpath|
931
+ classpath.should include('../lib/lib1-1.0.jar', '../lib/lib2-1.0.jar')
932
+ end
933
+ end
934
+
935
+ it 'should update WAR component classpath but skip internal libraries' do
936
+ define 'foo', :version=>'1.0' do
937
+ package(:ear) << package(:jar, :id=>'lib1') << package(:jar, :id=>'lib2')
938
+ package(:war).with(:libs=>package(:jar, :id=>'lib1'))
939
+ package(:ear).add package(:war)
940
+ end
941
+ inspect_classpath 'war/foo-1.0.war' do |classpath|
942
+ classpath.should_not include('../lib/lib1-1.0.jar')
943
+ classpath.should include('../lib/lib2-1.0.jar')
944
+ end
945
+ end
946
+
947
+ it 'should update EJB component classpath to include libraries' do
948
+ define 'foo', :version=>'1.0' do
949
+ package(:ear) << package(:jar, :id=>'lib1') << package(:jar, :id=>'lib2')
950
+ package(:ear).add :ejb=>package(:jar, :id=>'foo')
951
+ end
952
+ inspect_classpath 'ejb/foo-1.0.jar' do |classpath|
953
+ classpath.should include('../lib/lib1-1.0.jar', '../lib/lib2-1.0.jar')
954
+ end
955
+ end
956
+
957
+ it 'should update JAR component classpath to include libraries' do
958
+ define 'foo', :version=>'1.0' do
959
+ package(:ear) << package(:jar, :id=>'lib1') << package(:jar, :id=>'lib2')
960
+ package(:ear).add :jar=>package(:jar, :id=>'foo')
961
+ end
962
+ inspect_classpath 'jar/foo-1.0.jar' do |classpath|
963
+ classpath.should include('../lib/lib1-1.0.jar', '../lib/lib2-1.0.jar')
964
+ end
965
+ end
966
+
967
+ it 'should deal with very long classpaths' do
968
+ define 'foo', :version=>'1.0' do
969
+ 20.times { |i| package(:ear) << package(:jar, :id=>"lib#{i}") }
970
+ package(:ear).add :jar=>package(:jar, :id=>'foo')
971
+ end
972
+ inspect_classpath 'jar/foo-1.0.jar' do |classpath|
973
+ classpath.should include('../lib/lib1-1.0.jar', '../lib/lib2-1.0.jar')
974
+ end
975
+ end
976
+
977
+
978
+ it 'should generate relative classpaths for top level EJB' do
979
+ define 'foo', :version => '1.0' do
980
+ package(:ear).add package(:jar, :id => 'one'), :path => '.'
981
+ package(:ear).add package(:jar, :id => 'two'), :path => 'dos'
982
+ package(:ear).add package(:jar, :id => 'three'), :path => 'tres'
983
+ package(:ear).add :ejb => package(:jar, :id => 'ejb1'), :path => '.'
984
+ end
985
+ inspect_classpath 'ejb1-1.0.jar' do |classpath|
986
+ classpath.should include(*%w{ one-1.0.jar dos/two-1.0.jar tres/three-1.0.jar })
987
+ end
988
+ end
989
+
990
+ it 'should generate relative classpaths for second level EJB' do
991
+ define 'foo', :version => '1.0' do
992
+ package(:ear).add package(:jar, :id => 'one'), :path => '.'
993
+ package(:ear).add package(:jar, :id => 'two'), :path => 'dos'
994
+ package(:ear).add package(:jar, :id => 'three'), :path => 'tres'
995
+ package(:ear).add :ejb => package(:jar, :id => 'ejb2'), :path => 'dos'
996
+ end
997
+ inspect_classpath 'dos/ejb2-1.0.jar' do |classpath|
998
+ classpath.should include(*%w{ ../one-1.0.jar two-1.0.jar ../tres/three-1.0.jar })
999
+ end
1000
+ end
1001
+
1002
+ it 'should generate relative classpaths for nested EJB' do
1003
+ define 'foo', :version => '1.0' do
1004
+ package(:ear).add package(:jar, :id => 'one'), :path => '.'
1005
+ package(:ear).add package(:jar, :id => 'two'), :path => 'dos'
1006
+ package(:ear).add package(:jar, :id => 'three'), :path => 'dos/tres'
1007
+ package(:ear).add package(:jar, :id => 'four'), :path => 'dos/cuatro'
1008
+ package(:ear).add :ejb => package(:jar, :id => 'ejb4'), :path => 'dos/cuatro'
1009
+ end
1010
+ inspect_classpath 'dos/cuatro/ejb4-1.0.jar' do |classpath|
1011
+ classpath.should include(*%w{ ../../one-1.0.jar ../two-1.0.jar ../tres/three-1.0.jar four-1.0.jar })
1012
+ end
1013
+ end
1014
+
1015
+ end
1016
+
1017
+
1018
+ describe Packaging, 'sources' do
1019
+ it_should_behave_like 'packaging'
1020
+ before { @packaging, @package_type = :sources, :zip }
1021
+
1022
+ it 'should create package of type :zip and classifier \'sources\'' do
1023
+ define 'foo', :version=>'1.0' do
1024
+ package(:sources).type.should eql(:zip)
1025
+ package(:sources).classifier.should eql('sources')
1026
+ package(:sources).name.should match(/foo-1.0-sources.zip$/)
1027
+ end
1028
+ end
1029
+
1030
+ it 'should contain source files' do
1031
+ write 'src/main/java/Source.java'
1032
+ define('foo', :version=>'1.0') { package(:sources) }
1033
+ project('foo').task('package').invoke
1034
+ project('foo').packages.first.should contain('Source.java')
1035
+ end
1036
+
1037
+ it 'should be a ZipTask' do
1038
+ define 'foo', :version=>'1.0' do
1039
+ package(:javadoc).should be_kind_of(ZipTask)
1040
+ end
1041
+ end
1042
+ end
1043
+
1044
+
1045
+ describe Packaging, 'javadoc' do
1046
+ it_should_behave_like 'packaging'
1047
+ before { @packaging, @package_type = :javadoc, :zip }
1048
+
1049
+ it 'should create package of type :zip and classifier \'javadoc\'' do
1050
+ define 'foo', :version=>'1.0' do
1051
+ package(:javadoc).type.should eql(:zip)
1052
+ package(:javadoc).classifier.should eql('javadoc')
1053
+ package(:javadoc).name.pathmap('%f').should eql('foo-1.0-javadoc.zip')
1054
+ end
1055
+ end
1056
+
1057
+ it 'should contain Javadocs' do
1058
+ write 'src/main/java/Source.java', 'public class Source {}'
1059
+ define('foo', :version=>'1.0') { package(:javadoc) }
1060
+ project('foo').task('package').invoke
1061
+ project('foo').packages.first.should contain('Source.html', 'index.html')
1062
+ end
1063
+
1064
+ it 'should use project description in window title' do
1065
+ write 'src/main/java/Source.java', 'public class Source {}'
1066
+ desc 'My Project'
1067
+ define('foo', :version=>'1.0') { package(:javadoc) }
1068
+ project('foo').task('package').invoke
1069
+ project('foo').packages.first.entry('index.html').should contain('My Project')
1070
+ end
1071
+
1072
+ it 'should be a ZipTask' do
1073
+ define 'foo', :version=>'1.0' do
1074
+ package(:javadoc).should be_kind_of(ZipTask)
1075
+ end
1076
+ end
1077
+ end
1078
+
1079
+
1080
+ shared_examples_for 'package_with_' do
1081
+
1082
+ def prepare(options = {})
1083
+ packager = "package_with_#{@packaging}"
1084
+ write 'src/main/java/Source.java'
1085
+ write 'baz/src/main/java/Source.java'
1086
+ define 'foo', :version=>'1.0' do
1087
+ send packager, options
1088
+ define 'bar' ; define 'baz'
1089
+ end
1090
+ end
1091
+
1092
+ def applied_to
1093
+ projects.select { |project| project.packages.first }.map(&:name)
1094
+ end
1095
+
1096
+ it 'should create package of type zip with classifier' do
1097
+ prepare
1098
+ project('foo').packages.first.to_s.should =~ /foo-1.0-#{@packaging}.zip/
1099
+ end
1100
+
1101
+ it 'should create package for projects that have source files' do
1102
+ prepare
1103
+ applied_to.should include('foo', 'foo:baz')
1104
+ end
1105
+
1106
+ it 'should not create package for projects that have no source files' do
1107
+ prepare
1108
+ applied_to.should_not include('foo:bar')
1109
+ end
1110
+
1111
+ it 'should limit to projects specified by :only' do
1112
+ prepare :only=>'baz'
1113
+ applied_to.should eql(['foo:baz'])
1114
+ end
1115
+
1116
+ it 'should limit to projects specified by :only array' do
1117
+ prepare :only=>['baz']
1118
+ applied_to.should eql(['foo:baz'])
1119
+ end
1120
+
1121
+ it 'should ignore project specified by :except' do
1122
+ prepare :except=>'baz'
1123
+ applied_to.should eql(['foo'])
1124
+ end
1125
+
1126
+ it 'should ignore projects specified by :except array' do
1127
+ prepare :except=>['baz']
1128
+ applied_to.should eql(['foo'])
1129
+ end
1130
+ end
1131
+
1132
+ describe 'package_with_sources' do
1133
+ it_should_behave_like 'package_with_'
1134
+ before { @packaging = :sources }
1135
+ end
1136
+
1137
+ describe 'package_with_javadoc' do
1138
+ it_should_behave_like 'package_with_'
1139
+ before { @packaging = :javadoc }
1140
+ end