ratch 0.2.2 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. data/COPYING +674 -0
  2. data/README +5 -5
  3. data/bin/lt +11 -11
  4. data/bin/ratch +3 -2
  5. data/demo/README +1 -0
  6. data/demo/WILMA +1 -0
  7. data/demo/doc/rdoc/created.rid +1 -1
  8. data/demo/doc/rdoc/files/README.html +1 -1
  9. data/demo/doc/rdoc/files/lib/foo/foo_rb.html +1 -1
  10. data/demo/doc/rdoc/index.html +3 -3
  11. data/demo/p.rb +9 -0
  12. data/demo/r.rb +6 -0
  13. data/demo/t.rb +3 -0
  14. data/demo/task/config.yaml +2 -0
  15. data/demo/{util → task}/one +0 -0
  16. data/demo/task/rdoc +88 -0
  17. data/demo/task/rdoc-old +182 -0
  18. data/demo/task/simplebuild +15 -0
  19. data/demo/task/stats +6 -0
  20. data/demo/task/task +6 -0
  21. data/demo/{util → task}/tryme +0 -0
  22. data/lib/ratch/argvutils.rb +57 -14
  23. data/lib/ratch/batch.rb +73 -21
  24. data/lib/ratch/batchable.rb +56 -26
  25. data/lib/ratch/batchfile.rb +95 -0
  26. data/lib/ratch/buildable.rb +117 -42
  27. data/lib/ratch/configutils.rb +43 -13
  28. data/lib/ratch/consoleutils.rb +76 -19
  29. data/lib/ratch/emailutils.rb +24 -0
  30. data/lib/ratch/facets/multiglob.rb +160 -0
  31. data/lib/ratch/fileutils.rb +40 -8
  32. data/lib/ratch/options.rb +43 -4
  33. data/lib/ratch/taskable.rb +48 -12
  34. data/{data/ratch/rubyproject → lib/ratch/toolset/ruby}/announce +0 -0
  35. data/lib/ratch/toolset/ruby/crosstest +305 -0
  36. data/{data/ratch/rubyproject → lib/ratch/toolset/ruby}/extest +0 -0
  37. data/{data/ratch/rubyproject → lib/ratch/toolset/ruby}/install +0 -0
  38. data/lib/ratch/toolset/ruby/isotest +293 -0
  39. data/{data/ratch/rubyproject → lib/ratch/toolset/ruby}/load +0 -0
  40. data/lib/ratch/toolset/ruby/loadtest +28 -0
  41. data/{data/ratch/rubyproject → lib/ratch/toolset/ruby}/notes +0 -0
  42. data/{data/ratch/rubyproject → lib/ratch/toolset/ruby}/publish +0 -0
  43. data/lib/ratch/toolset/ruby/rdoc +88 -0
  44. data/{data/ratch/rubyproject → lib/ratch/toolset/ruby}/setup +0 -0
  45. data/{data/ratch/rubyproject → lib/ratch/toolset/ruby}/stats +0 -0
  46. data/lib/ratch/toolset/ruby/syntax +29 -0
  47. data/lib/ratch/toolset/ruby/test +26 -0
  48. data/lib/ratch/uploadutils.rb +25 -4
  49. data/log/history.rd +10 -0
  50. data/log/recent.rd +8 -0
  51. data/log/todo.rd +2 -0
  52. data/man/ratch.man +73 -0
  53. data/meta/MANIFEST +45 -31
  54. data/meta/{RATCH-0.2.2.roll → ratch-0.2.3.roll} +3 -3
  55. data/task/clobber/package +10 -0
  56. data/task/config.yaml +4 -0
  57. data/task/man +14 -0
  58. data/task/publish +1 -1
  59. data/task/rdoc +6 -0
  60. metadata +64 -40
  61. data/LICENSE +0 -344
  62. data/data/ratch/rubyproject/rdoc +0 -42
  63. data/demo/util/conf/rdoc +0 -4
  64. data/demo/util/rdoc +0 -39
  65. data/dev/install +0 -89
  66. data/dev/install.0 +0 -49
  67. data/dev/install.1 +0 -63
  68. data/dev/ludo +0 -25
  69. data/dev/oldtaskable.rb +0 -573
  70. data/dev/taskable-simple.rb +0 -42
  71. data/dev/taskable.rb +0 -120
  72. data/lib/ratch/t.rb +0 -0
  73. data/lib/ratch/taskutils.rb +0 -41
@@ -0,0 +1,293 @@
1
+ #!/usr/bin/env ratch
2
+
3
+ #
4
+ require 'facets/hash/rekey'
5
+ require 'facets/string/tabs'
6
+ require 'facets/progressbar'
7
+
8
+ require 'test/unit/ui/testrunnermediator' #require 'test/unit'
9
+ ::Test::Unit.run = true # Don't autorun tests!
10
+
11
+ main :isotestsolid do
12
+ run_isotests
13
+ end
14
+
15
+ # Run unit-tests. Each test is run in a separate interpretor
16
+ # to prevent script clash. This makes for a more robust test
17
+ # facility and prevents potential conflicts between test scripts.
18
+ #
19
+ # tests Test files (eg. test/tc_**/*.rb) [test/**/*]
20
+ # libs Directories to include in load path.
21
+ # ('./lib' is always included)
22
+ # live Deactive use of local libs and test against install.
23
+ # reqs List of files to require prior to running tests.
24
+ # extract Extract embedded tests first? [false]
25
+ #
26
+ # To isolate tests this tool marshals test results across a
27
+ # stdout->stdin shell pipe. This prevents interfence of one
28
+ # script's tests on another. But consequently it is not always
29
+ # possible to send debug info to stdout in the tests themselves
30
+ # (eg. #p and #puts).
31
+
32
+ def run_isotests
33
+ info = configuration['test']
34
+
35
+ tests = info['files'] || 'test/unit/**/test_*.rb'
36
+ libs = info['libpath']
37
+ reqs = info['require']
38
+ live = info['live']
39
+ #extract = info['extract']
40
+
41
+ tests = [ tests ].flatten
42
+ libs = [ libs ].flatten
43
+
44
+ #files = [ @files ].flatten
45
+ #extract_tests if extract
46
+
47
+ results = TestResults.new #(style)
48
+
49
+ # get test files
50
+ test_libs = libs.join(':')
51
+ test_files = Dir.multiglob( *tests )
52
+ if test_files.empty?
53
+ puts "Tests [NONE]"
54
+ return
55
+ end
56
+
57
+ # run tests
58
+
59
+ if trace?
60
+ pbar = nil
61
+ size = test_files.collect{|f| f.size}.max + 5
62
+ dots = '.' * size
63
+ else
64
+ pbar = Console::ProgressBar.new( 'Testing', test_files.size )
65
+ pbar.inc
66
+ end
67
+
68
+ test_files.each do |test_file|
69
+ pbar.inc if pbar
70
+ if ! File.file?(test_file)
71
+ next #r = nil
72
+ else
73
+ unless pbar
74
+ print test_file + dots[test_file.size..-1]
75
+ $stdout.flush
76
+ end
77
+ r = fork_test( test_file, :libs=>libs, :reqs=>reqs, :live=>live )
78
+ unless pbar
79
+ puts r.passed? ? "[PASS]" : "[FAIL]"
80
+ end
81
+ end
82
+ results << r
83
+ end
84
+
85
+ pbar.finish if pbar
86
+
87
+ # display results
88
+ puts results
89
+
90
+ fails, errrs = results.failure_count, results.error_count
91
+ #CHECKLIST << :test if fails > 0
92
+ #CHECKLIST << :test if errrs > 0
93
+ return (fails + errrs > 0)
94
+ end
95
+
96
+ # Run a test in a separate process.
97
+ #
98
+ # Currently send program output to null device.
99
+ # Could send to a logger in future version.
100
+ #
101
+ # Key parameters are libs, reqs, live.
102
+
103
+ def fork_test( file, keys )
104
+ keys = keys.rekey(:to_s)
105
+
106
+ libs = keys['lib'] || []
107
+ reqs = keys['req'] || []
108
+ live = keys['live']
109
+
110
+ src = ''
111
+
112
+ unless live
113
+ l = File.join( Dir.pwd, 'lib' )
114
+ if File.directory?( l )
115
+ src << %{$:.unshift('#{l}')\n}
116
+ end
117
+ libs.each { |r| src << %{$:.unshift('#{r}')\n} }
118
+ end
119
+
120
+ src << %{
121
+ #require 'test/unit'
122
+ require 'test/unit/collector'
123
+ require 'test/unit/collector/objectspace'
124
+ require 'test/unit/ui/testrunnermediator'
125
+ }
126
+
127
+ reqs.each do |fix|
128
+ src << %Q{
129
+ require '#{fix}'
130
+ }
131
+ end
132
+
133
+ src << %{
134
+ def warn(*null); end # silence warnings
135
+
136
+ output = STDOUT.dup
137
+ STDOUT.reopen( PLATFORM =~ /mswin/ ? "NUL" : "/dev/null" )
138
+
139
+ load('#{file}')
140
+ tests = Test::Unit::Collector::ObjectSpace.new.collect
141
+ runner = Test::Unit::UI::TestRunnerMediator.new( tests )
142
+ result = runner.run_suite
143
+
144
+ begin
145
+ marshalled = Marshal.dump(result)
146
+ rescue TypeError => e
147
+ $stderr << "MARSHAL ERROR\n"
148
+ $stderr << "TEST: #{file}\n"
149
+ $stderr << "DATA:" << result.inspect
150
+ exit -1
151
+ end
152
+ output << marshalled
153
+
154
+ STDOUT.reopen(output)
155
+ output.close
156
+ }
157
+
158
+ result = IO.popen("ruby","w+") do |ruby|
159
+ ruby.puts src
160
+ ruby.close_write
161
+ ruby.read
162
+ end
163
+
164
+ begin
165
+ marsh = Marshal.load(result)
166
+ rescue ArgumentError
167
+ $stderr << "\nCannot load marshalled test data.\n"
168
+ $stderr << result << "\n"
169
+ exit -1
170
+ end
171
+
172
+ return marsh
173
+ end
174
+
175
+ #
176
+ # Support class for collecting test results.
177
+ #
178
+
179
+ class TestResults
180
+ attr_reader :assertion_count,
181
+ :run_count,
182
+ :failure_count,
183
+ :error_count
184
+
185
+ attr_accessor :style
186
+
187
+ def initialize( style=nil )
188
+ @style = style
189
+
190
+ @results = []
191
+
192
+ @assertion_count = 0
193
+ @run_count = 0
194
+ @failure_count = 0
195
+ @error_count = 0
196
+ end
197
+
198
+ # Add a result to the results collection.
199
+
200
+ def <<( result )
201
+ @results << result
202
+
203
+ @assertion_count += result.assertion_count
204
+ @run_count += result.run_count
205
+ @failure_count += result.failure_count
206
+ @error_count += result.error_count
207
+ end
208
+
209
+ #
210
+
211
+ def errors
212
+ errors = []
213
+ @results.each do |r|
214
+ unless r.passed?
215
+ errors << r.instance_variable_get('@errors')
216
+ end
217
+ end
218
+ errors.reject! { |e| e == [] }
219
+ errors
220
+ end
221
+
222
+ #
223
+
224
+ def failures
225
+ failures = []
226
+ @results.each do |r|
227
+ unless r.passed?
228
+ failures << r.instance_variable_get('@failures')
229
+ end
230
+ end
231
+ failures.reject! { |e| e == [] }
232
+ failures
233
+ end
234
+
235
+ # Output format for test results.
236
+
237
+ def to_s
238
+ return @results.to_s if style == 'pease'
239
+
240
+ s = []
241
+ # Display failures
242
+ unless failures.empty?
243
+ s << ''
244
+ s << "FAILURES:"
245
+ failures.reverse.each do |fails|
246
+ fails.reverse.each do |failure|
247
+ #puts
248
+ s << %{ - test : #{failure.test_name}}
249
+ s << %{ location : #{failure.location}}
250
+ if failure.message.index("\n")
251
+ s << %{ message : >}
252
+ s << failure.message.tabto(6)
253
+ else
254
+ s << %{ message : #{failure.message}}
255
+ end
256
+ end
257
+ end
258
+ end
259
+
260
+ # Display errors
261
+ unless errors.empty?
262
+ s << ''
263
+ s << "ERRORS:"
264
+ errors.reverse.each do |errs|
265
+ errs.reverse.each do |err|
266
+ s << ''
267
+ s << %{ - test : #{err.test_name}}
268
+ s << %{ message : #{err.exception.message}}
269
+ s << %{ backtrace :}
270
+ err.exception.backtrace[0...-1].each { |bt| s << %Q{ - #{bt}} }
271
+ end
272
+ end
273
+ end
274
+
275
+ # Display final results
276
+ s << ''
277
+ s << "Summary:"
278
+ s << " Tests : #{@run_count}"
279
+ s << " Assertions : #{@assertion_count}"
280
+ s << " Failures : #{@failure_count}"
281
+ s << " Errors : #{@error_count}"
282
+ s << ''
283
+ s << ''
284
+
285
+ return s.join("\n")
286
+ end
287
+
288
+ # Delegate missing call to the results array.
289
+
290
+ def method_missing(*a,&b)
291
+ @results.send(*a,&b)
292
+ end
293
+ end
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env ratch
2
+
3
+ main :syntax do
4
+ scripts = "lib/**/*.rb"
5
+ libpath = [ 'lib/methods', 'lib/core', 'lib/more' ].join(':')
6
+
7
+ checklist = []
8
+ cnt = 0
9
+ scripts = multiglob(*scripts) #- multiglob_r(ignore)
10
+ scripts.each do |s|
11
+ next unless File.file?(s)
12
+ #if not system "ruby -c -Ibin:lib:test #{s} &> /dev/null" then
13
+ if r = system "ruby -I#{libpath} #{s} > /dev/null"
14
+ puts "#{s} [PASS]" #if verbose?
15
+ else
16
+ puts "Load Issue: #{s}"
17
+ checklist << :load
18
+ cnt += 1
19
+ end
20
+ end
21
+
22
+ if cnt == 0
23
+ puts "Load dependencies check out."
24
+ else
25
+ puts "#{cnt} Load Failures:\n "
26
+ puts checklist.join("\n ")
27
+ end
28
+ end
@@ -0,0 +1,88 @@
1
+ #!/usr/bin/env ratch
2
+
3
+ # generate rdocs
4
+ #
5
+ # Generate Rdoc documentation. Settings are
6
+ # the same as the rdoc command's options.
7
+
8
+ main :rdoc do
9
+ config, output, input = *rdoc_configuration
10
+
11
+ file output => input do
12
+ rdoc_target(config)
13
+ end
14
+
15
+ file 'README' do
16
+ puts "OH YEH README"
17
+ end
18
+
19
+ build output
20
+ end
21
+
22
+ # Document target.
23
+
24
+ def rdoc_target(config)
25
+ output = config['op']
26
+ input = config.delete('include')
27
+
28
+ # Check for 'doc' directory.
29
+ # (Helps to ensure we're in the right place.)
30
+ #dir!(File.dirname(site))
31
+
32
+ # Remove old rdocs.
33
+ rm_r(output) if exist?(output) and safe?(output)
34
+
35
+ #input = input.collect{ |i| glob(i) }.flatten
36
+ vector = [input, config]
37
+ rdoc(vector.to_console)
38
+
39
+ insert_ads(output)
40
+ end
41
+
42
+ # Collect RDocs configuration.
43
+
44
+ def rdoc_configuration
45
+ config = configuration['rdoc'] || {}
46
+
47
+ config = {
48
+ 'template' => 'html',
49
+ 'op' => 'doc/rdoc',
50
+ 'merge' => true,
51
+ 'inline-source' => true,
52
+ 'exclude' => [],
53
+ 'include' => ['lib', '[A-Z]*']
54
+ }.merge(config)
55
+
56
+ if config['output']
57
+ config['op'] = config.delete('output')
58
+ end
59
+
60
+ output = config['op']
61
+
62
+ input = config['include'].collect do |i|
63
+ dir?(i) ? File.join(i,'**','*') : i
64
+ end
65
+
66
+ return config, output, input
67
+ end
68
+
69
+ # Insert an ad if available.
70
+
71
+ def insert_ads(site)
72
+ adfile = configuration['ad_file'] || 'meta/site_ad.html'
73
+ return unless adfile && File.file?(adfile)
74
+ adtext = File.read(adfile)
75
+ #puts
76
+ dirs = Dir.glob(File.join(site,'*/'))
77
+ dirs.each do |dir|
78
+ files = Dir.glob(File.join(dir, '**/*.html'))
79
+ files.each do |file|
80
+ html = file_read(file)
81
+ bodi = html.index('<body>')
82
+ html[bodi + 7] = "\n" + adtext
83
+ #print "Augmenting #{file}..."
84
+ file_write(file, html) unless dryrun?
85
+ #puts "[done]"
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ratch
2
+
3
+ main :syntax do
4
+ scripts = "lib/**/*.rb"
5
+ libpath = [ 'lib/methods', 'lib/core', 'lib/more' ].join(':')
6
+
7
+ checklist = []
8
+ cnt = 0
9
+ scripts = multiglob(*scripts) #- multiglob_r(ignore)
10
+ scripts.each do |s|
11
+ next unless File.file?(s)
12
+ #if not system "ruby -c -Ibin:lib:test #{s} &> /dev/null" then
13
+ r = system "ruby -c -I#{libpath} #{s} > /dev/null"
14
+ if r
15
+ puts "#{s} [PASS]" #if verbose?
16
+ else
17
+ puts "Syntax Error: #{s}"
18
+ checklist << :syntax
19
+ cnt += 1
20
+ end
21
+ end
22
+
23
+ if cnt == 0
24
+ puts "Syntax checks out."
25
+ else
26
+ puts "#{cnt} Syntax Failures:\n "
27
+ puts checklist.join("\n ")
28
+ end
29
+ end