ivy4r 0.6.0 → 0.7.0
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/History.txt +16 -0
- data/Rakefile +2 -0
- data/lib/buildr/ivy_extension.rb +141 -73
- data/lib/ivy4r.rb +1 -1
- metadata +2 -2
data/History.txt
CHANGED
@@ -1,3 +1,19 @@
|
|
1
|
+
=== 0.7.0 / 2009-07-20
|
2
|
+
|
3
|
+
* It is possible to register +post_resolve+ actions via blocks:
|
4
|
+
ivy.post_resolve {...}
|
5
|
+
* support for generic configuration syntax via +method_missing+:
|
6
|
+
Any method combination of TARGETS [:compile, :test, :package] and TYPES [:conf, :include, :exclude] is valid.
|
7
|
+
It is possible to set all confs at once:
|
8
|
+
+ivy.conf :compile => 'conf', :package => 'other', :test => ['still', 'other']
|
9
|
+
Or to set the complete package options:
|
10
|
+
+ivy.package :conf => 'prod', :include => /includepattern/, :exclude => /excludepattern/+
|
11
|
+
Or to set a specific value via a complete call like:
|
12
|
+
+ivy.compile_conf [...] or ivy.conf_test [...] or ivy.package.include [...]
|
13
|
+
* more include/exclude possibilities, support to include and exclude for compile and test targets using
|
14
|
+
+ivy.include :compile => [pattern list]+ or +ivy.exclude+
|
15
|
+
* small refactorings
|
16
|
+
|
1
17
|
=== 0.6.0 / 2009-07-08
|
2
18
|
|
3
19
|
* added support for the +ide+ targets +eclipse+, +idea+ and +idea7x+
|
data/Rakefile
CHANGED
@@ -12,6 +12,8 @@ hoe = Hoe.spec 'ivy4r' do |p|
|
|
12
12
|
p.extra_deps << ['Antwrap', '>=0.7.0']
|
13
13
|
p.extra_deps << ['ivy4r-jars', '>=1.0.0']
|
14
14
|
p.extra_deps << ['facets', '>=2.5.2']
|
15
|
+
#p.extra_deps << ['thoughtbot-shoulda', '>=2.5.2']
|
16
|
+
#p.extra_deps << ['rr', '>=0.10.0']
|
15
17
|
File.open(File.join(File.dirname(__FILE__), 'VERSION'), 'w') do |file|
|
16
18
|
file.puts Ivy4r::VERSION
|
17
19
|
end
|
data/lib/buildr/ivy_extension.rb
CHANGED
@@ -4,7 +4,7 @@ module Buildr
|
|
4
4
|
module Ivy
|
5
5
|
|
6
6
|
# TODO extend extension to download ivy stuff with dependencies automatically
|
7
|
-
# VERSION = '2.1.0-rc1'
|
7
|
+
# VERSION = '2.1.0-rc1'
|
8
8
|
|
9
9
|
class << self
|
10
10
|
|
@@ -14,33 +14,41 @@ module Buildr
|
|
14
14
|
setting
|
15
15
|
end
|
16
16
|
|
17
|
-
# def version
|
18
|
-
# setting['version'] || VERSION
|
19
|
-
# end
|
20
|
-
# def dependencies
|
21
|
-
# @dependencies ||= [
|
22
|
-
# "org.apache.ivy:ivy:jar:#{version}",
|
23
|
-
# 'com.jcraft:jsch:jar:1.41',
|
24
|
-
# 'oro:oro:jar:2.08'
|
25
|
-
# ]
|
26
|
-
# end
|
17
|
+
# def version
|
18
|
+
# setting['version'] || VERSION
|
19
|
+
# end
|
20
|
+
# def dependencies
|
21
|
+
# @dependencies ||= [
|
22
|
+
# "org.apache.ivy:ivy:jar:#{version}",
|
23
|
+
# 'com.jcraft:jsch:jar:1.41',
|
24
|
+
# 'oro:oro:jar:2.08'
|
25
|
+
# ]
|
26
|
+
# end
|
27
27
|
end
|
28
28
|
|
29
29
|
class IvyConfig
|
30
|
+
TARGETS = [:compile, :test, :package]
|
31
|
+
TYPES = [:conf, :include, :exclude]
|
30
32
|
|
31
33
|
attr_accessor :extension_dir, :resolved
|
32
34
|
|
35
|
+
attr_reader :post_resolve_task_list
|
36
|
+
|
33
37
|
# Store the current project and initialize ivy ant wrapper
|
34
38
|
def initialize(project)
|
35
39
|
@project = project
|
36
40
|
if project.parent.nil?
|
37
41
|
@extension_dir = @project.base_dir
|
42
|
+
@post_resolve_task_list = []
|
38
43
|
else
|
39
44
|
@extension_dir = @project.parent.ivy.extension_dir
|
40
45
|
@base_ivy = @project.parent.ivy unless own_file?
|
41
46
|
end
|
47
|
+
@target_config = Hash.new do
|
48
|
+
|hash, key| hash[key] = {}
|
49
|
+
end
|
42
50
|
end
|
43
|
-
|
51
|
+
|
44
52
|
def enabled?
|
45
53
|
@enabled ||= Ivy.setting('enabled') || true
|
46
54
|
end
|
@@ -70,10 +78,14 @@ module Buildr
|
|
70
78
|
end
|
71
79
|
|
72
80
|
# Returns the artifacts for given configurations as array
|
81
|
+
# this is a post resolve task.
|
73
82
|
def deps(*confs)
|
74
83
|
configure
|
75
|
-
|
76
|
-
|
84
|
+
confs = confs.reject {|c| c.nil? || c.blank? }
|
85
|
+
unless confs.empty?
|
86
|
+
pathid = "ivy.deps." + confs.join('.')
|
87
|
+
ant.cachepath :conf => confs.join(','), :pathid => pathid
|
88
|
+
end
|
77
89
|
end
|
78
90
|
|
79
91
|
# Returns ivy info for configured ivy file using a new ant instance.
|
@@ -109,6 +121,8 @@ module Buildr
|
|
109
121
|
else
|
110
122
|
unless @resolved
|
111
123
|
@resolved = ant.resolve :file => file
|
124
|
+
@project.send(:info, "Calling '#{post_resolve_tasks.size}' post_resolve tasks for '#{@project.name}'")
|
125
|
+
post_resolve_tasks.each { |p| p.call(self) }
|
112
126
|
end
|
113
127
|
end
|
114
128
|
end
|
@@ -312,63 +326,112 @@ module Buildr
|
|
312
326
|
end
|
313
327
|
end
|
314
328
|
|
315
|
-
#
|
316
|
-
#
|
317
|
-
#
|
318
|
-
|
319
|
-
|
320
|
-
if package_conf.empty?
|
321
|
-
@package_conf ||= [Ivy.setting('package.conf') || 'prod'].flatten.uniq
|
322
|
-
else
|
323
|
-
@package_conf = [package_conf].flatten.uniq
|
324
|
-
self
|
325
|
-
end
|
329
|
+
# Adds given block as post resolve action that is executed directly after #resolve has been called.
|
330
|
+
# Yields this ivy config object into block.
|
331
|
+
# <tt>project.ivy.post_resolve { |ivy| p "all deps:" + ivy.deps('all').join(", ") }</tt>
|
332
|
+
def post_resolve(&block)
|
333
|
+
post_resolve_tasks << block if block
|
326
334
|
end
|
327
335
|
|
328
|
-
#
|
329
|
-
#
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
+
# Filter artifacts for given configuration with provided filter values, this is a post resolve
|
337
|
+
# task like #deps.
|
338
|
+
# <tt>project.ivy.filter('server', 'client', :include => /b.*.jar/, :exclude => [/a\.jar/, /other.*\.jar/])</tt>
|
339
|
+
def filter(*confs)
|
340
|
+
filter = confs.last.kind_of?(Hash) ? confs.pop : {}
|
341
|
+
unless (filter.keys - [:include, :exclude]).empty?
|
342
|
+
raise ArgumentError, "Invalid filter use :include and/or :exclude only: given #{filter.keys.inspect}"
|
343
|
+
end
|
344
|
+
includes, excludes = filter[:include] || [], filter[:exclude] || []
|
345
|
+
|
346
|
+
artifacts = deps(*confs.flatten)
|
347
|
+
if artifacts
|
348
|
+
artifacts = artifacts.find_all do |lib|
|
349
|
+
lib = File.basename(lib)
|
350
|
+
includes = includes.reject {|i| i.nil? || i.blank? }
|
351
|
+
should_include = includes.empty? || includes.any? {|include| include === lib }
|
352
|
+
should_include && !excludes.any? {|exclude| exclude === lib}
|
353
|
+
end
|
336
354
|
end
|
337
|
-
end
|
338
355
|
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
356
|
+
artifacts
|
357
|
+
end
|
358
|
+
|
359
|
+
# :call-seq:
|
360
|
+
# for types:
|
361
|
+
# project.ivy.include(:compile => [/\.jar/, /\.gz/], :package => 'cglib.jar')
|
362
|
+
# project.ivy.exclude(:test => 'cglib.jar')
|
363
|
+
# project.ivy.conf(:compile => 'compile', :test => 'test', :package => 'prod')
|
364
|
+
# for targets:
|
365
|
+
# project.ivy.compile(:conf => 'compile', :exclude => /cglib.jar/)
|
366
|
+
# project.ivy.test(:conf => 'test')
|
367
|
+
# project.ivy.package(:conf => 'prod', :include => /.*.jar/, :exclude => /cglib.jar/)
|
368
|
+
# or verbose:
|
369
|
+
# project.ivy.compile_conf or project.ivy.conf_compile
|
370
|
+
# project.ivy.compile_include or project.ivy.include_compile
|
371
|
+
# the same for the other possible options.
|
372
|
+
#
|
373
|
+
# Uses #method_missing to handle the options.
|
374
|
+
# Generic handling of settings for +target+ and +type+. All calls in the form
|
375
|
+
# <tt>target_type({})</tt> or <tt>type_target({})</tt> are handled via this method see
|
376
|
+
# #TARGETS #TYPES for more information about valid targets and types.
|
377
|
+
def method_missing(methodname, *args, &block)
|
378
|
+
if block.nil? && valid_config_call?(methodname)
|
379
|
+
target, type = target(methodname), type(methodname)
|
380
|
+
if target && type
|
381
|
+
handle_variable(target, type, *args)
|
382
|
+
elsif target && args.size == 1 && args.last.kind_of?(Hash)
|
383
|
+
args[0].each { |type, value| handle_variable(target, type, *value) }
|
384
|
+
self
|
385
|
+
elsif type && args.size == 1 && args.last.kind_of?(Hash)
|
386
|
+
args[0].each { |target, value| handle_variable(target, type, *value) }
|
387
|
+
self
|
388
|
+
else
|
389
|
+
raise "Could not recognize config call for method '#{methodname}', args=#{args.inspect}"
|
390
|
+
end
|
344
391
|
else
|
345
|
-
|
346
|
-
self
|
392
|
+
super.method_missing(methodname, *args, &block)
|
347
393
|
end
|
348
394
|
end
|
395
|
+
|
396
|
+
private
|
397
|
+
def target(targets)
|
398
|
+
t = targets.to_s.split('_').find { |t| TARGETS.member? t.to_sym }
|
399
|
+
t ? t.to_sym : nil
|
400
|
+
end
|
349
401
|
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
402
|
+
def type(types)
|
403
|
+
t = types.to_s.split('_').find { |t| TYPES.member? t.to_sym }
|
404
|
+
t ? t.to_sym : nil
|
405
|
+
end
|
406
|
+
|
407
|
+
def valid_config_call?(method_name)
|
408
|
+
valid_calls = []
|
409
|
+
TYPES.each do|type|
|
410
|
+
TARGETS.each do|target|
|
411
|
+
valid_calls << type.to_s << target.to_s << "#{type}_#{target}" << "#{target}_#{type}"
|
412
|
+
end
|
358
413
|
end
|
414
|
+
valid_calls.member? method_name.to_s
|
359
415
|
end
|
360
416
|
|
361
|
-
#
|
362
|
-
#
|
363
|
-
# <tt>
|
364
|
-
def
|
365
|
-
|
366
|
-
|
417
|
+
# Sets a variable for given basename and type to given values. If values are empty returns the
|
418
|
+
# current value.
|
419
|
+
# I.e. <tt>handle_variable(:package, :include, /blua.*\.jar/, /da.*\.jar/)</tt>
|
420
|
+
def handle_variable(target, type, *values)
|
421
|
+
unless TARGETS.member?(target) && TYPES.member?(type)
|
422
|
+
raise ArgumentError, "Unknown config value for target #{target.inspect} and type #{type.inspect}"
|
423
|
+
end
|
424
|
+
if values.empty?
|
425
|
+
@target_config[target][type] ||= [Ivy.setting("#{target.to_s}.#{type.to_s}") || ''].flatten.uniq
|
367
426
|
else
|
368
|
-
@
|
427
|
+
@target_config[target][type] = [values].flatten.uniq
|
369
428
|
self
|
370
429
|
end
|
371
430
|
end
|
431
|
+
|
432
|
+
def post_resolve_tasks
|
433
|
+
@base_ivy ? @base_ivy.post_resolve_task_list : post_resolve_task_list
|
434
|
+
end
|
372
435
|
end
|
373
436
|
|
374
437
|
=begin rdoc
|
@@ -398,24 +461,34 @@ For more configuration options see IvyConfig.
|
|
398
461
|
def add_ivy_deps_to_java_tasks(project)
|
399
462
|
resolve_target = project.ivy.file_project.task('ivy:resolve')
|
400
463
|
project.task :compiledeps => resolve_target do
|
401
|
-
|
402
|
-
|
403
|
-
|
464
|
+
includes = project.ivy.compile_include
|
465
|
+
excludes = project.ivy.compile_exclude
|
466
|
+
confs = [project.ivy.compile_conf].flatten
|
467
|
+
if deps = project.ivy.filter(confs, :include => includes, :exclude => excludes)
|
468
|
+
project.compile.with deps
|
469
|
+
info "Ivy adding compile dependencies '#{confs.join(', ')}' to project '#{project.name}'"
|
470
|
+
end
|
404
471
|
end
|
405
472
|
|
406
473
|
project.task :compile => "#{project.name}:compiledeps"
|
407
474
|
|
408
475
|
project.task :testdeps => resolve_target do
|
476
|
+
includes = project.ivy.test_include
|
477
|
+
excludes = project.ivy.test_exclude
|
409
478
|
confs = [project.ivy.test_conf, project.ivy.compile_conf].flatten.uniq
|
410
|
-
|
411
|
-
|
479
|
+
if deps = project.ivy.filter(confs, :include => includes, :exclude => excludes)
|
480
|
+
project.test.with deps
|
481
|
+
info "Ivy adding test dependencies '#{confs.join(', ')}' to project '#{project.name}'"
|
482
|
+
end
|
412
483
|
end
|
413
484
|
project.task "test:compile" => "#{project.name}:testdeps"
|
414
485
|
|
415
486
|
project.task :javadocdeps => resolve_target do
|
416
487
|
confs = [project.ivy.test_conf, project.ivy.compile_conf].flatten.uniq
|
417
|
-
|
418
|
-
|
488
|
+
if deps = project.ivy.deps(confs)
|
489
|
+
project.javadoc.with deps
|
490
|
+
info "Ivy adding javadoc dependencies '#{confs.join(', ')}' to project '#{project.name}'"
|
491
|
+
end
|
419
492
|
end
|
420
493
|
project.task :javadoc => "#{project.name}:javadocdeps"
|
421
494
|
|
@@ -437,22 +510,17 @@ For more configuration options see IvyConfig.
|
|
437
510
|
end
|
438
511
|
|
439
512
|
def add_prod_libs_to_distributeables(project)
|
440
|
-
includes = project.ivy.package_include
|
441
|
-
excludes = project.ivy.package_exclude
|
442
513
|
pkgs = project.packages.find_all { |pkg| [:war, :ear].member? pkg.type }
|
443
514
|
pkgs.each do |pkg|
|
444
515
|
name = "#{pkg.name}deps"
|
445
516
|
task = project.task name => project.ivy.file_project.task('ivy:resolve') do
|
517
|
+
includes = project.ivy.package_include
|
518
|
+
excludes = project.ivy.package_exclude
|
446
519
|
confs = project.ivy.package_conf
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
verbose "Including '#{lib}' from package '#{pkg}' in project '#{project.name}'" if use
|
451
|
-
info "Excluding '#{lib}' from package '#{pkg}' in project '#{project.name}'" unless use
|
452
|
-
use
|
520
|
+
if deps = project.ivy.filter(confs, :include => includes, :exclude => excludes)
|
521
|
+
pkg.with :libs => deps
|
522
|
+
info "Adding production libs from conf '#{confs.join(', ')}' to package '#{pkg.name}' in project '#{project.name}'"
|
453
523
|
end
|
454
|
-
pkg.with :libs => libs
|
455
|
-
info "Adding production libs from conf '#{confs.join(', ')}' to package '#{pkg.name}' in project '#{project.name}'"
|
456
524
|
end
|
457
525
|
project.task :build => task
|
458
526
|
end
|
data/lib/ivy4r.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ivy4r
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Klaas Prause
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-07-
|
12
|
+
date: 2009-07-21 00:00:00 +02:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|