rifle 0.0.1

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.
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: