realityforge-buildr 1.5.9
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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +5 -0
- data/LICENSE +176 -0
- data/NOTICE +26 -0
- data/README.md +3 -0
- data/Rakefile +50 -0
- data/addon/buildr/checkstyle-report.xsl +104 -0
- data/addon/buildr/checkstyle.rb +254 -0
- data/addon/buildr/git_auto_version.rb +36 -0
- data/addon/buildr/gpg.rb +90 -0
- data/addon/buildr/gwt.rb +413 -0
- data/addon/buildr/jacoco.rb +161 -0
- data/addon/buildr/pmd.rb +185 -0
- data/addon/buildr/single_intermediate_layout.rb +71 -0
- data/addon/buildr/spotbugs.rb +265 -0
- data/addon/buildr/top_level_generate_dir.rb +37 -0
- data/addon/buildr/wsgen.rb +192 -0
- data/bin/buildr +20 -0
- data/buildr.gemspec +61 -0
- data/lib/buildr.rb +86 -0
- data/lib/buildr/core/application.rb +705 -0
- data/lib/buildr/core/assets.rb +96 -0
- data/lib/buildr/core/build.rb +587 -0
- data/lib/buildr/core/common.rb +167 -0
- data/lib/buildr/core/compile.rb +599 -0
- data/lib/buildr/core/console.rb +124 -0
- data/lib/buildr/core/doc.rb +275 -0
- data/lib/buildr/core/environment.rb +128 -0
- data/lib/buildr/core/filter.rb +405 -0
- data/lib/buildr/core/help.rb +114 -0
- data/lib/buildr/core/progressbar.rb +161 -0
- data/lib/buildr/core/project.rb +994 -0
- data/lib/buildr/core/test.rb +776 -0
- data/lib/buildr/core/transports.rb +456 -0
- data/lib/buildr/core/util.rb +77 -0
- data/lib/buildr/ide/idea.rb +1664 -0
- data/lib/buildr/java/commands.rb +230 -0
- data/lib/buildr/java/compiler.rb +85 -0
- data/lib/buildr/java/custom_pom.rb +300 -0
- data/lib/buildr/java/doc.rb +62 -0
- data/lib/buildr/java/packaging.rb +393 -0
- data/lib/buildr/java/pom.rb +191 -0
- data/lib/buildr/java/test_result.rb +54 -0
- data/lib/buildr/java/tests.rb +111 -0
- data/lib/buildr/packaging/archive.rb +586 -0
- data/lib/buildr/packaging/artifact.rb +1113 -0
- data/lib/buildr/packaging/artifact_namespace.rb +1010 -0
- data/lib/buildr/packaging/artifact_search.rb +138 -0
- data/lib/buildr/packaging/package.rb +237 -0
- data/lib/buildr/packaging/version_requirement.rb +189 -0
- data/lib/buildr/packaging/zip.rb +189 -0
- data/lib/buildr/packaging/ziptask.rb +387 -0
- data/lib/buildr/version.rb +18 -0
- data/rakelib/release.rake +99 -0
- data/spec/addon/checkstyle_spec.rb +58 -0
- data/spec/core/application_spec.rb +576 -0
- data/spec/core/build_spec.rb +922 -0
- data/spec/core/common_spec.rb +670 -0
- data/spec/core/compile_spec.rb +656 -0
- data/spec/core/console_spec.rb +65 -0
- data/spec/core/doc_spec.rb +194 -0
- data/spec/core/extension_spec.rb +200 -0
- data/spec/core/project_spec.rb +736 -0
- data/spec/core/test_spec.rb +1131 -0
- data/spec/core/transport_spec.rb +452 -0
- data/spec/core/util_spec.rb +154 -0
- data/spec/ide/idea_spec.rb +1952 -0
- data/spec/java/commands_spec.rb +79 -0
- data/spec/java/compiler_spec.rb +274 -0
- data/spec/java/custom_pom_spec.rb +165 -0
- data/spec/java/doc_spec.rb +55 -0
- data/spec/java/packaging_spec.rb +786 -0
- data/spec/java/pom_spec.rb +162 -0
- data/spec/java/test_coverage_helper.rb +257 -0
- data/spec/java/tests_spec.rb +224 -0
- data/spec/packaging/archive_spec.rb +686 -0
- data/spec/packaging/artifact_namespace_spec.rb +757 -0
- data/spec/packaging/artifact_spec.rb +1351 -0
- data/spec/packaging/packaging_helper.rb +63 -0
- data/spec/packaging/packaging_spec.rb +690 -0
- data/spec/sandbox.rb +166 -0
- data/spec/spec_helpers.rb +420 -0
- data/spec/version_requirement_spec.rb +145 -0
- data/spec/xpath_matchers.rb +123 -0
- metadata +295 -0
@@ -0,0 +1,55 @@
|
|
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.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helpers'))
|
18
|
+
|
19
|
+
describe 'Javadoc' do
|
20
|
+
def sources
|
21
|
+
@sources ||= (1..3).map { |i| "Test#{i}" }.
|
22
|
+
each { |name| write "src/main/java/foo/#{name}.java", "package foo; public class #{name}{}" }.
|
23
|
+
map { |name| "src/main/java/foo/#{name}.java" }
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'should pick -windowtitle from project name by default' do
|
27
|
+
define 'foo' do
|
28
|
+
compile.using(:javac)
|
29
|
+
|
30
|
+
define 'bar' do
|
31
|
+
compile.using(:javac)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
project('foo').doc.options[:windowtitle].should eql('foo')
|
36
|
+
project('foo:bar').doc.options[:windowtitle].should eql('foo:bar')
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'should pick -windowtitle from project description by default, if available' do
|
40
|
+
desc 'My App'
|
41
|
+
define 'foo' do
|
42
|
+
compile.using(:javac)
|
43
|
+
end
|
44
|
+
project('foo').doc.options[:windowtitle].should eql('My App')
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'should not override explicit :windowtitle' do
|
48
|
+
define 'foo' do
|
49
|
+
compile.using(:javac)
|
50
|
+
doc.using :windowtitle => 'explicit'
|
51
|
+
end
|
52
|
+
project('foo').doc.options[:windowtitle].should eql('explicit')
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
@@ -0,0 +1,786 @@
|
|
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.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helpers'))
|
18
|
+
require File.expand_path(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 project comment' do
|
28
|
+
desc 'My Project'
|
29
|
+
define('foo').manifest['Implementation-Title'].should eql('My Project')
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'should include project name if no comment' do
|
33
|
+
define('foo').manifest['Implementation-Title'].should eql('foo')
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'should include project version' do
|
37
|
+
define('foo', :version=>'2.1').manifest['Implementation-Version'].should eql('2.1')
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'should not include project version unless specified' do
|
41
|
+
define('foo').manifest['Implementation-Version'].should be_nil
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'should inherit from parent project' do
|
45
|
+
define('foo', :version=>'2.1') { define 'bar' }
|
46
|
+
project('foo:bar').manifest['Implementation-Version'].should eql('2.1')
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
|
52
|
+
RSpec.shared_examples 'package with manifest' do
|
53
|
+
before do
|
54
|
+
@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).'
|
55
|
+
end
|
56
|
+
|
57
|
+
def package_with_manifest(manifest = nil)
|
58
|
+
packaging = @packaging
|
59
|
+
@project = define('foo', :version=>'1.2') do
|
60
|
+
package packaging
|
61
|
+
package(packaging).with(:manifest=>manifest) unless manifest.nil?
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def inspect_manifest(package = nil)
|
66
|
+
package ||= project('foo').package(@packaging)
|
67
|
+
package.invoke
|
68
|
+
yield Buildr::Packaging::Java::Manifest.from_zip(package)
|
69
|
+
end
|
70
|
+
|
71
|
+
it 'should include default header when no options specified' do
|
72
|
+
ENV['USER'] = 'MysteriousJoe'
|
73
|
+
package_with_manifest # Nothing for default.
|
74
|
+
inspect_manifest do |manifest|
|
75
|
+
manifest.sections.size.should be(1)
|
76
|
+
manifest.main.should == {
|
77
|
+
'Manifest-Version' =>'1.0',
|
78
|
+
'Created-By' =>'Buildr',
|
79
|
+
'Implementation-Title' =>@project.name,
|
80
|
+
'Implementation-Version' =>'1.2',
|
81
|
+
'Build-By' =>'MysteriousJoe'
|
82
|
+
}
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
it 'should not exist when manifest=false' do
|
87
|
+
package_with_manifest false
|
88
|
+
@project.package(@packaging).invoke
|
89
|
+
Zip::File.open(@project.package(@packaging).to_s) do |zip|
|
90
|
+
zip.exist?('META-INF/MANIFEST.MF').should be_false
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
it 'should generate a new manifest for a file that does not have one' do
|
95
|
+
Zip::OutputStream.open 'tmp.zip' do |zip|
|
96
|
+
zip.put_next_entry 'empty.txt'
|
97
|
+
end
|
98
|
+
begin
|
99
|
+
manifest = Buildr::Packaging::Java::Manifest.from_zip('tmp.zip')
|
100
|
+
manifest.each do |key, val|
|
101
|
+
Buildr::Packaging::Java::Manifest::STANDARD_HEADER.should include(key)
|
102
|
+
end
|
103
|
+
ensure
|
104
|
+
rm 'tmp.zip'
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
it 'should map manifest from hash' do
|
109
|
+
package_with_manifest 'Foo'=>1, :bar=>'Bar'
|
110
|
+
inspect_manifest do |manifest|
|
111
|
+
manifest.sections.size.should be(1)
|
112
|
+
manifest.main['Manifest-Version'].should eql('1.0')
|
113
|
+
manifest.main['Created-By'].should eql('Buildr')
|
114
|
+
manifest.main['Foo'].should eql('1')
|
115
|
+
manifest.main['bar'].should eql('Bar')
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
it 'should close the temporary file used for packaging the MANIFEST.MF file' do
|
120
|
+
package_with_manifest 'Foo'=>1, :bar=>'Bar'
|
121
|
+
package = project('foo').package(@packaging)
|
122
|
+
package.invoke
|
123
|
+
module AccessManifestTMP
|
124
|
+
attr_reader :manifest_tmp
|
125
|
+
end
|
126
|
+
(package.dup.extend(AccessManifestTMP).manifest_tmp.closed?).should be_true
|
127
|
+
end
|
128
|
+
|
129
|
+
it 'should end hash manifest with EOL' do
|
130
|
+
package_with_manifest 'Foo'=>1, :bar=>'Bar'
|
131
|
+
package = project('foo').package(@packaging)
|
132
|
+
package.invoke
|
133
|
+
Zip::File.open(package.to_s) { |zip| zip.read('META-INF/MANIFEST.MF').should =~ /#{Buildr::Packaging::Java::Manifest::LINE_SEPARATOR}$/ }
|
134
|
+
end
|
135
|
+
|
136
|
+
it 'should break hash manifest lines longer than 72 characters using continuations' do
|
137
|
+
package_with_manifest 'foo'=>@long_line
|
138
|
+
package = project('foo').package(@packaging)
|
139
|
+
inspect_manifest do |manifest|
|
140
|
+
manifest.main['foo'].should == @long_line
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
it 'should map manifest from array' do
|
145
|
+
package_with_manifest [ { :foo=>'first' }, { :bar=>'second' } ]
|
146
|
+
inspect_manifest do |manifest|
|
147
|
+
manifest.sections.size.should be(2)
|
148
|
+
manifest.main['Manifest-Version'].should eql('1.0')
|
149
|
+
manifest.main['foo'].should eql('first')
|
150
|
+
manifest.sections.last['bar'].should eql('second')
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
it 'should end array manifest with EOL' do
|
155
|
+
package_with_manifest [ { :foo=>'first' }, { :bar=>'second' } ]
|
156
|
+
package = project('foo').package(@packaging)
|
157
|
+
package.invoke
|
158
|
+
Zip::File.open(package.to_s) { |zip| zip.read('META-INF/MANIFEST.MF')[-1].should == ?\n }
|
159
|
+
end
|
160
|
+
|
161
|
+
it 'should break array manifest lines longer than 72 characters using continuations' do
|
162
|
+
package_with_manifest ['foo'=>@long_line]
|
163
|
+
package = project('foo').package(@packaging)
|
164
|
+
inspect_manifest do |manifest|
|
165
|
+
manifest.main['foo'].should == @long_line
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
it 'should put Name: at beginning of section' do
|
170
|
+
package_with_manifest [ {}, { 'Name'=>'first', :Foo=>'first', :bar=>'second' } ]
|
171
|
+
package = project('foo').package(@packaging)
|
172
|
+
package.invoke
|
173
|
+
inspect_manifest do |manifest|
|
174
|
+
manifest.sections[1]["Name"].should == "first"
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
it 'should create manifest from proc' do
|
179
|
+
package_with_manifest lambda { 'Meta: data' }
|
180
|
+
inspect_manifest do |manifest|
|
181
|
+
manifest.sections.size.should be(1)
|
182
|
+
manifest.main['Manifest-Version'].should eql('1.0')
|
183
|
+
manifest.main['Meta'].should eql('data')
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
it 'should create manifest from file' do
|
188
|
+
write 'MANIFEST.MF', 'Meta: data'
|
189
|
+
package_with_manifest 'MANIFEST.MF'
|
190
|
+
inspect_manifest do |manifest|
|
191
|
+
manifest.sections.size.should be(1)
|
192
|
+
manifest.main['Meta'].should eql('data')
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
it 'should give 644 permissions to the manifest' do
|
197
|
+
package_with_manifest [ {}, { 'Name'=>'first', :Foo=>'first', :bar=>'second' } ]
|
198
|
+
package ||= project('foo').package(@packaging)
|
199
|
+
package.invoke
|
200
|
+
Zip::File.open(package.to_s) do |zip|
|
201
|
+
permissions = format("%o", zip.find_entry('META-INF/MANIFEST.MF').unix_perms)
|
202
|
+
permissions.should match /644$/
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
it 'should not add manifest version twice' do
|
207
|
+
write 'MANIFEST.MF', 'Manifest-Version: 1.9'
|
208
|
+
package_with_manifest 'MANIFEST.MF'
|
209
|
+
package ||= project('foo').package(@packaging)
|
210
|
+
package.invoke
|
211
|
+
Zip::File.open(package.to_s) do |zip|
|
212
|
+
zip.read('META-INF/MANIFEST.MF').scan(/(Manifest-Version)/m).size.should == 1
|
213
|
+
end
|
214
|
+
end
|
215
|
+
|
216
|
+
it 'should give precedence to version specified in manifest file' do
|
217
|
+
write 'MANIFEST.MF', 'Manifest-Version: 1.9'
|
218
|
+
package_with_manifest 'MANIFEST.MF'
|
219
|
+
inspect_manifest do |manifest|
|
220
|
+
manifest.main['Manifest-Version'].should == '1.9'
|
221
|
+
end
|
222
|
+
end
|
223
|
+
|
224
|
+
it 'should create manifest from task' do
|
225
|
+
file 'MANIFEST.MF' do |task|
|
226
|
+
write task.to_s, 'Meta: data'
|
227
|
+
end
|
228
|
+
package_with_manifest 'MANIFEST.MF'
|
229
|
+
inspect_manifest do |manifest|
|
230
|
+
manifest.sections.size.should be(1)
|
231
|
+
manifest.main['Manifest-Version'].should eql('1.0')
|
232
|
+
manifest.main['Meta'].should eql('data')
|
233
|
+
end
|
234
|
+
end
|
235
|
+
|
236
|
+
it 'should respond to with() and accept manifest' do
|
237
|
+
write 'DISCLAIMER'
|
238
|
+
mkpath 'target/classes'
|
239
|
+
packaging = @packaging
|
240
|
+
define('foo', :version=>'1.0') { package(packaging).with :manifest=>{'Foo'=>'data'} }
|
241
|
+
inspect_manifest { |manifest| manifest.main['Foo'].should eql('data') }
|
242
|
+
end
|
243
|
+
|
244
|
+
it 'should include META-INF directory' do
|
245
|
+
packaging = @packaging
|
246
|
+
package = define('foo', :version=>'1.0') { package(packaging) }.packages.first
|
247
|
+
package.invoke
|
248
|
+
Zip::File.open(package.to_s) do |zip|
|
249
|
+
zip.entries.map(&:to_s).should include('META-INF/')
|
250
|
+
end
|
251
|
+
end
|
252
|
+
|
253
|
+
it 'should inherit manifest from parent project' do
|
254
|
+
packaging = @packaging
|
255
|
+
package = nil
|
256
|
+
define('foo', :version => '1.0') do
|
257
|
+
manifest['Foo'] = '1'
|
258
|
+
package(packaging)
|
259
|
+
define('bar', :version => '1.0') do
|
260
|
+
manifest['bar'] = 'Bar'
|
261
|
+
package(:jar)
|
262
|
+
package = packages.first
|
263
|
+
end
|
264
|
+
end
|
265
|
+
inspect_manifest(package) do |manifest|
|
266
|
+
manifest.sections.size.should be(1)
|
267
|
+
manifest.main['Manifest-Version'].should eql('1.0')
|
268
|
+
manifest.main['Created-By'].should eql('Buildr')
|
269
|
+
manifest.main['Foo'].should eql('1')
|
270
|
+
manifest.main['bar'].should eql('Bar')
|
271
|
+
end
|
272
|
+
end
|
273
|
+
|
274
|
+
it 'should not modify manifest of parent project' do
|
275
|
+
packaging = @packaging
|
276
|
+
define('foo', :version => '1.0') do
|
277
|
+
manifest['Foo'] = '1'
|
278
|
+
package(packaging)
|
279
|
+
define('bar', :version => '1.0') do
|
280
|
+
manifest['bar'] = 'Bar'
|
281
|
+
package(:jar)
|
282
|
+
end
|
283
|
+
define('baz', :version => '1.0') do
|
284
|
+
manifest['baz'] = 'Baz'
|
285
|
+
package(:jar)
|
286
|
+
end
|
287
|
+
end
|
288
|
+
inspect_manifest(project('foo').packages.first) do |manifest|
|
289
|
+
manifest.sections.size.should be(1)
|
290
|
+
manifest.main['Manifest-Version'].should eql('1.0')
|
291
|
+
manifest.main['Created-By'].should eql('Buildr')
|
292
|
+
manifest.main['Foo'].should eql('1')
|
293
|
+
manifest.main['bar'].should be_nil
|
294
|
+
manifest.main['baz'].should be_nil
|
295
|
+
end
|
296
|
+
inspect_manifest(project('foo:bar').packages.first) do |manifest|
|
297
|
+
manifest.sections.size.should be(1)
|
298
|
+
manifest.main['Manifest-Version'].should eql('1.0')
|
299
|
+
manifest.main['Created-By'].should eql('Buildr')
|
300
|
+
manifest.main['Foo'].should eql('1')
|
301
|
+
manifest.main['bar'].should eql('Bar')
|
302
|
+
manifest.main['baz'].should be_nil
|
303
|
+
end
|
304
|
+
inspect_manifest(project('foo:baz').packages.first) do |manifest|
|
305
|
+
manifest.sections.size.should be(1)
|
306
|
+
manifest.main['Manifest-Version'].should eql('1.0')
|
307
|
+
manifest.main['Created-By'].should eql('Buildr')
|
308
|
+
manifest.main['Foo'].should eql('1')
|
309
|
+
manifest.main['baz'].should eql('Baz')
|
310
|
+
manifest.main['bar'].should be_nil
|
311
|
+
end
|
312
|
+
end
|
313
|
+
end
|
314
|
+
|
315
|
+
|
316
|
+
describe Project, '#meta_inf' do
|
317
|
+
it 'should by an array' do
|
318
|
+
define('foo').meta_inf.should be_kind_of(Array)
|
319
|
+
end
|
320
|
+
|
321
|
+
it 'should include LICENSE file if found' do
|
322
|
+
write 'LICENSE'
|
323
|
+
define('foo').meta_inf.first.should point_to_path('LICENSE')
|
324
|
+
end
|
325
|
+
|
326
|
+
it 'should be empty unless LICENSE exists' do
|
327
|
+
define('foo').meta_inf.should be_empty
|
328
|
+
end
|
329
|
+
|
330
|
+
it 'should inherit from parent project' do
|
331
|
+
write 'LICENSE'
|
332
|
+
define('foo') { define 'bar' }
|
333
|
+
project('foo:bar').meta_inf.first.should point_to_path('LICENSE')
|
334
|
+
end
|
335
|
+
|
336
|
+
it 'should expect LICENSE file parent project' do
|
337
|
+
write 'bar/LICENSE'
|
338
|
+
define('foo') { define 'bar' }
|
339
|
+
project('foo:bar').meta_inf.should be_empty
|
340
|
+
end
|
341
|
+
end
|
342
|
+
|
343
|
+
|
344
|
+
RSpec.shared_examples 'package with meta_inf' do
|
345
|
+
|
346
|
+
def package_with_meta_inf(meta_inf = nil)
|
347
|
+
packaging = @packaging
|
348
|
+
@project = Buildr.define('foo', :version=>'1.2') do
|
349
|
+
package packaging
|
350
|
+
package(packaging).with(:meta_inf=>meta_inf) if meta_inf
|
351
|
+
end
|
352
|
+
end
|
353
|
+
|
354
|
+
def inspect_meta_inf
|
355
|
+
package = project('foo').package(@packaging)
|
356
|
+
package.invoke
|
357
|
+
assumed = Array(@meta_inf_ignore)
|
358
|
+
Zip::File.open(package.to_s) do |zip|
|
359
|
+
entries = zip.entries.map(&:name).select { |f| File.dirname(f) == 'META-INF' }.map { |f| File.basename(f) }
|
360
|
+
assumed.each { |f| entries.should include(f) }
|
361
|
+
yield entries - assumed if block_given?
|
362
|
+
end
|
363
|
+
end
|
364
|
+
|
365
|
+
it 'should default to LICENSE file' do
|
366
|
+
write 'LICENSE'
|
367
|
+
package_with_meta_inf
|
368
|
+
inspect_meta_inf { |files| files.should eql(['LICENSE']) }
|
369
|
+
end
|
370
|
+
|
371
|
+
it 'should be empty if no LICENSE file' do
|
372
|
+
package_with_meta_inf
|
373
|
+
inspect_meta_inf { |files| files.should be_empty }
|
374
|
+
end
|
375
|
+
|
376
|
+
it 'should include file specified by :meta_inf option' do
|
377
|
+
write 'README'
|
378
|
+
package_with_meta_inf 'README'
|
379
|
+
inspect_meta_inf { |files| files.should eql(['README']) }
|
380
|
+
end
|
381
|
+
|
382
|
+
it 'should include files specified by :meta_inf option' do
|
383
|
+
files = %w[README DISCLAIMER].each { |file| write file }
|
384
|
+
package_with_meta_inf files
|
385
|
+
inspect_meta_inf { |files| files.should eql(files) }
|
386
|
+
end
|
387
|
+
|
388
|
+
it 'should include file task specified by :meta_inf option' do
|
389
|
+
file('README') { |task| write task.to_s }
|
390
|
+
package_with_meta_inf file('README')
|
391
|
+
inspect_meta_inf { |files| files.should eql(['README']) }
|
392
|
+
end
|
393
|
+
|
394
|
+
it 'should include file tasks specified by :meta_inf option' do
|
395
|
+
files = %w[README DISCLAIMER].each { |file| file(file) { |task| write task.to_s } }
|
396
|
+
package_with_meta_inf files.map { |f| file(f) }
|
397
|
+
inspect_meta_inf { |files| files.should eql(files) }
|
398
|
+
end
|
399
|
+
|
400
|
+
it 'should complain if cannot find file' do
|
401
|
+
package_with_meta_inf 'README'
|
402
|
+
lambda { inspect_meta_inf }.should raise_error(RuntimeError, /README/)
|
403
|
+
end
|
404
|
+
|
405
|
+
it 'should complain if cannot build task' do
|
406
|
+
file('README') { fail 'Failed' }
|
407
|
+
package_with_meta_inf 'README'
|
408
|
+
lambda { inspect_meta_inf }.should raise_error(RuntimeError, /Failed/)
|
409
|
+
end
|
410
|
+
|
411
|
+
it 'should respond to with() and accept manifest and meta_inf' do
|
412
|
+
write 'DISCLAIMER'
|
413
|
+
mkpath 'target/classes'
|
414
|
+
packaging = @packaging
|
415
|
+
define('foo', :version=>'1.0') { package(packaging).with :meta_inf=>'DISCLAIMER' }
|
416
|
+
inspect_meta_inf { |files| files.should eql(['DISCLAIMER']) }
|
417
|
+
end
|
418
|
+
end
|
419
|
+
|
420
|
+
|
421
|
+
describe Packaging, 'jar' do
|
422
|
+
it_should_behave_like 'packaging'
|
423
|
+
before { @packaging = :jar }
|
424
|
+
it_should_behave_like 'package with manifest'
|
425
|
+
it_should_behave_like 'package with meta_inf'
|
426
|
+
before { @meta_inf_ignore = 'MANIFEST.MF' }
|
427
|
+
|
428
|
+
it 'should place the manifest as the first entry of the file' do
|
429
|
+
write 'src/main/java/Test.java', 'class Test {}'
|
430
|
+
define('foo', :version=>'1.0') { package(:jar) }
|
431
|
+
project('foo').package(:jar).invoke
|
432
|
+
Zip::File.open(project('foo').package(:jar).to_s) do |jar|
|
433
|
+
entries_to_s = jar.entries.map(&:to_s).delete_if {|entry| entry[-1,1] == "/"}
|
434
|
+
# Sometimes META-INF/ is counted as first entry, which is fair game.
|
435
|
+
(entries_to_s.first == 'META-INF/MANIFEST.MF' || entries_to_s[1] == 'META-INF/MANIFEST.MF').should be_true
|
436
|
+
end
|
437
|
+
end
|
438
|
+
|
439
|
+
it 'should use files from compile directory if nothing included' do
|
440
|
+
write 'src/main/java/Test.java', 'class Test {}'
|
441
|
+
define('foo', :version=>'1.0') { package(:jar) }
|
442
|
+
project('foo').package(:jar).invoke
|
443
|
+
Zip::File.open(project('foo').package(:jar).to_s) do |jar|
|
444
|
+
jar.entries.map(&:to_s).sort.should include('META-INF/MANIFEST.MF', 'Test.class')
|
445
|
+
end
|
446
|
+
end
|
447
|
+
|
448
|
+
it 'should use files from resources directory if nothing included' do
|
449
|
+
write 'src/main/resources/test/important.properties'
|
450
|
+
define('foo', :version=>'1.0') { package(:jar) }
|
451
|
+
project('foo').package(:jar).invoke
|
452
|
+
Zip::File.open(project('foo').package(:jar).to_s) do |jar|
|
453
|
+
jar.entries.map(&:to_s).sort.should include('test/important.properties')
|
454
|
+
end
|
455
|
+
end
|
456
|
+
|
457
|
+
it 'should include class directories' do
|
458
|
+
write 'src/main/java/code/Test.java', 'package code ; class Test {}'
|
459
|
+
define('foo', :version=>'1.0') { package(:jar) }
|
460
|
+
project('foo').package(:jar).invoke
|
461
|
+
Zip::File.open(project('foo').package(:jar).to_s) do |jar|
|
462
|
+
jar.entries.map(&:to_s).sort.should include('code/')
|
463
|
+
end
|
464
|
+
end
|
465
|
+
|
466
|
+
it 'should include resource files starting with dot' do
|
467
|
+
write 'src/main/resources/test/.config'
|
468
|
+
define('foo', :version=>'1.0') { package(:jar) }
|
469
|
+
project('foo').package(:jar).invoke
|
470
|
+
Zip::File.open(project('foo').package(:jar).to_s) do |jar|
|
471
|
+
jar.entries.map(&:to_s).sort.should include('test/.config')
|
472
|
+
end
|
473
|
+
end
|
474
|
+
|
475
|
+
it 'should include empty resource directories' do
|
476
|
+
mkpath 'src/main/resources/empty'
|
477
|
+
define('foo', :version=>'1.0') { package(:jar) }
|
478
|
+
project('foo').package(:jar).invoke
|
479
|
+
Zip::File.open(project('foo').package(:jar).to_s) do |jar|
|
480
|
+
jar.entries.map(&:to_s).sort.should include('empty/')
|
481
|
+
end
|
482
|
+
end
|
483
|
+
|
484
|
+
it 'should raise error when calling with() with nil value' do
|
485
|
+
lambda {
|
486
|
+
define('foo', :version=>'1.0') { package(:jar).with(nil) }
|
487
|
+
}.should raise_error
|
488
|
+
end
|
489
|
+
|
490
|
+
it 'should exclude resources when ordered to do so' do
|
491
|
+
write 'src/main/resources/foo.xml', ''
|
492
|
+
foo = define('foo', :version => '1.0') { package(:jar).exclude('foo.xml')}
|
493
|
+
foo.package(:jar).invoke
|
494
|
+
Zip::File.open(foo.package(:jar).to_s) do |jar|
|
495
|
+
jar.entries.map(&:to_s).sort.should_not include('foo.xml')
|
496
|
+
end
|
497
|
+
end
|
498
|
+
|
499
|
+
end
|
500
|
+
|
501
|
+
|
502
|
+
describe Packaging, 'war' do
|
503
|
+
it_should_behave_like 'packaging'
|
504
|
+
before { @packaging = :war }
|
505
|
+
it_should_behave_like 'package with manifest'
|
506
|
+
it_should_behave_like 'package with meta_inf'
|
507
|
+
before { @meta_inf_ignore = 'MANIFEST.MF' }
|
508
|
+
|
509
|
+
def make_jars
|
510
|
+
artifact('group:id:jar:1.0') { |t| write t.to_s }
|
511
|
+
artifact('group:id:jar:2.0') { |t| write t.to_s }
|
512
|
+
end
|
513
|
+
|
514
|
+
def inspect_war
|
515
|
+
project('foo').package(:war).invoke
|
516
|
+
Zip::File.open(project('foo').package(:war).to_s) do |war|
|
517
|
+
yield war.entries.map(&:to_s).sort
|
518
|
+
end
|
519
|
+
end
|
520
|
+
|
521
|
+
it 'should use files from webapp directory if nothing included' do
|
522
|
+
write 'src/main/webapp/test.html'
|
523
|
+
define('foo', :version=>'1.0') { package(:war) }
|
524
|
+
inspect_war { |files| files.should include('test.html') }
|
525
|
+
end
|
526
|
+
|
527
|
+
it 'should use files from added assets directory if nothing included' do
|
528
|
+
write 'generated/main/webapp/test.html'
|
529
|
+
define('foo', :version => '1.0') { assets.paths << 'generated/main/webapp/'; package(:war) }
|
530
|
+
inspect_war { |files| files.should include('test.html') }
|
531
|
+
end
|
532
|
+
|
533
|
+
it 'should use files from generated assets directory if nothing included' do
|
534
|
+
write 'generated/main/webapp/test.html'
|
535
|
+
define('foo', :version => '1.0') do
|
536
|
+
target_dir = _('generated/main/webapp')
|
537
|
+
assets.paths << project.file(target_dir) do
|
538
|
+
mkdir_p target_dir
|
539
|
+
touch "#{target_dir}/test.html"
|
540
|
+
touch target_dir
|
541
|
+
end
|
542
|
+
package(:war)
|
543
|
+
end
|
544
|
+
inspect_war { |files| files.should include('test.html') }
|
545
|
+
end
|
546
|
+
|
547
|
+
it 'should accept files from :classes option' do
|
548
|
+
write 'classes/test'
|
549
|
+
define('foo', :version=>'1.0') { package(:war).with(:classes=>'classes') }
|
550
|
+
inspect_war { |files| files.should include('WEB-INF/classes/test') }
|
551
|
+
end
|
552
|
+
|
553
|
+
it 'should use files from compile directory if nothing included' do
|
554
|
+
write 'src/main/java/Test.java', 'class Test {}'
|
555
|
+
define('foo', :version=>'1.0') { package(:war) }
|
556
|
+
inspect_war { |files| files.should include('WEB-INF/classes/Test.class') }
|
557
|
+
end
|
558
|
+
|
559
|
+
it 'should ignore compile directory if no source files to compile' do
|
560
|
+
define('foo', :version=>'1.0') { package(:war) }
|
561
|
+
inspect_war { |files| files.should_not include('target/classes') }
|
562
|
+
end
|
563
|
+
|
564
|
+
it 'should include only specified classes directories' do
|
565
|
+
write 'src/main/java'
|
566
|
+
define('foo', :version=>'1.0') { package(:war).with :classes=>_('additional') }
|
567
|
+
project('foo').package(:war).classes.should_not include(project('foo').file('target/classes'))
|
568
|
+
project('foo').package(:war).classes.should include(project('foo').file('additional'))
|
569
|
+
end
|
570
|
+
|
571
|
+
it 'should use files from resources directory if nothing included' do
|
572
|
+
write 'src/main/resources/test/important.properties'
|
573
|
+
define('foo', :version=>'1.0') { package(:war) }
|
574
|
+
inspect_war { |files| files.should include('WEB-INF/classes/test/important.properties') }
|
575
|
+
end
|
576
|
+
|
577
|
+
it 'should include empty resource directories' do
|
578
|
+
mkpath 'src/main/resources/empty'
|
579
|
+
define('foo', :version=>'1.0') { package(:war) }
|
580
|
+
inspect_war { |files| files.should include('WEB-INF/classes/empty/') }
|
581
|
+
end
|
582
|
+
|
583
|
+
it 'should accept file from :libs option' do
|
584
|
+
write 'lib/foo.jar'
|
585
|
+
define('foo', :version=>'1.0') { package(:war).libs << 'lib/foo.jar' }
|
586
|
+
inspect_war { |files| files.should include('META-INF/MANIFEST.MF', 'WEB-INF/lib/foo.jar') }
|
587
|
+
end
|
588
|
+
|
589
|
+
|
590
|
+
it 'should accept artifacts from :libs option' do
|
591
|
+
make_jars
|
592
|
+
define('foo', :version=>'1.0') { package(:war).with(:libs=>'group:id:jar:1.0') }
|
593
|
+
inspect_war { |files| files.should include('META-INF/MANIFEST.MF', 'WEB-INF/lib/id-1.0.jar') }
|
594
|
+
end
|
595
|
+
|
596
|
+
it 'should accept artifacts from :libs option' do
|
597
|
+
make_jars
|
598
|
+
define('foo', :version=>'1.0') { package(:war).with(:libs=>%w[group:id:jar:1.0 group:id:jar:2.0]) }
|
599
|
+
inspect_war { |files| files.should include('META-INF/MANIFEST.MF', 'WEB-INF/lib/id-1.0.jar', 'WEB-INF/lib/id-2.0.jar') }
|
600
|
+
end
|
601
|
+
|
602
|
+
it 'should use artifacts from compile classpath if no libs specified' do
|
603
|
+
make_jars
|
604
|
+
define('foo', :version=>'1.0') { compile.with 'group:id:jar:1.0', 'group:id:jar:2.0' ; package(:war) }
|
605
|
+
inspect_war { |files| files.should include('META-INF/MANIFEST.MF', 'WEB-INF/lib/id-1.0.jar', 'WEB-INF/lib/id-2.0.jar') }
|
606
|
+
end
|
607
|
+
|
608
|
+
it 'should use artifacts from compile classpath if no libs specified, leaving the user specify which to exclude as files' do
|
609
|
+
make_jars
|
610
|
+
define('foo', :version=>'1.0') { compile.with 'group:id:jar:1.0', 'group:id:jar:2.0' ; package(:war).path('WEB-INF/lib').exclude('id-2.0.jar') }
|
611
|
+
inspect_war { |files| files.should include('META-INF/MANIFEST.MF', 'WEB-INF/lib/id-1.0.jar') }
|
612
|
+
end
|
613
|
+
|
614
|
+
it 'should use artifacts from compile classpath if no libs specified, leaving the user specify which to exclude as files with glob expressions' do
|
615
|
+
make_jars
|
616
|
+
define('foo', :version=>'1.0') { compile.with 'group:id:jar:1.0', 'group:id:jar:2.0' ; package(:war).path('WEB-INF/lib').exclude('**/id-2.0.jar') }
|
617
|
+
inspect_war { |files| files.should include('META-INF/MANIFEST.MF', 'WEB-INF/lib/id-1.0.jar') }
|
618
|
+
end
|
619
|
+
|
620
|
+
it 'should exclude files regardless of the path where they are included, using wildcards' do
|
621
|
+
make_jars
|
622
|
+
define('foo', :version=>'1.0') { compile.with 'group:id:jar:1.0', 'group:id:jar:2.0' ; package(:war).exclude('**/id-2.0.jar') }
|
623
|
+
inspect_war { |files| files.should include('META-INF/MANIFEST.MF', 'WEB-INF/lib/id-1.0.jar') }
|
624
|
+
end
|
625
|
+
|
626
|
+
it 'should exclude files regardless of the path where they are included, specifying target path entirely' do
|
627
|
+
make_jars
|
628
|
+
define('foo', :version=>'1.0') { compile.with 'group:id:jar:1.0', 'group:id:jar:2.0' ; package(:war).exclude('WEB-INF/lib/id-2.0.jar') }
|
629
|
+
inspect_war { |files| files.should include('META-INF/MANIFEST.MF', 'WEB-INF/lib/id-1.0.jar') }
|
630
|
+
end
|
631
|
+
|
632
|
+
it 'should exclude files regardless of the path where they are included for war files' do
|
633
|
+
write 'src/main/java/com/example/included/Test.java', 'package com.example.included; class Test {}'
|
634
|
+
write 'src/main/java/com/example/excluded/Test.java', 'package com.example.excluded; class Test {}'
|
635
|
+
define('foo', :version=>'1.0') do
|
636
|
+
package(:war).enhance do |war|
|
637
|
+
war.exclude('WEB-INF/classes/com/example/excluded/**.class')
|
638
|
+
end
|
639
|
+
end
|
640
|
+
inspect_war do |files|
|
641
|
+
files.should include('WEB-INF/classes/com/example/included/Test.class')
|
642
|
+
files.should_not include('WEB-INF/classes/com/example/excluded/Test.class')
|
643
|
+
end
|
644
|
+
end
|
645
|
+
|
646
|
+
it 'should include only specified libraries' do
|
647
|
+
define 'foo', :version=>'1.0' do
|
648
|
+
compile.with 'group:id:jar:1.0'
|
649
|
+
package(:war).with :libs=>'additional:id:jar:1.0'
|
650
|
+
end
|
651
|
+
project('foo').package(:war).libs.should_not include(artifact('group:id:jar:1.0'))
|
652
|
+
project('foo').package(:war).libs.should include(artifact('additional:id:jar:1.0'))
|
653
|
+
end
|
654
|
+
|
655
|
+
end
|
656
|
+
|
657
|
+
describe Packaging, 'sources' do
|
658
|
+
it_should_behave_like 'packaging'
|
659
|
+
before { @packaging, @package_type = :sources, :jar }
|
660
|
+
|
661
|
+
it 'should create package of type :jar and classifier \'sources\'' do
|
662
|
+
define 'foo', :version=>'1.0' do
|
663
|
+
package(:sources).type.should eql(:jar)
|
664
|
+
package(:sources).classifier.should eql('sources')
|
665
|
+
package(:sources).name.should match(/foo-1.0-sources.jar$/)
|
666
|
+
end
|
667
|
+
end
|
668
|
+
|
669
|
+
it 'should contain source and resource files' do
|
670
|
+
write 'src/main/java/Source.java'
|
671
|
+
write 'src/main/resources/foo.properties', 'foo=bar'
|
672
|
+
define('foo', :version=>'1.0') { package(:sources) }
|
673
|
+
project('foo').task('package').invoke
|
674
|
+
project('foo').packages.first.should contain('Source.java')
|
675
|
+
project('foo').packages.first.should contain('foo.properties')
|
676
|
+
end
|
677
|
+
|
678
|
+
it 'should create sources jar if resources exists (but not sources)' do
|
679
|
+
write 'src/main/resources/foo.properties', 'foo=bar'
|
680
|
+
define('foo', :version=>'1.0') { package(:sources) }
|
681
|
+
project('foo').package(:sources).invoke
|
682
|
+
project('foo').packages.first.should contain('foo.properties')
|
683
|
+
end
|
684
|
+
|
685
|
+
it 'should be a ZipTask' do
|
686
|
+
define 'foo', :version=>'1.0' do
|
687
|
+
package(:sources).should be_kind_of(ZipTask)
|
688
|
+
end
|
689
|
+
end
|
690
|
+
end
|
691
|
+
|
692
|
+
describe Packaging, 'javadoc' do
|
693
|
+
it_should_behave_like 'packaging'
|
694
|
+
before { @packaging, @package_type = :javadoc, :jar }
|
695
|
+
|
696
|
+
it 'should create package of type :zip and classifier \'javadoc\'' do
|
697
|
+
define 'foo', :version=>'1.0' do
|
698
|
+
package(:javadoc).type.should eql(:jar)
|
699
|
+
package(:javadoc).classifier.should eql('javadoc')
|
700
|
+
package(:javadoc).name.pathmap('%f').should eql('foo-1.0-javadoc.jar')
|
701
|
+
end
|
702
|
+
end
|
703
|
+
|
704
|
+
it 'should contain Javadocs' do
|
705
|
+
write 'src/main/java/Source.java', 'public class Source {}'
|
706
|
+
define('foo', :version=>'1.0') { package(:javadoc) }
|
707
|
+
project('foo').task('package').invoke
|
708
|
+
project('foo').packages.first.should contain('Source.html', 'index.html')
|
709
|
+
end
|
710
|
+
|
711
|
+
it 'should use project description in window title' do
|
712
|
+
write 'src/main/java/Source.java', 'public class Source {}'
|
713
|
+
desc 'My Project'
|
714
|
+
define('foo', :version=>'1.0') { package(:javadoc) }
|
715
|
+
project('foo').task('package').invoke
|
716
|
+
project('foo').packages.first.entry('index.html').should contain('My Project')
|
717
|
+
end
|
718
|
+
|
719
|
+
it 'should be a ZipTask' do
|
720
|
+
define 'foo', :version=>'1.0' do
|
721
|
+
package(:javadoc).should be_kind_of(ZipTask)
|
722
|
+
end
|
723
|
+
end
|
724
|
+
end
|
725
|
+
|
726
|
+
RSpec.shared_examples 'package_with_' do
|
727
|
+
|
728
|
+
def prepare(options = {})
|
729
|
+
packager = "package_with_#{@packaging}"
|
730
|
+
write 'src/main/java/Source.java'
|
731
|
+
write 'baz/src/main/java/Source.java'
|
732
|
+
define 'foo', :version=>'1.0' do
|
733
|
+
send packager, options
|
734
|
+
define 'bar' ; define 'baz'
|
735
|
+
end
|
736
|
+
end
|
737
|
+
|
738
|
+
def applied_to
|
739
|
+
projects.select { |project| project.packages.first }.map(&:name)
|
740
|
+
end
|
741
|
+
|
742
|
+
it 'should create package of the right packaging with classifier' do
|
743
|
+
prepare
|
744
|
+
project('foo').packages.first.to_s.should =~ /foo-1.0-#{@packaging}.#{@ext}/
|
745
|
+
end
|
746
|
+
|
747
|
+
it 'should create package for projects that have source files' do
|
748
|
+
prepare
|
749
|
+
applied_to.should include('foo', 'foo:baz')
|
750
|
+
end
|
751
|
+
|
752
|
+
it 'should not create package for projects that have no source files' do
|
753
|
+
prepare
|
754
|
+
applied_to.should_not include('foo:bar')
|
755
|
+
end
|
756
|
+
|
757
|
+
it 'should limit to projects specified by :only' do
|
758
|
+
prepare :only=>'baz'
|
759
|
+
applied_to.should eql(['foo:baz'])
|
760
|
+
end
|
761
|
+
|
762
|
+
it 'should limit to projects specified by :only array' do
|
763
|
+
prepare :only=>['baz']
|
764
|
+
applied_to.should eql(['foo:baz'])
|
765
|
+
end
|
766
|
+
|
767
|
+
it 'should ignore project specified by :except' do
|
768
|
+
prepare :except=>'baz'
|
769
|
+
applied_to.should eql(['foo'])
|
770
|
+
end
|
771
|
+
|
772
|
+
it 'should ignore projects specified by :except array' do
|
773
|
+
prepare :except=>['baz']
|
774
|
+
applied_to.should eql(['foo'])
|
775
|
+
end
|
776
|
+
end
|
777
|
+
|
778
|
+
describe 'package_with_sources' do
|
779
|
+
it_should_behave_like 'package_with_'
|
780
|
+
before { @packaging, @ext = :sources, 'jar' }
|
781
|
+
end
|
782
|
+
|
783
|
+
describe 'package_with_javadoc' do
|
784
|
+
it_should_behave_like 'package_with_'
|
785
|
+
before { @packaging, @ext = :javadoc, 'jar' }
|
786
|
+
end
|