spicycode-rcov 0.8.1.5.7 → 0.8.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,83 @@
1
+ unless(defined?(Continuation) and Continuation.respond_to?('create'))
2
+ # to satisfy rdoc
3
+ class Continuation #:nodoc:
4
+ end
5
+ def Continuation.create(*args, &block) # :nodoc:
6
+ cc = nil; result = callcc {|c| cc = c; block.call(cc) if block and args.empty?}
7
+ result ||= args
8
+ return *[cc, *result]
9
+ end
10
+ end
11
+
12
+ class Binding; end # for RDoc
13
+ # This method returns the binding of the method that called your
14
+ # method. It will raise an Exception when you're not inside a method.
15
+ #
16
+ # It's used like this:
17
+ # def inc_counter(amount = 1)
18
+ # Binding.of_caller do |binding|
19
+ # # Create a lambda that will increase the variable 'counter'
20
+ # # in the caller of this method when called.
21
+ # inc = eval("lambda { |arg| counter += arg }", binding)
22
+ # # We can refer to amount from inside this block safely.
23
+ # inc.call(amount)
24
+ # end
25
+ # # No other statements can go here. Put them inside the block.
26
+ # end
27
+ # counter = 0
28
+ # 2.times { inc_counter }
29
+ # counter # => 2
30
+ #
31
+ # Binding.of_caller must be the last statement in the method.
32
+ # This means that you will have to put everything you want to
33
+ # do after the call to Binding.of_caller into the block of it.
34
+ # This should be no problem however, because Ruby has closures.
35
+ # If you don't do this an Exception will be raised. Because of
36
+ # the way that Binding.of_caller is implemented it has to be
37
+ # done this way.
38
+ def Binding.of_caller(&block)
39
+ old_critical = Thread.critical
40
+ Thread.critical = true
41
+ count = 0
42
+ cc, result, error, extra_data = Continuation.create(nil, nil)
43
+ error.call if error
44
+
45
+ tracer = lambda do |*args|
46
+ type, context, extra_data = args[0], args[4], args
47
+ if type == "return"
48
+ count += 1
49
+ # First this method and then calling one will return --
50
+ # the trace event of the second event gets the context
51
+ # of the method which called the method that called this
52
+ # method.
53
+ if count == 2
54
+ # It would be nice if we could restore the trace_func
55
+ # that was set before we swapped in our own one, but
56
+ # this is impossible without overloading set_trace_func
57
+ # in current Ruby.
58
+ set_trace_func(nil)
59
+ cc.call(eval("binding", context), nil, extra_data)
60
+ end
61
+ elsif type == "line" then
62
+ nil
63
+ elsif type == "c-return" and extra_data[3] == :set_trace_func then
64
+ nil
65
+ else
66
+ set_trace_func(nil)
67
+ error_msg = "Binding.of_caller used in non-method context or " +
68
+ "trailing statements of method using it aren't in the block."
69
+ cc.call(nil, lambda { raise(ArgumentError, error_msg) }, nil)
70
+ end
71
+ end
72
+
73
+ unless result
74
+ set_trace_func(tracer)
75
+ return nil
76
+ else
77
+ Thread.critical = old_critical
78
+ case block.arity
79
+ when 1 then yield(result)
80
+ else yield(result, extra_data)
81
+ end
82
+ end
83
+ end
data/lib/rcov/report.rb CHANGED
@@ -25,8 +25,6 @@ begin
25
25
  rescue LoadError
26
26
  end
27
27
 
28
- require 'rcov/rexml_extensions' # TODO it would be nice to move the below hacks into this rexml_extensions module
29
-
30
28
  if (RUBY_VERSION == "1.8.6" || RUBY_VERSION == "1.8.7") && defined? REXML::Formatters::Transitive
31
29
  class REXML::Document
32
30
  remove_method :write rescue nil
@@ -76,7 +74,6 @@ if (RUBY_VERSION == "1.8.6" || RUBY_VERSION == "1.8.7") && defined? REXML::Forma
76
74
  output << ' '*@level
77
75
  end
78
76
  end
79
-
80
77
  end
81
78
 
82
79
  class Formatter # :nodoc:
@@ -88,11 +85,11 @@ class Formatter # :nodoc:
88
85
  /\btest\//,
89
86
  /\bvendor\//,
90
87
  /\A#{Regexp.escape(__FILE__)}\z/]
91
-
88
+
92
89
  DEFAULT_OPTS = {:ignore => ignore_files, :sort => :name, :sort_reverse => false,
93
90
  :output_threshold => 101, :dont_ignore => [],
94
91
  :callsite_analyzer => nil, :comments_run_by_default => false}
