buildr 1.3.2-java → 1.3.3-java

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. data/CHANGELOG +66 -4
  2. data/{README → README.rdoc} +29 -16
  3. data/Rakefile +16 -20
  4. data/_buildr +38 -0
  5. data/addon/buildr/cobertura.rb +49 -45
  6. data/addon/buildr/emma.rb +238 -0
  7. data/addon/buildr/jetty.rb +1 -1
  8. data/addon/buildr/nailgun.rb +585 -661
  9. data/{lib/buildr/java → addon/buildr}/org/apache/buildr/BuildrNail$Main.class +0 -0
  10. data/{lib/buildr/java → addon/buildr}/org/apache/buildr/BuildrNail.class +0 -0
  11. data/{lib/buildr/java → addon/buildr}/org/apache/buildr/BuildrNail.java +0 -0
  12. data/bin/buildr +9 -2
  13. data/buildr.buildfile +53 -0
  14. data/buildr.gemspec +21 -14
  15. data/doc/css/default.css +51 -48
  16. data/doc/css/print.css +60 -55
  17. data/doc/images/favicon.png +0 -0
  18. data/doc/images/growl-icon.tiff +0 -0
  19. data/doc/images/project-structure.png +0 -0
  20. data/doc/pages/artifacts.textile +46 -156
  21. data/doc/pages/building.textile +63 -323
  22. data/doc/pages/contributing.textile +112 -102
  23. data/doc/pages/download.textile +19 -27
  24. data/doc/pages/extending.textile +27 -81
  25. data/doc/pages/getting_started.textile +44 -119
  26. data/doc/pages/index.textile +26 -47
  27. data/doc/pages/languages.textile +407 -0
  28. data/doc/pages/more_stuff.textile +92 -173
  29. data/doc/pages/packaging.textile +71 -239
  30. data/doc/pages/projects.textile +58 -233
  31. data/doc/pages/recipes.textile +19 -43
  32. data/doc/pages/settings_profiles.textile +39 -104
  33. data/doc/pages/testing.textile +41 -304
  34. data/doc/pages/troubleshooting.textile +29 -47
  35. data/doc/pages/whats_new.textile +69 -167
  36. data/doc/print.haml +0 -1
  37. data/doc/print.toc.yaml +1 -0
  38. data/doc/scripts/buildr-git.rb +1 -1
  39. data/doc/site.haml +1 -0
  40. data/doc/site.toc.yaml +8 -5
  41. data/{KEYS → etc/KEYS} +0 -0
  42. data/etc/git-svn-authors +16 -0
  43. data/lib/buildr.rb +2 -5
  44. data/lib/buildr/core/application.rb +192 -98
  45. data/lib/buildr/core/build.rb +140 -91
  46. data/lib/buildr/core/checks.rb +5 -5
  47. data/lib/buildr/core/common.rb +1 -1
  48. data/lib/buildr/core/compile.rb +12 -10
  49. data/lib/buildr/core/filter.rb +151 -46
  50. data/lib/buildr/core/generate.rb +9 -9
  51. data/lib/buildr/core/progressbar.rb +1 -1
  52. data/lib/buildr/core/project.rb +8 -7
  53. data/lib/buildr/core/test.rb +51 -26
  54. data/lib/buildr/core/transports.rb +22 -38
  55. data/lib/buildr/core/util.rb +78 -26
  56. data/lib/buildr/groovy.rb +18 -0
  57. data/lib/buildr/groovy/bdd.rb +105 -0
  58. data/lib/buildr/groovy/compiler.rb +138 -0
  59. data/lib/buildr/ide/eclipse.rb +102 -71
  60. data/lib/buildr/ide/idea.rb +7 -12
  61. data/lib/buildr/ide/idea7x.rb +7 -8
  62. data/lib/buildr/java.rb +4 -7
  63. data/lib/buildr/java/ant.rb +26 -5
  64. data/lib/buildr/java/bdd.rb +449 -0
  65. data/lib/buildr/java/commands.rb +9 -9
  66. data/lib/buildr/java/{compilers.rb → compiler.rb} +8 -90
  67. data/lib/buildr/java/jruby.rb +29 -11
  68. data/lib/buildr/java/jtestr_runner.rb.erb +116 -0
  69. data/lib/buildr/java/packaging.rb +23 -16
  70. data/lib/buildr/java/pom.rb +1 -1
  71. data/lib/buildr/java/rjb.rb +21 -8
  72. data/lib/buildr/java/test_result.rb +308 -0
  73. data/lib/buildr/java/tests.rb +324 -0
  74. data/lib/buildr/packaging/artifact.rb +12 -11
  75. data/lib/buildr/packaging/artifact_namespace.rb +7 -4
  76. data/lib/buildr/packaging/gems.rb +3 -3
  77. data/lib/buildr/packaging/zip.rb +13 -10
  78. data/lib/buildr/resources/buildr.icns +0 -0
  79. data/lib/buildr/scala.rb +19 -0
  80. data/lib/buildr/scala/compiler.rb +109 -0
  81. data/lib/buildr/scala/tests.rb +203 -0
  82. data/rakelib/apache.rake +71 -45
  83. data/rakelib/doc.rake +2 -2
  84. data/rakelib/package.rake +3 -2
  85. data/rakelib/rspec.rake +23 -21
  86. data/rakelib/setup.rake +34 -9
  87. data/rakelib/stage.rake +4 -1
  88. data/spec/addon/cobertura_spec.rb +77 -0
  89. data/spec/addon/emma_spec.rb +120 -0
  90. data/spec/addon/test_coverage_spec.rb +255 -0
  91. data/spec/{application_spec.rb → core/application_spec.rb} +82 -4
  92. data/spec/{artifact_namespace_spec.rb → core/artifact_namespace_spec.rb} +12 -1
  93. data/spec/core/build_spec.rb +415 -0
  94. data/spec/{checks_spec.rb → core/checks_spec.rb} +2 -2
  95. data/spec/{common_spec.rb → core/common_spec.rb} +119 -30
  96. data/spec/{compile_spec.rb → core/compile_spec.rb} +17 -13
  97. data/spec/core/generate_spec.rb +33 -0
  98. data/spec/{project_spec.rb → core/project_spec.rb} +9 -6
  99. data/spec/{test_spec.rb → core/test_spec.rb} +222 -28
  100. data/spec/{transport_spec.rb → core/transport_spec.rb} +5 -9
  101. data/spec/groovy/bdd_spec.rb +80 -0
  102. data/spec/{groovy_compilers_spec.rb → groovy/compiler_spec.rb} +1 -1
  103. data/spec/ide/eclipse_spec.rb +243 -0
  104. data/spec/{java_spec.rb → java/ant.rb} +7 -17
  105. data/spec/java/bdd_spec.rb +358 -0
  106. data/spec/{java_compilers_spec.rb → java/compiler_spec.rb} +1 -1
  107. data/spec/java/java_spec.rb +88 -0
  108. data/spec/{java_packaging_spec.rb → java/packaging_spec.rb} +65 -4
  109. data/spec/{java_test_frameworks_spec.rb → java/tests_spec.rb} +31 -10
  110. data/spec/{archive_spec.rb → packaging/archive_spec.rb} +12 -2
  111. data/spec/{artifact_spec.rb → packaging/artifact_spec.rb} +12 -5
  112. data/spec/{packaging_helper.rb → packaging/packaging_helper.rb} +0 -0
  113. data/spec/{packaging_spec.rb → packaging/packaging_spec.rb} +1 -1
  114. data/spec/sandbox.rb +22 -5
  115. data/spec/{scala_compilers_spec.rb → scala/compiler_spec.rb} +1 -1
  116. data/spec/{scala_test_frameworks_spec.rb → scala/tests_spec.rb} +11 -12
  117. data/spec/spec_helpers.rb +38 -17
  118. metadata +93 -70
  119. data/lib/buildr/java/bdd_frameworks.rb +0 -265
  120. data/lib/buildr/java/groovyc.rb +0 -137
  121. data/lib/buildr/java/test_frameworks.rb +0 -450
  122. data/spec/build_spec.rb +0 -193
  123. data/spec/java_bdd_frameworks_spec.rb +0 -238
  124. data/spec/spec.opts +0 -6
