buildr 1.4.2-x86-mswin32 → 1.4.3-x86-mswin32

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 (84) hide show
  1. data/CHANGELOG +29 -3
  2. data/LICENSE +0 -0
  3. data/NOTICE +0 -0
  4. data/_jbuildr +2 -0
  5. data/addon/buildr/antlr.rb +0 -0
  6. data/addon/buildr/cobertura.rb +0 -0
  7. data/addon/buildr/drb.rb +0 -0
  8. data/addon/buildr/emma.rb +0 -0
  9. data/addon/buildr/javacc.rb +0 -0
  10. data/addon/buildr/jdepend.rb +0 -0
  11. data/addon/buildr/jetty.rb +0 -0
  12. data/addon/buildr/jibx.rb +0 -0
  13. data/addon/buildr/nailgun.rb +0 -0
  14. data/addon/buildr/org/apache/buildr/BuildrNail.java +0 -0
  15. data/addon/buildr/org/apache/buildr/JettyWrapper.java +0 -0
  16. data/addon/buildr/xmlbeans.rb +0 -0
  17. data/buildr.gemspec +1 -1
  18. data/doc/_config.yml +0 -0
  19. data/doc/_layouts/preface.html +0 -0
  20. data/doc/css/syntax.css +0 -0
  21. data/doc/extending.textile +0 -0
  22. data/doc/images/asf-logo.gif +0 -0
  23. data/doc/images/buildr-hires.png +0 -0
  24. data/doc/images/buildr.png +0 -0
  25. data/doc/images/favicon.png +0 -0
  26. data/doc/images/growl-icon.tiff +0 -0
  27. data/doc/images/note.png +0 -0
  28. data/doc/images/project-structure.png +0 -0
  29. data/doc/images/tip.png +0 -0
  30. data/doc/images/zbuildr.png +0 -0
  31. data/doc/images/zbuildr.tif +0 -0
  32. data/doc/index.textile +14 -15
  33. data/doc/mailing_lists.textile +0 -0
  34. data/doc/more_stuff.textile +54 -1
  35. data/doc/releasing.textile +17 -16
  36. data/doc/settings_profiles.textile +13 -13
  37. data/lib/buildr.rb +1 -0
  38. data/lib/buildr/core.rb +1 -0
  39. data/lib/buildr/core/application.rb +8 -3
  40. data/lib/buildr/core/checks.rb +0 -0
  41. data/lib/buildr/core/doc.rb +15 -4
  42. data/lib/buildr/core/environment.rb +0 -0
  43. data/lib/buildr/core/generate.rb +0 -0
  44. data/lib/buildr/core/help.rb +0 -0
  45. data/lib/buildr/core/progressbar.rb +0 -0
  46. data/lib/buildr/core/run.rb +43 -0
  47. data/lib/buildr/core/util.rb +21 -3
  48. data/lib/buildr/ide.rb +0 -0
  49. data/lib/buildr/ide/idea.ipr.template +0 -0
  50. data/lib/buildr/ide/idea.rb +0 -0
  51. data/lib/buildr/ide/idea7x.ipr.template +0 -0
  52. data/lib/buildr/java/doc.rb +16 -0
  53. data/lib/buildr/java/packaging.rb +9 -4
  54. data/lib/buildr/packaging.rb +0 -0
  55. data/lib/buildr/packaging/archive.rb +4 -4
  56. data/lib/buildr/packaging/artifact.rb +16 -15
  57. data/lib/buildr/packaging/artifact_search.rb +0 -0
  58. data/lib/buildr/packaging/gems.rb +0 -0
  59. data/lib/buildr/packaging/package.rb +1 -1
  60. data/lib/buildr/packaging/version_requirement.rb +0 -0
  61. data/lib/buildr/packaging/ziptask.rb +6 -4
  62. data/lib/buildr/resources/buildr.icns +0 -0
  63. data/lib/buildr/run.rb +202 -0
  64. data/lib/buildr/scala/doc.rb +18 -0
  65. data/lib/buildr/scala/tests.rb +3 -0
  66. data/lib/buildr/shell.rb +1 -1
  67. data/lib/buildr/version.rb +1 -1
  68. data/rakelib/doc.rake +23 -5
  69. data/rakelib/release.rake +0 -0
  70. data/rakelib/setup.rake +2 -2
  71. data/rakelib/stage.rake +3 -3
  72. data/spec/addon/drb_spec.rb +0 -0
  73. data/spec/core/application_spec.rb +65 -27
  74. data/spec/core/doc_spec.rb +195 -0
  75. data/spec/core/run_spec.rb +92 -0
  76. data/spec/java/compiler_spec.rb +0 -194
  77. data/spec/java/doc_spec.rb +56 -0
  78. data/spec/java/packaging_spec.rb +30 -14
  79. data/spec/java/run_spec.rb +78 -0
  80. data/spec/packaging/archive_spec.rb +20 -5
  81. data/spec/packaging/artifact_spec.rb +23 -14
  82. data/spec/packaging/packaging_helper.rb +0 -0
  83. data/spec/scala/doc_spec.rb +68 -0
  84. metadata +151 -143
