fastri 0.1.1.1 → 0.2.0.1
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.
- data/CHANGES +12 -0
- data/Rakefile +5 -4
- data/bin/fastri-server +77 -35
- data/bin/fri +145 -8
- data/bin/ri-emacs +1 -1
- data/lib/fastri/full_text_index.rb +245 -0
- data/lib/fastri/full_text_indexer.rb +100 -0
- data/lib/fastri/ri_index.rb +30 -0
- data/lib/fastri/ri_service.rb +6 -0
- data/lib/fastri/util.rb +83 -0
- data/lib/fastri/version.rb +6 -1
- data/test/test_full_text_index.rb +182 -0
- data/test/test_full_text_indexer.rb +84 -0
- data/test/test_integration_full_text_index.rb +43 -0
- data/test/test_ri_index.rb +99 -1
- data/test/test_util.rb +38 -0
- metadata +14 -3
| @@ -0,0 +1,43 @@ | |
| 1 | 
            +
            # Copyright (C) 2006  Mauricio Fernandez <mfp@acm.org>
         | 
| 2 | 
            +
            #
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            require 'test/unit'
         | 
| 5 | 
            +
            $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
         | 
| 6 | 
            +
            $:.unshift "lib"
         | 
| 7 | 
            +
            require 'fastri/full_text_indexer'
         | 
| 8 | 
            +
            require 'fastri/full_text_index'
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            class TestIntegrationFullTextIndex < Test::Unit::TestCase
         | 
| 11 | 
            +
              include FastRI
         | 
| 12 | 
            +
              def setup
         | 
| 13 | 
            +
                @indexer = FullTextIndexer.new(20)
         | 
| 14 | 
            +
              end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
              require 'stringio'
         | 
| 17 | 
            +
              def get_index
         | 
| 18 | 
            +
                fulltextIO = StringIO.new("")
         | 
| 19 | 
            +
                suffixIO   = StringIO.new("")
         | 
| 20 | 
            +
                @indexer.build_index(fulltextIO, suffixIO)
         | 
| 21 | 
            +
                FullTextIndex.new_from_ios(fulltextIO, suffixIO)
         | 
| 22 | 
            +
              end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
              def test_basic_matching
         | 
| 25 | 
            +
                @indexer.add_document("first.txt", "this is the first document: foo")
         | 
| 26 | 
            +
                @indexer.add_document("second.txt", "this is the second document: bar")
         | 
| 27 | 
            +
                index = get_index
         | 
| 28 | 
            +
                assert_equal("first.txt", index.lookup("foo").path)
         | 
| 29 | 
            +
                assert_equal("second.txt", index.lookup("bar").path)
         | 
| 30 | 
            +
              end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
              def test_metadata
         | 
| 33 | 
            +
                @indexer.add_document("first.txt", "this is the first document: foo",
         | 
| 34 | 
            +
                                      :type => "text/plain", :foo => 'baz')
         | 
| 35 | 
            +
                @indexer.add_document("second.doc", "this is the second document: bar",
         | 
| 36 | 
            +
                                      :type => "application/msword", :bar => "foo")
         | 
| 37 | 
            +
                index = get_index
         | 
| 38 | 
            +
                assert_equal("first.txt", index.lookup("foo").path)
         | 
| 39 | 
            +
                assert_equal("second.doc", index.lookup("bar").path)
         | 
| 40 | 
            +
                assert_equal({:foo=>"baz", :type=>"text/plain"}, index.lookup("foo").metadata)
         | 
| 41 | 
            +
                assert_equal({:bar=>"foo", :type=>"application/msword"}, index.lookup("bar").metadata)
         | 
| 42 | 
            +
              end
         | 
| 43 | 
            +
            end
         | 
    
        data/test/test_ri_index.rb
    CHANGED
    
    | @@ -89,6 +89,7 @@ EOF | |
| 89 89 | 
             
              end
         | 
| 90 90 |  | 
| 91 91 | 
             
              def test_get_class_entry
         | 
| 92 | 
            +
                assert_nil(@index.get_class_entry("NONEXISTENT_FOO"))
         | 
| 92 93 | 
             
                assert_equal("ABC", @index.get_class_entry("ABC", nil).full_name)
         | 
| 93 94 | 
             
                assert_nil(@index.get_class_entry("ABC", nil).source_index)
         | 
| 94 95 | 
             
                assert_nil(@index.get_class_entry("ABC::DEF::Foo", 0))
         | 
| @@ -141,6 +142,22 @@ EOF | |
| 141 142 | 
             
                             @index.namespaces_under(toplevel, true, "stuff-1.1.0").map{|x| x.full_name})
         | 
| 142 143 | 
             
              end
         | 
| 143 144 |  | 
| 145 | 
            +
              def test_source_paths_for_string
         | 
| 146 | 
            +
                assert_equal([], @index.source_paths_for(""))
         | 
| 147 | 
            +
                assert_equal([], @index.source_paths_for(nil))
         | 
| 148 | 
            +
             | 
| 149 | 
            +
                assert_equal(["/usr/share/ri/system/", "/long/path/somegem-0.1.0"], @index.source_paths_for("ABC::DEF"))
         | 
| 150 | 
            +
                assert_equal(["/long/path/somegem-0.1.0", "/long/path/stuff-1.1.0"], @index.source_paths_for("CDE.foo"))
         | 
| 151 | 
            +
              end
         | 
| 152 | 
            +
             | 
| 153 | 
            +
              def test_source_paths_for_entry
         | 
| 154 | 
            +
                assert_equal(["/usr/share/ri/system/", "/long/path/somegem-0.1.0"],
         | 
| 155 | 
            +
                             @index.source_paths_for(@index.get_class_entry("ABC::DEF")))
         | 
| 156 | 
            +
                assert_equal(["/long/path/somegem-0.1.0", "/long/path/stuff-1.1.0"],
         | 
| 157 | 
            +
                             @index.source_paths_for(@index.get_method_entry("CDE.foo")))
         | 
| 158 | 
            +
              end
         | 
| 159 | 
            +
             | 
| 160 | 
            +
             | 
| 144 161 | 
             
              def test_methods_under_scoped
         | 
| 145 162 | 
             
                results = @index.methods_under("ABC", true, 1)
         | 
| 146 163 | 
             
                assert_equal(["ABC::DEF::Foo#baz", "ABC::DEF::Foo#foo", "ABC::Zzz.foo"], results.map{|x| x.full_name})
         | 
| @@ -255,7 +272,16 @@ EOF | |
| 255 272 | 
             
                assert_equal(["CDE.foo"], @index.find_methods("foo", true, toplevel).map{|x| x.full_name})
         | 
| 256 273 | 
             
              end
         | 
| 257 274 |  | 
| 258 | 
            -
              def  | 
| 275 | 
            +
              def test_num_namespaces
         | 
| 276 | 
            +
                assert_equal(7, @index.num_namespaces)
         | 
| 277 | 
            +
              end
         | 
| 278 | 
            +
             | 
| 279 | 
            +
              def test_num_methods
         | 
| 280 | 
            +
                assert_equal(7, @index.num_methods)
         | 
| 281 | 
            +
              end
         | 
| 282 | 
            +
             | 
| 283 | 
            +
              #{{{ ClassEntry and MethodEntry
         | 
| 284 | 
            +
              def test_ClassEntry_contained_modules_matching
         | 
| 259 285 | 
             
                toplevel = @index.top_level_namespace[0]
         | 
| 260 286 | 
             
                assert_equal(["ABC"], toplevel.contained_modules_matching("ABC").map{|x| x.full_name})
         | 
| 261 287 |  | 
| @@ -263,5 +289,77 @@ EOF | |
| 263 289 | 
             
                assert_equal([], class_entry.contained_modules_matching("ABC").map{|x| x.full_name})
         | 
| 264 290 | 
             
                assert_equal(["ABC::DEF", "ABC::Zzz"], class_entry.contained_modules_matching("").map{|x| x.full_name})
         | 
| 265 291 | 
             
              end
         | 
| 292 | 
            +
             | 
| 293 | 
            +
              def test_ClassEntry_type
         | 
| 294 | 
            +
                class_entry = @index.get_class_entry("ABC")
         | 
| 295 | 
            +
                assert_equal(:namespace, class_entry.type)
         | 
| 296 | 
            +
              end
         | 
| 297 | 
            +
             | 
| 298 | 
            +
              def test_ClassEntry_path_names
         | 
| 299 | 
            +
                class_entry = @index.get_class_entry("ABC")
         | 
| 300 | 
            +
                assert_equal(["/usr/share/ri/system/ABC", "/long/path/somegem-0.1.0/ABC"], class_entry.path_names)
         | 
| 301 | 
            +
             | 
| 302 | 
            +
                class_entry = @index.get_class_entry("ABC", 0)
         | 
| 303 | 
            +
                assert_equal(["/usr/share/ri/system/ABC"], class_entry.path_names)
         | 
| 304 | 
            +
                class_entry = @index.get_class_entry("ABC", 1)
         | 
| 305 | 
            +
                assert_equal(["/long/path/somegem-0.1.0/ABC"], class_entry.path_names)
         | 
| 306 | 
            +
              end
         | 
| 307 | 
            +
             | 
| 308 | 
            +
              def test_ClassEntry_classes_and_modules
         | 
| 309 | 
            +
                class_entry = @index.get_class_entry("ABC")
         | 
| 310 | 
            +
                assert_equal(["ABC::DEF", "ABC::Zzz"], 
         | 
| 311 | 
            +
                             class_entry.classes_and_modules.map{|x| x.full_name})
         | 
| 312 | 
            +
                class_entry = @index.get_class_entry("ABC::DEF")
         | 
| 313 | 
            +
                assert_equal(["ABC::DEF::Foo"], class_entry.classes_and_modules.map{|x| x.full_name})
         | 
| 314 | 
            +
              end
         | 
| 315 | 
            +
             | 
| 316 | 
            +
              def test_ClassEntry_contained_class_named
         | 
| 317 | 
            +
                class_entry = @index.get_class_entry("ABC")
         | 
| 318 | 
            +
                class_entry = class_entry.contained_class_named("DEF")
         | 
| 319 | 
            +
                assert_equal("ABC::DEF", class_entry.full_name)
         | 
| 320 | 
            +
                assert_equal(1, class_entry.index)
         | 
| 321 | 
            +
                class_entry = class_entry.contained_class_named("Foo")
         | 
| 322 | 
            +
                assert_equal(2, class_entry.index)
         | 
| 323 | 
            +
                assert_nil(class_entry.contained_class_named("Bar"))
         | 
| 324 | 
            +
                assert_equal(3, @index.get_class_entry("ABC").contained_class_named("Zzz").index)
         | 
| 325 | 
            +
              end
         | 
| 326 | 
            +
             | 
| 327 | 
            +
              def test_ClassEntry_methods_matching
         | 
| 328 | 
            +
                class_entry = @index.get_class_entry("ABC::Zzz")
         | 
| 329 | 
            +
                assert_equal([], class_entry.methods_matching("nonexistent", false))
         | 
| 330 | 
            +
                assert_equal([3], class_entry.methods_matching("foo", true).map{|x| x.index})
         | 
| 331 | 
            +
                assert_equal([4], class_entry.methods_matching("foo", false).map{|x| x.index})
         | 
| 332 | 
            +
              end
         | 
| 333 | 
            +
             | 
| 334 | 
            +
              def test_ClassEntry_recursively_find_methods_matching
         | 
| 335 | 
            +
                class_entry = @index.get_class_entry("ABC")
         | 
