buildr 1.3.5-x86-mswin32 → 1.4.0-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 (151) hide show
  1. data/CHANGELOG +153 -8
  2. data/README.rdoc +1 -1
  3. data/addon/buildr/antlr.rb +5 -5
  4. data/addon/buildr/drb.rb +18 -18
  5. data/addon/buildr/hibernate.rb +18 -14
  6. data/addon/buildr/javacc.rb +4 -4
  7. data/addon/buildr/jetty.rb +5 -5
  8. data/addon/buildr/nailgun.rb +23 -23
  9. data/addon/buildr/openjpa.rb +1 -1
  10. data/addon/buildr/org/apache/buildr/BuildrNail$Main.class +0 -0
  11. data/addon/buildr/org/apache/buildr/BuildrNail.class +0 -0
  12. data/addon/buildr/org/apache/buildr/JettyWrapper$1.class +0 -0
  13. data/addon/buildr/org/apache/buildr/JettyWrapper$BuildrHandler.class +0 -0
  14. data/addon/buildr/org/apache/buildr/JettyWrapper.class +0 -0
  15. data/addon/buildr/protobuf.rb +75 -0
  16. data/addon/buildr/xmlbeans.rb +5 -5
  17. data/buildr.buildfile +2 -2
  18. data/buildr.gemspec +8 -7
  19. data/doc/_layouts/default.html +2 -2
  20. data/doc/artifacts.textile +4 -4
  21. data/doc/building.textile +35 -3
  22. data/doc/contributing.textile +5 -0
  23. data/doc/download.textile +16 -5
  24. data/doc/extending.textile +38 -12
  25. data/doc/installing.textile +6 -5
  26. data/doc/languages.textile +182 -42
  27. data/doc/more_stuff.textile +2 -2
  28. data/doc/packaging.textile +14 -15
  29. data/doc/projects.textile +7 -2
  30. data/doc/quick_start.textile +4 -4
  31. data/doc/scripts/buildr-git.rb +63 -63
  32. data/doc/scripts/gitflow.rb +21 -21
  33. data/doc/settings_profiles.textile +9 -2
  34. data/doc/testing.textile +16 -5
  35. data/etc/KEYS +38 -0
  36. data/lib/buildr.rb +1 -1
  37. data/lib/buildr/core.rb +1 -0
  38. data/lib/buildr/core/application.rb +33 -27
  39. data/lib/buildr/core/build.rb +41 -28
  40. data/lib/buildr/core/cc.rb +172 -0
  41. data/lib/buildr/core/checks.rb +1 -1
  42. data/lib/buildr/core/common.rb +7 -6
  43. data/lib/buildr/core/compile.rb +7 -8
  44. data/lib/buildr/core/doc.rb +263 -0
  45. data/lib/buildr/core/environment.rb +6 -6
  46. data/lib/buildr/core/filter.rb +77 -35
  47. data/lib/buildr/core/generate.rb +7 -7
  48. data/lib/buildr/core/help.rb +1 -1
  49. data/lib/buildr/core/osx.rb +6 -6
  50. data/lib/buildr/core/progressbar.rb +4 -4
  51. data/lib/buildr/core/project.rb +144 -36
  52. data/lib/buildr/core/shell.rb +34 -34
  53. data/lib/buildr/core/test.rb +89 -20
  54. data/lib/buildr/core/transports.rb +8 -7
  55. data/lib/buildr/core/util.rb +77 -23
  56. data/lib/buildr/groovy/bdd.rb +5 -5
  57. data/lib/buildr/groovy/compiler.rb +19 -15
  58. data/lib/buildr/groovy/shell.rb +6 -6
  59. data/lib/buildr/ide/eclipse.rb +148 -75
  60. data/lib/buildr/ide/eclipse/java.rb +3 -3
  61. data/lib/buildr/ide/eclipse/plugin.rb +8 -5
  62. data/lib/buildr/ide/eclipse/scala.rb +4 -2
  63. data/lib/buildr/ide/idea.rb +2 -2
  64. data/lib/buildr/ide/idea7x.rb +23 -4
  65. data/lib/buildr/java.rb +1 -0
  66. data/lib/buildr/java/ant.rb +4 -4
  67. data/lib/buildr/java/bdd.rb +51 -54
  68. data/lib/buildr/java/cobertura.rb +57 -35
  69. data/lib/buildr/java/commands.rb +14 -5
  70. data/lib/buildr/java/compiler.rb +3 -217
  71. data/lib/buildr/java/deprecated.rb +4 -4
  72. data/lib/buildr/java/doc.rb +70 -0
  73. data/lib/buildr/java/emma.rb +22 -22
  74. data/lib/buildr/java/jruby.rb +4 -4
  75. data/lib/buildr/java/jtestr_runner.rb.erb +27 -25
  76. data/lib/buildr/java/org/apache/buildr/JavaTestFilter.class +0 -0
  77. data/lib/buildr/java/org/apache/buildr/JavaTestFilter.java +8 -3
  78. data/lib/buildr/java/packaging.rb +30 -29
  79. data/lib/buildr/java/pom.rb +4 -4
  80. data/lib/buildr/java/rjb.rb +6 -6
  81. data/lib/buildr/java/test_result.rb +61 -85
  82. data/lib/buildr/java/tests.rb +44 -27
  83. data/lib/buildr/java/version_requirement.rb +8 -8
  84. data/lib/buildr/packaging/archive.rb +55 -22
  85. data/lib/buildr/packaging/artifact.rb +75 -36
  86. data/lib/buildr/packaging/artifact_namespace.rb +90 -78
  87. data/lib/buildr/packaging/artifact_search.rb +5 -5
  88. data/lib/buildr/packaging/gems.rb +11 -7
  89. data/lib/buildr/packaging/package.rb +10 -7
  90. data/lib/buildr/packaging/tar.rb +14 -14
  91. data/lib/buildr/packaging/version_requirement.rb +30 -10
  92. data/lib/buildr/packaging/ziptask.rb +51 -13
  93. data/lib/buildr/scala.rb +1 -0
  94. data/lib/buildr/scala/bdd.rb +25 -20
  95. data/lib/buildr/scala/compiler.rb +87 -40
  96. data/lib/buildr/scala/doc.rb +106 -0
  97. data/lib/buildr/scala/org/apache/buildr/SpecsSingletonRunner.class +0 -0
  98. data/lib/buildr/scala/org/apache/buildr/SpecsSingletonRunner.java +57 -0
  99. data/lib/buildr/scala/shell.rb +14 -9
  100. data/lib/buildr/scala/tests.rb +33 -26
  101. data/lib/buildr/shell.rb +33 -33
  102. data/rakelib/all-in-one.rake +113 -0
  103. data/rakelib/checks.rake +1 -1
  104. data/rakelib/doc.rake +7 -0
  105. data/rakelib/package.rake +1 -1
  106. data/rakelib/release.rake +9 -6
  107. data/rakelib/rspec.rake +26 -7
  108. data/rakelib/setup.rake +15 -3
  109. data/rakelib/stage.rake +18 -11
  110. data/spec/addon/drb_spec.rb +25 -25
  111. data/spec/core/application_spec.rb +111 -21
  112. data/spec/core/build_spec.rb +16 -15
  113. data/spec/core/cc_spec.rb +174 -0
  114. data/spec/core/checks_spec.rb +34 -34
  115. data/spec/core/common_spec.rb +51 -5
  116. data/spec/core/compile_spec.rb +89 -14
  117. data/spec/core/extension_spec.rb +127 -19
  118. data/spec/core/generate_spec.rb +2 -2
  119. data/spec/core/project_spec.rb +10 -10
  120. data/spec/core/test_spec.rb +144 -35
  121. data/spec/core/transport_spec.rb +8 -8
  122. data/spec/core/util_spec.rb +63 -5
  123. data/spec/groovy/bdd_spec.rb +5 -5
  124. data/spec/groovy/compiler_spec.rb +29 -18
  125. data/spec/ide/eclipse_spec.rb +185 -9
  126. data/spec/ide/idea7x_spec.rb +22 -10
  127. data/spec/java/ant_spec.rb +9 -5
  128. data/spec/java/bdd_spec.rb +29 -37
  129. data/spec/java/cobertura_spec.rb +12 -12
  130. data/spec/java/commands_spec.rb +34 -0
  131. data/spec/java/compiler_spec.rb +53 -53
  132. data/spec/java/emma_spec.rb +11 -11
  133. data/spec/java/java_spec.rb +10 -10
  134. data/spec/java/packaging_spec.rb +67 -20
  135. data/spec/java/test_coverage_helper.rb +18 -18
  136. data/spec/java/tests_spec.rb +13 -9
  137. data/spec/packaging/archive_spec.rb +187 -20
  138. data/spec/packaging/artifact_namespace_spec.rb +172 -83
  139. data/spec/packaging/artifact_spec.rb +83 -18
  140. data/spec/packaging/packaging_spec.rb +41 -14
  141. data/spec/sandbox.rb +23 -12
  142. data/spec/scala/bdd_spec.rb +13 -8
  143. data/spec/scala/compiler_spec.rb +18 -13
  144. data/spec/scala/scala.rb +3 -3
  145. data/spec/scala/tests_spec.rb +46 -24
  146. data/spec/spec_helpers.rb +28 -10
  147. data/spec/version_requirement_spec.rb +25 -11
  148. metadata +149 -133
  149. data/lib/buildr/scala/org/apache/buildr/SpecsSingletonRunner$.class +0 -0
  150. data/lib/buildr/scala/org/apache/buildr/SpecsSingletonRunner.scala +0 -35
  151. data/rakelib/stage.rake~ +0 -213