@@ -0,0 +1,120 @@
1
+ # Licensed to the Apache Software Foundation (ASF) under one or more
2
+ # contributor license agreements. See the NOTICE file distributed with this
3
+ # work for additional information regarding copyright ownership. The ASF
4
+ # licenses this file to you under the Apache License, Version 2.0 (the
5
+ # "License"); you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12
+ # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13
+ # License for the specific language governing permissions and limitations under
14
+ # the License.
15
+
16
+
17
+ require File.join(File.dirname(__FILE__), 'test_coverage_spec')
18
+ Sandbox.require_addon 'buildr/emma'
19
+
20
+
21
+ Buildr::Emma::requires
22
+
23
+
24
+ describe Buildr::Emma do
25
+ before do
26
+ # Reloading the addon because the sandbox removes all its actions
27
+ load File.expand_path('../addon/buildr/emma.rb')
28
+ @tool_module = Buildr::Emma
29
+ end
30
+
31
+ it_should_behave_like 'test coverage tool'
32
+
33
+ describe 'project-specific' do
34
+ describe 'metadata file' do
35
+ it 'should have a default value' do
36
+ define('foo').emma.metadata_file.should point_to_path('reports/emma/coverage.em')
37
+ end
38
+
39
+ it 'should be overridable' do
40
+ define('foo') { emma.metadata_file = path_to('target/metadata.emma') }
41
+ project('foo').emma.metadata_file.should point_to_path('target/metadata.emma')
42
+ end
43
+
44
+ it 'should be created during instrumentation' do
45
+ write 'src/main/java/Foo.java', 'public class Foo {}'
46
+ define('foo')
47
+ task('foo:emma:instrument').invoke
48
+ file(project('foo').emma.metadata_file).should exist
49
+ end
50
+ end
51
+
52
+ describe 'coverage file' do
53
+ it 'should have a default value' do
54
+ define('foo').emma.coverage_file.should point_to_path('reports/emma/coverage.ec')
55
+ end
56
+
57
+ it 'should be overridable' do
58
+ define('foo') { emma.coverage_file = path_to('target/coverage.emma') }
59
+ project('foo').emma.coverage_file.should point_to_path('target/coverage.emma')
60
+ end
61
+
62
+ it 'should be created during test' do
63
+ write 'src/main/java/Foo.java', 'public class Foo {}'
64
+ write_test :for=>'Foo', :in=>'src/test/java'
65
+ define('foo')
66
+ task('foo:test').invoke
67
+ file(project('foo').emma.coverage_file).should exist
68
+ end
69
+ end
70
+
71
+ describe 'instrumentation' do
72
+ before do
73
+ ['Foo', 'Bar'].each { |cls| write File.join('src/main/java', "#{cls}.java"), "public class #{cls} {}" }
74
+ end
75
+
76
+ it 'should instrument only included classes' do
77
+ define('foo') { emma.include 'Foo' }
78
+ task("foo:emma:instrument").invoke
79
+ Dir.chdir('target/instrumented/classes') { Dir.glob('*').sort.should == ['Foo.class'] }
80
+ end
81
+
82
+ it 'should not instrument excluded classes' do
83
+ define('foo') { emma.exclude 'Foo' }
84
+ task("foo:emma:instrument").invoke
85
+ Dir.chdir('target/instrumented/classes') { Dir.glob('*').sort.should == ['Bar.class'] }
86
+ end
87
+
88
+ it 'should instrument classes that are included but not excluded' do
89
+ write 'src/main/java/Baz.java', 'public class Baz {}'
90
+ define('foo') { emma.include('Ba*').exclude('*ar') }
91
+ task("foo:emma:instrument").invoke
92
+ Dir.chdir('target/instrumented/classes') { Dir.glob('*').sort.should == ['Baz.class'] }
93
+ end
94
+ end
95
+
96
+ describe 'reports' do
97
+ before do
98
+ write 'src/main/java/Foo.java', 'public class Foo {}'
99
+ write_test :for=>'Foo', :in=>'src/test/java'
100
+ end
101
+
102
+ describe 'in html' do
103
+ it 'should inform the user if no coverage data' do
104
+ rm 'src/test/java/FooTest.java'
105
+ define('foo')
106
+ lambda { task('foo:emma:html').invoke }.
107
+ should show_info(/No test coverage report for foo. Missing: #{project('foo').emma.coverage_file}/)
108
+ end
109
+ end
110
+
111
+ describe 'in xml' do
112
+ it 'should have an xml file' do
113
+ define('foo')
114
+ task('foo:emma:xml').invoke
115
+ file(File.join(project('foo').emma.report_dir, 'coverage.xml')).should exist
116
+ end
117
+ end
118
+ end
119
+ end
120
+ end
@@ -0,0 +1,255 @@
1
+ # Licensed to the Apache Software Foundation (ASF) under one or more
2
+ # contributor license agreements. See the NOTICE file distributed with this
3
+ # work for additional information regarding copyright ownership. The ASF
4
+ # licenses this file to you under the Apache License, Version 2.0 (the
5
+ # "License"); you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12
+ # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13
+ # License for the specific language governing permissions and limitations under
14
+ # the License.
15
+
16
+
17
+ require File.join(File.dirname(__FILE__), '../spec_helpers')
18
+
19
+
20
+ module TestCoverageHelper
21
+ def write_test options
22
+ write File.join(options[:in], "#{options[:for]}Test.java"),
23
+ "public class #{options[:for]}Test extends junit.framework.TestCase { public void test#{options[:for]}() { new #{options[:for]}(); } }"
24
+ end
25
+
26
+ # Rspec matcher using file glob patterns.
27
+ class FileNamePatternMatcher
28
+ def initialize(pattern)
29
+ @expected_pattern = pattern
30
+ @pattern_matcher = lambda { |filename| File.fnmatch? pattern, filename }
31
+ end
32
+
33
+ def matches?(directory)
34
+ @actual_filenames = Dir[File.join(directory,'*')]
35
+ @actual_filenames.any? &@pattern_matcher
36
+ end
37
+
38
+ def failure_message
39
+ "Expected to find at least one element matching '#{@expected_pattern}' among #{@actual_filenames.inspect}, but found none"
40
+ end
41
+
42
+ def negative_failure_message
43
+ "Expected to find no element matching '#{@expected_pattern}' among #{@actual_filenames.inspect}, but found matching element(s) #{@actual_filenames.select(&@pattern_matcher).inspect}"
44
+ end
45
+ end
46
+
47
+ # Test if a directory contains at least one file matching a given glob pattern.
48
+ #
49
+ # For example, to check that a directory contains at least one HTML file:
50
+ # '/path/to/some/directory'.should have_files_matching('*.html')
51
+ def have_files_matching pattern
52
+ FileNamePatternMatcher.new pattern
53
+ end
54
+ end
55
+
56
+ describe 'test coverage tool', :shared=>true do
57
+ include TestCoverageHelper
58
+
59
+ def toolname
60
+ @tool_module.name.split('::').last.downcase
61
+ end
62
+
63
+ def test_coverage_config
64
+ project('foo').send(toolname)
65
+ end
66
+
67
+ describe 'project-specific' do
68
+
69
+ before do
70
+ write 'src/main/java/Foo.java', 'public class Foo {}'
71
+ write_test :for=>'Foo', :in=>'src/test/java'
72
+ end
73
+
74
+ describe 'clean' do
75
+ before { define('foo') }
76
+
77
+ it 'should remove the instrumented directory' do
78
+ mkdir_p test_coverage_config.instrumented_dir.to_s
79
+ task('foo:clean').invoke
80
+ file(test_coverage_config.instrumented_dir).should_not exist
81
+ end
82
+
83
+ it 'should remove the reporting directory' do
84
+ mkdir_p test_coverage_config.report_dir
85
+ task('foo:clean').invoke
86
+ file(test_coverage_config.report_dir).should_not exist
87
+ end
88
+ end
89
+
90
+ describe 'instrumented directory' do
91
+ it 'should have a default value' do
92
+ define('foo')
93
+ test_coverage_config.instrumented_dir.should point_to_path('target/instrumented/classes')
94
+ end
95
+
96
+ it 'should be overridable' do
97
+ toolname = toolname()
98
+ define('foo') { send(toolname).instrumented_dir = path_to('target/coverage/classes') }
99
+ test_coverage_config.instrumented_dir.should point_to_path('target/coverage/classes')
100
+ end
101
+
102
+ it 'should be created during instrumentation' do
103
+ define('foo')
104
+ task("foo:#{toolname}:instrument").invoke
105
+ file(test_coverage_config.instrumented_dir).should exist
106
+ end
107
+ end
108
+
109
+ describe 'instrumentation' do
110
+ def instrumented_dir
111
+ file(test_coverage_config.instrumented_dir)
112
+ end
113
+
114
+ it 'should happen after compile' do
115
+ define('foo')
116
+ lambda { task("foo:#{toolname}:instrument").invoke }.should run_task('foo:compile')
117
+ end
118
+
119
+ it 'should put classes from compile.target in the instrumented directory' do
120
+ define('foo')
121
+ task("foo:#{toolname}:instrument").invoke
122
+ Dir.entries(instrumented_dir.to_s).should == Dir.entries(project('foo').compile.target.to_s)
123
+ end
124
+
125
+ it 'should touch instrumented directory if anything instrumented' do
126
+ a_long_time_ago = Time.now - 10
127
+ define('foo')
128
+ mkpath instrumented_dir.to_s
129
+ File.utime(a_long_time_ago, a_long_time_ago, instrumented_dir.to_s)
130
+ task("foo:#{toolname}:instrument").invoke
131
+ instrumented_dir.timestamp.should be_close(Time.now, 2)
132
+ end
133
+
134
+ it 'should not touch instrumented directory if nothing instrumented' do
135
+ a_long_time_ago = Time.now - 10
136
+ define('foo').compile.invoke
137
+ mkpath instrumented_dir.to_s
138
+ [project('foo').compile.target, instrumented_dir].map(&:to_s).each { |dir| File.utime(a_long_time_ago, a_long_time_ago, dir) }
139
+ task("foo:#{toolname}:instrument").invoke
140
+ instrumented_dir.timestamp.should be_close(a_long_time_ago, 2)
141
+ end
142
+ end
143
+
144
+ describe 'testing classpath' do
145
+ it 'should give priority to instrumented classes over non-instrumented ones' do
146
+ define('foo')
147
+ depends = project('foo').test.dependencies
148
+ depends.index(test_coverage_config.instrumented_dir).should < depends.index(project('foo').compile.target)
149
+ end
150
+
151
+ it 'should have the test coverage tools artifacts' do
152
+ define('foo')
153
+ @tool_module.requires.each { |artifact| project('foo').test.dependencies.should include(artifact) }
154
+ end
155
+ end
156
+
157
+ describe 'html report' do
158
+ it 'should have html files' do
159
+ define('foo')
160
+ task("foo:#{toolname}:html").invoke
161
+ test_coverage_config.report_to(:html).should have_files_matching('*.html')
162
+ end
163
+
164
+ it 'should contain full source code, including comments' do
165
+ write 'src/main/java/Foo.java',
166
+ 'public class Foo { /* This comment is a TOKEN to check that test coverage reports include the source code */ }'
167
+ define('foo')
168
+ task("foo:#{toolname}:html").invoke
169
+ htlm_report_contents = Dir[File.join(test_coverage_config.report_dir, '**/*.html')].map{|path|File.open(path).read}.join
170
+ htlm_report_contents.should =~ /TOKEN/
171
+ end
172
+ end
173
+ end
174
+
175
+ describe 'cross-project' do
176
+ describe 'reporting' do
177
+ before do
178
+ write 'src/main/java/Foo.java', 'public class Foo {}'
179
+ write 'bar/src/main/java/Bar.java', 'public class Bar {}'
180
+ write_test :for=>'Bar', :in=>'bar/src/test/java'
181
+ define('foo') { define('bar') }
182
+ end
183
+
184
+ it 'should have a default target' do
185
+ @tool_module.report_to.should point_to_path(File.join('reports', toolname))
186
+ end
187
+
188
+ describe 'in html' do
189
+ it 'should be a defined task' do
190
+ Rake::Task.task_defined?("#{toolname}:html").should be(true)
191
+ end
192
+
193
+ it 'should happen after project instrumentation and testing' do
194
+ lambda { task("#{toolname}:html").invoke }.should run_tasks(["foo:#{toolname}:instrument", 'foo:bar:test'])
195
+ end
196
+
197
+ it 'should have html files' do
198
+ task("#{toolname}:html").invoke
199
+ @tool_module.report_to(:html).should have_files_matching('*.html')
200
+ end
201
+
202
+ it 'should contain full source code, including comments' do
203
+ write 'bar/src/main/java/Bar.java',
204
+ 'public class Bar { /* This comment is a TOKEN to check that test coverage reports include the source code */ }'
205
+ task("#{toolname}:html").invoke
206
+ htlm_report_contents = Dir[File.join(@tool_module.report_to(:html), '**/*.html')].map{|path|File.open(path).read}.join
207
+ htlm_report_contents.should =~ /TOKEN/
208
+ end
209
+
210
+ it 'should handle gracefully a project with no source' do
211
+ define 'baz', :base_dir=>'baz'
212
+ task("#{toolname}:html").invoke
213
+ lambda { task("#{toolname}:html").invoke }.should_not raise_error
214
+ end
215
+ end
216
+ end
217
+
218
+ describe 'clean' do
219
+ it 'should remove the report directory' do
220
+ define('foo')
221
+ mkdir_p @tool_module.report_to
222
+ task("#{toolname}:clean").invoke
223
+ file(@tool_module.report_to).should_not exist
224
+ end
225
+
226
+ it 'should be called when calling global clean' do
227
+ define('foo')
228
+ lambda { task('clean').invoke }.should run_task("#{toolname}:clean")
229
+ end
230
+ end
231
+ end
232
+
233
+ describe 'project with no source' do
234
+ it 'should not define an html report task' do
235
+ define 'foo'
236
+ Rake::Task.task_defined?("foo:#{toolname}:html").should be(false)
237
+ end
238
+
239
+ it 'should not raise an error when instrumenting' do
240
+ define('foo')
241
+ lambda { task("foo:#{toolname}:instrument").invoke }.should_not raise_error
242
+ end
243
+
244
+ it 'should not add the instrumented directory to the testing classpath' do
245
+ define 'foo'
246
+ depends = project('foo').test.dependencies
247
+ depends.should_not include(test_coverage_config.instrumented_dir)
248
+ end
249
+
250
+ it 'should not add the test coverage tools artifacts to the testing classpath' do
251
+ define('foo')
252
+ @tool_module.requires.each { |artifact| project('foo').test.dependencies.should_not include(artifact) }
253
+ end
254
+ end
255
+ end
@@ -14,7 +14,7 @@
14
14
  # the License.
15
15
 
16
16
 
17
- require File.join(File.dirname(__FILE__), 'spec_helpers')
17
+ require File.join(File.dirname(__FILE__), '../spec_helpers')
18
18
 
19
19
 
20
20
  describe Buildr::Application do
@@ -29,6 +29,17 @@ describe Buildr::Application do
29
29
  end
30
30
  end
31
31
 
32
+ describe '#run' do
33
+ it 'should execute *_load methods in order' do
34
+ last = nil
35
+ order = [:find_buildfile, :load_gems, :load_artifacts, :load_tasks,
36
+ :load_requires, :load_buildfile, :load_imports, :top_level]
37
+ order.each { |method| Buildr.application.should_receive(method).ordered }
38
+ Buildr.application.stub!(:exit) # With this, shows the correct error instead of SystemExit.
39
+ Buildr.application.run
40
+ end
41
+ end
42
+
32
43
  describe 'environment' do
33
44
  it 'should return value of BUILDR_ENV' do
34
45
  ENV['BUILDR_ENV'] = 'qa'
@@ -44,13 +55,24 @@ describe Buildr::Application do
44
55
  Buildr::Application.new.environment.should eql('test')
45
56
  ENV['BUILDR_ENV'].should eql('test')
46
57
  end
47
-
58
+
59
+ it 'should be echoed to user' do
60
+ write 'buildfile'
61
+ lambda { Buildr.application.send :load_buildfile }.should show_info(%r{(in .*, development)})
62
+ end
63
+
48
64
  after do
49
65
  ENV['BUILDR_ENV'] = nil
50
66
  end
51
67
  end
52
68
 
53
69
  describe 'gems' do
70
+ before do
71
+ Buildr.application.private_methods(true).should include('load_gems')
72
+ class << Buildr.application
73
+ public :load_gems
74
+ end
75
+ end
54
76
 
55
77
  def load_with_yaml
56
78
  write 'build.yaml', <<-YAML
@@ -62,7 +84,7 @@ describe Buildr::Application do
62
84
  end
63
85
 
64
86
  it 'should return empty array if no gems specified' do
65
- Buildr.application.load_gems
87
+ Buildr.application.load_gems
66
88
  Buildr.application.gems.should be_empty
67
89
  end
68
90
 
@@ -90,10 +112,15 @@ describe Buildr::Application do
90
112
 
91
113
  describe 'load_gems' do
92
114
  before do
115
+ Buildr.application.private_methods(true).should include('load_gems')
116
+ class << Buildr.application
117
+ public :load_gems
118
+ end
93
119
  @spec = Gem::Specification.new do |spec|
94
120
  spec.name = 'foo'
95
121
  spec.version = '1.2'
96
122
  end
123
+ $stdout.stub!(:isatty).and_return(true)
97
124
  end
98
125
 
99
126
  it 'should do nothing if no gems specified' do
@@ -306,9 +333,59 @@ describe Buildr, 'settings' do
306
333
  YAML
307
334
  Buildr.settings.profile.should == { 'foo'=>'bar' }
308
335
  end
309
-
310
336
  end
311
337
 
338
+ describe 'buildfile task' do
339
+ before do
340
+ @buildfile_time = Time.now - 10
341
+ write 'buildfile'; File.utime(@buildfile_time, @buildfile_time, 'buildfile')
342
+ end
343
+
344
+ it 'should point to the buildfile' do
345
+ Buildr.application.buildfile.should point_to_path('buildfile')
346
+ end
347
+
348
+ it 'should be a defined task' do
349
+ Buildr.application.buildfile.should == file(File.expand_path('buildfile'))
350
+ end
351
+
352
+ it 'should ignore any rake namespace' do
353
+ namespace 'dummy_ns' do
354
+ Buildr.application.buildfile.should point_to_path('buildfile')
355
+ end
356
+ end
357
+
358
+ it 'should have the same timestamp as the buildfile' do
359
+ Buildr.application.buildfile.timestamp.should be_close(@buildfile_time, 1)
360
+ end
361
+
362
+ it 'should have the same timestamp as build.yaml if the latter is newer' do
363
+ write 'build.yaml'; File.utime(@buildfile_time + 5, @buildfile_time + 5, 'build.yaml')
364
+ Buildr.application.run
365
+ Buildr.application.buildfile.timestamp.should be_close(@buildfile_time + 5, 1)
366
+ end
367
+
368
+ it 'should have the same timestamp as the buildfile if build.yaml is older' do
369
+ write 'build.yaml'; File.utime(@buildfile_time - 5, @buildfile_time - 5, 'build.yaml')
370
+ Buildr.application.run
371
+ Buildr.application.buildfile.timestamp.should be_close(@buildfile_time, 1)
372
+ end
373
+
374
+ it 'should have the same timestamp as build.rb in home dir if the latter is newer' do
375
+ write 'home/buildr.rb'; File.utime(@buildfile_time + 5, @buildfile_time + 5, 'home/buildr.rb')
376
+ Buildr.application.send :load_tasks
377
+ Buildr.application.buildfile.timestamp.should be_close(@buildfile_time + 5, 1)
378
+ end
379
+
380
+ it 'should include explicitly required files as dependencies' do
381
+ write 'some/file.rb'; File.utime(@buildfile_time + 5, @buildfile_time + 5, 'some/file.rb')
382
+ Buildr.application.instance_variable_set(:@requires, ['rbconfig', 'some/file.rb'])
383
+ Buildr.application.send :load_buildfile
384
+ Buildr.application.buildfile.timestamp.should be_close(@buildfile_time + 5, 1)
385
+ Buildr.application.buildfile.prerequisites.should include(File.expand_path('some/file.rb'))
386
+ Buildr.application.buildfile.prerequisites.should_not include('rbconfig')
387
+ end
388
+ end
312
389
  end
313
390
 
314
391
 
@@ -332,3 +409,4 @@ describe Buildr do
332
409
  end
333
410
  end
334
411
  end
412
+