File without changes
@@ -74,7 +74,6 @@ module Buildr
74
74
  # Returns the documentation tool options.
75
75
  attr_reader :options
76
76
 
77
-
78
77
  attr_reader :project # :nodoc:
79
78
 
80
79
  def initialize(*args) #:nodoc:
@@ -158,6 +157,19 @@ module Buildr
158
157
  @engine ||= guess_engine
159
158
  end
160
159
 
160
+ # :call-seq:
161
+ # engine?(clazz) => boolean
162
+ #
163
+ # Check if the underlying engine is an instance of the given class
164
+ def engine?(clazz)
165
+ begin
166
+ @engine ||= guess_engine if project.compile.language
167
+ rescue
168
+ return false
169
+ end
170
+ @engine.is_a?(clazz) if @engine
171
+ end
172
+
161
173
  # :call-seq:
162
174
  # from(*sources) => self
163
175
  #
@@ -221,15 +233,14 @@ module Buildr
221
233
  Project.local_task :doc
222
234
  end
223
235
 
224
- before_define do |project|
236
+ before_define(:doc) do |project|
225
237
  DocTask.define_task('doc').tap do |doc|
226
238
  doc.send(:associate_with, project)
227
239
  doc.into project.path_to(:target, :doc)
228
- doc.using :windowtitle=>project.comment || project.name
229
240
  end
230
241
  end
231
242
 
232
- after_define do |project|
243
+ after_define(:doc) do |project|
233
244
  project.doc.from project
234
245
  end
235
246
 
File without changes
File without changes
File without changes
File without changes
@@ -0,0 +1,43 @@
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
+ require 'buildr/run'
17
+ require 'buildr/java/commands'
18
+ require 'buildr/core/util'
19
+
20
+ module Buildr
21
+ module Run
22
+
23
+ class JavaRunner < Base
24
+ include Shell::JavaRebel
25
+
26
+ specify :name => :java, :languages => [:java, :scala, :groovy, :clojure]
27
+
28
+ def run(task)
29
+ fail "Missing :main option" unless task.options[:main]
30
+ cp = project.compile.dependencies + [project.path_to(:target, :classes)] + task.classpath
31
+ Java::Commands.java(task.options[:main], {
32
+ :properties => rebel_props(project).merge(task.options[:properties] || {}),
33
+ :classpath => cp,
34
+ :java_args => rebel_args + (task.options[:java_args] || [])
35
+ })
36
+ end
37
+ end # JavaRunnner
38
+
39
+ end
40
+ end
41
+
42
+ Buildr::Run.runners << Buildr::Run::JavaRunner
43
+
@@ -54,7 +54,7 @@ module Buildr
54
54
  def ruby(*args)
55
55
  options = Hash === args.last ? args.pop : {}
56
56
  cmd = []
57
- ruby_bin = File.normalize_path(Config::CONFIG['ruby_install_name'], Config::CONFIG['bindir'])
57
+ ruby_bin = normalize_path(Config::CONFIG['ruby_install_name'], Config::CONFIG['bindir'])
58
58
  if options.delete(:sudo) && !(win_os? || Process.uid == File.stat(ruby_bin).uid)
