rant 0.4.8 → 0.5.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 (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