ri and ri_proxy
Yesterday i have written a little caching proxy script for ri. The script forwards any invocation to ri. The results are cached in a sqlite3 database. So that any subsequent calls are much faster, not fast as i wished but definitely faster.
#!/usr/bin/env ruby
require 'rubygems'
ROOT = File.dirname(__FILE__)
BASE_NAME = File.basename(__FILE__)
DB_FILE = File.join(ROOT, BASE_NAME + '.sqlite3')
DB_CONFIG = {:adapter => 'sqlite3', :timeout => 5000, :database => DB_FILE}
LOG_FILE = File.join(ROOT, BASE_NAME + '.log')
# speed up active record loading a bit
require 'active_support'
RAILS_CONNECTION_ADAPTERS = ['sqlite']
require 'active_record'
ActiveRecord::Base.logger = nil # Logger.new(LOG_FILE)
ActiveRecord::Base.establish_connection(DB_CONFIG)
class RiMethodEntry < ActiveRecord::Base
end
force = false
if !RiMethodEntry.table_exists? or force
ActiveRecord::Schema.define(:version => 1) do
create_table :ri_method_entries, :force => true do |t|
t.column :name, :string, :null => false
t.column :text, :text, :null => false
end
add_index :ri_method_entries, :name
end
end
ARGV.length > 0 or raise Exception.new("No arguments found!")
name = ARGV[0]
entry = RiMethodEntry.find_by_name(name)
if entry
puts entry.text
exit
end
args = ARGV.collect { |a| %{"#{a}"} }
text = `ri #{args.join(" ")}`
found = text.starts_with?('-')
puts text
exit unless found
RiMethodEntry.create(:name => name, :text => text)
Labels: active_record, ri, ruby, sqlite3

