rifle 0.0.1 → 0.0.2
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/app/controllers/application_controller.rb +4 -0
 - data/app/controllers/searches_controller.rb +16 -0
 - data/lib/rifle.rb +46 -20
 - data/lib/rifle/engine.rb +5 -0
 - data/lib/rifle/rifle_resque.rb +22 -0
 - data/lib/rifle/version.rb +1 -1
 - metadata +54 -2
 
| 
         @@ -0,0 +1,16 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            class SearchesController < ApplicationController
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
              def store
         
     | 
| 
      
 4 
     | 
    
         
            +
                urn = params[:urn]
         
     | 
| 
      
 5 
     | 
    
         
            +
                payload = JSON.parse(request.body.read)
         
     | 
| 
      
 6 
     | 
    
         
            +
                Rifle.store(urn, payload)
         
     | 
| 
      
 7 
     | 
    
         
            +
                render json: {status: 'success'}, status: :ok
         
     | 
| 
      
 8 
     | 
    
         
            +
              end
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
              def search
         
     | 
| 
      
 11 
     | 
    
         
            +
                words = params[:q]
         
     | 
| 
      
 12 
     | 
    
         
            +
                results = Rifle.search(words)
         
     | 
| 
      
 13 
     | 
    
         
            +
                render json: results, status: :ok
         
     | 
| 
      
 14 
     | 
    
         
            +
              end
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
            end
         
     | 
    
        data/lib/rifle.rb
    CHANGED
    
    | 
         @@ -1,17 +1,26 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'json'
         
     | 
| 
       1 
2 
     | 
    
         
             
            require 'set'
         
     | 
| 
       2 
3 
     | 
    
         
             
            require 'redis'
         
     | 
| 
       3 
4 
     | 
    
         
             
            require 'text'
         
     | 
| 
      
 5 
     | 
    
         
            +
            require_relative 'rifle/rifle_resque'
         
     | 
| 
       4 
6 
     | 
    
         | 
| 
       5 
7 
     | 
    
         
             
            module Rifle
         
     | 
| 
       6 
8 
     | 
    
         | 
| 
       7 
9 
     | 
    
         
             
              class Settings
         
     | 
| 
       8 
     | 
    
         
            -
                attr_accessor :ignored_words, :min_word_length, :redis
         
     | 
| 
      
 10 
     | 
    
         
            +
                attr_accessor :ignored_words, :min_word_length, :redis, :server
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
       9 
12 
     | 
    
         
             
                def ignored_words
         
     | 
| 
       10 
13 
     | 
    
         
             
                  @ignored_words ||= ["the", "and", "you", "that"]
         
     | 
| 
       11 
14 
     | 
    
         
             
                end
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
       12 
16 
     | 
    
         
             
                def min_word_length
         
     | 
| 
       13 
17 
     | 
    
         
             
                  @min_word_length ||= 3
         
     | 
| 
       14 
18 
     | 
    
         
             
                end
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
                def server
         
     | 
| 
      
 21 
     | 
    
         
            +
                  @server ||= 'http://localhost:3000'
         
     | 
| 
      
 22 
     | 
    
         
            +
                end
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
       15 
24 
     | 
    
         
             
                def redis
         
     | 
| 
       16 
25 
     | 
    
         
             
                  @redis ||= Redis.new
         
     | 
| 
       17 
26 
     | 
    
         
             
                end
         
     | 
| 
         @@ -23,50 +32,59 @@ module Rifle 
     | 
|
| 
       23 
32 
     | 
    
         
             
                @@settings
         
     | 
| 
       24 
33 
     | 
    
         
             
              end
         
     | 
| 
       25 
34 
     | 
    
         | 
| 
       26 
     | 
    
         
            -
              def self. 
     | 
| 
       27 
     | 
    
         
            -
                 
     | 
| 
       28 
     | 
    
         
            -
                p.index_resource(urn, hash)
         
     | 
