From 84ece951630c61eddab8be47b80fc1a7f774175f Mon Sep 17 00:00:00 2001 From: drbrain Date: Tue, 28 Jun 2011 02:28:25 +0000 Subject: [PATCH] * lib/rdoc: Update to RDoc 3.7 (final) * NEWS: ditto git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@32264 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 5 + NEWS | 2 +- lib/rdoc/markup.rb | 13 +- lib/rdoc/markup/document.rb | 11 +- lib/rdoc/markup/inline.rb | 9 +- lib/rdoc/markup/to_ansi.rb | 6 +- lib/rdoc/ri/driver.rb | 225 ++++++++++++---------- test/rdoc/test_rdoc_markup.rb | 31 +++ test/rdoc/test_rdoc_markup_document.rb | 6 + test/rdoc/test_rdoc_markup_pre_process.rb | 4 +- 10 files changed, 201 insertions(+), 111 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0a282b7870..8effab2551 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Tue Jun 28 11:17:28 2011 Eric Hodel + + * lib/rdoc: Update to RDoc 3.7 (final) + * NEWS: ditto + Tue Jun 28 10:18:42 2011 NARUSE, Yui * process.c (rb_daemon): fix wrong #endif position. diff --git a/NEWS b/NEWS index 00d685fef3..e67824e365 100644 --- a/NEWS +++ b/NEWS @@ -199,7 +199,7 @@ with all sufficient information, see the ChangeLog file. https://github.com/jimweirich/rake/blob/master/CHANGES * RDoc - * RDoc has been upgraded from 2.5.8 to 3.6.1. For full release notes see + * RDoc has been upgraded from 2.5.8 to 3.7. For full release notes see http://docs.seattlerb.org/rdoc/History_txt.html * rexml diff --git a/lib/rdoc/markup.rb b/lib/rdoc/markup.rb index bc28522615..6122fcac65 100644 --- a/lib/rdoc/markup.rb +++ b/lib/rdoc/markup.rb @@ -616,11 +616,16 @@ class RDoc::Markup end ## - # We take +text+, parse it then invoke the output +formatter+ using a - # Visitor to render the result. + # We take +input+, parse it if necessary, then invoke the output +formatter+ + # using a Visitor to render the result. - def convert text, formatter - document = RDoc::Markup::Parser.parse text + def convert input, formatter + document = case input + when RDoc::Markup::Document then + input + else + RDoc::Markup::Parser.parse input + end document.accept formatter end diff --git a/lib/rdoc/markup/document.rb b/lib/rdoc/markup/document.rb index b4e070285e..6fbef33ae3 100644 --- a/lib/rdoc/markup/document.rb +++ b/lib/rdoc/markup/document.rb @@ -56,7 +56,12 @@ class RDoc::Markup::Document visitor.start_accepting @parts.each do |item| - item.accept visitor + case item + when RDoc::Markup::Document then # HACK + visitor.accept_document item + else + item.accept visitor + end end visitor.end_accepting @@ -66,7 +71,9 @@ class RDoc::Markup::Document # Does this document have no parts? def empty? - @parts.empty? + @parts.empty? or + (@parts.length == 1 and RDoc::Markup::Document === @parts.first and + @parts.first.empty?) end ## diff --git a/lib/rdoc/markup/inline.rb b/lib/rdoc/markup/inline.rb index 932ed536b7..cf598d1583 100644 --- a/lib/rdoc/markup/inline.rb +++ b/lib/rdoc/markup/inline.rb @@ -60,7 +60,14 @@ class RDoc::Markup class AttrChanger def to_s # :nodoc: - "Attr: +#{Attribute.as_string turn_on}/-#{Attribute.as_string turn_on}" + "Attr: +#{Attribute.as_string turn_on}/-#{Attribute.as_string turn_off}" + end + + def inspect # :nodoc: + "+%s/-%s" % [ + Attribute.as_string(turn_on), + Attribute.as_string(turn_off), + ] end end diff --git a/lib/rdoc/markup/to_ansi.rb b/lib/rdoc/markup/to_ansi.rb index 108a038075..1e8a0289d9 100644 --- a/lib/rdoc/markup/to_ansi.rb +++ b/lib/rdoc/markup/to_ansi.rb @@ -12,9 +12,9 @@ class RDoc::Markup::ToAnsi < RDoc::Markup::ToRdoc super @headings.clear - @headings[1] = ["\e[1;32m", "\e[m"] - @headings[2] = ["\e[4;32m", "\e[m"] - @headings[3] = ["\e[32m", "\e[m"] + @headings[1] = ["\e[1;32m", "\e[m"] # bold + @headings[2] = ["\e[4;32m", "\e[m"] # underline + @headings[3] = ["\e[32m", "\e[m"] # just green end ## diff --git a/lib/rdoc/ri/driver.rb b/lib/rdoc/ri/driver.rb index 2c6f2f48e2..a99f96cb56 100644 --- a/lib/rdoc/ri/driver.rb +++ b/lib/rdoc/ri/driver.rb @@ -344,8 +344,8 @@ Options may also be set in the 'RI' environment variable. @stores = [] RDoc::RI::Paths.each(options[:use_system], options[:use_site], - options[:use_home], options[:use_gems], - *options[:extra_doc_dirs]) do |path, type| + options[:use_home], options[:use_gems], + *options[:extra_doc_dirs]) do |path, type| @doc_dirs << path store = RDoc::RI::Store.new path, type @@ -504,6 +504,70 @@ Options may also be set in the 'RI' environment variable. def class_cache # :nodoc: end + ## + # Builds a RDoc::Markup::Document from +found+, +klasess+ and +includes+ + + def class_document name, found, klasses, includes + also_in = [] + + out = RDoc::Markup::Document.new + + add_class out, name, klasses + + add_includes out, includes + + found.each do |store, klass| + comment = klass.comment + class_methods = store.class_methods[klass.full_name] + instance_methods = store.instance_methods[klass.full_name] + attributes = store.attributes[klass.full_name] + + if comment.empty? and !(instance_methods or class_methods) then + also_in << store + next + end + + add_from out, store + + unless comment.empty? then + out << RDoc::Markup::Rule.new(1) + out << comment + end + + if class_methods or instance_methods or not klass.constants.empty? then + out << RDoc::Markup::Rule.new(1) + end + + unless klass.constants.empty? then + out << RDoc::Markup::Heading.new(1, "Constants:") + out << RDoc::Markup::BlankLine.new + list = RDoc::Markup::List.new :NOTE + + constants = klass.constants.sort_by { |constant| constant.name } + + list.push(*constants.map do |constant| + parts = constant.comment.parts if constant.comment + parts << RDoc::Markup::Paragraph.new('[not documented]') if + parts.empty? + + RDoc::Markup::ListItem.new(constant.name, *parts) + end) + + out << list + end + + add_method_list out, class_methods, 'Class methods' + add_method_list out, instance_methods, 'Instance methods' + add_method_list out, attributes, 'Attributes' + + out << RDoc::Markup::BlankLine.new + end + + add_also_in out, also_in + + out + end + ## # Hash mapping a known class or module to the stores it can be loaded from @@ -523,6 +587,29 @@ Options may also be set in the 'RI' environment variable. @classes end + ## + # Returns the stores wherin +name+ is found along with the classes and + # includes that match it + + def classes_and_includes_for name + klasses = [] + includes = [] + + found = @stores.map do |store| + begin + klass = store.load_class name + klasses << klass + includes << [klass.includes, store] if klass.includes + [store, klass] + rescue Errno::ENOENT + end + end.compact + + includes.reject! do |modules,| modules.empty? end + + [found, klasses, includes] + end + ## # Completes +name+ based on the caches. For Readline @@ -582,79 +669,11 @@ Options may also be set in the 'RI' environment variable. def display_class name return if name =~ /#|\./ - klasses = [] - includes = [] - - found = @stores.map do |store| - begin - klass = store.load_class name - klasses << klass - includes << [klass.includes, store] if klass.includes - [store, klass] - rescue Errno::ENOENT - end - end.compact + found, klasses, includes = classes_and_includes_for name return if found.empty? - also_in = [] - - includes.reject! do |modules,| modules.empty? end - - out = RDoc::Markup::Document.new - - add_class out, name, klasses - - add_includes out, includes - - found.each do |store, klass| - comment = klass.comment - class_methods = store.class_methods[klass.full_name] - instance_methods = store.instance_methods[klass.full_name] - attributes = store.attributes[klass.full_name] - - if comment.empty? and !(instance_methods or class_methods) then - also_in << store - next - end - - add_from out, store - - unless comment.empty? then - out << RDoc::Markup::Rule.new(1) - out << comment - end - - if class_methods or instance_methods or not klass.constants.empty? then - out << RDoc::Markup::Rule.new(1) - end - - unless klass.constants.empty? then - out << RDoc::Markup::Heading.new(1, "Constants:") - out << RDoc::Markup::BlankLine.new - list = RDoc::Markup::List.new :NOTE - - constants = klass.constants.sort_by { |constant| constant.name } - - list.push(*constants.map do |constant| - parts = constant.comment.parts if constant.comment - parts << RDoc::Markup::Paragraph.new('[not documented]') if - parts.empty? - - RDoc::Markup::ListItem.new(constant.name, *parts) - end) - - out << list - end - - add_method_list out, class_methods, 'Class methods' - add_method_list out, instance_methods, 'Instance methods' - add_method_list out, attributes, 'Attributes' - - out << RDoc::Markup::BlankLine.new - end - - add_also_in out, also_in + out = class_document name, found, klasses, includes display out end @@ -669,32 +688,7 @@ Options may also be set in the 'RI' environment variable. filtered = filter_methods found, name - out = RDoc::Markup::Document.new - - out << RDoc::Markup::Heading.new(1, name) - out << RDoc::Markup::BlankLine.new - - filtered.each do |store, methods| - methods.each do |method| - out << RDoc::Markup::Paragraph.new("(from #{store.friendly_path})") - - unless name =~ /^#{Regexp.escape method.parent_name}/ then - out << RDoc::Markup::Heading.new(3, "Implementation from #{method.parent_name}") - end - out << RDoc::Markup::Rule.new(1) - - if method.arglists then - arglists = method.arglists.chomp.split "\n" - arglists = arglists.map { |line| line + "\n" } - out << RDoc::Markup::Verbatim.new(*arglists) - out << RDoc::Markup::Rule.new(1) - end - - out << RDoc::Markup::BlankLine.new - out << method.comment - out << RDoc::Markup::BlankLine.new - end - end + out = method_document name, filtered display out end @@ -736,6 +730,7 @@ Options may also be set in the 'RI' environment variable. display_name name end end + ## # Expands abbreviated klass +klass+ into a fully-qualified class. "Zl::Da" # will be expanded to Zlib::DataError. @@ -1003,6 +998,40 @@ Options may also be set in the 'RI' environment variable. found.reject do |path, methods| methods.empty? end end + ## + # Builds a RDoc::Markup::Document from +found+, +klasess+ and +includes+ + + def method_document name, filtered + out = RDoc::Markup::Document.new + + out << RDoc::Markup::Heading.new(1, name) + out << RDoc::Markup::BlankLine.new + + filtered.each do |store, methods| + methods.each do |method| + out << RDoc::Markup::Paragraph.new("(from #{store.friendly_path})") + + unless name =~ /^#{Regexp.escape method.parent_name}/ then + out << RDoc::Markup::Heading.new(3, "Implementation from #{method.parent_name}") + end + out << RDoc::Markup::Rule.new(1) + + if method.arglists then + arglists = method.arglists.chomp.split "\n" + arglists = arglists.map { |line| line + "\n" } + out << RDoc::Markup::Verbatim.new(*arglists) + out << RDoc::Markup::Rule.new(1) + end + + out << RDoc::Markup::BlankLine.new + out << method.comment + out << RDoc::Markup::BlankLine.new + end + end + + out + end + ## # Returns the type of method (:both, :instance, :class) for +selector+ diff --git a/test/rdoc/test_rdoc_markup.rb b/test/rdoc/test_rdoc_markup.rb index 48683dbcda..ae6c11e7da 100644 --- a/test/rdoc/test_rdoc_markup.rb +++ b/test/rdoc/test_rdoc_markup.rb @@ -56,5 +56,36 @@ the time assert_equal expected, out end + def test_convert_document + doc = RDoc::Markup::Parser.parse <<-STR +now is +the time + + hello + dave + +1. l1 +2. l2 + STR + + m = RDoc::Markup.new + + tt = RDoc::Markup::ToTest.new m + + out = m.convert doc, tt + + expected = [ + "now is the time", + "\n", + " hello\n dave\n", + "1: ", + "l1", + "1: ", + "l2", + ] + + assert_equal expected, out + end + end diff --git a/test/rdoc/test_rdoc_markup_document.rb b/test/rdoc/test_rdoc_markup_document.rb index 70fb3efb16..6b4b5892ab 100644 --- a/test/rdoc/test_rdoc_markup_document.rb +++ b/test/rdoc/test_rdoc_markup_document.rb @@ -55,6 +55,12 @@ class TestRDocMarkupDocument < MiniTest::Unit::TestCase refute_empty @d end + def test_empty_eh_document + d = @RM::Document.new @d + + assert_empty d + end + def test_equals2 d2 = @RM::Document.new diff --git a/test/rdoc/test_rdoc_markup_pre_process.rb b/test/rdoc/test_rdoc_markup_pre_process.rb index db5fca5ac1..587a680f28 100644 --- a/test/rdoc/test_rdoc_markup_pre_process.rb +++ b/test/rdoc/test_rdoc_markup_pre_process.rb @@ -43,7 +43,7 @@ contents of a string. # FIXME 1.9 fix on windoze # preprocessor uses binread, so line endings are \r\n expected.gsub!("\n", "\r\n") if - RUBY_VERSION =~ /^1.9/ && RUBY_PLATFORM =~ /mswin|mingw/ + RUBY_VERSION < "1.9.3" && RUBY_PLATFORM =~ /mswin|mingw/ assert_equal expected, content end @@ -67,7 +67,7 @@ contents of a string. # FIXME 1.9 fix on windoze # preprocessor uses binread, so line endings are \r\n expected.gsub!("\n", "\r\n") if - RUBY_VERSION =~ /^1.9/ && RUBY_PLATFORM =~ /mswin|mingw/ + RUBY_VERSION < "1.9.3" && RUBY_PLATFORM =~ /mswin|mingw/ assert_equal expected, content end