59
59
  cmd << 'sudo' << '-u' << "##{File.stat(ruby_bin).uid}"
60
60
  end
@@ -142,8 +142,20 @@ module Buildr
142
142
  # is not running interactively (on a tty)
143
143
  def install(*dependencies)
144
144
  raise ArgumentError, "Expected at least one argument" if dependencies.empty?
145
- remote = dependencies.map{ |dep| Gem.source_index.search(dep).last || Gem::SpecFetcher.fetcher.fetch( dep, true ).map{ |spec, source| spec }.last }
146
- not_found_deps, to_install = remote.partition { |gem| gem.is_a?(Gem::Dependency) || gem.nil? }
145
+ not_found_deps = []
146
+ to_install = []
147
+ remote = dependencies.each do |dep|
148
+ if spec = Gem.source_index.search(dep).last
149
+ # Found in local repo
150
+ to_install << spec
151
+ elsif (spec = Gem::SpecFetcher.fetcher.fetch(dep, true).map { |spec, source| spec }.last)
152
+ # Found in remote repo
153
+ to_install << spec
154
+ else
155
+ # Not found anywhere
156
+ not_found_deps << "#{dep.name} #{dep.requirement}"
157
+ end
158
+ end
147
159
  fail Gem::LoadError, "Build requires the gems #{not_found_deps.join(', ')}, which cannot be found in local or remote repository." unless not_found_deps.empty?
148
160
  uses = "This build requires the gems #{to_install.map(&:full_name).join(', ')}:"
149
161
  fail Gem::LoadError, "#{uses} to install, run Buildr interactively." unless $stdout.isatty
@@ -330,6 +342,12 @@ end
330
342
  if Buildr::Util.java_platform?
331
343
  require 'ffi'
332
344
 
345
+ # Workaround for BUILDR-535: when requiring 'ffi', JRuby defines an :error
346
+ # method with arity 0.
347
+ class Module
348
+ remove_method :error if method_defined?(:error)
349
+ end
350
+
333
351
  # Fix for BUILDR-292.
334
352
  # JRuby fails to rename a file on different devices
335
353
  # this monkey-patch wont be needed when JRUBY-3381 gets resolved.
File without changes
File without changes
File without changes
File without changes
@@ -18,6 +18,18 @@ require 'buildr/core/doc'
18
18
  module Buildr
19
19
  module Doc
20
20
 
21
+ module JavadocDefaults
22
+ include Extension
23
+
24
+ # Default javadoc -windowtitle to project's comment or name
25
+ after_define(:javadoc => :doc) do |project|
26
+ if project.doc.engine? Javadoc
27
+ options = project.doc.options
28
+ options[:windowtitle] = (project.comment || project.name) unless options[:windowtitle]
29
+ end
30
+ end
31
+ end
32
+
21
33
  # A convenient task for creating Javadocs from the project's compile task. Minimizes all
22
34
  # the hard work to calling #from and #using.
23
35
  #
@@ -65,6 +77,10 @@ module Buildr
65
77
  end
66
78
  end
67
79
  end
80
+
81
+ class Project
82
+ include JavadocDefaults
83
+ end
68
84
  end
69
85
 
70
86
  Buildr::Doc.engines << Buildr::Doc::Javadoc
@@ -56,9 +56,14 @@ module Buildr
56
56
  #
57
57
  # Parse the MANIFEST.MF entry of a ZIP (or JAR) file and return a new Manifest.
58
58
  def from_zip(file)
59
- Zip::ZipFile.open(file.to_s) do |zip|
60
- Manifest.parse zip.read('META-INF/MANIFEST.MF') rescue Manifest.new
59
+ Zip::ZipInputStream::open(file.to_s) do |zip|
60
+ while (entry = zip.get_next_entry)
61
+ if entry.name == 'META-INF/MANIFEST.MF'
62
+ return Manifest.parse zip.read
63
+ end
64
+ end
61
65
  end