| 
      
 35 
     | 
    
         
            +
              def self.store(urn, hash)
         
     | 
| 
      
 36 
     | 
    
         
            +
                Processor.new.index_resource(urn, hash)
         
     | 
| 
       29 
37 
     | 
    
         
             
              end
         
     | 
| 
       30 
38 
     | 
    
         | 
| 
       31 
     | 
    
         
            -
              def self.search(words)
         
     | 
| 
       32 
     | 
    
         
            -
                 
     | 
| 
       33 
     | 
    
         
            -
                p.search_for(words)
         
     | 
| 
      
 39 
     | 
    
         
            +
              def self.search(words, urns_only = false)
         
     | 
| 
      
 40 
     | 
    
         
            +
                Processor.new.search_for(words, urns_only)
         
     | 
| 
       34 
41 
     | 
    
         
             
              end
         
     | 
| 
       35 
42 
     | 
    
         | 
| 
       36 
43 
     | 
    
         
             
              class Processor
         
     | 
| 
       37 
44 
     | 
    
         | 
| 
       38 
45 
     | 
    
         
             
                def index_resource(urn, hash)
         
     | 
| 
       39 
     | 
    
         
            -
                  words =  
     | 
| 
       40 
     | 
    
         
            -
                  traverse_sentences(hash, words)
         
     | 
| 
      
 46 
     | 
    
         
            +
                  words = traverse_object(hash, words)
         
     | 
| 
       41 
47 
     | 
    
         
             
                  metaphones = get_metaphones(words)
         
     | 
| 
       42 
48 
     | 
    
         
             
                  metaphones.each do |metaphone|
         
     | 
| 
       43 
49 
     | 
    
         
             
                    save_processed(urn, metaphone)
         
     | 
| 
       44 
50 
     | 
    
         
             
                  end
         
     | 
| 
      
 51 
     | 
    
         
            +
                  save_payload(urn, hash)
         
     | 
| 
       45 
52 
     | 
    
         
             
                  metaphones
         
     | 
| 
       46 
53 
     | 
    
         
             
                end
         
     | 
| 
       47 
54 
     | 
    
         | 
| 
       48 
     | 
    
         
            -
                def search_for(sentence)
         
     | 
| 
      
 55 
     | 
    
         
            +
                def search_for(sentence, urns_only)
         
     | 
| 
       49 
56 
     | 
    
         
             
                  words = get_words_from_text(sentence)
         
     | 
| 
       50 
57 
     | 
    
         
             
                  metaphones = get_metaphones(words)
         
     | 
| 
       51 
58 
     | 
    
         
             
                  urns = Set.new
         
     | 
| 
       52 
59 
     | 
    
         
             
                  metaphones.each do |metaphone|
         
     | 
| 
       53 
60 
     | 
    
         
             
                    new_urns = get_urns_for_metaphone(metaphone)
         
     | 
| 
       54 
     | 
    
         
            -
                    urns =urns.merge(new_urns)
         
     | 
| 
      
 61 
     | 
    
         
            +
                    urns = urns.merge(new_urns)
         
     | 
| 
      
 62 
     | 
    
         
            +
                  end
         
     | 
| 
      
 63 
     | 
    
         
            +
                  if urns_only
         
     | 
| 
      
 64 
     | 
    
         
            +
                    urns
         
     | 
| 
      
 65 
     | 
    
         
            +
                  else
         
     | 
| 
      
 66 
     | 
    
         
            +
                    urns.map { |u|
         
     | 
| 
      
 67 
     | 
    
         
            +
                      {
         
     | 
| 
      
 68 
     | 
    
         
            +
                          urn: u,
         
     | 
| 
      
 69 
     | 
    
         
            +
                          payload: get_payload_for_urn(u)
         
     | 
| 
      
 70 
     | 
    
         
            +
                      }
         
     | 
| 
      
 71 
     | 
    
         
            +
                    }
         
     | 
| 
       55 
72 
     | 
    
         
             
                  end
         
     | 