95
-
92
+
96
93
  def initialize(opts = {})
97
94
  options = DEFAULT_OPTS.clone.update(opts)
98
95
  @files = {}
@@ -538,7 +535,7 @@ class HTMLCoverage < Formatter # :nodoc:
538
535
  require 'fileutils'
539
536
  JAVASCRIPT_PROLOG = <<-EOS
540
537
 
541
- // <![CDATA[
538
+ // \<![CDATA[
542
539
  function toggleCode( id ) {
543
540
  if ( document.getElementById )
544
541
  elem = document.getElementById( id );
@@ -559,7 +556,7 @@ class HTMLCoverage < Formatter # :nodoc:
559
556
  }
560
557
 
561
558
  // Make cross-references hidden by default
562
- document.writeln( "<style type=\\"text/css\\">span.cross-ref { display: none }</style>" )
559
+ document.writeln( "\<style type=\\"text/css\\">span.cross-ref { display: none }</style>" )
563
560
  // ]]>
564
561
  EOS
565
562
 
@@ -721,7 +718,7 @@ EOS
721
718
  return if @files.empty?
722
719
  FileUtils.mkdir_p @dest
723
720
  create_index(File.join(@dest, "index.html"))
724
-
721
+
725
722
  each_file_pair_sorted do |filename, fileinfo|
726
723
  create_file(File.join(@dest, mangle_filename(filename)), fileinfo)
727
724
  end
@@ -816,29 +813,29 @@ EOS
816
813
  end
817
814
 
818
815
  class SummaryFileInfo # :nodoc:
819
-
816
+
820
817
  def initialize(obj)
821
- @o = obj
818
+ @o = obj
822
819
  end
823
-
820
+
824
821
  def num_lines
825
822
  @o.num_lines
826
823
  end
827
-
824
+
828
825
  def num_code_lines
829
826
  @o.num_code_lines
830
827
  end
831
-
828
+
832
829
  def code_coverage
833
830
  @o.code_coverage
834
831
  end
835
-
832
+
836
833
  def total_coverage
837
834
  @o.total_coverage
838
835
  end
839
-
836
+
840
837
  def name
841
- "TOTAL"
838
+ "TOTAL"
842
839
  end
843
840
 
844
841
  end
@@ -886,7 +883,11 @@ EOS
886
883
  end
887
884
  }
888
885
  } }
889
- lines = output.pretty.to_a
886
+ if String.new.respond_to?(:lines) then
887
+ lines = output.pretty.lines.to_a
888
+ else
889
+ lines = output.pretty.to_a
890
+ end
890
891
  lines.unshift lines.pop if /DOCTYPE/ =~ lines[-1]
891
892
  File.open(destname, "w") do |f|
892
893
  f.puts lines
@@ -1038,7 +1039,11 @@ EOS
1038
1039
  }
1039
1040
  } }
1040
1041
  # .pretty needed to make sure DOCTYPE is in a separate line
1041
- lines = output.pretty.to_a
1042
+ if String.new.respond_to?(:lines)
1043
+ lines = output.pretty.lines.to_a
1044
+ else
1045
+ lines = output.pretty.to_a
1046
+ end
1042
1047
  lines.unshift lines.pop if /DOCTYPE/ =~ lines[-1]
1043
1048
  File.open(destfile, "w") do |f|
1044
1049
  f.puts lines
@@ -1153,7 +1158,7 @@ class HTMLProfiling < HTMLCoverage # :nodoc:
1153
1158
  nil
1154
1159
  end
1155
1160
  end
1156
-
1161
+
1157
1162
  end
1158
1163
 
1159
1164
  class RubyAnnotation < Formatter # :nodoc:
@@ -0,0 +1,44 @@
1
+ require 'rexml/document'
2
+ require 'rexml/formatters/pretty'
3
+
4
+ module Rcov
5
+ module REXMLExtensions
6
+
7
+ def self.fix_pretty_formatter_wrap
8
+ REXML::Formatters::Pretty.class_eval do
9
+ include PrettyFormatterWrapFix
10
+ end
11
+ end
12
+
13
+ # Fix for this bug: http://clint-hill.com/2008/10/02/a-bug-in-ruby-did-i-just-find-that/
14
+ # Also known from this fun exception:
15
+ #
16
+ # /usr/local/ruby/lib/ruby/1.8/rexml/formatters/pretty.rb:131:in
17
+ # `[]': no implicit conversion from nil to integer (TypeError)
18
+ #
19
+ # This bug was fixed in Ruby with this changeset http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=19487
20
+ # ...which should mean that this bug only affects Ruby 1.8.6. The latest stable version of 1.8.7 (and up) should be fine.
21
+ module PrettyFormatterWrapFix
22
+
23
+ def self.included(base)
24
+ base.class_eval do
25
+ def wrap(string, width)
26
+ # Recursively wrap string at width.
27
+ return string if string.length <= width
28
+ place = string.rindex(' ', width) # Position in string with last ' ' before cutoff
29
+ return string if place.nil?
30
+ return string[0,place] + "\n" + wrap(string[place+1..-1], width)
31
+ end
32
+ end
33
+ end
34
+
35
+ end
36
+
37
+ def self.init!
38
+ if RUBY_VERSION == "1.8.6"
39
+ fix_pretty_formatter_wrap
40
+ end
41
+ end
42
+ end
43
+
44
+ end
data/lib/rcov/version.rb CHANGED
@@ -4,8 +4,8 @@
4
4
 