@@ -218,7 +218,7 @@ describe Buildr.method(:filter) do
218
218
  def source
219
219
  File.expand_path('src')
220
220
  end
221
-
221
+
222
222
  it 'should return a Filter for the source' do
223
223
  filter(source).should be_kind_of(Filter)
224
224
  end
@@ -309,6 +309,21 @@ describe Buildr::Filter do
309
309
  Dir['target/*'].sort.should eql(['target/file2', 'target/file3'])
310
310
  end
311
311
 
312
+ it 'should respond to :include with regular expressions and use these inclusion patterns' do
313
+ @filter.from('src').into('target').include(/file[2|3]/).run
314
+ Dir['target/*'].sort.should eql(['target/file2', 'target/file3'])
315
+ end
316
+
317
+ it 'should respond to :include with a Proc and use these inclusion patterns' do
318
+ @filter.from('src').into('target').include(lambda {|file| file[-1, 1].to_i%2 == 0}).run
319
+ Dir['target/*'].sort.should eql(['target/file2', 'target/file4'])
320
+ end
321
+
322
+ it 'should respond to :include with a FileTask and use these inclusion patterns' do
323
+ @filter.from('src').into('target').include(file('target/file2'), file('target/file4')).run
324
+ Dir['target/*'].sort.should eql(['target/file2', 'target/file4'])
325
+ end
326
+
312
327
  it 'should respond to :exclude and return self' do
