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,1351 @@
|
|
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
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helpers'))
|
17
|
+
require 'fileutils'
|
18
|
+
|
19
|
+
describe Artifact do
|
20
|
+
before do
|
21
|
+
Buildr.repositories.instance_eval do
|
22
|
+
@local = @remote = @release_to = nil
|
23
|
+
end
|
24
|
+
@spec = { :group=>'com.example', :id=>'library', :type=>:jar, :version=>'2.0' }
|
25
|
+
@artifact = artifact(@spec)
|
26
|
+
@classified = artifact(@spec.merge(:classifier=>'all'))
|
27
|
+
@snapshot = artifact(@spec.merge({ :version=>'2.1-SNAPSHOT' }))
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
it 'should act as one' do
|
32
|
+
@artifact.should respond_to(:to_spec)
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'should have an artifact identifier' do
|
36
|
+
@artifact.id.should eql('library')
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'should have a group identifier' do
|
40
|
+
@artifact.group.should eql('com.example')
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'should have a version number' do
|
44
|
+
@artifact.version.should eql('2.0')
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'should know if it is a snapshot' do
|
48
|
+
@artifact.should_not be_snapshot
|
49
|
+
@classified.should_not be_snapshot
|
50
|
+
@snapshot.should be_snapshot
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'should have a file type' do
|
54
|
+
@artifact.type.should eql(:jar)
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'should understand classifier' do
|
58
|
+
@artifact.classifier.should be_nil
|
59
|
+
@classified.classifier.should eql('all')
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'should return hash specification' do
|
63
|
+
@artifact.to_hash.should == @spec
|
64
|
+
@artifact.to_spec_hash.should == @spec
|
65
|
+
@classified.to_hash.should == @spec.merge(:classifier=>'all')
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'should return string specification' do
|
69
|
+
@artifact.to_spec.should eql('com.example:library:jar:2.0')
|
70
|
+
@classified.to_spec.should eql('com.example:library:jar:all:2.0')
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'should have associated POM artifact' do
|
74
|
+
@artifact.pom.to_hash.should == @artifact.to_hash.merge(:type=>:pom)
|
75
|
+
end
|
76
|
+
|
77
|
+
it 'should have one POM artifact for all classifiers' do
|
78
|
+
spec_hash = @classified.to_hash.merge(:type => :pom)
|
79
|
+
spec_hash.delete(:classifier)
|
80
|
+
@classified.pom.to_hash.should == spec_hash
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'should have associated sources artifact' do
|
84
|
+
@artifact.sources_artifact.to_hash.should == @artifact.to_hash.merge(:classifier=>'sources')
|
85
|
+
end
|
86
|
+
|
87
|
+
it 'should have associated javadoc artifact' do
|
88
|
+
@artifact.javadoc_artifact.to_hash.should == @artifact.to_hash.merge(:classifier=>'javadoc')
|
89
|
+
end
|
90
|
+
|
91
|
+
it 'should download file if file does not exist' do
|
92
|
+
lambda { @artifact.invoke }.should raise_error(Exception, /No remote repositories/)
|
93
|
+
lambda { @classified.invoke }.should raise_error(Exception, /No remote repositories/)
|
94
|
+
end
|
95
|
+
|
96
|
+
it 'should not download file if file exists' do
|
97
|
+
write repositories.locate(@artifact)
|
98
|
+
lambda { @artifact.invoke }.should_not raise_error
|
99
|
+
write repositories.locate(@classified)
|
100
|
+
lambda { @classified.invoke }.should_not raise_error
|
101
|
+
end
|
102
|
+
|
103
|
+
it 'should handle lack of POM gracefully' do
|
104
|
+
repositories.remote = 'http://buildr.apache.org/repository/noexist'
|
105
|
+
URI.should_receive(:download).twice { |*args| raise URI::NotFoundError if args[0].to_s.end_with?('.pom') }
|
106
|
+
lambda { @artifact.invoke }.should_not raise_error
|
107
|
+
end
|
108
|
+
|
109
|
+
it 'should pass if POM provided' do
|
110
|
+
repositories.remote = 'http://buildr.apache.org/repository/noexist'
|
111
|
+
@artifact.pom.enhance { |task| write task.name, @artifact.pom_xml.call }
|
112
|
+
write repositories.locate(@artifact)
|
113
|
+
lambda { @artifact.invoke }.should_not raise_error
|
114
|
+
end
|
115
|
+
|
116
|
+
it 'should pass if POM not required' do
|
117
|
+
repositories.remote = 'http://buildr.apache.org/repository/noexist'
|
118
|
+
class << @artifact ; def pom() ; end ; end
|
119
|
+
write repositories.locate(@artifact)
|
120
|
+
lambda { @artifact.invoke }.should_not raise_error
|
121
|
+
end
|
122
|
+
|
123
|
+
it 'should not download file if dry-run' do
|
124
|
+
dryrun do
|
125
|
+
lambda { @artifact.invoke }.should_not raise_error
|
126
|
+
lambda { @classified.invoke }.should_not raise_error
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
it 'should resolve to path in local repository' do
|
131
|
+
@artifact.to_s.should == File.join(repositories.local, 'com/example/library/2.0/library-2.0.jar')
|
132
|
+
@classified.to_s.should == File.join(repositories.local, 'com/example/library/2.0/library-2.0-all.jar')
|
133
|
+
end
|
134
|
+
|
135
|
+
it 'should return a list of all registered artifact specifications' do
|
136
|
+
define('foo', :version=>'1.0') { package :jar }
|
137
|
+
Artifact.list.should include(@artifact.to_spec)
|
138
|
+
Artifact.list.should include(@classified.to_spec)
|
139
|
+
Artifact.list.should include('foo:foo:jar:1.0')
|
140
|
+
end
|
141
|
+
|
142
|
+
it 'should accept user-defined string content' do
|
143
|
+
a = artifact(@spec)
|
144
|
+
a.content 'foo'
|
145
|
+
install a
|
146
|
+
lambda { install.invoke }.should change { File.exist?(a.to_s) && File.exist?(repositories.locate(a)) }.to(true)
|
147
|
+
read(repositories.locate(a)).should eql('foo')
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
|
152
|
+
describe Repositories, 'local' do
|
153
|
+
before do
|
154
|
+
Buildr.repositories.instance_eval do
|
155
|
+
@local = @remote = @release_to = nil
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
it 'should default to .m2 path' do
|
160
|
+
# For convenience, sandbox actually sets the local repository to a temp directory
|
161
|
+
repositories.local = nil
|
162
|
+
repositories.local.should eql(File.expand_path('.m2/repository', ENV['HOME']))
|
163
|
+
end
|
164
|
+
|
165
|
+
it 'should be settable' do
|
166
|
+
repositories.local = '.m2/local'
|
167
|
+
repositories.local.should eql(File.expand_path('.m2/local'))
|
168
|
+
end
|
169
|
+
|
170
|
+
it 'should reset to default' do
|
171
|
+
repositories.local = '.m2/local'
|
172
|
+
repositories.local = nil
|
173
|
+
repositories.local.should eql(File.expand_path('~/.m2/repository'))
|
174
|
+
end
|
175
|
+
|
176
|
+
it 'should locate file from string specification' do
|
177
|
+
repositories.local = nil
|
178
|
+
repositories.locate('com.example:library:jar:2.0').should eql(
|
179
|
+
File.expand_path('~/.m2/repository/com/example/library/2.0/library-2.0.jar'))
|
180
|
+
end
|
181
|
+
|
182
|
+
it 'should locate file from hash specification' do
|
183
|
+
repositories.local = nil
|
184
|
+
repositories.locate(:group=>'com.example', :id=>'library', :version=>'2.0').should eql(
|
185
|
+
File.expand_path('~/.m2/repository/com/example/library/2.0/library-2.0.jar'))
|
186
|
+
end
|
187
|
+
|
188
|
+
it 'should load path from settings file' do
|
189
|
+
write 'home/.buildr/settings.yaml', <<-YAML
|
190
|
+
repositories:
|
191
|
+
local: my_repo
|
192
|
+
YAML
|
193
|
+
repositories.local.should eql(File.expand_path('my_repo'))
|
194
|
+
end
|
195
|
+
|
196
|
+
it 'should not override custom install methods defined when extending an object' do
|
197
|
+
class MyOwnInstallTask
|
198
|
+
|
199
|
+
attr_accessor :result
|
200
|
+
|
201
|
+
def install
|
202
|
+
result = true
|
203
|
+
end
|
204
|
+
|
205
|
+
end
|
206
|
+
task = MyOwnInstallTask.new
|
207
|
+
task.result = "maybe"
|
208
|
+
task.extend ActsAsArtifact
|
209
|
+
task.install
|
210
|
+
task.result.should be_true
|
211
|
+
end
|
212
|
+
end
|
213
|
+
|
214
|
+
describe Repositories, 'remote_uri' do
|
215
|
+
before do
|
216
|
+
Buildr.repositories.instance_eval do
|
217
|
+
@local = @remote = @release_to = nil
|
218
|
+
end
|
219
|
+
|
220
|
+
@repos = [ 'https://oss.sonatype.org/', { :url => 'https://repo1.maven.org/maven2', :username => 'user', :password => 'password' } ]
|
221
|
+
end
|
222
|
+
|
223
|
+
it 'should convert remote to array of uri' do
|
224
|
+
uri = URI.parse( 'https://repo1.maven.org/maven2' )
|
225
|
+
uri.user = 'user'
|
226
|
+
uri.password = 'password'
|
227
|
+
|
228
|
+
uris = [ URI.parse( 'https://oss.sonatype.org/'), uri ]
|
229
|
+
|
230
|
+
repositories.remote = @repos
|
231
|
+
repositories.remote_uri.should eql(uris)
|
232
|
+
end
|
233
|
+
end
|
234
|
+
|
235
|
+
describe Repositories, 'mirrors' do
|
236
|
+
before do
|
237
|
+
Buildr.repositories.instance_eval do
|
238
|
+
@local = @remote = @release_to = @mirrors = nil
|
239
|
+
end
|
240
|
+
|
241
|
+
@repos = %w(http://www.ibiblio.org/maven2 https://repo1.maven.org/maven2)
|
242
|
+
end
|
243
|
+
|
244
|
+
it 'should be empty initially' do
|
245
|
+
repositories.mirrors.should be_empty
|
246
|
+
end
|
247
|
+
|
248
|
+
it 'should be settable' do
|
249
|
+
repositories.mirrors = @repos.first
|
250
|
+
repositories.mirrors.should eql([@repos.first])
|
251
|
+
end
|
252
|
+
|
253
|
+
it 'should be settable from array' do
|
254
|
+
repositories.mirrors = @repos
|
255
|
+
repositories.mirrors.should eql(@repos)
|
256
|
+
end
|
257
|
+
|
258
|
+
it 'should add and return repositories in order' do
|
259
|
+
@repos.each { |url| repositories.mirrors << url }
|
260
|
+
repositories.mirrors.should eql(@repos)
|
261
|
+
end
|
262
|
+
|
263
|
+
it 'should log that it is overridding the remote repositories with the mirrors' do
|
264
|
+
@repos.each { |url| repositories.mirrors << url }
|
265
|
+
lambda { repositories.remote }.should show_info /Remote repositories overridden by mirrors /
|
266
|
+
end
|
267
|
+
|
268
|
+
it 'should load with all repositories specified in settings file' do
|
269
|
+
write 'home/.buildr/settings.yaml', <<-YAML
|
270
|
+
repositories:
|
271
|
+
mirrors:
|
272
|
+
- http://example.com/repository/noexist
|
273
|
+
remote:
|
274
|
+
- http://foobar.com
|
275
|
+
YAML
|
276
|
+
repositories.mirrors.should include('http://example.com/repository/noexist')
|
277
|
+
end
|
278
|
+
|
279
|
+
it 'should load with all repositories specified in build.yaml file' do
|
280
|
+
write 'build.yaml', <<-YAML
|
281
|
+
repositories:
|
282
|
+
mirrors:
|
283
|
+
- http://example.com/repository/noexist
|
284
|
+
remote:
|
285
|
+
- http://foobar.com
|
286
|
+
YAML
|
287
|
+
repositories.mirrors.should include('http://example.com/repository/noexist')
|
288
|
+
end
|
289
|
+
|
290
|
+
it 'should load with all repositories specified in settings and build.yaml files' do
|
291
|
+
write 'home/.buildr/settings.yaml', <<-YAML
|
292
|
+
repositories:
|
293
|
+
mirrors:
|
294
|
+
- http://example.com/repository/noexist
|
295
|
+
remote:
|
296
|
+
- http://foobar.com
|
297
|
+
YAML
|
298
|
+
write 'build.yaml', <<-YAML
|
299
|
+
repositories:
|
300
|
+
mirrors:
|
301
|
+
- http://example.com/repo2
|
302
|
+
remote:
|
303
|
+
- http://foobar.com
|
304
|
+
YAML
|
305
|
+
repositories.mirrors.should include('http://example.com/repository/noexist', 'http://example.com/repo2')
|
306
|
+
end
|
307
|
+
end
|
308
|
+
|
309
|
+
describe Repositories, 'remote' do
|
310
|
+
before do
|
311
|
+
Buildr.repositories.instance_eval do
|
312
|
+
@local = @remote = @release_to = nil
|
313
|
+
end
|
314
|
+
|
315
|
+
@repos = %w(http://www.ibiblio.org/maven2 https://repo1.maven.org/maven2)
|
316
|
+
end
|
317
|
+
|
318
|
+
it 'should be empty initially' do
|
319
|
+
repositories.remote.should be_empty
|
320
|
+
end
|
321
|
+
|
322
|
+
it 'should be settable' do
|
323
|
+
repositories.remote = @repos.first
|
324
|
+
repositories.remote.should eql([@repos.first])
|
325
|
+
end
|
326
|
+
|
327
|
+
it 'should be settable from array' do
|
328
|
+
repositories.remote = @repos
|
329
|
+
repositories.remote.should eql(@repos)
|
330
|
+
end
|
331
|
+
|
332
|
+
it 'should add and return repositories in order' do
|
333
|
+
@repos.each { |url| repositories.remote << url }
|
334
|
+
repositories.remote.should eql(@repos)
|
335
|
+
end
|
336
|
+
|
337
|
+
it 'should be used to download artifact' do
|
338
|
+
repositories.remote = 'http://buildr.apache.org/repository/noexist'
|
339
|
+
URI.should_receive(:download).twice.and_return { |uri, target, options| write target }
|
340
|
+
lambda { artifact('com.example:library:jar:2.0').invoke }.
|
341
|
+
should change { File.exist?(File.join(repositories.local, 'com/example/library/2.0/library-2.0.jar')) }.to(true)
|
342
|
+
end
|
343
|
+
|
344
|
+
it 'should lookup in array order' do
|
345
|
+
repositories.remote = %w[http://buildr.apache.org/repository/noexist http://example.org]
|
346
|
+
order = %w[com org]
|
347
|
+
URI.stub(:download) do |uri, target, options|
|
348
|
+
order.shift if order.first && uri.to_s[order.first]
|
349
|
+
fail URI::NotFoundError unless order.empty?
|
350
|
+
write target
|
351
|
+
end
|
352
|
+
lambda { artifact('com.example:library:jar:2.0').invoke }.should change { order.empty? }
|
353
|
+
end
|
354
|
+
|
355
|
+
it 'should fail if artifact not found' do
|
356
|
+
repositories.remote = 'http://buildr.apache.org/repository/noexist'
|
357
|
+
URI.should_receive(:download).once.ordered.and_return { fail URI::NotFoundError }
|
358
|
+
lambda { artifact('com.example:library:jar:2.0').invoke }.should raise_error(RuntimeError, /Failed to download/)
|
359
|
+
File.exist?(File.join(repositories.local, 'com/example/library/2.0/library-2.0.jar')).should be_false
|
360
|
+
end
|
361
|
+
|
362
|
+
it 'should support artifact classifier' do
|
363
|
+
repositories.remote = 'http://buildr.apache.org/repository/noexist'
|
364
|
+
URI.should_receive(:download).once.and_return { |uri, target, options| write target }
|
365
|
+
lambda { artifact('com.example:library:jar:all:2.0').invoke }.
|
366
|
+
should change { File.exist?(File.join(repositories.local, 'com/example/library/2.0/library-2.0-all.jar')) }.to(true)
|
367
|
+
end
|
368
|
+
|
369
|
+
it 'should deal well with repositories URL that lack the last slash' do
|
370
|
+
repositories.remote = 'http://buildr.apache.org/repository/noexist/base'
|
371
|
+
uri = nil
|
372
|
+
URI.should_receive(:download).twice.and_return { |_uri, args| uri = _uri }
|
373
|
+
artifact('group:id:jar:1.0').invoke
|
374
|
+
uri.to_s.should eql('http://buildr.apache.org/repository/noexist/base/group/id/1.0/id-1.0.pom')
|
375
|
+
end
|
376
|
+
|
377
|
+
it 'should deal well with repositories URL that have the last slash' do
|
378
|
+
repositories.remote = 'http://buildr.apache.org/repository/noexist/base/'
|
379
|
+
uri = nil
|
380
|
+
URI.should_receive(:download).twice.and_return { |_uri, args| uri = _uri }
|
381
|
+
artifact('group:id:jar:1.0').invoke
|
382
|
+
uri.to_s.should eql('http://buildr.apache.org/repository/noexist/base/group/id/1.0/id-1.0.pom')
|
383
|
+
end
|
384
|
+
|
385
|
+
it 'should resolve m2-style deployed snapshots' do
|
386
|
+
metadata = <<-XML
|
387
|
+
<?xml version='1.0' encoding='UTF-8'?>
|
388
|
+
<metadata>
|
389
|
+
<groupId>com.example</groupId>
|
390
|
+
<artifactId>library</artifactId>
|
391
|
+
<version>2.1-SNAPSHOT</version>
|
392
|
+
<versioning>
|
393
|
+
<snapshot>
|
394
|
+
<timestamp>20071012.190008</timestamp>
|
395
|
+
<buildNumber>8</buildNumber>
|
396
|
+
</snapshot>
|
397
|
+
<lastUpdated>20071012190008</lastUpdated>
|
398
|
+
</versioning>
|
399
|
+
</metadata>
|
400
|
+
XML
|
401
|
+
repositories.remote = 'http://buildr.apache.org/repository/noexist'
|
402
|
+
URI.should_receive(:download).twice.with(uri(/2.1-SNAPSHOT\/library-2.1-SNAPSHOT.(jar|pom)$/), anything()).
|
403
|
+
and_return { fail URI::NotFoundError }
|
404
|
+
URI.should_receive(:download).twice.with(uri(/2.1-SNAPSHOT\/maven-metadata.xml$/), duck_type(:write)).
|
405
|
+
and_return { |uri, target, options| target.write(metadata) }
|
406
|
+
URI.should_receive(:download).twice.with(uri(/2.1-SNAPSHOT\/library-2.1-20071012.190008-8.(jar|pom)$/), /2.1-SNAPSHOT\/library-2.1-SNAPSHOT.(jar|pom).(\d){1,}$/).
|
407
|
+
and_return { |uri, target, options| write target }
|
408
|
+
lambda { artifact('com.example:library:jar:2.1-SNAPSHOT').invoke }.
|
409
|
+
should change { File.exist?(File.join(repositories.local, 'com/example/library/2.1-SNAPSHOT/library-2.1-SNAPSHOT.jar')) }.to(true)
|
410
|
+
end
|
411
|
+
|
412
|
+
it 'should resolve m2-style deployed snapshots with classifiers' do
|
413
|
+
metadata = <<-XML
|
414
|
+
<?xml version='1.0' encoding='UTF-8'?>
|
415
|
+
<metadata>
|
416
|
+
<groupId>com.example</groupId>
|
417
|
+
<artifactId>library</artifactId>
|
418
|
+
<version>2.1-SNAPSHOT</version>
|
419
|
+
<versioning>
|
420
|
+
<snapshot>
|
421
|
+
<timestamp>20071012.190008</timestamp>
|
422
|
+
<buildNumber>8</buildNumber>
|
423
|
+
</snapshot>
|
424
|
+
<lastUpdated>20071012190008</lastUpdated>
|
425
|
+
</versioning>
|
426
|
+
</metadata>
|
427
|
+
XML
|
428
|
+
repositories.remote = 'http://buildr.apache.org/repository/noexist'
|
429
|
+
URI.should_receive(:download).once.with(uri(/2.1-SNAPSHOT\/library-2.1-20071012.190008-8-classifier.jar$/), anything()).
|
430
|
+
and_return { |uri, target, options| write target }
|
431
|
+
URI.should_receive(:download).once.with(uri(/2.1-SNAPSHOT\/maven-metadata.xml$/), duck_type(:write)).
|
432
|
+
and_return { |uri, target, options| target.write(metadata) }
|
433
|
+
puts repositories.local
|
434
|
+
lambda { artifact('com.example:library:jar:classifier:2.1-SNAPSHOT').invoke}.
|
435
|
+
should change {File.exists?(File.join(repositories.local, 'com/example/library/2.1-SNAPSHOT/library-2.1-SNAPSHOT-classifier.jar')) }.to(true)
|
436
|
+
end
|
437
|
+
|
438
|
+
it 'should fail resolving m2-style deployed snapshots if a timestamp is missing' do
|
439
|
+
metadata = <<-XML
|
440
|
+
<?xml version='1.0' encoding='UTF-8'?>
|
441
|
+
<metadata>
|
442
|
+
<groupId>com.example</groupId>
|
443
|
+
<artifactId>library</artifactId>
|
444
|
+
<version>2.1-SNAPSHOT</version>
|
445
|
+
<versioning>
|
446
|
+
<snapshot>
|
447
|
+
<buildNumber>8</buildNumber>
|
448
|
+
</snapshot>
|
449
|
+
<lastUpdated>20071012190008</lastUpdated>
|
450
|
+
</versioning>
|
451
|
+
</metadata>
|
452
|
+
XML
|
453
|
+
repositories.remote = 'http://buildr.apache.org/repository/noexist'
|
454
|
+
URI.should_receive(:download).once.with(uri(/2.1-SNAPSHOT\/library-2.1-SNAPSHOT.(jar|pom)$/), anything()).
|
455
|
+
and_return { fail URI::NotFoundError }
|
456
|
+
URI.should_receive(:download).once.with(uri(/2.1-SNAPSHOT\/maven-metadata.xml$/), duck_type(:write)).
|
457
|
+
and_return { |uri, target, options| target.write(metadata) }
|
458
|
+
lambda {
|
459
|
+
lambda { artifact('com.example:library:jar:2.1-SNAPSHOT').invoke }.should raise_error(RuntimeError, /Failed to download/)
|
460
|
+
}.should show_error "No timestamp provided for the snapshot com.example:library:jar:2.1-SNAPSHOT"
|
461
|
+
File.exist?(File.join(repositories.local, 'com/example/library/2.1-SNAPSHOT/library-2.1-SNAPSHOT.jar')).should be_false
|
462
|
+
end
|
463
|
+
|
464
|
+
it 'should fail resolving m2-style deployed snapshots if a build number is missing' do
|
465
|
+
metadata = <<-XML
|
466
|
+
<?xml version='1.0' encoding='UTF-8'?>
|
467
|
+
<metadata>
|
468
|
+
<groupId>com.example</groupId>
|
469
|
+
<artifactId>library</artifactId>
|
470
|
+
<version>2.1-SNAPSHOT</version>
|
471
|
+
<versioning>
|
472
|
+
<snapshot>
|
473
|
+
<timestamp>20071012.190008</timestamp>
|
474
|
+
</snapshot>
|
475
|
+
<lastUpdated>20071012190008</lastUpdated>
|
476
|
+
</versioning>
|
477
|
+
</metadata>
|
478
|
+
XML
|
479
|
+
repositories.remote = 'http://buildr.apache.org/repository/noexist'
|
480
|
+
URI.should_receive(:download).once.with(uri(/2.1-SNAPSHOT\/library-2.1-SNAPSHOT.(jar|pom)$/), anything()).
|
481
|
+
and_return { fail URI::NotFoundError }
|
482
|
+
URI.should_receive(:download).once.with(uri(/2.1-SNAPSHOT\/maven-metadata.xml$/), duck_type(:write)).
|
483
|
+
and_return { |uri, target, options| target.write(metadata) }
|
484
|
+
lambda {
|
485
|
+
lambda { artifact('com.example:library:jar:2.1-SNAPSHOT').invoke }.should raise_error(RuntimeError, /Failed to download/)
|
486
|
+
}.should show_error "No build number provided for the snapshot com.example:library:jar:2.1-SNAPSHOT"
|
487
|
+
File.exist?(File.join(repositories.local, 'com/example/library/2.1-SNAPSHOT/library-2.1-SNAPSHOT.jar')).should be_false
|
488
|
+
end
|
489
|
+
|
490
|
+
it 'should handle missing maven metadata by reporting the artifact unavailable' do
|
491
|
+
repositories.remote = 'http://buildr.apache.org/repository/noexist'
|
492
|
+
URI.should_receive(:download).with(uri(/2.1-SNAPSHOT\/library-2.1-SNAPSHOT.jar$/), anything()).
|
493
|
+
and_return { fail URI::NotFoundError }
|
494
|
+
URI.should_receive(:download).with(uri(/2.1-SNAPSHOT\/maven-metadata.xml$/), duck_type(:write)).
|
495
|
+
and_return { fail URI::NotFoundError }
|
496
|
+
lambda { artifact('com.example:library:jar:2.1-SNAPSHOT').invoke }.should raise_error(RuntimeError, /Failed to download/)
|
497
|
+
File.exist?(File.join(repositories.local, 'com/example/library/2.1-SNAPSHOT/library-2.1-SNAPSHOT.jar')).should be_false
|
498
|
+
end
|
499
|
+
|
500
|
+
it 'should handle missing m2 snapshots by reporting the artifact unavailable' do
|
501
|
+
metadata = <<-XML
|
502
|
+
<?xml version='1.0' encoding='UTF-8'?>
|
503
|
+
<metadata>
|
504
|
+
<groupId>com.example</groupId>
|
505
|
+
<artifactId>library</artifactId>
|
506
|
+
<version>2.1-SNAPSHOT</version>
|
507
|
+
<versioning>
|
508
|
+
<snapshot>
|
509
|
+
<timestamp>20071012.190008</timestamp>
|
510
|
+
<buildNumber>8</buildNumber>
|
511
|
+
</snapshot>
|
512
|
+
<lastUpdated>20071012190008</lastUpdated>
|
513
|
+
</versioning>
|
514
|
+
</metadata>
|
515
|
+
XML
|
516
|
+
repositories.remote = 'http://buildr.apache.org/repository/noexist'
|
517
|
+
URI.should_receive(:download).with(uri(/2.1-SNAPSHOT\/library-2.1-SNAPSHOT.jar$/), anything()).
|
518
|
+
and_return { fail URI::NotFoundError }
|
519
|
+
URI.should_receive(:download).with(uri(/2.1-SNAPSHOT\/maven-metadata.xml$/), duck_type(:write)).
|
520
|
+
and_return { |uri, target, options| target.write(metadata) }
|
521
|
+
URI.should_receive(:download).with(uri(/2.1-SNAPSHOT\/library-2.1-20071012.190008-8.jar$/), anything()).
|
522
|
+
and_return { fail URI::NotFoundError }
|
523
|
+
lambda { artifact('com.example:library:jar:2.1-SNAPSHOT').invoke }.should raise_error(RuntimeError, /Failed to download/)
|
524
|
+
File.exist?(File.join(repositories.local, 'com/example/library/2.1-SNAPSHOT/library-2.1-SNAPSHOT.jar')).should be_false
|
525
|
+
end
|
526
|
+
|
527
|
+
it 'should load with all repositories specified in settings file' do
|
528
|
+
write 'home/.buildr/settings.yaml', <<-YAML
|
529
|
+
repositories:
|
530
|
+
remote:
|
531
|
+
- http://buildr.apache.org/repository/noexist
|
532
|
+
- http://example.org
|
533
|
+
YAML
|
534
|
+
repositories.remote.should include('http://buildr.apache.org/repository/noexist', 'http://example.org')
|
535
|
+
end
|
536
|
+
|
537
|
+
it 'should load with all repositories specified in build.yaml file' do
|
538
|
+
write 'build.yaml', <<-YAML
|
539
|
+
repositories:
|
540
|
+
remote:
|
541
|
+
- http://buildr.apache.org/repository/noexist
|
542
|
+
- http://example.org
|
543
|
+
YAML
|
544
|
+
repositories.remote.should include('http://buildr.apache.org/repository/noexist', 'http://example.org')
|
545
|
+
end
|
546
|
+
|
547
|
+
it 'should load with all repositories specified in settings and build.yaml files' do
|
548
|
+
write 'home/.buildr/settings.yaml', <<-YAML
|
549
|
+
repositories:
|
550
|
+
remote:
|
551
|
+
- http://buildr.apache.org/repository/noexist
|
552
|
+
YAML
|
553
|
+
write 'build.yaml', <<-YAML
|
554
|
+
repositories:
|
555
|
+
remote:
|
556
|
+
- http://example.org
|
557
|
+
YAML
|
558
|
+
repositories.remote.should include('http://buildr.apache.org/repository/noexist', 'http://example.org')
|
559
|
+
end
|
560
|
+
end
|
561
|
+
|
562
|
+
|
563
|
+
describe Repositories, 'release_to' do
|
564
|
+
it 'should accept URL as first argument' do
|
565
|
+
repositories.release_to = 'http://buildr.apache.org/repository/noexist'
|
566
|
+
repositories.release_to.should == { :url=>'http://buildr.apache.org/repository/noexist' }
|
567
|
+
end
|
568
|
+
|
569
|
+
it 'should accept hash with options' do
|
570
|
+
repositories.release_to = { :url=>'http://buildr.apache.org/repository/noexist', :username=>'john' }
|
571
|
+
repositories.release_to.should == { :url=>'http://buildr.apache.org/repository/noexist', :username=>'john' }
|
572
|
+
end
|
573
|
+
|
574
|
+
it 'should allow the hash to be manipulated' do
|
575
|
+
repositories.release_to = 'http://buildr.apache.org/repository/noexist'
|
576
|
+
repositories.release_to.should == { :url=>'http://buildr.apache.org/repository/noexist' }
|
577
|
+
repositories.release_to[:username] = 'john'
|
578
|
+
repositories.release_to.should == { :url=>'http://buildr.apache.org/repository/noexist', :username=>'john' }
|
579
|
+
end
|
580
|
+
|
581
|
+
it 'should load URL from settings file' do
|
582
|
+
write 'home/.buildr/settings.yaml', <<-YAML
|
583
|
+
repositories:
|
584
|
+
release_to: http://john:secret@buildr.apache.org/repository/noexist
|
585
|
+
YAML
|
586
|
+
repositories.release_to.should == { :url=>'http://john:secret@buildr.apache.org/repository/noexist' }
|
587
|
+
end
|
588
|
+
|
589
|
+
it 'should load URL from build settings file' do
|
590
|
+
write 'build.yaml', <<-YAML
|
591
|
+
repositories:
|
592
|
+
release_to: http://john:secret@buildr.apache.org/repository/noexist
|
593
|
+
YAML
|
594
|
+
repositories.release_to.should == { :url=>'http://john:secret@buildr.apache.org/repository/noexist' }
|
595
|
+
end
|
596
|
+
|
597
|
+
it 'should load URL, username and password from settings file' do
|
598
|
+
write 'home/.buildr/settings.yaml', <<-YAML
|
599
|
+
repositories:
|
600
|
+
release_to:
|
601
|
+
url: http://buildr.apache.org/repository/noexist
|
602
|
+
username: john
|
603
|
+
password: secret
|
604
|
+
YAML
|
605
|
+
repositories.release_to.should == { :url=>'http://buildr.apache.org/repository/noexist', :username=>'john', :password=>'secret' }
|
606
|
+
end
|
607
|
+
end
|
608
|
+
|
609
|
+
describe Repositories, 'snapshot_to' do
|
610
|
+
it 'should accept URL as first argument' do
|
611
|
+
repositories.snapshot_to = 'http://buildr.apache.org/repository/noexist'
|
612
|
+
repositories.snapshot_to.should == { :url=>'http://buildr.apache.org/repository/noexist' }
|
613
|
+
end
|
614
|
+
|
615
|
+
it 'should accept hash with options' do
|
616
|
+
repositories.snapshot_to = { :url=>'http://buildr.apache.org/repository/noexist', :username=>'john' }
|
617
|
+
repositories.snapshot_to.should == { :url=>'http://buildr.apache.org/repository/noexist', :username=>'john' }
|
618
|
+
end
|
619
|
+
|
620
|
+
it 'should allow the hash to be manipulated' do
|
621
|
+
repositories.snapshot_to = 'http://buildr.apache.org/repository/noexist'
|
622
|
+
repositories.snapshot_to.should == { :url=>'http://buildr.apache.org/repository/noexist' }
|
623
|
+
repositories.snapshot_to[:username] = 'john'
|
624
|
+
repositories.snapshot_to.should == { :url=>'http://buildr.apache.org/repository/noexist', :username=>'john' }
|
625
|
+
end
|
626
|
+
|
627
|
+
it 'should load URL from settings file' do
|
628
|
+
write 'home/.buildr/settings.yaml', <<-YAML
|
629
|
+
repositories:
|
630
|
+
snapshot_to: http://john:secret@buildr.apache.org/repository/noexist
|
631
|
+
YAML
|
632
|
+
repositories.snapshot_to.should == { :url=>'http://john:secret@buildr.apache.org/repository/noexist' }
|
633
|
+
end
|
634
|
+
|
635
|
+
it 'should load URL from build settings file' do
|
636
|
+
write 'build.yaml', <<-YAML
|
637
|
+
repositories:
|
638
|
+
snapshot_to: http://john:secret@buildr.apache.org/repository/noexist
|
639
|
+
YAML
|
640
|
+
repositories.snapshot_to.should == { :url=>'http://john:secret@buildr.apache.org/repository/noexist' }
|
641
|
+
end
|
642
|
+
|
643
|
+
it 'should load URL, username and password from settings file' do
|
644
|
+
write 'home/.buildr/settings.yaml', <<-YAML
|
645
|
+
repositories:
|
646
|
+
snapshot_to:
|
647
|
+
url: http://buildr.apache.org/repository/noexist
|
648
|
+
username: john
|
649
|
+
password: secret
|
650
|
+
YAML
|
651
|
+
repositories.snapshot_to.should == { :url=>'http://buildr.apache.org/repository/noexist', :username=>'john', :password=>'secret' }
|
652
|
+
end
|
653
|
+
end
|
654
|
+
|
655
|
+
describe Buildr, '#artifact' do
|
656
|
+
before do
|
657
|
+
@spec = { :group=>'com.example', :id=>'library', :type=>'jar', :version=>'2.0' }
|
658
|
+
@snapshot_spec = 'group:id:jar:1.0-SNAPSHOT'
|
659
|
+
write @file = 'testartifact.jar'
|
660
|
+
end
|
661
|
+
|
662
|
+
it 'should accept hash specification' do
|
663
|
+
artifact(:group=>'com.example', :id=>'library', :type=>'jar', :version=>'2.0').should respond_to(:invoke)
|
664
|
+
end
|
665
|
+
|
666
|
+
it 'should reject partial hash specifier' do
|
667
|
+
lambda { artifact(@spec.merge(:group=>nil)) }.should raise_error
|
668
|
+
lambda { artifact(@spec.merge(:id=>nil)) }.should raise_error
|
669
|
+
lambda { artifact(@spec.merge(:version=>nil)) }.should raise_error
|
670
|
+
end
|
671
|
+
|
672
|
+
it 'should complain about invalid key' do
|
673
|
+
lambda { artifact(@spec.merge(:error=>true)) }.should raise_error(ArgumentError, /no such option/i)
|
674
|
+
end
|
675
|
+
|
676
|
+
it 'should use JAR type by default' do
|
677
|
+
artifact(@spec.merge(:type=>nil)).should respond_to(:invoke)
|
678
|
+
end
|
679
|
+
|
680
|
+
it 'should use JAR type if type is set to bundle' do
|
681
|
+
artifact(@spec.merge(:type=>:bundle)).to_s.should match('\.jar$')
|
682
|
+
end
|
683
|
+
|
684
|
+
it 'should accept string specification' do
|
685
|
+
artifact('com.example:library:jar:2.0').should respond_to(:invoke)
|
686
|
+
end
|
687
|
+
|
688
|
+
it 'should reject partial string specifier' do
|
689
|
+
artifact('com.example:library::2.0')
|
690
|
+
lambda { artifact('com.example:library:jar') }.should raise_error
|
691
|
+
lambda { artifact('com.example:library:jar:') }.should raise_error
|
692
|
+
lambda { artifact('com.example:library::2.0') }.should_not raise_error
|
693
|
+
lambda { artifact('com.example::jar:2.0') }.should raise_error
|
694
|
+
lambda { artifact(':library:jar:2.0') }.should raise_error
|
695
|
+
end
|
696
|
+
|
697
|
+
it 'should create a task naming the artifact in the local repository' do
|
698
|
+
file = File.join(repositories.local, 'com', 'example', 'library', '2.0', 'library-2.0.jar')
|
699
|
+
Rake::Task.task_defined?(file).should be_false
|
700
|
+
artifact('com.example:library:jar:2.0').name.should eql(file)
|
701
|
+
end
|
702
|
+
|
703
|
+
it 'should use from method to install artifact from existing file' do
|
704
|
+
write 'test.jar'
|
705
|
+
artifact = artifact('group:id:jar:1.0').from('test.jar')
|
706
|
+
lambda { artifact.invoke }.should change { File.exist?(artifact.to_s) }.to(true)
|
707
|
+
end
|
708
|
+
|
709
|
+
it 'should use from method to install artifact from a file task' do
|
710
|
+
test_jar = file('test.jar')
|
711
|
+
test_jar.enhance do
|
712
|
+
#nothing...
|
713
|
+
end
|
714
|
+
write 'test.jar'
|
715
|
+
artifact = artifact('group:id:jar:1.0').from(test_jar)
|
716
|
+
lambda { artifact.invoke }.should change { File.exist?(artifact.to_s) }.to(true)
|
717
|
+
end
|
718
|
+
|
719
|
+
it 'should invoke the artifact associated file task if the file doesnt exist' do
|
720
|
+
test_jar = file('test.jar')
|
721
|
+
called = false
|
722
|
+
test_jar.enhance do
|
723
|
+
write 'test.jar'
|
724
|
+
called = true
|
725
|
+
end
|
726
|
+
artifact = artifact('group:id:jar:1.0').from(test_jar)
|
727
|
+
artifact.invoke
|
728
|
+
unless called
|
729
|
+
raise "The file task was not called."
|
730
|
+
end
|
731
|
+
end
|
732
|
+
|
733
|
+
it 'should not invoke the artifact associated file task if the file already exists' do
|
734
|
+
test_jar = file('test.jar')
|
735
|
+
test_jar.enhance do
|
736
|
+
raise 'the test.jar file is created again!'
|
737
|
+
end
|
738
|
+
write 'test.jar'
|
739
|
+
artifact = artifact('group:id:jar:1.0').from(test_jar)
|
740
|
+
artifact.invoke
|
741
|
+
end
|
742
|
+
|
743
|
+
it 'should reference artifacts defined on build.yaml by using ruby symbols' do
|
744
|
+
write 'build.yaml', <<-YAML
|
745
|
+
artifacts:
|
746
|
+
j2ee: geronimo-spec:geronimo-spec-j2ee:jar:1.4-rc4
|
747
|
+
YAML
|
748
|
+
Buildr.application.send(:load_artifact_ns)
|
749
|
+
artifact(:j2ee).to_s.pathmap('%f').should == 'geronimo-spec-j2ee-1.4-rc4.jar'
|
750
|
+
end
|
751
|
+
|
752
|
+
it 'should try to download snapshot artifact' do
|
753
|
+
run_with_repo
|
754
|
+
snapshot = artifact(@snapshot_spec)
|
755
|
+
|
756
|
+
URI.should_receive(:download).at_least(:twice).and_return { |uri, target, options| write target }
|
757
|
+
FileUtils.should_receive(:mv).at_least(:twice)
|
758
|
+
snapshot.invoke
|
759
|
+
end
|
760
|
+
|
761
|
+
it 'should not try to update snapshot in offline mode if it exists' do
|
762
|
+
run_with_repo
|
763
|
+
snapshot = artifact(@snapshot_spec)
|
764
|
+
write snapshot.to_s
|
765
|
+
Buildr.application.options.work_offline = true
|
766
|
+
URI.should_receive(:download).exactly(0).times
|
767
|
+
snapshot.invoke
|
768
|
+
end
|
769
|
+
|
770
|
+
it 'should download snapshot even in offline mode if it doesn''t exist' do
|
771
|
+
run_with_repo
|
772
|
+
snapshot = artifact(@snapshot_spec)
|
773
|
+
Buildr.application.options.work_offline = true
|
774
|
+
URI.should_receive(:download).exactly(2).times
|
775
|
+
snapshot.invoke
|
776
|
+
end
|
777
|
+
|
778
|
+
it 'should update snapshots if --update-snapshots' do
|
779
|
+
run_with_repo
|
780
|
+
snapshot = artifact(@snapshot_spec)
|
781
|
+
write snapshot.to_s
|
782
|
+
Buildr.application.options.update_snapshots = true
|
783
|
+
|
784
|
+
URI.should_receive(:download).at_least(:twice).and_return { |uri, target, options| write target }
|
785
|
+
FileUtils.should_receive(:mv).at_least(:twice)
|
786
|
+
snapshot.invoke
|
787
|
+
end
|
788
|
+
|
789
|
+
it 'should update snapshot if it''s older than 24 hours' do
|
790
|
+
run_with_repo
|
791
|
+
snapshot = artifact(@snapshot_spec)
|
792
|
+
write snapshot.to_s
|
793
|
+
time = Time.at((Time.now - (60 * 60 * 24) - 10 ).to_i)
|
794
|
+
File.utime(time, time, snapshot.to_s)
|
795
|
+
URI.should_receive(:download).at_least(:once).and_return { |uri, target, options| write target }
|
796
|
+
snapshot.invoke
|
797
|
+
end
|
798
|
+
|
799
|
+
def run_with_repo
|
800
|
+
repositories.remote = 'http://buildr.apache.org/repository/noexist'
|
801
|
+
end
|
802
|
+
|
803
|
+
end
|
804
|
+
|
805
|
+
|
806
|
+
describe Buildr, '#artifacts' do
|
807
|
+
it 'should return a list of artifacts from all its arguments' do
|
808
|
+
specs = %w[saxon:saxon:jar:8.4 saxon:saxon-dom:jar:8.4 saxon:saxon-xpath:jar:8.4]
|
809
|
+
artifacts(*specs).should eql(specs.map { |spec| artifact(spec) })
|
810
|
+
end
|
811
|
+
|
812
|
+
it 'should accept nested arrays' do
|
813
|
+
specs = %w[saxon:saxon:jar:8.4 saxon:saxon-dom:jar:8.4 saxon:saxon-xpath:jar:8.4]
|
814
|
+
artifacts([[specs[0]]], [[specs[1]], specs[2]]).should eql(specs.map { |spec| artifact(spec) })
|
815
|
+
end
|
816
|
+
|
817
|
+
it 'should accept struct' do
|
818
|
+
specs = struct(:main=>'saxon:saxon:jar:8.4', :dom=>'saxon:saxon-dom:jar:8.4', :xpath=>'saxon:saxon-xpath:jar:8.4')
|
819
|
+
artifacts(specs).should eql(specs.values.map { |spec| artifact(spec) })
|
820
|
+
end
|
821
|
+
|
822
|
+
it 'should ignore duplicates' do
|
823
|
+
artifacts('saxon:saxon:jar:8.4', 'saxon:saxon:jar:8.4').size.should be(1)
|
824
|
+
end
|
825
|
+
|
826
|
+
it 'should accept and return existing tasks' do
|
827
|
+
artifacts(task('foo'), task('bar')).should eql([task('foo'), task('bar')])
|
828
|
+
end
|
829
|
+
|
830
|
+
it 'should accept filenames and expand them' do
|
831
|
+
artifacts('test').map(&:to_s).should eql([File.expand_path('test')])
|
832
|
+
end
|
833
|
+
|
834
|
+
it 'should accept filenames and return filenames' do
|
835
|
+
artifacts('c:test').first.should be_kind_of(String)
|
836
|
+
end
|
837
|
+
|
838
|
+
it 'should accept any object responding to :to_spec' do
|
839
|
+
obj = Object.new
|
840
|
+
class << obj
|
841
|
+
def to_spec; "org.example:artifact:jar:1.1"; end
|
842
|
+
end
|
843
|
+
artifacts(obj).size.should be(1)
|
844
|
+
end
|
845
|
+
|
846
|
+
it 'should accept project and return all its packaging tasks' do
|
847
|
+
define 'foobar', :group=>'group', :version=>'1.0' do
|
848
|
+
package :jar, :id=>'code'
|
849
|
+
package :war, :id=>'webapp'
|
850
|
+
end
|
851
|
+
foobar = project('foobar')
|
852
|
+
artifacts(foobar).should eql([
|
853
|
+
task(foobar.path_to('target/code-1.0.jar')),
|
854
|
+
task(foobar.path_to('target/webapp-1.0.war'))
|
855
|
+
])
|
856
|
+
end
|
857
|
+
|
858
|
+
it 'should complain about an invalid specification' do
|
859
|
+
lambda { artifacts(5) }.should raise_error
|
860
|
+
lambda { artifacts('group:no:version:') }.should raise_error
|
861
|
+
end
|
862
|
+
end
|
863
|
+
|
864
|
+
|
865
|
+
describe Buildr, '#group' do
|
866
|
+
it 'should accept list of artifact identifiers' do
|
867
|
+
list = group('saxon', 'saxon-dom', 'saxon-xpath', :under=>'saxon', :version=>'8.4')
|
868
|
+
list.should include(artifact('saxon:saxon:jar:8.4'))
|
869
|
+
list.should include(artifact('saxon:saxon-dom:jar:8.4'))
|
870
|
+
list.should include(artifact('saxon:saxon-xpath:jar:8.4'))
|
871
|
+
list.size.should be(3)
|
872
|
+
end
|
873
|
+
|
874
|
+
it 'should accept array with artifact identifiers' do
|
875
|
+
list = group(%w{saxon saxon-dom saxon-xpath}, :under=>'saxon', :version=>'8.4')
|
876
|
+
list.should include(artifact('saxon:saxon:jar:8.4'))
|
877
|
+
list.should include(artifact('saxon:saxon-dom:jar:8.4'))
|
878
|
+
list.should include(artifact('saxon:saxon-xpath:jar:8.4'))
|
879
|
+
list.size.should be(3)
|
880
|
+
end
|
881
|
+
|
882
|
+
it 'should accept a type' do
|
883
|
+
list = group('struts-bean', 'struts-html', :under=>'struts', :type=>'tld', :version=>'1.1')
|
884
|
+
list.should include(artifact('struts:struts-bean:tld:1.1'))
|
885
|
+
list.should include(artifact('struts:struts-html:tld:1.1'))
|
886
|
+
list.size.should be(2)
|
887
|
+
end
|
888
|
+
|
889
|
+
it 'should accept a classifier' do
|
890
|
+
list = group('camel-core', :under=>'org.apache.camel', :version=>'2.2.0', :classifier=>'spring3')
|
891
|
+
list.should include(artifact('org.apache.camel:camel-core:jar:spring3:2.2.0'))
|
892
|
+
list.size.should be(1)
|
893
|
+
end
|
894
|
+
|
895
|
+
end
|
896
|
+
|
897
|
+
describe Buildr, '#install' do
|
898
|
+
before do
|
899
|
+
@spec = 'group:id:jar:1.0'
|
900
|
+
write @file = 'test.jar'
|
901
|
+
@snapshot_spec = 'group:id:jar:1.0-SNAPSHOT'
|
902
|
+
end
|
903
|
+
|
904
|
+
it 'should return the install task' do
|
905
|
+
install.should be(task('install'))
|
906
|
+
end
|
907
|
+
|
908
|
+
it 'should accept artifacts to install' do
|
909
|
+
install artifact(@spec)
|
910
|
+
lambda { install @file }.should raise_error(ArgumentError)
|
911
|
+
end
|
912
|
+
|
913
|
+
it 'should install artifact when install task is run' do
|
914
|
+
write @file
|
915
|
+
install artifact(@spec).from(@file)
|
916
|
+
lambda { install.invoke }.should change { File.exist?(artifact(@spec).to_s) }.to(true)
|
917
|
+
end
|
918
|
+
|
919
|
+
it 'should re-install artifact when "from" is newer' do
|
920
|
+
install artifact(@spec).from(@file)
|
921
|
+
write artifact(@spec).to_s # install a version of the artifact
|
922
|
+
old_mtime = File.mtime(artifact(@spec).to_s)
|
923
|
+
sleep 1; write @file # make sure the "from" file has newer modification time
|
924
|
+
lambda { install.invoke }.should change { modified?(old_mtime, @spec) }.to(true)
|
925
|
+
end
|
926
|
+
|
927
|
+
it 'should re-install snapshot artifact when "from" is newer' do
|
928
|
+
install artifact(@snapshot_spec).from(@file)
|
929
|
+
write artifact(@snapshot_spec).to_s # install a version of the artifact
|
930
|
+
old_mtime = File.mtime(artifact(@snapshot_spec).to_s)
|
931
|
+
sleep 1; write @file # make sure the "from" file has newer modification time
|
932
|
+
lambda { install.invoke }.should change { modified?(old_mtime, @snapshot_spec) }.to(true)
|
933
|
+
end
|
934
|
+
|
935
|
+
it 'should download snapshot to temporary location' do
|
936
|
+
repositories.remote = 'http://buildr.apache.org/repository/noexist'
|
937
|
+
snapshot = artifact(@snapshot_spec)
|
938
|
+
same_time = Time.new
|
939
|
+
download_file = "#{Dir.tmpdir}/#{File.basename(snapshot.name)}#{same_time.to_i}"
|
940
|
+
|
941
|
+
Time.should_receive(:new).twice.and_return(same_time)
|
942
|
+
URI.should_receive(:download).at_least(:twice).and_return { |uri, target, options| write target }
|
943
|
+
FileUtils.should_receive(:mv).at_least(:twice)
|
944
|
+
snapshot.invoke
|
945
|
+
end
|
946
|
+
|
947
|
+
it 'should install POM alongside artifact (if artifact has no classifier)' do
|
948
|
+
pom = artifact(@spec).pom
|
949
|
+
write @file
|
950
|
+
install artifact(@spec).from(@file)
|
951
|
+
lambda { install.invoke }.should change { File.exist?(repositories.locate(pom)) }.to(true)
|
952
|
+
end
|
953
|
+
|
954
|
+
it 'should not install POM alongside artifact if artifact has classifier' do
|
955
|
+
@spec = 'group:id:jar:all:1.0'
|
956
|
+
pom = artifact(@spec).pom
|
957
|
+
write @file
|
958
|
+
install artifact(@spec).from(@file)
|
959
|
+
lambda { install.invoke }.should_not change { File.exist?(repositories.locate(pom)) }.to(true)
|
960
|
+
end
|
961
|
+
|
962
|
+
it 'should reinstall POM alongside artifact' do
|
963
|
+
pom = artifact(@spec).pom
|
964
|
+
write @file
|
965
|
+
write repositories.locate(pom)
|
966
|
+
sleep 1
|
967
|
+
|
968
|
+
install artifact(@spec).from(@file)
|
969
|
+
lambda { install.invoke }.should change { File.mtime(repositories.locate(pom)) }
|
970
|
+
end
|
971
|
+
end
|
972
|
+
|
973
|
+
|
974
|
+
describe Buildr, '#upload' do
|
975
|
+
before do
|
976
|
+
@spec = 'group:id:jar:1.0'
|
977
|
+
write @file = 'test.jar'
|
978
|
+
repositories.release_to = 'https://buildr.apache.org/repository/noexist/base'
|
979
|
+
end
|
980
|
+
|
981
|
+
it 'should return the upload task' do
|
982
|
+
upload.should be(task('upload'))
|
983
|
+
end
|
984
|
+
|
985
|
+
it 'should accept artifacts to upload' do
|
986
|
+
upload artifact(@spec)
|
987
|
+
lambda { upload @file }.should raise_error(ArgumentError)
|
988
|
+
end
|
989
|
+
|
990
|
+
it 'should upload artifact when upload task is run' do
|
991
|
+
write @file
|
992
|
+
upload artifact(@spec).from(@file)
|
993
|
+
URI.should_receive(:upload).once.
|
994
|
+
with(URI.parse('https://buildr.apache.org/repository/noexist/base/group/id/1.0/id-1.0.jar'), artifact(@spec).to_s, anything)
|
995
|
+
URI.should_receive(:upload).once.
|
996
|
+
with(URI.parse('https://buildr.apache.org/repository/noexist/base/group/id/1.0/id-1.0.pom'), artifact(@spec).pom.to_s, anything)
|
997
|
+
upload.invoke
|
998
|
+
end
|
999
|
+
end
|
1000
|
+
|
1001
|
+
|
1002
|
+
describe ActsAsArtifact, '#upload' do
|
1003
|
+
|
1004
|
+
it 'should be used to upload artifact' do
|
1005
|
+
artifact = artifact('com.example:library:jar:2.0')
|
1006
|
+
# Prevent artifact from downloading anything.
|
1007
|
+
write repositories.locate(artifact)
|
1008
|
+
write repositories.locate(artifact.pom)
|
1009
|
+
URI.should_receive(:upload).once.
|
1010
|
+
with(URI.parse('https://buildr.apache.org/repository/noexist/base/com/example/library/2.0/library-2.0.pom'), artifact.pom.to_s, anything)
|
1011
|
+
URI.should_receive(:upload).once.
|
1012
|
+
with(URI.parse('https://buildr.apache.org/repository/noexist/base/com/example/library/2.0/library-2.0.jar'), artifact.to_s, anything)
|
1013
|
+
verbose(false) { artifact.upload(:url=>'https://buildr.apache.org/repository/noexist/base') }
|
1014
|
+
end
|
1015
|
+
|
1016
|
+
it 'should support artifact classifier and should not upload pom if artifact has classifier' do
|
1017
|
+
artifact = artifact('com.example:library:jar:all:2.0')
|
1018
|
+
# Prevent artifact from downloading anything.
|
1019
|
+
write repositories.locate(artifact)
|
1020
|
+
URI.should_receive(:upload).exactly(:once).
|
1021
|
+
with(URI.parse('https://buildr.apache.org/repository/noexist/base/com/example/library/2.0/library-2.0-all.jar'), artifact.to_s, anything)
|
1022
|
+
verbose(false) { artifact.upload(:url=>'https://buildr.apache.org/repository/noexist/base') }
|
1023
|
+
end
|
1024
|
+
|
1025
|
+
it 'should complain without any repository configuration' do
|
1026
|
+
artifact = artifact('com.example:library:jar:2.0')
|
1027
|
+
# Prevent artifact from downloading anything.
|
1028
|
+
write repositories.locate(artifact)
|
1029
|
+
write repositories.locate(artifact.pom)
|
1030
|
+
lambda { artifact.upload }.should raise_error(Exception, /where to upload/)
|
1031
|
+
end
|
1032
|
+
|
1033
|
+
it 'should upload SNAPSHOT with timestamped unique version and maven metadata' do
|
1034
|
+
artifact = artifact('com.example:library:jar:2.0-SNAPSHOT')
|
1035
|
+
# Prevent artifact from downloading anything.
|
1036
|
+
write repositories.locate(artifact)
|
1037
|
+
write repositories.locate(artifact.pom)
|
1038
|
+
|
1039
|
+
time = Time.gm(2011,"mar",11,14,02,36,123)
|
1040
|
+
Time.stub(:now).and_return(time)
|
1041
|
+
|
1042
|
+
URI.should_receive(:upload).once.
|
1043
|
+
with(URI.parse('https://example.com/base/com/example/library/2.0-SNAPSHOT/library-2.0-20110311.140236-1.pom'), artifact.pom.to_s, anything)
|
1044
|
+
URI.should_receive(:upload).once.
|
1045
|
+
with(URI.parse('https://example.com/base/com/example/library/2.0-SNAPSHOT/library-2.0-20110311.140236-1.jar'), artifact.to_s, anything)
|
1046
|
+
URI.should_receive(:write).once.
|
1047
|
+
with(URI.parse('https://example.com/base/com/example/library/2.0-SNAPSHOT/maven-metadata.xml'), anything, anything)
|
1048
|
+
verbose(false) { artifact.upload(:url=>'https://example.com/base') }
|
1049
|
+
end
|
1050
|
+
|
1051
|
+
it 'should accept repositories.release_to setting' do
|
1052
|
+
artifact = artifact('com.example:library:jar:2.0')
|
1053
|
+
# Prevent artifact from downloading anything.
|
1054
|
+
write repositories.locate(artifact)
|
1055
|
+
write repositories.locate(artifact.pom)
|
1056
|
+
URI.should_receive(:upload).at_least(:once)
|
1057
|
+
repositories.release_to = 'https://buildr.apache.org/repository/noexist/base'
|
1058
|
+
artifact.upload
|
1059
|
+
lambda { artifact.upload }.should_not raise_error
|
1060
|
+
end
|
1061
|
+
|
1062
|
+
it 'should use repositories.release_to setting even for snapshots when snapshot_to is not set' do
|
1063
|
+
time = Time.gm(2016,"nov",11,14,02,36,123)
|
1064
|
+
Time.stub(:now).and_return(time)
|
1065
|
+
artifact = artifact('com.example:library:jar:2.0-SNAPSHOT')
|
1066
|
+
# Prevent artifact from downloading anything.
|
1067
|
+
write repositories.locate(artifact)
|
1068
|
+
write repositories.locate(artifact.pom)
|
1069
|
+
URI.should_receive(:upload).once.
|
1070
|
+
with(URI.parse('https://buildr.apache.org/repository/noexist/base/com/example/library/2.0-SNAPSHOT/library-2.0-20161111.140236-1.pom'), artifact.pom.to_s, anything)
|
1071
|
+
URI.should_receive(:upload).once.
|
1072
|
+
with(URI.parse('https://buildr.apache.org/repository/noexist/base/com/example/library/2.0-SNAPSHOT/library-2.0-20161111.140236-1.jar'), artifact.to_s, anything)
|
1073
|
+
URI.should_receive(:write).once.
|
1074
|
+
with(URI.parse('https://buildr.apache.org/repository/noexist/base/com/example/library/2.0-SNAPSHOT/maven-metadata.xml'), anything, anything)
|
1075
|
+
repositories.release_to = 'https://buildr.apache.org/repository/noexist/base'
|
1076
|
+
artifact.upload
|
1077
|
+
lambda { artifact.upload }.should_not raise_error
|
1078
|
+
end
|
1079
|
+
|
1080
|
+
it 'should use repositories.snapshot_to setting when snapshot_to is set' do
|
1081
|
+
time = Time.gm(2016,"nov",11,14,02,36,123)
|
1082
|
+
Time.stub(:now).and_return(time)
|
1083
|
+
artifact = artifact('com.example:library:jar:2.0-SNAPSHOT')
|
1084
|
+
# Prevent artifact from downloading anything.
|
1085
|
+
write repositories.locate(artifact)
|
1086
|
+
write repositories.locate(artifact.pom)
|
1087
|
+
URI.should_receive(:upload).once.
|
1088
|
+
with(URI.parse('https://buildr.apache.org/repository/noexist/snapshot/com/example/library/2.0-SNAPSHOT/library-2.0-20161111.140236-1.pom'), artifact.pom.to_s, anything)
|
1089
|
+
URI.should_receive(:upload).once.
|
1090
|
+
with(URI.parse('https://buildr.apache.org/repository/noexist/snapshot/com/example/library/2.0-SNAPSHOT/library-2.0-20161111.140236-1.jar'), artifact.to_s, anything)
|
1091
|
+
URI.should_receive(:write).once.
|
1092
|
+
with(URI.parse('https://buildr.apache.org/repository/noexist/snapshot/com/example/library/2.0-SNAPSHOT/maven-metadata.xml'), anything, anything)
|
1093
|
+
repositories.release_to = 'https://buildr.apache.org/repository/noexist/base'
|
1094
|
+
repositories.snapshot_to = 'https://buildr.apache.org/repository/noexist/snapshot'
|
1095
|
+
artifact.upload
|
1096
|
+
lambda { artifact.upload }.should_not raise_error
|
1097
|
+
end
|
1098
|
+
|
1099
|
+
it 'should complain when only a snapshot repo is set but the artifact is not a snapshot' do
|
1100
|
+
artifact = artifact('com.example:library:jar:2.0')
|
1101
|
+
# Prevent artifact from downloading anything.
|
1102
|
+
write repositories.locate(artifact)
|
1103
|
+
write repositories.locate(artifact.pom)
|
1104
|
+
repositories.snapshot_to = 'https://buildr.apache.org/repository/noexist/snapshot'
|
1105
|
+
lambda { artifact.upload }.should raise_error(Exception, /where to upload/)
|
1106
|
+
end
|
1107
|
+
end
|
1108
|
+
|
1109
|
+
|
1110
|
+
describe Rake::Task, ' artifacts' do
|
1111
|
+
before do
|
1112
|
+
Buildr.repositories.instance_eval do
|
1113
|
+
@local = @remote = @release_to = nil
|
1114
|
+
end
|
1115
|
+
end
|
1116
|
+
|
1117
|
+
it 'should download all specified artifacts' do
|
1118
|
+
artifact 'group:id:jar:1.0'
|
1119
|
+
repositories.remote = 'http://buildr.apache.org/repository/noexist'
|
1120
|
+
URI.should_receive(:download).twice.and_return { |uri, target, options| write target }
|
1121
|
+
task('artifacts').invoke
|
1122
|
+
end
|
1123
|
+
|
1124
|
+
it 'should fail if failed to download an artifact' do
|
1125
|
+
artifact 'group:id:jar:1.0'
|
1126
|
+
lambda { task('artifacts').invoke }.should raise_error(RuntimeError, /No remote repositories/)
|
1127
|
+
end
|
1128
|
+
|
1129
|
+
it 'should succeed if artifact already exists' do
|
1130
|
+
write repositories.locate(artifact('group:id:jar:1.0'))
|
1131
|
+
suppress_stdout do
|
1132
|
+
lambda { task('artifacts').invoke }.should_not raise_error
|
1133
|
+
end
|
1134
|
+
end
|
1135
|
+
end
|
1136
|
+
|
1137
|
+
|
1138
|
+
describe Rake::Task, ' artifacts:sources' do
|
1139
|
+
|
1140
|
+
before do
|
1141
|
+
Buildr.repositories.instance_eval do
|
1142
|
+
@local = @remote = @release_to = nil
|
1143
|
+
end
|
1144
|
+
task('artifacts:sources').clear
|
1145
|
+
repositories.remote = 'http://buildr.apache.org/repository/noexist'
|
1146
|
+
end
|
1147
|
+
|
1148
|
+
it 'should download sources for all specified artifacts' do
|
1149
|
+
artifact 'group:id:jar:1.0'
|
1150
|
+
URI.stub(:download).and_return { |uri, target| write target }
|
1151
|
+
lambda { task('artifacts:sources').invoke }.should change { File.exist?('home/.m2/repository/group/id/1.0/id-1.0-sources.jar') }.to(true)
|
1152
|
+
end
|
1153
|
+
|
1154
|
+
it "should not try to download sources for the project's artifacts" do
|
1155
|
+
define('foo', :version=>'1.0') { package(:jar) }
|
1156
|
+
URI.should_not_receive(:download)
|
1157
|
+
task('artifacts:sources').invoke
|
1158
|
+
end
|
1159
|
+
|
1160
|
+
describe 'when the source artifact does not exist' do
|
1161
|
+
|
1162
|
+
before do
|
1163
|
+
artifact 'group:id:jar:1.0'
|
1164
|
+
URI.should_receive(:download).and_raise(URI::NotFoundError)
|
1165
|
+
end
|
1166
|
+
|
1167
|
+
it 'should not fail' do
|
1168
|
+
lambda { task('artifacts:sources').invoke }.should_not raise_error
|
1169
|
+
end
|
1170
|
+
|
1171
|
+
it 'should inform the user' do
|
1172
|
+
lambda { task('artifacts:sources').invoke }.should show_info('Failed to download group:id:jar:sources:1.0. Skipping it.')
|
1173
|
+
end
|
1174
|
+
end
|
1175
|
+
end
|
1176
|
+
|
1177
|
+
describe Rake::Task, ' artifacts:javadoc' do
|
1178
|
+
|
1179
|
+
before do
|
1180
|
+
Buildr.repositories.instance_eval do
|
1181
|
+
@local = @remote = @release_to = nil
|
1182
|
+
end
|
1183
|
+
task('artifacts:javadoc').clear
|
1184
|
+
repositories.remote = 'http://buildr.apache.org/repository/noexist'
|
1185
|
+
end
|
1186
|
+
|
1187
|
+
it 'should download javadoc for all specified artifacts' do
|
1188
|
+
artifact 'group:id:jar:1.0'
|
1189
|
+
URI.should_receive(:download).and_return { |uri, target| write target }
|
1190
|
+
lambda { task('artifacts:javadoc').invoke }.should change { File.exist?('home/.m2/repository/group/id/1.0/id-1.0-javadoc.jar') }.to(true)
|
1191
|
+
end
|
1192
|
+
|
1193
|
+
it "should not try to download javadoc for the project's artifacts" do
|
1194
|
+
define('foo', :version=>'1.0') { package(:jar) }
|
1195
|
+
URI.should_not_receive(:download)
|
1196
|
+
task('artifacts:javadoc').invoke
|
1197
|
+
end
|
1198
|
+
|
1199
|
+
describe 'when the javadoc artifact does not exist' do
|
1200
|
+
|
1201
|
+
before do
|
1202
|
+
artifact 'group:id:jar:1.0'
|
1203
|
+
URI.should_receive(:download).and_raise(URI::NotFoundError)
|
1204
|
+
end
|
1205
|
+
|
1206
|
+
it 'should not fail' do
|
1207
|
+
lambda { task('artifacts:javadoc').invoke }.should_not raise_error
|
1208
|
+
end
|
1209
|
+
|
1210
|
+
it 'should inform the user' do
|
1211
|
+
lambda { task('artifacts:javadoc').invoke }.should show_info('Failed to download group:id:jar:javadoc:1.0. Skipping it.')
|
1212
|
+
end
|
1213
|
+
end
|
1214
|
+
end
|
1215
|
+
|
1216
|
+
describe Buildr, '#transitive' do
|
1217
|
+
before do
|
1218
|
+
repositories.remote = 'http://buildr.apache.org/repository/noexist'
|
1219
|
+
|
1220
|
+
@simple = %w(saxon:saxon:jar:8.4 saxon:saxon-dom:jar:8.4 saxon:saxon-xpath:jar:8.4)
|
1221
|
+
@simple.map { |spec| artifact(spec).pom }.each { |task| write task.name, task.pom_xml.call }
|
1222
|
+
@provided = @simple.first
|
1223
|
+
@complex = 'group:app:jar:1.0'
|
1224
|
+
write artifact(@complex).pom.to_s, <<-XML
|
1225
|
+
<project>
|
1226
|
+
<artifactId>app</artifactId>
|
1227
|
+
<groupId>group</groupId>
|
1228
|
+
<dependencies>
|
1229
|
+
<dependency>
|
1230
|
+
<artifactId>saxon</artifactId>
|
1231
|
+
<groupId>saxon</groupId>
|
1232
|
+
<version>8.4</version>
|
1233
|
+
<scope>provided</scope>
|
1234
|
+
</dependency>
|
1235
|
+
<dependency>
|
1236
|
+
<artifactId>saxon-dom</artifactId>
|
1237
|
+
<groupId>saxon</groupId>
|
1238
|
+
<version>8.4</version>
|
1239
|
+
<scope>runtime</scope>
|
1240
|
+
</dependency>
|
1241
|
+
<dependency>
|
1242
|
+
<artifactId>saxon-xpath</artifactId>
|
1243
|
+
<groupId>saxon</groupId>
|
1244
|
+
<version>8.4</version>
|
1245
|
+
</dependency>
|
1246
|
+
<dependency>
|
1247
|
+
<artifactId>saxon-nosuch</artifactId>
|
1248
|
+
<groupId>saxon</groupId>
|
1249
|
+
<version>8.4</version>
|
1250
|
+
<scope>test</scope>
|
1251
|
+
</dependency>
|
1252
|
+
<dependency>
|
1253
|
+
<artifactId>jlib-optional</artifactId>
|
1254
|
+
<groupId>jlib</groupId>
|
1255
|
+
<version>1.4</version>
|
1256
|
+
<scope>runtime</scope>
|
1257
|
+
<optional>true</optional>
|
1258
|
+
</dependency>
|
1259
|
+
</dependencies>
|
1260
|
+
</project>
|
1261
|
+
XML
|
1262
|
+
@transitive = 'master:app:war:1.0'
|
1263
|
+
write artifact(@transitive).pom.to_s, <<-XML
|
1264
|
+
<project>
|
1265
|
+
<artifactId>app</artifactId>
|
1266
|
+
<groupId>group</groupId>
|
1267
|
+
<dependencies>
|
1268
|
+
<dependency>
|
1269
|
+
<artifactId>app</artifactId>
|
1270
|
+
<groupId>group</groupId>
|
1271
|
+
<version>1.0</version>
|
1272
|
+
</dependency>
|
1273
|
+
</dependencies>
|
1274
|
+
</project>
|
1275
|
+
XML
|
1276
|
+
end
|
1277
|
+
|
1278
|
+
it 'should return a list of artifacts from all its arguments' do
|
1279
|
+
specs = %w[saxon:saxon:jar:8.4 saxon:saxon-dom:jar:8.4 saxon:saxon-xpath:jar:8.4]
|
1280
|
+
transitive(*specs).should eql(specs.map { |spec| artifact(spec) })
|
1281
|
+
end
|
1282
|
+
|
1283
|
+
it 'should accept nested arrays' do
|
1284
|
+
specs = %w[saxon:saxon:jar:8.4 saxon:saxon-dom:jar:8.4 saxon:saxon-xpath:jar:8.4]
|
1285
|
+
transitive([[specs[0]]], [[specs[1]], specs[2]]).should eql(specs.map { |spec| artifact(spec) })
|
1286
|
+
end
|
1287
|
+
|
1288
|
+
it 'should accept struct' do
|
1289
|
+
specs = struct(:main=>'saxon:saxon:jar:8.4', :dom=>'saxon:saxon-dom:jar:8.4', :xpath=>'saxon:saxon-xpath:jar:8.4')
|
1290
|
+
transitive(specs).should eql(specs.values.map { |spec| artifact(spec) })
|
1291
|
+
end
|
1292
|
+
|
1293
|
+
it 'should ignore duplicates' do
|
1294
|
+
transitive('saxon:saxon:jar:8.4', 'saxon:saxon:jar:8.4').size.should be(1)
|
1295
|
+
end
|
1296
|
+
|
1297
|
+
it 'should accept and return existing tasks' do
|
1298
|
+
transitive(task('foo'), task('bar')).should eql([task('foo'), task('bar')])
|
1299
|
+
end
|
1300
|
+
|
1301
|
+
it 'should accept filenames and expand them' do
|
1302
|
+
transitive('test').map(&:to_s).should eql([File.expand_path('test')])
|
1303
|
+
end
|
1304
|
+
|
1305
|
+
it 'should accept filenames and return file task' do
|
1306
|
+
transitive('c:test').first.should be_kind_of(Rake::FileTask)
|
1307
|
+
end
|
1308
|
+
|
1309
|
+
it 'should accept project and return all its packaging tasks' do
|
1310
|
+
define 'foobar', :group=>'group', :version=>'1.0' do
|
1311
|
+
package :jar, :id=>'code'
|
1312
|
+
package :war, :id=>'webapp'
|
1313
|
+
end
|
1314
|
+
foobar = project('foobar')
|
1315
|
+
transitive(foobar).should eql([
|
1316
|
+
task(foobar.path_to('target/code-1.0.jar')),
|
1317
|
+
task(foobar.path_to('target/webapp-1.0.war'))
|
1318
|
+
])
|
1319
|
+
end
|
1320
|
+
|
1321
|
+
it 'should complain about an invalid specification' do
|
1322
|
+
lambda { transitive(5) }.should raise_error
|
1323
|
+
lambda { transitive('group:no:version:') }.should raise_error
|
1324
|
+
end
|
1325
|
+
|
1326
|
+
it 'should bring artifact and its dependencies' do
|
1327
|
+
transitive(@complex).should eql(artifacts(@complex, @simple - [@provided]))
|
1328
|
+
end
|
1329
|
+
|
1330
|
+
it 'should bring dependencies of POM without artifact itself' do
|
1331
|
+
transitive(@complex.sub(/jar/, 'pom')).should eql(artifacts(@simple - [@provided]))
|
1332
|
+
end
|
1333
|
+
|
1334
|
+
it 'should bring artifact and transitive depenencies' do
|
1335
|
+
transitive(@transitive).should eql(artifacts(@transitive, @complex, @simple - [@provided]))
|
1336
|
+
end
|
1337
|
+
|
1338
|
+
it 'should filter dependencies based on :scopes argument' do
|
1339
|
+
specs = [@complex, 'saxon:saxon-dom:jar:8.4']
|
1340
|
+
transitive(@complex, :scopes => [:runtime]).should eql(specs.map { |spec| artifact(spec) })
|
1341
|
+
end
|
1342
|
+
|
1343
|
+
it 'should filter dependencies based on :optional argument' do
|
1344
|
+
specs = [@complex, 'saxon:saxon-dom:jar:8.4', 'jlib:jlib-optional:jar:1.4']
|
1345
|
+
transitive(@complex, :scopes => [:runtime], :optional => true).should eql(specs.map { |spec| artifact(spec) })
|
1346
|
+
end
|
1347
|
+
end
|
1348
|
+
|
1349
|
+
def modified?(old_mtime, spec)
|
1350
|
+
File.exist?(artifact(spec).to_s) && old_mtime < File.mtime(artifact(spec).to_s)
|
1351
|
+
end
|