pepijnve-ivy4r 0.12.11

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. data/.autotest +14 -0
  2. data/.gitignore +7 -0
  3. data/.project +17 -0
  4. data/.rspec +2 -0
  5. data/CHANGELOG +280 -0
  6. data/Gemfile +5 -0
  7. data/README.txt +124 -0
  8. data/Rakefile +36 -0
  9. data/autotest/discover.rb +1 -0
  10. data/ivy4r.gemspec +30 -0
  11. data/lib/buildr/ivy_extension.rb +808 -0
  12. data/lib/ivy/artifactproperty.rb +34 -0
  13. data/lib/ivy/artifactreport.rb +24 -0
  14. data/lib/ivy/buildlist.rb +37 -0
  15. data/lib/ivy/buildnumber.rb +34 -0
  16. data/lib/ivy/cachepath.rb +30 -0
  17. data/lib/ivy/cleancache.rb +20 -0
  18. data/lib/ivy/configure.rb +29 -0
  19. data/lib/ivy/findrevision.rb +34 -0
  20. data/lib/ivy/info.rb +36 -0
  21. data/lib/ivy/install.rb +33 -0
  22. data/lib/ivy/java/all_version_matcher.rb +31 -0
  23. data/lib/ivy/java/java_object_wrapper.rb +160 -0
  24. data/lib/ivy/listmodules.rb +35 -0
  25. data/lib/ivy/makepom.rb +30 -0
  26. data/lib/ivy/publish.rb +37 -0
  27. data/lib/ivy/report.rb +33 -0
  28. data/lib/ivy/resolve.rb +44 -0
  29. data/lib/ivy/retrieve.rb +27 -0
  30. data/lib/ivy/settings.rb +15 -0
  31. data/lib/ivy/target.rb +162 -0
  32. data/lib/ivy/targets.rb +50 -0
  33. data/lib/ivy4r.rb +252 -0
  34. data/lib/ivy4r/version.rb +3 -0
  35. data/lib/ivy4r_java_extensions.rb +42 -0
  36. data/lib/rake/ivy_extension.rb +349 -0
  37. data/spec/ivy/target_spec.rb +86 -0
  38. data/spec/ivy/targets_spec.rb +27 -0
  39. data/spec/ivy4r_spec.rb +50 -0
  40. data/spec/spec_helper.rb +10 -0
  41. data/spec_files/buildlist/p1/buildfile +0 -0
  42. data/spec_files/buildlist/p1/ivy.xml +7 -0
  43. data/spec_files/buildlist/sub/p2/buildfile +0 -0
  44. data/spec_files/buildlist/sub/p2/ivy.xml +11 -0
  45. data/spec_files/buildlist/sub/p3/buildfile +0 -0
  46. data/spec_files/buildlist/sub/p3/ivy.xml +11 -0
  47. data/spec_files/ivy.xml +18 -0
  48. data/spec_files/ivysettings.xml +11 -0
  49. data/spec_functional/ivy4r_spec.rb +131 -0
  50. metadata +214 -0