5
5
  module Rcov
6
6
 
7
- VERSION = "0.8.1.5.6"
8
- RELEASE_DATE = "2008-10-29"
7
+ VERSION = "0.8.1.5.7"
8
+ RELEASE_DATE = "2009-03-17"
9
9
  RCOVRT_ABI = [2,0,0]
10
10
  UPSTREAM_URL = "http://github.com/spicycode/rcov"
11
11
 
data/lib/rcov/xx.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  # xx can be redistributed and used under the following conditions
2
2
  # (just keep the following copyright notice, list of conditions and disclaimer
3
3
  # in order to satisfy rcov's "Ruby license" and xx's license simultaneously).
4
- #
4
+ #
5
5
  #ePark Labs Public License version 1
6
6
  #Copyright (c) 2005, ePark Labs, Inc. and contributors
7
7
  #All rights reserved.
@@ -29,14 +29,19 @@
29
29
  #(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30
30
  #SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
31
 
32
- unless defined? $__xx_rb__
32
+ unless(defined?($__xx_rb__) or defined?(XX))
33
33
 
34
34
  require "rexml/document"
35
35
 
36
-
37
36
  module XX
38
37
  #--{{{
39
- VERSION = "0.1.0"
38
+ VERSION = "2.1.0"
39
+ def self.version() VERSION end
40
+
41
+ LIBDIR = File.dirname(File.expand_path(__FILE__)) << File::SEPARATOR
42
+ def self.libdir() LIBDIR end
43
+
44
+ require libdir + "binding_of_caller"
40
45
 