313
328
  @filter.exclude('file').should be(@filter)
314
329
  end
@@ -318,6 +333,31 @@ describe Buildr::Filter do
318
333
  Dir['target/*'].sort.should eql(['target/file1', 'target/file4'])
319
334
  end
320
335
 
336
+ it 'should respond to :exclude with regular expressions and use these exclusion patterns' do
337
+ @filter.from('src').into('target').exclude(/file[2|3]/).run
338
+ Dir['target/*'].sort.should eql(['target/file1', 'target/file4'])
339
+ end
340
+
341
+ it 'should respond to :exclude with a Proc and use these exclusion patterns' do
342
+ @filter.from('src').into('target').exclude(lambda {|file| file[-1, 1].to_i%2 == 0}).run
343
+ Dir['target/*'].sort.should eql(['target/file1', 'target/file3'])
344
+ end
345
+
346
+ it 'should respond to :exclude with a FileTask and use these exclusion patterns' do
347
+ @filter.from('src').into('target').exclude(file('target/file1'), file('target/file3')).run
348
+ Dir['target/*'].sort.should eql(['target/file2', 'target/file4'])
349
+ end
350
+
351
+ it 'should respond to :exclude with a FileTask, use these exclusion patterns and depend on those tasks' do
352
+ file1 = false
353
+ file2 = false
354
+ @filter.from('src').into('target').exclude(file('target/file1').enhance { file1 = true }, file('target/file3').enhance {file2 = true }).run
355
+ Dir['target/*'].sort.should eql(['target/file2', 'target/file4'])
356
+ @filter.target.invoke
357
+ file1.should be_true
358
+ file2.should be_true
359
+ end
360
+
321
361
  it 'should copy files over' do
