rant 0.3.0

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 (64) hide show
  1. data/COPYING +504 -0
  2. data/README +203 -0
  3. data/Rantfile +104 -0
  4. data/TODO +19 -0
  5. data/bin/rant +12 -0
  6. data/bin/rant-import +12 -0
  7. data/devel-notes +50 -0
  8. data/doc/configure.rdoc +40 -0
  9. data/doc/csharp.rdoc +74 -0
  10. data/doc/rant-import.rdoc +32 -0
  11. data/doc/rant.rdoc +24 -0
  12. data/doc/rantfile.rdoc +227 -0
  13. data/doc/rubyproject.rdoc +210 -0
  14. data/lib/rant.rb +9 -0
  15. data/lib/rant/cs_compiler.rb +334 -0
  16. data/lib/rant/import.rb +291 -0
  17. data/lib/rant/import/rubydoc.rb +125 -0
  18. data/lib/rant/import/rubypackage.rb +417 -0
  19. data/lib/rant/import/rubytest.rb +97 -0
  20. data/lib/rant/plugin/README +50 -0
  21. data/lib/rant/plugin/configure.rb +345 -0
  22. data/lib/rant/plugin/csharp.rb +275 -0
  23. data/lib/rant/plugin_methods.rb +41 -0
  24. data/lib/rant/rantenv.rb +217 -0
  25. data/lib/rant/rantfile.rb +664 -0
  26. data/lib/rant/rantlib.rb +1118 -0
  27. data/lib/rant/rantsys.rb +258 -0
  28. data/lib/rant/rantvar.rb +82 -0
  29. data/rantmethods.rb +79 -0
  30. data/run_import +7 -0
  31. data/run_rant +7 -0
  32. data/setup.rb +1360 -0
  33. data/test/Rantfile +2 -0
  34. data/test/plugin/configure/Rantfile +47 -0
  35. data/test/plugin/configure/test_configure.rb +58 -0
  36. data/test/plugin/csharp/Hello.cs +10 -0
  37. data/test/plugin/csharp/Rantfile +30 -0
  38. data/test/plugin/csharp/src/A.cs +8 -0
  39. data/test/plugin/csharp/src/B.cs +8 -0
  40. data/test/plugin/csharp/test_csharp.rb +99 -0
  41. data/test/project1/Rantfile +127 -0
  42. data/test/project1/test_project.rb +203 -0
  43. data/test/project2/buildfile +14 -0
  44. data/test/project2/rantfile.rb +20 -0
  45. data/test/project2/sub1/Rantfile +12 -0
  46. data/test/project2/test_project.rb +87 -0
  47. data/test/project_rb1/README +14 -0
  48. data/test/project_rb1/bin/wgrep +5 -0
  49. data/test/project_rb1/lib/wgrep.rb +56 -0
  50. data/test/project_rb1/rantfile.rb +30 -0
  51. data/test/project_rb1/test/tc_wgrep.rb +21 -0
  52. data/test/project_rb1/test/text +3 -0
  53. data/test/project_rb1/test_project_rb1.rb +153 -0
  54. data/test/test_env.rb +47 -0
  55. data/test/test_filetask.rb +57 -0
  56. data/test/test_lighttask.rb +49 -0
  57. data/test/test_metatask.rb +29 -0
  58. data/test/test_rant_interface.rb +65 -0
  59. data/test/test_sys.rb +61 -0
  60. data/test/test_task.rb +115 -0
  61. data/test/toplevel.rf +11 -0
  62. data/test/ts_all.rb +4 -0
  63. data/test/tutil.rb +95 -0
  64. metadata +133 -0
