diff --git a/ChangeLog b/ChangeLog index 5b7aa43150..22b3a66a8c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +Wed Dec 29 07:07:06 2010 Eric Hodel + + * lib/rdoc: Import RDoc 3.1 + Tue Dec 28 18:36:38 2010 NAKAMURA Usaku * re.c (rb_reg_expr_str): need to escape if the coderage is invalid. diff --git a/NEWS b/NEWS index 97376bd303..1328a42b08 100644 --- a/NEWS +++ b/NEWS @@ -89,7 +89,7 @@ with all sufficient information, see the ChangeLog file. * IO.console * RDoc - * RDoc has been upgraded to RDoc 3.0.1. For full release notes see + * RDoc has been upgraded to RDoc 3.1. For full release notes see http://rdoc.rubyforge.org/History_txt.html * rexml diff --git a/lib/rdoc.rb b/lib/rdoc.rb index a453ee1039..ef02b43027 100644 --- a/lib/rdoc.rb +++ b/lib/rdoc.rb @@ -95,7 +95,7 @@ module RDoc ## # RDoc version you are using - VERSION = '3.0' + VERSION = '3.1' ## # Method visibilities diff --git a/lib/rdoc/class_module.rb b/lib/rdoc/class_module.rb index 1e75699ffa..64ccfdabd6 100644 --- a/lib/rdoc/class_module.rb +++ b/lib/rdoc/class_module.rb @@ -118,7 +118,8 @@ class RDoc::ClassModule < RDoc::Context def comment= comment return if comment.empty? - comment = "#{@comment}\n---\n#{normalize_comment comment}" unless + comment = normalize_comment comment + comment = "#{@comment}\n---\n#{comment}" unless @comment.empty? super diff --git a/lib/rdoc/encoding.rb b/lib/rdoc/encoding.rb index 4f0779881c..73ae505daf 100644 --- a/lib/rdoc/encoding.rb +++ b/lib/rdoc/encoding.rb @@ -60,8 +60,6 @@ module RDoc::Encoding # Sets the encoding of +string+ based on the magic comment def self.set_encoding string - return unless Object.const_defined? :Encoding - first_line = string[/\A(?:#!.*\n)?.*\n/] name = case first_line @@ -70,6 +68,10 @@ module RDoc::Encoding else return end + string.sub! first_line, '' + + return unless Object.const_defined? :Encoding + enc = Encoding.find name string.force_encoding enc if enc end diff --git a/lib/rdoc/generator/darkfish.rb b/lib/rdoc/generator/darkfish.rb index e5a6e57424..57873468e4 100644 --- a/lib/rdoc/generator/darkfish.rb +++ b/lib/rdoc/generator/darkfish.rb @@ -63,6 +63,11 @@ class RDoc::Generator::Darkfish VERSION = '2' + ## + # Description of this generator + + DESCRIPTION = 'HTML generator, written by Michael Granger' + ## # Initialize a few instance variables before we start diff --git a/lib/rdoc/generator/ri.rb b/lib/rdoc/generator/ri.rb index fb52997e89..e02805e40f 100644 --- a/lib/rdoc/generator/ri.rb +++ b/lib/rdoc/generator/ri.rb @@ -8,6 +8,11 @@ class RDoc::Generator::RI RDoc::RDoc.add_generator self + ## + # Description of this generator + + DESCRIPTION = 'creates ri data files' + ## # Set up a new ri generator diff --git a/lib/rdoc/generator/template/darkfish/classpage.rhtml b/lib/rdoc/generator/template/darkfish/classpage.rhtml index 72b86ec6a7..7d0cad0eed 100644 --- a/lib/rdoc/generator/template/darkfish/classpage.rhtml +++ b/lib/rdoc/generator/template/darkfish/classpage.rhtml @@ -134,7 +134,7 @@ <% end %>
-

Class Index +

Class/Module Index [+]