@@ -0,0 +1,35 @@
1
+ require 'ivy/target'
2
+
3
+ module Ivy
4
+ class Listmodules < Ivy::Target
5
+ def parameter
6
+ [
7
+ Parameter.new(:organisation, true),
8
+ Parameter.new(:module, true),
9
+ Parameter.new(:branch, false),
10
+ Parameter.new(:revision, true),
11
+ Parameter.new(:matcher, false),
12
+ Parameter.new(:property, true),
13
+ Parameter.new(:value, true),
14
+ Parameter.new(:settingsRef, false),
15
+ ]
16
+ end
17
+
18
+ protected
19
+ def before_hook
20
+ @cached_property_names = ant_properties.map {|key, value| key }
21
+ end
22
+
23
+ def after_hook
24
+ @cached_property_names = nil
25
+ end
26
+
27
+ def execute_ivy
28
+ call_nested :ivy_listmodules => params
29
+ end
30
+
31
+ def create_return_values
32
+ ant_properties.reject { |key, value| @cached_property_names.member? key }
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,30 @@
1
+ require 'ivy/target'
2
+
3
+ module Ivy
4
+ class Makepom < Ivy::Target
5
+ def parameter
6
+ [
7
+ Parameter.new(:ivyfile, true),
8
+ Parameter.new(:pomfile, true),
9
+ Parameter.new(:templatefile, false),
10
+ Parameter.new(:artifactName, false),
11
+ Parameter.new(:artifactPackaging, false),
12
+ Parameter.new(:conf, false),
13
+ Parameter.new(:settingsRef, false),
14
+ Parameter.new(:printIvyInfo, false),
15
+ Parameter.new(:headerFile, false),
16
+ Parameter.new(:description, false),
17
+ Parameter.new(:nested, false)
18
+ ]
19
+ end
20
+
21
+ protected
22
+ def execute_ivy
23
+ call_nested :ivy_makepom => params
24
+ end
25
+
26
+ def create_return_values
27
+ IO.read(params[:pomfile])
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,37 @@
1
+ require 'ivy/target'
2
+
3
+ module Ivy
4
+ class Publish < Ivy::Target
5
+ def parameter
6
+ [
7
+ Parameter.new(:artifactspattern, false),
8
+ Parameter.new(:resolver, true),
9
+ Parameter.new(:pubrevision, false),
10
+ Parameter.new(:pubbranch, false),
11
+ Parameter.new(:forcedeliver, false),
12
+ Parameter.new(:update, false),
13
+ Parameter.new(:validate, false),
14
+ Parameter.new(:replacedynamicrev, false),
15
+ Parameter.new(:publishivy, false),
16
+ Parameter.new(:conf, false),
17
+ Parameter.new(:overwrite, false),
18
+ Parameter.new(:warnonmissing, false),
19
+ Parameter.new(:srcivypattern, false),
20
+ Parameter.new(:srcivypattern, false),
21
+ Parameter.new(:pubdate, false),
22
+ Parameter.new(:status, false),
23
+ Parameter.new(:delivertarget, false),
24
+ Parameter.new(:settingsRef, false)
25
+ ]
26
+ end
27
+
28
+ protected
29
+ def execute_ivy
30
+ call_nested :ivy_publish => params
31
+ end
32
+
33
+ def create_return_values
34
+ nil
35
+ end
36
+ end
37
+ end
data/lib/ivy/report.rb ADDED
@@ -0,0 +1,33 @@
1
+ require 'ivy/target'
2
+
3
+ module Ivy
4
+ class Report < Ivy::Target
5
+ def parameter
6
+ [
7
+ Parameter.new(:todir, false),
8
+ Parameter.new(:nested, false),
9
+ Parameter.new(:outputpattern, false),
10
+ Parameter.new(:xsl, false),
11
+ Parameter.new(:xml, false),
12
+ Parameter.new(:graph, false),
13
+ Parameter.new(:dot, false),
14
+ Parameter.new(:conf, false),
15
+ Parameter.new(:organisation, false),
16
+ Parameter.new(:module, false),
17
+ Parameter.new(:validate, false),
18
+ Parameter.new(:xslfile, false),
19
+ Parameter.new(:settingsRef, false),
20
+ Parameter.new(:resolveId, false)
21
+ ]
22
+ end
23
+
24
+ protected
25
+ def execute_ivy
26
+ call_nested :ivy_report => params
27
+ end
28
+
29
+ def create_return_values
30
+ nil
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,44 @@
1
+ require 'ivy/target'
2
+
3
+ module Ivy
4
+ class Resolve < Ivy::Target
5
+ def parameter
6
+ [
7
+ Parameter.new(:file, false),
8
+ Parameter.new(:conf, false),
9
+ Parameter.new(:refresh, false),
10
+ Parameter.new(:resolveMode, false),
11
+ Parameter.new(:inline, false),
12
+ Parameter.new(:keep, false),
13
+ Parameter.new(:organisation, false),
14
+ Parameter.new(:module, false),
15
+ Parameter.new(:revision, false),
16
+ Parameter.new(:branch, false),
17
+ Parameter.new(:type, false),
18
+ Parameter.new(:haltonfailure, false),
19
+ Parameter.new(:failureproperty, false),
20
+ Parameter.new(:transitive, false),
21
+ Parameter.new(:showprogress, false),
22
+ Parameter.new(:validate, false),
23
+ Parameter.new(:settingsRef, false),
24
+ Parameter.new(:resolveId, false),
25
+ Parameter.new(:log, false)
26
+ ]
27
+ end
28
+
29
+ def result_property_values
30
+ property = params[:resolveId] ? ".#{params[:resolveId]}" : ''
31
+ [
32
+ ResultValue.new("ivy.organisation#{property}", nil),
33
+ ResultValue.new("ivy.module#{property}", nil),
34
+ ResultValue.new("ivy.revision#{property}", nil),
35
+ ResultValue.new("ivy.resolved.configurations#{property}", Ivy::COMMA_SPLITTER)
36
+ ]
37
+ end
38
+
39
+ protected
40
+ def execute_ivy
41
+ call_nested :ivy_resolve => params
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,27 @@
1
+ require 'ivy/target'
2
+
3
+ module Ivy
4
+ class Retrieve < Ivy::Target
5
+ def parameter
6
+ [
7
+ Parameter.new(:pattern, false),
8
+ Parameter.new(:ivypattern, false),
9
+ Parameter.new(:conf, false),
10
+ Parameter.new(:sync, false),
11
+ Parameter.new(:type, false),
12
+ Parameter.new(:symlink, false),
13
+ Parameter.new(:settingsRef, false),
14
+ Parameter.new(:log, false)
15
+ ]
16
+ end
17
+
18
+ protected
19
+ def execute_ivy
20
+ call_nested :ivy_retrieve => params
21
+ end
22
+
23
+ def create_return_values
24
+ nil
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,15 @@
1
+ require 'ivy/configure'
2
+
3
+ module Ivy
4
+ class Settings < Ivy::Configure
5
+
6
+ def create_return_values
7
+ nil
8
+ end
9
+
10
+ protected
11
+ def execute_ivy
12
+ call_nested :ivy_settings => params
13
+ end
14
+ end
15
+ end
data/lib/ivy/target.rb ADDED
@@ -0,0 +1,162 @@
1
+ require 'digest/md5'
2
+
3
+ require 'ivy/java/java_object_wrapper'
4
+
5
+ module Ivy
6
+
7
+ # Base class with general logic to call a Ivy ant target
8
+ class Target
9
+ attr_reader :params
10
+
11
+ def initialize(ant, cache_dir = nil)
12
+ raise "Cache result directory does not exists '#{cache_dir}'" if cache_dir != nil && !File.directory?(cache_dir)
13
+ @ant = ant
14
+ @cache_dir = cache_dir
15
+ end
16
+
17
+ # Executes this ivy target with given parameters returning a result.
18
+ # __params__ can be a single Hash or an Array with or without a Hash as last value.
19
+ # every value in array will be converted to string and set to __true__.
20
+ #
21
+ # I.e. <tt>[:force, 'validate', {'name' => 'Blub'}]</tt>
22
+ # results in parameters <tt>{'force'=>true, 'validate' => true, 'name'=>'Blub'}</tt>
23
+ def execute(*params)
24
+ @params = {}
25
+ params.pop.each { |key, value| @params[key] = value } if Hash === params.last
26
+ params.each { |key| @params[key.to_s] = true }
27
+ if caching_enabled? && File.exists?(cache_file_path)
28
+ load_from_yaml
29
+ else
30
+ result = execute_target
31
+ dump_to_yaml(result) if caching_enabled?
32
+ result
33
+ end
34
+ end
35
+
36
+ protected
37
+
38
+ def caching_enabled?
39
+ @cache_dir != nil
40
+ end
41
+
42
+ def cache_file_path
43
+ @cache_file_path ||= File.expand_path(File.join(@cache_dir, Digest::MD5.hexdigest(self.class.to_s + @params.to_s) + '.yaml'))
44
+ end
45
+
46
+ def load_from_yaml
47
+ File.open(cache_file_path) {|f| YAML::load(f)}
48
+ end
49
+
50
+ def dump_to_yaml(result)
51
+ File.open(cache_file_path, 'w') {|f| YAML.dump(result, f)}
52
+ end
53
+
54
+ # The bare bone execution of this target without any crosscutting concerns.
55
+ def execute_target
56
+ validate
57
+ before_hook
58
+ execute_ivy
59
+ create_return_values
60
+ ensure
61
+ after_hook
62
+ end
63
+
64
+ # Validates provided hash of parameters, raises an exception if any mandatory parameter is
65
+ # missing or an unknown parameter has been provided.
66
+ def validate
67
+ unknown = params.keys - symbols(parameter)
68
+ raise ArgumentError, "Unknown parameters '#{unknown.join(', ')}' for #{self.class}" unless unknown.empty?
69
+ missing = symbols(mandatory_parameter).find_all { |p| params.keys.member?(p) == false }
70
+ raise ArgumentError, "Missing mandatory parameters '#{missing.join(', ')}' for #{self.class}" unless missing.empty?
71
+ end
72
+
73
+ # Hook method called after validation but before #execute_ivy
74
+ # overwrite for special actions needed
75
+ def before_hook
76
+ end
77
+
78
+ # After hook is always called for #execute_target within +ensure+ block
79
+ # overwrite for special clean up
80
+ def after_hook
81
+ end
82
+
83
+ # Helper to call the nested ant targets recursively if nessecary. Must be called within +do+ +end+
84
+ # block of ant target to work.
85
+ def call_nested(nested)
86
+ if nested
87
+ nested.each do |method, paramlist|
88
+ [paramlist].flatten.each do |params|
89
+ if params.member? :nested
90
+ p = params.dup
91
+ nest = p.delete(:nested)
92
+ @ant.send(method, p, &lambda { |*_| call_nested(nest)})
93
+ else
94
+ @ant.send(method, params)
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
100
+
101
+ # Creates the result for the execution by default it iterates of the ant properties and fetches
102
+ # all properties that match the result properties for target as a hash. Overwrite to provide
103
+ # a different result
104
+ def create_return_values
105
+ result_properties
106
+ end
107
+
108
+ # Fetches all result properties for called target and returns them as hash
109
+ def result_properties
110
+ result = ant_properties.map do |p|
111
+ rp = result_property_values.find { |rp| rp.matcher === p[0] }
112
+ rp ? [p[0], rp.parse(p[1])].flatten : nil
113
+ end.compact.inject({}) do |h,v|
114
+ k = v.shift
115
+ h[k] ||= []
116
+ h[k].concat(v)
117
+ h
118
+ end
119
+ result.each do |k,v|
120
+ result[k] = case v.size
121
+ when 0 then nil
122
+ when 1 then v[0]
123
+ else v
124
+ end
125
+ end
126
+
127
+ result
128
+ end
129
+
130
+ def mandatory_parameter
131
+ parameter.find_all {|p| p.mandatory? }
132
+ end
133
+
134
+ def symbols(params)
135
+ params.map{|p| p.symbol}
136
+ end
137
+
138
+ def ant_properties
139
+ Rjb::JavaObjectWrapper.wrap_java_object @ant.project.properties
140
+ end
141
+
142
+ def ant_references
143
+ Rjb::JavaObjectWrapper.wrap_java_object @ant.project.references
144
+ end
145
+ end
146
+
147
+
148
+
149
+ COMMA_SPLITTER = Proc.new {|value| value.to_s.split(',').map(&:strip)}
150
+
151
+ Parameter = Struct.new(:symbol, :mandatory) do
152
+ def mandatory?
153
+ mandatory
154
+ end
155
+ end
156
+
157
+ ResultValue = Struct.new(:matcher, :parser) do
158
+ def parse(value)
159
+ parser ? parser.call(value) : value
160
+ end
161
+ end
162
+ end
@@ -0,0 +1,50 @@
1
+ require 'ivy/target'
2
+ require 'ivy/info'
3
+ require 'ivy/settings'
4
+ require 'ivy/configure'
5
+ require 'ivy/cleancache'
6
+ require 'ivy/resolve'
7
+ require 'ivy/makepom'
8
+ require 'ivy/cachepath'
9
+ #require 'ivy/listmodules'
10
+ require 'ivy/artifactproperty'
11
+ require 'ivy/artifactreport'
12
+ require 'ivy/findrevision'
13
+ require 'ivy/install'
14
+ require 'ivy/buildnumber'
15
+ require 'ivy/retrieve'
16
+ require 'ivy/publish'
17
+ require 'ivy/report'
18
+ require 'ivy/buildlist'
19
+
20
+ =begin
21
+ finished
22
+ * info
23
+ * settings
24
+ * configure
25
+ * cleancache
26
+ * buildnumber
27
+ * findrevision
28
+ * cachepath
29
+ * artifactreport
30
+ * resolve
31
+ * makepom
32
+ * retrieve
33
+ * publish
34
+ * artifactproperty
35
+ * report
36
+ o Using yEd to layout report graphs
37
+ * buildlist
38
+
39
+ TODO
40
+ * deliver
41
+ * install
42
+ * repreport
43
+
44
+ not working:
45
+ * listmodules
46
+
47
+ makes no sense:
48
+ * cachefileset
49
+ * var
50
+ =end