66
+ Manifest.new
62
67
  end
63
68
 
64
69
  # :call-seq:
@@ -257,7 +262,7 @@ module Buildr
257
262
  @classes = []
258
263
  @libs = []
259
264
  enhance do |war|
260
- @libs.each {|lib| lib.invoke}
265
+ @libs.each {|lib| lib.invoke if lib.respond_to?(:invoke) }
261
266
  @classes.to_a.flatten.each { |classes| include classes, :as => 'WEB-INF/classes' }
262
267
  path('WEB-INF/lib').include Buildr.artifacts(@libs) unless @libs.nil? || @libs.empty?
263
268
  end
@@ -625,7 +630,7 @@ module Buildr
625
630
  selected = options[:only] ? projects(options[:only]) :
626
631
  options[:except] ? ([self] + projects - projects(options[:except])) :
627
632
  [self] + projects
628
- selected.reject { |project| project.compile.sources.empty? }.
633
+ selected.reject { |project| project.compile.sources.empty? && project.resources.target.nil? }.
629
634
  each { |project| project.package(:sources) }
630
635
  end
631
636
  end
File without changes
@@ -202,7 +202,7 @@ module Buildr
202
202
  end
203
203
 
204
204
  def include_as(source, as)
205
-
205
+
206
206
  @sources << proc { source }
207
207
  @actions << proc do |file_map|
208
208
  file = source.to_s
@@ -212,19 +212,19 @@ module Buildr
212
212
  path = rel_path.split('/')[1..-1]
213
213
  path.unshift as unless as == '.'
214
214
  dest = "#{@path}#{path.join('/')}"
215
- unless excluded?(dest)
215
+ unless excluded?(dest)
216
216
  trace "Adding #{dest}"
217
217
  file_map[dest] = file
218
218
  end
219
219
  end
220
220
  unless as == "."
221
221
  trace "Adding #{@path}#{as}/"
222
- file_map["#{@path}#{as}/"] = file #as is a folder, so the trailing / is required.
222
+ file_map["#{@path}#{as}/"] = nil # :as is a folder, so the trailing / is required.
223
223
  end
224
224
  else
225
225
  file_map["#{@path}#{as}"] = file
226
226
  end
227
-
227
+
228
228
  end
229
229
  end
230
230
  end
@@ -488,23 +488,23 @@ module Buildr
488
488
  end
489
489
 
490
490
  protected
491
-
491
+
492
492
  # :call-seq:
493
493
  # needed?
494
494
  #
495
495
  # Validates whether artifact is required to be downloaded from repository
496
496
  def needed?
497
- return true if snapshot? && File.exist?(name) && old?
498
- super
497
+ return true if snapshot? && File.exist?(name) && (update_snapshot? || old?)
498
+ super
499
499
  end
500
-
500
+
501
501
  private
502
-
502
+
503
503
  # :call-seq:
504
504
  # download_artifact
505
505
  #
506
- # Downloads artifact from given repository,
507
- # supports downloading snapshot artifact with relocation on succeed to local repository
506
+ # Downloads artifact from given repository,
507
+ # supports downloading snapshot artifact with relocation on succeed to local repository
508
508
  def download_artifact(path)
509
509
  download_file = "#{name}.#{Time.new.to_i}"
510
510
  begin
@@ -517,7 +517,7 @@ module Buildr
517
517
  File.delete(download_file) if File.exist?(download_file)
518
518
  end
519
519
  end
520
-
520
+
521
521
  # :call-seq:
522
522
  # :download_needed?
523
523
  #
@@ -529,22 +529,22 @@ module Buildr
529
529
  return false if offline? && File.exist?(name)
530
530
  return true if update_snapshot? || old?
531
531
  end
532
-
532
+
533
533
  return false
534
534
  end
535
-
535
+
536
536
  def update_snapshot?
537
537
  Buildr.application.options.update_snapshots
538
538
  end
539
-
539
+
540
540
  def offline?
541
541
  Buildr.application.options.work_offline
542
542
  end
543
-
543
+
544
544
  # :call-seq:
545
545
  # old?