@@ -0,0 +1,57 @@
1
+
2
+ require 'test/unit'
3
+ require 'rant/rantlib'
4
+
5
+ $test_filetask_file = File.expand_path(__FILE__)
6
+
7
+ class TestFileTask < Test::Unit::TestCase
8
+ def setup
9
+ end
10
+ def teardown
11
+ end
12
+
13
+ def test_needed_non_existent
14
+ run = false
15
+ t = Rant::FileTask.new(nil, "non_existent") { run = true }
16
+ assert(t.needed?,
17
+ "`non_existent' doesn't exist, so filetask is needed")
18
+ assert(!run,
19
+ "only FileTask#needed? was called, which shouldn't run task block")
20
+ end
21
+ def test_needed_no_dep
22
+ run = false
23
+ t = Rant.file $test_filetask_file do
24
+ run = true
25
+ end
26
+ assert(!t.needed?,
27
+ "file exists and has no prerequisite, so needed? should return false")
28
+ assert(!run)
29
+ end
30
+ def test_single_dep
31
+ tr = false
32
+ t = Rant.task :t do
33
+ tr = true
34
+ end
35
+ run = false
36
+ f = Rant.file "testfile" => :t do
37
+ run = true
38
+ end
39
+ f.invoke
40
+ assert(tr)
41
+ assert(run)
42
+ end
43
+ def test_prerequisites
44
+ Rant.file "a" do
45
+ true
46
+ end
47
+ Rant.file "b" do
48
+ true
49
+ end
50
+ f = Rant.file "c" => %w(a b) do |t|
51
+ assert_equal(t.prerequisites, %w(a b),
52
+ "prerequisites should always be an array of _strings_")
53
+ true
54
+ end
55
+ f.invoke
56
+ end
57
+ end
@@ -0,0 +1,49 @@
1
+
2
+ require 'test/unit'
3
+ require 'rant/rantlib'
4
+
5
+
6
+ class TestLightTask < Test::Unit::TestCase
7
+ def setup
8
+ @app = Rant::RantApp.new %w()
9
+ end
10
+ def teardown
11
+ end
12
+ # shortcut for Rant::LightTask.new
13
+ def lt(*args, &block)
14
+ Rant::LightTask.new(*[@app, args].flatten, &block)
15
+ end
16
+ def test_init
17
+ t = lt :tinit
18
+ assert(t.needed?,
19
+ "needed? should be true after creation without " +
20
+ "`needed' block")
21
+ assert(!t.done?)
22
+ assert_equal(t.name, "tinit",
23
+ "task name should always be a string, despite creation with symbol")
24
+ end
25
+ def test_with_blocks
26
+ run = false
27
+ nr = false
28
+ t = lt :with_blocks do |a|
29
+ a.needed {
30
+ nr = true
31
+ }
32
+ a.act do |l|
33
+ assert_equal(l, t,
34
+ "act block should get the LightTask as argument")
35
+ run = true
36
+ end
37
+ end
38
+ assert(t.needed?,
39
+ "needed block returns true")
40
+ assert(nr,
41
+ "`needed' block should have been run")
42
+ assert(t.invoke,
43
+ "invoke should return true because task was needed")
44
+ assert(run,
45
+ "task should have been run")
46
+ assert(!t.needed?,
47
+ "task shouldn't be needed? after first run")
48
+ end
49
+ end
@@ -0,0 +1,29 @@
1
+
2
+ require 'test/unit'
3
+ require 'rant/rantlib'
4
+ require 'tutil'
5
+
6
+ class TestMetaTask < Test::Unit::TestCase
7
+ def setup
8
+ @app = Rant::RantApp.new %w()
9
+ end
10
+ def teardown
11
+ end
12
+ def test_with_single_task
13
+ run = false
14
+ t = @app.task :t do run = true end
15
+ mt = MetaTask.for_task t
16
+ assert_equal(t.name, mt.name,
17
+ "MetaTask should have name of contained task(s).")
18
+ if t.needed?
19
+ assert(mt.needed?,
20
+ "MetaTask should be needed? if only contained task is needed?")
21
+ mt.invoke
22
+ assert(run,
23
+ "only contained task was needed?, so it should get invoked")
24
+ else
25
+ assert(!mt.needed?,
26
+ "MetaTask should return false from needed? because the only contained task does also.")
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,65 @@
1
+
2
+ require 'test/unit'
3
+ require 'rant'
4
+ require 'tutil'
5
+
6
+ $testDir ||= File.expand_path(File.dirname(__FILE__))
7
+
8
+ class TestRantInterface < Test::Unit::TestCase
9
+ def setup
10
+ # Ensure we run in test directory.
11
+ Dir.chdir($testDir) unless Dir.pwd == $testDir
12
+ end
13
+ def teardown
14
+ end
15
+ def test_cmd_targets
16
+ @app = RantApp.new("-f non_existent", "target", "-aforced_target")
17
+ op = capture_stderr {
18
+ assert_equal(@app.run, 1,
19
+ "Rant should fail because there is no such Rantfile.")
20
+ }
21
+ assert(op =~ /\[ERROR\]/,
22
+ "rant should print error message if -f RANTFILE not found")
23
+ assert_equal(@app.cmd_targets.size, 2,
24
+ "there were to targets given on commandline")
25
+ assert(@app.cmd_targets.include?("target"))
26
+ assert(@app.cmd_targets.include?("forced_target"))
27
+ assert(@app.cmd_targets.first == "forced_target",
28
+ "forced_target should run first")
29
+ end
30
+ def test_envvar_on_cmdline
31
+ @app = RantApp.new("VAR=VAL")
32
+ assert_equal(@app.run, 0)
33
+ assert_equal(ENV["VAR"], "VAL",
34
+ "rant should set arguments of form VAR=VAL in ENV")
35
+ end
36
+ def test_envvar_on_cmdline_lc
37
+ @app = RantApp.new("var2=val2")
38
+ assert_equal(@app.run, 0)
39
+ assert_equal(ENV["var2"], "val2",
40
+ "rant should set arguments of form var2=val2 in ENV")
41
+ end
42
+ def test_opt_targets
43
+ @app = RantApp.new("--tasks")
44
+ @app.desc 'This is a "public" target.'
45
+ @app.task :public_task
46
+ @app.task :private_task
47
+ op = capture_stdout {
48
+ assert_equal(@app.run, 0)
49
+ }
50
+ assert(op =~ /\bpublic_task\b/,
51
+ "rant -T output should contain name of described task")
52
+ assert(op !~ /private_task/,
53
+ "rant -T output shouldn't contain name of not-described task")
54
+ end
55
+ def test_opt_help
56
+ op = capture_stdout {
57
+ assert_equal(Rant.run("--help"), 0,
58
+ "rant --help should return 0")
59
+ }
60
+ assert(!op.empty?,
61
+ "rant --help should write to STDOUT")
62
+ assert(op.split("\n").size > 15,
63
+ "rant --help should print at least 16 lines to STDOUT")
64
+ end
65
+ end
data/test/test_sys.rb ADDED
@@ -0,0 +1,61 @@
1
+
2
+ require 'test/unit'
3
+ require 'rant/rantlib'
4
+ require 'tutil'
5
+
6
+ $testDir ||= File.expand_path(File.dirname(__FILE__))
7
+
8
+ class TestFileUtils < Test::Unit::TestCase
9
+ include Rant::Sys
10
+
11
+ def setup
12
+ # Ensure we run in test directory.
13
+ Dir.chdir($testDir) unless Dir.pwd == $testDir
14
+ end
15
+ def teardown
16
+ end
17
+
18
+ def test_ruby
19
+ op = capture_stdout do
20
+ ruby('-e ""') { |succ, stat|
21
+ assert(succ)
22
+ assert_equal(stat, 0)
23
+ }
24
+ end
25
+ assert(op =~ /\-e/i,
26
+ "Sys should print command with arguments to $stdout")
27
+ end
28
+ def test_split_path
29
+ pl = split_path("/home/stefan")
30
+ assert_equal(pl.size, 3,
31
+ "/home/stefan should get split into 3 parts")
32
+ assert_equal(pl[0], "/")
33
+ assert_equal(pl[1], "home")
34
+ assert_equal(pl[2], "stefan")
35
+ pl = split_path("../")
36
+ assert_equal(pl.size, 1,
37
+ '../ should be "split" into one element')
38
+ assert_equal(pl[0], "..")
39
+ end
40
+ # perhaps this test should go into a seperate file
41
+ def test_toplevel
42
+ assert_match(/\btd\b/, run_rant("-ftoplevel.rf"),
43
+ "Sys module should print commands to stdout")
44
+ assert_equal(0, $?,
45
+ "rant -ftoplevel.rf in test/ should be successfull")
46
+ ensure
47
+ File.delete "td" if File.exist? "td"
48
+ end
49
+ # ...ditto
50
+ def test_name_error
51
+ File.open("name_error.rf", "w") { |f|
52
+ f << "no_var_no_method\n"
53
+ }
54
+ out, err = capture_std do
55
+ assert_equal(1, Rant.run("-fname_error.rf"))
56
+ end
57
+ assert_match(/Name\s*Error/i, err.split("\n").first)
58
+ ensure
59
+ File.delete "name_error.rf" if File.exist? "name_error.rf"
60
+ end
61
+ end
data/test/test_task.rb ADDED
@@ -0,0 +1,115 @@
1
+
2
+ require 'test/unit'
3
+ require 'rant/rantlib'
4
+
5
+ $-w = true
6
+
7
+ class TestTask < Test::Unit::TestCase
8
+ def setup
9
+ end
10
+ def teardown
11
+ end
12
+
13
+ def test_version
14
+ assert(Rant::VERSION.length >= 5)
15
+ end
16
+
17
+ def test_needed
18
+ run = false
19
+ t = Rant::Task.new(nil, :non_existent) { run = true }
20
+ assert(t.needed?,
21
+ "Rant::Task should always be 'needed?' before first invocation")
22
+ assert(!run,
23
+ "Rant::Task shouldn't get run when 'needed?' is called")
24
+ end
25
+
26
+ def test_invoke
27
+ run = false
28
+ block = lambda { run = true }
29
+ task = Rant::Task.new(nil, :test_run, &block)
30
+ task.invoke
31
+ assert(run, "block should have been executed")
32
+ assert(task.done?, "task is done")
33
+ assert(!task.needed?,
34
+ "task is done, so 'needed?' should return false")
35
+ end
36
+
37
+ def test_fail
38
+ block = lambda { |t| t.fail "this task abortet itself" }
39
+ task = Rant::Task.new(nil, :test_fail, &block)
40
+ assert_raise(Rant::TaskFail,
41
+ "run should throw Rant::TaskFail if block raises Exception") {
42
+ task.invoke
43
+ }
44
+ assert(task.fail?)
45
+ assert(task.run?, "although task failed, it was ran")
46
+ end
47
+
48
+ def test_dependant
49
+ r1 = r2 = false
50
+ t1 = Rant::Task.new(nil, :t1) { r1 = true }
51
+ t2 = Rant::Task.new(nil, :t2) { r2 = true }
52
+ t1 << t2
53
+ t1.invoke
54
+ assert(r1)
55
+ assert(r2, "t1 depends on t2, so t2 should have been run")
56
+ assert(t1.done?)
57
+ assert(t2.done?)
58
+ assert(!t1.needed?)
59
+ assert(!t2.needed?)
60
+ end
61
+
62
+ def test_dependance_fails
63
+ t1 = Rant::Task.new(nil, :t1) { true }
64
+ t2 = Rant::Task.new(nil, :t2) { |t| t.fail }
65
+ t1 << t2
66
+ assert_raise(Rant::TaskFail,
67
+ "dependency t2 failed, so t1 should fail too") {
68
+ t1.invoke
69
+ }
70
+ assert(t1.fail?,
71
+ "fail flag should be set for task if dependency fails")
72
+ assert(t2.fail?,
73
+ "fail flag should be set for task if it fails")
74
+ end
75
+
76
+ def test_task
77
+ run = false
78
+ t = Rant.task :t do |t|
79
+ run = true
80
+ end
81
+ t.invoke
82
+ assert(run)
83
+ end
84
+
85
+ def test_dep_on_self
86
+ run = false
87
+ t = Rant.task :t => "t" do |t|
88
+ run = true
89
+ end
90
+ th = Thread.new { t.invoke }
91
+ # shouldn't take half a second...
92
+ assert_equal(th.join(0.5), th,
93
+ "task should remove dependency on itself")
94
+ assert(run,
95
+ "task should get run despite dependency on itself")
96
+ end
97
+ def test_dep_on_self_in_deplist
98
+ rl = []
99
+ t1 = Rant.task :t1 do |t|
100
+ rl << t.name
101
+ end
102
+ t2 = Rant.task :t2 do |t|
103
+ rl << t.name
104
+ end
105
+ t3 = Rant.task :t3 => [:t1, :t3, :t2] do |t|
106
+ rl << t.name
107
+ end
108
+ th = Thread.new { t3.invoke }
109
+ # shouldn't take half a second...
110
+ assert_equal(th.join(0.5), th,
111
+ "task should remove dependency on itself from dependency list")
112
+ assert_equal(rl, %w(t1 t2 t3),
113
+ "t3 was run and depends on [t1, t2] => run order: t1 t2 t3")
114
+ end
115
+ end
data/test/toplevel.rf ADDED
@@ -0,0 +1,11 @@
1
+
2
+ require 'fileutils'
3
+ include Sys
4
+
5
+ def tf fn
6
+ touch fn
7
+ end
8
+
9
+ file :td do
10
+ tf "td"
11
+ end
data/test/ts_all.rb ADDED
@@ -0,0 +1,4 @@
1
+
2
+ # assumes to be run in the test/ directory of the Rant distribution
3
+
4
+ Dir["**/test_*.rb"].each { |t| require t }
data/test/tutil.rb ADDED
@@ -0,0 +1,95 @@
1
+
2
+ # This file contains methods that aid in testing Rant.
3
+
4
+ RANT_BIN = File.expand_path(
5
+ File.join(File.dirname(__FILE__), "..", "run_rant"))
6
+
7
+ # Everything written to $stdout during +yield+ will be returned. No
8
+ # output to $stdout.
9
+ def capture_stdout
10
+ tfn = "._ranttestcstdout.tmp"
11
+ if File.exist? tfn
12
+ raise <<-EOD
13
+ When testing Rant: `#{Dir.pwd + "/" + tfn}' exists.
14
+ The testing process temporarily needs this file. Ensure that the
15
+ file doesn't contain data useful for you and try to remove it.
16
+ (Perhaps this file was left by an earlier testrun.)
17
+ EOD
18
+ end
19
+ begin
20
+ stdout = $stdout
21
+ File.open(tfn, "w") { |tf|
22
+ $stdout = tf
23
+ yield
24
+ }
25
+ o = File.read tfn
26
+ ensure
27
+ $stdout = stdout
28
+ File.delete tfn if File.exist? tfn
29
+ end
30
+ end
31
+
32
+ def capture_stderr
33
+ tfn = "._ranttestcstderr.tmp"
34
+ if File.exist? tfn
35
+ raise <<-EOD
36
+ When testing Rant: `#{Dir.pwd + "/" + tfn}' exists.
37
+ The testing process temporarily needs this file. Ensure that the
38
+ file doesn't contain data useful for you and try to remove it.
39
+ (Perhaps this file was left by an earlier testrun.)
40
+ EOD
41
+ end
42
+ begin
43
+ stderr = $stderr
44
+ File.open(tfn, "w") { |tf|
45
+ $stderr = tf
46
+ yield
47
+ }
48
+ o = File.read tfn
49
+ ensure
50
+ $stderr = stderr
51
+ File.delete tfn if File.exist? tfn
52
+ end
53
+ end
54
+
55
+ def capture_std
56
+ outfn = "._ranttestcstdout.tmp"
57
+ errfn = "._ranttestcstderr.tmp"
58
+ if File.exist? outfn
59
+ raise <<-EOD
60
+ When testing Rant: `#{Dir.pwd + "/" + outfn}' exists.
61
+ The testing process temporarily needs this file. Ensure that the
62
+ file doesn't contain data useful for you and try to remove it.
63
+ (Perhaps this file was left by an earlier testrun.)
64
+ EOD
65
+ end
66
+ if File.exist? errfn
67
+ raise <<-EOD
68
+ When testing Rant: `#{Dir.pwd + "/" + errfn}' exists.
69
+ The testing process temporarily needs this file. Ensure that the
70
+ file doesn't contain data useful for you and try to remove it.
71
+ (Perhaps this file was left by an earlier testrun.)
72
+ EOD
73
+ end
74
+ begin
75
+ stdout = $stdout
76
+ stderr = $stderr
77
+ File.open(outfn, "w") { |of|
78
+ $stdout = of
79
+ File.open(errfn, "w") { |ef|
80
+ $stderr = ef
81
+ yield
82
+ }
83
+ }
84
+ [File.read(outfn), File.read(errfn)]
85
+ ensure
86
+ $stderr = stderr
87
+ $stdout = stdout
88
+ File.delete outfn if File.exist? outfn
89
+ File.delete errfn if File.exist? errfn
90
+ end
91
+ end
92
+
93
+ def run_rant(*args)
94
+ `#{Rant::Env::RUBY} #{RANT_BIN} #{args.join(' ')}`
95
+ end