41
46
  %w(
42
47
  CRAZY_LIKE_A_HELL
@@ -50,11 +55,13 @@ module XX
50
55
  attr "doc"
51
56
  attr "stack"
52
57
  attr "size"
58
+ attr_accessor "xmldecl"
53
59
 
54
60
  def initialize *a, &b
55
61
  #--{{{
56
- @doc = ::REXML::Document::new(*a, &b)
62
+ @doc = ::REXML::Document::new *a, &b
57
63
  @stack = [@doc]
64
+ @xmldecl = nil
58
65
  @size = 0
59
66
  #--}}}
60
67
  end
@@ -82,17 +89,23 @@ module XX
82
89
  end
83
90
  def to_str port = ""
84
91
  #--{{{
85
- @doc.write port, indent=-1, transitive=false, ie_hack=true
86
- port
92
+ xmldecl ? ugly(port) : pretty(port)
87
93
  #--}}}
88
94
  end
89
95
  alias_method "to_s", "to_str"
90
- def pretty port = ''
96
+ def pretty port = ""
91
97
  #--{{{
92
- @doc.write port, indent=2, transitive=false, ie_hack=true
98
+ @doc.write port, indent=0, transitive=false, ie_hack=true
93
99
  port
94
100
  #--}}}
95
101
  end
102
+ def ugly port = ''
103
+ #--{{{
104
+ @doc.write port, indent=-1, transitive=false, ie_hack=true
105
+ port
106
+ #--}}}
107
+ end
108
+ alias_method "compact", "ugly"
96
109
  def create element
97
110
  #--{{{
98
111
  push element
@@ -174,7 +187,7 @@ module XX
174
187
  x.to_s
175
188
  end
176
189
 
177
- else # other - try anyhow
190
+ else # other - try anyhow
178
191
  t <<
179
192
  case x
180
193
  when ::REXML::Document
@@ -204,67 +217,34 @@ module XX
204
217
 
205
218
  module InstanceMethods
206
219
  #--{{{
207
- def method_missing m, *a, &b
220
+ def _ tag_name, *a, &b
208
221
  #--{{{
209
- m = m.to_s
222
+ hashes, nothashes = a.partition{|x| Hash === x}
210
223
 
211
- tag_method, tag_name = xx_class::xx_tag_method_name m
212
-
213
- c_method_missing = xx_class::xx_config_for "method_missing", xx_which
214
- c_tags = xx_class::xx_config_for "tags", xx_which
215
-
216
- pat =
217
- case c_method_missing
218
- when ::XX::CRAZY_LIKE_A_HELL
219
- %r/.*/
220
- when ::XX::PERMISSIVE
221
- %r/_$/o
222
- when ::XX::STRICT
223
- %r/_$/o
224
- else
225
- super(m.to_sym, *a, &b)
226
- end
227
-
228
- super(m.to_sym, *a, &b) unless m =~ pat
229
-
230
- if c_method_missing == ::XX::STRICT
231
- super(m.to_sym, *a, &b) unless c_tags.include? tag_name
232
- end
233
-
234
- ret, defined = nil
224
+ doc = xx_doc
225
+ element = ::REXML::Element::new "#{ tag_name }"
235
226
 
236
- begin
237
- xx_class::xx_define_tmp_method tag_method
238
- xx_class::xx_define_tag_method tag_method, tag_name
239
- ret = send tag_method, *a, &b
240
- defined = true
241
- ensure
242
- xx_class::xx_remove_tag_method tag_method unless defined
243
- end
227
+ hashes.each{|h| h.each{|k,v| element.add_attribute k.to_s, v}}
228
+ nothashes.each{|nh| element << ::REXML::Text::new(nh.to_s)}
244
229
 
245
- ret
230
+ doc.create element, &b
246
231
  #--}}}
247
232
  end
248
- def xx_tag_ tag_name, *a, &b
233
+ alias_method "xx_tag" , "_"
234
+ alias_method "__" , "_"
235
+ alias_method "g__" , "_"
236
+ def method_missing m, *a, &b
249
237
  #--{{{
250
- tag_method, tag_name = xx_class::xx_tag_method_name tag_name
238
+ m = m.to_s
251
239
 
252
- ret, defined = nil
240
+ tag_name = m.sub! %r/_+$/, ''
253
241
 
254
- begin
255
- xx_class::xx_define_tmp_method tag_method
256
- xx_class::xx_define_tag_method tag_method, tag_name
257
- ret = send tag_method, *a, &b
258
- defined = true
259
- ensure
260
- xx_class::xx_remove_tag_method tag_method unless defined
261
- end
242
+ super unless tag_name
262
243
 
263
- ret
244
+ __ tag_name, *a, &b
264
245
  #--}}}
265
246
  end
266
- alias_method "g_", "xx_tag_"
267
- def xx_which *argv
247
+ def xx_which *argv
268
248
  #--{{{
269
249
  @xx_which = nil unless defined? @xx_which
270
250
  if argv.empty?
@@ -272,7 +252,7 @@ module XX
272
252
  else
273
253
  xx_which = @xx_which
274
254
  begin
275
- @xx_which = argv.shift
255
+ @xx_which = argv.shift
276
256
  return yield
277
257
  ensure
278
258
  @xx_which = xx_which
@@ -283,16 +263,15 @@ module XX
283
263
  def xx_with_doc_in_effect *a, &b
284
264
  #--{{{
285
265
  @xx_docs ||= []
286
- doc = ::XX::Document::new(*a)
266
+ doc = ::XX::Document::new *a
287
267
  ddoc = doc.doc
288
268
  begin
289
269
  @xx_docs.push doc
290
- b.call doc if b
291
270
 
292
271
  doctype = xx_config_for "doctype", xx_which
293
272
  if doctype
294
273
  unless ddoc.doctype
295
- doctype = ::REXML::DocType::new doctype unless
274
+ doctype = ::REXML::DocType::new doctype unless
296
275
  ::REXML::DocType === doctype
297
276
  ddoc << doctype
298
277
  end
@@ -304,9 +283,12 @@ module XX
304
283
  xmldecl = ::REXML::XMLDecl::new xmldecl unless
305
284
  ::REXML::XMLDecl === xmldecl
306
285
  ddoc << xmldecl
286
+ doc.xmldecl = ::REXML::XMLDecl
307
287
  end
308
288
  end
309
289
 
290
+ b.call doc if b
291
+
310
292
  return doc
311
293
  ensure
312
294
  @xx_docs.pop
@@ -323,26 +305,26 @@ module XX
323
305
  doc = xx_doc
324
306
 
325
307
  text =
326
- ::REXML::Text::new("",
308
+ ::REXML::Text::new("",
327
309
  respect_whitespace=true, parent=nil
328
310
  )
329
311
 
330
- objects.each do |object|
312
+ objects.each do |object|
331
313
  text << object.to_s if object
332
314
  end
333
315
 
334
316
  doc.create text, &b
335
317
  #--}}}
336
318
  end
337
- alias_method "text_", "xx_text_"
338
- alias_method "t_", "xx_text_"
319
+ alias_method "t__", "xx_text_"
320
+ alias_method "text__", "xx_text_"
339
321
  def xx_markup_ *objects, &b
340
322
  #--{{{
341
323
  doc = xx_doc
342
324
 
343
325
  doc2 = ::REXML::Document::new ""
344
326
 
345
- objects.each do |object|
327
+ objects.each do |object|
346
328
  (doc2.root ? doc2.root : doc2) << ::REXML::Document::new(object.to_s)
347
329
  end
348
330
 
@@ -353,41 +335,43 @@ module XX
353
335
  ret
354
336
  #--}}}
355
337
  end
356
- alias_method "x_", "xx_markup_"
338
+ alias_method "x__", "xx_markup_"
339
+ alias_method "markup__", "xx_markup_"
357
340
  def xx_any_ *objects, &b
358
341
  #--{{{
359
342
  doc = xx_doc
360
343
  nothing = %r/.^/m
361
344
 
362
345
  text =
363
- ::REXML::Text::new("",
346
+ ::REXML::Text::new("",
364
347
  respect_whitespace=true, parent=nil, raw=true, entity_filter=nil, illegal=nothing
365
348
  )
366
349
 
367
- objects.each do |object|
350
+ objects.each do |object|
368
351
  text << object.to_s if object
369
352
  end
370
353
 
371
354
  doc.create text, &b
372
355
  #--}}}
373
356
  end
374
- alias_method "h_", "xx_any_"
375
- remove_method "x_" if instance_methods.include? "x_"
376
- alias_method "x_", "xx_any_" # supplant for now
357
+ alias_method "any__", "xx_any_"
358
+ alias_method "h__", "xx_any_"
359
+ alias_method "x__", "xx_any_" # supplant for now
377
360
  def xx_cdata_ *objects, &b
378
361
  #--{{{
379
362
  doc = xx_doc
380
363
 
381
364
  cdata = ::REXML::CData::new ""
382
365
 
383
- objects.each do |object|
366
+ objects.each do |object|
384
367
  cdata << object.to_s if object
385
368
  end
386
369
 
387
370
  doc.create cdata, &b
388
371
  #--}}}
389
372
  end
390
- alias_method "c_", "xx_cdata_"
373
+ alias_method "cdata__", "xx_cdata_"
374
+ alias_method "c__", "xx_cdata_"
391
375
  def xx_parse_attributes string
392
376
  #--{{{
393
377
  string = string.to_s
@@ -396,7 +380,7 @@ module XX
396
380
  xx_parse_yaml_attributes(tokens.join(','))
397
381
  #--}}}
398
382
  end
399
- alias_method "att_", "xx_parse_attributes"
383
+ alias_method "a__", "xx_parse_attributes"
400
384
  def xx_parse_yaml_attributes string
401
385
  #--{{{
402
386
  require "yaml"
@@ -408,31 +392,30 @@ module XX
408
392
  obj
409
393
  #--}}}
410
394
  end
411
- alias_method "at_", "xx_parse_yaml_attributes"
412
- alias_method "yat_", "xx_parse_yaml_attributes"
395
+ alias_method "y__", "xx_parse_yaml_attributes"
413
396
  def xx_class
414
397
  #--{{{
415
398
  @xx_class ||= self.class
416
399
  #--}}}
417
400
  end
418
- def xx_tag_method_name *a, &b
401
+ def xx_tag_method_name *a, &b
419
402
  #--{{{
420
- xx_class.xx_tag_method_name(*a, &b)
403
+ xx_class.xx_tag_method_name *a, &b
421
404
  #--}}}
422
405
  end
423
- def xx_define_tmp_method *a, &b
406
+ def xx_define_tmp_method *a, &b
424
407
  #--{{{
425
- xx_class.xx_define_tmp_methodr(*a, &b)
408
+ xx_class.xx_define_tmp_method *a, &b
426
409
  #--}}}
427
410
  end
428
- def xx_define_tag_method *a, &b
411
+ def xx_define_tag_method *a, &b
429
412
  #--{{{
430
- xx_class.xx_define_tag_method(*a, &b)
413
+ xx_class.xx_define_tag_method *a, &b
431
414
  #--}}}
432
415
  end
433
- def xx_remove_tag_method *a, &b
416
+ def xx_remove_tag_method *a, &b
434
417
  #--{{{
435
- xx_class.xx_tag_remove_method(*a, &b)
418
+ xx_class.xx_tag_remove_method *a, &b
436
419
  #--}}}
437
420
  end
438
421
  def xx_ancestors
@@ -448,12 +431,12 @@ module XX
448
431
  end
449
432
  def xx_config_for *a, &b
450
433
  #--{{{
451
- xx_class.xx_config_for(*a, &b)
434
+ xx_class.xx_config_for *a, &b
452
435
  #--}}}
453
436
  end
454
437
  def xx_configure *a, &b
455
438
  #--{{{
456
- xx_class.xx_configure(*a, &b)
439
+ xx_class.xx_configure *a, &b
457
440
  #--}}}
458
441
  end
459
442
  #--}}}
@@ -468,7 +451,7 @@ module XX
468
451
  [ tag_method, tag_name ]
469
452
  #--}}}
470
453
  end
471
- def xx_define_tmp_method m
454
+ def xx_define_tmp_method m
472
455
  #--{{{
473
456
  define_method(m){ raise NotImplementedError, m.to_s }
474
457
  #--}}}
@@ -476,10 +459,9 @@ module XX
476
459
  def xx_define_tag_method tag_method, tag_name = nil
477
460
  #--{{{
478
461
  tag_method = tag_method.to_s
479
- tag_name ||= tag_method.gsub %r/_+$/, ""
462
+ tag_name ||= tag_method.sub(%r/_$/, '')
480
463
 
481
- remove_method tag_method if instance_methods.include? tag_method
482
- module_eval <<-code, __FILE__, __LINE__+1
464
+ module_eval <<-code
483
465
  def #{ tag_method } *a, &b
484
466
  hashes, nothashes = a.partition{|x| Hash === x}
485
467
 
@@ -517,9 +499,9 @@ module XX
517
499
  @@xx_config ||= Hash::new{|h,k| h[k] = {}}
518
500
  #--}}}
519
501
  end
520
- def xx_config_for key, xx_which = nil
502
+ def xx_config_for key, xx_which = nil
521
503
  #--{{{
522
- key = key.to_s
504
+ key = key.to_s
523
505
  xx_which ||= self
524
506
  xx_ancestors(xx_which).each do |a|
525
507
  if xx_config[a].has_key? key
@@ -529,7 +511,7 @@ module XX
529
511
  nil
530
512
  #--}}}
531
513
  end
532
- def xx_configure key, value, xx_which = nil
514
+ def xx_configure key, value, xx_which = nil
533
515
  #--{{{
534
516
  key = key.to_s
535
517
  xx_which ||= self
@@ -572,10 +554,10 @@ module XX
572
554
  def xhtml_ which = XHTML, *a, &b
573
555
  #--{{{
574
556
  xx_which(which) do
575
- doc = xx_with_doc_in_effect(*a, &b)
557
+ doc = xx_with_doc_in_effect *a, &b
576
558
  ddoc = doc.doc
577
559
  root = ddoc.root
578
- if root and root.name and root.name =~ %r/^html$/i
560
+ if root and root.name and root.name =~ %r/^html$/i
579
561
  if root.attribute("lang",nil).nil? or root.attribute("lang",nil).to_s.empty?
580
562
  root.add_attribute "lang", "en"
581
563
  end
@@ -590,6 +572,7 @@ module XX
590
572
  end
591
573
  #--}}}
592
574
  end
575
+ alias_method "xhtml__", "xhtml_"
593
576
 
594
577
  module Strict
595
578
  #--{{{
@@ -611,6 +594,7 @@ module XX
611
594
  super(which, *a, &b)
612
595
  #--}}}
613
596
  end
597
+ alias_method "xhtml__", "xhtml_"
614
598
  #--}}}
615
599
  end
616
600
 
@@ -623,6 +607,7 @@ module XX
623
607
  super(which, *a, &b)
624
608
  #--}}}
625
609
  end
610
+ alias_method "xhtml__", "xhtml_"
626
611
  #--}}}
627
612
  end
628
613
  #--}}}
@@ -632,12 +617,13 @@ module XX
632
617
  #--{{{
633
618
  include Markup
634
619
  xx_configure "doctype", %(html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN")
635
-
620
+
636
621
  def html4_ which = HTML4, *a, &b
637
622
  #--{{{
638
- xx_which(which){ xx_with_doc_in_effect(*a, &b) }
623
+ xx_which(which){ xx_with_doc_in_effect *a, &b }
639
624
  #--}}}
640
625
  end
626
+ alias_method "html4__", "html4_"
641
627
 
642
628
  module Strict
643
629
  #--{{{
@@ -658,6 +644,7 @@ module XX
658
644
  super(which, *a, &b)
659
645
  #--}}}
660
646
  end
647
+ alias_method "html4__", "html4_"
661
648
  #--}}}
662
649
  end
663
650
 
@@ -670,6 +657,7 @@ module XX
670
657
  super(which, *a, &b)
671
658
  #--}}}
672
659
  end
660
+ alias_method "html4__", "html4_"
673
661
  #--}}}
674
662
  end
675
663
  #--}}}
@@ -683,11 +671,218 @@ module XX
683
671
 
684
672
  def xml_ *a, &b
685
673
  #--{{{
686
- xx_which(XML){ xx_with_doc_in_effect(*a, &b)}
674
+ xx_which(XML){ xx_with_doc_in_effect *a, &b }
687
675
  #--}}}
688
676
  end
677
+ alias_method "xml__", "xml_"
689
678
  #--}}}
690
679
  end
680
+
681
+ module Template
682
+ #--{{{
683
+ class Basic
684
+ #--{{{
685
+ %w( path inline type object template port pretty ).each{|a| attr_accessor a}
686
+ def initialize opts = {}, &b
687
+ #--{{{
688
+ @path = opts['path'] || opts[:path]
689
+ @inline = opts['inline'] || opts[:inline]
690
+ @type = opts['type'] || opts[:type]
691
+ @object = opts['object'] || opts[:object]
692
+ @pretty = opts['pretty'] || opts[:pretty]
693
+ @port = opts['port'] || opts[:port] || STDOUT
694
+
695
+ bool = lambda{|value| value ? true : false}
696
+ raise ArgumentError unless(bool[@path] ^ bool[@inline])
697
+
698
+ path_init(&b) if @path
699
+ inline_init(&b) if @inline
700
+
701
+ @type =
702
+ case @type.to_s.downcase.strip
703
+ when /^xhtml$/
704
+ XHTML
705
+ when /^xml$/
706
+ XML
707
+ when /^html4$/
708
+ HTML4
709
+ else
710
+ XHTML
711
+ end
712
+ #--}}}
713
+ end
714
+ def path_init &b
715
+ #--{{{
716
+ @template = IO.read @path
717
+ @type = @path[%r/\.[^\.]+$/o] || XHTML unless @type
718
+ #--}}}
719
+ end
720
+ def inline_init &b
721
+ #--{{{
722
+ @template = (@inline || b.call).to_s
723
+ @type ||= XHTML
724
+ #--}}}
725
+ end
726
+ def expand binding, opts = {}
727
+ #--{{{
728
+ port = opts['port'] || opts[:port] || STDOUT
729
+ pretty = opts['pretty'] || opts[:pretty]
730
+
731
+ object = eval 'self', binding
732
+
733
+ unless type === object
734
+ __m = type
735
+ klass = object.class
736
+ klass.module_eval{ include __m }
737
+ end
738
+
739
+ doc = eval @template, binding
740
+
741
+ display = pretty ? 'pretty' : 'to_str'
742
+
743
+ doc.send display, port
744
+ #--}}}
745
+ end
746
+ alias_method "result", "expand"
747
+ #--}}}
748
+ end
749
+
750
+ class File < Basic
751
+ #--{{{
752
+ def initialize *argv, &b
753
+ #--{{{
754
+ opts, argv = argv.partition{|arg| Hash === arg}
755
+ opts = opts.inject{|a,b| a.update b}
756
+ path = argv.shift
757
+ raise ArgumentError, "no path" unless path
758
+ raise ArgumentError, "bad opts" unless Hash === opts or opts.nil?
759
+ opts ||= {}
760
+ opts['path'] = opts[:path] = path.to_s
761
+ super opts, &b
762
+ #--}}}
763
+ end
764
+ #--}}}
765
+ end
766
+
767
+ class Inline < Basic
768
+ #--{{{
769
+ def initialize *argv, &b
770
+ #--{{{
771
+ opts, argv = argv.partition{|arg| Hash === arg}
772
+ opts = opts.inject{|a,b| a.update b}
773
+ inline = argv.shift || b.call
774
+ raise ArgumentError, "no inline" unless inline
775
+ raise ArgumentError, "bad opts" unless Hash === opts or opts.nil?
776
+ opts ||= {}
777
+ opts['inline'] = opts[:inline] = inline.to_s
778
+ super opts, &b
779
+ #--}}}
780
+ end
781
+ #--}}}
782
+ end
783
+ #--}}}
784
+ end
785
+
786
+ module Expandable
787
+ #--{{{
788
+ module InstanceMethods
789
+ #--{{{
790
+ def xx_template_file *a, &b
791
+ #--{{{
792
+ template = XX::Template::File.new *a, &b
793
+ template.object ||= self
794
+ template
795
+ #--}}}
796
+ end
797
+ def xx_template_inline *a, &b
798
+ #--{{{
799
+ template = XX::Template::Inline.new *a, &b
800
+ template.object ||= self
801
+ template
802
+ #--}}}
803
+ end
804
+ def xx_expand template, opts = {}
805
+ #--{{{
806
+ port = opts['port'] || opts[:port] || STDOUT
807
+ pretty = opts['pretty'] || opts[:pretty]
808
+ binding = opts['binding'] || opts[:binding]
809
+
810
+ type = template.type
811
+
812
+ unless type === self
813
+ klass = self.class
814
+ klass.module_eval{ include type }
815
+ end
816
+
817
+ display = pretty ? 'pretty' : 'to_str'
818
+
819
+ Binding.of_caller do |scope|
820
+ binding ||= eval('binding', scope)
821
+ doc = eval template.template, binding
822
+ doc.send display, port
823
+ end
824
+ #--}}}
825
+ end
826
+ def xx_expand_file *a, &b
827
+ #--{{{
828
+ template = xx_template_file *a, &b
829
+
830
+ type = template.type
831
+ pretty = template.pretty
832
+ port = template.port
833
+
834
+ unless type === self
835
+ klass = self.class
836
+ klass.module_eval{ include type }
837
+ end
838
+
839
+ display = pretty ? 'pretty' : 'to_str'
840
+
841
+ Binding.of_caller do |scope|
842
+ binding ||= eval('binding', scope)
843
+ doc = eval template.template, binding
844
+ doc.send display, port
845
+ end
846
+ #--}}}
847
+ end
848
+ alias_method "xx_expand_path", "xx_expand_file"
849
+ alias_method "xx_expand_template", "xx_expand_file"
850
+ def xx_expand_inline *a, &b
851
+ #--{{{
852
+ template = xx_template_inline *a, &b
853
+
854
+ type = template.type
855
+ pretty = template.pretty
856
+ port = template.port
857
+
858
+ unless type === self
859
+ klass = self.class
860
+ klass.module_eval{ include type }
861
+ end
862
+
863
+ display = pretty ? 'pretty' : 'to_str'
864
+
865
+ Binding.of_caller do |scope|
866
+ binding ||= eval('binding', scope)
867
+ doc = eval template.template, binding
868
+ doc.send display, port
869
+ end
870
+ #--}}}
871
+ end
872
+ alias_method "xx_expand_string", "xx_expand_inline"
873
+ #--}}}
874
+ end
875
+ module ClassMethods
876
+ end
877
+ def self.included other
878
+ #--{{{
879
+ other.instance_eval{ include InstanceMethods }
880
+ other.extend ClassMethods
881
+ #--}}}
882
+ end
883
+ #--}}}
884
+ end
885
+
691
886
  #--}}}
692
887
  end
693
888
 
@@ -714,7 +909,7 @@ if __FILE__ == $0
714
909
  include XX::HTML4::Strict
715
910
  include XX::XML
716
911
 
717
- def doc
912
+ def doc
718
913
  html_{
719
914
  head_{ title_{ "xhtml/html4/xml demo" } }
720
915
 
@@ -726,7 +921,7 @@ if __FILE__ == $0
726
921
 
727
922
  x_{ "<any_valid> xml </any_valid>" }
728
923
 
729
- div_(:style => :sweet){
924
+ div_(:style => :sweet){
730
925
  em_ "this is a table"
731
926
 
732
927
  table_(:width => 42, :height => 42){
@@ -749,7 +944,7 @@ if __FILE__ == $0
749
944
  end
750
945
 
751
946
  table = Table[ %w( 0 1 2 ), %w( a b c ) ]
752
-
947
+
753
948
  methods = %w( to_xhtml to_html4 to_xml )
754
949
 
755
950
  methods.each do |method|
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spicycode-rcov
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.1.5.7
4
+ version: 0.8.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mauricio Fernandez
@@ -33,7 +33,9 @@ files:
33
33
  - lib/rcov/version.rb
34
34
  - lib/rcov/rant.rb
35
35
  - lib/rcov/report.rb
36
+ - lib/rcov/binding_of_caller.rb
36
37
  - lib/rcov/rcovtask.rb
38
+ - lib/rcov/rexml_extensions.rb
37
39
  - ext/rcovrt/extconf.rb
38
40
  - ext/rcovrt/1.8/rcovrt.c
39
41
  - ext/rcovrt/1.9/rcovrt.c