546
546
  #
547
- # Checks whether existing artifact is older than period from build settings or one day
547
+ # Checks whether existing artifact is older than period from build settings or one day
548
548
  def old?
549
549
  settings = Buildr.application.settings
550
550
  time_to_be_old = settings.user[:expire_time] || settings.build[:expire_time] || 60 * 60 * 24
@@ -706,7 +706,8 @@ module Buildr
706
706
  # repositories.release_to[:password] = 'secret'
707
707
  def release_to
708
708
  unless @release_to
709
- value = Buildr.settings.user['repositories'] && Buildr.settings.user['repositories']['release_to']
709
+ value = (Buildr.settings.user['repositories'] && Buildr.settings.user['repositories']['release_to']) \
710
+ || (Buildr.settings.build['repositories'] && Buildr.settings.build['repositories']['release_to'])
710
711
  @release_to = Hash === value ? value.inject({}) { |hash, (key, value)| hash.update(key.to_sym=>value) } : { :url=>Array(value).first }
711
712
  end
712
713
  @release_to
@@ -757,7 +758,7 @@ module Buildr
757
758
  Rake::Task['rake:artifacts'].enhance [task]
758
759
  Artifact.register(task)
759
760
  unless spec[:type] == :pom
760
- Rake::Task['artifacts:sources'].enhance [task.sources_artifact]
761
+ Rake::Task['artifacts:sources'].enhance [task.sources_artifact]
761
762
  Rake::Task['artifacts:javadoc'].enhance [task.javadoc_artifact]
762
763
  end
763
764
  end
File without changes
File without changes
@@ -237,7 +237,7 @@ module Buildr
237
237
 
238
238
  def package_as_sources(file_name) #:nodoc:
239
239
  ZipTask.define_task(file_name).tap do |zip|
240
- zip.include :from=>compile.sources
240
+ zip.include :from=>[compile.sources, resources.target].compact
241
241
  end
242
242
  end
243
243
 
@@ -59,14 +59,16 @@ module Buildr
59
59
  Zip::ZipOutputStream.open name do |zip|
60
60
  seen = {}
61
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
62
+ dirname = (dir[-1..-1] =~ /\/$/) ? dir : dir + '/'
63
+ unless dir == '.' || seen[dirname]
64
+ mkpath.call File.dirname(dirname)
65
+ zip.put_next_entry(dirname, compression_level)
66
+ seen[dirname] = true
66
67
  end
67
68
  end
68
69
 
69
70
  file_map.each do |path, content|
71
+ warn "Warning: Path in zipfile #{name} contains backslash: #{path}" if path =~ /\\/
70
72
  mkpath.call File.dirname(path)
71
73
  if content.respond_to?(:call)
72
74
  zip.put_next_entry(path, compression_level)