| 
       56 
     | 
    
         
            -
                  urns
         
     | 
| 
       57 
73 
     | 
    
         
             
                end
         
     | 
| 
       58 
74 
     | 
    
         | 
| 
       59 
75 
     | 
    
         
             
                private
         
     | 
| 
       60 
76 
     | 
    
         | 
| 
       61 
     | 
    
         
            -
                def  
     | 
| 
       62 
     | 
    
         
            -
                   
     | 
| 
       63 
     | 
    
         
            -
             
     | 
| 
       64 
     | 
    
         
            -
                   
     | 
| 
      
 77 
     | 
    
         
            +
                def traverse_object(input, words)
         
     | 
| 
      
 78 
     | 
    
         
            +
                  words ||= Set.new
         
     | 
| 
      
 79 
     | 
    
         
            +
                  examine_value(input, words)
         
     | 
| 
      
 80 
     | 
    
         
            +
                  words
         
     | 
| 
       65 
81 
     | 
    
         
             
                end
         
     | 
| 
       66 
82 
     | 
    
         | 
| 
       67 
83 
     | 
    
         
             
                def examine_value(value, words)
         
     | 
| 
       68 
84 
     | 
    
         
             
                  if value.is_a? Hash
         
     | 
| 
       69 
     | 
    
         
            -
                     
     | 
| 
      
 85 
     | 
    
         
            +
                    value.each do |k, v|
         
     | 
| 
      
 86 
     | 
    
         
            +
                      examine_value(v, words)
         
     | 
| 
      
 87 
     | 
    
         
            +
                    end
         
     | 
| 
       70 
88 
     | 
    
         
             
                  elsif value.is_a? Array
         
     | 
| 
       71 
89 
     | 
    
         
             
                    value.each do |a|
         
     | 
| 
       72 
90 
     | 
    
         
             
                      examine_value(a, words)
         
     | 
| 
         @@ -78,7 +96,7 @@ module Rifle 
     | 
|
| 
       78 
96 
     | 
    
         | 
| 
       79 
97 
     | 
    
         
             
                def get_words_from_text(text)
         
     | 
| 
       80 
98 
     | 
    
         
             
                  return [] if !text.is_a?(String)
         
     | 
| 
       81 
     | 
    
         
            -
                  words = text.downcase.split(/[^a-zA-Z]/).select{|w| w.length >= Rifle.settings.min_word_length}
         
     | 
| 
      
 99 
     | 
    
         
            +
                  words = text.downcase.split(/[^a-zA-Z]/).select { |w| w.length >= Rifle.settings.min_word_length }
         
     | 
| 
       82 
100 
     | 
    
         
             
                  return words - Rifle.settings.ignored_words
         
     | 
| 
       83 
101 
     | 
    
         
             
                end
         
     | 
| 
       84 
102 
     | 
    
         | 
| 
         @@ -87,11 +105,19 @@ module Rifle 
     | 
|
| 
       87 
105 
     | 
    
         
             
                end
         
     | 
| 
       88 
106 
     | 
    
         | 
| 
       89 
107 
     | 
    
         
             
                def save_processed(urn, metaphone)
         
     | 
| 
       90 
     | 
    
         
            -
                  Rifle.settings.redis.sadd("rifle:#{metaphone}", urn)
         
     | 
| 
      
 108 
     | 
    
         
            +
                  Rifle.settings.redis.sadd("rifle:m:#{metaphone}", urn)
         
     | 
| 
      
 109 
     | 
    
         
            +
                end
         
     | 
| 
      
 110 
     | 
    
         
            +
             
     | 
| 
      
 111 
     | 
    
         
            +
                def save_payload(urn, hash)
         
     | 
| 
      
 112 
     | 
    
         
            +
                  Rifle.settings.redis.set("rifle:u:#{urn}", hash.to_json)
         
     | 
| 
       91 
113 
     | 
    
         
             
                end
         
     | 
| 
       92 
