soulmate 1.0.0 → 1.1.0
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/Gemfile +1 -1
- data/README.markdown +8 -0
- data/lib/soulmate.rb +2 -35
- data/lib/soulmate/config.rb +52 -0
- data/lib/soulmate/helpers.rb +1 -1
- data/lib/soulmate/loader.rb +1 -1
- data/lib/soulmate/matcher.rb +3 -3
- data/lib/soulmate/version.rb +1 -1
- data/soulmate.gemspec +7 -6
- data/test/test_soulmate.rb +3 -1
- metadata +7 -6
data/Gemfile
CHANGED
data/README.markdown
CHANGED
@@ -110,6 +110,14 @@ Add this to gemfile:
|
|
110
110
|
|
111
111
|
Then you can query soulmate at the /sm url, for example: http://localhost:3000/sm/search?types[]=venues&limit=6&term=kitten
|
112
112
|
|
113
|
+
You can also config your redis instance:
|
114
|
+
|
115
|
+
# config/initializers/soulmate.rb
|
116
|
+
|
117
|
+
Soulmate.redis = 'redis://127.0.0.1:6379/0'
|
118
|
+
# or you can asign an existing instance of Redis, Redis::Namespace, etc.
|
119
|
+
# Soulmate.redis = $redis
|
120
|
+
|
113
121
|
### Rendering an autocompleter
|
114
122
|
|
115
123
|
Soulmate doesn't include any client-side code necessary to render an autocompleter, but Mitch Crowe put together a pretty cool looking jquery plugin designed for exactly that: <a href="https://github.com/mcrowe/soulmate.js">soulmate.js</a>.
|
data/lib/soulmate.rb
CHANGED
@@ -1,45 +1,12 @@
|
|
1
|
-
require 'uri'
|
2
1
|
require 'multi_json'
|
3
|
-
require 'redis'
|
4
2
|
|
5
3
|
require 'soulmate/version'
|
6
4
|
require 'soulmate/helpers'
|
7
5
|
require 'soulmate/base'
|
8
6
|
require 'soulmate/matcher'
|
9
7
|
require 'soulmate/loader'
|
8
|
+
require 'soulmate/config'
|
10
9
|
|
11
10
|
module Soulmate
|
12
|
-
|
13
|
-
extend self
|
14
|
-
|
15
|
-
MIN_COMPLETE = 2
|
16
|
-
DEFAULT_STOP_WORDS = ["vs", "at", "the"]
|
17
|
-
|
18
|
-
def redis=(url)
|
19
|
-
@redis = nil
|
20
|
-
@redis_url = url
|
21
|
-
redis
|
22
|
-
end
|
23
|
-
|
24
|
-
def redis
|
25
|
-
@redis ||= (
|
26
|
-
url = URI(@redis_url || ENV["REDIS_URL"] || "redis://127.0.0.1:6379/0")
|
27
|
-
|
28
|
-
::Redis.new({
|
29
|
-
:host => url.host,
|
30
|
-
:port => url.port,
|
31
|
-
:db => url.path[1..-1],
|
32
|
-
:password => url.password
|
33
|
-
})
|
34
|
-
)
|
35
|
-
end
|
36
|
-
|
37
|
-
def stop_words
|
38
|
-
@stop_words ||= DEFAULT_STOP_WORDS
|
39
|
-
end
|
40
|
-
|
41
|
-
def stop_words=(arr)
|
42
|
-
@stop_words = Array(arr).flatten
|
43
|
-
end
|
44
|
-
|
11
|
+
extend Config
|
45
12
|
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'uri'
|
2
|
+
require 'redis'
|
3
|
+
|
4
|
+
module Soulmate
|
5
|
+
module Config
|
6
|
+
DEFAULT_MIN_COMPLETE = 2
|
7
|
+
DEFAULT_STOP_WORDS = ["vs", "at", "the"]
|
8
|
+
|
9
|
+
attr_writer :min_complete
|
10
|
+
|
11
|
+
def min_complete
|
12
|
+
@min_complete ||= DEFAULT_MIN_COMPLETE
|
13
|
+
end
|
14
|
+
|
15
|
+
# Accepts:
|
16
|
+
# 1. A Redis URL String 'redis://host:port/db'
|
17
|
+
# 2. An existing instance of Redis, Redis::Namespace, etc.
|
18
|
+
def redis=(server)
|
19
|
+
if server.is_a?(String)
|
20
|
+
@redis = nil
|
21
|
+
@redis_url = server
|
22
|
+
else
|
23
|
+
@redis = server
|
24
|
+
end
|
25
|
+
|
26
|
+
redis
|
27
|
+
end
|
28
|
+
|
29
|
+
# Returns the current Redis connection. If none has been created, will
|
30
|
+
# create a new one.
|
31
|
+
def redis
|
32
|
+
@redis ||= (
|
33
|
+
url = URI(@redis_url || ENV["REDIS_URL"] || "redis://127.0.0.1:6379/0")
|
34
|
+
|
35
|
+
::Redis.new({
|
36
|
+
:host => url.host,
|
37
|
+
:port => url.port,
|
38
|
+
:db => url.path[1..-1],
|
39
|
+
:password => url.password
|
40
|
+
})
|
41
|
+
)
|
42
|
+
end
|
43
|
+
|
44
|
+
def stop_words
|
45
|
+
@stop_words ||= DEFAULT_STOP_WORDS
|
46
|
+
end
|
47
|
+
|
48
|
+
def stop_words=(arr)
|
49
|
+
@stop_words = Array(arr).flatten
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
data/lib/soulmate/helpers.rb
CHANGED
data/lib/soulmate/loader.rb
CHANGED
data/lib/soulmate/matcher.rb
CHANGED
@@ -6,14 +6,14 @@ module Soulmate
|
|
6
6
|
options = { :limit => 5, :cache => true }.merge(options)
|
7
7
|
|
8
8
|
words = normalize(term).split(' ').reject do |w|
|
9
|
-
w.size <
|
9
|
+
w.size < Soulmate.min_complete or Soulmate.stop_words.include?(w)
|
10
10
|
end.sort
|
11
11
|
|
12
12
|
return [] if words.empty?
|
13
13
|
|
14
14
|
cachekey = "#{cachebase}:" + words.join('|')
|
15
15
|
|
16
|
-
if !options[:cache] || !Soulmate.redis.exists(cachekey)
|
16
|
+
if !options[:cache] || !Soulmate.redis.exists(cachekey) || Soulmate.redis.exists(cachekey) == 0
|
17
17
|
interkeys = words.map { |w| "#{base}:#{w}" }
|
18
18
|
Soulmate.redis.zinterstore(cachekey, interkeys)
|
19
19
|
Soulmate.redis.expire(cachekey, 10 * 60) # expire after 10 minutes
|
@@ -29,4 +29,4 @@ module Soulmate
|
|
29
29
|
end
|
30
30
|
end
|
31
31
|
end
|
32
|
-
end
|
32
|
+
end
|
data/lib/soulmate/version.rb
CHANGED
data/soulmate.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "soulmate"
|
8
|
-
s.version = "1.
|
8
|
+
s.version = "1.1.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Eric Waller"]
|
12
|
-
s.date = "
|
12
|
+
s.date = "2014-05-15"
|
13
13
|
s.description = "Soulmate is a tool to help solve the common problem of developing a fast autocomplete feature. It uses Redis's sorted sets to build an index of partial words and corresponding top matches, and provides a simple sinatra app to query them. Soulmate finishes your sentences."
|
14
14
|
s.email = "eric@seatgeek.com"
|
15
15
|
s.executables = ["soulmate", "soulmate-web"]
|
@@ -27,6 +27,7 @@ Gem::Specification.new do |s|
|
|
27
27
|
"bin/soulmate-web",
|
28
28
|
"lib/soulmate.rb",
|
29
29
|
"lib/soulmate/base.rb",
|
30
|
+
"lib/soulmate/config.rb",
|
30
31
|
"lib/soulmate/helpers.rb",
|
31
32
|
"lib/soulmate/loader.rb",
|
32
33
|
"lib/soulmate/matcher.rb",
|
@@ -43,14 +44,14 @@ Gem::Specification.new do |s|
|
|
43
44
|
s.homepage = "http://github.com/seatgeek/soulmate"
|
44
45
|
s.licenses = ["MIT"]
|
45
46
|
s.require_paths = ["lib"]
|
46
|
-
s.rubygems_version = "1.8.
|
47
|
+
s.rubygems_version = "1.8.23.2"
|
47
48
|
s.summary = "Redis-backed service for fast autocompleting - extracted from SeatGeek"
|
48
49
|
|
49
50
|
if s.respond_to? :specification_version then
|
50
51
|
s.specification_version = 3
|
51
52
|
|
52
53
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
53
|
-
s.add_runtime_dependency(%q<redis>, [">=
|
54
|
+
s.add_runtime_dependency(%q<redis>, [">= 3.0"])
|
54
55
|
s.add_runtime_dependency(%q<vegas>, [">= 0.1.0"])
|
55
56
|
s.add_runtime_dependency(%q<sinatra>, [">= 1.0"])
|
56
57
|
s.add_runtime_dependency(%q<multi_json>, [">= 1.0"])
|
@@ -58,7 +59,7 @@ Gem::Specification.new do |s|
|
|
58
59
|
s.add_development_dependency(%q<bundler>, ["~> 1.0"])
|
59
60
|
s.add_development_dependency(%q<jeweler>, ["~> 1.5"])
|
60
61
|
else
|
61
|
-
s.add_dependency(%q<redis>, [">=
|
62
|
+
s.add_dependency(%q<redis>, [">= 3.0"])
|
62
63
|
s.add_dependency(%q<vegas>, [">= 0.1.0"])
|
63
64
|
s.add_dependency(%q<sinatra>, [">= 1.0"])
|
64
65
|
s.add_dependency(%q<multi_json>, [">= 1.0"])
|
@@ -67,7 +68,7 @@ Gem::Specification.new do |s|
|
|
67
68
|
s.add_dependency(%q<jeweler>, ["~> 1.5"])
|
68
69
|
end
|
69
70
|
else
|
70
|
-
s.add_dependency(%q<redis>, [">=
|
71
|
+
s.add_dependency(%q<redis>, [">= 3.0"])
|
71
72
|
s.add_dependency(%q<vegas>, [">= 0.1.0"])
|
72
73
|
s.add_dependency(%q<sinatra>, [">= 1.0"])
|
73
74
|
s.add_dependency(%q<multi_json>, [">= 1.0"])
|
data/test/test_soulmate.rb
CHANGED
@@ -108,7 +108,9 @@ class TestSoulmate < Test::Unit::TestCase
|
|
108
108
|
assert_equal ["te", "tes", "test", "testi", "testin", "th", "thi", "this"], loader.prefixes_for_phrase("testin' this")
|
109
109
|
assert_equal ["te", "tes", "test"], loader.prefixes_for_phrase("test test")
|
110
110
|
assert_equal ["so", "sou", "soul", "soulm", "soulma", "soulmat", "soulmate"], loader.prefixes_for_phrase("SoUlmATE")
|
111
|
-
|
112
111
|
assert_equal ['测试', '测试中', '测试中文', 'te', 'tes', 'test'], loader.prefixes_for_phrase('测试中文 test')
|
112
|
+
|
113
|
+
Soulmate.min_complete = 4
|
114
|
+
assert_equal ['同华东生', '同华东生产', '同华东生产队', 'abcd', 'abcde'], loader.prefixes_for_phrase('同华东生产队 abcde')
|
113
115
|
end
|
114
116
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: soulmate
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
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:
|
12
|
+
date: 2014-05-15 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: redis
|
@@ -18,7 +18,7 @@ dependencies:
|
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: '
|
21
|
+
version: '3.0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -26,7 +26,7 @@ dependencies:
|
|
26
26
|
requirements:
|
27
27
|
- - ! '>='
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version: '
|
29
|
+
version: '3.0'
|
30
30
|
- !ruby/object:Gem::Dependency
|
31
31
|
name: vegas
|
32
32
|
requirement: !ruby/object:Gem::Requirement
|
@@ -145,6 +145,7 @@ files:
|
|
145
145
|
- bin/soulmate-web
|
146
146
|
- lib/soulmate.rb
|
147
147
|
- lib/soulmate/base.rb
|
148
|
+
- lib/soulmate/config.rb
|
148
149
|
- lib/soulmate/helpers.rb
|
149
150
|
- lib/soulmate/loader.rb
|
150
151
|
- lib/soulmate/matcher.rb
|
@@ -172,7 +173,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
172
173
|
version: '0'
|
173
174
|
segments:
|
174
175
|
- 0
|
175
|
-
hash:
|
176
|
+
hash: 3570037129997399612
|
176
177
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
177
178
|
none: false
|
178
179
|
requirements:
|
@@ -181,7 +182,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
181
182
|
version: '0'
|
182
183
|
requirements: []
|
183
184
|
rubyforge_project:
|
184
|
-
rubygems_version: 1.8.
|
185
|
+
rubygems_version: 1.8.23.2
|
185
186
|
signing_key:
|
186
187
|
specification_version: 3
|
187
188
|
summary: Redis-backed service for fast autocompleting - extracted from SeatGeek
|