buildr 1.3.3-java → 1.3.4-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.
- data/CHANGELOG +76 -0
- data/NOTICE +1 -1
- data/README.rdoc +9 -21
- data/Rakefile +17 -34
- data/_buildr +3 -12
- data/{doc/print.toc.yaml → _jbuildr} +14 -14
- data/addon/buildr/cobertura.rb +5 -219
- data/addon/buildr/drb.rb +281 -0
- data/addon/buildr/emma.rb +5 -221
- data/addon/buildr/nailgun.rb +93 -689
- data/bin/buildr +0 -9
- data/buildr.buildfile +4 -4
- data/buildr.gemspec +27 -21
- data/doc/_layouts/default.html +82 -0
- data/doc/_layouts/preface.html +22 -0
- data/doc/{pages/artifacts.textile → artifacts.textile} +82 -42
- data/doc/{pages/building.textile → building.textile} +89 -47
- data/doc/{pages/contributing.textile → contributing.textile} +53 -45
- data/doc/css/default.css +6 -5
- data/doc/css/print.css +17 -24
- data/doc/css/syntax.css +7 -36
- data/doc/download.textile +68 -0
- data/doc/{pages/extending.textile → extending.textile} +45 -24
- data/doc/{pages/getting_started.textile → getting_started.textile} +158 -88
- data/doc/images/asf-logo.gif +0 -0
- data/doc/images/note.png +0 -0
- data/doc/index.textile +47 -0
- data/doc/{pages/languages.textile → languages.textile} +108 -54
- data/doc/mailing_lists.textile +25 -0
- data/doc/{pages/more_stuff.textile → more_stuff.textile} +152 -73
- data/doc/{pages/packaging.textile → packaging.textile} +181 -96
- data/doc/preface.textile +28 -0
- data/doc/{pages/projects.textile → projects.textile} +55 -40
- data/doc/scripts/buildr-git.rb +364 -264
- data/doc/scripts/gitflow.rb +296 -0
- data/doc/scripts/install-jruby.sh +2 -2
- data/doc/scripts/install-linux.sh +6 -6
- data/doc/scripts/install-osx.sh +2 -2
- data/doc/{pages/settings_profiles.textile → settings_profiles.textile} +83 -45
- data/doc/{pages/testing.textile → testing.textile} +77 -41
- data/lib/buildr.rb +5 -5
- data/lib/buildr/core.rb +2 -0
- data/lib/buildr/core/application.rb +321 -151
- data/lib/buildr/core/build.rb +298 -167
- data/lib/buildr/core/checks.rb +4 -132
- data/lib/buildr/core/common.rb +1 -5
- data/lib/buildr/core/compile.rb +3 -9
- data/lib/buildr/core/environment.rb +12 -3
- data/lib/buildr/core/filter.rb +20 -18
- data/lib/buildr/core/generate.rb +36 -36
- data/lib/buildr/core/help.rb +2 -1
- data/lib/buildr/core/osx.rb +46 -0
- data/lib/buildr/core/progressbar.rb +1 -1
- data/lib/buildr/core/project.rb +7 -34
- data/lib/buildr/core/test.rb +12 -6
- data/lib/buildr/core/transports.rb +13 -11
- data/lib/buildr/core/util.rb +14 -23
- data/lib/buildr/groovy/bdd.rb +3 -2
- data/lib/buildr/groovy/compiler.rb +1 -1
- data/lib/buildr/ide/eclipse.rb +31 -21
- data/lib/buildr/ide/idea.rb +3 -2
- data/lib/buildr/ide/idea7x.rb +6 -4
- data/lib/buildr/java/ant.rb +3 -1
- data/lib/buildr/java/bdd.rb +9 -7
- data/lib/buildr/java/cobertura.rb +243 -0
- data/lib/buildr/java/compiler.rb +5 -4
- data/lib/buildr/java/emma.rb +244 -0
- data/lib/buildr/java/packaging.rb +11 -8
- data/lib/buildr/java/pom.rb +0 -4
- data/lib/buildr/java/rjb.rb +1 -1
- data/lib/buildr/java/test_result.rb +5 -7
- data/lib/buildr/java/tests.rb +17 -11
- data/lib/buildr/packaging.rb +5 -2
- data/lib/buildr/packaging/archive.rb +488 -0
- data/lib/buildr/packaging/artifact.rb +48 -29
- data/lib/buildr/packaging/artifact_namespace.rb +6 -6
- data/lib/buildr/packaging/gems.rb +4 -4
- data/lib/buildr/packaging/package.rb +3 -2
- data/lib/buildr/packaging/tar.rb +85 -3
- data/lib/buildr/packaging/version_requirement.rb +172 -0
- data/lib/buildr/packaging/zip.rb +24 -682
- data/lib/buildr/packaging/ziptask.rb +313 -0
- data/lib/buildr/scala.rb +5 -0
- data/lib/buildr/scala/bdd.rb +100 -0
- data/lib/buildr/scala/compiler.rb +45 -4
- data/lib/buildr/scala/tests.rb +12 -59
- data/rakelib/checks.rake +57 -0
- data/rakelib/doc.rake +58 -68
- data/rakelib/jekylltask.rb +110 -0
- data/rakelib/package.rake +35 -37
- data/rakelib/release.rake +119 -35
- data/rakelib/rspec.rake +29 -39
- data/rakelib/setup.rake +21 -59
- data/rakelib/stage.rake +184 -26
- data/spec/addon/drb_spec.rb +328 -0
- data/spec/core/application_spec.rb +32 -25
- data/spec/core/build_spec.rb +336 -126
- data/spec/core/checks_spec.rb +292 -310
- data/spec/core/common_spec.rb +8 -2
- data/spec/core/compile_spec.rb +17 -1
- data/spec/core/generate_spec.rb +3 -3
- data/spec/core/project_spec.rb +18 -10
- data/spec/core/test_spec.rb +8 -1
- data/spec/core/transport_spec.rb +40 -3
- data/spec/core/util_spec.rb +67 -0
- data/spec/ide/eclipse_spec.rb +96 -28
- data/spec/ide/idea7x_spec.rb +84 -0
- data/spec/java/ant.rb +5 -0
- data/spec/java/bdd_spec.rb +12 -3
- data/spec/{addon → java}/cobertura_spec.rb +6 -6
- data/spec/{addon → java}/emma_spec.rb +5 -6
- data/spec/java/java_spec.rb +12 -2
- data/spec/java/packaging_spec.rb +31 -2
- data/spec/{addon → java}/test_coverage_spec.rb +3 -3
- data/spec/java/tests_spec.rb +5 -0
- data/spec/packaging/archive_spec.rb +11 -1
- data/spec/{core → packaging}/artifact_namespace_spec.rb +10 -2
- data/spec/packaging/artifact_spec.rb +44 -3
- data/spec/packaging/packaging_spec.rb +1 -1
- data/spec/sandbox.rb +17 -14
- data/spec/scala/bdd_spec.rb +150 -0
- data/spec/scala/compiler_spec.rb +27 -0
- data/spec/scala/scala.rb +38 -0
- data/spec/scala/tests_spec.rb +78 -33
- data/spec/spec_helpers.rb +29 -5
- data/spec/version_requirement_spec.rb +6 -0
- metadata +176 -172
- data/DISCLAIMER +0 -7
- data/doc/images/apache-incubator-logo.png +0 -0
- data/doc/pages/download.textile +0 -51
- data/doc/pages/index.textile +0 -42
- data/doc/pages/mailing_lists.textile +0 -17
- data/doc/pages/recipes.textile +0 -103
- data/doc/pages/troubleshooting.textile +0 -103
- data/doc/pages/whats_new.textile +0 -323
- data/doc/print.haml +0 -51
- data/doc/site.haml +0 -56
- data/doc/site.toc.yaml +0 -47
- data/etc/git-svn-authors +0 -16
- data/lib/buildr/core/application_cli.rb +0 -139
- data/rakelib/apache.rake +0 -191
- data/rakelib/changelog.rake +0 -57
- data/rakelib/rubyforge.rake +0 -53
- data/rakelib/scm.rake +0 -49
|
@@ -0,0 +1,313 @@
|
|
|
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 'buildr/packaging/archive'
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
module Buildr
|
|
21
|
+
|
|
22
|
+
# The ZipTask creates a new Zip file. You can include any number of files and and directories,
|
|
23
|
+
# use exclusion patterns, and include files into specific directories.
|
|
24
|
+
#
|
|
25
|
+
# For example:
|
|
26
|
+
# zip('test.zip').tap do |task|
|
|
27
|
+
# task.include 'srcs'
|
|
28
|
+
# task.include 'README', 'LICENSE'
|
|
29
|
+
# end
|
|
30
|
+
#
|
|
31
|
+
# See Buildr#zip and ArchiveTask.
|
|
32
|
+
class ZipTask < ArchiveTask
|
|
33
|
+
|
|
34
|
+
# Compression leve for this Zip.
|
|
35
|
+
attr_accessor :compression_level
|
|
36
|
+
|
|
37
|
+
def initialize(*args) #:nodoc:
|
|
38
|
+
self.compression_level = Zlib::DEFAULT_COMPRESSION
|
|
39
|
+
super
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# :call-seq:
|
|
43
|
+
# entry(name) => Entry
|
|
44
|
+
#
|
|
45
|
+
# Returns a ZIP file entry. You can use this to check if the entry exists and its contents,
|
|
46
|
+
# for example:
|
|
47
|
+
# package(:jar).entry("META-INF/LICENSE").should contain(/Apache Software License/)
|
|
48
|
+
def entry(entry_name)
|
|
49
|
+
::Zip::ZipEntry.new(name, entry_name)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def entries #:nodoc:
|
|
53
|
+
@entries ||= Zip::ZipFile.open(name) { |zip| zip.entries }
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
private
|
|
57
|
+
|
|
58
|
+
def create_from(file_map)
|
|
59
|
+
Zip::ZipOutputStream.open name do |zip|
|
|
60
|
+
seen = {}
|
|
61
|
+
mkpath = lambda do |dir|
|
|
62
|
+
unless dir == '.' || seen[dir]
|
|
63
|
+
mkpath.call File.dirname(dir)
|
|
64
|
+
zip.put_next_entry(dir + '/', compression_level)
|
|
65
|
+
seen[dir] = true
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
file_map.each do |path, content|
|
|
70
|
+
mkpath.call File.dirname(path)
|
|
71
|
+
if content.respond_to?(:call)
|
|
72
|
+
zip.put_next_entry(path, compression_level)
|
|
73
|
+
content.call zip
|
|
74
|
+
elsif content.nil? || File.directory?(content.to_s)
|
|
75
|
+
mkpath.call path
|
|
76
|
+
else
|
|
77
|
+
zip.put_next_entry(path, compression_level)
|
|
78
|
+
File.open content.to_s, 'rb' do |is|
|
|
79
|
+
while data = is.read(4096)
|
|
80
|
+
zip << data
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
# :call-seq:
|
|
92
|
+
# zip(file) => ZipTask
|
|
93
|
+
#
|
|
94
|
+
# The ZipTask creates a new Zip file. You can include any number of files and
|
|
95
|
+
# and directories, use exclusion patterns, and include files into specific
|
|
96
|
+
# directories.
|
|
97
|
+
#
|
|
98
|
+
# For example:
|
|
99
|
+
# zip('test.zip').tap do |task|
|
|
100
|
+
# task.include 'srcs'
|
|
101
|
+
# task.include 'README', 'LICENSE'
|
|
102
|
+
# end
|
|
103
|
+
def zip(file)
|
|
104
|
+
ZipTask.define_task(file)
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
# An object for unzipping a file into a target directory. You can tell it to include
|
|
109
|
+
# or exclude only specific files and directories, and also to map files from particular
|
|
110
|
+
# paths inside the zip file into the target directory. Once ready, call #extract.
|
|
111
|
+
#
|
|
112
|
+
# Usually it is more convenient to create a file task for extracting the zip file
|
|
113
|
+
# (see #unzip) and pass this object as a prerequisite to other tasks.
|
|
114
|
+
#
|
|
115
|
+
# See Buildr#unzip.
|
|
116
|
+
class Unzip
|
|
117
|
+
|
|
118
|
+
# The zip file to extract.
|
|
119
|
+
attr_accessor :zip_file
|
|
120
|
+
# The target directory to extract to.
|
|
121
|
+
attr_accessor :target
|
|
122
|
+
|
|
123
|
+
# Initialize with hash argument of the form target=>zip_file.
|
|
124
|
+
def initialize(args)
|
|
125
|
+
@target, arg_names, @zip_file = Buildr.application.resolve_args([args])
|
|
126
|
+
@paths = {}
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
# :call-seq:
|
|
130
|
+
# extract
|
|
131
|
+
#
|
|
132
|
+
# Extract the zip file into the target directory.
|
|
133
|
+
#
|
|
134
|
+
# You can call this method directly. However, if you are using the #unzip method,
|
|
135
|
+
# it creates a file task for the target directory: use that task instead as a
|
|
136
|
+
# prerequisite. For example:
|
|
137
|
+
# build unzip(dir=>zip_file)
|
|
138
|
+
# Or:
|
|
139
|
+
# unzip(dir=>zip_file).target.invoke
|
|
140
|
+
def extract
|
|
141
|
+
# If no paths specified, then no include/exclude patterns
|
|
142
|
+
# specified. Nothing will happen unless we include all files.
|
|
143
|
+
if @paths.empty?
|
|
144
|
+
@paths[nil] = FromPath.new(self, nil)
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
# Otherwise, empty unzip creates target as a file when touching.
|
|
148
|
+
mkpath target.to_s
|
|
149
|
+
Zip::ZipFile.open(zip_file.to_s) do |zip|
|
|
150
|
+
entries = zip.collect
|
|
151
|
+
@paths.each do |path, patterns|
|
|
152
|
+
patterns.map(entries).each do |dest, entry|
|
|
153
|
+
next if entry.directory?
|
|
154
|
+
dest = File.expand_path(dest, target.to_s)
|
|
155
|
+
trace "Extracting #{dest}"
|
|
156
|
+
mkpath File.dirname(dest) rescue nil
|
|
157
|
+
entry.extract(dest) { true }
|
|
158
|
+
end
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
# Let other tasks know we updated the target directory.
|
|
162
|
+
touch target.to_s
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
# :call-seq:
|
|
166
|
+
# include(*files) => self
|
|
167
|
+
# include(*files, :path=>name) => self
|
|
168
|
+
#
|
|
169
|
+
# Include all files that match the patterns and returns self.
|
|
170
|
+
#
|
|
171
|
+
# Use include if you only want to unzip some of the files, by specifying
|
|
172
|
+
# them instead of using exclusion. You can use #include in combination
|
|
173
|
+
# with #exclude.
|
|
174
|
+
def include(*files)
|
|
175
|
+
if Hash === files.last
|
|
176
|
+
from_path(files.pop[:path]).include *files
|
|
177
|
+
else
|
|
178
|
+
from_path(nil).include *files
|
|
179
|
+
end
|
|
180
|
+
self
|
|
181
|
+
end
|
|
182
|
+
alias :add :include
|
|
183
|
+
|
|
184
|
+
# :call-seq:
|
|
185
|
+
# exclude(*files) => self
|
|
186
|
+
#
|
|
187
|
+
# Exclude all files that match the patterns and return self.
|
|
188
|
+
#
|
|
189
|
+
# Use exclude to unzip all files except those that match the pattern.
|
|
190
|
+
# You can use #exclude in combination with #include.
|
|
191
|
+
def exclude(*files)
|
|
192
|
+
if Hash === files.last
|
|
193
|
+
from_path(files.pop[:path]).exclude *files
|
|
194
|
+
else
|
|
195
|
+
from_path(nil).exclude *files
|
|
196
|
+
end
|
|
197
|
+
self
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
# :call-seq:
|
|
201
|
+
# from_path(name) => Path
|
|
202
|
+
#
|
|
203
|
+
# Allows you to unzip from a path. Returns an object you can use to
|
|
204
|
+
# specify which files to include/exclude relative to that path.
|
|
205
|
+
# Expands the file relative to that path.
|
|
206
|
+
#
|
|
207
|
+
# For example:
|
|
208
|
+
# unzip(Dir.pwd=>'test.jar').from_path('etc').include('LICENSE')
|
|
209
|
+
# will unzip etc/LICENSE into ./LICENSE.
|
|
210
|
+
#
|
|
211
|
+
# This is different from:
|
|
212
|
+
# unzip(Dir.pwd=>'test.jar').include('etc/LICENSE')
|
|
213
|
+
# which unzips etc/LICENSE into ./etc/LICENSE.
|
|
214
|
+
def from_path(name)
|
|
215
|
+
@paths[name] ||= FromPath.new(self, name)
|
|
216
|
+
end
|
|
217
|
+
alias :path :from_path
|
|
218
|
+
|
|
219
|
+
# :call-seq:
|
|
220
|
+
# root => Unzip
|
|
221
|
+
#
|
|
222
|
+
# Returns the root path, essentially the Unzip object itself. In case you are wondering
|
|
223
|
+
# down paths and want to go back.
|
|
224
|
+
def root
|
|
225
|
+
self
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
# Returns the path to the target directory.
|
|
229
|
+
def to_s
|
|
230
|
+
target.to_s
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
class FromPath #:nodoc:
|
|
234
|
+
|
|
235
|
+
def initialize(unzip, path)
|
|
236
|
+
@unzip = unzip
|
|
237
|
+
if path
|
|
238
|
+
@path = path[-1] == ?/ ? path : path + '/'
|
|
239
|
+
else
|
|
240
|
+
@path = ''
|
|
241
|
+
end
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
# See UnzipTask#include
|
|
245
|
+
def include(*files) #:doc:
|
|
246
|
+
@include ||= []
|
|
247
|
+
@include |= files
|
|
248
|
+
self
|
|
249
|
+
end
|
|
250
|
+
|
|
251
|
+
# See UnzipTask#exclude
|
|
252
|
+
def exclude(*files) #:doc:
|
|
253
|
+
@exclude ||= []
|
|
254
|
+
@exclude |= files
|
|
255
|
+
self
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
def map(entries)
|
|
259
|
+
includes = @include || ['*']
|
|
260
|
+
excludes = @exclude || []
|
|
261
|
+
entries.inject({}) do |map, entry|
|
|
262
|
+
if entry.name =~ /^#{@path}/
|
|
263
|
+
short = entry.name.sub(@path, '')
|
|
264
|
+
if includes.any? { |pat| File.fnmatch(pat, short) } &&
|
|
265
|
+
!excludes.any? { |pat| File.fnmatch(pat, short) }
|
|
266
|
+
map[short] = entry
|
|
267
|
+
end
|
|
268
|
+
end
|
|
269
|
+
map
|
|
270
|
+
end
|
|
271
|
+
end
|
|
272
|
+
|
|
273
|
+
# Documented in Unzip.
|
|
274
|
+
def root
|
|
275
|
+
@unzip
|
|
276
|
+
end
|
|
277
|
+
|
|
278
|
+
# The target directory to extract to.
|
|
279
|
+
def target
|
|
280
|
+
@unzip.target
|
|
281
|
+
end
|
|
282
|
+
|
|
283
|
+
end
|
|
284
|
+
|
|
285
|
+
end
|
|
286
|
+
|
|
287
|
+
# :call-seq:
|
|
288
|
+
# unzip(to_dir=>zip_file) => Zip
|
|
289
|
+
#
|
|
290
|
+
# Creates a task that will unzip a file into the target directory. The task name
|
|
291
|
+
# is the target directory, the prerequisite is the file to unzip.
|
|
292
|
+
#
|
|
293
|
+
# This method creates a file task to expand the zip file. It returns an Unzip object
|
|
294
|
+
# that specifies how the file will be extracted. You can include or exclude specific
|
|
295
|
+
# files from within the zip, and map to different paths.
|
|
296
|
+
#
|
|
297
|
+
# The Unzip object's to_s method return the path to the target directory, so you can
|
|
298
|
+
# use it as a prerequisite. By keeping the Unzip object separate from the file task,
|
|
299
|
+
# you overlay additional work on top of the file task.
|
|
300
|
+
#
|
|
301
|
+
# For example:
|
|
302
|
+
# unzip('all'=>'test.zip')
|
|
303
|
+
# unzip('src'=>'test.zip').include('README', 'LICENSE')
|
|
304
|
+
# unzip('libs'=>'test.zip').from_path('libs')
|
|
305
|
+
def unzip(args)
|
|
306
|
+
target, arg_names, zip_file = Buildr.application.resolve_args([args])
|
|
307
|
+
task = file(File.expand_path(target.to_s)=>zip_file)
|
|
308
|
+
Unzip.new(task=>zip_file).tap do |setup|
|
|
309
|
+
task.enhance { setup.extract }
|
|
310
|
+
end
|
|
311
|
+
end
|
|
312
|
+
|
|
313
|
+
end
|
data/lib/buildr/scala.rb
CHANGED
|
@@ -14,6 +14,11 @@
|
|
|
14
14
|
# the License.
|
|
15
15
|
|
|
16
16
|
|
|
17
|
+
ENV['SCALA_HOME'] ||= '/opt/local/share/scala/' if File.exist?('/opt/local/share/scala/lib/scala-compiler.jar')
|
|
18
|
+
Buildr.repositories.remote << 'http://scala-tools.org/repo-releases'
|
|
19
|
+
|
|
17
20
|
require 'buildr/scala/compiler'
|
|
18
21
|
require 'buildr/scala/tests'
|
|
22
|
+
require 'buildr/scala/bdd'
|
|
23
|
+
|
|
19
24
|
Object::Scala = Buildr::Scala
|
|
@@ -0,0 +1,100 @@
|
|
|
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 'buildr/core/build'
|
|
18
|
+
require 'buildr/core/compile'
|
|
19
|
+
require 'buildr/java/bdd'
|
|
20
|
+
require 'buildr/scala/tests'
|
|
21
|
+
|
|
22
|
+
module Buildr::Scala
|
|
23
|
+
|
|
24
|
+
# Specs is a Scala based BDD framework.
|
|
25
|
+
# To use in your project:
|
|
26
|
+
#
|
|
27
|
+
# test.using :specs
|
|
28
|
+
#
|
|
29
|
+
# This framework will search in your project for:
|
|
30
|
+
# src/spec/scala/**/*.scala
|
|
31
|
+
class Specs < Buildr::TestFramework::JavaBDD
|
|
32
|
+
@lang = :scala
|
|
33
|
+
@bdd_dir = :spec
|
|
34
|
+
|
|
35
|
+
VERSION = '1.4.3'
|
|
36
|
+
|
|
37
|
+
class << self
|
|
38
|
+
def version
|
|
39
|
+
Buildr.settings.build['scala.specs'] || VERSION
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def dependencies
|
|
43
|
+
["org.specs:specs:jar:#{version}"] + Check.dependencies +
|
|
44
|
+
JMock.dependencies + JUnit.dependencies
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def applies_to?(project) #:nodoc:
|
|
48
|
+
!Dir[project.path_to(:source, bdd_dir, lang, '**/*.scala')].empty?
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
private
|
|
52
|
+
def const_missing(const)
|
|
53
|
+
return super unless const == :REQUIRES # TODO: remove in 1.5
|
|
54
|
+
Buildr.application.deprecated "Please use Scala::Specs.dependencies/.version instead of ScalaSpecs::REQUIRES/VERSION"
|
|
55
|
+
dependencies
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def initialize(task, options) #:nodoc:
|
|
60
|
+
super
|
|
61
|
+
|
|
62
|
+
specs = task.project.path_to(:source, :spec, :scala)
|
|
63
|
+
task.compile.from specs if File.directory?(specs)
|
|
64
|
+
|
|
65
|
+
resources = task.project.path_to(:source, :spec, :resources)
|
|
66
|
+
task.resources.from resources if File.directory?(resources)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def tests(dependencies)
|
|
70
|
+
dependencies += [task.compile.target.to_s]
|
|
71
|
+
filter_classes(dependencies, :interfaces => ['org.specs.Specification'])
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def run(specs, dependencies) #:nodoc:
|
|
75
|
+
dependencies += [task.compile.target.to_s] + Scalac.dependencies
|
|
76
|
+
|
|
77
|
+
cmd_options = { :properties => options[:properties],
|
|
78
|
+
:java_args => options[:java_args],
|
|
79
|
+
:classpath => dependencies}
|
|
80
|
+
|
|
81
|
+
specs.inject [] do |passed, spec|
|
|
82
|
+
begin
|
|
83
|
+
Java.load
|
|
84
|
+
Java::Commands.java(spec, cmd_options)
|
|
85
|
+
rescue => e
|
|
86
|
+
passed
|
|
87
|
+
else
|
|
88
|
+
passed << spec
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# Backwards compatibility stuff. Remove in 1.5.
|
|
96
|
+
module Buildr
|
|
97
|
+
ScalaSpecs = Scala::Specs
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
Buildr::TestFramework << Buildr::Scala::Specs
|
|
@@ -18,9 +18,22 @@ require 'buildr/core/common'
|
|
|
18
18
|
require 'buildr/core/compile'
|
|
19
19
|
require 'buildr/packaging'
|
|
20
20
|
|
|
21
|
-
|
|
22
21
|
module Buildr::Scala
|
|
22
|
+
|
|
23
|
+
class << self
|
|
24
|
+
def version_str
|
|
25
|
+
# Scala version string normally looks like "version 2.7.3.final"
|
|
26
|
+
Java.scala.util.Properties.versionString.sub 'version ', ''
|
|
27
|
+
end
|
|
23
28
|
|
|
29
|
+
def version
|
|
30
|
+
# any consecutive sequence of numbers followed by dots
|
|
31
|
+
match = version_str.match(/\d+\.\d[\d\.]*/) or
|
|
32
|
+
fail "Unable to parse Scala version: #{version_str} "
|
|
33
|
+
match[0].sub(/.$/, "") # remove trailing dot, if any
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
24
37
|
# Scalac compiler:
|
|
25
38
|
# compile.using(:scalac)
|
|
26
39
|
# Used by default if .scala files are found in the src/main/scala directory (or src/test/scala)
|
|
@@ -46,12 +59,24 @@ module Buildr::Scala
|
|
|
46
59
|
def use_fsc
|
|
47
60
|
ENV["USE_FSC"] =~ /^(yes|on|true)$/i
|
|
48
61
|
end
|
|
62
|
+
|
|
63
|
+
def applies_to?(project, task) #:nodoc:
|
|
64
|
+
paths = task.sources + [sources].flatten.map { |src| Array(project.path_to(:source, task.usage, src.to_sym)) }
|
|
65
|
+
paths.flatten!
|
|
66
|
+
|
|
67
|
+
# Just select if we find .scala files
|
|
68
|
+
paths.any? { |path| !Dir["#{path}/**/*.scala"].empty? }
|
|
69
|
+
end
|
|
49
70
|
end
|
|
71
|
+
|
|
72
|
+
Javac = Buildr::Compiler::Javac
|
|
50
73
|
|
|
51
|
-
OPTIONS = [:warnings, :deprecation, :optimise, :target, :debug, :other]
|
|
74
|
+
OPTIONS = [:warnings, :deprecation, :optimise, :target, :debug, :other, :javac]
|
|
75
|
+
|
|
52
76
|
Java.classpath << dependencies
|
|
53
77
|
|
|
54
|
-
specify :language=>:scala, :
|
|
78
|
+
specify :language=>:scala, :sources => [:scala, :java], :source_ext => [:scala, :java],
|
|
79
|
+
:target=>'classes', :target_ext=>'class', :packaging=>:jar
|
|
55
80
|
|
|
56
81
|
def initialize(project, options) #:nodoc:
|
|
57
82
|
super
|
|
@@ -59,6 +84,9 @@ module Buildr::Scala
|
|
|
59
84
|
options[:warnings] = verbose if options[:warnings].nil?
|
|
60
85
|
options[:deprecation] ||= false
|
|
61
86
|
options[:optimise] ||= false
|
|
87
|
+
options[:javac] ||= {}
|
|
88
|
+
|
|
89
|
+
@java = Javac.new(project, options[:javac])
|
|
62
90
|
end
|
|
63
91
|
|
|
64
92
|
def compile(sources, target, dependencies) #:nodoc:
|
|
@@ -83,10 +111,23 @@ module Buildr::Scala
|
|
|
83
111
|
Java.scala.tools.nsc.Main.process(cmd_args.to_java(Java.java.lang.String))
|
|
84
112
|
fail 'Failed to compile, see errors above' if Java.scala.tools.nsc.Main.reporter.hasErrors
|
|
85
113
|
end
|
|
114
|
+
|
|
115
|
+
if java_applies? sources
|
|
116
|
+
trace 'Compiling mixed Java/Scala sources'
|
|
117
|
+
|
|
118
|
+
deps = dependencies + [ File.expand_path('lib/scala-library.jar', Scalac.scala_home),
|
|
119
|
+
File.expand_path(target) ]
|
|
120
|
+
@java.compile(sources, target, deps)
|
|
121
|
+
end
|
|
86
122
|
end
|
|
87
123
|
end
|
|
88
124
|
|
|
89
125
|
private
|
|
126
|
+
|
|
127
|
+
def java_applies?(sources)
|
|
128
|
+
not sources.flatten.map { |source| File.directory?(source) ? FileList["#{source}/**/*.java"] : source }.
|
|
129
|
+
flatten.reject { |file| File.directory?(file) }.map { |file| File.expand_path(file) }.uniq.empty?
|
|
130
|
+
end
|
|
90
131
|
|
|
91
132
|
# Returns Scalac command line arguments from the set of options.
|
|
92
133
|
def scalac_args #:nodoc:
|
|
@@ -106,4 +147,4 @@ end
|
|
|
106
147
|
|
|
107
148
|
# Scala compiler comes first, ahead of Javac, this allows it to pick
|
|
108
149
|
# projects that mix Scala and Java code by spotting Scala code first.
|
|
109
|
-
Buildr::Compiler.compilers.unshift Buildr::Scala::Scalac
|
|
150
|
+
Buildr::Compiler.compilers.unshift Buildr::Scala::Scalac
|