buildr 1.3.5-x86-mswin32

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 (186) hide show
  1. data/CHANGELOG +998 -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 +244 -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 +79 -0
  40. data/doc/extending.textile +186 -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 +266 -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 +430 -0
  59. data/doc/preface.textile +54 -0
  60. data/doc/projects.textile +271 -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 +280 -0
  68. data/doc/testing.textile +222 -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 +656 -0
  73. data/lib/buildr/core/build.rb +452 -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 +362 -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 +866 -0
  84. data/lib/buildr/core/shell.rb +198 -0
  85. data/lib/buildr/core/test.rb +723 -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 +334 -0
  94. data/lib/buildr/ide/eclipse/java.rb +53 -0
  95. data/lib/buildr/ide/eclipse/plugin.rb +68 -0
  96. data/lib/buildr/ide/eclipse/scala.rb +66 -0
  97. data/lib/buildr/ide/idea.ipr.template +300 -0
  98. data/lib/buildr/ide/idea.rb +190 -0
  99. data/lib/buildr/ide/idea7x.ipr.template +290 -0
  100. data/lib/buildr/ide/idea7x.rb +212 -0
  101. data/lib/buildr/java.rb +23 -0
  102. data/lib/buildr/java/ant.rb +94 -0
  103. data/lib/buildr/java/bdd.rb +459 -0
  104. data/lib/buildr/java/cobertura.rb +274 -0
  105. data/lib/buildr/java/commands.rb +213 -0
  106. data/lib/buildr/java/compiler.rb +349 -0
  107. data/lib/buildr/java/deprecated.rb +141 -0
  108. data/lib/buildr/java/emma.rb +244 -0
  109. data/lib/buildr/java/jruby.rb +117 -0
  110. data/lib/buildr/java/jtestr_runner.rb.erb +116 -0
  111. data/lib/buildr/java/org/apache/buildr/JavaTestFilter.class +0 -0
  112. data/lib/buildr/java/org/apache/buildr/JavaTestFilter.java +137 -0
  113. data/lib/buildr/java/packaging.rb +716 -0
  114. data/lib/buildr/java/pom.rb +174 -0
  115. data/lib/buildr/java/rjb.rb +155 -0
  116. data/lib/buildr/java/test_result.rb +353 -0
  117. data/lib/buildr/java/tests.rb +333 -0
  118. data/lib/buildr/java/version_requirement.rb +172 -0
  119. data/lib/buildr/packaging.rb +24 -0
  120. data/lib/buildr/packaging/archive.rb +488 -0
  121. data/lib/buildr/packaging/artifact.rb +749 -0
  122. data/lib/buildr/packaging/artifact_namespace.rb +972 -0
  123. data/lib/buildr/packaging/artifact_search.rb +140 -0
  124. data/lib/buildr/packaging/gems.rb +102 -0
  125. data/lib/buildr/packaging/package.rb +238 -0
  126. data/lib/buildr/packaging/tar.rb +186 -0
  127. data/lib/buildr/packaging/version_requirement.rb +172 -0
  128. data/lib/buildr/packaging/zip.rb +73 -0
  129. data/lib/buildr/packaging/ziptask.rb +316 -0
  130. data/lib/buildr/resources/buildr.icns +0 -0
  131. data/lib/buildr/scala.rb +25 -0
  132. data/lib/buildr/scala/bdd.rb +109 -0
  133. data/lib/buildr/scala/compiler.rb +195 -0
  134. data/lib/buildr/scala/org/apache/buildr/SpecsSingletonRunner$.class +0 -0
  135. data/lib/buildr/scala/org/apache/buildr/SpecsSingletonRunner.class +0 -0
  136. data/lib/buildr/scala/org/apache/buildr/SpecsSingletonRunner.scala +35 -0
  137. data/lib/buildr/scala/shell.rb +55 -0
  138. data/lib/buildr/scala/tests.rb +157 -0
  139. data/lib/buildr/shell.rb +180 -0
  140. data/rakelib/checks.rake +57 -0
  141. data/rakelib/doc.rake +92 -0
  142. data/rakelib/jekylltask.rb +120 -0
  143. data/rakelib/package.rake +73 -0
  144. data/rakelib/release.rake +149 -0
  145. data/rakelib/rspec.rake +73 -0
  146. data/rakelib/setup.rake +54 -0
  147. data/rakelib/stage.rake +213 -0
  148. data/rakelib/stage.rake~ +213 -0
  149. data/spec/addon/drb_spec.rb +328 -0
  150. data/spec/core/application_spec.rb +502 -0
  151. data/spec/core/build_spec.rb +677 -0
  152. data/spec/core/checks_spec.rb +519 -0
  153. data/spec/core/common_spec.rb +670 -0
  154. data/spec/core/compile_spec.rb +583 -0
  155. data/spec/core/extension_spec.rb +93 -0
  156. data/spec/core/generate_spec.rb +33 -0
  157. data/spec/core/project_spec.rb +762 -0
  158. data/spec/core/test_spec.rb +1098 -0
  159. data/spec/core/transport_spec.rb +537 -0
  160. data/spec/core/util_spec.rb +67 -0
  161. data/spec/groovy/bdd_spec.rb +80 -0
  162. data/spec/groovy/compiler_spec.rb +240 -0
  163. data/spec/ide/eclipse_spec.rb +501 -0
  164. data/spec/ide/idea7x_spec.rb +84 -0
  165. data/spec/java/ant_spec.rb +33 -0
  166. data/spec/java/bdd_spec.rb +382 -0
  167. data/spec/java/cobertura_spec.rb +85 -0
  168. data/spec/java/compiler_spec.rb +446 -0
  169. data/spec/java/emma_spec.rb +119 -0
  170. data/spec/java/java_spec.rb +124 -0
  171. data/spec/java/packaging_spec.rb +1134 -0
  172. data/spec/java/test_coverage_helper.rb +257 -0
  173. data/spec/java/tests_spec.rb +493 -0
  174. data/spec/packaging/archive_spec.rb +527 -0
  175. data/spec/packaging/artifact_namespace_spec.rb +654 -0
  176. data/spec/packaging/artifact_spec.rb +795 -0
  177. data/spec/packaging/packaging_helper.rb +63 -0
  178. data/spec/packaging/packaging_spec.rb +684 -0
  179. data/spec/sandbox.rb +142 -0
  180. data/spec/scala/bdd_spec.rb +119 -0
  181. data/spec/scala/compiler_spec.rb +284 -0
  182. data/spec/scala/scala.rb +38 -0
  183. data/spec/scala/tests_spec.rb +261 -0
  184. data/spec/spec_helpers.rb +340 -0
  185. data/spec/version_requirement_spec.rb +129 -0
  186. metadata +383 -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,1134 @@
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
+ end
458
+
459
+
460
+ describe Packaging, 'war' do
461
+ it_should_behave_like 'packaging'
462
+ before { @packaging = :war }
463
+ it_should_behave_like 'package with manifest'
464
+ it_should_behave_like 'package with meta_inf'
465
+ before { @meta_inf_ignore = 'MANIFEST.MF' }
466
+
467
+ def make_jars
468
+ artifact('group:id:jar:1.0') { |t| write t.to_s }
469
+ artifact('group:id:jar:2.0') { |t| write t.to_s }
470
+ end
471
+
472
+ def inspect_war
473
+ project('foo').package(:war).invoke
474
+ Zip::ZipFile.open(project('foo').package(:war).to_s) do |war|
475
+ yield war.entries.map(&:to_s).sort
476
+ end
477
+ end
478
+
479
+ it 'should use files from webapp directory if nothing included' do
480
+ write 'src/main/webapp/test.html'
481
+ define('foo', :version=>'1.0') { package(:war) }
482
+ inspect_war { |files| files.should include('test.html') }
483
+ end
484
+
485
+ it 'should accept files from :classes option' do
486
+ write 'src/main/java/Test.java', 'class Test {}'
487
+ write 'classes/test'
488
+ define('foo', :version=>'1.0') { package(:war).with(:classes=>'classes') }
489
+ inspect_war { |files| files.should include('WEB-INF/classes/test') }
490
+ end
491
+
492
+ it 'should use files from compile directory if nothing included' do
493
+ write 'src/main/java/Test.java', 'class Test {}'
494
+ define('foo', :version=>'1.0') { package(:war) }
495
+ inspect_war { |files| files.should include('WEB-INF/classes/Test.class') }
496
+ end
497
+
498
+ it 'should ignore compile directory if no source files to compile' do
499
+ define('foo', :version=>'1.0') { package(:war) }
500
+ inspect_war { |files| files.should_not include('target/classes') }
501
+ end
502
+
503
+ it 'should include only specified classes directories' do
504
+ write 'src/main/java'
505
+ define('foo', :version=>'1.0') { package(:war).with :classes=>_('additional') }
506
+ project('foo').package(:war).classes.should_not include(project('foo').file('target/classes'))
507
+ project('foo').package(:war).classes.should include(project('foo').file('additional'))
508
+ end
509
+
510
+ it 'should use files from resources directory if nothing included' do
511
+ write 'src/main/resources/test/important.properties'
512
+ define('foo', :version=>'1.0') { package(:war) }
513
+ inspect_war { |files| files.should include('WEB-INF/classes/test/important.properties') }
514
+ end
515
+
516
+ it 'should include empty resource directories' do
517
+ mkpath 'src/main/resources/empty'
518
+ define('foo', :version=>'1.0') { package(:war) }
519
+ inspect_war { |files| files.should include('WEB-INF/classes/empty/') }
520
+ end
521
+
522
+ it 'should accept file from :libs option' do
523
+ make_jars
524
+ define('foo', :version=>'1.0') { package(:war).with(:libs=>'group:id:jar:1.0') }
525
+ inspect_war { |files| files.should include('META-INF/MANIFEST.MF', 'WEB-INF/lib/id-1.0.jar') }
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', 'group:id:jar:2.0']) }
531
+ inspect_war { |files| files.should include('META-INF/MANIFEST.MF', 'WEB-INF/lib/id-1.0.jar', 'WEB-INF/lib/id-2.0.jar') }
532
+ end
533
+
534
+ it 'should use artifacts from compile classpath if no libs specified' do
535
+ make_jars
536
+ define('foo', :version=>'1.0') { compile.with 'group:id:jar:1.0', 'group:id:jar:2.0' ; package(:war) }
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 include only specified libraries' do
541
+ define 'foo', :version=>'1.0' do
542
+ compile.with 'group:id:jar:1.0'
543
+ package(:war).with :libs=>'additional:id:jar:1.0'
544
+ end
545
+ project('foo').package(:war).libs.should_not include(artifact('group:id:jar:1.0'))
546
+ project('foo').package(:war).libs.should include(artifact('additional:id:jar:1.0'))
547
+ end
548
+
549
+ end
550
+
551
+
552
+ describe Packaging, 'aar' do
553
+ it_should_behave_like 'packaging'
554
+ before { @packaging = :aar }
555
+ it_should_behave_like 'package with manifest'
556
+ it_should_behave_like 'package with meta_inf'
557
+ before do
558
+ write 'src/main/axis2/services.xml'
559
+ @meta_inf_ignore = ['MANIFEST.MF', 'services.xml']
560
+ end
561
+
562
+ def make_jars
563
+ artifact('group:id:jar:1.0') { |t| write t.to_s }
564
+ artifact('group:id:jar:2.0') { |t| write t.to_s }
565
+ end
566
+
567
+ def inspect_aar
568
+ project('foo').package(:aar).invoke
569
+ Zip::ZipFile.open(project('foo').package(:aar).to_s) do |aar|
570
+ yield aar.entries.map(&:to_s).sort
571
+ end
572
+ end
573
+
574
+ it 'should automatically include services.xml and any *.wsdl files under src/main/axis2' do
575
+ write 'src/main/axis2/my-service.wsdl'
576
+ define('foo', :version=>'1.0') { package(:aar) }
577
+ inspect_aar { |files| files.should include('META-INF/MANIFEST.MF', 'META-INF/services.xml', 'META-INF/my-service.wsdl') }
578
+ end
579
+
580
+ it 'should accept files from :include option' do
581
+ write 'test'
582
+ define('foo', :version=>'1.0') { package(:aar).include 'test' }
583
+ inspect_aar { |files| files.should include('META-INF/MANIFEST.MF', 'test') }
584
+ end
585
+
586
+ it 'should use files from compile directory if nothing included' do
587
+ write 'src/main/java/Test.java', 'class Test {}'
588
+ define('foo', :version=>'1.0') { package(:aar) }
589
+ inspect_aar { |files| files.should include('Test.class') }
590
+ end
591
+
592
+ it 'should use files from resources directory if nothing included' do
593
+ write 'src/main/resources/test/important.properties'
594
+ define('foo', :version=>'1.0') { package(:aar) }
595
+ inspect_aar { |files| files.should include('test/important.properties') }
596
+ end
597
+
598
+ it 'should include empty resource directories' do
599
+ mkpath 'src/main/resources/empty'
600
+ define('foo', :version=>'1.0') { package(:aar) }
601
+ inspect_aar { |files| files.should include('empty/') }
602
+ end
603
+
604
+ it 'should accept file from :libs option' do
605
+ make_jars
606
+ define('foo', :version=>'1.0') { package(:aar).with :libs=>'group:id:jar:1.0' }
607
+ inspect_aar { |files| files.should include('META-INF/MANIFEST.MF', 'lib/id-1.0.jar') }
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', 'group:id:jar:2.0'] }
613
+ inspect_aar { |files| files.should include('META-INF/MANIFEST.MF', 'lib/id-1.0.jar', 'lib/id-2.0.jar') }
614
+ end
615
+
616
+ it 'should NOT use artifacts from compile classpath if no libs specified' do
617
+ make_jars
618
+ define('foo', :version=>'1.0') { compile.with 'group:id:jar:1.0', 'group:id:jar:2.0' ; package(:aar) }
619
+ inspect_aar { |files| files.should include('META-INF/MANIFEST.MF') }
620
+ end
621
+
622
+ it 'should return all libraries from libs attribute' do
623
+ define 'foo', :version=>'1.0' do
624
+ compile.with 'group:id:jar:1.0'
625
+ package(:aar).with :libs=>'additional:id:jar:1.0'
626
+ end
627
+ project('foo').package(:aar).libs.should_not include(artifact('group:id:jar:1.0'))
628
+ project('foo').package(:aar).libs.should include(artifact('additional:id:jar:1.0'))
629
+ end
630
+
631
+ end
632
+
633
+
634
+ describe Packaging, 'ear' do
635
+ it_should_behave_like 'packaging'
636
+ before { @packaging = :ear }
637
+ it_should_behave_like 'package with manifest'
638
+ it_should_behave_like 'package with meta_inf'
639
+ before { @meta_inf_ignore = ['MANIFEST.MF', 'application.xml'] }
640
+
641
+ def inspect_ear
642
+ project('foo').package(:ear).invoke
643
+ Zip::ZipFile.open(project('foo').package(:ear).to_s) do |ear|
644
+ yield ear.entries.map(&:to_s).sort
645
+ end
646
+ end
647
+
648
+ def inspect_application_xml
649
+ project('foo').package(:ear).invoke
650
+ Zip::ZipFile.open(project('foo').package(:ear).to_s) do |ear|
651
+ yield REXML::Document.new(ear.read('META-INF/application.xml')).root
652
+ end
653
+ end
654
+
655
+ def inspect_classpath(package)
656
+ project('foo').package(:ear).invoke
657
+ Zip::ZipFile.open(project('foo').package(:ear).to_s) do |ear|
658
+ File.open('tmp.zip', 'wb') do |tmp|
659
+ tmp.write ear.file.read(package)
660
+ end
661
+ manifest = Buildr::Packaging::Java::Manifest.from_zip('tmp.zip')
662
+ yield manifest.main['Class-Path'].split(' ')
663
+ end
664
+ end
665
+
666
+ it 'should set display name from project id' do
667
+ define 'foo', :version=>'1.0' do
668
+ package(:ear).display_name.should eql('foo')
669
+ define 'bar' do
670
+ package(:ear).display_name.should eql('foo-bar')
671
+ end
672
+ end
673
+ end
674
+
675
+ it 'should set display name in application.xml' do
676
+ define 'foo', :version=>'1.0' do
677
+ package(:ear)
678
+ end
679
+ inspect_application_xml { |xml| xml.get_text('/application/display-name').should == 'foo' }
680
+ end
681
+
682
+ it 'should accept different display name' do
683
+ define 'foo', :version=>'1.0' do
684
+ package(:ear).display_name = 'bar'
685
+ end
686
+ inspect_application_xml { |xml| xml.get_text('/application/display-name').should == 'bar' }
687
+ end
688
+
689
+ it 'should map WARs to /war directory' do
690
+ define 'foo', :version=>'1.0' do
691
+ package(:ear) << package(:war)
692
+ end
693
+ inspect_ear { |files| files.should include('war/foo-1.0.war') }
694
+ end
695
+
696
+ it 'should map EJBs to /ejb directory' do
697
+ define 'foo', :version=>'1.0' do
698
+ package(:ear).add :ejb=>package(:jar)
699
+ end
700
+ inspect_ear { |files| files.should include('ejb/foo-1.0.jar') }
701
+ end
702
+
703
+ it 'should not modify original artifact for its components' do
704
+ define 'one', :version => '1.0' do
705
+ write 'src/main/resources/one.txt', '1'
706
+ package(:jar)
707
+ end
708
+
709
+ define 'two', :version => '1.0' do
710
+ write 'src/main/resources/two.txt', '2'
711
+ package(:jar)
712
+ end
713
+
714
+ define 'foo', :version => '1.0' do
715
+ package(:ear).add project(:one).package(:jar)
716
+ package(:ear).add :ejb => project(:two).package(:jar)
717
+ end
718
+
719
+ inspect_ear { |files| files.should include('lib/one-1.0.jar', 'ejb/two-1.0.jar') }
720
+
721
+ Buildr::Packaging::Java::Manifest.from_zip(project('one').package(:jar)).main['Class-Path'].should be_nil
722
+ Buildr::Packaging::Java::Manifest.from_zip(project('two').package(:jar)).main['Class-Path'].should be_nil
723
+
724
+ inspect_classpath 'ejb/two-1.0.jar' do |classpath|
725
+ classpath.should include('../lib/one-1.0.jar')
726
+ end
727
+ end
728
+
729
+ it 'should map JARs to /lib directory' do
730
+ define 'foo', :version=>'1.0' do
731
+ package(:ear) << package(:jar)
732
+ end
733
+ inspect_ear { |files| files.should include('lib/foo-1.0.jar') }
734
+ end
735
+
736
+ it 'should accept component type with :type option' do
737
+ define 'foo', :version=>'1.0' do
738
+ package(:ear).add package(:jar), :type=>:ejb
739
+ end
740
+ inspect_ear { |files| files.should include('ejb/foo-1.0.jar') }
741
+ end
742
+
743
+ it 'should accept component and its type as type=>artifact' do
744
+ define 'foo', :version=>'1.0' do
745
+ package(:ear).add :ejb=>package(:jar)
746
+ end
747
+ inspect_ear { |files| files.should include('ejb/foo-1.0.jar') }
748
+ end
749
+
750
+ it 'should map typed JARs to /jar directory' do
751
+ define 'foo', :version=>'1.0' do
752
+ package(:ear).add :jar=>package(:jar)
753
+ end
754
+ inspect_ear { |files| files.should include('jar/foo-1.0.jar') }
755
+ end
756
+
757
+ it 'should add multiple components at a time using the type=>component style' do
758
+ define 'bar', :version => '1.5' do
759
+ package(:war) # must be added as a webapp
760
+ package(:jar) # must be added as a shared lib
761
+ package(:zip) # this one should be excluded
762
+ end
763
+ define 'baz', :version => '1.5' do
764
+ package(:jar, :id => 'one')
765
+ package(:jar, :id => 'two')
766
+ end
767
+ define 'foo', :version => '1.0' do
768
+ package(:ear).add :lib => project('baz'),
769
+ :war => project('bar').package(:war),
770
+ :ejb => project('bar').package(:jar)
771
+ end
772
+ inspect_ear do |files|
773
+ files.should include(*%w{ lib/one-1.5.jar lib/two-1.5.jar war/bar-1.5.war ejb/bar-1.5.jar })
774
+ files.should_not satisfy { files.any? { |f| f =~ /\.zip$/ } }
775
+ end
776
+ end
777
+
778
+ it 'should add all EAR supported packages when given a project argument' do
779
+ define 'bar', :version => '1.5' do
780
+ package(:war) # must be added as a webapp
781
+ package(:jar) # must be added as a shared lib
782
+ package(:zip) # this one should be excluded
783
+ end
784
+ define 'baz', :version => '1.5' do
785
+ package(:war)
786
+ package(:jar)
787
+ end
788
+ define 'foo', :version => '1.0' do
789
+ package(:ear).add projects(:bar, :baz)
790
+ end
791
+ inspect_ear do |files|
792
+ files.should include('war/bar-1.5.war', 'lib/bar-1.5.jar', 'lib/baz-1.5.jar', 'war/baz-1.5.war')
793
+ files.should_not satisfy { files.any? { |f| f =~ /\.zip$/ } }
794
+ end
795
+ end
796
+
797
+ it 'should complain about unknown component type' do
798
+ define 'foo', :version=>'1.0' do
799
+ lambda { package(:ear).add package(:zip) }.should raise_error(RuntimeError, /ear component/i)
800
+ end
801
+ end
802
+
803
+ it 'should allow unknown component types with explicit type' do
804
+ define 'foo', :version=>'1.0' do
805
+ package(:ear).add :lib=>package(:zip)
806
+ end
807
+ inspect_ear { |files| files.should include('lib/foo-1.0.zip') }
808
+ end
809
+
810
+ it 'should accept alternative directory name' do
811
+ define 'foo', :version=>'1.0' do
812
+ package(:ear).add package(:jar), :path=>'trash'
813
+ end
814
+ inspect_ear { |files| files.should include('trash/foo-1.0.jar') }
815
+ end
816
+
817
+ it 'should accept customization of directory map' do
818
+ define 'foo', :version=>'1.0' do
819
+ package(:ear).dirs[:jar] = 'jarred'
820
+ package(:ear).add :jar=>package(:jar)
821
+ end
822
+ inspect_ear { |files| files.should include('jarred/foo-1.0.jar') }
823
+ end
824
+
825
+ it 'should accept customization of directory map with nil paths in application.xml' do
826
+ define 'foo', :version=>'1.0' do
827
+ package(:ear).dirs[:war] = nil
828
+ package(:ear).add :war=>package(:war)
829
+ package(:ear).add package(:jar)
830
+ end
831
+ inspect_ear { |files| files.should include('foo-1.0.war') }
832
+ inspect_application_xml do |xml|
833
+ xml.get_text("/application/module[@id='foo']/web/web-uri").to_s.should eql('foo-1.0.war')
834
+ end
835
+ end
836
+
837
+ it 'should accept customization of directory map with nil paths in the classpath' do
838
+ define 'foo', :version=>'1.0' do
839
+ package(:ear).dirs[:lib] = nil
840
+ package(:ear).add :war=>package(:war)
841
+ package(:ear) << package(:jar)
842
+ end
843
+ inspect_classpath 'war/foo-1.0.war' do |classpath|
844
+ classpath.should include('../foo-1.0.jar')
845
+ end
846
+ end
847
+
848
+ it 'should list WAR components in application.xml' do
849
+ define 'foo', :version=>'1.0' do
850
+ package(:ear) << package(:war) << package(:war, :id=>'bar')
851
+ end
852
+ inspect_application_xml do |xml|
853
+ xml.get_elements("/application/module[@id='foo'][web]").should_not be_empty
854
+ xml.get_elements("/application/module[@id='bar'][web]").should_not be_empty
855
+ end
856
+ end
857
+
858
+ it 'should specify web-uri for WAR components in application.xml' do
859
+ define 'foo', :version=>'1.0' do
860
+ package(:ear) << package(:war)
861
+ package(:ear).add package(:war, :id=>'bar'), :path=>'ws'
862
+ end
863
+ inspect_application_xml do |xml|
864
+ xml.get_text("/application/module[@id='foo']/web/web-uri").to_s.should eql('war/foo-1.0.war')
865
+ xml.get_text("/application/module[@id='bar']/web/web-uri").to_s.should eql('ws/bar-1.0.war')
866
+ end
867
+ end
868
+
869
+ it 'should specify context-root for WAR components in application.xml' do
870
+ define 'foo', :version=>'1.0' do
871
+ package(:ear) << package(:war)
872
+ package(:ear).add package(:war, :id=>'bar')
873
+ end
874
+ inspect_application_xml do |xml|
875
+ xml.get_text("/application/module[@id='foo']/web/context-root").to_s.should eql('/foo')
876
+ xml.get_text("/application/module[@id='bar']/web/context-root").to_s.should eql('/bar')
877
+ end
878
+ end
879
+
880
+ it 'should accept context-root for WAR components in application.xml' do
881
+ define 'foo', :version=>'1.0' do
882
+ package(:ear).add package(:war), :context_root=>'rooted'
883
+ end
884
+ inspect_application_xml do |xml|
885
+ xml.get_text("/application/module[@id='foo']/web/context-root").to_s.should eql('/rooted')
886
+ end
887
+ end
888
+
889
+ it 'should allow disabling the context root' do
890
+ define 'foo', :version=>'1.0' do
891
+ package(:ear).add package(:war), :context_root=>false
892
+ end
893
+ inspect_application_xml do |xml|
894
+ xml.get_elements("/application/module[@id='foo']/web/context-root").should be_empty
895
+ end
896
+ end
897
+
898
+ it 'should list EJB components in application.xml' do
899
+ define 'foo', :version=>'1.0' do
900
+ package(:ear).add :ejb=>package(:jar)
901
+ package(:ear).add :ejb=>package(:jar, :id=>'bar')
902
+ end
903
+ inspect_application_xml do |xml|
904
+ xml.get_text("/application/module[@id='foo']/ejb").to_s.should eql('ejb/foo-1.0.jar')
905
+ xml.get_text("/application/module[@id='bar']/ejb").to_s.should eql('ejb/bar-1.0.jar')
906
+ end
907
+ end
908
+
909
+ it 'should list JAR components in application.xml' do
910
+ define 'foo', :version=>'1.0' do
911
+ package(:ear) << { :jar=>package(:jar) } << { :jar=>package(:jar, :id=>'bar') }
912
+ end
913
+ inspect_application_xml do |xml|
914
+ jars = xml.get_elements('/application/jar').map(&:texts).map(&:join)
915
+ jars.should include('jar/foo-1.0.jar', 'jar/bar-1.0.jar')
916
+ end
917
+ end
918
+
919
+ it 'should update WAR component classpath to include libraries' do
920
+ define 'foo', :version=>'1.0' do
921
+ package(:ear) << package(:jar, :id=>'lib1') << package(:jar, :id=>'lib2')
922
+ package(:ear).add package(:war)
923
+ end
924
+ inspect_classpath 'war/foo-1.0.war' do |classpath|
925
+ classpath.should include('../lib/lib1-1.0.jar', '../lib/lib2-1.0.jar')
926
+ end
927
+ end
928
+
929
+ it 'should update WAR component classpath but skip internal libraries' do
930
+ define 'foo', :version=>'1.0' do
931
+ package(:ear) << package(:jar, :id=>'lib1') << package(:jar, :id=>'lib2')
932
+ package(:war).with(:libs=>package(:jar, :id=>'lib1'))
933
+ package(:ear).add package(:war)
934
+ end
935
+ inspect_classpath 'war/foo-1.0.war' do |classpath|
936
+ classpath.should_not include('../lib/lib1-1.0.jar')
937
+ classpath.should include('../lib/lib2-1.0.jar')
938
+ end
939
+ end
940
+
941
+ it 'should update EJB component classpath to include libraries' do
942
+ define 'foo', :version=>'1.0' do
943
+ package(:ear) << package(:jar, :id=>'lib1') << package(:jar, :id=>'lib2')
944
+ package(:ear).add :ejb=>package(:jar, :id=>'foo')
945
+ end
946
+ inspect_classpath 'ejb/foo-1.0.jar' do |classpath|
947
+ classpath.should include('../lib/lib1-1.0.jar', '../lib/lib2-1.0.jar')
948
+ end
949
+ end
950
+
951
+ it 'should update JAR component classpath to include libraries' do
952
+ define 'foo', :version=>'1.0' do
953
+ package(:ear) << package(:jar, :id=>'lib1') << package(:jar, :id=>'lib2')
954
+ package(:ear).add :jar=>package(:jar, :id=>'foo')
955
+ end
956
+ inspect_classpath 'jar/foo-1.0.jar' do |classpath|
957
+ classpath.should include('../lib/lib1-1.0.jar', '../lib/lib2-1.0.jar')
958
+ end
959
+ end
960
+
961
+ it 'should deal with very long classpaths' do
962
+ define 'foo', :version=>'1.0' do
963
+ 20.times { |i| package(:ear) << package(:jar, :id=>"lib#{i}") }
964
+ package(:ear).add :jar=>package(:jar, :id=>'foo')
965
+ end
966
+ inspect_classpath 'jar/foo-1.0.jar' do |classpath|
967
+ classpath.should include('../lib/lib1-1.0.jar', '../lib/lib2-1.0.jar')
968
+ end
969
+ end
970
+
971
+
972
+ it 'should generate relative classpaths for top level EJB' do
973
+ define 'foo', :version => '1.0' do
974
+ package(:ear).add package(:jar, :id => 'one'), :path => '.'
975
+ package(:ear).add package(:jar, :id => 'two'), :path => 'dos'
976
+ package(:ear).add package(:jar, :id => 'three'), :path => 'tres'
977
+ package(:ear).add :ejb => package(:jar, :id => 'ejb1'), :path => '.'
978
+ end
979
+ inspect_classpath 'ejb1-1.0.jar' do |classpath|
980
+ classpath.should include(*%w{ one-1.0.jar dos/two-1.0.jar tres/three-1.0.jar })
981
+ end
982
+ end
983
+
984
+ it 'should generate relative classpaths for second level EJB' do
985
+ define 'foo', :version => '1.0' do
986
+ package(:ear).add package(:jar, :id => 'one'), :path => '.'
987
+ package(:ear).add package(:jar, :id => 'two'), :path => 'dos'
988
+ package(:ear).add package(:jar, :id => 'three'), :path => 'tres'
989
+ package(:ear).add :ejb => package(:jar, :id => 'ejb2'), :path => 'dos'
990
+ end
991
+ inspect_classpath 'dos/ejb2-1.0.jar' do |classpath|
992
+ classpath.should include(*%w{ ../one-1.0.jar two-1.0.jar ../tres/three-1.0.jar })
993
+ end
994
+ end
995
+
996
+ it 'should generate relative classpaths for nested EJB' do
997
+ define 'foo', :version => '1.0' do
998
+ package(:ear).add package(:jar, :id => 'one'), :path => '.'
999
+ package(:ear).add package(:jar, :id => 'two'), :path => 'dos'
1000
+ package(:ear).add package(:jar, :id => 'three'), :path => 'dos/tres'
1001
+ package(:ear).add package(:jar, :id => 'four'), :path => 'dos/cuatro'
1002
+ package(:ear).add :ejb => package(:jar, :id => 'ejb4'), :path => 'dos/cuatro'
1003
+ end
1004
+ inspect_classpath 'dos/cuatro/ejb4-1.0.jar' do |classpath|
1005
+ classpath.should include(*%w{ ../../one-1.0.jar ../two-1.0.jar ../tres/three-1.0.jar four-1.0.jar })
1006
+ end
1007
+ end
1008
+
1009
+ end
1010
+
1011
+
1012
+ describe Packaging, 'sources' do
1013
+ it_should_behave_like 'packaging'
1014
+ before { @packaging, @package_type = :sources, :zip }
1015
+
1016
+ it 'should create package of type :zip and classifier \'sources\'' do
1017
+ define 'foo', :version=>'1.0' do
1018
+ package(:sources).type.should eql(:zip)
1019
+ package(:sources).classifier.should eql('sources')
1020
+ package(:sources).name.should match(/foo-1.0-sources.zip$/)
1021
+ end
1022
+ end
1023
+
1024
+ it 'should contain source files' do
1025
+ write 'src/main/java/Source.java'
1026
+ define('foo', :version=>'1.0') { package(:sources) }
1027
+ project('foo').task('package').invoke
1028
+ project('foo').packages.first.should contain('Source.java')
1029
+ end
1030
+
1031
+ it 'should be a ZipTask' do
1032
+ define 'foo', :version=>'1.0' do
1033
+ package(:javadoc).should be_kind_of(ZipTask)
1034
+ end
1035
+ end
1036
+ end
1037
+
1038
+
1039
+ describe Packaging, 'javadoc' do
1040
+ it_should_behave_like 'packaging'
1041
+ before { @packaging, @package_type = :javadoc, :zip }
1042
+
1043
+ it 'should create package of type :zip and classifier \'javadoc\'' do
1044
+ define 'foo', :version=>'1.0' do
1045
+ package(:javadoc).type.should eql(:zip)
1046
+ package(:javadoc).classifier.should eql('javadoc')
1047
+ package(:javadoc).name.pathmap('%f').should eql('foo-1.0-javadoc.zip')
1048
+ end
1049
+ end
1050
+
1051
+ it 'should contain Javadocs' do
1052
+ write 'src/main/java/Source.java', 'public class Source {}'
1053
+ define('foo', :version=>'1.0') { package(:javadoc) }
1054
+ project('foo').task('package').invoke
1055
+ project('foo').packages.first.should contain('Source.html', 'index.html')
1056
+ end
1057
+
1058
+ it 'should use project description in window title' do
1059
+ write 'src/main/java/Source.java', 'public class Source {}'
1060
+ desc 'My Project'
1061
+ define('foo', :version=>'1.0') { package(:javadoc) }
1062
+ project('foo').task('package').invoke
1063
+ project('foo').packages.first.entry('index.html').should contain('My Project')
1064
+ end
1065
+
1066
+ it 'should be a ZipTask' do
1067
+ define 'foo', :version=>'1.0' do
1068
+ package(:javadoc).should be_kind_of(ZipTask)
1069
+ end
1070
+ end
1071
+ end
1072
+
1073
+
1074
+ shared_examples_for 'package_with_' do
1075
+
1076
+ def prepare(options = {})
1077
+ packager = "package_with_#{@packaging}"
1078
+ write 'src/main/java/Source.java'
1079
+ write 'baz/src/main/java/Source.java'
1080
+ define 'foo', :version=>'1.0' do
1081
+ send packager, options
1082
+ define 'bar' ; define 'baz'
1083
+ end
1084
+ end
1085
+
1086
+ def applied_to
1087
+ projects.select { |project| project.packages.first }.map(&:name)
1088
+ end
1089
+
1090
+ it 'should create package of type zip with classifier' do
1091
+ prepare
1092
+ project('foo').packages.first.to_s.should =~ /foo-1.0-#{@packaging}.zip/
1093
+ end
1094
+
1095
+ it 'should create package for projects that have source files' do
1096
+ prepare
1097
+ applied_to.should include('foo', 'foo:baz')
1098
+ end
1099
+
1100
+ it 'should not create package for projects that have no source files' do
1101
+ prepare
1102
+ applied_to.should_not include('foo:bar')
1103
+ end
1104
+
1105
+ it 'should limit to projects specified by :only' do
1106
+ prepare :only=>'baz'
1107
+ applied_to.should eql(['foo:baz'])
1108
+ end
1109
+
1110
+ it 'should limit to projects specified by :only array' do
1111
+ prepare :only=>['baz']
1112
+ applied_to.should eql(['foo:baz'])
1113
+ end
1114
+
1115
+ it 'should ignore project specified by :except' do
1116
+ prepare :except=>'baz'
1117
+ applied_to.should eql(['foo'])
1118
+ end
1119
+
1120
+ it 'should ignore projects specified by :except array' do
1121
+ prepare :except=>['baz']
1122
+ applied_to.should eql(['foo'])
1123
+ end
1124
+ end
1125
+
1126
+ describe 'package_with_sources' do
1127
+ it_should_behave_like 'package_with_'
1128
+ before { @packaging = :sources }
1129
+ end
1130
+
1131
+ describe 'package_with_javadoc' do
1132
+ it_should_behave_like 'package_with_'
1133
+ before { @packaging = :javadoc }
1134
+ end