lib/grepg/parser.rb in grepg-0.0.7 vs lib/grepg/parser.rb in grepg-0.0.8

- old
+ new

@@ -21,10 +21,15 @@ opt :search, "text to search", :type => :string, :required => false, :short => "-s" + opt :search_operator, + "One of: OR, AND", + :type => :string, + :default => default_config['search_operator'], + :short => "-o" opt :colorize, "colorize output", :type => :boolean, :default => default_config['colorize'], :short => "-c" @@ -55,11 +60,12 @@ end @user = @opts[:user] @topic = @opts[:topic] @search_term = @opts[:search] - @colorize = @opts[:colorize] + @search_operator = (@opts[:search_operator] || "and").upcase.to_sym + @colorize = @opts[:colorize] || true end def self.get_default_config file = self.default_file_name file ? YAML.load(IO.read(file)) : {} @@ -82,51 +88,59 @@ def get_cheats(user, sheet_id) GrepPage::API.cheats(user, sheet_id) end - def filter_cheats(cheats, search_term) + def filter_cheats(cheats, search_term, search_operator) cheats.select do |cheat| - (cheat[:description].downcase[search_term.downcase] || - cheat[:command].downcase[search_term.downcase]) != nil + search_term.split(' ').map do |token| + text_to_search = [ cheat[:description], + cheat[:command] + ].join(' ').downcase + text_to_search.include? token.downcase + end.reduce {|a,b| search_operator == :AND ? a && b : a || b} end end - def process_args(user, topic, search_term, colorize) - headers = ["User: #{user}"] - headers << "Topic: #{topic}" if topic - headers << "Search-Term: #{search_term}" if search_term + def process_args + headers = ["User: #{@user}"] + headers << "Topic: #{@topic}" if @topic + if(@search_term) + label = "Search-Term: #{@search_term}" + label += "(#{@search_operator})" if @search_term.split(' ').count > 1 + headers << label + end puts headers.join(", ") begin - topics = get_all_topics(user) + topics = get_all_topics(@user) rescue RestClient::ResourceNotFound raise GrepPage::NotFoundError, "Unable to find user" end - unless topic + unless @topic # No topic specified so show all topics puts "Available Topics => " puts topics.map{|t| t[:name]} return end - topic = filter_topics(topics, topic) + topic = filter_topics(topics, @topic) if topic.nil? || topic.empty? puts "Can't find that topic. Choose one of the following" puts topics.map{|t| t[:name]} raise GrepPage::NotFoundError, "Unable to find topic" end - cheats = get_cheats(user, topic[:id]) - cheats = filter_cheats(cheats, search_term) if search_term + cheats = get_cheats(@user, topic[:id]) + cheats = filter_cheats(cheats, @search_term, @search_operator) if @search_term - GrepPage::Formatter.cheat_rows(cheats, search_term, colorize) + GrepPage::Formatter.cheat_rows(cheats, @search_term, @colorize) end def run! begin - process_args(@user, @topic, @search_term, @colorize) + process_args rescue GrepPage::NotFoundError => ex abort "Error: #{ex.message}" end end end