rifle 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. data/README.md +1 -0
  2. data/lib/rifle.rb +99 -0
  3. data/lib/rifle/version.rb +3 -0
  4. metadata +97 -0
data/README.md ADDED
@@ -0,0 +1 @@
1
+ # Rifle
data/lib/rifle.rb ADDED
@@ -0,0 +1,99 @@
1
+ require 'set'
2
+ require 'redis'
3
+ require 'text'
4
+
5
+ module Rifle
6
+
7
+ class Settings
8
+ attr_accessor :ignored_words, :min_word_length, :redis
9
+ def ignored_words
10
+ @ignored_words ||= ["the", "and", "you", "that"]
11
+ end
12
+ def min_word_length
13
+ @min_word_length ||= 3
14
+ end
15
+ def redis
16
+ @redis ||= Redis.new
17
+ end
18
+ end
19
+
20
+ @@settings = Settings.new
21
+
22
+ def self.settings
23
+ @@settings
24
+ end
25
+
26
+ def self.process_resource(urn, hash)
27
+ p = Processor.new
28
+ p.index_resource(urn, hash)
29
+ end
30
+
31
+ def self.search(words)
32
+ p = Processor.new
33
+ p.search_for(words)
34
+ end
35
+
36
+ class Processor
37
+
38
+ def index_resource(urn, hash)
39
+ words = Set.new
40
+ traverse_sentences(hash, words)
41
+ metaphones = get_metaphones(words)
42
+ metaphones.each do |metaphone|
43
+ save_processed(urn, metaphone)
44
+ end
45
+ metaphones
46
+ end
47
+
48
+ def search_for(sentence)
49
+ words = get_words_from_text(sentence)
50
+ metaphones = get_metaphones(words)
51
+ urns = Set.new
52
+ metaphones.each do |metaphone|
53
+ new_urns = get_urns_for_metaphone(metaphone)
54
+ urns =urns.merge(new_urns)
55
+ end
56
+ urns
57
+ end
58
+
59
+ private
60
+
61
+ def traverse_sentences(input, words)
62
+ input.each do |key, value|
63
+ examine_value(value, words)
64
+ end
65
+ end
66
+
67
+ def examine_value(value, words)
68
+ if value.is_a? Hash
69
+ traverse_sentences(value, words)
70
+ elsif value.is_a? Array
71
+ value.each do |a|
72
+ examine_value(a, words)
73
+ end
74
+ else
75
+ words.add(get_words_from_text(value))
76
+ end
77
+ end
78
+
79
+ def get_words_from_text(text)
80
+ return [] if !text.is_a?(String)
81
+ words = text.downcase.split(/[^a-zA-Z]/).select{|w| w.length >= Rifle.settings.min_word_length}
82
+ return words - Rifle.settings.ignored_words
83
+ end
84
+
85
+ def get_metaphones(words)
86
+ ::Text::Metaphone.metaphone(words.to_a.join(' ')).split(' ')
87
+ end
88
+
89
+ def save_processed(urn, metaphone)
90
+ Rifle.settings.redis.sadd("rifle:#{metaphone}", urn)
91
+ end
92
+
93
+ def get_urns_for_metaphone(metaphone)
94
+ Rifle.settings.redis.smembers("rifle:#{metaphone}")
95
+ end
96
+
97
+ end
98
+
99
+ end
@@ -0,0 +1,3 @@
1
+ module Rifle
2
+ VERSION = '0.0.1'
3
+ end
metadata ADDED
@@ -0,0 +1,97 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rifle
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Harry Lascelles
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-08-06 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rails
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: redis
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: text
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ description:
63
+ email:
64
+ - harry@harrylascelles.com
65
+ executables: []
66
+ extensions: []
67
+ extra_rdoc_files: []
68
+ files:
69
+ - lib/rifle/version.rb
70
+ - lib/rifle.rb
71
+ - README.md
72
+ homepage:
73
+ licenses: []
74
+ post_install_message:
75
+ rdoc_options: []
76
+ require_paths:
77
+ - lib
78
+ required_ruby_version: !ruby/object:Gem::Requirement
79
+ none: false
80
+ requirements:
81
+ - - ! '>='
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ required_rubygems_version: !ruby/object:Gem::Requirement
85
+ none: false
86
+ requirements:
87
+ - - ! '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ requirements: []
91
+ rubyforge_project:
92
+ rubygems_version: 1.8.24
93
+ signing_key:
94
+ specification_version: 3
95
+ summary: Redis search server
96
+ test_files: []
97
+ has_rdoc: