fastri 0.2.0.1 → 0.2.1.1

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGES CHANGED
@@ -1,6 +1,17 @@
1
1
 
2
2
  User-visible changes in FastRI
3
3
 
4
+ Since version 0.2.0 (2006-11-15)
5
+ ================================
6
+ Features
7
+ --------
8
+ * fri will use a pager in full-text search mode, and also when asked to
9
+ (-P, -T, --[no-]pager, --pager-cmd)
10
+ * multiple queries supported: fri upcase downcase
11
+ * fri -S is 100ms faster since it avoids requiring rubygems.rb
12
+ * list all classes/modules and methods with --classes and --methods, and both
13
+ with --list-names (-l)
14
+
4
15
  Since version 0.1.1 (2006-11-10)
5
16
  ================================
6
17
  Features
data/bin/fri CHANGED
@@ -3,7 +3,6 @@
3
3
  # Copyright (C) 2006 Mauricio Fernandez <mfp@acm.org>
4
4
  #
5
5
 
6
- require 'rinda/ring'
7
6
  require 'optparse'
8
7
  require 'fastri/util'
9
8
  require 'fastri/full_text_index'
@@ -31,6 +30,10 @@ options = {
31
30
  :show_matches => false,
32
31
  :do_full_text => false,
33
32
  :full_text_dir => File.join(FastRI::Util.find_home, ".fastri-fulltext"),
33
+ :use_pager => nil,
34
+ :pager => nil,
35
+ :list_classes => nil,
36
+ :list_methods => nil,
34
37
  }
35
38
  override_addr_env = false
36
39
  optparser = OptionParser.new do |opts|
@@ -57,14 +60,32 @@ optparser = OptionParser.new do |opts|
57
60
 
58
61
  opts.on("--show-matches", "Only show matching entries."){ options[:show_matches] = true }
59
62
 
63
+ opts.on("--classes", "List all known classes/modules.") do
64
+ options[:use_pager] = true
65
+ options[:list_classes] = true
66
+ end
67
+ opts.on("--methods", "List all known methods.") do
68
+ options[:use_pager] = true
69
+ options[:list_methods] = true
70
+ end
71
+ opts.on("-l", "--list-names", "List all known namespaces/methods.") do
72
+ options[:use_pager] = true
73
+ options[:list_classes] = true
74
+ options[:list_methods] = true
75
+ end
76
+
60
77
  opts.on("-S", "--full-text", "Perform full-text search.") do
61
78
  options[:do_full_text] = true
79
+ options[:use_pager] = true if options[:use_pager].nil?
80
+ options[:format] = "plain"
62
81
  end
63
82
 
64
83
  opts.on("-F", "--full-text-dir DIR", "Use full-text index in DIR",
65
84
  "(default: #{options[:full_text_dir]})") do |dir|
66
85
  options[:full_text_dir] = dir if dir
67
86
  options[:do_full_text] = true
87
+ options[:use_pager] = true
88
+ options[:format] = "plain"
68
89
  end
69
90
 
70
91
  opts.on("-f", "--format FMT", "Format to use when displaying output:",
@@ -72,6 +93,19 @@ optparser = OptionParser.new do |opts|
72
93
  options[:format] = format
73
94
  end
74
95
 
96
+ opts.on("-P", "--[no-]pager", "Use pager.", "(default: don't)") do |usepager|
97
+ options[:use_pager] = usepager
98
+ options[:format] = "plain" if usepager
99
+ end
100
+
101
+ opts.on("-T", "Don't use a pager."){ options[:use_pager] = false }
102
+
103
+ opts.on("--pager-cmd PAGER", "Use pager PAGER.", "(default: don't)") do |pager|
104
+ options[:pager] = pager
105
+ options[:use_pager] = true
106
+ options[:format] = "plain"
107
+ end
108
+
75
109
  opts.on("-w", "--width WIDTH", "Set the width of the output.") do |width|
76
110
  w = width.to_i
77
111
  options[:width] = w > 0 ? w : options[:width]
@@ -84,7 +118,7 @@ optparser = OptionParser.new do |opts|
84
118
  end
85
119
  optparser.parse!
86
120
 
87
- if ARGV.empty?
121
+ if !options[:list_classes] && !options[:list_methods] && ARGV.empty?
88
122
  puts optparser
89
123
  exit
90
124
  end
@@ -122,43 +156,7 @@ def magic_help(query)
122
156
  query
123
157
  end
124
158
  end
125
- help_query = magic_help(ARGV[0])
126
-
127
- #{{{ determine the address to bind to
128
- if override_addr_env
129
- addr_spec = options[:addr]
130
- else
131
- addr_spec = ENV["FASTRI_ADDR"] || options[:addr]
132
- end
133
-
134
- ip = addr_spec[/^[^:]+/] || "127.0.0.1"
135
- port = addr_spec[/:(\d+)/, 1] || 0
136
- addr = "druby://#{ip}:#{port}"
137
-
138
- #{{{ start DRb and perform request
139
- begin
140
- DRb.start_service(addr)
141
- ring_server = Rinda::RingFinger.primary
142
- rescue Exception
143
- puts <<EOF
144
- Couldn't initialize DRb and locate the Ring server.
145
159
 
146
- Please make sure that:
147
- * the fastri-server is running, the server is bound to the correct interface,
148
- and the ACL setup allows connections from this host
149
- * fri is using the correct interface for incoming DRb requests:
150
- either set the FASTRI_ADDR environment variable, or use --bind ADDR, e.g
151
- export FASTRI_ADDR="192.168.1.12"
152
- fri Array
153
- EOF
154
- exit(-1)
155
- end
156
- service = ring_server.read([:name, :FastRI, nil, nil])[2]
157
- info_options = {
158
- :formatter => options[:format],
159
- :width => options[:width],
160
- :lookup_order => options[:lookup_order],
161
- }
162
160
 
163
161
  MAX_CONTEXT_LINES = 20
164
162
  def context_wrap(text, width)
@@ -197,7 +195,7 @@ def display_fulltext_search_results(results, gem_dir_info = FastRI::Util.gem_dir
197
195
  puts
198
196
  end
199
197
 
200
- if options[:do_full_text]
198
+ def perform_fulltext_search(options)
201
199
  fulltext = File.join(options[:full_text_dir], "full_text.dat")
202
200
  suffixes = File.join(options[:full_text_dir], "suffixes.dat")
203
201
  begin
@@ -231,8 +229,9 @@ EOF
231
229
  puts "nil"
232
230
  else
233
231
  puts "#{paths.size} hits"
234
- paths.sort_by{|path| -path_map[path].size}.map do |path|
232
+ paths.sort_by{|path| 1.0 * -path_map[path].size / path_map[path].first.metadata[:size] ** 0.5}.map do |path|
235
233
  puts "=" * options[:width]
234
+ puts 1.0 * path_map[path].size / path_map[path].first.metadata[:size] ** 0.5
236
235
  display_fulltext_search_results(path_map[path], gem_dir_info, options[:width])
237
236
  end
238
237
  end
@@ -240,9 +239,74 @@ EOF
240
239
  exit 0
241
240
  end
242
241
 
243
- if options[:show_matches]
244
- puts service.matches(help_query, info_options).sort
242
+ #{{{ set up pager
243
+ if options[:use_pager]
244
+ [options[:pager], ENV["PAGER"], "less", "more", "pager"].compact.uniq.each do |pager|
245
+ begin
246
+ $stdout = IO.popen(pager, "w")
247
+ at_exit{ $stdout.close }
248
+ break
249
+ rescue Exception
250
+ end
251
+ end
252
+ end
253
+
254
+ #{{{ perform full text search if asked to
255
+ perform_fulltext_search(options) if options[:do_full_text]
256
+
257
+ #{{{ normal query
258
+ require 'rinda/ring'
259
+
260
+
261
+ #{{{ determine the address to bind to
262
+ if override_addr_env
263
+ addr_spec = options[:addr]
245
264
  else
246
- puts service.info(help_query, info_options)
265
+ addr_spec = ENV["FASTRI_ADDR"] || options[:addr]
266
+ end
267
+
268
+ ip = addr_spec[/^[^:]+/] || "127.0.0.1"
269
+ port = addr_spec[/:(\d+)/, 1] || 0
270
+ addr = "druby://#{ip}:#{port}"
271
+
272
+ #{{{ start DRb and perform request
273
+ begin
274
+ DRb.start_service(addr)
275
+ ring_server = Rinda::RingFinger.primary
276
+ rescue Exception
277
+ $stderr.puts <<EOF
278
+ Couldn't initialize DRb and locate the Ring server.
279
+
280
+ Please make sure that:
281
+ * the fastri-server is running, the server is bound to the correct interface,
282
+ and the ACL setup allows connections from this host
283
+ * fri is using the correct interface for incoming DRb requests:
284
+ either set the FASTRI_ADDR environment variable, or use --bind ADDR, e.g
285
+ export FASTRI_ADDR="192.168.1.12"
286
+ fri Array
287
+ EOF
288
+ exit(-1)
289
+ end
290
+ service = ring_server.read([:name, :FastRI, nil, nil])[2]
291
+ info_options = {
292
+ :formatter => options[:format],
293
+ :width => options[:width],
294
+ :lookup_order => options[:lookup_order],
295
+ }
296
+
297
+ # {{{ list classes or methods
298
+ puts service.all_classes if options[:list_classes]
299
+ puts service.all_methods if options[:list_methods]
300
+ exit if options[:list_classes] || options[:list_methods]
301
+
302
+ # {{{ normal query
303
+
304
+ ARGV.each do |term|
305
+ help_query = magic_help(term)
306
+ if options[:show_matches]
307
+ puts service.matches(help_query, info_options).sort
308
+ else
309
+ puts service.info(help_query, info_options)
310
+ end
247
311
  end
248
312
  # vi: set sw=2 expandtab:
@@ -182,7 +182,7 @@ end
182
182
 
183
183
 
184
184
  #{{{ event loop
185
- $stdout.sync = true
185
+ #$stdout.sync = true # better not set sync=true, causes problems with emacs
186
186
  EventLoop.new(service).run
187
187
 
188
188
  # vi: set sw=2 expandtab:
@@ -17,7 +17,7 @@ class FullTextIndexer
17
17
  end
18
18
 
19
19
  def add_document(name, data, metadata = {})
20
- @doc_hash[name] = [data, metadata]
20
+ @doc_hash[name] = [data, metadata.merge(:size => data.size)]
21
21
  @documents << name
22
22
  end
23
23
 
@@ -256,6 +256,16 @@ class RiService
256
256
  r ? r.map{|x| x.gsub(/\./, "::")} : nil
257
257
  end
258
258
 
259
+ # Return array of strings with the names of all known methods.
260
+ def all_methods
261
+ @ri_reader.full_method_names
262
+ end
263
+
264
+ # Return array of strings with the names of all known classes.
265
+ def all_classes
266
+ @ri_reader.full_class_names
267
+ end
268
+
259
269
  private
260
270
 
261
271
  def obtain_unqualified_method_entries(name, separators, order)
@@ -1,11 +1,28 @@
1
1
  # Copyright (C) 2006 Mauricio Fernandez <mfp@acm.org>
2
2
 
3
- require 'rdoc/ri/ri_paths'
4
- begin
5
- require 'rubygems'
6
- rescue LoadError
3
+ # emulate rubygems.rb and define Gem.path if not loaded
4
+ # This is much faster than requiring rubygems.rb, which loads way too much
5
+ # stuff.
6
+ unless defined? ::Gem
7
+ require 'rbconfig'
8
+ module Gem
9
+ def self.path
10
+ ENV['GEM_HOME'] || default_dir
11
+ end
12
+ def self.default_dir
13
+ if defined? RUBY_FRAMEWORK_VERSION
14
+ return File.join(File.dirname(Config::CONFIG["sitedir"]), "Gems")
15
+ else
16
+ File.join(Config::CONFIG['libdir'], 'ruby', 'gems', Config::CONFIG['ruby_version'])
17
+ end
18
+ end
19
+ end
7
20
  end
8
-
21
+ # don't let rdoc/ri/ri_paths load rubygems.rb, that takes ~100ms !
22
+ emulation = $".all?{|x| /rubygems\.rb$/ !~ x} # 1.9 compatibility
23
+ $".unshift "rubygems.rb" if emulation
24
+ require 'rdoc/ri/ri_paths'
25
+ $".delete "rubygems.rb" if emulation
9
26
  require 'rdoc/ri/ri_writer'
10
27
 
11
28
  module FastRI
@@ -2,11 +2,11 @@
2
2
  #
3
3
 
4
4
  module FastRI
5
- FASTRI_VERSION = "0.2.0"
6
- FASTRI_RELEASE_DATE = "2006-11-15"
5
+ FASTRI_VERSION = "0.2.1"
6
+ FASTRI_RELEASE_DATE = "2006-11-23"
7
7
  FASTRI_INDEX_FORMAT = "0.1.0"
8
- FASTRI_FT_INDEX_FORMAT = "0.0.0"
9
- FASTRI_FT_INDEX_FORMAT_MAJOR = "0"
8
+ FASTRI_FT_INDEX_FORMAT = "1.0.0"
9
+ FASTRI_FT_INDEX_FORMAT_MAJOR = "1"
10
10
  FASTRI_FT_INDEX_FORMAT_MINOR = "0"
11
11
  FASTRI_FT_INDEX_FORMAT_TEENY = "0"
12
12
  end
@@ -53,7 +53,7 @@ EOF
53
53
  fulltext = StringIO.new("")
54
54
  suffixarray = StringIO.new("")
55
55
  @indexer.build_index(fulltext, suffixarray)
56
- assert_equal(["\000\r\000\000\000foo.txt\000\004\b{\000\000"],
56
+ assert_equal(["\000\027\000\000\000foo.txt\000\004\b{\006:\tsizei\002\230:\000"],
57
57
  fulltext.string[-200..-1].scan(/\0.*$/))
58
58
  assert_equal(4000 * 4, suffixarray.string.size)
59
59
  end
@@ -37,7 +37,7 @@ class TestIntegrationFullTextIndex < Test::Unit::TestCase
37
37
  index = get_index
38
38
  assert_equal("first.txt", index.lookup("foo").path)
39
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)
40
+ assert_equal({:foo=>"baz", :type=>"text/plain", :size => 31}, index.lookup("foo").metadata)
41
+ assert_equal({:bar=>"foo", :type=>"application/msword", :size => 32}, index.lookup("bar").metadata)
42
42
  end
43
43
  end
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.0
3
3
  specification_version: 1
4
4
  name: fastri
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.2.0.1
7
- date: 2006-11-15 00:00:00 +01:00
6
+ version: 0.2.1.1
7
+ date: 2006-11-23 00:00:00 +01:00
8
8
  summary: RI docs across machines, faster and smarter than ri.
9
9
  require_paths:
10
10
  - lib