buildr 1.4.2-java → 1.4.3-java

Sign up to get free protection for your applications and to get access to all the features.
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 +146 -139
@@ -0,0 +1,92 @@
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 File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helpers'))
17
+
18
+ describe Project, :run do
19
+
20
+ it 'should return the project\'s run task' do
21
+ define('foo')
22
+ project('foo').run.name.should eql('foo:run')
23
+ end
24
+
25
+ it 'should return a RunTask' do
26
+ define('foo')
27
+ project('foo').run.should be_kind_of(Run::RunTask)
28
+ end
29
+
30
+ it 'should include compile and test.compile dependencies' do
31
+ define('foo') do
32
+ compile.using(:javac).with 'group:compile:jar:1.0'
33
+ test.compile.using(:javac).with 'group:test:jar:1.0'
34
+ end
35
+ project('foo').run.classpath.should include(artifact('group:compile:jar:1.0'))
36
+ project('foo').run.classpath.should include(artifact('group:test:jar:1.0'))
37
+ end
38
+
39
+ it 'should respond to using() and return self' do
40
+ define 'foo' do
41
+ run.using(:foo=>'Fooing').should be(run)
42
+ end
43
+ end
44
+
45
+ it 'should respond to using() and accept options' do
46
+ define 'foo' do
47
+ run.using :foo=>'Fooing'
48
+ end
49
+ project('foo').run.options[:foo].should eql('Fooing')
50
+ end
51
+
52
+ it 'should select runner using run.using' do
53
+ define 'foo' do
54
+ run.using :java
55
+ end
56
+ project('foo').run.runner.should be_a(Run::JavaRunner)
57
+ end
58
+
59
+ it 'should select runner based on compile language' do
60
+ write 'src/main/java/Test.java', 'class Test {}'
61
+ define 'foo' do
62
+ # compile language detected as :java
63
+ end
64
+ project('foo').run.runner.should be_a(Run::JavaRunner)
65
+ end
66
+
67
+ it 'should depend on project''s compile and test.compile task' do
68
+ define 'foo'
69
+ project('foo').run.prerequisites.should include(project('foo').compile)
70
+ end
71
+
72
+ it 'should be local task' do
73
+ define 'foo' do
74
+ define('bar')
75
+ end
76
+ project('foo:bar').run.should_receive(:invoke_prerequisites)
77
+ project('foo:bar').run.should_receive(:run)
78
+ in_original_dir(project('foo:bar').base_dir) { task('run').invoke }
79
+ end
80
+
81
+ it 'should not recurse' do
82
+ define 'foo' do
83
+ define('bar') { run.using :java, :main => 'foo' }
84
+ end
85
+ project('foo:bar').run.should_not_receive(:invoke_prerequisites)
86
+ project('foo:bar').run.should_not_receive(:run)
87
+ project('foo').run.should_receive(:run)
88
+ project('foo').run.invoke
89
+ end
90
+
91
+ end
92
+
@@ -250,197 +250,3 @@ describe 'javac compiler options' do
250
250
  end
251
251
  end
252
252
 