322
362
  @filter.from('src').into('target').run
323
363
  Dir['target/*'].sort.each do |file|
@@ -419,6 +459,12 @@ describe Buildr::Filter do
419
459
  @filter.using('key1'=>'value1', 'key2'=>'value2').mapper.should eql(:maven)
420
460
  end
421
461
 
462
+ it 'should apply hash mapping with boolean values' do
463
+ write "src/file", "${key1} and ${key2}"
464
+ @filter.from('src').into('target').using(:key1=>true, :key2=>false).run
465
+ read("target/file").should eql("true and false")
466
+ end
467
+
422
468
  it 'should apply hash mapping using regular expression' do
423
469
  1.upto(4) { |i| write "src/file#{i}", "file#{i} with #key1# and #key2#" }
424
470
  @filter.from('src').into('target').using(/#(.*?)#/, 'key1'=>'value1', 'key2'=>'value2').run
@@ -495,14 +541,14 @@ describe Buildr::Filter do
495
541
  end
496
542
  end
497
543
 
498
- describe Filter::Mapper do
499
-
544
+ describe Filter::Mapper do
545
+
500
546
  module MooMapper
501
547
  def moo_config(*args, &block)
502
548
  raise ArgumentError, "Expected moo block" unless block_given?
503
549
  { :moos => args, :callback => block }
504
550
  end
505
-
551
+
506
552
  def moo_transform(content, path = nil)
507
553
  content.gsub(/moo+/i) do |str|
508
554
  moos = yield :moos # same than config[:moos]
@@ -645,7 +691,7 @@ name3=double\\\\hash
645
691
  PROPS
646
692
  hash.should == {'name1'=>"with\tand", 'name2'=>"with\nand\f", 'name3'=>'double\hash'}
647
693
  end
648
-
694
+
649
695
  it 'should ignore whitespace' do
650
696
  hash = Hash.from_java_properties('name1 = value1')
651
697
  hash.should == {'name1'=>'value1'}
@@ -22,6 +22,14 @@ module CompilerHelper
22
22
  @compile_task ||= define('foo').compile.using(:javac)
23
23
  end
24
24
 
25
+ def compile_task_without_compiler
26
+ @compile_task ||= define('foo').compile
27
+ end
28
+
29
+ def file_task
30
+ @file_taks ||= define('bar').file('src')
31
+ end
32
+
25
33
  def sources
26
34
  @sources ||= ['Test1.java', 'Test2.java'].map { |f| File.join('src/main/java/thepackage', f) }.
27
35
  each { |src| write src, "package thepackage; class #{src.pathmap('%n')} {}" }
@@ -47,6 +55,10 @@ describe Buildr::CompileTask do
47
55
  compile_task.from(sources).should be(compile_task)
48
56
  end
49
57
 
58
+ it 'should respond to from() with FileTask having no compiler set and return self' do
59
+ compile_task_without_compiler.from(file_task).should be(compile_task)
60
+ end
61
+
50
62
  it 'should respond to from() and add sources' do
51
63
  compile_task.from sources, File.dirname(sources.first)
52
64
  compile_task.sources.should == sources + [File.dirname(sources.first)]
@@ -90,8 +102,17 @@ describe Buildr::CompileTask do
90
102
  lambda { define('foo') { compile.using(:unknown) } }.should raise_error(ArgumentError, /unknown compiler/i)
91
103
  end
92
104
 
93
- it 'should only allow setting the compiler once' do
94
- lambda { define('foo') { compile.using(:javac).using(:scalac) } }.should raise_error(RuntimeError, /already selected/i)
105
+ it 'should allow overriding the guessed compiler' do
106
+ write "src/main/java/com/example/Hello.java", ""
107
+ old_compiler = nil
108
+ new_compiler = nil
109
+ define('foo') {
110
+ old_compiler = compile.compiler
111
+ compile.using(:scalac)
112
+ new_compiler = compile.compiler
113
+ }
114
+ old_compiler.should == :javac
115
+ new_compiler.should == :scalac
95
116
  end
96
117
  end
97
118
 
@@ -100,7 +121,7 @@ describe Buildr::CompileTask, '#compiler' do
100
121
  it 'should be nil if no compiler identifier' do
101
122
  define('foo').compile.compiler.should be_nil
102
123
  end
103
-
124
+
104
125
  it 'should return the selected compiler' do
105
126
  define('foo') { compile.using(:javac) }
106
127
  project('foo').compile.compiler.should eql(:javac)
@@ -128,7 +149,7 @@ describe Buildr::CompileTask, '#language' do
128
149
  it 'should be nil if no compiler identifier' do
129
150
  define('foo').compile.language.should be_nil
130
151
  end
131
-
152
+
132
153
  it 'should return the appropriate language' do
133
154
  define('foo') { compile.using(:javac) }
134
155
  project('foo').compile.language.should eql(:java)
@@ -242,7 +263,7 @@ describe Buildr::CompileTask, '#options' do
242
263
  compile_task.options.foo = 'bar'
243
264
  compile_task.options.foo.should eql('bar')
244
265
  end
245
-
266
+
246
267
  it 'should have bracket accessors' do
247
268
  compile_task.options[:foo] = 'bar'
248
269
  compile_task.options[:foo].should eql('bar')
@@ -337,6 +358,15 @@ describe Buildr::CompileTask, '#invoke' do
337
358
  lambda { compile_task.from(sources).invoke }.should_not run_task('foo:compile')
338
359
  end
339
360
 
361
+ it 'should not force compilation if dependencies older than compiled' do
362
+ jars; project('jars').task("package").invoke
363
+ time = Time.now
364
+ jars.each { |jar| File.utime(time - 1 , time - 1, jar) }
365
+ sources.map { |src| File.utime(time, time, src); src.pathmap("#{compile_task.target}/thepackage/%n.class") }.
366
+ each { |kls| write kls ; File.utime(time, time, kls) }
367
+ lambda { compile_task.from(sources).with(jars).invoke }.should_not run_task('foo:compile')
368
+ end
369
+
340
370
  it 'should force compilation if dependencies newer than compiled' do
341
371
  jars; project('jars').task("package").invoke
342
372
  # On my machine the times end up the same, so need to push dependencies in the past.
@@ -348,15 +378,6 @@ describe Buildr::CompileTask, '#invoke' do
348
378
  lambda { compile_task.from(sources).with(jars).invoke }.should run_task('foo:compile')
349
379
  end
350
380
 
351
- it 'should not force compilation if dependencies older than compiled' do
352
- jars; project('jars').task("package").invoke
353
- time = Time.now
354
- jars.each { |jar| File.utime(time - 1 , time - 1, jar) }
355
- sources.map { |src| File.utime(time, time, src); src.pathmap("#{compile_task.target}/thepackage/%n.class") }.
356
- each { |kls| write kls ; File.utime(time, time, kls) }
357
- lambda { compile_task.from(sources).with(jars).invoke }.should_not run_task('foo:compile')
358
- end
359
-
360
381
  it 'should timestamp target directory if specified' do
361
382
  time = Time.now - 10
362
383
  mkpath compile_task.target.to_s
@@ -551,6 +572,31 @@ describe Project, '#resources' do
551
572
  file('target/resources/foo').should contain('Foo')
552
573
  end
553
574
 
575
+ it 'should copy new resources to target directory' do
576
+ time = Time.now
577
+ mkdir_p 'target/resources'
578
+ File.utime(time-1, time-1, 'target/resources')
579
+
580
+ write 'src/main/resources/foo', 'Foo'
581
+
582
+ define('foo')
583
+ project('foo').file('target/resources').invoke
584
+ file('target/resources/foo').should exist
585
+ end
586
+
587
+ it 'should copy updated resources to target directory' do
588
+ time = Time.now
589
+ mkdir_p 'target/resources'
590
+ write 'target/resources/foo', 'Foo'
591
+ File.utime(time-1, time-1, 'target/resources')
592
+ File.utime(time-1, time-1, 'target/resources/foo')
593
+
594
+ write 'src/main/resources/foo', 'Foo2'
595
+ define('foo')
596
+ project('foo').file('target/resources').invoke
597
+ file('target/resources/foo').should contain('Foo2')
598
+ end
599
+
554
600
  it 'should not create target directory unless there are resources' do
555
601
  define('foo').compile.invoke
556
602
  file('target/resources').should_not exist
@@ -580,4 +626,33 @@ describe Project, '#resources' do
580
626
  define('foo').compile.invoke
581
627
  file('target/resources/foo').should contain('bar')
582
628
  end
629
+
630
+ it 'should use current profile as default for filtering' do
631
+ write 'profiles.yaml', <<-YAML
632
+ development:
633
+ filter:
634
+ foo: bar
635
+ YAML
636
+ write 'src/main/resources/foo', '${foo} ${baz}'
637
+ define('foo') do
638
+ resources.filter.using 'baz' => 'qux'
639
+ end
640
+ project('foo').compile.invoke
641
+ file('target/resources/foo').should contain('bar qux')
642
+ end
643
+
644
+ it 'should allow clearing default filter mapping' do
645
+ write 'profiles.yaml', <<-YAML
646
+ development:
647
+ filter:
648
+ foo: bar
649
+ YAML
650
+ write 'src/main/resources/foo', '${foo} ${baz}'
651
+ define('foo') do
652
+ resources.filter.mapping.clear
653
+ resources.filter.using 'baz' => 'qux'
654
+ end
655
+ project('foo').compile.invoke
656
+ file('target/resources/foo').should contain('${foo} qux')
657
+ end
583
658
  end
@@ -18,17 +18,31 @@ require File.join(File.dirname(__FILE__), '../spec_helpers')
18
18
 
19
19
 
20
20
  describe Extension do
21
-
21
+
22
+ before do
23
+ @saved_modules = Project.class_eval { @extension_modules }.dup
24
+ @saved_callbacks = Project.class_eval { @global_callbacks }.dup
25
+ end
26
+
27
+ after do
28
+ modules = @saved_modules
29
+ callbacks = @saved_callbacks
30
+ Project.class_eval do
31
+ @global_callbacks = callbacks
32
+ @extension_modules = modules
33
+ end
34
+ end
35
+
22
36
  it 'should call Extension.first_time during include' do
23
37
  TestExtension.should_receive(:first_time_called).once
24
38
  class Buildr::Project
25
39
  include TestExtension
26
40
  end
27
41
  end
28
-
42
+
29
43
  it 'should call before_define and after_define in order when project is defined' do
30
44
  begin
31
- TestExtension.initialized do |extension|
45
+ TestExtension.callback do |extension|
32
46
  extension.should_receive(:before_define_called).once.ordered
33
47
  extension.should_receive(:after_define_called).once.ordered
34
48
  end
@@ -37,14 +51,14 @@ describe Extension do
37
51
  end
38
52
  define('foo')
39
53
  ensure
40
- TestExtension.initialized { |ignore| }
54
+ TestExtension.callback { |ignore| }
41
55
  end
42
56
  end
43
57
 
44
58
  it 'should call before_define and after_define for each project defined' do
45
59
  begin
46
60
  extensions = 0
47
- TestExtension.initialized do |extension|
61
+ TestExtension.callback do |extension|
48
62
  extensions += 1
49
63
  extension.should_receive(:before_define_called).once.ordered
50
64
  extension.should_receive(:after_define_called).once.ordered
@@ -55,39 +69,133 @@ describe Extension do
55
69
  define('foo')
56
70
  define('bar')
57
71
  extensions.should equal(2)
58
- ensure
59
- TestExtension.initialized { |ignore| }
72
+ ensure
73
+ TestExtension.callback { |ignore| }
74
+ end
75
+ end
76
+
77
+ it 'should call before_define callbacks in dependency order' do
78
+ class Buildr::Project
79
+ include ExtensionOneTwo
80
+ include ExtensionThreeFour
81
+ end
82
+ define('foo')
83
+ project('foo').before_order.should == [ :one, :two, :three, :four ]
84
+ project('foo').after_order.should == [ :four, :three, :two, :one ]
85
+ end
86
+
87
+ it 'should call before_define callbacks when extending project' do
88
+ define('foo') do
89
+ extend ExtensionOneTwo
90
+ extend ExtensionThreeFour
60
91
  end
92
+ project('foo').before_order.should == [ :two, :one, :four, :three ]
93
+ project('foo').after_order.should == [ :four, :three, :two, :one ]
94
+ end
95
+
96
+ it 'should raise error when including if callback dependencies cannot be satisfied' do
97
+ class Buildr::Project
98
+ include ExtensionOneTwo # missing ExtensionThreeFour
99
+ end
100
+ lambda { define('foo') }.should raise_error
101
+ end
102
+
103
+ it 'should raise error when extending if callback dependencies cannot be satisfied' do
104
+ lambda {
105
+ define('foo') do |project|
106
+ extend ExtensionOneTwo # missing ExtensionThreeFour
107
+ end
108
+ }.should raise_error
109
+ end
110
+
111
+ it 'should ignore dependencies when extending project' do
112
+ define('bar') do |project|
113
+ extend ExtensionThreeFour # missing ExtensionOneTwo
114
+ end
115
+ project('bar').before_order.should == [:four, :three]
116
+ project('bar').after_order.should == [:four, :three]
61
117
  end
62
118
  end
63
119
 
64
120
  module TestExtension
65
121
  include Extension
66
-
122
+
67
123
  def initialize(*args)
68
- # callback is used to obtain extension instance created by buildr
69
- @@initialized.call(self) if @@initialized
70
124
  super
125
+ # callback is used to obtain extension instance created by buildr
126
+ @@callback.call(self) if @@callback
71
127
  end
72
-
73
- def TestExtension.initialized(&block)
74
- @@initialized = block
128
+
129
+ def self.callback(&block)
130
+ @@callback = block
75
131
  end
76
-
132
+
77
133
  first_time do
78
- TestExtension.first_time_called()
134
+ self.first_time_called()
79
135
  end
80
-
136
+
81
137
  before_define do |project|
82
138
  project.before_define_called()
83
139
  end
84
-
140
+
85
141
  after_define do |project|
86
142
  project.after_define_called()
87
143
  end
88
144
 
89
- def TestExtension.first_time_called()
145
+ def self.first_time_called()
146
+ end
147
+
148
+ end
149
+
150
+ module BeforeAfter
151
+ def before_order
152
+ @before_order ||= []
153
+ end
154
+
155
+ def after_order
156
+ @after_order ||= []
157
+ end
158
+ end
159
+
160
+ module ExtensionOneTwo
161
+ include Extension, BeforeAfter
162
+
163
+ before_define(:two => :one) do |project|
164
+ project.before_order << :two
165
+ end
166
+
167
+ before_define(:one) do |project|
168
+ project.before_order << :one
169
+ end
170
+
171
+ after_define(:one => :two) do |project|
172
+ project.after_order << :one
173
+ end
174
+
175
+ after_define(:two => :three) do |project|
176
+ project.after_order << :two
177
+ end
178
+ end
179
+
180
+ module ExtensionThreeFour
181
+ include Extension, BeforeAfter
182
+
183
+ before_define(:three => :two)
184
+
185
+ before_define(:four => :three) do |project|
186
+ project.before_order << :four
187
+ end
188
+
189
+ before_define(:three) do |project|
190
+ project.before_order << :three
191
+ end
192
+
193
+ after_define(:three => :four) do |project|
194
+ project.after_order << :three
195
+ end
196
+
197
+ after_define(:four) do |project|
198
+ project.after_order << :four
90
199
  end
91
-
92
200
  end
93
201