114 
     | 
    
         | 
| 
       93 
115 
     | 
    
         
             
                def get_urns_for_metaphone(metaphone)
         
     | 
| 
       94 
     | 
    
         
            -
                  Rifle.settings.redis.smembers("rifle:#{metaphone}")
         
     | 
| 
      
 116 
     | 
    
         
            +
                  Rifle.settings.redis.smembers("rifle:m:#{metaphone}")
         
     | 
| 
      
 117 
     | 
    
         
            +
                end
         
     | 
| 
      
 118 
     | 
    
         
            +
             
     | 
| 
      
 119 
     | 
    
         
            +
                def get_payload_for_urn(urn)
         
     | 
| 
      
 120 
     | 
    
         
            +
                  JSON.parse(Rifle.settings.redis.get("rifle:u:#{urn}"))
         
     | 
| 
       95 
121 
     | 
    
         
             
                end
         
     | 
| 
       96 
122 
     | 
    
         | 
| 
       97 
123 
     | 
    
         
             
              end
         
     | 
    
        data/lib/rifle/engine.rb
    ADDED
    
    
| 
         @@ -0,0 +1,22 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            gem 'resque'
         
     | 
| 
      
 2 
     | 
    
         
            +
            gem 'rest-client'
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            # This simple resque job pings the search server with a payload.
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            class RifleResque
         
     | 
| 
      
 7 
     | 
    
         
            +
              @queue = :rifle
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
              def initialize(urn, payload)
         
     | 
| 
      
 10 
     | 
    
         
            +
                @urn = urn
         
     | 
| 
      
 11 
     | 
    
         
            +
                @payload = payload
         
     | 
| 
      
 12 
     | 
    
         
            +
              end
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
              def store
         
     | 
| 
      
 15 
     | 
    
         
            +
                RestClient.post("#{Rifle.settings.server}/store/#{@urn}", @payload)
         
     | 
| 
      
 16 
     | 
    
         
            +
              end
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
              def self.perform(urn, payload)
         
     | 
| 
      
 19 
     | 
    
         
            +
                h = RifleResque.new(urn, payload)
         
     | 
| 
      
 20 
     | 
    
         
            +
                h.store
         
     | 
| 
      
 21 
     | 
    
         
            +
              end
         
     | 
| 
      
 22 
     | 
    
         
            +
            end
         
     | 
    
        data/lib/rifle/version.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: rifle
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 0.0. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 0.0.2
         
     | 
| 
       5 
5 
     | 
    
         
             
              prerelease: 
         
     | 
| 
       6 
6 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       7 
7 
     | 
    
         
             
            authors:
         
     | 
| 
         @@ -9,7 +9,7 @@ authors: 
     | 
|
| 
       9 
9 
     | 
    
         
             
            autorequire: 
         
     | 
| 
       10 
10 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       11 
11 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       12 
     | 
    
         
            -
            date: 2012-08- 
     | 
| 
      
 12 
     | 
    
         
            +
            date: 2012-08-08 00:00:00.000000000 Z
         
     | 
| 
       13 
13 
     | 
    
         
             
            dependencies:
         
     | 
| 
       14 
14 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       15 
15 
     | 
    
         
             
              name: rails
         
     | 
| 
         @@ -59,6 +59,54 @@ dependencies: 
     | 
|
| 
       59 
59 
     | 
    
         
             
                - - ! '>='
         
     | 
| 
       60 
60 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       61 
61 
     | 
    
         
             
                    version: '0'
         
     | 
| 
      
 62 
     | 
    
         
            +
            - !ruby/object:Gem::Dependency
         
     | 
| 
      
 63 
     | 
    
         
            +
              name: resque
         
     | 
| 
      
 64 
     | 
    
         
            +
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
      
 65 
     | 
    
         
            +
                none: false
         
     | 
| 
      
 66 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 67 
     | 
    
         
            +
                - - ! '>='
         
     | 
