rant 0.4.8 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. data/NEWS +31 -0
  2. data/README +3 -1
  3. data/Rantfile +53 -2
  4. data/doc/advanced.rdoc +86 -1
  5. data/doc/c.rdoc +8 -0
  6. data/doc/homepage/index.html +2 -0
  7. data/doc/rant.1 +4 -0
  8. data/doc/rant.rdoc +38 -0
  9. data/doc/rant_vs_rake.rdoc +13 -0
  10. data/doc/rantfile.rdoc +93 -63
  11. data/doc/sys.rdoc +568 -0
  12. data/lib/rant/coregen.rb +43 -16
  13. data/lib/rant/import/command.rb +7 -4
  14. data/lib/rant/import/filelist/more.rb +57 -0
  15. data/lib/rant/import/metadata.rb +5 -1
  16. data/lib/rant/import/nodes/default.rb +3 -24
  17. data/lib/rant/import/signedfile.rb +1 -8
  18. data/lib/rant/import/sys/more.rb +2 -1
  19. data/lib/rant/import/var/booleans.rb +65 -0
  20. data/lib/rant/import/var/lists.rb +34 -0
  21. data/lib/rant/import/var/numbers.rb +116 -0
  22. data/lib/rant/import/var/strings.rb +43 -0
  23. data/lib/rant/import.rb +19 -3
  24. data/lib/rant/node.rb +39 -6
  25. data/lib/rant/rantlib.rb +44 -8
  26. data/lib/rant/rantsys.rb +22 -54
  27. data/lib/rant/rantvar.rb +89 -256
  28. data/misc/TODO +18 -0
  29. data/misc/devel-notes +26 -1
  30. data/test/action.rant +24 -0
  31. data/test/deprecated/test_0_5_4.rb +53 -0
  32. data/test/deprecated/test_0_6_0.rb +1 -1
  33. data/test/dryrun/Rantfile +10 -0
  34. data/test/dryrun/foo.c +8 -0
  35. data/test/dryrun/test_dryrun.rb +31 -0
  36. data/test/import/c/dependencies/Rantfile +1 -1
  37. data/test/import/command/Rantfile +1 -1
  38. data/test/import/sys/test_tgz.rb +22 -0
  39. data/test/subdirs2/root.rant +11 -1
  40. data/test/subdirs2/sub1/sub.rant +3 -0
  41. data/test/subdirs2/test_subdirs2.rb +19 -0
  42. data/test/test_action.rb +75 -0
  43. data/test/test_filelist.rb +13 -10
  44. data/test/test_rant_interface.rb +2 -2
  45. data/test/test_rule.rb +121 -3
  46. data/test/test_sys_methods.rb +558 -0
  47. data/test/test_var.rb +10 -0
  48. data/test/tutil.rb +81 -8
  49. metadata +19 -2
@@ -0,0 +1,53 @@
1
+
2
+ require 'test/unit'
3
+ require 'tutil'
4
+ require 'rant/import/sys/more'
5
+
6
+ $test_deprecated_dir ||= File.expand_path(File.dirname(__FILE__))
7
+
8
+ class TestDeprecated_0_5_4 < Test::Unit::TestCase
9
+ include Rant::TestUtil
10
+
11
+ def setup
12
+ Dir.chdir $test_deprecated_dir
13
+ end
14
+ def test_autoimport_var_constraints
15
+ Rant::Sys.write_to_file "var.t", <<-EOF
16
+ var :a, :Integer
17
+ var :b, :String
18
+ var :c, :List
19
+ var :d, :Bool
20
+ task :default do
21
+ p var[:a].kind_of?(Integer)
22
+ p var[:b].kind_of?(String)
23
+ p var[:c].kind_of?(Array)
24
+ p(var[:d] == true || var[:d] == false)
25
+ end
26
+ EOF
27
+ out, err = assert_rant "-fvar.t", "a=2", "d=1"
28
+ assert_match(/import 'var\/numbers'/, err)
29
+ assert_match(/import 'var\/strings'/, err)
30
+ assert_match(/import 'var\/lists'/, err)
31
+ assert_match(/import 'var\/booleans'/, err)
32
+ lines = out.split(/\n/)
33
+ assert_equal %w(true true true true), lines
34
+ ensure
35
+ Rant::Sys.rm_f "var.t"
36
+ end
37
+ def test_var_is
38
+ Rant::Sys.write_to_file "var.t", <<-EOF
39
+ import "var/booleans"
40
+ var(:b => true).is :Bool
41
+ task :default do
42
+ p var[:b]
43
+ var[:b] = "off"
44
+ p var[:b]
45
+ end
46
+ EOF
47
+ out, err = assert_rant("-fvar.t")
48
+ assert_match(/\bvar\.t\b.*\b2\b.*var\.is.*deprecated.*0\.5\.4/m, err)
49
+ assert_equal %w(true false), out.split(/\n/)
50
+ ensure
51
+ Rant::Sys.rm_f "var.t"
52
+ end
53
+ end
@@ -15,7 +15,7 @@ class TestDeprecated_0_6_0 < Test::Unit::TestCase
15
15
  assert_equal(0, Rant::RantImport.new("-v").run)
