All pastes #606362 Raw Edit

qapi.rb

public ruby v1 · immutable
·published 2007-07-06 20:12 UTC
rendered paste body
#!/usr/bin/env rubyrequire 'pp'class Qt4API  API_TOOL_PATH = '/usr/local/bin/rbqt4api'  @@dir = File.dirname(__FILE__)#   Signature = Struct.new :return_ , :class_ , :method_ , :args_  class Signature    attr_accessor :return_ , :class_ , :method_ , :args_    def initialize(return_ , class_ , method_ , args_)      @return_ , @class_ , @method_ , @args_ = return_ , class_ , method_ , args_    end    def inspect      "\n" + ['[C] ' + class_ , '[M]' + method_ , '[A]' + args_ , '[R]' + return_ ].join("\t")    end  end  @@api = nil  attr_reader :api    def initialize(api = @@api , use_cache = true)    return @api = api if api and api.class == Array    return if @api = load_cached if use_cache    @api =  `#{API_TOOL_PATH} -r`.strip.split("\n\t")    @api.collect!{|s|       sig = s.scan( /(.+?) ([^ ]+?)::([^ ]+?)(\(.*\))/ )[0]      if sig.nil? or sig.length != 4 ; pp s ; next; end      sig[0].gsub!(/^.* / , '')      sig[0].gsub!(/^Q(?!t)/ , 'Qt::')      sig[1].gsub!(/^Q(?!t)/ , 'Qt::')      Signature.new *sig    }    @api.compact!    update_cache  ensure    @@api = @api if @@api.nil?#     puts 'returned'  end    def load_cached    Marshal.load File.read(@@dir + '/qt4api_cache') rescue puts('couldnt load cache')  end    def update_cache    File.open(@@dir + '/qt4api_cache' , 'w+'){|f| Marshal.dump @api , f} rescue puts('couldnt update cache')  end    def find_signatures(params)    case params    when String      prms = {}      prms[:method_] , prms[:class_] , prms[:return_] , prms[:args_] = params.split(',').collect{|par|        par.empty? ? nil : Regexp.new(*par.strip.split('/'))      }      params = prms    end    subset = @api.find_all{|s|       next unless s.return_ =~ params[:return_] if params[:return_]      next unless s.class_ =~ params[:class_] if params[:class_]      next unless s.method_ =~ params[:method_] if params[:method_]      next unless s.args_ =~ params[:args_] if params[:args_]      true    }    Qt4APISubset.new( subset )  end    def classes    @class_cache ||= @api.map{|s| s.class_}.uniq  end  def inspect    @api.inspect  end  def method_missing meth , *args , &block    result = @api.send meth , *args , &block    result = Qt4APISubset.new(result) if result.is_a? Array    result  endendclass Qt4APISubset < Qt4APIendif $0 == __FILE__api = Qt4API.newputs "Usage: method_regex,class_regex,args_regex,return_type_regex"print ">> "while params = gets.chomp# :return_ , :class_ , :method_ , :args_beginfound = api.find_signatures( params )if found.length < 400pp found.sort_by{|s| s.class_}endputs "Found #{found.length} matches"rescue  => eputs enilensure print ">> "endendend