buildr 1.3.0 → 1.3.1
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +16 -0
- data/NOTICE +0 -3
- data/README +3 -44
- data/Rakefile +4 -2
- data/addon/buildr/jibx.rb +86 -0
- data/buildr.gemspec +12 -12
- data/doc/css/default.css +1 -1
- data/doc/pages/contributing.textile +2 -2
- data/doc/pages/download.textile +10 -0
- data/doc/pages/getting_started.textile +4 -4
- data/doc/pages/index.textile +1 -1
- data/doc/pages/whats_new.textile +25 -12
- data/doc/scripts/buildr-git.rb +3 -2
- data/doc/site.toc.yaml +1 -1
- data/lib/buildr.rb +1 -2
- data/lib/buildr/core/application.rb +12 -1
- data/lib/buildr/core/common.rb +0 -1
- data/lib/buildr/core/compile.rb +1 -1
- data/lib/buildr/core/filter.rb +4 -5
- data/lib/buildr/core/transports.rb +159 -73
- data/lib/buildr/java.rb +1 -1
- data/lib/buildr/java/bdd_frameworks.rb +9 -11
- data/lib/buildr/java/commands.rb +1 -0
- data/lib/buildr/java/pom.rb +1 -1
- data/lib/buildr/java/test_frameworks.rb +1 -0
- data/lib/buildr/java/version_requirement.rb +2 -2
- data/lib/buildr/packaging/artifact_namespace.rb +14 -2
- data/rakelib/apache.rake +32 -7
- data/rakelib/changelog.rake +2 -1
- data/rakelib/release.rake +13 -1
- data/rakelib/rubyforge.rake +10 -3
- data/rakelib/setup.rake +4 -3
- data/spec/application_spec.rb +18 -0
- data/spec/archive_spec.rb +0 -1
- data/spec/artifact_spec.rb +9 -0
- data/spec/common_spec.rb +0 -4
- data/spec/java_spec.rb +38 -0
- data/spec/java_test_frameworks_spec.rb +12 -0
- data/spec/test_spec.rb +13 -3
- data/spec/transport_spec.rb +189 -1
- data/spec/version_requirement_spec.rb +4 -0
- metadata +38 -33
data/lib/buildr/java/pom.rb
CHANGED
@@ -71,7 +71,7 @@ module Buildr
|
|
71
71
|
|
72
72
|
def initialize(xml) #:nodoc:
|
73
73
|
@project = XmlSimple.xml_in(xml)
|
74
|
-
@parent = POM.load(pom_to_hash(project["parent"].first)) if project[
|
74
|
+
@parent = POM.load(pom_to_hash(project["parent"].first).merge(:type=>'pom')) if project['parent']
|
75
75
|
end
|
76
76
|
|
77
77
|
# :call-seq:
|
@@ -201,6 +201,7 @@ module Buildr
|
|
201
201
|
ant.classpath :path=>dependencies.join(File::PATH_SEPARATOR)
|
202
202
|
(options[:properties] || []).each { |key, value| ant.sysproperty :key=>key, :value=>value }
|
203
203
|
(options[:environment] || []).each { |key, value| ant.env :key=>key, :value=>value }
|
204
|
+
Array(options[:java_args]).each { |value| ant.jvmarg :value=>value }
|
204
205
|
ant.formatter :type=>'plain'
|
205
206
|
ant.formatter :type=>'plain', :usefile=>false # log test
|
206
207
|
ant.formatter :type=>'xml'
|
@@ -496,13 +496,25 @@ module Buildr
|
|
496
496
|
|
497
497
|
# Return an artifact spec without the version part.
|
498
498
|
def unversioned_spec
|
499
|
-
to_spec
|
499
|
+
str = to_spec
|
500
|
+
return nil if str =~ /^:+/
|
501
|
+
ary = str.split(':')
|
502
|
+
ary = ary[0...-1] if ary.size > 3
|
503
|
+
ary.join(':')
|
500
504
|
end
|
501
505
|
|
502
506
|
class << self
|
503
507
|
# Return an artifact spec without the version part.
|
504
508
|
def unversioned_spec(spec)
|
505
|
-
|
509
|
+
str = spec.to_s
|
510
|
+
return nil if str =~ /^:+/
|
511
|
+
ary = str.split(':')
|
512
|
+
ary = ary[0...-1] if ary.size > 3
|
513
|
+
if ary.size > 2
|
514
|
+
ary.join(':')
|
515
|
+
else
|
516
|
+
new(spec).unversioned_spec
|
517
|
+
end
|
506
518
|
end
|
507
519
|
end
|
508
520
|
end
|
data/rakelib/apache.rake
CHANGED
@@ -65,14 +65,39 @@ namespace 'apache' do
|
|
65
65
|
target = args.incubating ? "people.apache.org:/www/www.apache.org/dist/incubator/#{spec.name}/#{spec.version}-incubating" :
|
66
66
|
"people.apache.org:/www/www.apache.org/dist/#{spec.name}/#{spec.version}"
|
67
67
|
puts 'Uploading packages to Apache distro ...'
|
68
|
-
|
68
|
+
host, remote_dir = target.split(':')
|
69
|
+
sh 'ssh', host, 'rm', '-rf', remote_dir rescue nil
|
70
|
+
sh 'ssh', host, 'mkdir', remote_dir
|
71
|
+
sh 'rsync', '--progress', '--recursive', 'published/distro/', target
|
69
72
|
puts 'Done'
|
70
73
|
end
|
71
74
|
|
72
|
-
|
73
|
-
task 'distro-links'=>['staged/site', 'apache:sign'] do |task, args|
|
75
|
+
task 'distro-links'=>'staged/distro' do |task, args|
|
74
76
|
url = args.incubating ? "http://www.apache.org/dist/incubator/#{spec.name}/#{spec.version}-incubating" :
|
75
77
|
"http://www.apache.org/dist/#{spec.name}/#{spec.version}"
|
78
|
+
rows = FileList['staged/distro/*.{gem,tgz,zip}'].map { |pkg|
|
79
|
+
name, md5 = File.basename(pkg), MD5.file(pkg).to_s
|
80
|
+
%{| "#{name}":#{url}/#{name} | "#{md5}":#{url}/#{name}.md5 | "Sig":#{url}/#{name}.asc |}
|
81
|
+
}
|
82
|
+
textile = <<-TEXTILE
|
83
|
+
h3. #{spec.name} #{spec.version}#{args.incubating && "-incubating"} (#{Time.now.strftime('%Y-%m-%d')})
|
84
|
+
|
85
|
+
|_. Package |_. MD5 Checksum |_. PGP |
|
86
|
+
#{rows.join("\n")}
|
87
|
+
|
88
|
+
p>. ("Release signing keys":#{url}/KEYS)
|
89
|
+
TEXTILE
|
90
|
+
file_name = 'doc/pages/download.textile'
|
91
|
+
print "Adding download links to #{file_name} ... "
|
92
|
+
modified = File.read(file_name).sub(/h2.*binaries.*source.*/i) { |header| "#{header}\n\n#{textile}" }
|
93
|
+
File.open file_name, 'w' do |file|
|
94
|
+
file.write modified
|
95
|
+
end
|
96
|
+
puts 'Done'
|
97
|
+
end
|
98
|
+
|
99
|
+
=begin
|
100
|
+
task 'distro-links'=>['staged/site', 'apache:sign'] do |task, args|
|
76
101
|
rows = FileList['staged/distro/*.{gem,tgz,zip}'].map { |pkg|
|
77
102
|
name, md5 = File.basename(pkg), File.read("#{pkg}.md5").split.first
|
78
103
|
<<-HTML
|
@@ -97,9 +122,9 @@ namespace 'apache' do
|
|
97
122
|
file.write modified
|
98
123
|
end
|
99
124
|
end
|
125
|
+
=end
|
100
126
|
|
101
|
-
file 'staged/site'=>'site' do
|
102
|
-
mkpath 'staged'
|
127
|
+
file 'staged/site'=>['distro-links', 'staged', 'site'] do
|
103
128
|
rm_rf 'staged/site'
|
104
129
|
cp_r 'site', 'staged'
|
105
130
|
end
|
@@ -109,7 +134,7 @@ namespace 'apache' do
|
|
109
134
|
target = args.incubating ? "people.apache.org:/www/incubator.apache.org/#{spec.name}" :
|
110
135
|
"people.apache.org:/www/#{spec.name}.apache.org"
|
111
136
|
puts 'Uploading Apache Web site ...'
|
112
|
-
sh 'rsync', '--progress', '--recursive', '--delete', 'published/
|
137
|
+
sh 'rsync', '--progress', '--recursive', '--delete', 'published/site/', target
|
113
138
|
puts 'Done'
|
114
139
|
end
|
115
140
|
|
@@ -117,7 +142,7 @@ end
|
|
117
142
|
|
118
143
|
|
119
144
|
task 'stage:check'=>['apache:license', 'apache:check']
|
120
|
-
task 'stage:prepare'=>['staged/distro', 'staged/site'
|
145
|
+
task 'stage:prepare'=>['staged/distro', 'staged/site'] do |task|
|
121
146
|
# Since this requires input (passphrase), do it at the very end.
|
122
147
|
task.enhance do
|
123
148
|
task('apache:sign').invoke
|
data/rakelib/changelog.rake
CHANGED
@@ -40,7 +40,8 @@ namespace 'changelog' do
|
|
40
40
|
end
|
41
41
|
|
42
42
|
task 'wrapup'=>'CHANGELOG' do
|
43
|
-
next_version = spec.version.
|
43
|
+
next_version = spec.version.to_s.split('.').map { |v| v.to_i }.
|
44
|
+
zip([0, 0, 1]).map { |a| a.inject(0) { |t,i| t + i } }.join('.')
|
44
45
|
print 'Adding new entry to CHANGELOG ... '
|
45
46
|
modified = "#{next_version} (Pending)\n\n" + File.read('CHANGELOG')
|
46
47
|
File.open 'CHANGELOG', 'w' do |file|
|
data/rakelib/release.rake
CHANGED
@@ -38,9 +38,11 @@ task 'release'=>['release:prepare', 'release:publish', 'release:wrapup']
|
|
38
38
|
|
39
39
|
|
40
40
|
task 'next_version' do
|
41
|
+
next_version = spec.version.to_s.split('.').map { |v| v.to_i }.
|
42
|
+
zip([0, 0, 1]).map { |a| a.inject(0) { |t,i| t + i } }.join('.')
|
43
|
+
|
41
44
|
ver_file = "lib/#{spec.name}.rb"
|
42
45
|
if File.exist?(ver_file)
|
43
|
-
next_version = spec.version.to_ints.zip([0, 0, 1]).map { |a| a.inject(0) { |t,i| t + i } }.join('.')
|
44
46
|
print "Updating #{ver_file} to next version number (#{next_version}) ... "
|
45
47
|
modified = File.read(ver_file).sub(/(VERSION\s*=\s*)(['"])(.*)\2/) { |line| "#{$1}#{$2}#{next_version}#{$2}" }
|
46
48
|
File.open ver_file, 'w' do |file|
|
@@ -48,6 +50,16 @@ task 'next_version' do
|
|
48
50
|
end
|
49
51
|
puts 'Done'
|
50
52
|
end
|
53
|
+
|
54
|
+
spec_file = "#{spec.name}.gemspec"
|
55
|
+
if File.exist?(spec_file)
|
56
|
+
print "Updating #{spec_file} to next version number (#{next_version}) ... "
|
57
|
+
modified = File.read(spec_file).sub(/(s(?:pec)?\.version\s*=\s*)(['"])(.*)\2/) { |line| "#{$1}#{$2}#{next_version}#{$2}" }
|
58
|
+
File.open spec_file, 'w' do |file|
|
59
|
+
file.write modified
|
60
|
+
end
|
61
|
+
puts 'Done'
|
62
|
+
end
|
51
63
|
end
|
52
64
|
|
53
65
|
task 'release:wrapup'=>'next_version'
|
data/rakelib/rubyforge.rake
CHANGED
@@ -29,14 +29,21 @@ end
|
|
29
29
|
|
30
30
|
namespace 'rubyforge' do
|
31
31
|
|
32
|
-
|
32
|
+
file 'published/rubyforge'=>'published' do
|
33
|
+
mkdir 'published/rubyforge'
|
34
|
+
FileList['published/distro/*.{gem,tgz,zip}'].each do |pkg|
|
35
|
+
cp pkg, 'published/rubyforge/' + File.basename(pkg).sub(/-incubating/, '')
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
task 'release'=>'published/rubyforge' do |task|
|
33
40
|
changes = FileList['published/CHANGES'].first
|
34
|
-
files = FileList['published/*.{gem,tgz,zip}'].exclude(changes).existing
|
41
|
+
files = FileList['published/rubyforge/*.{gem,tgz,zip}'].exclude(changes).existing
|
35
42
|
print "Uploading #{spec.version} to RubyForge ... "
|
36
43
|
rubyforge = RubyForge.new
|
37
44
|
rubyforge.login
|
38
45
|
rubyforge.userconfig.merge!('release_changes'=>changes, 'preformatted' => true) if changes
|
39
|
-
rubyforge.add_release spec.rubyforge_project.downcase, spec.name.downcase, spec.version, *files
|
46
|
+
rubyforge.add_release spec.rubyforge_project.downcase, spec.name.downcase, spec.version.to_s, *files
|
40
47
|
puts 'Done'
|
41
48
|
end
|
42
49
|
|
data/rakelib/setup.rake
CHANGED
@@ -17,7 +17,7 @@
|
|
17
17
|
|
18
18
|
|
19
19
|
require 'rubygems/source_info_cache'
|
20
|
-
|
20
|
+
require 'stringio' # for Gem::RemoteFetcher
|
21
21
|
|
22
22
|
def windows?
|
23
23
|
Config::CONFIG['host_os'] =~ /windows|cygwin|bccwin|cygwin|djgpp|mingw|mswin|wince/i
|
@@ -38,11 +38,12 @@ end
|
|
38
38
|
|
39
39
|
def install_gem(name, ver_requirement = nil)
|
40
40
|
dep = Gem::Dependency.new(name, ver_requirement)
|
41
|
+
rb_bin = File.join(Config::CONFIG['bindir'], Config::CONFIG['ruby_install_name'])
|
41
42
|
if Gem::SourceIndex.from_installed_gems.search(dep).empty?
|
42
|
-
spec = Gem::SourceInfoCache.search(dep).last
|
43
|
+
spec = Gem::SourceInfoCache.search(dep, true, true).last
|
43
44
|
fail "#{dep} not found in local or remote repository!" unless spec
|
44
45
|
puts "Installing #{spec} ..."
|
45
|
-
args = [
|
46
|
+
args = [rb_bin, '-S', 'gem', 'install', spec.name, '-v', spec.version.to_s]
|
46
47
|
args.unshift('sudo', 'env', 'JAVA_HOME=' + ENV['JAVA_HOME']) unless windows?
|
47
48
|
sh *args
|
48
49
|
end
|
data/spec/application_spec.rb
CHANGED
@@ -210,6 +210,11 @@ describe Buildr, 'settings' do
|
|
210
210
|
Buildr.settings.user.should == { 'foo'=>'bar' }
|
211
211
|
end
|
212
212
|
|
213
|
+
it 'should return loaded settings.yml file' do
|
214
|
+
write 'home/.buildr/settings.yml', 'foo: bar'
|
215
|
+
Buildr.settings.user.should == { 'foo'=>'bar' }
|
216
|
+
end
|
217
|
+
|
213
218
|
it 'should fail if settings.yaml file is not a hash' do
|
214
219
|
write 'home/.buildr/settings.yaml', 'foo bar'
|
215
220
|
lambda { Buildr.settings.user }.should raise_error(RuntimeError, /expecting.*settings.yaml/i)
|
@@ -231,6 +236,11 @@ describe Buildr, 'settings' do
|
|
231
236
|
Buildr.settings.build.should == { 'foo'=>'bar' }
|
232
237
|
end
|
233
238
|
|
239
|
+
it 'should return loaded build.yml file' do
|
240
|
+
write 'build.yml', 'foo: bar'
|
241
|
+
Buildr.settings.build.should == { 'foo'=>'bar' }
|
242
|
+
end
|
243
|
+
|
234
244
|
it 'should fail if build.yaml file is not a hash' do
|
235
245
|
write 'build.yaml', 'foo bar'
|
236
246
|
lambda { Buildr.settings.build }.should raise_error(RuntimeError, /expecting.*build.yaml/i)
|
@@ -255,6 +265,14 @@ describe Buildr, 'settings' do
|
|
255
265
|
Buildr.settings.profiles.should == { 'development'=> { 'foo'=>'bar' } }
|
256
266
|
end
|
257
267
|
|
268
|
+
it 'should return loaded profiles.yml file' do
|
269
|
+
write 'profiles.yml', <<-YAML
|
270
|
+
development:
|
271
|
+
foo: bar
|
272
|
+
YAML
|
273
|
+
Buildr.settings.profiles.should == { 'development'=> { 'foo'=>'bar' } }
|
274
|
+
end
|
275
|
+
|
258
276
|
it 'should fail if profiles.yaml file is not a hash' do
|
259
277
|
write 'profiles.yaml', 'foo bar'
|
260
278
|
lambda { Buildr.settings.profiles }.should raise_error(RuntimeError, /expecting.*profiles.yaml/i)
|
data/spec/archive_spec.rb
CHANGED
data/spec/artifact_spec.rb
CHANGED
@@ -424,6 +424,15 @@ describe Buildr, '#artifact' do
|
|
424
424
|
artifact = artifact('group:id:jar:1.0').from('test.jar')
|
425
425
|
lambda { artifact.invoke }.should change { File.exist?(artifact.to_s) }.to(true)
|
426
426
|
end
|
427
|
+
|
428
|
+
it 'should reference artifacts defined on build.yaml by using ruby symbols' do
|
429
|
+
write 'build.yaml', <<-YAML
|
430
|
+
artifacts:
|
431
|
+
j2ee: geronimo-spec:geronimo-spec-j2ee:jar:1.4-rc4
|
432
|
+
YAML
|
433
|
+
Buildr.application.load_artifacts
|
434
|
+
artifact(:j2ee).to_s.pathmap('%f').should == 'geronimo-spec-j2ee-1.4-rc4.jar'
|
435
|
+
end
|
427
436
|
end
|
428
437
|
|
429
438
|
|
data/spec/common_spec.rb
CHANGED
@@ -411,10 +411,6 @@ describe Buildr::Filter do
|
|
411
411
|
@filter.from('src').into('target').run.should be(false)
|
412
412
|
end
|
413
413
|
|
414
|
-
it 'should fail is source directory not set' do
|
415
|
-
lambda { Filter.new.into('target').run }.should raise_error(RuntimeError, /No source directory/)
|
416
|
-
end
|
417
|
-
|
418
414
|
it 'should fail if source directory doesn\'t exist' do
|
419
415
|
lambda { Filter.new.from('srced').into('target').run }.should raise_error(RuntimeError, /doesn't exist/)
|
420
416
|
end
|
data/spec/java_spec.rb
ADDED
@@ -0,0 +1,38 @@
|
|
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.join(File.dirname(__FILE__), 'spec_helpers')
|
17
|
+
|
18
|
+
describe ENV, 'JAVA_HOME on OS X' do
|
19
|
+
before do
|
20
|
+
@old_home, ENV['JAVA_HOME'] = ENV['JAVA_HOME'], nil
|
21
|
+
Config::CONFIG.should_receive(:[]).with('host_os').and_return('darwin0.9')
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'should point to default JVM' do
|
25
|
+
load File.expand_path('../lib/buildr/java.rb')
|
26
|
+
ENV['JAVA_HOME'].should == '/System/Library/Frameworks/JavaVM.framework/Home'
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'should use value of environment variable if specified' do
|
30
|
+
ENV['JAVA_HOME'] = '/System/Library/Frameworks/JavaVM.specified'
|
31
|
+
load File.expand_path('../lib/buildr/java.rb')
|
32
|
+
ENV['JAVA_HOME'].should == '/System/Library/Frameworks/JavaVM.specified'
|
33
|
+
end
|
34
|
+
|
35
|
+
after do
|
36
|
+
ENV['JAVA_HOME'] = @old_home
|
37
|
+
end
|
38
|
+
end
|
@@ -179,6 +179,18 @@ describe Buildr::JUnit do
|
|
179
179
|
project('foo').test.invoke
|
180
180
|
end
|
181
181
|
|
182
|
+
it 'should pass environment to JVM' do
|
183
|
+
write 'src/test/java/EnvironmentTest.java', <<-JAVA
|
184
|
+
public class EnvironmentTest extends junit.framework.TestCase {
|
185
|
+
public void testEnvironment() {
|
186
|
+
assertEquals("value", System.getenv("NAME"));
|
187
|
+
}
|
188
|
+
}
|
189
|
+
JAVA
|
190
|
+
define('foo').test.using :environment=>{ 'NAME'=>'value' }
|
191
|
+
project('foo').test.invoke
|
192
|
+
end
|
193
|
+
|
182
194
|
it 'should set current directory' do
|
183
195
|
mkpath 'baz'
|
184
196
|
expected = File.expand_path('baz')
|
data/spec/test_spec.rb
CHANGED
@@ -374,11 +374,13 @@ describe Buildr::Project, '#test' do
|
|
374
374
|
|
375
375
|
it 'should inherit options from parent project' do
|
376
376
|
define 'foo' do
|
377
|
-
test.using :fail_on_failure=>false, :fork=>:each, :properties=>{ :foo=>'bar' }
|
377
|
+
test.using :fail_on_failure=>false, :fork=>:each, :properties=>{ :foo=>'bar' }, :environment=>{ 'config'=>'config.yaml' }
|
378
378
|
define 'bar' do
|
379
|
+
test.using :junit
|
379
380
|
test.options[:fail_on_failure].should be_false
|
380
381
|
test.options[:fork].should == :each
|
381
382
|
test.options[:properties][:foo].should == 'bar'
|
383
|
+
test.options[:environment]['config'].should == 'config.yaml'
|
382
384
|
end
|
383
385
|
end
|
384
386
|
end
|
@@ -386,11 +388,13 @@ describe Buildr::Project, '#test' do
|
|
386
388
|
it 'should clone options from parent project' do
|
387
389
|
define 'foo' do
|
388
390
|
define 'bar' do
|
389
|
-
test.using :fail_on_failure=>false, :fork=>:each, :properties=>{ :foo=>'bar' }
|
391
|
+
test.using :fail_on_failure=>false, :fork=>:each, :properties=>{ :foo=>'bar' }, :environment=>{ 'config'=>'config.yaml' }
|
392
|
+
test.using :junit
|
390
393
|
end.invoke
|
391
394
|
test.options[:fail_on_failure].should be_true
|
392
395
|
test.options[:fork].should == :once
|
393
|
-
test.options[:
|
396
|
+
test.options[:properties].should be_empty
|
397
|
+
test.options[:environment].should be_empty
|
394
398
|
end
|
395
399
|
end
|
396
400
|
end
|
@@ -454,6 +458,7 @@ end
|
|
454
458
|
describe Buildr::Project, 'test:resources' do
|
455
459
|
it 'should ignore resources unless they exist' do
|
456
460
|
define('foo').test.resources.sources.should be_empty
|
461
|
+
project('foo').test.resources.target.should be_nil
|
457
462
|
end
|
458
463
|
|
459
464
|
it 'should pick resources from src/test/resources if found' do
|
@@ -467,6 +472,11 @@ describe Buildr::Project, 'test:resources' do
|
|
467
472
|
file('targeted/test/resources/foo').should contain('Foo')
|
468
473
|
end
|
469
474
|
|
475
|
+
it 'should create target directory even if no files to copy' do
|
476
|
+
define('foo').test.resources.filter.into('resources')
|
477
|
+
lambda { file(File.expand_path('resources')).invoke }.should change { File.exist?('resources') }.to(true)
|
478
|
+
end
|
479
|
+
|
470
480
|
it 'should execute alongside compile task' do
|
471
481
|
task 'action'
|
472
482
|
define('foo') { test.resources { task('action').invoke } }
|
data/spec/transport_spec.rb
CHANGED
@@ -221,7 +221,9 @@ describe URI::HTTP, '#read' do
|
|
221
221
|
@proxy = 'http://john:smith@myproxy:8080'
|
222
222
|
@domain = 'domain'
|
223
223
|
@host_domain = "host.#{@domain}"
|
224
|
-
@
|
224
|
+
@path = "/foo/bar/baz"
|
225
|
+
@query = "?query"
|
226
|
+
@uri = URI("http://#{@host_domain}#{@path}#{@query}")
|
225
227
|
@no_proxy_args = [@host_domain, 80]
|
226
228
|
@proxy_args = @no_proxy_args + ['myproxy', 8080, 'john', 'smith']
|
227
229
|
@http = mock('http')
|
@@ -297,4 +299,190 @@ describe URI::HTTP, '#read' do
|
|
297
299
|
request.should_receive(:basic_auth).with('john', 'secret')
|
298
300
|
URI("http://john:secret@#{@host_domain}").read
|
299
301
|
end
|
302
|
+
|
303
|
+
it 'should include the query part when performing HTTP GET' do
|
304
|
+
# should this test be generalized or shared with any other URI subtypes?
|
305
|
+
Net::HTTP.stub!(:new).and_return(@http)
|
306
|
+
Net::HTTP::Get.should_receive(:new).with(/#{Regexp.escape(@query)}$/, nil)
|
307
|
+
@uri.read
|
308
|
+
end
|
309
|
+
|
310
|
+
end
|
311
|
+
|
312
|
+
|
313
|
+
describe URI::HTTP, '#write' do
|
314
|
+
before do
|
315
|
+
@content = 'Readme. Please!'
|
316
|
+
@uri = URI('http://john:secret@host.domain/foo/bar/baz.jar')
|
317
|
+
@http = mock('Net::HTTP')
|
318
|
+
@http.stub!(:request).and_return(Net::HTTPOK.new(nil, nil, nil))
|
319
|
+
Net::HTTP.stub!(:new).and_return(@http)
|
320
|
+
end
|
321
|
+
|
322
|
+
it 'should open connection to HTTP server' do
|
323
|
+
Net::HTTP.should_receive(:new).with('host.domain', 80).and_return(@http)
|
324
|
+
@uri.write @content
|
325
|
+
end
|
326
|
+
|
327
|
+
it 'should use HTTP basic authentication' do
|
328
|
+
@http.should_receive(:request) do |request|
|
329
|
+
request['authorization'].should == ('Basic ' + ['john:secret'].pack('m').delete("\r\n"))
|
330
|
+
Net::HTTPOK.new(nil, nil, nil)
|
331
|
+
end
|
332
|
+
@uri.write @content
|
333
|
+
end
|
334
|
+
|
335
|
+
it 'should use HTTPS if applicable' do
|
336
|
+
Net::HTTP.should_receive(:new).with('host.domain', 443).and_return(@http)
|
337
|
+
@http.should_receive(:use_ssl=).with(true)
|
338
|
+
URI(@uri.to_s.sub(/http/, 'https')).write @content
|
339
|
+
end
|
340
|
+
|
341
|
+
it 'should upload file with PUT request' do
|
342
|
+
@http.should_receive(:request) do |request|
|
343
|
+
request.should be_kind_of(Net::HTTP::Put)
|
344
|
+
Net::HTTPOK.new(nil, nil, nil)
|
345
|
+
end
|
346
|
+
@uri.write @content
|
347
|
+
end
|
348
|
+
|
349
|
+
it 'should set Content-Length header' do
|
350
|
+
@http.should_receive(:request) do |request|
|
351
|
+
request.content_length.should == @content.size
|
352
|
+
Net::HTTPOK.new(nil, nil, nil)
|
353
|
+
end
|
354
|
+
@uri.write @content
|
355
|
+
end
|
356
|
+
|
357
|
+
it 'should set Content-MD5 header' do
|
358
|
+
@http.should_receive(:request) do |request|
|
359
|
+
request['Content-MD5'].should == Digest::MD5.hexdigest(@content)
|
360
|
+
Net::HTTPOK.new(nil, nil, nil)
|
361
|
+
end
|
362
|
+
@uri.write @content
|
363
|
+
end
|
364
|
+
|
365
|
+
it 'should send entire content' do
|
366
|
+
@http.should_receive(:request) do |request|
|
367
|
+
body_stream = request.body_stream
|
368
|
+
body_stream.read(1024).should == @content
|
369
|
+
body_stream.read(1024).should be_nil
|
370
|
+
Net::HTTPOK.new(nil, nil, nil)
|
371
|
+
end
|
372
|
+
@uri.write @content
|
373
|
+
end
|
374
|
+
|
375
|
+
it 'should fail on 4xx response' do
|
376
|
+
@http.should_receive(:request) do |request|
|
377
|
+
Net::HTTPBadRequest.new(nil, nil, nil)
|
378
|
+
end
|
379
|
+
lambda { @uri.write @content }.should raise_error(RuntimeError, /failed to upload/i)
|
380
|
+
end
|
381
|
+
|
382
|
+
it 'should fail on 5xx response' do
|
383
|
+
@http.should_receive(:request) do |request|
|
384
|
+
Net::HTTPServiceUnavailable.new(nil, nil, nil)
|
385
|
+
end
|
386
|
+
lambda { @uri.write @content }.should raise_error(RuntimeError, /failed to upload/i)
|
387
|
+
end
|
388
|
+
|
389
|
+
end
|
390
|
+
|
391
|
+
|
392
|
+
describe URI::SFTP, '#read' do
|
393
|
+
before do
|
394
|
+
@uri = URI('sftp://john:secret@localhost/path/readme')
|
395
|
+
@content = 'Readme. Please!'
|
396
|
+
|
397
|
+
@ssh_session = mock('Net::SSH::Session')
|
398
|
+
@sftp_session = mock('Net::SFTP::Session')
|
399
|
+
@file_factory = mock('Net::SFTP::Operations::FileFactory')
|
400
|
+
Net::SSH.stub!(:start).with('localhost', 'john', :password=>'secret', :port=>22) do
|
401
|
+
Net::SFTP::Session.should_receive(:new).with(@ssh_session).and_yield(@sftp_session).and_return(@sftp_session)
|
402
|
+
@sftp_session.should_receive(:connect!).and_return(@sftp_session)
|
403
|
+
@sftp_session.should_receive(:loop)
|
404
|
+
@sftp_session.should_receive(:file).with.and_return(@file_factory)
|
405
|
+
@file_factory.stub!(:open)
|
406
|
+
@ssh_session.should_receive(:close)
|
407
|
+
@ssh_session
|
408
|
+
end
|
409
|
+
end
|
410
|
+
|
411
|
+
it 'should open connection to SFTP server' do
|
412
|
+
@uri.read
|
413
|
+
end
|
414
|
+
|
415
|
+
it 'should open file for reading' do
|
416
|
+
@file_factory.should_receive(:open).with('/path/readme', 'r')
|
417
|
+
@uri.read
|
418
|
+
end
|
419
|
+
|
420
|
+
it 'should read contents of file and return it' do
|
421
|
+
file = mock('Net::SFTP::Operations::File')
|
422
|
+
file.should_receive(:read).with(an_instance_of(Numeric)).once.and_return(@content, nil)
|
423
|
+
@file_factory.should_receive(:open).with('/path/readme', 'r').and_yield(file)
|
424
|
+
@uri.read.should eql(@content)
|
425
|
+
end
|
426
|
+
|
427
|
+
it 'should read contents of file and pass it to block' do
|
428
|
+
file = mock('Net::SFTP::Operations::File')
|
429
|
+
file.should_receive(:read).with(an_instance_of(Numeric)).once.and_return(@content, nil)
|
430
|
+
@file_factory.should_receive(:open).with('/path/readme', 'r').and_yield(file)
|
431
|
+
content = ''
|
432
|
+
@uri.read do |chunk|
|
433
|
+
content << chunk
|
434
|
+
end
|
435
|
+
content.should eql(@content)
|
436
|
+
end
|
437
|
+
end
|
438
|
+
|
439
|
+
|
440
|
+
describe URI::SFTP, '#write' do
|
441
|
+
before do
|
442
|
+
@uri = URI('sftp://john:secret@localhost/path/readme')
|
443
|
+
@content = 'Readme. Please!'
|
444
|
+
|
445
|
+
@ssh_session = mock('Net::SSH::Session')
|
446
|
+
@sftp_session = mock('Net::SFTP::Session')
|
447
|
+
@file_factory = mock('Net::SFTP::Operations::FileFactory')
|
448
|
+
Net::SSH.stub!(:start).with('localhost', 'john', :password=>'secret', :port=>22) do
|
449
|
+
Net::SFTP::Session.should_receive(:new).with(@ssh_session).and_yield(@sftp_session).and_return(@sftp_session)
|
450
|
+
@sftp_session.should_receive(:connect!).and_return(@sftp_session)
|
451
|
+
@sftp_session.should_receive(:loop)
|
452
|
+
@sftp_session.stub!(:mkdir)
|
453
|
+
@sftp_session.should_receive(:file).with.and_return(@file_factory)
|
454
|
+
@file_factory.stub!(:open)
|
455
|
+
@ssh_session.should_receive(:close)
|
456
|
+
@ssh_session
|
457
|
+
end
|
458
|
+
end
|
459
|
+
|
460
|
+
it 'should open connection to SFTP server' do
|
461
|
+
@uri.write @content
|
462
|
+
end
|
463
|
+
|
464
|
+
it 'should create path recursively on SFTP server' do
|
465
|
+
@sftp_session.should_receive(:mkdir).ordered.with('', {})
|
466
|
+
@sftp_session.should_receive(:mkdir).ordered.with('/path', {})
|
467
|
+
@uri.write @content
|
468
|
+
end
|
469
|
+
|
470
|
+
it 'should only create paths that don\'t exist' do
|
471
|
+
@sftp_session.should_receive(:realpath).any_number_of_times
|
472
|
+
@sftp_session.should_not_receive(:mkdir)
|
473
|
+
@uri.write @content
|
474
|
+
end
|
475
|
+
|
476
|
+
it 'should open file for writing' do
|
477
|
+
@file_factory.should_receive(:open).with('/path/readme', 'w')
|
478
|
+
@uri.write @content
|
479
|
+
end
|
480
|
+
|
481
|
+
it 'should write contents to file' do
|
482
|
+
file = mock('Net::SFTP::Operations::File')
|
483
|
+
file.should_receive(:write).with(@content)
|
484
|
+
@file_factory.should_receive(:open).with('/path/readme', 'w').and_yield(file)
|
485
|
+
@uri.write @content
|
486
|
+
end
|
487
|
+
|
300
488
|
end
|