File without changes
@@ -0,0 +1,202 @@
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
+ module Buildr
18
+ module Run
19
+ include Extension
20
+
21
+ class << self
22
+ def runners
23
+ @runners ||= []
24
+ end
25
+
26
+ def select_by_lang(lang)
27
+ fail 'Unable to define run task for nil language' if lang.nil?
28
+ runners.detect { |e| e.languages.nil? ? false : e.languages.include?(lang.to_sym) }
29
+ end
30
+
31
+ alias_method :select, :select_by_lang
32
+
33
+ def select_by_name(name)
34
+ fail 'Unable to define run task for nil' if name.nil?
35
+ runners.detect { |e| e.to_sym == name.to_sym }
36
+ end
37
+
38
+ end
39
+
40
+ # Base class for any run provider. Defines most
41
+ # common functionality (things like @lang@, @build?@ and friends).
42
+ class Base
43
+ attr_reader :project
44
+
45
+ class << self
46
+ attr_accessor :name, :languages
47
+
48
+ def specify(options)
49
+ @name ||= options[:name]
50
+ @languages ||= options[:languages]
51
+ end
52
+
53
+ def to_sym
54
+ @name ||= name.split('::').last.downcase.to_sym
55
+ end
56
+ end
57
+
58
+ def initialize(project)
59
+ @project = project
60
+ end
61
+
62
+ def build?
63
+ true
64
+ end
65
+
66
+ def launch
67
+ fail 'Not implemented'
68
+ end
69
+ end
70
+
71
+ class RunTask < Rake::Task
72
+ # Classpath dependencies.
73
+ attr_accessor :classpath
74
+
75
+ # Returns the run options.
76
+ attr_reader :options
77
+
78
+ # Returns file dependencies
79
+ attr_reader :files
80
+
81
+ attr_reader :project # :nodoc:
82
+
83
+ def initialize(*args) # :nodoc:
84
+ super
85
+ @options = {}
86
+ @classpath = []
87
+ @files = FileList[]
88
+ end
89
+
90
+ # :call-seq:
91
+ # with(*artifacts) => self
92
+ #
93
+ # Adds files and artifacts as classpath dependencies, and returns self.
94
+ def with(*specs)
95
+ @classpath |= Buildr.artifacts(specs.flatten).uniq
96
+ self
97
+ end
98
+
99
+ # :call-seq:
100
+ # using(options) => self
101
+ #
102
+ # Sets the run options from a hash and returns self.
103
+ #
104
+ # For example:
105
+ # run.using :main=>'org.example.Main'
106
+ def using(*args)
107
+ args.pop.each { |key, value| @options[key.to_sym] = value } if Hash === args.last
108
+
109
+ until args.empty?
110
+ new_runner = Run.select_by_name(args.pop)
111
+ @runner = new_runner.new(project) unless new_runner.nil?
112
+ end
113
+
114
+ self
115
+ end
116
+
117
+ # :call-seq:
118
+ # requires(*files) => self
119
+ #
120
+ # Adds additional files and directories as dependencies to the task and returns self.
121
+ # When specifying a directory, includes all files in that directory.
122
+ def requires(*files)
123
+ @files.include *files.flatten.compact
124
+ self
125
+ end
126
+
127
+ def runner
128
+ @runner ||= guess_runner
129
+ end
130
+
131
+ # :call-seq:
132
+ # runner?(clazz) => boolean
133
+ #
134
+ # Check if the underlying runner is an instance of the given class.
135
+ # If no class is supplied, simply check if runner is defined.
136
+ def runner?(clazz = nil)
137
+ begin
138
+ @runner ||= guess_runner if project.compile.language
139
+ rescue
140
+ return false
141
+ end
142
+ return !@runner.nil? unless clazz
143
+ @runner.is_a?(clazz) if @runner
144
+ end
145
+
146
+ def run
147
+ runner.run(self) if runner?
148
+ end
149
+
150
+ def prerequisites #:nodoc:
151
+ super + @files + classpath
152
+ end
153
+
154
+ private
155
+
156
+ def guess_runner
157
+ runner = Run.select project.compile.language
158
+ fail 'Unable to guess runner for project.' unless runner
159
+ runner.new project
160
+ end
161
+
162
+ def associate_with(project)
163
+ @project ||= project
164
+ end
165
+ end
166
+
167
+ first_time do
168
+ Project.local_task 'run'
169
+ end
170
+
171
+ before_define(:run => :test) do |project|
172
+ RunTask.define_task('run').tap do |run|
173
+ run.send(:associate_with, project)
174
+ run.enhance([project.compile, project.test]) do |t|
175
+ # double-enhance to execute the runner last
176
+ run.enhance { |t| t.run }
177
+ end
178
+ end
179
+ end
180
+
181
+ after_define(:run => :test) do |project|
182
+ project.run.with project.test.compile.dependencies
183
+ project.run.with project.test.compile.target if project.test.compile.target
184
+ end
185
+
186
+ # :call-seq:
187
+ # run(&block) => RunTask
188
+ #
189
+ # This method returns the project's run task. It also accepts a block to be executed
190
+ # when the run task is invoked.
191
+ def run(&block)
192
+ task('run').tap do |t|
193
+ t.enhance &block if block
194
+ end
195
+ end
196
+
197
+ end
198
+
199
+ class Project
200
+ include Run
201
+ end
202
+ end