rant 0.4.4 → 0.4.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (89) hide show
  1. data/NEWS +38 -0
  2. data/README +4 -2
  3. data/Rantfile +50 -12
  4. data/doc/examples/c_cpp/c++/problem_1_1/another_test.cpp +6 -0
  5. data/doc/examples/c_cpp/c++/problem_1_1/another_test.h +5 -0
  6. data/doc/examples/c_cpp/c++/problem_1_1/main.cpp +12 -0
  7. data/doc/examples/c_cpp/c++/problem_1_1/test.cpp +6 -0
  8. data/doc/examples/c_cpp/c++/problem_1_1/test.h +5 -0
  9. data/doc/examples/c_cpp/c++/template.rf +15 -0
  10. data/doc/examples/c_cpp/c/problem_1_1/another_test.c +6 -0
  11. data/doc/examples/c_cpp/c/problem_1_1/another_test.h +7 -0
  12. data/doc/examples/c_cpp/c/problem_1_1/main.c +12 -0
  13. data/doc/examples/c_cpp/c/problem_1_1/test.c +6 -0
  14. data/doc/examples/c_cpp/c/problem_1_1/test.h +7 -0
  15. data/doc/examples/c_cpp/c/template.rf +15 -0
  16. data/doc/examples/c_cpp/root.rant +46 -0
  17. data/doc/homepage/index.html +115 -0
  18. data/doc/homepage/rant_home.css +98 -0
  19. data/doc/rant.1 +129 -0
  20. data/doc/rant.rdoc +5 -6
  21. data/doc/rantfile.rdoc +55 -32
  22. data/doc/subdirs.rdoc +147 -0
  23. data/lib/rant.rb +47 -49
  24. data/lib/rant/coregen.rb +20 -20
  25. data/lib/rant/import.rb +63 -11
  26. data/lib/rant/import/archive.rb +47 -15
  27. data/lib/rant/import/archive/tgz.rb +1 -1
  28. data/lib/rant/import/autoclean.rb +28 -26
  29. data/lib/rant/import/c/dependencies.rb +1 -1
  30. data/lib/rant/import/directedrule.rb +1 -4
  31. data/lib/rant/import/metadata.rb +30 -7
  32. data/lib/rant/import/nodes/default.rb +67 -13
  33. data/lib/rant/import/rubypackage.rb +1 -1
  34. data/lib/rant/import/rubytest.rb +25 -19
  35. data/lib/rant/import/signedfile.rb +14 -8
  36. data/lib/rant/import/sys/more.rb +22 -0
  37. data/lib/rant/import/sys/tgz.rb +43 -0
  38. data/lib/rant/import/sys/zip.rb +42 -0
  39. data/lib/rant/node.rb +19 -13
  40. data/lib/rant/plugin/configure.rb +1 -1
  41. data/lib/rant/progress.rb +33 -0
  42. data/lib/rant/rantenv.rb +7 -7
  43. data/lib/rant/rantlib.rb +246 -256
  44. data/lib/rant/rantsys.rb +61 -22
  45. data/lib/rant/rantvar.rb +7 -9
  46. data/misc/TODO +18 -0
  47. data/misc/devel-notes +4 -1
  48. data/test/Rantfile +17 -3
  49. data/test/deprecated/README +6 -0
  50. data/test/deprecated/test_0_4_8.rb +41 -0
  51. data/test/deprecated/test_0_5_2.rb +33 -0
  52. data/test/import/md5/root.rant +9 -0
  53. data/test/import/md5/test_md5.rb +45 -0
  54. data/test/import/metadata/Rantfile +2 -2
  55. data/test/import/metadata/test_metadata.rb +2 -2
  56. data/test/import/package/test_package.rb +40 -1
  57. data/test/import/signedfile/sub1/Rantfile +1 -1
  58. data/test/import/sys/data/pkg.tgz +0 -0
  59. data/test/import/sys/data/pkg.zip +0 -0
  60. data/test/import/sys/data/pkg/bin/test +0 -0
  61. data/test/import/sys/data/pkg/bin/test.o +0 -0
  62. data/test/import/sys/data/pkg/test.c +6 -0
  63. data/test/import/sys/data/pkg/test.h +7 -0
  64. data/test/import/sys/data/pkg2.zip +0 -0
  65. data/test/import/sys/test_tgz.rb +38 -0
  66. data/test/import/sys/test_zip.rb +68 -0
  67. data/test/import/sys/tgz.rf +6 -0
  68. data/test/import/sys/zip.rf +15 -0
  69. data/test/project2/{rantfile.rb → root.rant} +0 -0
  70. data/test/project2/test_project.rb +3 -8
  71. data/test/project_rb1/{rantfile.rb → rantfile} +1 -1
  72. data/test/project_rb1/test_project_rb1.rb +3 -5
  73. data/test/rant-import/test_rant-import.rb +22 -10
  74. data/test/subdirs/sub1/Rantfile +1 -1
  75. data/test/subdirs/sub2/{rantfile.rb → rantfile} +0 -0
  76. data/test/subdirs/sub2/sub/rantfile +1 -1
  77. data/test/subdirs2/root.rant +36 -0
  78. data/test/subdirs2/sub00/sub.rant +8 -0
  79. data/test/subdirs2/sub1/sub.rant +13 -0
  80. data/test/subdirs2/test_subdirs2.rb +239 -0
  81. data/test/test_examples.rb +91 -0
  82. data/test/test_filetask.rb +51 -11
  83. data/test/test_rant_interface.rb +24 -0
  84. data/test/test_rantfile_api.rb +54 -2
  85. data/test/test_sourcenode.rb +30 -0
  86. data/test/test_sys.rb +143 -15
  87. data/test/test_task.rb +16 -22
  88. data/test/tutil.rb +22 -38
  89. metadata +67 -9
