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
data/NEWS CHANGED
@@ -1,6 +1,37 @@
1
1
 
2
2
  = Rant NEWS
3
3
 
4
+ == Rant 0.5.0
5
+
6
+ Incompatible changes:
7
+ * The undocumented filelist methods +no_file+, +no_suffix+ and
8
+ +no_prefix+ require <tt>import "filelist/more"</tt> now.
9
+
10
+ Deprecated:
11
+ * The undocumented <tt>var.is</tt> method. It won't be in release
12
+ 0.5.4 and later.
13
+ * To use a (numeric) range as variable constraint, you should
14
+ explicitely <tt>import "var/numbers"</tt> now. Also explicitely
15
+ <tt>import "var/strings"</tt> to use the <tt>:String</tt>
16
+ constraint and <tt>import "var/booleans"</tt> to use the
17
+ <tt>:Bool</tt> constraint. Read <em>Constraining variables</em> in
18
+ doc/advanced.rdoc[link:files/doc/advanced_rdoc.html].
19
+
20
+ Fixes and minor improvements:
21
+ * Fix a few warnings from ruby 1.8.0/1.8.1.
22
+ * Prevent infinite rule recursion.
23
+ * Documentation for common file system operations and path
24
+ manipulation methods. Read
25
+ doc/sys.rdoc[link:files/doc/sys_rdoc.html].
26
+
27
+ New features:
28
+ * The <tt>--dry-run</tt> (<tt>-n</tt>) option for +rant+. Read
29
+ doc/rant.rdoc[link:files/doc/rant_rdoc.html].
30
+ * +Action+ takes a regular expression now. When rant looks for a
31
+ task/file that matches the regular expression, the action block will
32
+ get executed once. Read <em>More selective actions</em> in
33
+ doc/advanced.rdoc[link:files/doc/advanced_rdoc.html].
34
+
4
35
  == Rant 0.4.8
5
36
 
6
37
  Incompatible changes:
data/README CHANGED
@@ -42,7 +42,7 @@ Running rant in the directory of this file:
42
42
  will ensure that the "data" file in the "backup" directory is up to
43
43
  date.
44
44
 
45
- This document was written for version 0.4.8 of Rant. Most things
45
+ This document was written for version 0.5.0 of Rant. Most things
46
46
  described here will work for older/newer versions of Rant, but look at
47
47
  the README file in the Rant distribution you've installed for exact
48
48
  documentation of your Rant version.
@@ -90,6 +90,8 @@ Using the Configure plugin::
90
90
  read doc/configure.rdoc[link:files/doc/configure_rdoc.html]
91
91
  Compiling C#::
92
92
  read doc/csharp.rdoc[link:files/doc/csharp_rdoc.html]
93
+ Common file system operations::
94
+ read doc/sys.rdoc[link:files/doc/sys_rdoc.html]
93
95
  Upgrading::
94
96
  read the NEWS[link:files/NEWS.html] for new features, not
95
97
  backwards compatible changes and other issues.
data/Rantfile CHANGED
@@ -35,6 +35,10 @@ gen RubyPackage, "rant#{var :pkg_ext}" do |t|
35
35
  t.package_task
36
36
  end
37
37
 
38
+ task "dist-files" do
39
+ puts dist_files
40
+ end
41
+
38
42
  desc "Generate documentation."
39
43
  gen RubyDoc do |g|
40
44
  g.verbose = true
@@ -140,7 +144,7 @@ task :t180 do |t|
140
144
  # my installed testrb version doesn't work with ruby-1.8.0
141
145
  sys.cd "test"
142
146
  if var[:TEST]