253
-
254
- describe Project, '#doc' do
255
- def sources
256
- @sources ||= (1..3).map { |i| "Test#{i}" }.
257
- each { |name| write "src/main/java/foo/#{name}.java", "package foo; public class #{name}{}" }.
258
- map { |name| "src/main/java/foo/#{name}.java" }
259
- end
260
-
261
- it 'should return the project\'s Javadoc task' do
262
- define('foo') { compile.using(:javac) }
263
- project('foo').doc.name.should eql('foo:doc')
264
- end
265
-
266
- it 'should return a DocTask' do
267
- define('foo') { compile.using(:javac) }
268
- project('foo').doc.should be_kind_of(Doc::DocTask)
269
- end
270
-
271
- it 'should set target directory to target/doc' do
272
- define 'foo' do
273
- compile.using(:javac)
274
- doc.target.to_s.should point_to_path('target/doc')
275
- end
276
- end
277
-
278
- it 'should create file task for target directory' do
279
- define 'foo' do
280
- compile.using(:javac)
281
- doc.should_receive(:invoke_prerequisites)
282
- end
283
- project('foo').file('target/doc').invoke
284
- end
285
-
286
- it 'should respond to into() and return self' do
287
- define 'foo' do
288
- compile.using(:javac)
289
- doc.into('docs').should be(doc)
290
- end
291
- end
292
-
293
- it 'should respond to into() and change target directory' do
294
- define 'foo' do
295
- compile.using(:javac)
296
- doc.into('docs')
297
- doc.should_receive(:invoke_prerequisites)
298
- end
299
- file('docs').invoke
300
- end
301
-
302
- it 'should respond to from() and return self' do
303
- task = nil
304
- define('foo') { task = doc.from('srcs') }
305
- task.should be(project('foo').doc)
306
- end
307
-
308
- it 'should respond to from() and add sources' do
309
- define 'foo' do
310
- compile.using(:javac)
311
- doc.from('srcs').should be(doc)
312
- end
313
- end
314
-
315
- it 'should respond to from() and add file task' do
316
- define 'foo' do
317
- compile.using(:javac)
318
- doc.from('srcs').should be(doc)
319
- end
320
- project('foo').doc.source_files.first.should point_to_path('srcs')
321
- end
322
-
323
- it 'should respond to from() and add project\'s sources and dependencies' do
324
- write 'bar/src/main/java/Test.java'
325
- define 'foo' do
326
- compile.using(:javac)
327
- define('bar') { compile.using(:javac).with 'group:id:jar:1.0' }
328
- doc.from project('foo:bar')
329
- end
330
- project('foo').doc.source_files.first.should point_to_path('bar/src/main/java/Test.java')
331
- project('foo').doc.classpath.map(&:to_spec).should include('group:id:jar:1.0')
332
- end
333
-
334
- it 'should generate docs from project' do
335
- sources
336
- define('foo') { compile.using(:javac) }
337
- project('foo').doc.source_files.sort.should == sources.sort.map { |f| File.expand_path(f) }
338
- end
339
-
340
- it 'should include compile dependencies' do
341
- define('foo') { compile.using(:javac).with 'group:id:jar:1.0' }
342
- project('foo').doc.classpath.map(&:to_spec).should include('group:id:jar:1.0')
343
- end
344
-
345
- it 'should respond to include() and return self' do
346
- define 'foo' do
347
- compile.using(:javac)
348
- doc.include('srcs').should be(doc)
349
- end
350
- end
351
-
352
- it 'should respond to include() and add files' do
353
- included = sources.first
354
- define 'foo' do
355
- compile.using(:javac)
356
- doc.include included
357
- end
358
- project('foo').doc.source_files.should include(included)
359
- end
360
-
361
- it 'should respond to exclude() and return self' do
362
- define 'foo' do
363
- compile.using(:javac)
364
- doc.exclude('srcs').should be(doc)
365
- end
366
- end
367
-
368
- it 'should respond to exclude() and ignore files' do
369
- excluded = sources.first
370
- define 'foo' do
371
- compile.using(:javac)
372
- doc.exclude excluded
373
- end
374
- sources
375
- project('foo').doc.source_files.sort.should == sources[1..-1].map { |f| File.expand_path(f) }
376
- end
377
-
378
- it 'should respond to using() and return self' do
379
- define 'foo' do
380
- compile.using(:javac)
381
- doc.using(:windowtitle=>'Fooing').should be(doc)
382
- end
383
- end
384
-
385
- it 'should respond to using() and accept options' do
386
- define 'foo' do
387
- compile.using(:javac)
388
- doc.using :windowtitle=>'Fooing'
389
- end
390
- project('foo').doc.options[:windowtitle].should eql('Fooing')
391
- end
392
-
393
- it 'should pick -windowtitle from project name' do
394
- define 'foo' do
395
- compile.using(:javac)
396
- doc.options[:windowtitle].should eql('foo')
397
-
398
- define 'bar' do
399
- compile.using(:javac)
400
- doc.options[:windowtitle].should eql('foo:bar')
401
- end
402
- end
403
- end
404
-
405
- it 'should pick -windowtitle from project description' do
406
- desc 'My App'
407
- define 'foo' do
408
- compile.using(:javac)
409
- doc.options[:windowtitle].should eql('My App')
410
- end
411
- end
412
-
413
- it 'should produce documentation' do
414
- sources
415
- define('foo') { compile.using(:javac) }
416
- project('foo').doc.invoke
417
- (1..3).map { |i| "target/doc/foo/Test#{i}.html" }.each { |f| file(f).should exist }
418
- end
419
-
420
- it 'should fail on error' do
421
- write 'Test.java', 'class Test {}'
422
- define 'foo' do
423
- compile.using(:javac)
424
- doc.include 'Test.java'
425
- end
426
- lambda { project('foo').doc.invoke }.should raise_error(RuntimeError, /Failed to generate Javadocs/)
427
- end
428
-
429
- it 'should be local task' do
430
- define 'foo' do
431
- define('bar') { compile.using(:javac) }
432
- end
433
- project('foo:bar').doc.should_receive(:invoke_prerequisites)
434
- in_original_dir(project('foo:bar').base_dir) { task('doc').invoke }
435
- end
436
-
437
- it 'should not recurse' do
438
- define 'foo' do
439
- compile.using(:javac)
440
- define('bar') { compile.using(:javac) }
441
- end
442
- project('foo:bar').doc.should_not_receive(:invoke_prerequisites)
443
- project('foo').doc.invoke
444
- end
445
- end
446
-
@@ -0,0 +1,56 @@
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
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helpers'))
18
+
19
+ describe 'Javadoc' do
20
+ def sources
21
+ @sources ||= (1..3).map { |i| "Test#{i}" }.
22
+ each { |name| write "src/main/java/foo/#{name}.java", "package foo; public class #{name}{}" }.
23
+ map { |name| "src/main/java/foo/#{name}.java" }
24
+ end
25
+
26
+ it 'should pick -windowtitle from project name by default' do
27
+ define 'foo' do
28
+ compile.using(:javac)
29
+
30
+ define 'bar' do
31
+ compile.using(:javac)
32
+ end
33
+ end
34
+
35
+ project('foo').doc.options[:windowtitle].should eql('foo')
36
+ project('foo:bar').doc.options[:windowtitle].should eql('foo:bar')
37
+ end
38
+
39
+ it 'should pick -windowtitle from project description by default, if available' do
40
+ desc 'My App'
41
+ define 'foo' do
42
+ compile.using(:javac)
43
+ end
44
+ project('foo').doc.options[:windowtitle].should eql('My App')
45
+ end
46
+
47
+ it 'should not override explicit :windowtitle' do
48
+ define 'foo' do
49
+ compile.using(:javac)
50
+ doc.using :windowtitle => 'explicit'
51
+ end
52
+ project('foo').doc.options[:windowtitle].should eql('explicit')
53
+ end
54
+
55
+ end
56
+
@@ -567,12 +567,19 @@ describe Packaging, 'war' do
567
567
  end