16
16
  end
17
17
  if Rant::VERSION > "0.4.8"
18
- assert_match(/-v\bdeprecated\b.*-V.*--version\b/, err)
18
+ assert_match(/-v.*\bdeprecated\b.*-V.*--version\b/m, err)
19
19
  else
20
20
  assert err.empty?
21
21
  end
@@ -0,0 +1,10 @@
1
+
2
+ import "command"
3
+
4
+ task :install => "foo.t" do
5
+ puts "installing foo"
6
+ end
7
+
8
+ gen Command, "foo.t", "foo.c", "$[sh_echo] $(>) $(<) > $(>)"
9
+
10
+ @sh_echo = "#{sys.sp Env::RUBY_EXE} -e \"puts ARGV.join(' ')\""
data/test/dryrun/foo.c ADDED
@@ -0,0 +1,8 @@
1
+
2
+ #include <stdio.h>
3
+
4
+ int main(int argc, char** argv)
5
+ {
6
+ printf("Hello!\n");
7
+ return 0;
8
+ }
@@ -0,0 +1,31 @@
1
+
2
+ require 'test/unit'
3
+ require 'tutil'
4
+
5
+ # Ensure we run in testproject directory.
6
+ $testDryRunDir ||= File.expand_path(File.dirname(__FILE__))
7
+
8
+ class TestDryRun < Test::Unit::TestCase
9
+ include Rant::TestUtil
10
+ def setup
11
+ Dir.chdir($testDryRunDir)
12
+ end
13
+ def teardown
14
+ end
15
+ def test_default
16
+ cmd = "#{Rant::Sys.sp Rant::Env::RUBY_EXE} -e \"puts ARGV.join(' ')\" foo.t foo.c > foo.t"
17
+ out, err = assert_rant "-n"
18
+ assert err.empty?
19
+ assert !test(?e, "foo.t")
20
+ assert out !~ /installing foo/
21
+ lines = out.split(/\n/)
22
+ assert_match(/Executing.*\bfoo\.t\b/i, lines[0])
23
+ assert_match(/\s+-\s+SHELL\b/i, lines[1])
24
+ assert_match(/\s+#{Regexp.escape cmd}/, lines[2])
25
+ assert_match(/Executing.*\binstall\b/i, lines[3])
26
+ assert_match(/\s+-\s+Ruby Proc\b.*\bRantfile\b.*\b4\b/i, lines[4])
27
+ out2, err2 = assert_rant "--dry-run"
28
+ assert_equal out, out2
29
+ assert_equal err, err2
30
+ end
31
+ end
@@ -1,5 +1,5 @@
1
1
 
2
- import "c/dependencies", "autoclean"
2
+ import "var/numbers", "c/dependencies", "autoclean"
3
3
 
4
4
  var :deps, 1..3
5
5
 
@@ -1,5 +1,5 @@
1
1
 
2
- import "command", "autoclean"
2
+ import "var/strings", "var/booleans", "command", "autoclean"
3
3
 
4
4
  @ruby = Env::RUBY_EXE
5
5
  @sh_echo = "#{sys.sp Env::RUBY_EXE} -e \"puts ARGV.join(' ')\""
@@ -1,6 +1,7 @@
1
1
 
2
2
  require 'test/unit'
3
3
  require 'tutil'
4
+ require 'rant/import/sys/more'
4
5
 
5
6
  $test_import_sys_dir ||= File.expand_path(File.dirname(__FILE__))
6
7
 
@@ -31,6 +32,27 @@ class TestImportSysTgz < Test::Unit::TestCase
31
32
  actual = Rant::FileList["pkg", "pkg/**/*", "pkg/**/.*"]
32
33
  actual.shun ".", ".."
33
34
  assert_equal((files + dirs).sort, actual.sort)
35
+
36
+ # test overwriting of existing files
37
+ Rant::Sys.write_to_file "pkg/test.c", "changed!\n"
38
+
39
+ out, err = assert_rant "-ftgz.rf"
40
+ assert err.empty?
41
+ assert !out.empty?
42
+ assert out.split(/\n/).size < 3
43
+ dirs = %w(pkg pkg/bin)
44
+ files = %w(pkg/test.c pkg/test.h pkg/bin/test pkg/bin/test.o)
45
+ dirs.each { |dir|
46
+ assert test(?d, dir), "dir `#{dir}' missing"
47
+ }
48
+ files.each { |fn|
49
+ src_fn = File.join "data", fn
50
+ assert test(?f, fn), "file `#{fn}' missing"
51
+ assert Rant::Sys.compare_file(fn, src_fn), "#{fn} corrupted"
52
+ }
53
+ actual = Rant::FileList["pkg", "pkg/**/*", "pkg/**/.*"]
54
+ actual.shun ".", ".."
55
+ assert_equal((files + dirs).sort, actual.sort)
34
56
  ensure
35
57
  Rant::Sys.rm_rf "pkg"
36
58
  end
@@ -1,5 +1,8 @@
1
1
 
2
- import "autoclean", "subfile"
2
+ import "autoclean", "subfile", "command"
3
+
4
+ @sh_cat = "#{sys.sp Env::RUBY_EXE} -e \"print ARGF.read\""
5
+ @sh_puts = "#{sys.sp Env::RUBY_EXE} -e \"puts ARGV\""
3
6
 
4
7
  def define_print_task(name)
5
8
  task name do |t|
@@ -20,6 +23,13 @@ file "b.t" do |t|
20
23
  write t.name
21
24
  end
22
25
 
26
+ file "config.t" do |t|
27
+ var :config => "config\n"
28
+ write(t.name, var[:config])
29
+ end
30
+
31
+ gen Command, "c1.t", ["sub1/c1.t"], "$[sh_puts] ${<} > $(>)"
32
+
23
33
  gen SubFile, "t/t", "a.t" => "b.t" do |t|
24
34
  write(t.name, "abc")
25
35
  end
@@ -10,4 +10,7 @@ file "sub.t" => "@a.t" do |t|
10
10
  sys.cp sys.expand_path(t.source), t.name
11
11
  end
12
12
 
13
+ gen Command, "c1.t", "@config.t", "$[sh_cat] ${<} > $(>)"
14
+ gen Command, "c2.t", "@config.t", "$[sh_cat] ${prerequisites} > $(name)"
15
+
13
16
  gen Directory, "dir.t"
@@ -236,4 +236,23 @@ EOF
236
236
  assert err.empty?
237
237
  assert_equal "sub00/a", out.split(/\n/).last
238
238
  end
239
+ def test_command
240
+ out, err = assert_rant "c1.t"
241
+ assert err.empty?
242
+ assert_file_content "config.t", "config\n"
243
+ assert_file_content "sub1/c1.t", "config\n"
244
+ assert_file_content "c1.t", "sub1/c1.t\n"
245
+ out, err = assert_rant "c1.t"
246
+ assert err.empty?
247
+ assert out.empty?
248
+ end
249
+ def test_command_in_sub
250
+ Dir.chdir "sub1"
251
+ out, err = assert_rant "c2.t"
252
+ assert_file_content "../config.t", "config\n"
253
+ assert_file_content "c2.t", "config\n"
254
+ out, err = assert_rant "c2.t"
255
+ assert err.empty?
256
+ assert out.split(/\n/).size < 2
257
+ end
239
258
  end
@@ -0,0 +1,75 @@
1
+
2
+ require 'test/unit'
3
+ require 'tutil'
4
+
5
+ $testDir ||= File.expand_path(File.dirname(__FILE__))
6
+
7
+ class TestAction < Test::Unit::TestCase
8
+ include Rant::TestUtil
9
+ def setup
10
+ # Ensure we run in test directory.
11
+ Dir.chdir($testDir)
12
+ end
13
+ def teardown
14
+ Rant::Sys.rm_f Rant::FileList["*.t", "*.tt", "action.t.rant"]
15
+ end
16
+ def test_one_arg_regex
17
+ out, err = assert_rant "-faction.rant", "a.t", "b.t"
18
+ assert err.empty?
19
+ lines = out.split(/\n/)
20
+ assert_equal 4, lines.size
21
+ assert_equal 'executing action: rx /\.t$/', lines[0]
22
+ assert_match(/action\.t\.rant/, lines[1])
23
+ assert_match(/touch\s+a\.t/, lines[2])
24
+ assert_match(/touch\s+b\.t/, lines[3])
25
+ end
26
+ def test_one_arg_regex_remove_action
27
+ out, err = assert_rant :tmax_1, :fail, "-faction.rant", "a.t", "b.t", "c.t"
28
+ #assert err.empty?
29
+ lines = out.split(/\n/)
30
+ assert_equal 4, lines.size
31
+ assert_equal 'executing action: rx /\.t$/', lines[0]
32
+ assert_match(/action\.t\.rant/, lines[1])
33
+ assert_match(/touch\s+a\.t/, lines[2])
34
+ assert_match(/touch\s+b\.t/, lines[3])
35
+ end
36
+ def test_no_execute
37
+ out, err = assert_rant "-faction.rant", "b.tt"
38
+ assert err.empty?
39
+ lines = out.split(/\n/)
40
+ assert_equal 1, lines.size
41
+ assert_match(/touch\s+b\.tt/, lines[0])
42
+ out, err = assert_rant "-faction.rant", "b.tt"
43
+ assert err.empty?
44
+ assert out.empty?
45
+ end
46
+ def test_pwd
47
+ Rant::Sys.mkdir "sub.t"
48
+ Rant::Sys.write_to_file "sub.t/sub.rant", <<-EOF
49
+ task :a do
50
+ puts Dir.pwd
51
+ make "a.t" rescue nil
52
+ puts Dir.pwd
53
+ make "@a.t"
54
+ end
55
+ EOF
56
+ out, err = assert_rant "-faction.rant", "sub.t/a"
57
+ assert err !~ /ERROR/i
58
+ lines = out.split(/\n/)
59
+ assert_equal 7, lines.size
60
+ assert_match(/\bin\b/, lines[0])
61
+ subdir = File.join($testDir, "sub.t")
62
+ assert_equal(subdir, lines[1])
63
+ assert_match(/executing action: rx/, lines[2])
64
+ assert_match(/\bin\b/, lines[3])
65
+ assert_match(/action\.t\.rant/, lines[4])
66
+ assert_equal(subdir, lines[5])
67
+ assert_match(/touch\s+a\.t/, lines[6])
68
+ assert_file_content "a.t", ""
69
+ assert test(?f, "action.t.rant")
70
+ assert !test(?e, "sub.t/action.t.rant")
71
+ ensure
72
+ Dir.chdir($testDir)
73
+ Rant::Sys.rm_rf "sub.t"
74
+ end
75
+ end
@@ -160,16 +160,18 @@ class TestFileList < Test::Unit::TestCase
160
160
  end
161
161
  def test_3addition
162
162
  cx = Rant::RantApp.new.cx
163
- touch_temp %w(a.t1 a.t2 b.t2) do
164
- l1 = cx.sys["a*"]
165
- l1.exclude "*.t2"
166
- l2 = cx.sys["*.t2"]
167
- l3 = l1 + l2
168
- %w(a.t1 a.t2 b.t2).each { |fn|
169
- assert(l3.include(fn), "#{fn} missing")
170
- }
171
- l3.lazy_uniq!
172
- assert_equal(3, l3.size)
163
+ in_local_temp_dir do
164
+ touch_temp %w(a.t1 a.t2 b.t2) do
165
+ l1 = cx.sys["a*"]
166
+ l1.exclude "*.t2"
167
+ l2 = cx.sys["*.t2"]
168
+ l3 = l1 + l2
169
+ %w(a.t1 a.t2 b.t2).each { |fn|
170
+ assert(l3.include(fn), "#{fn} missing")
171
+ }
172
+ l3.lazy_uniq!
173
+ assert_equal(3, l3.size)
174
+ end
173
175
  end
174
176
  end
175
177
  def test_add_array
@@ -390,6 +392,7 @@ class TestFileList < Test::Unit::TestCase
390
392
  end
391
393
  end
392
394
  def test_no_file
395
+ require 'rant/import/filelist/more'
393
396
  cx = Rant::RantApp.new.cx
394
397
  touch_temp %w(a.t b.t) do
395
398
  fl = cx.sys["*.t"]
@@ -74,11 +74,11 @@ class TestRantInterface < Test::Unit::TestCase
74
74
  assert_equal out, out2
75
75
  end
76
76
  def test_no_such_option
77
- out, err = assert_rant :fail, "-n"
77
+ out, err = assert_rant :fail, "-N"
78
78
  assert out.empty?
79
79
  lines = err.split(/\n/)
80
80
  assert lines.size < 3
81
- assert_match(/\[ERROR\].*option.*\bn\b/, lines.first)
81
+ assert_match(/\[ERROR\].*option.*\bN\b/, lines.first)
82
82
  end
83
83
  def test_no_such_long_option
84
84
  out, err = assert_rant :fail, "--nix"
data/test/test_rule.rb CHANGED
@@ -1,13 +1,13 @@
1
1
 
2
- require 'test/unit'
3
- require 'rant/rantlib'
4
2
  require 'tutil'
5
- require 'fileutils'
3
+ require 'test/unit'
4
+ require 'rant/import/sys/more'
6
5
 
7
6
  # Ensure we run in testproject directory.
8
7
  $testDir ||= File.expand_path(File.dirname(__FILE__))
9
8
 
10
9
  class TestRule < Test::Unit::TestCase
10
+ include Rant::TestUtil
11
11
  def setup
12
12
  Dir.chdir($testDir) unless Dir.pwd == $testDir
13
13
  end
@@ -55,6 +55,124 @@ class TestRule < Test::Unit::TestCase
55
55
  assert_match(/eh\.t created/, out)
56
56
  assert(err !~ /\[WARNING\]|\[ERROR\]/)
57
57
  end
58
+ def test_rule_no_block_error
59
+ in_local_temp_dir do
60
+ write_to_file "Rantfile", <<-EOF
61
+ task :a do
62
+ puts "a"
63
+ end
64
+ gen Rule, :o => :c
65
+ EOF
66
+ out, err = assert_rant :fail
67
+ assert out.empty?
68
+ lines = err.split(/\n/)
69
+ assert lines.size < 4
70
+ assert_match(/\[ERROR\].*Rantfile\b.*\b4\b/, lines.first)
71
+ assert_match(/Rule\b.*block required\b/, lines[1])
72
+ end
73
+ end
74
+ def test_empty_extension_target
75
+ in_local_temp_dir do
76
+ Rant::Sys.write_to_file "root.rant", <<-EOF
77
+ gen Rule, "" => ".t" do |t|
78
+ sys.cp t.source, t.name
79
+ end
80
+ EOF
81
+ Rant::Sys.write_to_file "a.t", "abc\n"
82
+ out, err = assert_rant :tmax_1, "a"
83
+ assert err.empty?
84
+ assert !out.empty?
85
+ assert_file_content "a", "abc\n"
86
+ out, err = assert_rant :tmax_1, "a"
87
+ assert err.empty?
88
+ assert out.empty?
89
+ end
90
+ end
91
+ =begin
92
+ # TODO: needs change in prerequisite handling of file tasks
93
+ def test_file_hook_only_file_source
94
+ in_local_temp_dir do
95
+ Rant::Sys.write_to_file "Rantfile", <<-EOF
96
+ gen Rule, :o => :c do |t|
97
+ sys.cp t.source, t.name
98
+ end
99
+ task "a.c" do |t|
100
+ puts t.name
101
+ end
102
+ file "b.c" do |t|
103
+ sys.write_to_file t.name, "ok\n"
104
+ end
105
+ task "d.c" do |t|
106
+ puts "task for d.c"
107
+ end
108
+ file "d.c" do |t|
109
+ sys.write_to_file t.name, "ok 2\n"
110
+ end
111
+ EOF
112
+ out, err = assert_rant :fail, "a.o"
113
+ assert out.empty?
114
+ assert_match(/ERROR\b.*\ba\.o/, err)
115
+ assert !test(?e, "a.o")
116
+ out, err = assert_rant "b.o"
117
+ assert err.empty?
118
+ assert !out.empty?
119
+ assert_file_content "b.o", "ok\n"
120
+ out, err = assert_rant "d.o"
121
+ assert err.empty?
122
+ lines = out.split(/\n/)
123
+ assert_equal 1, lines.size
124
+ assert_match(/writing to file/, lines[0])
125
+ assert lines[0] =~ /task for/
126
+ out, err = assert_rant "b.o"
127
+ assert err.empty?
128
+ assert out.empty?
129
+ out, err = assert_rant "d.o"
130
+ assert err.empty?
131
+ assert out.empty?
132
+ end
133
+ end
134
+ def test_file_hook_only_file_source_md5
135
+ in_local_temp_dir do
136
+ Rant::Sys.write_to_file "Rantfile", <<-EOF
137
+ gen Rule, :o => :c do |t|
138
+ sys.cp t.source, t.name
139
+ end
140
+ task "a.c" do |t|
141
+ puts t.name
142
+ end
143
+ file "b.c" do |t|
144
+ sys.write_to_file t.name, "ok\n"
145
+ end
146
+ task "d.c" do |t|
147
+ puts "task for d.c"
148
+ end
149
+ file "d.c" do |t|
150
+ sys.write_to_file t.name, "ok 2\n"
151
+ end
152
+ EOF
153
+ out, err = assert_rant :fail, "-imd5", "a.o"
154
+ assert out.empty?
155
+ assert_match(/ERROR\b.*\ba\.o/, err)
156
+ assert !test(?e, "a.o")
157
+ out, err = assert_rant "-imd5", "b.o"
158
+ assert err.empty?
159
+ assert !out.empty?
160
+ assert_file_content "b.o", "ok\n"
161
+ out, err = assert_rant "-imd5", "d.o"
162
+ assert err.empty?
163
+ lines = out.split(/\n/)
164
+ assert_equal 1, lines.size
165
+ assert_match(/writing to file/, lines[0])
166
+ assert lines[0] =~ /task for/
167
+ out, err = assert_rant "-imd5", "b.o"
168
+ assert err.empty?
169
+ assert out.empty?
170
+ out, err = assert_rant "-imd5", "d.o"
171
+ assert err.empty?
172
+ assert out.empty?
173
+ end
174
+ end
175
+ =end
58
176
  if Rant::Env.find_bin("cc") && Rant::Env.find_bin("gcc")
59
177
  # Note: we are assuming that "cc" invokes "gcc"!
60
178
  def test_cc