data/lib/rant/rantsys.rb CHANGED
@@ -6,6 +6,20 @@
6
6
  require 'fileutils'
7
7
  require 'rant/rantenv'
8
8
 
9
+ # Fix FileUtils::Verbose visibility issue
10
+ if RUBY_VERSION == "1.8.3"
11
+ module FileUtils
12
+ METHODS = singleton_methods - %w(private_module_function
13
+ commands options have_option? options_of collect_method)
14
+ module Verbose
15
+ class << self
16
+ public(*::FileUtils::METHODS)
17
+ end
18
+ public(*::FileUtils::METHODS)
19
+ end
20
+ end
21
+ end
22
+
9
23
  module Rant
10
24
 
11
25
  class FileList
@@ -124,17 +138,25 @@ module Rant
124
138
  end
125
139
  ##############################################################
126
140
 
141
+ if Object.method_defined? :fcall # in Ruby 1.9 like __send__
127
142
  def resolve
128
143
  @pending = false
129
- @actions.each { |action|
130
- self.send(*action)
131
- }
132
- @actions.clear
144
+ @actions.each{ |action| self.fcall(*action) }.clear
133
145
  ix = ignore_rx
134
146
  if ix
135
147
  @files.reject! { |f| f =~ ix && !@keep[f] }
136
148
  end
137
149
  end
150
+ else
151
+ def resolve
152
+ @pending = false
153
+ @actions.each{ |action| self.__send__(*action) }.clear
154
+ ix = ignore_rx
155
+ if ix
156
+ @files.reject! { |f| f =~ ix && !@keep[f] }
157
+ end
158
+ end
159
+ end
138
160
 
139
161
  def include(*patterns)