568
568
 
569
569
  it 'should accept file from :libs option' do
570
+ write 'lib/foo.jar'
571
+ define('foo', :version=>'1.0') { package(:war).libs << 'lib/foo.jar' }
572
+ inspect_war { |files| files.should include('META-INF/MANIFEST.MF', 'WEB-INF/lib/foo.jar') }
573
+ end
574
+
575
+
576
+ it 'should accept artifacts from :libs option' do
570
577
  make_jars
571
578
  define('foo', :version=>'1.0') { package(:war).with(:libs=>'group:id:jar:1.0') }
572
579
  inspect_war { |files| files.should include('META-INF/MANIFEST.MF', 'WEB-INF/lib/id-1.0.jar') }
573
580
  end
574
581
 
575
- it 'should accept file from :libs option' do
582
+ it 'should accept artifacts from :libs option' do
576
583
  make_jars
577
584
  define('foo', :version=>'1.0') { package(:war).with(:libs=>['group:id:jar:1.0', 'group:id:jar:2.0']) }
578
585
  inspect_war { |files| files.should include('META-INF/MANIFEST.MF', 'WEB-INF/lib/id-1.0.jar', 'WEB-INF/lib/id-2.0.jar') }
@@ -601,25 +608,25 @@ describe Packaging, 'war' do
601
608
  define('foo', :version=>'1.0') { compile.with 'group:id:jar:1.0', 'group:id:jar:2.0' ; package(:war).exclude('**/id-2.0.jar') }
602
609
  inspect_war { |files| files.should include('META-INF/MANIFEST.MF', 'WEB-INF/lib/id-1.0.jar') }
603
610
  end
604
-
611
+
605
612
  it 'should exclude files regardless of the path where they are included, specifying target path entirely' do
606
613
  make_jars
607
614
  define('foo', :version=>'1.0') { compile.with 'group:id:jar:1.0', 'group:id:jar:2.0' ; package(:war).exclude('WEB-INF/lib/id-2.0.jar') }
608
615
  inspect_war { |files| files.should include('META-INF/MANIFEST.MF', 'WEB-INF/lib/id-1.0.jar') }
609
616
  end
