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.
Files changed (85) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +5 -0
  3. data/LICENSE +176 -0
  4. data/NOTICE +26 -0
  5. data/README.md +3 -0
  6. data/Rakefile +50 -0
  7. data/addon/buildr/checkstyle-report.xsl +104 -0
  8. data/addon/buildr/checkstyle.rb +254 -0
  9. data/addon/buildr/git_auto_version.rb +36 -0
  10. data/addon/buildr/gpg.rb +90 -0
  11. data/addon/buildr/gwt.rb +413 -0
  12. data/addon/buildr/jacoco.rb +161 -0
  13. data/addon/buildr/pmd.rb +185 -0
  14. data/addon/buildr/single_intermediate_layout.rb +71 -0
  15. data/addon/buildr/spotbugs.rb +265 -0
  16. data/addon/buildr/top_level_generate_dir.rb +37 -0
  17. data/addon/buildr/wsgen.rb +192 -0
  18. data/bin/buildr +20 -0
  19. data/buildr.gemspec +61 -0
  20. data/lib/buildr.rb +86 -0
  21. data/lib/buildr/core/application.rb +705 -0
  22. data/lib/buildr/core/assets.rb +96 -0
  23. data/lib/buildr/core/build.rb +587 -0
  24. data/lib/buildr/core/common.rb +167 -0
  25. data/lib/buildr/core/compile.rb +599 -0
  26. data/lib/buildr/core/console.rb +124 -0
  27. data/lib/buildr/core/doc.rb +275 -0
  28. data/lib/buildr/core/environment.rb +128 -0
  29. data/lib/buildr/core/filter.rb +405 -0
  30. data/lib/buildr/core/help.rb +114 -0
  31. data/lib/buildr/core/progressbar.rb +161 -0
  32. data/lib/buildr/core/project.rb +994 -0
  33. data/lib/buildr/core/test.rb +776 -0
  34. data/lib/buildr/core/transports.rb +456 -0
  35. data/lib/buildr/core/util.rb +77 -0
  36. data/lib/buildr/ide/idea.rb +1664 -0
  37. data/lib/buildr/java/commands.rb +230 -0
  38. data/lib/buildr/java/compiler.rb +85 -0
  39. data/lib/buildr/java/custom_pom.rb +300 -0
  40. data/lib/buildr/java/doc.rb +62 -0
  41. data/lib/buildr/java/packaging.rb +393 -0
  42. data/lib/buildr/java/pom.rb +191 -0
  43. data/lib/buildr/java/test_result.rb +54 -0
  44. data/lib/buildr/java/tests.rb +111 -0
  45. data/lib/buildr/packaging/archive.rb +586 -0
  46. data/lib/buildr/packaging/artifact.rb +1113 -0
  47. data/lib/buildr/packaging/artifact_namespace.rb +1010 -0
  48. data/lib/buildr/packaging/artifact_search.rb +138 -0
  49. data/lib/buildr/packaging/package.rb +237 -0
  50. data/lib/buildr/packaging/version_requirement.rb +189 -0
  51. data/lib/buildr/packaging/zip.rb +189 -0
  52. data/lib/buildr/packaging/ziptask.rb +387 -0
  53. data/lib/buildr/version.rb +18 -0
  54. data/rakelib/release.rake +99 -0
  55. data/spec/addon/checkstyle_spec.rb +58 -0
  56. data/spec/core/application_spec.rb +576 -0
  57. data/spec/core/build_spec.rb +922 -0
  58. data/spec/core/common_spec.rb +670 -0
  59. data/spec/core/compile_spec.rb +656 -0
  60. data/spec/core/console_spec.rb +65 -0
  61. data/spec/core/doc_spec.rb +194 -0
  62. data/spec/core/extension_spec.rb +200 -0
  63. data/spec/core/project_spec.rb +736 -0
  64. data/spec/core/test_spec.rb +1131 -0
  65. data/spec/core/transport_spec.rb +452 -0
  66. data/spec/core/util_spec.rb +154 -0
  67. data/spec/ide/idea_spec.rb +1952 -0
  68. data/spec/java/commands_spec.rb +79 -0
  69. data/spec/java/compiler_spec.rb +274 -0
  70. data/spec/java/custom_pom_spec.rb +165 -0
  71. data/spec/java/doc_spec.rb +55 -0
  72. data/spec/java/packaging_spec.rb +786 -0
  73. data/spec/java/pom_spec.rb +162 -0
  74. data/spec/java/test_coverage_helper.rb +257 -0
  75. data/spec/java/tests_spec.rb +224 -0
  76. data/spec/packaging/archive_spec.rb +686 -0
  77. data/spec/packaging/artifact_namespace_spec.rb +757 -0
  78. data/spec/packaging/artifact_spec.rb +1351 -0
  79. data/spec/packaging/packaging_helper.rb +63 -0
  80. data/spec/packaging/packaging_spec.rb +690 -0
  81. data/spec/sandbox.rb +166 -0
  82. data/spec/spec_helpers.rb +420 -0
  83. data/spec/version_requirement_spec.rb +145 -0
  84. data/spec/xpath_matchers.rb +123 -0
  85. metadata +295 -0