| 336 | 
            +
                assert_equal(["ABC::DEF.bar", "ABC::Zzz.foo"], 
         | 
| 337 | 
            +
                             class_entry.recursively_find_methods_matching(//, true).map{|x| x.full_name})
         | 
| 338 | 
            +
                assert_equal(["ABC::DEF::Foo#baz", "ABC::DEF::Foo#foo", "ABC::Zzz#foo"], 
         | 
| 339 | 
            +
                             class_entry.recursively_find_methods_matching(//, false).map{|x| x.full_name})
         | 
| 340 | 
            +
                assert_equal([], class_entry.recursively_find_methods_matching(/nonono/, false).map{|x| x.full_name})
         | 
| 341 | 
            +
              end
         | 
| 342 | 
            +
             | 
| 343 | 
            +
              def test_ClassEntry_all_method_names
         | 
| 344 | 
            +
                class_entry = @index.get_class_entry("ABC")
         | 
| 345 | 
            +
                assert_equal([], class_entry.all_method_names)
         | 
| 346 | 
            +
                class_entry = @index.get_class_entry("ABC::Zzz")
         | 
| 347 | 
            +
                assert_equal(["ABC::Zzz.foo", "ABC::Zzz#foo"], class_entry.all_method_names)
         | 
| 348 | 
            +
              end
         | 
| 349 | 
            +
             | 
| 350 | 
            +
              def test_MethodEntry_path_name
         | 
| 351 | 
            +
                method_entry = @index.get_method_entry("CDE.foo")
         | 
| 352 | 
            +
                assert_equal("/long/path/somegem-0.1.0/CDE/foo-c.yaml", method_entry.path_name)
         | 
| 353 | 
            +
             | 
| 354 | 
            +
                method_entry = @index.get_method_entry("CDE.foo", 1)
         | 
| 355 | 
            +
                assert_equal("/long/path/somegem-0.1.0/CDE/foo-c.yaml", method_entry.path_name)
         | 
| 356 | 
            +
                method_entry = @index.get_method_entry("CDE.foo", 2)
         | 
| 357 | 
            +
                assert_equal("/long/path/stuff-1.1.0/CDE/foo-c.yaml", method_entry.path_name)
         | 
| 358 | 
            +
              end
         | 
| 359 | 
            +
             | 
| 360 | 
            +
              def test_MethodEntry_type
         | 
| 361 | 
            +
                method_entry = @index.get_method_entry("CDE.foo")
         | 
| 362 | 
            +
                assert_equal(:method, method_entry.type)
         | 
| 363 | 
            +
              end
         | 
| 266 364 | 
             
            end
         | 
| 267 365 |  | 
    
        data/test/test_util.rb
    ADDED
    
    | @@ -0,0 +1,38 @@ | |
| 1 | 
            +
            # Copyright (C) 2006  Mauricio Fernandez <mfp@acm.org>
         | 
| 2 | 
            +
            #
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            require 'test/unit'
         | 
| 5 | 
            +
            $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
         | 
| 6 | 
            +
            $:.unshift "lib"
         | 
| 7 | 
            +
            require 'fastri/util'
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            class TestUtil < Test::Unit::TestCase
         | 
| 10 | 
            +
              data = <<EOF
         | 
| 11 | 
            +
            foo 0.1.1 /usr/local/lib/ruby/gems/1.8/doc/foo-0.1.1/ri
         | 
| 12 | 
            +
            foo 1.1.1 /usr/local/lib/ruby/gems/1.8/doc/foo-1.1.1/ri
         | 
| 13 | 
            +
            bar 0.1.1 /usr/local/lib/ruby/gems/1.8/doc/bar-0.1.1/ri
         | 
| 14 | 
            +
            baz 0.1.1 /usr/local/lib/ruby/gems/1.8/doc/baz-0.1.1/ri
         | 
| 15 | 
            +
            EOF
         | 
| 16 | 
            +
              GEM_DIR_INFO = data.split(/\n/).map{|l| l.split(/\s+/)}
         | 
| 17 | 
            +
             | 
| 18 | 
            +
              include FastRI::Util
         | 
| 19 | 
            +
              def test_gem_info_for_path
         | 
| 20 | 
            +
                assert_equal(["foo", "0.1.1", "/usr/local/lib/ruby/gems/1.8/doc/foo-0.1.1/ri"],
         | 
| 21 | 
            +
                             gem_info_for_path("/usr/local/lib/ruby/gems/1.8/doc/foo-0.1.1/ri/Array/cdesc-Array.yaml", GEM_DIR_INFO))
         | 
| 22 | 
            +
                assert_equal(["foo", "1.1.1", "/usr/local/lib/ruby/gems/1.8/doc/foo-1.1.1/ri"],
         | 
| 23 | 
            +
                             gem_info_for_path("/usr/local/lib/ruby/gems/1.8/doc/foo-1.1.1/ri/Array/cdesc-Array.yaml", GEM_DIR_INFO))
         | 
| 24 | 
            +
                assert_equal(["bar", "0.1.1", "/usr/local/lib/ruby/gems/1.8/doc/bar-0.1.1/ri"],
         | 
| 25 | 
            +
                             gem_info_for_path("/usr/local/lib/ruby/gems/1.8/doc/bar-0.1.1/ri/Array/cdesc-Array.yaml", GEM_DIR_INFO))
         | 
| 26 | 
            +
                assert_equal(["baz", "0.1.1", "/usr/local/lib/ruby/gems/1.8/doc/baz-0.1.1/ri"],
         | 
| 27 | 
            +
                             gem_info_for_path("/usr/local/lib/ruby/gems/1.8/doc/baz-0.1.1/ri/Array/cdesc-Array.yaml", GEM_DIR_INFO))
         | 
| 28 | 
            +
                assert_nil(gem_info_for_path("/usr/lib/ruby/gems/1.8/doc/baz-1.1.1/ri/Array/cdesc-Array.yaml", GEM_DIR_INFO))
         | 
| 29 | 
            +
              end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
              def test_gem_relpath_to_full_name
         | 
| 32 | 
            +
                assert_equal("Array", gem_relpath_to_full_name("Array/cdesc-Array.yaml"))
         | 
| 33 | 
            +
                assert_equal("String", gem_relpath_to_full_name("String/cdesc-String.yaml"))
         | 
| 34 | 
            +
                assert_equal("Foo::Bar::String", gem_relpath_to_full_name("Foo/Bar/String/cdesc-String.yaml"))
         | 
| 35 | 
            +
                assert_equal("Foo::Bar#eql?", gem_relpath_to_full_name("Foo/Bar/eql%3f-i.yaml"))
         | 
| 36 | 
            +
                assert_equal("Foo::Bar.eql?", gem_relpath_to_full_name("Foo/Bar/eql%3f-c.yaml"))
         | 
| 37 | 
            +
              end
         | 
| 38 | 
            +
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -3,15 +3,15 @@ rubygems_version: 0.9.0 | |
| 3 3 | 
             
            specification_version: 1
         | 
| 4 4 | 
             
            name: fastri
         | 
| 5 5 | 
             
            version: !ruby/object:Gem::Version 
         | 
| 6 | 
            -
              version: 0. | 
| 7 | 
            -
            date: 2006-11- | 
| 6 | 
            +
              version: 0.2.0.1
         | 
| 7 | 
            +
            date: 2006-11-15 00:00:00 +01:00
         | 
| 8 8 | 
             
            summary: RI docs across machines, faster and smarter than ri.
         | 
| 9 9 | 
             
            require_paths: 
         | 
| 10 10 | 
             
            - lib
         | 
| 11 11 | 
             
            email: mfp@acm.org
         | 
| 12 12 | 
             
            homepage: http://eigenclass.org/hiki.rb?fastri
         | 
| 13 13 | 
             
            rubyforge_project: 
         | 
| 14 | 
            -
            description: FastRI is an alternative to the ri command-line tool. It is *much* faster, and also allows you to offer RI lookup services over DRb. FastRI is  | 
| 14 | 
            +
            description: FastRI is an alternative to the ri command-line tool. It is *much* faster, and also allows you to offer RI lookup services over DRb. FastRI is smarter than ri, and can find classes anywhere in the hierarchy without specifying the "full path". FastRI can perform fast full-text searches. It also knows about gems, and can tell you e.g. which extensions to a core class were added by a specific gem.
         | 
| 15 15 | 
             
            autorequire: 
         | 
| 16 16 | 
             
            default_executable: 
         | 
| 17 17 | 
             
            bindir: bin
         | 
| @@ -60,6 +60,9 @@ files: | |
| 60 60 | 
             
            - lib/fastri/ri_index.rb
         | 
| 61 61 | 
             
            - lib/fastri/ri_service.rb
         | 
| 62 62 | 
             
            - lib/fastri/version.rb
         | 
| 63 | 
            +
            - lib/fastri/util.rb
         | 
| 64 | 
            +
            - lib/fastri/full_text_indexer.rb
         | 
| 65 | 
            +
            - lib/fastri/full_text_index.rb
         | 
| 63 66 | 
             
            - lib/fastri/name_descriptor.rb
         | 
| 64 67 | 
             
            - CHANGES
         | 
| 65 68 | 
             
            - COPYING
         | 
| @@ -68,14 +71,22 @@ files: | |
| 68 71 | 
             
            - Rakefile
         | 
| 69 72 | 
             
            - README.en
         | 
| 70 73 | 
             
            - test/test_ri_index.rb
         | 
| 74 | 
            +
            - test/test_full_text_index.rb
         | 
| 71 75 | 
             
            - test/test_functional_ri_service.rb
         | 
| 76 | 
            +
            - test/test_full_text_indexer.rb
         | 
| 72 77 | 
             
            - test/test_name_descriptor.rb
         | 
| 78 | 
            +
            - test/test_util.rb
         | 
| 79 | 
            +
            - test/test_integration_full_text_index.rb
         | 
| 73 80 | 
             
            - setup.rb
         | 
| 74 81 | 
             
            - pre-install.rb
         | 
| 75 82 | 
             
            test_files: 
         | 
| 76 83 | 
             
            - test/test_ri_index.rb
         | 
| 84 | 
            +
            - test/test_full_text_index.rb
         | 
| 77 85 | 
             
            - test/test_functional_ri_service.rb
         | 
| 86 | 
            +
            - test/test_full_text_indexer.rb
         | 
| 78 87 | 
             
            - test/test_name_descriptor.rb
         | 
| 88 | 
            +
            - test/test_util.rb
         | 
| 89 | 
            +
            - test/test_integration_full_text_index.rb
         | 
| 79 90 | 
             
            rdoc_options: 
         | 
| 80 91 | 
             
            - --title
         | 
| 81 92 | 
             
            - "FastRI: better, faster ri"
         |