| 
      
 68 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 69 
     | 
    
         
            +
                    version: '0'
         
     | 
| 
      
 70 
     | 
    
         
            +
              type: :runtime
         
     | 
| 
      
 71 
     | 
    
         
            +
              prerelease: false
         
     | 
| 
      
 72 
     | 
    
         
            +
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
      
 73 
     | 
    
         
            +
                none: false
         
     | 
| 
      
 74 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 75 
     | 
    
         
            +
                - - ! '>='
         
     | 
| 
      
 76 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 77 
     | 
    
         
            +
                    version: '0'
         
     | 
| 
      
 78 
     | 
    
         
            +
            - !ruby/object:Gem::Dependency
         
     | 
| 
      
 79 
     | 
    
         
            +
              name: rest-client
         
     | 
| 
      
 80 
     | 
    
         
            +
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
      
 81 
     | 
    
         
            +
                none: false
         
     | 
| 
      
 82 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 83 
     | 
    
         
            +
                - - ! '>='
         
     | 
| 
      
 84 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 85 
     | 
    
         
            +
                    version: '0'
         
     | 
| 
      
 86 
     | 
    
         
            +
              type: :runtime
         
     | 
| 
      
 87 
     | 
    
         
            +
              prerelease: false
         
     | 
| 
      
 88 
     | 
    
         
            +
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
      
 89 
     | 
    
         
            +
                none: false
         
     | 
| 
      
 90 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 91 
     | 
    
         
            +
                - - ! '>='
         
     | 
| 
      
 92 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 93 
     | 
    
         
            +
                    version: '0'
         
     | 
| 
      
 94 
     | 
    
         
            +
            - !ruby/object:Gem::Dependency
         
     | 
| 
      
 95 
     | 
    
         
            +
              name: session_off
         
     | 
| 
      
 96 
     | 
    
         
            +
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
      
 97 
     | 
    
         
            +
                none: false
         
     | 
| 
      
 98 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 99 
     | 
    
         
            +
                - - ! '>='
         
     | 
| 
      
 100 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 101 
     | 
    
         
            +
                    version: '0'
         
     | 
| 
      
 102 
     | 
    
         
            +
              type: :runtime
         
     | 
| 
      
 103 
     | 
    
         
            +
              prerelease: false
         
     | 
| 
      
 104 
     | 
    
         
            +
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
      
 105 
     | 
    
         
            +
                none: false
         
     | 
| 
      
 106 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 107 
     | 
    
         
            +
                - - ! '>='
         
     | 
| 
      
 108 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 109 
     | 
    
         
            +
                    version: '0'
         
     | 
| 
       62 
110 
     | 
    
         
             
            description: 
         
     | 
| 
       63 
111 
     | 
    
         
             
            email:
         
     | 
| 
       64 
112 
     | 
    
         
             
            - harry@harrylascelles.com
         
     | 
| 
         @@ -66,7 +114,11 @@ executables: [] 
     | 
|
| 
       66 
114 
     | 
    
         
             
            extensions: []
         
     | 
| 
       67 
115 
     | 
    
         
             
            extra_rdoc_files: []
         
     | 
| 
       68 
116 
     | 
    
         
             
            files:
         
     | 
| 
      
 117 
     | 
    
         
            +
            - app/controllers/application_controller.rb
         
     | 
| 
      
 118 
     | 
    
         
            +
            - app/controllers/searches_controller.rb
         
     | 
| 
      
 119 
     | 
    
         
            +
            - lib/rifle/engine.rb
         
     | 
| 
       69 
120 
     | 
    
         
             
            - lib/rifle/version.rb
         
     | 
| 
      
 121 
     | 
    
         
            +
            - lib/rifle/rifle_resque.rb
         
     | 
| 
       70 
122 
     | 
    
         
             
            - lib/rifle.rb
         
     | 
| 
       71 
123 
     | 
    
         
             
            - README.md
         
     | 
| 
       72 
124 
     | 
    
         
             
            homepage: 
         
     |