data/spec/sandbox.rb ADDED
@@ -0,0 +1,166 @@
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
+ # The local repository we use for testing is void of any artifacts, which will break given
18
+ # that the code requires several artifacts. So we establish them first using the real local
19
+ # repository and cache these across test cases.
20
+ Buildr.application.instance_eval { @rakefile = File.expand_path('buildfile') }
21
+ repositories.remote << 'https://repo1.maven.org/maven2'
22
+
23
+ require 'rspec/retry'
24
+ RSpec.configure do |config|
25
+ config.verbose_retry = true # show retry status in spec process
26
+ end
27
+
28
+ artifacts(TestNG.dependencies).each do |path|
29
+ file(path).invoke
30
+ end
31
+
32
+ ENV['HOME'] = File.expand_path(File.join(File.dirname(__FILE__), '..', '_target', 'home'))
33
+ mkpath ENV['HOME']
34
+
35
+ # We need to run all tests inside a _sandbox, tacking a snapshot of Buildr before the test,
36
+ # and restoring everything to its previous state after the test. Damn state changes.
37
+ module Sandbox
38
+
39
+ class << self
40
+ attr_reader :tasks, :rules
41
+
42
+ def included(spec)
43
+ spec.before(:each) { sandbox }
44
+ spec.after(:each) { reset }
45
+ end
46
+
47
+ # Require an optional extension without letting its callbacks pollute the Project class.
48
+ def require_optional_extension(extension_require_path)
49
+ project_callbacks_without_extension = Project.class_eval { @global_callbacks }.dup
50
+ begin
51
+ require extension_require_path
52
+ ensure
53
+ Project.class_eval { @global_callbacks = project_callbacks_without_extension }
54
+ end
55
+ end
56
+ end
57
+
58
+ @tasks = Buildr.application.tasks.collect do |original|
59
+ prerequisites = original.send(:prerequisites).map(&:to_s)
60
+ actions = original.instance_eval { @actions }.clone
61
+ lambda do
62
+ original.class.send(:define_task, original.name=>prerequisites).tap do |task|
63
+ task.comment = original.comment
64
+ actions.each { |action| task.enhance &action }
65
+ end
66
+ end
67
+ end
68
+ @rules = Buildr.application.instance_variable_get(:@rules)
69
+
70
+ def sandbox
71
+ @_sandbox = {}
72
+
73
+ # Create a temporary directory where we can create files, e.g,
74
+ # for projects, compilation. We need a place that does not depend
75
+ # on the current directory.
76
+ @_sandbox[:original_dir] = Dir.pwd
77
+ @temp = File.join(File.dirname(__FILE__), '../_target/tmp')
78
+ FileUtils.mkpath @temp
79
+ Dir.chdir @temp
80
+
81
+ ARGV.clear
82
+ Buildr.application = Buildr::Application.new
83
+ Sandbox.tasks.each { |block| block.call }
84
+ Buildr.application.instance_variable_set :@rules, Sandbox.rules.clone
85
+ Buildr.application.instance_eval { @rakefile = File.expand_path('buildfile') }
86
+
87
+ @_sandbox[:load_path] = $LOAD_PATH.clone
88
+
89
+ # clear RUBYOPT since bundler hooks into it
90
+ # e.g. RUBYOPT=-I/usr/lib/ruby/gems/1.8/gems/bundler-1.0.15/lib -rbundler/setup
91
+ # and so Buildr's own Gemfile configuration taints e.g., JRuby's environment
92
+ @_sandbox[:ruby_opt] = ENV["RUBYOPT"]
93
+ ENV["RUBYOPT"] = nil
94
+
95
+ #@_sandbox[:loaded_features] = $LOADED_FEATURES.clone
96
+
97
+ # Later on we'll want to lose all the on_define created during the test.
98
+ @_sandbox[:on_define] = Project.class_eval { (@on_define || []).dup }
99
+ @_sandbox[:extension_modules] = Project.class_eval { (@extension_modules || []).dup }
100
+ @_sandbox[:global_callbacks] = Project.class_eval { (@global_callbacks || []).dup }
101
+ @_sandbox[:layout] = Layout.default.clone
102
+
103
+ # Create a local repository we can play with. However, our local repository will be void
104
+ # of some essential artifacts (e.g. JUnit artifacts required by build task), so we create
105
+ # these first (see above) and keep them across test cases.
106
+ @_sandbox[:artifacts] = Artifact.class_eval { @artifacts }.clone
107
+ @_sandbox[:local_repository] = Buildr.repositories.local
108
+ ENV['HOME'] = File.expand_path('home')
109
+ ENV['BUILDR_ENV'] = 'development'
110
+
111
+ @_sandbox[:env_keys] = ENV.keys
112
+ %w[DEBUG TEST HTTP_PROXY HTTPS_PROXY USER].each { |k| ENV.delete(k) ; ENV.delete(k.downcase) }
113
+
114
+ # By default, remote repository is user's own local M2 repository
115
+ # since we don't want to remotely download artifacts into the sandbox over and over
116
+ Buildr.repositories.instance_eval do
117
+ @remote = ["file://" + @local]
118
+ @local = @release_to = @snapshot_to = nil
119
+ end
120
+ Buildr.options.proxy.http = nil
121
+
122
+ # Don't output crap to the console.
123
+ trace false
124
+ verbose false
125
+ end
126
+
127
+ # Call this from teardown.
128
+ def reset
129
+ # Get rid of all the projects and the on_define blocks we used.
130
+ Project.clear
131
+
132
+ on_define = @_sandbox[:on_define]
133
+ extension_modules = @_sandbox[:extension_modules]
134
+ global_callbacks = @_sandbox[:global_callbacks]
135
+
136
+ Project.class_eval do
137
+ @on_define = on_define
138
+ @global_callbacks = global_callbacks
139
+ @extension_modules = extension_modules
140
+ end
141
+
142
+ POM.class_eval do
143
+ @cache = nil
144
+ end
145
+
146
+ Layout.default = @_sandbox[:layout].clone
147
+
148
+ $LOAD_PATH.replace @_sandbox[:load_path]
149
+ ENV['RUBYOPT'] = @_sandbox[:ruby_opt]
150
+
151
+ FileUtils.rm_rf @temp
152
+ mkpath ENV['HOME']
153
+
154
+ # Get rid of all artifacts.
155
+ @_sandbox[:artifacts].tap { |artifacts| Artifact.class_eval { @artifacts = artifacts } }
156
+
157
+ Buildr.repositories.local = @_sandbox[:local_repository]
158
+
159
+ # Restore options.
160
+ Buildr.options.test = nil
161
+ (ENV.keys - @_sandbox[:env_keys]).each { |key| ENV.delete key }
162
+
163
+ Dir.chdir @_sandbox[:original_dir]
164
+ end
165
+
166
+ end
@@ -0,0 +1,420 @@
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
+ # This file gets loaded twice when running 'spec spec/*' and not with pleasant results,
18
+ # so ignore the second attempt to load it.
19
+ unless defined?(SpecHelpers)
20
+
21
+ require 'rubygems'
22
+
23
+ # For testing we use the gem requirements specified on the buildr.gemspec
24
+ spec = Gem::Specification.load(File.expand_path('../buildr.gemspec', File.dirname(__FILE__)))
25
+ # Dependency.version_requirements deprecated in rubygems 1.3.6
26
+ spec.dependencies.
27
+ select {|dep| dep.type == :runtime || (dep.type == :development && dep.name.to_s =~ /^rspec.*/) }.
28
+ each { |dep| gem dep.name, (dep.respond_to?(:requirement) ? dep.requirement.to_s : dep.version_requirements.to_s) }
29
+
30
+ # Make sure to load from these paths first, we don't want to load any
31
+ # code from Gem library.
32
+ $LOAD_PATH.unshift File.expand_path('../lib', File.dirname(__FILE__)),
33
+ File.expand_path('../addon', File.dirname(__FILE__))
34
+
35
+ # Buildr uses autoload extensively, but autoload when running specs creates
36
+ # a problem -- we sandbox $LOADED_FEATURES, so we end up autoloading the same
37
+ # module twice. This turns autoload into a require, which is not the right
38
+ # thing, but will do for now.
39
+ def autoload(symbol, path)
40
+ require path
41
+ end
42
+ require 'buildr'
43
+
44
+ # Give a chance for plugins to do a few things before requiring the sandbox.
45
+ include SandboxHook if defined?(SandboxHook)
46
+
47
+ require File.expand_path('sandbox', File.dirname(__FILE__))
48
+
49
+ module Matchers #:nodoc:
50
+
51
+ class << self
52
+
53
+ # Define matchers that operate by calling a method on the tested object.
54
+ # For example:
55
+ # foo.should contain(bar)
56
+ # calls:
57
+ # foo.contain(bar)
58
+ def match_using(*names)
59
+ names.each do |name|
60
+ matcher = Class.new do
61
+ # Initialize with expected arguments (i.e. contain(bar) initializes with bar).
62
+ define_method(:initialize) { |*args| @expects = args }
63
+ # Matches against actual value (i.e. foo.should exist called with foo).
64
+ define_method(:matches?) do |actual|
65
+ @actual = actual
66
+ return actual.send("#{name}?", *@expects) if actual.respond_to?(:"#{name}?", true)
67
+ return actual.send(name, *@expects) if actual.respond_to?(name.to_sym, true)
68
+ raise "You can't check #{actual.inspect}, it doesn't respond to #{name}."
69
+ end
70
+ # Some matchers have arguments, others don't, treat appropriately.
71
+ define_method :failure_message do
72
+ args = " " + @expects.map{ |arg| "'#{arg}'" }.join(", ") unless @expects.empty?
73
+ "Expected #{@actual} to #{name}#{args}"
74
+ end
75
+ define_method :negative_failure_message do
76
+ args = " " + @expects.map{ |arg| "'#{arg}'" }.join(", ") unless @expects.empty?
77
+ "Expected #{@actual} to not #{name}#{args}"
78
+ end
79
+ end
80
+ # Define method to create matcher.
81
+ define_method(name) { |*args| matcher.new(*args) }
82
+ end
83
+ end
84
+
85
+ end
86
+
87
+ # Define delegate matchers for exist and contain methods.
88
+ match_using :exist, :contain
89
+
90
+ end
91
+
92
+ class ::Rake::FileTask
93
+ def exist?
94
+ File.exist?(self.to_s)
95
+ end
96
+
97
+ def contain(content)
98
+ IO.read(self.to_s).include?(content)
99
+ # File.exist?(self.to_s)
100
+ end
101
+ end
102
+
103
+ module SpecHelpers
104
+
105
+ include Matchers
106
+
107
+ [:info, :warn, :error, :puts].each do |severity|
108
+ ::Object.class_eval do
109
+ define_method severity do |*args|
110
+ $messages ||= {}
111
+ $messages[severity] ||= []
112
+ $messages[severity].push(*args)
113
+ end
114
+ end
115
+ end
116
+
117
+ class << Buildr.application
118
+ alias :deprecated_without_capture :deprecated
119
+ def deprecated(message)
120
+ verbose(true) { deprecated_without_capture message }
121
+ end
122
+ end
123
+
124
+ class MessageWithSeverityMatcher
125
+ def initialize(severity, message)
126
+ @severity = severity
127
+ @expect = message
128
+ end
129
+
130
+ def matches?(target)
131
+ $messages = {@severity => []}
132
+ target.call
133
+ return Regexp === @expect ? $messages[@severity].join('\n') =~ @expect : $messages[@severity].include?(@expect.to_s)
134
+ end
135
+
136
+ def failure_message
137
+ "Expected #{@severity} #{@expect.inspect}, " +
138
+ ($messages[@severity].empty? ? "no #{@severity} issued" : "found #{$messages[@severity].inspect}")
139
+ end
140
+
141
+ def negative_failure_message
142
+ "Found unexpected #{$messages[@severity].inspect}"
143
+ end
144
+ end
145
+
146
+ # Test if an info message was shown. You can use a string or regular expression.
147
+ #
148
+ # For example:
149
+ # lambda { info 'ze test' }.should show_info(/ze test/)
150
+ def show_info(message)
151
+ MessageWithSeverityMatcher.new :info, message
152
+ end
153
+
154
+ # Test if a warning was shown. You can use a string or regular expression.
155
+ #
156
+ # For example:
157
+ # lambda { warn 'ze test' }.should show_warning(/ze test/)
158
+ def show_warning(message)
159
+ MessageWithSeverityMatcher.new :warn, message
160
+ end
161
+
162
+ # Test if an error message was shown. You can use a string or regular expression.
163
+ #
164
+ # For example:
165
+ # lambda { error 'ze test' }.should show_error(/ze test/)
166
+ def show_error(message)
167
+ MessageWithSeverityMatcher.new :error, message
168
+ end
169
+
170
+ # Test if any message was shown (puts). You can use a string or regular expression.
171
+ #
172
+ # For example:
173
+ # lambda { puts 'ze test' }.should show(/ze test/)
174
+ def show(message)
175
+ MessageWithSeverityMatcher.new :puts, message
176
+ end
177
+
178
+ # Yields a block that should try exiting the application.
179
+ # Accepts
180
+ #
181
+ # For example:
182
+ # test_exit(1) { puts "Hello" ; exit(1) }.should show("Hello")
183
+ #
184
+ def test_exit(status = nil)
185
+ return lambda {
186
+ begin
187
+ yield
188
+ raise "Exit was not called!"
189
+ rescue SystemExit => e
190
+ raise "Exit status incorrect! Expected: #{status}, got #{e.status}" if status && (e.status != status)
191
+ end
192
+ }
193
+ end
194
+
195
+ class ::Rake::Task
196
+ alias :execute_without_a_record :execute
197
+ def execute(args)
198
+ $executed ||= []
199
+ $executed << name
200
+ execute_without_a_record args
201
+ end
202
+ end
203
+
204
+ class InvokeMatcher
205
+ def initialize(*tasks)
206
+ @expecting = tasks.map { |task| [task].flatten.map(&:to_s) }
207
+ end
208
+
209
+ def matches?(target)
210
+ $executed = []
211
+ target.call
212
+ return false unless all_ran?
213
+ return !@but_not.any_ran? if @but_not
214
+ return true
215
+ end
216
+
217
+ def failure_message
218
+ return @but_not.negative_failure_message if all_ran? && @but_not
219
+ "Expected the tasks #{expected} to run, but #{remaining} did not run, or not in the order we expected them to." +
220
+ " Tasks that ran: #{$executed.inspect}"
221
+ end
222
+
223
+ def negative_failure_message
224
+ if all_ran?
225
+ "Expected the tasks #{expected} to not run, but they all ran."
226
+ else
227
+ "Expected the tasks #{expected} to not run, and all but #{remaining} ran."
228
+ end
229
+ end
230
+
231
+ def but_not(*tasks)
232
+ @but_not = InvokeMatcher.new(*tasks)
233
+ self
234
+ end
235
+
236
+ protected
237
+
238
+ def expected
239
+ @expecting.map { |tests| tests.join('=>') }.join(', ')
240
+ end
241
+
242
+ def remaining
243
+ @remaining.map { |tests| tests.join('=>') }.join(', ')
244
+ end
245
+
246
+ def all_ran?
247
+ @remaining ||= $executed.inject(@expecting) do |expecting, executed|
248
+ expecting.map { |tasks| tasks.first == executed ? tasks[1..-1] : tasks }.reject(&:empty?)
249
+ end
250
+ @remaining.empty?
251
+ end
252
+
253
+ def any_ran?
254
+ all_ran?
255
+ @remaining.size < @expecting.size
256
+ end
257
+
258
+ end
259
+
260
+ # Tests that all the tasks ran, in the order specified. Can also be used to test that some
261
+ # tasks and not others ran.
262
+ #
263
+ # Takes a list of arguments. Each argument can be a task name, matching only if that task ran.
264
+ # Each argument can be an array of task names, matching only if all these tasks ran in that order.
265
+ # So run_tasks('foo', 'bar') expects foo and bar to run in any order, but run_task(['foo', 'bar'])
266
+ # expects foo to run before bar.
267
+ #
268
+ # You can call but_not on the matchers to specify that certain tasks must not execute.
269
+ #
270
+ # For example:
271
+ # # Either task
272
+ # lambda { task('compile').invoke }.should run_tasks('compile', 'resources')
273
+ # # In that order
274
+ # lambda { task('build').invoke }.should run_tasks(['compile', 'test'])
275
+ # # With exclusion
276
+ # lambda { task('build').invoke }.should run_tasks('compile').but_not('install')
277
+ def run_tasks(*tasks)
278
+ InvokeMatcher.new *tasks
279
+ end
280
+
281
+ # Tests that a task ran. Similar to run_tasks, but accepts a single task name.
282
+ #
283
+ # For example:
284
+ # lambda { task('build').invoke }.should run_task('test')
285
+ def run_task(task)
286
+ InvokeMatcher.new [task]
287
+ end
288
+
289
+ class UriPathMatcher
290
+ def initialize(re)
291
+ @expression = re
292
+ end
293
+
294
+ def matches?(uri)
295
+ @uri = uri
296
+ uri.path =~ @expression
297
+ end
298
+
299
+ def description
300
+ "URI with path matching #{@expression} vs #{@uri}"
301
+ end
302
+
303
+ def failure_message_for_should
304
+ "expected #{description}"
305
+ end
306
+ end
307
+
308
+ # Matches a parsed URI's path against the given regular expression
309
+ def uri(re)
310
+ UriPathMatcher.new(re)
311
+ end
312
+
313
+
314
+ class AbsolutePathMatcher
315
+ def initialize(path)
316
+ @expected = File.expand_path(path.to_s)
317
+ end
318
+
319
+ def matches?(path)
320
+ @provided = File.expand_path(path.to_s)
321
+ @provided == @expected
322
+ end
323
+
324
+ def failure_message
325
+ "Expected path #{@expected}, but found path #{@provided}"
326
+ end
327
+
328
+ def negative_failure_message
329
+ "Expected a path other than #{@expected}"
330
+ end
331
+ end
332
+
333
+ def point_to_path(path)
334
+ AbsolutePathMatcher.new(path)
335
+ end
336
+
337
+
338
+ # Value covered by range. For example:
339
+ # (1..5).should cover(3)
340
+ RSpec::Matchers.define :cover do |actual|
341
+ match do |range|
342
+ actual >= range.min && actual <= range.max
343
+ end
344
+ end
345
+
346
+
347
+ def suppress_stdout
348
+ stdout = $stdout
349
+ #$stdout = StringIO.new
350
+ begin
351
+ yield
352
+ ensure
353
+ $stdout = stdout
354
+ end
355
+ end
356
+
357
+ def dryrun
358
+ Buildr.application.options.dryrun = true
359
+ begin
360
+ suppress_stdout { yield }
361
+ ensure
362
+ Buildr.application.options.dryrun = false
363
+ end
364
+ end
365
+
366
+ # We run tests with tracing off. Then things break. And we need to figure out what went wrong.
367
+ # So just use trace() as you would use verbose() to find and squash the bug.
368
+ def trace(value = nil)
369
+ old_value = Buildr.application.options.trace
370
+ Buildr.application.options.trace = value unless value.nil?
371
+ if block_given?
372
+ begin
373
+ yield
374
+ ensure
375
+ Buildr.application.options.trace = old_value
376
+ end
377
+ end
378
+ Buildr.application.options.trace
379
+ end
380
+
381
+ # Change the Buildr original directory, faking invocation from a different directory.
382
+ def in_original_dir(dir)
383
+ begin
384
+ original_dir = Buildr.application.original_dir
385
+ Buildr.application.instance_eval { @original_dir = File.expand_path(dir) }
386
+ yield
387
+ ensure
388
+ Buildr.application.instance_eval { @original_dir = original_dir }
389
+ end
390
+ end
391
+
392
+
393
+ # Buildr's define method creates a project definition but does not evaluate it
394
+ # (that happens once the buildfile is loaded), and we include Buildr's define in
395
+ # the test context so we can use it without prefixing with Buildr. This just patches
396
+ # define to evaluate the project definition before returning it.
397
+ def define(name, properties = nil, &block) #:yields:project
398
+ Project.define(name, properties, &block).tap { |project| project.invoke }
399
+ end
400
+
401
+ end
402
+
403
+
404
+ # Allow using matchers within the project definition.
405
+ class Buildr::Project
406
+ include ::RSpec::Matchers, SpecHelpers
407
+ end
408
+
409
+
410
+ ::RSpec.configure do |config|
411
+ config.treat_symbols_as_metadata_keys_with_true_values = true
412
+ # Make all Buildr methods accessible from test cases, and add various helper methods.
413
+ config.include Buildr
414
+ config.include SpecHelpers
415
+
416
+ # Sandbox Buildr for each test.
417
+ config.include Sandbox
418
+ end
419
+
420
+ end