rmaven 0.0.1

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 (5) hide show
  1. data/bin/rmaven +3 -0
  2. data/lib/maven.rb +418 -0
  3. data/lib/rmaven.rb +3 -0
  4. data/lib/tasks/mvn.rb +160 -0
  5. metadata +56 -0
data/bin/rmaven ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ puts "Sorry, Rakefilegeneration is not implemented."
data/lib/maven.rb ADDED
@@ -0,0 +1,418 @@
1
+ require "enumerator"
2
+ require "rexml/document"
3
+
4
+ class String
5
+ def java_style
6
+ str = split('_').map{|s| s[0..0].upcase + s[1..-1].downcase }.join
7
+ str[0..0].downcase + str[1..-1]
8
+ end
9
+ end
10
+
11
+ module Maven
12
+ module IgnoreNilElement
13
+ def text_value(*tags)
14
+ text_node = nil
15
+ tags.each do |tag|
16
+ text_node = get_text(tag)
17
+ break if text_node
18
+ end
19
+ text_node ? text_node.value : nil
20
+ end
21
+ end
22
+
23
+
24
+ DEFAULT_PROJECT_SETTINGS = "mvn_projects.yml"
25
+
26
+ def self.create_project(filename, settings = nil)
27
+ if filename.is_a?(Hash)
28
+ Project.new("unnamed", filename)
29
+ elsif /\.xml\Z/i =~ filename
30
+ raise ArgumentError, "#{filename} not found" unless File.exist?(filename)
31
+ open(filename) do |f|
32
+ pom = REXML::Document.new(f)
33
+ pom.elements.each("project") do |proj|
34
+ proj.extend(IgnoreNilElement)
35
+ settings = {
36
+ 'rake_prefix' => 'mvn',
37
+ 'pom_dir' => File.dirname(filename).gsub(/[\\\/]/, '_')
38
+ }.update(settings || {})
39
+ settings.update({
40
+ 'group_id' => proj.text_value('groupId'),
41
+ 'artifact_id' => proj.text_value('artifactId')
42
+ })
43
+ return Project.new(proj.text_value('name', 'artifactId'), settings)
44
+ end
45
+ end
46
+ else
47
+ raise ArgumentError, "unsupported file: #{filename}"
48
+ end
49
+ end
50
+
51
+ def self.create_projects(settings)
52
+ settings.map do |name, setting|
53
+ Project.new(name, setting)
54
+ end
55
+ end
56
+
57
+ # maven2 plugins
58
+ # see http://maven.apache.org/plugins/index.html
59
+ PLUGINS =
60
+ # core plugins
61
+ %w(clean compiler deploy install resources site surefire verifier) +
62
+ # packaging types / tools
63
+ %w(ear ejb jar rar war shade) +
64
+ # reporting
65
+ %w(changelog changes checkstyle clover doap docck javadoc jxr pmd project-info-reports surefire-report) +
66
+ # tools
67
+ %w(ant antrun archetype assembly dependency enforcer gpg help invoker one patch plugin release remote-resources repository scm source stage) +
68
+ # IDEs
69
+ %w(eclipse idea) +
70
+ # Outside The Maven Land
71
+ %w(build-helper castor javacc jdepend native sql taglist) +
72
+ # A number of other projects provide their own Maven plugins. This includes
73
+ %w(cargo jaxme jetty jalopy)
74
+
75
+ # http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html
76
+ LIFECYCLES =
77
+ [
78
+ # Clean Lifecycle
79
+ { :name => "pre-clean", :desc => "executes processes needed prior to the actual project cleaning"},
80
+ { :name => "clean", :desc => "remove all files generated by the previous build"},
81
+ { :name => "post-clean", :desc => "executes processes needed to finalize the project cleaning"},
82
+ # Default Lifecycle
83
+ { :name => "validate", :desc => "validate the project is correct and all necessary information is available."},
84
+ { :name => "generate-sources", :desc => "generate any source code for inclusion in compilation."},
85
+ { :name => "process-sources", :hidden => true, :desc => "process the source code, for example to filter any values."},
86
+ { :name => "generate-resources", :desc => "generate resources for inclusion in the package."},
87
+ { :name => "process-resources", :hidden => true, :desc => "copy and process the resources into the destination directory, ready for packaging."},
88
+ { :name => "compile", :desc => "compile the source code of the project."},
89
+ { :name => "process-classes", :hidden => true, :desc => "post-process the generated files from compilation, for example to do bytecode enhancement on Java classes."},
90
+ { :name => "generate-test-sources", :desc => "generate any test source code for inclusion in compilation."},
91
+ { :name => "process-test-sources", :hidden => true, :desc => "process the test source code, for example to filter any values."},
92
+ { :name => "generate-test-resources", :desc => "create resources for testing."},
93
+ { :name => "process-test-resources", :hidden => true, :desc => "copy and process the resources into the test destination directory."},
94
+ { :name => "test-compile", :desc => "compile the test source code into the test destination directory"},
95
+ { :name => "process-test-classes", :hidden => true, :desc => "post-process the generated files from test compilation, for example to do bytecode enhancement on Java classes. For Maven 2.0.5 and above."},
96
+ { :name => "test", :desc => "run tests using a suitable unit testing framework. These tests should not require the code be packaged or deployed."},
97
+ { :name => "prepare-package", :hidden => true, :desc => "perform any operations necessary to prepare a package before the actual packaging. This often results in an unpacked, processed version of the package. (Maven 2.1 and above)"},
98
+ { :name => "package", :desc => "take the compiled code and package it in its distributable format, such as a JAR."},
99
+ { :name => "pre-integration-test", :hidden => true, :desc => "perform actions required before integration tests are executed. This may involve things such as setting up the required environment."},
100
+ { :name => "integration-test", :desc => "process and deploy the package if necessary into an environment where integration tests can be run."},
101
+ { :name => "post-integration-test", :hidden => true, :desc => "perform actions required after integration tests have been executed. This may including cleaning up the environment."},
102
+ { :name => "verify", :desc => "run any checks to verify the package is valid and meets quality criteria."},
103
+ { :name => "install", :desc => "install the package into the local repository, for use as a dependency in other projects locally."},
104
+ { :name => "deploy", :desc => "done in an integration or release environment, copies the final package to the remote repository for sharing with other developers and projects."},
105
+ # Site Lifecycle
106
+ { :name => "pre-site", :hidden => true, :desc => "executes processes needed prior to the actual project site generation"},
107
+ { :name => "site", :desc => "generates the project's site documentation"},
108
+ { :name => "post-site", :hidden => true, :desc => "executes processes needed to finalize the site generation, and to prepare for site deployment"},
109
+ { :name => "site-deploy", :desc => "deploys the generated site documentation to the specified web server"}
110
+ ]
111
+
112
+ LIFECYCLE_BIDINGS = {
113
+ # Clean Lifecycle Bindings
114
+ "clean" => "clean:clean",
115
+ # Default Lifecycle Bindings - Packaging ejb / ejb3 / jar / par / rar / war
116
+ "process-resources" => "resources:resources",
117
+ "compile" => "compiler:compile",
118
+ "process-test-resources" => "resources:testResource",
119
+ "test-compile" => "compiler:testCompile",
120
+ "test" => "surefire:test",
121
+ "package" => "ejb:ejb or ejb3:ejb3 or jar:jar or par:par or rar:rar or war:war",
122
+ "install" => "install:install",
123
+ "deploy" => "deploy:deploy",
124
+ # Default Lifecycle Bindings - Packaging ear
125
+ "generate-resources" => "ear:generateApplicationXml",
126
+ "process-resources" => "resources:resources",
127
+ "package" => "ear:ear",
128
+ "install" => "install:install",
129
+ "deploy" => "deploy:deploy",
130
+ # Default Lifecycle Bindings - Packaging maven-plugin
131
+ "generate-resources" => "plugin:descriptor",
132
+ "process-resources" => "resources:resources",
133
+ "compile" => "compiler:compile",
134
+ "process-test-resources" => "resources:testResource",
135
+ "test-compile" => "compiler:testCompile",
136
+ "test" => "surefire:test",
137
+ "package" => "jar:jar and plugin:addPluginArtifactMetadata",
138
+ "install" => "install:install and plugin:updateRegistry",
139
+ "deploy" => "deploy:deploy",
140
+ # Default Lifecycle Bindings - Packaging pom
141
+ "package" => "site:attach-descriptor",
142
+ "install" => "install:install",
143
+ "deploy" => "deploy:deploy",
144
+ # Site Lifecycle Bindings",
145
+ "site" => "site:site",
146
+ "site-deploy" => "site:deploy"
147
+ }
148
+
149
+ LIFECYCLES.each do |lifecycle|
150
+ if binding = LIFECYCLE_BIDINGS[lifecycle[:name]]
151
+ lifecycle[:binding] = binding
152
+ end
153
+ end
154
+
155
+
156
+ DEFAULT_MVN_PLUGINS_SETTING = "mvn_plugins.yml"
157
+
158
+ class Project
159
+ attr_accessor :group_id
160
+ attr_accessor :artifact_id
161
+
162
+ attr_accessor :name
163
+ attr_accessor :pom_dir
164
+ attr_accessor :rake_prefix
165
+ attr_accessor :plugin_settings
166
+ attr_accessor :verbose
167
+
168
+ def initialize(name, settings)
169
+ self.name = name
170
+ self.verbose = false
171
+ settings.each do |key, value|
172
+ send("#{key}=", value)
173
+ end
174
+ @pom_dir||= name.dup
175
+ @rake_prefix ||= "java"
176
+ @plugin_settings ||= DEFAULT_MVN_PLUGINS_SETTING
177
+ end
178
+
179
+ def plugin_setting_path
180
+ File.join(pom_dir, plugin_settings)
181
+ end
182
+
183
+ def archetype_create_args
184
+ %w(group_id artifact_id).map do |key|
185
+ "#{key}=#{send(key)}"
186
+ end
187
+ end
188
+
189
+ def select_plugins(*args)
190
+ plugins = YAML.load_file(plugin_setting_path).sort
191
+ args.each do |arg|
192
+ regexp = Regexp.new(arg)
193
+ plugins = plugins.select{|plugin| plugin =~ regexp}
194
+ end
195
+ plugins
196
+ end
197
+
198
+ def execute_without_cd(goal, mvn_args = nil, &block)
199
+ unless mvn_args
200
+ mvn_args = ARGV.dup
201
+ mvn_args.shift
202
+ end
203
+ command = "mvn #{goal} " + mvn_args.map do |arg|
204
+ key, value = *arg.split('=', 2)
205
+ "-D#{key.java_style}=#{value}"
206
+ end.join(" ")
207
+ block ||= lambda{|f| puts f.read }
208
+ puts(command) if verbose
209
+ open("|#{command}", "r", &block)
210
+ end
211
+
212
+ def execute_with_cd(goal, mvn_args = nil, &block)
213
+ FileUtils.cd(pom_dir, :verbose => verbose) do
214
+ unless File.exist?("pom.xml")
215
+ raise "You must execute 'rake mvn:create' before #{ARGV.join(' ')}"
216
+ end
217
+ execute_without_cd(goal, mvn_args, &block)
218
+ end
219
+ end
220
+
221
+ def execute(goal, mvn_args = nil, &block)
222
+ execute_with_cd(goal, mvn_args, &block)
223
+ end
224
+
225
+ def plugin(plugin_name)
226
+ lines = nil
227
+ execute("help:describe", ["plugin=#{plugin_name}", "full=true"]) do |f|
228
+ lines = f.readlines
229
+ end
230
+ lines.each{|line| line.chomp!}
231
+ if lines.any?{|line| /^\ERROR\]/ =~ line}
232
+ raise lines.join
233
+ return nil
234
+ end
235
+ plugin = Plugin.new(plugin_name)
236
+ lines.inject(plugin) do |current, line|
237
+ current.process(line)
238
+ end
239
+ plugin.prepare
240
+ plugin
241
+ end
242
+ end
243
+
244
+ class Skipper
245
+ def initialize(pattern, source)
246
+ @pattern = pattern
247
+ @source = source
248
+ end
249
+
250
+ def process(line)
251
+ @pattern =~ line ? @source : self
252
+ end
253
+ end
254
+
255
+ class Base
256
+ attr_accessor :parent
257
+
258
+ def skip_to(pattern, status)
259
+ @status = status
260
+ Skipper.new(pattern, self)
261
+ end
262
+
263
+ def until(line, pattern, next_status, result = nil, &block)
264
+ if pattern =~ line
265
+ @status = next_status
266
+ else
267
+ yield
268
+ end
269
+ result || self
270
+ end
271
+
272
+ def prepare
273
+ remove_instance_variable(:@status) unless @status.nil?
274
+ @description = (@description || []).select{|line| !line.nil? and line != ""}
275
+ end
276
+ end
277
+
278
+ class Plugin < Base
279
+ attr_accessor :name, :description
280
+ attr_accessor :group_id, :artifact_id, :version, :goal_prefix
281
+ attr_accessor :goals
282
+
283
+ def initialize(name)
284
+ @name = name
285
+ end
286
+
287
+ def prepare
288
+ super
289
+ goals.each{|goal| goal.prepare}
290
+ end
291
+
292
+ def process(line)
293
+ case @status || :none
294
+ when :none
295
+ skip_to(/^#{'-' * 40}/, :header)
296
+ when :header
297
+ self.until(line, /^Description\:/, :description) do
298
+ key, value = *line.split(':', 2)
299
+ words = *key.split(' ')
300
+ send("#{words.map{|s|s.downcase}.join('_')}=", value.strip)
301
+ end
302
+ when :description
303
+ self.until(line, /^Mojos\:/, :to_mojos) do
304
+ self.description ||= []
305
+ self.description << line.strip
306
+ end
307
+ when :to_mojos
308
+ skip_to(/^#{'=' * 40}/, :goals)
309
+ when :goals
310
+ if /^Goal\: \'(.*)\'/ =~ line
311
+ goal = Goal.new(self, $1)
312
+ self.goals ||= []
313
+ self.goals << goal
314
+ goal
315
+ else
316
+ self
317
+ end
318
+ else
319
+ raise "unimplemented"
320
+ end
321
+ end
322
+ end
323
+
324
+ class Goal < Base
325
+ attr_accessor :name, :description
326
+ attr_accessor :implementation, :language
327
+ attr_accessor :parameters
328
+
329
+ def initialize(parent, name)
330
+ @parent = parent
331
+ @name = name.strip
332
+ end
333
+
334
+ def prepare
335
+ super
336
+ parameters.each{|parameter| parameter.prepare}
337
+ end
338
+
339
+ def process(line)
340
+ case @status || :none
341
+ when :none
342
+ skip_to(/^Description\:/, :description)
343
+ when :description
344
+ if /^Implementation\: (.*?)$/ =~ line
345
+ self.implementation = $1.strip
346
+ @status = :language
347
+ else
348
+ self.description ||= []
349
+ self.description << line.strip
350
+ end
351
+ self
352
+ when :language
353
+ key, value = *line.split(": ", 2)
354
+ self.language = value.strip
355
+ @status = :parameters
356
+ skip_to(/^Parameters\:/, :parameters)
357
+ when :parameters
358
+ if line.strip == ""
359
+ self
360
+ elsif /^#{'=' * 40}/ =~ line
361
+ parent
362
+ else
363
+ new_parameter
364
+ end
365
+ else
366
+ raise "unimplemented"
367
+ end
368
+ end
369
+
370
+ def new_parameter
371
+ parameter = Parameter.new(self)
372
+ self.parameters ||= []
373
+ self.parameters << parameter
374
+ parameter
375
+ end
376
+ end
377
+
378
+ class Parameter < Base
379
+ attr_accessor :name, :description
380
+ attr_accessor :index, :type, :required, :directly_editable
381
+
382
+ def initialize(parent)
383
+ @parent = parent
384
+ end
385
+
386
+ def process(line)
387
+ return parent if /^#{'=' * 40}/ =~ line
388
+ case @status || :none
389
+ when :none
390
+ if /\[(\d+?)\] Name: (.*)/ =~ line
391
+ @index = $1.to_i
392
+ @name = $2.strip
393
+ @status = :attributes
394
+ end
395
+ self
396
+ when :attributes
397
+ self.until(line, /^Description\:/, :description) do
398
+ key, value = *line.split(':', 2)
399
+ words = *key.split(' ')
400
+ send("#{words.map{|s|s.downcase}.join('_')}=", value.strip)
401
+ end
402
+ self
403
+ when :description
404
+ if /^#{'-' * 40}/ =~ line
405
+ parent.new_parameter
406
+ else
407
+ self.description ||= []
408
+ self.description << line.strip
409
+ self
410
+ end
411
+ else
412
+ raise "unimplemented"
413
+ end
414
+ end
415
+
416
+ end
417
+
418
+ end
data/lib/rmaven.rb ADDED
@@ -0,0 +1,3 @@
1
+ module RMaven
2
+ VERSION = '0.0.1'
3
+ end
data/lib/tasks/mvn.rb ADDED
@@ -0,0 +1,160 @@
1
+ # -*- coding: utf-8 -*-
2
+ require "fileutils"
3
+ require "yaml"
4
+ require File.join(File.dirname(__FILE__), "..", "maven")
5
+
6
+ def build_args_hash
7
+ args = ARGV.dup
8
+ args.shift
9
+ args.inject({}) do |dest, arg|
10
+ key, value = *arg.split("=", 2)
11
+ dest[key] = value
12
+ dest
13
+ end
14
+ end
15
+
16
+ def show_file(*paths)
17
+ open(File.join(File.dirname(__FILE__), '..', *paths)) do |f|
18
+ puts f.read
19
+ end
20
+ end
21
+
22
+
23
+ ARGV_HASH = build_args_hash
24
+ ARGV_KEY_IGNORED = ARGV_HASH.map{|key, value| value || key}
25
+
26
+ RMAVEN_SETTING_YAML = 'rmaven.yml'
27
+
28
+ desc "show help about mvn task"
29
+ task :mvn do
30
+ show_file('USAGE.txt')
31
+ end
32
+
33
+ namespace :mvn do
34
+ desc "show usage"
35
+ task :usage do
36
+ show_file('USAGE.txt')
37
+ end
38
+
39
+ desc "generate example setting yaml for rmaven"
40
+ task :generate_yaml do
41
+ File.open(RMAVEN_SETTING_YAML, 'w') do |f|
42
+ YAML.dump(
43
+ {'sub_project_name' =>
44
+ {
45
+ 'pom_dir' => 'proj1',
46
+ 'rake_prefix' => 'proj1',
47
+ 'group_id' => 'your.organization.id',
48
+ 'artifact_id' => 'proj1'
49
+ }
50
+ }, f)
51
+ end
52
+ end
53
+ end
54
+
55
+
56
+ poms = nil
57
+ if File.exist?('rmaven.yml')
58
+ open('rmaven.yml') do |f|
59
+ poms = YAML.load(f)
60
+ end
61
+ end
62
+
63
+ if File.exist?('pom.xml')
64
+ poms['java'] = {'pom' => 'pom.xml'}
65
+ end
66
+
67
+ (poms || {}).each do |project_name, settings|
68
+ filename = settings['pom']
69
+ filename ||= File.join(*(project_name.split('/') + ['pom.xml']))
70
+ unless File.exist?(filename)
71
+ project = Maven::Project.new(project_name, settings)
72
+ namespace project.rake_prefix do
73
+ desc "create mavenized java project in directory '#{project.pom_dir}'"
74
+ task :create do
75
+ project.execute_without_cd("archetype:create", project.archetype_create_args)
76
+ FileUtils.mv(project.artifact_id, project.pom_dir, :verbose => project.verbose)
77
+ open(project.plugin_setting_path, "w") do |f|
78
+ YAML.dump(Maven::PLUGINS, f)
79
+ end
80
+ end
81
+ end
82
+ next
83
+ end
84
+
85
+ project = Maven.create_project(filename, settings)
86
+
87
+ namespace project.rake_prefix do
88
+ Maven::LIFECYCLES.each do |lifecycle|
89
+ binding = lifecycle[:binding]
90
+ binding = ". [binding] #{binding}" if binding
91
+ desc "#{lifecycle[:desc]}#{binding}" unless lifecycle[:hidden]
92
+ task lifecycle[:name].to_sym do
93
+ project.execute(lifecycle[:name])
94
+ end
95
+ end
96
+
97
+ desc "list mvn plugins. USAGE: rake mvn:plugins [any_key=<plugin_name>]"
98
+ task :plugin do
99
+ plugins = project.select_plugins(*ARGV_KEY_IGNORED)
100
+ if plugins.empty?
101
+ puts "No mvn plugin matched. "
102
+ elsif plugins.length == 1
103
+ plugin = plugins.first
104
+ project.execute("help:describe", ["plugin=#{plugin}"])
105
+ puts "you can get details more:"
106
+ puts " rake mvn:plugin:goal plugin=#{plugin}"
107
+ puts "or"
108
+ puts " rake mvn:plugin:params plugin=#{plugin}"
109
+ else
110
+ puts "#{ARGV_KEY_IGNORED.empty? ? 'known' : 'matched'} plugins are:"
111
+ puts plugins.join(" ")
112
+ end
113
+ end
114
+
115
+ namespace :plugin do
116
+ desc "execute mvn plugin. USAGE: rake mvn:plugins:execute plugin=<plugin_name> goal=<goal_name>"
117
+ task :execute do
118
+ hash = ARGV_HASH
119
+ plugin = hash.delete("plugin")
120
+ goal = hash.delete("goal")
121
+ project.execute("#{plugin}:#{goal}", hash.map{|key, value| "#{key}=#{value}"})
122
+ end
123
+
124
+ desc "search remote plugin and show the help . USAGE: rake mvn:plugins:detect plugin=<plugin_name> [goal=<goal_name>]"
125
+ task :detect do
126
+ project.execute("help:describe", ARGV_HASH.map{|key, value| "#{key}=#{value}"})
127
+ end
128
+
129
+ desc "show mvn plugins medium help. USAGE: rake mvn:plugins:goals plugin=<plugin_name>"
130
+ task :goals do
131
+ plugins = project.select_plugins(*ARGV_KEY_IGNORED)
132
+ if plugins.empty?
133
+ puts "No mvn plugin found. if you know the exact name, rake mvn:plugins:detect plugin=<plugin_name>. or check your #{project.plugin_setting_path}"
134
+ else
135
+ plugins.each do |plugin|
136
+ project.execute("help:describe", ["plugin=#{plugin}", "medium=true"])
137
+ puts "- " * 20
138
+ end
139
+ puts "you can get details more:"
140
+ puts " rake mvn:plugin:params plugin=<plugin_name> goal=<goal_name>"
141
+ end
142
+ end
143
+
144
+ desc "show mvn plugins full help. USAGE: rake mvn:plugins:goals plugin=<plugin_name>"
145
+ task :params do
146
+ plugins = project.select_plugins(*ARGV_KEY_IGNORED)
147
+ if plugins.empty?
148
+ puts "No mvn plugin found. if you know the exact name, rake mvn:plugins:detect plugin=<plugin_name>. or check your #{project.plugin_setting_path}"
149
+ else
150
+ plugins.each do |plugin|
151
+ project.execute("help:describe", ["plugin=#{plugin}", "full=true"])
152
+ puts "- " * 20
153
+ end
154
+ end
155
+ end
156
+
157
+ end
158
+
159
+ end
160
+ end
metadata ADDED
@@ -0,0 +1,56 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rmaven
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Takeshi Akima
8
+ autorequire: rmaven
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-10-06 00:00:00 +09:00
13
+ default_executable: rmaven
14
+ dependencies: []
15
+
16
+ description:
17
+ email: rubeus@googlegroups.com
18
+ executables:
19
+ - rmaven
20
+ extensions: []
21
+
22
+ extra_rdoc_files: []
23
+
24
+ files:
25
+ - bin/rmaven
26
+ - lib/maven.rb
27
+ - lib/rmaven.rb
28
+ - lib/tasks/mvn.rb
29
+ has_rdoc: false
30
+ homepage: http://code.google.com/p/rubeus/
31
+ post_install_message:
32
+ rdoc_options: []
33
+
34
+ require_paths:
35
+ - lib
36
+ required_ruby_version: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: "0"
41
+ version:
42
+ required_rubygems_version: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: "0"
47
+ version:
48
+ requirements:
49
+ - none
50
+ rubyforge_project: rubybizcommons
51
+ rubygems_version: 1.1.1
52
+ signing_key:
53
+ specification_version: 2
54
+ summary: RMaven enables using maven through rake
55
+ test_files: []
56
+