140
162
  patterns.flatten.each { |pat|
@@ -269,7 +291,7 @@ module Rant
269
291
  elems = nil
270
292
  @files.reject! { |entry|
271
293
  next if @keep[entry]
272
- elems = Sys.split_path(entry)
294
+ elems = Sys.split_all(entry)
273
295
  i = elems.index(name)
274
296
  if i
275
297
  path = File.join(*elems[0..i])
@@ -303,7 +325,7 @@ module Rant
303
325
  elems = nil
304
326
  elem = nil
305
327
  @files.reject! { |entry|
306
- elems = Sys.split_path(entry)
328
+ elems = Sys.split_all(entry)
307
329
  elems.any? { |elem|
308
330
  elem =~ /#{suffix}$/ && !@keep[entry]
309
331
  }
@@ -322,7 +344,7 @@ module Rant
322
344
  def apply_no_prefix(prefix)
323
345
  elems = elem = nil
324
346
  @files.reject! { |entry|
325
- elems = Sys.split_path(entry)
347
+ elems = Sys.split_all(entry)
326
348
  elems.any? { |elem|
327
349
  elem =~ /^#{prefix}/ && !@keep[entry]
328
350
  }
@@ -513,7 +535,7 @@ module Rant
513
535
  # We override the output method of the FileUtils module to
514
536
  # allow the Rant application to control output.
515
537
  def fu_output_message(msg) #:nodoc:
516
- ::Rant.rac.cmd_msg msg if ::Rant.rac
538
+ # direct calls through Rant::Sys are silent
517
539
  end
518
540
  private :fu_output_message
519
541
 
@@ -534,21 +556,25 @@ module Rant
534
556
  cmd_args.flatten!
535
557
  cmd = cmd_args.join(" ")
536
558
  fu_output_message cmd
559
+ success = system(*cmd_args)
537
560
  if block_given?
538
- block[system(*cmd_args), $?]
539
- else
540
- system(*cmd_args) or raise CommandError.new(cmd, $?)
561
+ block[$?]
562
+ elsif !success
563
+ raise CommandError.new(cmd, $?)
541
564
  end
542
565
  end
543
566
 
544
567
  # Run a new Ruby interpreter with the given arguments:
545
568
  # sys.ruby "install.rb"
546
569
  def ruby(*args, &block)
547
- if args.size > 1
548
- sh([Env::RUBY] + args, &block)
549
- else
550
- sh("#{Env::RUBY} #{args.first}", &block)
551
- end
570
+ if args.empty?
571
+ # The empty string argument ensures that +system+
572
+ # doesn't start a subshell but invokes ruby directly.
573
+ # The empty string argument is ignored by ruby.
574
+ sh(Env::RUBY, '', &block)
575
+ else
576
+ sh(args.unshift(Env::RUBY), &block)
577
+ end
552
578
  end
553
579
 
554
580
  # Returns a string that can be used as a valid path argument
@@ -573,15 +599,26 @@ module Rant
573
599
  end
574
600
 
575
601
  # Split a path in all elements.
576
- def split_path(path)
602
+ def split_all(path)
577
603
  base, last = File.split(path)
578
604
  return [last] if base == "." || last == "/"
579
605
  return [base, last] if base == "/"
580
- split_path(base) + [last]
606
+ split_all(base) + [last]
581
607
  end
582
608
 
609
+ def split_path(str)
610
+ str.split(Env.on_windows? ? ";" : ":")
611
+ end
612
+
583
613
  extend self
584
614
 
615
+ if RUBY_VERSION >= "1.9.0"
616
+ class << self
617
+ public(*::FileUtils::METHODS)
618
+ end
619
+ public(*::FileUtils::METHODS)
620
+ end
621
+
585
622
  end # module Sys
586
623
 
587
624
  # An instance of this class is returned from the +sys+ method in
@@ -592,9 +629,6 @@ module Rant
592
629
  class SysObject
593
630
  include Sys
594
631
 
595
- # The controlling Rant compiler.
596
- attr_reader :rac
597
-
598
632
  def initialize(rac)
599
633
  @rac = rac or
600
634
  raise ArgumentError, "controller required"
@@ -610,10 +644,15 @@ module Rant
610
644
  RacFileList.new(@rac, *patterns)
611
645
  end
612
646
 
647
+ def expand_path(path)
648
+ File.expand_path(@rac.project_to_fs_path(path))
649
+ end
650
+
613
651
  private
614
652
  # Delegates FileUtils messages to +rac+.
615
653
  def fu_output_message(cmd)
616
654
  @rac.cmd_msg cmd
617
655
  end
618
656
  end
619
- end # module Rant
657
+ end # module Rant
658
+ # this line prevents ruby 1.8.3 from crashing with: [BUG] unknown node type 0
data/lib/rant/rantvar.rb CHANGED
@@ -16,16 +16,14 @@
16
16
  # If you're looking for general info about Rant, read the
17
17
  # README[link:files/README.html].
18
18
  module Rant
19
- VERSION = '0.4.4'
19
+ VERSION = '0.4.6'
20
20
 
21
21
  # Those are the filenames for rantfiles.
22
22
  # Case matters!
23
- RANTFILES = [ "Rantfile",
24
- "rantfile",
25
- "Rantfile.rb",
26
- "rantfile.rb"
27
- ]
28
- SUB_RANTFILES = ["subrant"]
23
+ ROOT_RANTFILE = "root.rant"
24
+ SUB_RANTFILE = "sub.rant"
25
+ RANTFILES = [ "Rantfile", "rantfile", ROOT_RANTFILE ]
26
+ DEPRECATED_RANTFILES = [ "Rantfile.rb", "rantfile.rb" ]
29
27
 
30
28
  # Names of plugins and imports for which code was loaded.
31
29
  # Files that where loaded with the `import' commant are directly
@@ -39,7 +37,7 @@ module Rant
39
37
  class RantDoneException < StandardError
40
38
  end
41
39
 
42
- class RantError < StandardError
40
+ class Error < StandardError
43
41
  end
44
42
 
45
43
  # This module is a namespace for generator classes.
@@ -127,7 +125,7 @@ module Rant
127
125
 
128
126
  module RantVar
129
127
 
130
- class Error < RantError
128
+ class Error < Rant::Error
131
129
  end
132
130
 
133
131
  class ConstraintError < Error
data/misc/TODO CHANGED
@@ -1,11 +1,29 @@
1
1
 
2
2
  = TODO
3
3
 
4
+ == Update documentation with regards to resolve hooks.
5
+
6
+ The argument list for resolve hooks has changed in version 0.4.5.
7
+ A hook has to accept two arguments now, the first is the target name
8
+ and the second is the project directory the resolve action is relative
9
+ to. Previously, a resolve hook got only the target name as argument.
10
+
11
+ == Eventually replace <tt>#</tt> with another symbol.
12
+
13
+ The # symbol as reference to the project's root directory should
14
+ eventuelly get replaced with a better fitting symbol. Many shells
15
+ interpret it as comment start and thus escaping/quoting is needed if
16
+ <tt>#some_target</tt> arguments are used on the commandline. This
17
+ could get a common source of annoyance/bugs.
18
+
19
+ Favorite candidate is currently <tt>@</tt>.
20
+
4
21
  == Improve SourceNode types
5
22
 
6
23
  Currently a SourceNode can only have other SourceNodes or files as
7
24
  prerequisites. But if e.g., a header file should be autogenerated,
8
25
  this isn't sufficient anymore.
26
+ Done (0.4.5).
9
27
 
10
28
  ---
11
29
  Update
data/misc/devel-notes CHANGED
@@ -1,9 +1,12 @@
1
1
 
2
+ == Rant::Env.find_bin...
3
+ ... could honour PATHEXT on windows.
4
+
2
5
  == Task alias
3
6
  Since +alias+ is a Ruby keyword, we could use +nick+ to create task
4
7
  alises.
5
8
  Other choices: short, cut, name, label, syn, synonym, ident, term,
6
- shortcut, abbreviation
9
+ shortcut, abbreviation, link
7
10
 
8
11
  == Here docs
9
12
  Don't use here documents in the Rant sources, imports and plugins.
data/test/Rantfile CHANGED
@@ -20,11 +20,11 @@ file "version.t" do |t|
20
20
  end
21
21
 
22
22
  gen Action do
23
- rac.build "version.t"
23
+ rant.build "version.t"
24
24
  end
25
25
 
26
26
  auto_t_task = source "auto.rf"
27
- rac.abort unless auto_t_task.name == "auto.t"
27
+ rant.abort unless auto_t_task.name == "auto.t"
28
28
 
29
29
  task :clean do
30
30
  sys.rm_f %w(auto.t auto.rf version.t)
@@ -45,7 +45,7 @@ task :subdir_tmp do
45
45
  end
46
46
 
47
47
  task :build_test_t do |t|
48
- rac.build "tmp.t/test.t"
48
+ rant.build "tmp.t/test.t"
49
49
  # just ensure we're NOT in the tmp.t directory
50
50
  #STDERR.puts Dir.pwd
51
51
  test(?d, "tmp.t") or t.fail
@@ -87,4 +87,18 @@ end
87
87
 
88
88
  task :dep_on_make_files => ["make_files.t"]
89
89
 
90
+ task "print_name.t" do |t|
91
+ puts t.full_name
92
+ end
93
+
94
+ file "depends_name.t" => "print_name.t" do |t|
95
+ import "sys/more"
96
+ sys.write_to_file t.name, File.read(t.source) + "a\n"
97
+ end
98
+
99
+ task "call-make" do |t|
100
+ make "print_name.t"
101
+ puts t.full_name
102
+ end
103
+
90
104
  # vim: ft=ruby
@@ -0,0 +1,6 @@
1
+ This directory contains tests for deprecated features.
2
+
3
+ The test file names have the form test_digit_digit_digit.rb,
4
+ where the digits represent the Rant release version with which the
5
+ features tested in the file (and thus the testfile itself) will
6
+ disappear.
@@ -0,0 +1,41 @@
1
+
2
+ require 'test/unit'
3
+ require 'tutil'
4
+
5
+ $test_deprecated_dir ||= File.expand_path(File.dirname(__FILE__))
6
+
7
+ class TestDeprecated_0_4_8 < Test::Unit::TestCase
8
+ include Rant::TestUtil
9
+
10
+ def setup
11
+ Dir.chdir $test_deprecated_dir
12
+ end
13
+ def test_Rantfile_rb
14
+ in_local_temp_dir do
15
+ write_to_file "Rantfile.rb", <<-EOF
16
+ task :a do |t|
17
+ puts t.name
18
+ end
19
+ EOF
20
+ out, err = assert_rant
21
+ assert_equal("a\n", out)
22
+ assert_match(/\bWARNING\b/, err)
23
+ assert_match(/\bRantfile\.rb\b/, err)
24
+ assert_match(/\bdeprecated\b/, err)
25
+ end
26
+ end
27
+ def test_rantfile_rb
28
+ in_local_temp_dir do
29
+ write_to_file "Rantfile.rb", <<-EOF
30
+ task :a do |t|
31
+ puts t.name
32
+ end
33
+ EOF
34
+ out, err = assert_rant
35
+ assert_equal("a\n", out)
36
+ assert_match(/\bWARNING\b/, err)
37
+ assert_match(/\bRantfile\.rb\b/, err)
38
+ assert_match(/\bdeprecated\b/, err)
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,33 @@
1
+
2
+ require 'test/unit'
3
+ require 'tutil'
4
+
5
+ $test_deprecated_dir ||= File.expand_path(File.dirname(__FILE__))
6
+
7
+ class TestDeprecated_0_5_2 < Test::Unit::TestCase
8
+ include Rant::TestUtil
9
+
10
+ def setup
11
+ Dir.chdir $test_deprecated_dir
12
+ end
13
+ def test_method_rac
14
+ in_local_temp_dir do
15
+ write_to_file "root.rant", <<-EOF
16
+ import "sys/more"
17
+ file "f" do |t|
18
+ sys.write_to_file t.name, "nix"
19
+ end
20
+ task :a do
21
+ rac.build "f"
22
+ end
23
+ EOF
24
+ out, err = assert_rant("a")
25
+ assert test(?f, "f")
26
+ assert_equal "nix", File.read("f")
27
+ assert_match(/\bWARNING\b/, err)
28
+ assert_match(/\brac\b/, err)
29
+ assert_match(/\brant\b/, err)
30
+ assert_match(/\bdeprecated\b/, err)
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,9 @@
1
+
2
+ import "md5"
3
+ import "sys/more", "autoclean"
4
+
5
+ gen Rule, :t => :tt do |t|
6
+ sys.write_to_file t.name, "abc\n"
7
+ end
8
+
9
+ gen AutoClean
@@ -0,0 +1,45 @@
1
+
2
+ require 'test/unit'
3
+ require 'tutil'
4
+
5
+ $test_import_md5_dir ||= File.expand_path(File.dirname(__FILE__))
6
+
7
+ class TestImportMd5 < Test::Unit::TestCase
8
+ include Rant::TestUtil
9
+ def setup
10
+ # Ensure we run in test directory.
11
+ Dir.chdir($test_import_md5_dir)
12
+ end
13
+ def teardown
14
+ Dir.chdir($test_import_md5_dir)
15
+ Rant::Sys.rm_f Rant::FileList["**/*.rant.meta"]
16
+ Rant::Sys.rm_rf Rant::FileList["*.t", "*.tt"]
17
+ end
18
+ def test_rule_root_and_subdir
19
+ Rant::Sys.mkdir "sub.td"
20
+ Rant::Sys.touch "sub.td/a.tt"
21
+ out, err = assert_rant "sub.td/a.t"
22
+ assert err.empty?
23
+ assert_match(/\bwriting\b.*a\.t\b/, out)
24
+ out, err = assert_rant "sub.td/a.t"
25
+ assert err.empty?
26
+ assert out.empty?
27
+ Dir.chdir "sub.td"
28
+ out, err = assert_rant "-u", "a.t"
29
+ assert err.empty?
30
+ lines = out.split(/\n/)
31
+ assert(lines.size == 1)
32
+ assert(out !~ /writing|a\.t/)
33
+ Dir.chdir $test_import_md5_dir
34
+ out, err = assert_rant "sub.td/a.t"
35
+ assert err.empty?
36
+ assert out.empty?
37
+ assert_rant "autoclean"
38
+ assert !test(?e, "sub.td/a.t")
39
+ assert !test(?e, "sub.td/.rant.meta")
40
+ assert Dir["**/*.rant.meta"].empty?
41
+ ensure
42
+ Dir.chdir $test_import_md5_dir
43
+ Rant::Sys.rm_rf "sub.td"
44
+ end
45
+ end
@@ -8,9 +8,9 @@ var[:__metadata__].set("cmd", "touch a", "a")
8
8
 
9
9
  if var[:subdir]
10
10
  subdirs "sub"
11
- rac.goto "sub"
11
+ rant.goto "sub"
12
12
  p var[:__metadata__].fetch("cmd", "b", "sub")
13
- rac.goto "#"
13
+ rant.goto "@"
14
14
  else
15
15
  p var[:__metadata__].fetch("cmd", "a")
16
16
  end