143
- sys "ruby180", "-rtest/unit", "-I", sys.expand_path("@lib"),
147
+ sys "ruby180", "-w", "-rtest/unit", "-I", sys.expand_path("@lib"),
144
148
  "-I", sys.expand_path("."), var[:TEST].sub(/^test\//, '')
145
149
  else
146
150
  sys "ruby180 ts_all.rb"
@@ -213,11 +217,58 @@ task "fetch-svn-dump" do
213
217
  require 'uri'
214
218
  url = URI.parse("http://svn.berlios.de/svndumps/rant-repos.gz")
215
219
  req = Net::HTTP::Get.new(url.path)
220
+ ds = Time.now.strftime("%Y-%m-%d")
216
221
  puts "Starting download from: #{url}"
217
222
  res = Net::HTTP.start(url.host, url.port) { |http|
218
223
  http.request(req)
219
224
  }
220
- sys.write_to_file "../rant-repos.gz", res.body
225
+ sys.write_to_file "../rant-repos_#{ds}.gz", res.body
226
+ end
227
+
228
+ task "rb-stats" do
229
+ files = sys["lib/**/*.rb"]
230
+ lines = 0
231
+ code_lines = 0
232
+ files.each { |fn|
233
+ l, c = count_rb_lines(fn)
234
+ lines += l
235
+ code_lines += c
236
+ }
237
+ puts "Number of Ruby files under lib/: #{files.size}"
238
+ puts " #{lines} total lines"
239
+ puts " #{code_lines} LOC"
240
+
241
+ files.exclude(%r{^lib/rant/archive})
242
+
243
+ lines = 0
244
+ code_lines = 0
245
+ files.each { |fn|
246
+ l, c = count_rb_lines(fn)
247
+ lines += l
248
+ code_lines += c
249
+ }
250
+ puts " without lib/rant/archive/: #{files.size}"
251
+ puts " #{lines} total lines"
252
+ puts " #{code_lines} LOC"
253
+ end
254
+
255
+ def count_rb_lines(fn)
256
+ lines = 0
257
+ code_lines = 0
258
+ in_multiline_comment = false
259
+ File.readlines(fn).each { |line|
260
+ lines += 1
261
+ case line
262
+ when /=end(\s|$)/:
263
+ in_multiline_comment = false
264
+ next
265
+ when /^\s*$/, /^\s*#/: next
266
+ when /^=begin(\s|$)/
267
+ in_multiline_comment = true
268
+ end
269
+ code_lines += 1 unless in_multiline_comment
270
+ }
271
+ [lines, code_lines]
221
272
  end
222
273
 
223
274
  # vim:ft=ruby
data/doc/advanced.rdoc CHANGED
@@ -47,7 +47,7 @@ any directory/file named "CVS" or ending in ~. Examples would be:
47
47
  xy~
48
48
  src/util.c~
49
49
 
50
- === More on selecting files with the glob operator
50
+ === Selecting files with filelists
51
51
 
52
52
  The sys[] operator actually returns a _filelist_ object, which behaves
53
53
  similar to an array. There are many methods for filelist objects, here
@@ -195,6 +195,7 @@ tasks and adds them as prerequisites to the final file task.
195
195
  Rant allows you to constrain variables which are managed by the +var+
196
196
  command (and thus can be set from the commandline):
197
197
 
198
+ import "var/numbers"
198
199
  var :count, 0..10
199
200
 
200
201
  This initializes the variable +count+ to 0 and restricts it to the
@@ -221,9 +222,11 @@ And now try to set the count variable from the commandline:
221
222
 
222
223
  Other available constraints:
223
224
 
225
+ import "var/strings"
224
226
  # variable str is ensured to be a string
225
227
  var :str, :String
226
228
 
229
+ import "var/booleans"
227
230
  # variable b is a bool (always true or false)
228
231
  # can be set to "yes", "no", "1", "0", "true", "false"
229
232
  var :b, :Bool
@@ -284,6 +287,88 @@ it plain in the Rantfile.
284
287
  An Action block also won't be run when our Rantfile is read by
285
288
  rant-import.
286
289
 
290
+ === More selective actions
291
+
292
+ If a regular expression is given as argument to the Action generator,
293
+ the block will be executed the first time Rant searches for a task
294
+ matching this regular expression.
295
+
296
+ An artifical example:
297
+
298
+ import "sys/more"
299
+
300
+ gen Action, /\.t$/ do
301
+ puts "executing action for files/tasks ending in `.t'"
302
+ source "t.rant"
303
+ end
304
+
305
+ file "t.rant" do |t|
306
+ sys.write_to_file t.name, <<-EOF
307
+ task "a.t" do
308
+ puts "making a.t"
309
+ end
310
+ task "b.t" do
311
+ puts "making b.t"
312
+ end
313
+ EOF
314
+ end
315
+
316
+ task :a do
317
+ puts "making a"
318
+ end
319
+
320
+ task :default => ["a", "a.t", "b.t"]
321
+
322
+ Running rant:
323
+
324
+ % rant
325
+ making a
326
+ executing action for files/tasks ending in `.t'
327
+ writing 128 bytes to file `t.rant'
328
+ making a.t
329
+ making b.t
330
+
331
+ rant performed the following steps:
332
+
333
+ 1. Invoke task +default+
334
+
335
+ 2. Invoke first prerequisite of +default+, which happens to be +a+.
336
+
337
+ 3. Execute action block of task +a+.
338
+
339
+ Output: "making a"
340
+
341
+ 4. Search for a task for the second prerequisite of +default+, which
342
+ happens to be <tt>a.t</tt>.
343
+
344
+ 5. Since no task with the name <tt>a.t</tt> exists, it checks for a
345
+ matching action/rule. The only defined action matches, so the
346
+ action block is executed.
347
+
348
+ Output: "executing action for files/tasks ending in `.t'"
349
+
350
+ 6. The action block contains a +source+ statement, which will first
351
+ cause a build of <tt>t.rant</tt>.
352
+
353
+ Output: "writing 128 bytes to file `t.rant'"
354
+
355
+ After the build, <tt>t.rant</tt> will be read as Rantfile.
356
+
357
+ 7. The action block is done, the action is "deleted".
358
+
359
+ 8. Now, Rant finds a task with the name <tt>a.t</tt>, invokes it and
360
+ executes the associated ruby block.
361
+
362
+ Output: "making a.t"
363
+
364
+ 9. Invoke last prerequisite of +default+, which happens to be
365
+ <tt>b.t</tt> and execute the associated ruby block.
366
+
367
+ Output: "making b.t"
368
+
369
+ Generally, an action is usable to autogenerate a (bigger) set of tasks
370
+ that are needed by a subset of other tasks.
371
+
287
372
  == See also
288
373
 
289
374
  Rantfile basics::
data/doc/c.rdoc CHANGED
@@ -50,6 +50,14 @@ And a good habit would be to wrap the +source+ expression in an
50
50
  # invoked.
51
51
  gen Action do source "c_dependencies" end
52
52
 
53
+ or more selective:
54
+
55
+ gen C::Dependencies
56
+
57
+ # Do dependency checking when Rant looks at the first file
58
+ # ending in ".h" or ".c"
59
+ gen Action, /\.(h|c)$/ do source "c_dependencies" end
60
+
53
61
  For a little example project using the C::Dependency generator look
54
62
  into the doc/examples/c_dependencies[link:../examples/c_dependencies]
55
63
  directory of the Rant distribution.
@@ -90,6 +90,8 @@
90
90
  href="http://rubyforge.org/tracker/?func=add&amp;group_id=615&amp;atid=2428">Report a bug</a><br/>
91
91
  <a title="Subversion repository for Rant development"
92
92
  href="http://developer.berlios.de/svn/?group_id=5046">Repository</a><br/>
93
+ <a title="Browse source code repository."
94
+ href="http://svn.berlios.de/wsvn/rant">WebSVN</a><br/>
93
95
  </p>
94
96
  </div>
95
97
 
data/doc/rant.1 CHANGED
@@ -115,6 +115,10 @@ target.
115
115
  .TP
116
116
  --force-run TARGET -a TARGET
117
117
  Force rebuild of TARGET and all dependencies.
118
+ .TP
119
+ --dry-run -n
120
+ Print the names of the tasks that would be executed instead
121
+ of actually executing task actions.
118
122
  .TP
119
123
  --tasks -T
120
124
  Show a list of all described tasks and exit.
data/doc/rant.rdoc CHANGED
@@ -40,6 +40,44 @@ steps (roughly):
40
40
  invoked. If the "default" task doesn't exist, the first task will
41
41
  be invoked.
42
42
 
43
+ === Dry-Run
44
+
45
+ If you run rant in dry-run mode, it will print the actions it would
46
+ execute instead of actually executing them. This can be useful in
47
+ debugging your Rantfiles. To enable it, give the <tt>--dry-run</tt>,
48
+ option or its short form, <tt>-n</tt>, on the commandline.
49
+
50
+ Example Rantfile:
51
+
52
+ import "command"
53
+
54
+ task :install => "foo" do
55
+ sys.install "foo", "/usr/local/bin", :mode => 0755
56
+ end
57
+
58
+ gen Command, "foo", "foo.c", "cc -o $(>) $(<)"
59
+
60
+ Running rant in dry-run mode:
61
+
62
+ % rant -n
63
+ Executing "foo"
64
+ - SHELL
65
+ cc -o foo foo.c
66
+ Executing "install"
67
+ - Ruby Proc at Rantfile:3
68
+
69
+ Running rant in "normal" mode:
70
+
71
+ % rant
72
+ cc -o foo foo.c
73
+ install -c -m 0755 foo /usr/local/bin
74
+
75
+ Running rant in dry-run mode again:
76
+
77
+ % rant -n
78
+ Executing "install"
79
+ - Ruby Proc at Rantfile:3
80
+
43
81
  == See also
44
82
 
45
83
  Rant Overview::
@@ -83,6 +83,19 @@ Rake:
83
83
  3. The command (most probably +CFLAGS+) changed since the last build
84
84
  of +foo+.
85
85
 
86
+ * Dependency checking for C/C++ source files
87
+
88
+ import "c/dependencies"
89
+
90
+ # save dependencies between source/header files in the file
91
+ # "cdeps"; search for include files in "." and "include" dirs
92
+ gen C::Dependencies, "cdeps"
93
+ :search => [".", "include"]
94
+
95
+
96
+ # load dependency information when Rant looks at a C file
97
+ gen Action, /\.(c|h)/ do source "cdeps" end
98
+
86
99
  Some other goodies: The +make+ method, the SubFile and AutoClean
87
100
  tasks, special variables and more. Most of this is documented in
88
101
  doc/advanced.rdoc[link:files/doc/advanced_rdoc.html]