610
-
611
- it 'should exclude files regardless of the path where they are included for war files' do
612
- write 'src/main/java/com/example/included/Test.java', 'package com.example.included; class Test {}'
613
- write 'src/main/java/com/example/excluded/Test.java', 'package com.example.excluded; class Test {}'
614
- define('foo', :version=>'1.0') do
615
- package(:war).enhance do |war|
617
+
618
+ it 'should exclude files regardless of the path where they are included for war files' do
619
+ write 'src/main/java/com/example/included/Test.java', 'package com.example.included; class Test {}'
620
+ write 'src/main/java/com/example/excluded/Test.java', 'package com.example.excluded; class Test {}'
621
+ define('foo', :version=>'1.0') do
622
+ package(:war).enhance do |war|
616
623
  war.exclude('WEB-INF/classes/com/example/excluded/**.class')
617
624
  end
618
- end
619
- inspect_war do |files|
620
- files.should include('WEB-INF/classes/com/example/included/Test.class')
621
- files.should_not include('WEB-INF/classes/com/example/excluded/Test.class')
622
- end
625
+ end
626
+ inspect_war do |files|
627
+ files.should include('WEB-INF/classes/com/example/included/Test.class')
628
+ files.should_not include('WEB-INF/classes/com/example/excluded/Test.class')
629
+ end
623
630
  end
624
631
 
625
632
  it 'should include only specified libraries' do
@@ -1106,11 +1113,20 @@ describe Packaging, 'sources' do
1106
1113
  end
1107
1114
  end
1108
1115
 
1109
- it 'should contain source files' do
1116
+ it 'should contain source and resource files' do
1110
1117
  write 'src/main/java/Source.java'
1118
+ write 'src/main/resources/foo.properties', 'foo=bar'
1111
1119
  define('foo', :version=>'1.0') { package(:sources) }
1112
1120
  project('foo').task('package').invoke
1113
1121
  project('foo').packages.first.should contain('Source.java')
1122
+ project('foo').packages.first.should contain('foo.properties')
1123
+ end
1124
+
1125
+ it 'should create sources jar if resources exists (but not sources)' do
1126
+ write 'src/main/resources/foo.properties', 'foo=bar'
1127
+ define('foo', :version=>'1.0') { package(:sources) }
1128
+ project('foo').package(:sources).invoke
1129
+ project('foo').packages.first.should contain('foo.properties')
1114
1130
  end
1115
1131
 
1116
1132
  it 'should be a ZipTask' do
@@ -0,0 +1,78 @@
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
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helpers'))
18
+
19
+
20
+ describe Run::JavaRunner do
21
+
22
+ it 'should fail on error' do
23
+ define 'foo' do
24
+ run.using :java, :main => 'org.example.NonExistentMain' # class doesn't exist
25
+ end
26
+ lambda { project('foo').run.invoke }.should raise_error(RuntimeError, /Failed to execute java/)
27
+ end
28
+
29
+ it 'should execute main class' do
30
+ write 'src/main/java/org/example/Main.java', <<-JAVA
31
+ package org.example;
32
+ public class Main {
33
+ public static void main(String[] args) {
34
+ System.out.println("Hello, world!");
35
+ }
36
+ }
37
+ JAVA
38
+ define 'foo' do
39
+ run.using :main => 'org.example.Main'
40
+ end
41
+ project('foo').run.prerequisites.should include(task("foo:compile"))
42
+ end
43
+
44
+ it 'should accept :main option as an array including parameters for the main class' do
45
+ define 'foo' do
46
+ run.using :java, :main => ['org.example.Main', '-t', 'input.txt']
47
+ end
48
+ Java::Commands.should_receive(:java).once.with do |*args|
49
+ args[0].should == ['org.example.Main', '-t', 'input.txt']
50
+ end
51
+ project('foo').run.invoke
52
+ end
53
+
54
+ it 'should accept :java_args and pass them to java' do
55
+ define 'foo' do
56
+ run.using :java, :main => 'foo', :java_args => ['-server']
57
+ end
58
+ Java::Commands.should_receive(:java).once.with do |*args|
59
+ args[0].should == 'foo'
60
+ args[1][:java_args].should include('-server')
61
+ end
62
+ project('foo').run.invoke
63
+ end
64
+
65
+ it 'should accept :properties and pass them as -Dproperty=value to java' do
66
+ define 'foo' do
67
+ run.using :java, :main => 'foo', :properties => { :foo => 'one', :bar => 'two' }
68
+ end
69
+ Java::Commands.should_receive(:java).once.with do |*args|
70
+ args[0].should == 'foo'
71
+ args[1][:properties][:foo].should == 'one'
72
+ args[1][:properties][:bar].should == 'two'
73
+ end
74
+ project('foo').run.invoke
75
+ end
76
+
77
+ end
78
+