@@ -225,16 +225,22 @@
"> -
<% if method.call_seq %> - <%= method.call_seq.strip.gsub(/->/, '→').gsub( /^\w.+\./m, '') %> + <% method.call_seq.strip.split("\n").each_with_index do |call_seq, i| %> +
+ <%= call_seq.strip.gsub(/->/, '→').gsub( /^\w.+\./m, '') %> + <% if i == 0 %> click to toggle source + <% end %> +
+ <% end %> <% else %> +
<%= h method.name %><%= method.params %> click to toggle source - <% end %>
+ <% end %>
<% if method.comment %> diff --git a/lib/rdoc/markup/to_html.rb b/lib/rdoc/markup/to_html.rb index de723921e9..66f5c1986d 100644 --- a/lib/rdoc/markup/to_html.rb +++ b/lib/rdoc/markup/to_html.rb @@ -26,6 +26,11 @@ class RDoc::Markup::ToHtml < RDoc::Markup::Formatter attr_reader :in_list_entry # :nodoc: attr_reader :list # :nodoc: + ## + # Path to this document for relative links + + attr_accessor :from_path + ## # Converts a target url to one that is relative to a given path @@ -59,6 +64,7 @@ class RDoc::Markup::ToHtml < RDoc::Markup::Formatter @th = nil @in_list_entry = nil @list = nil + @from_path = '' # external hyperlinks @markup.add_special(/((link:|https?:|mailto:|ftp:|www\.)\S+\w)/, :HYPERLINK) @@ -79,8 +85,8 @@ class RDoc::Markup::ToHtml < RDoc::Markup::Formatter end ## - # Generate a hyperlink for url, labeled with text. Handle the - # special cases for img: and link: described under handle_special_HYPERLINK + # Generate a hyperlink for +url+, labeled with +text+. Handles the special + # cases for img: and link: described under handle_special_HYPERLINK def gen_url(url, text) if url =~ /([A-Za-z]+):(.*)/ then diff --git a/lib/rdoc/options.rb b/lib/rdoc/options.rb index 810f7fac0a..3d76569a7e 100644 --- a/lib/rdoc/options.rb +++ b/lib/rdoc/options.rb @@ -240,6 +240,32 @@ class RDoc::Options @title ||= string end + ## + # Returns a properly-space list of generators and their descriptions. + + def generator_descriptions + lengths = [] + + generators = RDoc::RDoc::GENERATORS.map do |name, generator| + lengths << name.length + + description = generator::DESCRIPTION if + generator.const_defined? :DESCRIPTION + + [name, description] + end + + longest = lengths.max + + generators.sort.map do |name, description| + if description then + " %-*s - %s" % [longest, name, description] + else + " #{name}" + end + end.join "\n" + end + ## # Parse command line options. @@ -274,8 +300,9 @@ Usage: #{opt.program_name} [options] [names...] will make rdoc show hashes in method links by default. Command-line options always will override those in RDOCOPT. - - Darkfish creates frameless HTML output by Michael Granger. - - ri creates ri data files + Available formatters: + +#{generator_descriptions} RDoc understands the following file formats: diff --git a/lib/rdoc/parser/c.rb b/lib/rdoc/parser/c.rb index 60e9fefd61..db37985b6d 100644 --- a/lib/rdoc/parser/c.rb +++ b/lib/rdoc/parser/c.rb @@ -371,7 +371,7 @@ class RDoc::Parser::C < RDoc::Parser def find_body(class_name, meth_name, meth_obj, body, quiet = false) case body - when %r%((?>/\*.*?\*/\s*)) + when %r%((?>/\*.*?\*/\s*)?) ((?:(?:static|SWIGINTERN)\s+)? (?:intern\s+)?VALUE\s+#{meth_name} \s*(\([^)]*\))([^;]|$))%xm then @@ -547,7 +547,7 @@ class RDoc::Parser::C < RDoc::Parser # with ARGF at the same indent, but that are after the first description # paragraph. - if comment =~ /call-seq:(.*?[^\s\*].*?)^\s*\*?\s*$/m then + if comment =~ /call-seq:(.*?(?:\S|\*\/?).*?)^\s*(?:\*\/?)?\s*$/m then all_start, all_stop = $~.offset(0) seq_start, seq_stop = $~.offset(1) diff --git a/lib/rdoc/parser/ruby.rb b/lib/rdoc/parser/ruby.rb index e6f07d66da..bec88bc52d 100644 --- a/lib/rdoc/parser/ruby.rb +++ b/lib/rdoc/parser/ruby.rb @@ -224,9 +224,11 @@ class RDoc::Parser::Ruby < RDoc::Parser ## # Look for a 'call-seq' in the comment, and override the normal parameter # stuff + #-- + # TODO handle undent def extract_call_seq(comment, meth) - if comment.sub!(/:?call-seq:(.*?)^\s*\#?\s*$/m, '') then + if comment.sub!(/:?call-seq:(.*?)(^\s*#?\s*$|\z)/m, '') then seq = $1 seq.gsub!(/^\s*\#\s*/, '') meth.call_seq = seq @@ -779,6 +781,8 @@ class RDoc::Parser::Ruby < RDoc::Parser @stats.add_attribute att end + + true end ## @@ -1230,10 +1234,10 @@ class RDoc::Parser::Ruby < RDoc::Parser if TkCOMMENT === tk then if non_comment_seen then # Look for RDoc in a comment about to be thrown away - parse_comment container, tk, comment unless comment.empty? + non_comment_seen = parse_comment container, tk, comment unless + comment.empty? comment = '' - non_comment_seen = false end while TkCOMMENT === tk do @@ -1360,6 +1364,11 @@ class RDoc::Parser::Ruby < RDoc::Parser return end + else + non_comment_seen = parse_comment container, tk, comment unless + comment.empty? + + comment = '' end comment = '' unless keep_comment diff --git a/lib/rdoc/ri/driver.rb b/lib/rdoc/ri/driver.rb index 9d61b1f243..112d65399c 100644 --- a/lib/rdoc/ri/driver.rb +++ b/lib/rdoc/ri/driver.rb @@ -610,7 +610,7 @@ Options may also be set in the 'RI' environment variable. end if class_methods or instance_methods or not klass.constants.empty? then - out << RDoc::Markup::Rule.new + out << RDoc::Markup::Rule.new(1) end unless klass.constants.empty? then diff --git a/lib/rdoc/ri/paths.rb b/lib/rdoc/ri/paths.rb index f44b0e1e95..a3c65bf928 100644 --- a/lib/rdoc/ri/paths.rb +++ b/lib/rdoc/ri/paths.rb @@ -19,7 +19,17 @@ module RDoc::RI::Paths SYSDIR = File.join base, "system" SITEDIR = File.join base, "site" - HOMEDIR = File.expand_path('~/.rdoc') rescue nil + homedir = begin + File.expand_path('~') + rescue ArgumentError + end + + homedir ||= ENV['HOME'] || + ENV['USERPROFILE'] || ENV['HOMEPATH'] # for 1.8 compatibility + + HOMEDIR = if homedir then + File.join homedir, ".rdoc" + end #:startdoc: @gemdirs = nil diff --git a/lib/rdoc/ruby_lex.rb b/lib/rdoc/ruby_lex.rb index cbe3ec9061..7e84a4ad8e 100644 --- a/lib/rdoc/ruby_lex.rb +++ b/lib/rdoc/ruby_lex.rb @@ -541,12 +541,12 @@ class RDoc::RubyLex catch(:RET) do if @lex_state == EXPR_ARG if @space_seen and peek(0) =~ /[0-9]/ - throw :RET, identify_number + throw :RET, identify_number(op) else @lex_state = EXPR_BEG end elsif @lex_state != EXPR_END and peek(0) =~ /[0-9]/ - throw :RET, identify_number + throw :RET, identify_number(op) else @lex_state = EXPR_BEG end @@ -1010,10 +1010,10 @@ class RDoc::RubyLex identify_string(lt, @quoted) end - def identify_number + def identify_number(op = "") @lex_state = EXPR_END - num = '' + num = op if peek(0) == "0" && peek(1) !~ /[.eE]/ num << getc diff --git a/lib/rdoc/stats.rb b/lib/rdoc/stats.rb index e0af445539..70e361feaa 100644 --- a/lib/rdoc/stats.rb +++ b/lib/rdoc/stats.rb @@ -24,6 +24,7 @@ class RDoc::Stats @files_so_far = 0 @num_files = num_files @fully_documented = nil + @percent_doc = nil @start = Time.now @@ -215,7 +216,9 @@ class RDoc::Stats report << nil cm.each_constant do |constant| - next if constant.documented? + # TODO constant aliases are listed in the summary but not reported + # figure out what to do here + next if constant.documented? || constant.is_alias_for report << " # in file #{constant.file.full_name}" report << " #{constant.name} = nil" end @@ -255,22 +258,36 @@ class RDoc::Stats def summary calculate + num_width = [@num_files, @num_items].max.to_s.length + nodoc_width = [ + @undoc_attributes, + @undoc_classes, + @undoc_constants, + @undoc_items, + @undoc_methods, + @undoc_modules, + ].max.to_s.length + report = [] - report << 'Files: %5d' % @num_files + report << 'Files: %*d' % [num_width, @num_files] + report << nil - report << 'Classes: %5d (%5d undocumented)' % [@num_classes, - @undoc_classes] - report << 'Modules: %5d (%5d undocumented)' % [@num_modules, - @undoc_modules] - report << 'Constants: %5d (%5d undocumented)' % [@num_constants, - @undoc_constants] - report << 'Attributes: %5d (%5d undocumented)' % [@num_attributes, - @undoc_attributes] - report << 'Methods: %5d (%5d undocumented)' % [@num_methods, - @undoc_methods] + + report << 'Classes: %*d (%*d undocumented)' % [ + num_width, @num_classes, nodoc_width, @undoc_classes] + report << 'Modules: %*d (%*d undocumented)' % [ + num_width, @num_modules, nodoc_width, @undoc_modules] + report << 'Constants: %*d (%*d undocumented)' % [ + num_width, @num_constants, nodoc_width, @undoc_constants] + report << 'Attributes: %*d (%*d undocumented)' % [ + num_width, @num_attributes, nodoc_width, @undoc_attributes] + report << 'Methods: %*d (%*d undocumented)' % [ + num_width, @num_methods, nodoc_width, @undoc_methods] + report << nil - report << 'Total: %5d (%5d undocumented)' % [@num_items, - @undoc_items] + + report << 'Total: %*d (%*d undocumented)' % [ + num_width, @num_items, nodoc_width, @undoc_items] report << '%6.2f%% documented' % @percent_doc if @percent_doc report << nil diff --git a/lib/rdoc/task.rb b/lib/rdoc/task.rb index 005c516eed..4a702e3fa8 100644 --- a/lib/rdoc/task.rb +++ b/lib/rdoc/task.rb @@ -53,6 +53,9 @@ require 'rake/tasklib' # # Simple Example: # +# gem 'rdoc' +# require 'rdoc/task' +# # RDoc::Task.new do |rd| # rd.main = "README.rdoc" # rd.rdoc_files.include("README.rdoc", "lib/**/*.rb") @@ -67,6 +70,9 @@ require 'rake/tasklib' # generating two sets of documentation. For instance, if you want to have a # development set of documentation including private methods: # +# gem 'rdoc' +# require 'rdoc/task' +# # RDoc::Task.new :rdoc_dev do |rd| # rd.main = "README.doc" # rd.rdoc_files.include("README.rdoc", "lib/**/*.rb") @@ -82,6 +88,9 @@ require 'rake/tasklib' # # For example: # +# gem 'rdoc' +# require 'rdoc/task' +# # RDoc::Task.new(:rdoc => "rdoc", :clobber_rdoc => "rdoc:clean", # :rerdoc => "rdoc:force") # @@ -116,6 +125,11 @@ class RDoc::Task < Rake::TaskLib attr_accessor :template + ## + # Name of format generator (--fmt) used by rdoc. (defaults to rdoc's default) + + attr_accessor :generator + ## # List of files to be included in the rdoc generation. (default is []) @@ -151,11 +165,27 @@ class RDoc::Task < Rake::TaskLib @main = nil @title = nil @template = nil + @generator = nil @options = [] yield self if block_given? define end + ## + # All source is inline now. This method is deprecated + + def inline_source() # :nodoc: + warn "RDoc::Task#inline_source is deprecated" + true + end + + ## + # All source is inline now. This method is deprecated + + def inline_source=(value) # :nodoc: + warn "RDoc::Task#inline_source is deprecated" + end + ## # Create the tasks defined by this task lib. @@ -201,9 +231,10 @@ class RDoc::Task < Rake::TaskLib def option_list result = @options.dup result << "-o" << @rdoc_dir - result << "--main" << main if main - result << "--title" << title if title - result << "-T" << template if template + result << "--main" << main if main + result << "--title" << title if title + result << "-T" << template if template + result << '-f' << generator if generator result end diff --git a/test/rdoc/test.ja.large.rdoc b/test/rdoc/test.ja.large.rdoc new file mode 100644 index 0000000000..a9c6c4691c --- /dev/null +++ b/test/rdoc/test.ja.large.rdoc @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- + 吾輩(わがはい)は猫である。名前はまだ無い。 + どこで生れたかとんと見当(けんとう)がつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。吾輩はここで始めて人間というものを見た。しかもあとで聞くとそれは書生という人間中で一番獰悪(どうあく)な種族であったそうだ。この書生というのは時々我々を捕(つかま)えて煮(に)て食うという話である。しかしその当時は何という考もなかったから別段恐しいとも思わなかった。ただ彼の掌(てのひら)に載せられてスーと持ち上げられた時何だかフワフワした感じがあったばかりである。掌の上で少し落ちついて書生の顔を見たのがいわゆる人間というものの見始(みはじめ)であろう。この時妙なものだと思った感じが今でも残っている。第一毛をもって装飾されべきはずの顔がつるつるしてまるで薬缶(やかん)だ。その後(ご)猫にもだいぶ逢(あ)ったがこんな片輪(かたわ)には一度も出会(でく)わした事がない。のみならず顔の真中があまりに突起している。そうしてその穴の中から時々ぷうぷうと煙(けむり)を吹く。どうも咽(む)せぽくて実に弱った。これが人間の飲む煙草(たばこ)というものである事はようやくこの頃知った。 diff --git a/test/rdoc/test_rdoc_encoding.rb b/test/rdoc/test_rdoc_encoding.rb index b940d93606..de6c10f678 100644 --- a/test/rdoc/test_rdoc_encoding.rb +++ b/test/rdoc/test_rdoc_encoding.rb @@ -30,7 +30,7 @@ class TestRDocEncoding < MiniTest::Unit::TestCase expected.gsub!("\n", "\r\n") if RUBY_VERSION =~ /^1.9/ && RUBY_PLATFORM =~ /mswin|mingw/ contents = RDoc::Encoding.read_file @tempfile.path, Encoding::UTF_8 - assert_equal expected, contents + assert_equal "hi everybody", contents assert_equal Encoding::UTF_8, contents.encoding end @@ -46,7 +46,7 @@ class TestRDocEncoding < MiniTest::Unit::TestCase contents = RDoc::Encoding.read_file @tempfile.path, Encoding::UTF_8 assert_equal Encoding::UTF_8, contents.encoding - assert_equal "# coding: ISO-8859-1\nhi \u00e9verybody", contents.sub("\r", '') + assert_equal "hi \u00e9verybody", contents.sub("\r", '') end def test_class_read_file_encoding_fancy @@ -62,7 +62,7 @@ class TestRDocEncoding < MiniTest::Unit::TestCase expected.gsub!("\n", "\r\n") if RUBY_VERSION =~ /^1.9/ && RUBY_PLATFORM =~ /win32|mingw32/ contents = RDoc::Encoding.read_file @tempfile.path, Encoding::UTF_8 - assert_equal expected, contents + assert_equal "hi everybody", contents assert_equal Encoding::UTF_8, contents.encoding end @@ -115,6 +115,20 @@ class TestRDocEncoding < MiniTest::Unit::TestCase assert_equal Encoding::UTF_8, s.encoding end + def test_class_set_encoding_strip + s = "# coding: UTF-8\n# more comments" + + RDoc::Encoding.set_encoding s + + assert_equal "# more comments", s + + s = "#!/bin/ruby\n# coding: UTF-8\n# more comments" + + RDoc::Encoding.set_encoding s + + assert_equal "# more comments", s + end + def test_class_set_encoding_bad skip "Encoding not implemented" unless Object.const_defined? :Encoding @@ -141,5 +155,12 @@ class TestRDocEncoding < MiniTest::Unit::TestCase end end + def test_sanity + skip "Encoding not implemented" unless Object.const_defined? :Encoding + + assert_equal Encoding::US_ASCII, ''.encoding, + 'If this file is not ASCII tests may incorrectly pass' + end + end diff --git a/test/rdoc/test_rdoc_markup_to_html.rb b/test/rdoc/test_rdoc_markup_to_html.rb index 8a5860fe25..8a2971155b 100644 --- a/test/rdoc/test_rdoc_markup_to_html.rb +++ b/test/rdoc/test_rdoc_markup_to_html.rb @@ -297,6 +297,11 @@ class TestRDocMarkupToHtml < RDoc::Markup::FormatterTestCase assert_equal '<>', @to.convert_string('<>') end + def test_gen_url + assert_equal 'example', + @to.gen_url('link:example', 'example') + end + def test_list_verbatim_2 str = "* one\n verb1\n verb2\n* two\n" diff --git a/test/rdoc/test_rdoc_options.rb b/test/rdoc/test_rdoc_options.rb index 3d07353c5f..a84503d3f5 100644 --- a/test/rdoc/test_rdoc_options.rb +++ b/test/rdoc/test_rdoc_options.rb @@ -9,6 +9,11 @@ class TestRDocOptions < MiniTest::Unit::TestCase def setup @options = RDoc::Options.new + @generators = RDoc::RDoc::GENERATORS.dup + end + + def teardown + RDoc::RDoc::GENERATORS.replace @generators end def test_check_files @@ -47,6 +52,20 @@ file 'unreadable' not readable assert_equal Encoding.default_external, @options.encoding end + def test_generator_descriptions + # HACK autotest/isolate should take care of this + RDoc::RDoc::GENERATORS.clear + RDoc::RDoc::GENERATORS['darkfish'] = RDoc::Generator::Darkfish + RDoc::RDoc::GENERATORS['ri'] = RDoc::Generator::RI + + expected = <<-EXPECTED.chomp + darkfish - HTML generator, written by Michael Granger + ri - creates ri data files + EXPECTED + + assert_equal expected, @options.generator_descriptions + end + def test_parse_dash_p out, err = capture_io do @options.parse %w[-p] @@ -178,6 +197,27 @@ file 'unreadable' not readable assert_equal 1, out.scan(/ri generator options:/). length end + def test_parse_help_extra_generator + RDoc::RDoc::GENERATORS['test'] = Class.new do + def self.setup_options options + op = options.option_parser + + op.separator 'test generator options:' + end + end + + out, = capture_io do + begin + @options.parse %w[--help] + rescue SystemExit + end + end + + assert_equal 1, out.scan(/HTML generator options:/).length + assert_equal 1, out.scan(/ri generator options:/). length + assert_equal 1, out.scan(/test generator options:/).length + end + def test_parse_ignore_invalid out, err = capture_io do @options.parse %w[--ignore-invalid --bogus] @@ -278,12 +318,13 @@ file 'unreadable' not readable end def test_setup_generator - test_generator = Object.new - def test_generator.setup_options(op) - @op = op - end + test_generator = Class.new do + def self.setup_options op + @op = op + end - def test_generator.op() @op end + def self.op() @op end + end RDoc::RDoc::GENERATORS['TestGenerator'] = test_generator @@ -293,6 +334,8 @@ file 'unreadable' not readable assert_equal [test_generator], @options.generator_options assert_equal @options, test_generator.op + ensure + RDoc::RDoc::GENERATORS.delete 'TestGenerator' end end diff --git a/test/rdoc/test_rdoc_parser.rb b/test/rdoc/test_rdoc_parser.rb index 2eb1ac1a67..e0629e37b6 100644 --- a/test/rdoc/test_rdoc_parser.rb +++ b/test/rdoc/test_rdoc_parser.rb @@ -28,6 +28,11 @@ class TestRDocParser < MiniTest::Unit::TestCase refute @RP.binary?(file_name) end + def test_class_binary_large_japanese_rdoc + file_name = File.expand_path '../test.ja.large.rdoc', __FILE__ + assert !@RP.binary?(file_name) + end + def test_class_binary_japanese_rdoc skip "Encoding not implemented" unless Object.const_defined? :Encoding diff --git a/test/rdoc/test_rdoc_parser_c.rb b/test/rdoc/test_rdoc_parser_c.rb index c6cc42081c..dd856c1bcf 100644 --- a/test/rdoc/test_rdoc_parser_c.rb +++ b/test/rdoc/test_rdoc_parser_c.rb @@ -532,6 +532,46 @@ Init_Foo(void) { assert_equal "VALUE\nother_function() ", code end + def test_find_body_2 + content = <<-CONTENT +/* Copyright (C) 2010 Sven Herzberg + * + * This file is free software; the author(s) gives unlimited + * permission to copy and/or distribute it, with or without + * modifications, as long as this notice is preserved. + */ + +#include + +static VALUE +wrap_initialize (VALUE self) +{ + return self; +} + +/* */ +static VALUE +wrap_shift (VALUE self, + VALUE arg) +{ + return self; +} + +void +init_gi_repository (void) +{ + VALUE mTest = rb_define_module ("Test"); + VALUE cTest = rb_define_class_under (mTest, "Test", rb_cObject); + + rb_define_method (cTest, "initialize", wrap_initialize, 0); + rb_define_method (cTest, "shift", wrap_shift, 0); +} + CONTENT + + klass = util_get_class content, 'cTest' + assert_equal 2, klass.method_list.length + end + def test_find_body_define content = <<-EOF /* @@ -633,6 +673,31 @@ commercial(cwyear, cweek=1, cwday=1, sg=nil) -> Date [ruby 1.9] assert_equal expected, method_obj.call_seq end + def test_find_modifiers_call_seq_no_blank + comment = <<-COMMENT +/* call-seq: + * commercial() -> Date
+ * commercial(cwyear, cweek=41, cwday=5, sg=nil) -> Date [ruby 1.8]
+ * commercial(cwyear, cweek=1, cwday=1, sg=nil) -> Date [ruby 1.9] + */ + + COMMENT + + parser = util_parser '' + method_obj = RDoc::AnyMethod.new nil, 'blah' + + parser.find_modifiers comment, method_obj + + expected = <<-CALL_SEQ.chomp +commercial() -> Date
+commercial(cwyear, cweek=41, cwday=5, sg=nil) -> Date [ruby 1.8]
+commercial(cwyear, cweek=1, cwday=1, sg=nil) -> Date [ruby 1.9] + + CALL_SEQ + + assert_equal expected, method_obj.call_seq + end + def test_find_modifiers_nodoc comment = <<-COMMENT /* :nodoc: diff --git a/test/rdoc/test_rdoc_parser_ruby.rb b/test/rdoc/test_rdoc_parser_ruby.rb index f2fa18c67b..dcaf561369 100644 --- a/test/rdoc/test_rdoc_parser_ruby.rb +++ b/test/rdoc/test_rdoc_parser_ruby.rb @@ -32,6 +32,66 @@ class TestRDocParserRuby < MiniTest::Unit::TestCase @tempfile2.close end + def test_extract_call_seq + m = RDoc::AnyMethod.new nil, 'm' + p = util_parser '' + + comment = <<-COMMENT + # call-seq: + # bla => true or false + # + # moar comment + COMMENT + + p.extract_call_seq comment, m + + assert_equal "bla => true or false\n", m.call_seq + end + + def test_extract_call_seq_blank + m = RDoc::AnyMethod.new nil, 'm' + p = util_parser '' + + comment = <<-COMMENT + # call-seq: + # bla => true or false + # + COMMENT + + p.extract_call_seq comment, m + + assert_equal "bla => true or false\n", m.call_seq + end + + def test_extract_call_seq_no_blank + m = RDoc::AnyMethod.new nil, 'm' + p = util_parser '' + + comment = <<-COMMENT + # call-seq: + # bla => true or false + COMMENT + + p.extract_call_seq comment, m + + assert_equal "bla => true or false\n", m.call_seq + end + + def test_extract_call_seq_undent + m = RDoc::AnyMethod.new nil, 'm' + p = util_parser '' + + comment = <<-COMMENT + # call-seq: + # bla => true or false + # moar comment + COMMENT + + p.extract_call_seq comment, m + + assert_equal "bla => true or false\nmoar comment\n", m.call_seq + end + def test_get_symbol_or_name util_parser "* & | + 5 / 4" @@ -503,6 +563,35 @@ end assert_equal @top_level, blah.file end + def test_parse_class_multi_ghost_methods + util_parser <<-'CLASS' +class Foo + ## + # :method: one + # + # my method + + ## + # :method: two + # + # my method + + [:one, :two].each do |t| + eval("def #{t}; \"#{t}\"; end") + end +end + CLASS + + tk = @parser.get_tk + + @parser.parse_class @top_level, RDoc::Parser::Ruby::NORMAL, tk, '' + + foo = @top_level.classes.first + assert_equal 'Foo', foo.full_name + + assert_equal 2, foo.method_list.length + end + def test_parse_class_nested_superclass util_top_level foo = @top_level.add_module RDoc::NormalModule, 'Foo' diff --git a/test/rdoc/test_rdoc_ri_paths.rb b/test/rdoc/test_rdoc_ri_paths.rb index 91e6abbfbd..e6f33d7d5e 100644 --- a/test/rdoc/test_rdoc_ri_paths.rb +++ b/test/rdoc/test_rdoc_ri_paths.rb @@ -1,11 +1,10 @@ require 'rubygems' -require 'test/unit' +require 'minitest/autorun' require 'tmpdir' require 'fileutils' require 'rdoc/ri/paths' -require_relative '../ruby/envutil' -class TestRDocRIPaths < Test::Unit::TestCase +class TestRDocRIPaths < MiniTest::Unit::TestCase def setup RDoc::RI::Paths.instance_variable_set :@gemdirs, %w[/nonexistent/gemdir] @@ -40,9 +39,5 @@ class TestRDocRIPaths < Test::Unit::TestCase assert_equal '/nonexistent/gemdir', path.shift end - def test_homeless - bug4202 = '[ruby-core:33867]' - assert(assert_in_out_err([{"HOME"=>nil}, *%w"-rrdoc/ri/paths -e;"], bug4202).success?, bug4202) - end end diff --git a/test/rdoc/test_rdoc_ruby_lex.rb b/test/rdoc/test_rdoc_ruby_lex.rb new file mode 100644 index 0000000000..4398f4119f --- /dev/null +++ b/test/rdoc/test_rdoc_ruby_lex.rb @@ -0,0 +1,23 @@ +require 'rubygems' +require 'minitest/autorun' +require 'rdoc/rdoc' +require 'rdoc/ruby_lex' + +class TestRubyLex < MiniTest::Unit::TestCase + def test_unary_minus + ruby_lex = RDoc::RubyLex.new("-1", nil) + assert_equal("-1", ruby_lex.token.value) + + ruby_lex = RDoc::RubyLex.new("a[-2]", nil) + 2.times { ruby_lex.token } # skip "a" and "[" + assert_equal("-2", ruby_lex.token.value) + + ruby_lex = RDoc::RubyLex.new("a[0..-12]", nil) + 4.times { ruby_lex.token } # skip "a", "[", "0", and ".." + assert_equal("-12", ruby_lex.token.value) + + ruby_lex = RDoc::RubyLex.new("0+-0.1", nil) + 2.times { ruby_lex.token } # skip "0" and "+" + assert_equal("-0.1", ruby_lex.token.value) + end +end diff --git a/test/rdoc/test_rdoc_stats.rb b/test/rdoc/test_rdoc_stats.rb new file mode 100644 index 0000000000..0032c75669 --- /dev/null +++ b/test/rdoc/test_rdoc_stats.rb @@ -0,0 +1,38 @@ +require 'rubygems' +require 'minitest/autorun' +require 'rdoc/stats' +require 'rdoc/code_objects' +require 'rdoc/markup' +require 'rdoc/parser' + +class TestRDocStats < MiniTest::Unit::TestCase + + def setup + RDoc::TopLevel.reset + + @s = RDoc::Stats.new 0 + end + + def test_report_constant_alias + tl = RDoc::TopLevel.new 'fake.rb' + mod = tl.add_module RDoc::NormalModule, 'M' + + c = tl.add_class RDoc::NormalClass, 'C' + mod.add_constant c + + ca = RDoc::Constant.new 'CA', nil, nil + ca.is_alias_for = c + + tl.add_constant ca + + RDoc::TopLevel.complete :public + + report = @s.report + + # TODO change this to refute match, aliases should be ignored as they are + # programmer convenience constructs + assert_match(/class Object/, report) + end + +end + diff --git a/test/rdoc/test_rdoc_task.rb b/test/rdoc/test_rdoc_task.rb index 8eaff1f25b..2b72e7f654 100644 --- a/test/rdoc/test_rdoc_task.rb +++ b/test/rdoc/test_rdoc_task.rb @@ -8,6 +8,26 @@ class TestRDocTask < MiniTest::Unit::TestCase Rake::Task.clear end + def test_inline_source + t = RDoc::Task.new + + _, err = capture_io do + assert t.inline_source + end + + assert_equal "RDoc::Task#inline_source is deprecated\n", err + + _, err = capture_io do + t.inline_source = false + end + + assert_equal "RDoc::Task#inline_source is deprecated\n", err + + capture_io do + assert t.inline_source + end + end + def test_tasks_creation RDoc::Task.new assert Rake::Task[:rdoc] @@ -23,6 +43,14 @@ class TestRDocTask < MiniTest::Unit::TestCase assert_equal :rdoc_dev, rd.name end + def test_generator_option + rdoc_task = RDoc::Task.new do |rd| + rd.generator = "ri" + end + + assert_equal %w[-o html -f ri], rdoc_task.option_list + end + def test_tasks_creation_with_custom_name_string rd = RDoc::Task.new("rdoc_dev") assert Rake::Task[:rdoc_dev]