soulmate 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +5 -0
- data/Gemfile.lock +14 -0
- data/README.markdown +3 -1
- data/Rakefile +38 -2
- data/lib/soulmate/loader.rb +2 -1
- data/lib/soulmate/server.rb +3 -0
- data/lib/soulmate/version.rb +1 -1
- data/soulmate.gemspec +18 -4
- data/test/db/.gitkeep +0 -0
- data/test/samples/venues.json +6 -0
- data/test/test.conf +8 -0
- data/test/test_soulmate.rb +40 -2
- metadata +126 -112
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -6,9 +6,19 @@ GEM
|
|
6
6
|
bundler (~> 1.0.0)
|
7
7
|
git (>= 1.2.5)
|
8
8
|
rake
|
9
|
+
rack (1.2.2)
|
10
|
+
rack-contrib (1.1.0)
|
11
|
+
rack (>= 0.9.1)
|
9
12
|
rake (0.8.7)
|
10
13
|
rcov (0.9.9)
|
14
|
+
redis (2.1.1)
|
11
15
|
shoulda (2.11.3)
|
16
|
+
sinatra (1.2.3)
|
17
|
+
rack (~> 1.1)
|
18
|
+
tilt (>= 1.2.2, < 2.0)
|
19
|
+
tilt (1.2.2)
|
20
|
+
vegas (0.1.8)
|
21
|
+
rack (>= 1.0.0)
|
12
22
|
|
13
23
|
PLATFORMS
|
14
24
|
ruby
|
@@ -16,5 +26,9 @@ PLATFORMS
|
|
16
26
|
DEPENDENCIES
|
17
27
|
bundler (~> 1.0.0)
|
18
28
|
jeweler (~> 1.5.2)
|
29
|
+
rack-contrib
|
19
30
|
rcov
|
31
|
+
redis (~> 2.1.1)
|
20
32
|
shoulda
|
33
|
+
sinatra (~> 1.2.3)
|
34
|
+
vegas (~> 0.1.8)
|
data/README.markdown
CHANGED
@@ -48,6 +48,8 @@ And here's the load command (Soulmate assumes redis is running locally on the de
|
|
48
48
|
|
49
49
|
$ soulmate load venue --redis=redis://localhost:6379/0 < venues.json
|
50
50
|
|
51
|
+
You can also provide an array of strings under the `aliases` key that will also be added to the index for this item.
|
52
|
+
|
51
53
|
### Querying for Data
|
52
54
|
|
53
55
|
Once it's loaded, we can query this data by starting `soulmate-web`:
|
@@ -91,7 +93,7 @@ And viewing the service in your browser: <a href="http://localhost:5678/search?t
|
|
91
93
|
}
|
92
94
|
}
|
93
95
|
|
94
|
-
The `/search` method supports multiple `types` as well as an optional `limit`. For example: `http://localhost:5678/search?types[]=event&types[]=venue&types[]=performer&limit=3&term=yank`.
|
96
|
+
The `/search` method supports multiple `types` as well as an optional `limit`. For example: `http://localhost:5678/search?types[]=event&types[]=venue&types[]=performer&limit=3&term=yank`. You can also add the `callback` parameter to enable JSONP output.
|
95
97
|
|
96
98
|
Contributing to soulmate
|
97
99
|
------------------------
|
data/Rakefile
CHANGED
@@ -45,8 +45,6 @@ Rcov::RcovTask.new do |test|
|
|
45
45
|
test.verbose = true
|
46
46
|
end
|
47
47
|
|
48
|
-
task :default => :test
|
49
|
-
|
50
48
|
require 'rake/rdoctask'
|
51
49
|
Rake::RDocTask.new do |rdoc|
|
52
50
|
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
@@ -56,3 +54,41 @@ Rake::RDocTask.new do |rdoc|
|
|
56
54
|
rdoc.rdoc_files.include('README*')
|
57
55
|
rdoc.rdoc_files.include('lib/**/*.rb')
|
58
56
|
end
|
57
|
+
|
58
|
+
REDIS_DIR = File.expand_path(File.join("..", "test"), __FILE__)
|
59
|
+
REDIS_CNF = File.join(REDIS_DIR, "test.conf")
|
60
|
+
REDIS_PID = File.join(REDIS_DIR, "db", "redis.pid")
|
61
|
+
REDIS_LOCATION = ENV['REDIS_LOCATION']
|
62
|
+
|
63
|
+
task :default => :run
|
64
|
+
|
65
|
+
desc "Run tests and manage server start/stop"
|
66
|
+
task :run => [:start, :test, :stop]
|
67
|
+
|
68
|
+
desc "Run rcov and manage server start/stop"
|
69
|
+
task :rcoverage => [:start, :rcov, :stop]
|
70
|
+
|
71
|
+
desc "Start the Redis server"
|
72
|
+
task :start do
|
73
|
+
redis_running = \
|
74
|
+
begin
|
75
|
+
File.exists?(REDIS_PID) && Process.kill(0, File.read(REDIS_PID).to_i)
|
76
|
+
rescue Errno::ESRCH
|
77
|
+
FileUtils.rm REDIS_PID
|
78
|
+
false
|
79
|
+
end
|
80
|
+
|
81
|
+
if REDIS_LOCATION
|
82
|
+
system "#{REDIS_LOCATION}/redis-server #{REDIS_CNF}" unless redis_running
|
83
|
+
else
|
84
|
+
system "redis-server #{REDIS_CNF}" unless redis_running
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
desc "Stop the Redis server"
|
89
|
+
task :stop do
|
90
|
+
if File.exists?(REDIS_PID)
|
91
|
+
Process.kill "INT", File.read(REDIS_PID).to_i
|
92
|
+
FileUtils.rm REDIS_PID
|
93
|
+
end
|
94
|
+
end
|
data/lib/soulmate/loader.rb
CHANGED
@@ -29,7 +29,8 @@ module Soulmate
|
|
29
29
|
# store the raw data in a separate key to reduce memory usage
|
30
30
|
Soulmate.redis.hset(database, id, JSON.dump(item))
|
31
31
|
|
32
|
-
|
32
|
+
phrase = ([term] + (item["aliases"] || [])).join(' ')
|
33
|
+
prefixes_for_phrase(phrase).uniq.each do |p|
|
33
34
|
Soulmate.redis.sadd(base, p) # remember this prefix in a master set
|
34
35
|
Soulmate.redis.zadd("#{base}:#{p}", score, id) # store the id of this term in the index
|
35
36
|
end
|
data/lib/soulmate/server.rb
CHANGED
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 = %q{soulmate}
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.4"
|
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 = %q{2011-
|
12
|
+
s.date = %q{2011-07-07}
|
13
13
|
s.description = %q{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 = %q{eric@seatgeek.com}
|
15
15
|
s.executables = ["soulmate", "soulmate-web"]
|
@@ -34,13 +34,16 @@ Gem::Specification.new do |s|
|
|
34
34
|
"lib/soulmate/server.rb",
|
35
35
|
"lib/soulmate/version.rb",
|
36
36
|
"soulmate.gemspec",
|
37
|
+
"test/db/.gitkeep",
|
37
38
|
"test/helper.rb",
|
39
|
+
"test/samples/venues.json",
|
40
|
+
"test/test.conf",
|
38
41
|
"test/test_soulmate.rb"
|
39
42
|
]
|
40
43
|
s.homepage = %q{http://github.com/seatgeek/soulmate}
|
41
44
|
s.licenses = ["MIT"]
|
42
45
|
s.require_paths = ["lib"]
|
43
|
-
s.rubygems_version = %q{1.
|
46
|
+
s.rubygems_version = %q{1.6.2}
|
44
47
|
s.summary = %q{Redis-backed service for fast autocompleting - extracted from SeatGeek}
|
45
48
|
s.test_files = [
|
46
49
|
"test/helper.rb",
|
@@ -48,10 +51,13 @@ Gem::Specification.new do |s|
|
|
48
51
|
]
|
49
52
|
|
50
53
|
if s.respond_to? :specification_version then
|
51
|
-
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
52
54
|
s.specification_version = 3
|
53
55
|
|
54
56
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
57
|
+
s.add_runtime_dependency(%q<redis>, ["~> 2.1.1"])
|
58
|
+
s.add_runtime_dependency(%q<rack-contrib>, [">= 0"])
|
59
|
+
s.add_runtime_dependency(%q<vegas>, ["~> 0.1.8"])
|
60
|
+
s.add_runtime_dependency(%q<sinatra>, ["~> 1.2.3"])
|
55
61
|
s.add_development_dependency(%q<shoulda>, [">= 0"])
|
56
62
|
s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
|
57
63
|
s.add_development_dependency(%q<jeweler>, ["~> 1.5.2"])
|
@@ -61,6 +67,10 @@ Gem::Specification.new do |s|
|
|
61
67
|
s.add_runtime_dependency(%q<sinatra>, [">= 1.0"])
|
62
68
|
s.add_runtime_dependency(%q<json>, ["~> 1.4.6"])
|
63
69
|
else
|
70
|
+
s.add_dependency(%q<redis>, ["~> 2.1.1"])
|
71
|
+
s.add_dependency(%q<rack-contrib>, [">= 0"])
|
72
|
+
s.add_dependency(%q<vegas>, ["~> 0.1.8"])
|
73
|
+
s.add_dependency(%q<sinatra>, ["~> 1.2.3"])
|
64
74
|
s.add_dependency(%q<shoulda>, [">= 0"])
|
65
75
|
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
66
76
|
s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
|
@@ -71,6 +81,10 @@ Gem::Specification.new do |s|
|
|
71
81
|
s.add_dependency(%q<json>, ["~> 1.4.6"])
|
72
82
|
end
|
73
83
|
else
|
84
|
+
s.add_dependency(%q<redis>, ["~> 2.1.1"])
|
85
|
+
s.add_dependency(%q<rack-contrib>, [">= 0"])
|
86
|
+
s.add_dependency(%q<vegas>, ["~> 0.1.8"])
|
87
|
+
s.add_dependency(%q<sinatra>, ["~> 1.2.3"])
|
74
88
|
s.add_dependency(%q<shoulda>, [">= 0"])
|
75
89
|
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
76
90
|
s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
|
data/test/db/.gitkeep
ADDED
File without changes
|
@@ -0,0 +1,6 @@
|
|
1
|
+
{"id":1,"term":"Dodger Stadium","score":84,"data":{"url":"\/dodger-stadium-tickets\/","subtitle":"Los Angeles, CA"},"aliases":["Chavez Ravine"]}
|
2
|
+
{"id":28,"term":"Angel Stadium","score":90,"data":{"url":"\/angel-stadium-tickets\/","subtitle":"Anaheim, CA"},"aliases":["Edison International Field of Anaheim"]}
|
3
|
+
{"id":30,"term":"Chase Field ","score":80,"data":{"url":"\/chase-field-tickets\/","subtitle":"Phoenix, AZ"},"aliases":["Bank One Ballpark", "Bank One Stadium"]}
|
4
|
+
{"id":29,"term":"Sun Life Stadium","score":75,"data":{"url":"\/sun-life-stadium-tickets\/","subtitle":"Miami, FL"},"aliases":["Dolphins Stadium","Land Shark Stadium"]}
|
5
|
+
{"id":2,"term":"Turner Field","score":50,"data":{"url":"\/turner-field-tickets\/","subtitle":"Atlanta, GA"}}
|
6
|
+
{"id":3,"term":"Citi Field","score":92,"data":{"url":"\/citi-field-tickets\/","subtitle":"Atlanta, GA"},"aliases":["Shea Stadium"]}
|
data/test/test.conf
ADDED
data/test/test_soulmate.rb
CHANGED
@@ -1,7 +1,45 @@
|
|
1
1
|
require 'helper'
|
2
2
|
|
3
3
|
class TestSoulmate < Test::Unit::TestCase
|
4
|
-
|
5
|
-
|
4
|
+
def test_integration_can_load_values_and_query
|
5
|
+
items = []
|
6
|
+
venues = File.open(File.expand_path(File.dirname(__FILE__)) + '/samples/venues.json', "r")
|
7
|
+
venues.each_line do |venue|
|
8
|
+
items << JSON.parse(venue)
|
9
|
+
end
|
10
|
+
|
11
|
+
items_loaded = Soulmate::Loader.new('venues').load(items)
|
12
|
+
|
13
|
+
assert_equal 6, items_loaded
|
14
|
+
|
15
|
+
matcher = Soulmate::Matcher.new('venues')
|
16
|
+
results = matcher.matches_for_term('stad', :limit => 5)
|
17
|
+
|
18
|
+
assert_equal 5, results.size
|
19
|
+
assert_equal 'Citi Field', results[0]['term']
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_integration_can_load_values_and_query_via_aliases
|
23
|
+
items = []
|
24
|
+
venues = File.open(File.expand_path(File.dirname(__FILE__)) + '/samples/venues.json', "r")
|
25
|
+
venues.each_line do |venue|
|
26
|
+
items << JSON.parse(venue)
|
27
|
+
end
|
28
|
+
|
29
|
+
items_loaded = Soulmate::Loader.new('venues').load(items)
|
30
|
+
|
31
|
+
assert_equal 6, items_loaded
|
32
|
+
|
33
|
+
matcher = Soulmate::Matcher.new('venues')
|
34
|
+
results = matcher.matches_for_term('land shark stadium', :limit => 5)
|
35
|
+
|
36
|
+
assert_equal 1, results.size
|
37
|
+
assert_equal 'Sun Life Stadium', results[0]['term']
|
38
|
+
|
39
|
+
# Make sure we don't get dupes between aliases and the original term
|
40
|
+
# this shouldn't happen due to Redis doing an intersect, but just in case!
|
41
|
+
|
42
|
+
results = matcher.matches_for_term('stadium', :limit => 5)
|
43
|
+
assert_equal 5, results.size
|
6
44
|
end
|
7
45
|
end
|
metadata
CHANGED
@@ -1,147 +1,162 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: soulmate
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
|
6
|
-
- 0
|
7
|
-
- 0
|
8
|
-
- 3
|
9
|
-
version: 0.0.3
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.4
|
5
|
+
prerelease:
|
10
6
|
platform: ruby
|
11
|
-
authors:
|
7
|
+
authors:
|
12
8
|
- Eric Waller
|
13
9
|
autorequire:
|
14
10
|
bindir: bin
|
15
11
|
cert_chain: []
|
16
|
-
|
17
|
-
date: 2011-02-14 00:00:00 -05:00
|
12
|
+
date: 2011-07-07 00:00:00.000000000 -04:00
|
18
13
|
default_executable:
|
19
|
-
dependencies:
|
20
|
-
- !ruby/object:Gem::Dependency
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: redis
|
17
|
+
requirement: &2164813260 !ruby/object:Gem::Requirement
|
18
|
+
none: false
|
19
|
+
requirements:
|
20
|
+
- - ~>
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 2.1.1
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: *2164813260
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: rack-contrib
|
28
|
+
requirement: &2164811620 !ruby/object:Gem::Requirement
|
29
|
+
none: false
|
30
|
+
requirements:
|
31
|
+
- - ! '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: *2164811620
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: vegas
|
39
|
+
requirement: &2164810860 !ruby/object:Gem::Requirement
|
40
|
+
none: false
|
41
|
+
requirements:
|
42
|
+
- - ~>
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: 0.1.8
|
45
|
+
type: :runtime
|
46
|
+
prerelease: false
|
47
|
+
version_requirements: *2164810860
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: sinatra
|
50
|
+
requirement: &2164809840 !ruby/object:Gem::Requirement
|
51
|
+
none: false
|
52
|
+
requirements:
|
53
|
+
- - ~>
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: 1.2.3
|
56
|
+
type: :runtime
|
57
|
+
prerelease: false
|
58
|
+
version_requirements: *2164809840
|
59
|
+
- !ruby/object:Gem::Dependency
|
21
60
|
name: shoulda
|
22
|
-
requirement: &
|
61
|
+
requirement: &2164808840 !ruby/object:Gem::Requirement
|
23
62
|
none: false
|
24
|
-
requirements:
|
25
|
-
- -
|
26
|
-
- !ruby/object:Gem::Version
|
27
|
-
|
28
|
-
- 0
|
29
|
-
version: "0"
|
63
|
+
requirements:
|
64
|
+
- - ! '>='
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: '0'
|
30
67
|
type: :development
|
31
68
|
prerelease: false
|
32
|
-
version_requirements: *
|
33
|
-
- !ruby/object:Gem::Dependency
|
69
|
+
version_requirements: *2164808840
|
70
|
+
- !ruby/object:Gem::Dependency
|
34
71
|
name: bundler
|
35
|
-
requirement: &
|
72
|
+
requirement: &2164807780 !ruby/object:Gem::Requirement
|
36
73
|
none: false
|
37
|
-
requirements:
|
74
|
+
requirements:
|
38
75
|
- - ~>
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
segments:
|
41
|
-
- 1
|
42
|
-
- 0
|
43
|
-
- 0
|
76
|
+
- !ruby/object:Gem::Version
|
44
77
|
version: 1.0.0
|
45
78
|
type: :development
|
46
79
|
prerelease: false
|
47
|
-
version_requirements: *
|
48
|
-
- !ruby/object:Gem::Dependency
|
80
|
+
version_requirements: *2164807780
|
81
|
+
- !ruby/object:Gem::Dependency
|
49
82
|
name: jeweler
|
50
|
-
requirement: &
|
83
|
+
requirement: &2164807160 !ruby/object:Gem::Requirement
|
51
84
|
none: false
|
52
|
-
requirements:
|
85
|
+
requirements:
|
53
86
|
- - ~>
|
54
|
-
- !ruby/object:Gem::Version
|
55
|
-
segments:
|
56
|
-
- 1
|
57
|
-
- 5
|
58
|
-
- 2
|
87
|
+
- !ruby/object:Gem::Version
|
59
88
|
version: 1.5.2
|
60
89
|
type: :development
|
61
90
|
prerelease: false
|
62
|
-
version_requirements: *
|
63
|
-
- !ruby/object:Gem::Dependency
|
91
|
+
version_requirements: *2164807160
|
92
|
+
- !ruby/object:Gem::Dependency
|
64
93
|
name: rcov
|
65
|
-
requirement: &
|
94
|
+
requirement: &2164806540 !ruby/object:Gem::Requirement
|
66
95
|
none: false
|
67
|
-
requirements:
|
68
|
-
- -
|
69
|
-
- !ruby/object:Gem::Version
|
70
|
-
|
71
|
-
- 0
|
72
|
-
version: "0"
|
96
|
+
requirements:
|
97
|
+
- - ! '>='
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: '0'
|
73
100
|
type: :development
|
74
101
|
prerelease: false
|
75
|
-
version_requirements: *
|
76
|
-
- !ruby/object:Gem::Dependency
|
102
|
+
version_requirements: *2164806540
|
103
|
+
- !ruby/object:Gem::Dependency
|
77
104
|
name: redis
|
78
|
-
requirement: &
|
105
|
+
requirement: &2164805780 !ruby/object:Gem::Requirement
|
79
106
|
none: false
|
80
|
-
requirements:
|
81
|
-
- -
|
82
|
-
- !ruby/object:Gem::Version
|
83
|
-
|
84
|
-
- 2
|
85
|
-
- 0
|
86
|
-
version: "2.0"
|
107
|
+
requirements:
|
108
|
+
- - ! '>='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '2.0'
|
87
111
|
type: :runtime
|
88
112
|
prerelease: false
|
89
|
-
version_requirements: *
|
90
|
-
- !ruby/object:Gem::Dependency
|
113
|
+
version_requirements: *2164805780
|
114
|
+
- !ruby/object:Gem::Dependency
|
91
115
|
name: vegas
|
92
|
-
requirement: &
|
116
|
+
requirement: &2164805020 !ruby/object:Gem::Requirement
|
93
117
|
none: false
|
94
|
-
requirements:
|
95
|
-
- -
|
96
|
-
- !ruby/object:Gem::Version
|
97
|
-
segments:
|
98
|
-
- 0
|
99
|
-
- 1
|
100
|
-
- 0
|
118
|
+
requirements:
|
119
|
+
- - ! '>='
|
120
|
+
- !ruby/object:Gem::Version
|
101
121
|
version: 0.1.0
|
102
122
|
type: :runtime
|
103
123
|
prerelease: false
|
104
|
-
version_requirements: *
|
105
|
-
- !ruby/object:Gem::Dependency
|
124
|
+
version_requirements: *2164805020
|
125
|
+
- !ruby/object:Gem::Dependency
|
106
126
|
name: sinatra
|
107
|
-
requirement: &
|
127
|
+
requirement: &2164804440 !ruby/object:Gem::Requirement
|
108
128
|
none: false
|
109
|
-
requirements:
|
110
|
-
- -
|
111
|
-
- !ruby/object:Gem::Version
|
112
|
-
|
113
|
-
- 1
|
114
|
-
- 0
|
115
|
-
version: "1.0"
|
129
|
+
requirements:
|
130
|
+
- - ! '>='
|
131
|
+
- !ruby/object:Gem::Version
|
132
|
+
version: '1.0'
|
116
133
|
type: :runtime
|
117
134
|
prerelease: false
|
118
|
-
version_requirements: *
|
119
|
-
- !ruby/object:Gem::Dependency
|
135
|
+
version_requirements: *2164804440
|
136
|
+
- !ruby/object:Gem::Dependency
|
120
137
|
name: json
|
121
|
-
requirement: &
|
138
|
+
requirement: &2164803800 !ruby/object:Gem::Requirement
|
122
139
|
none: false
|
123
|
-
requirements:
|
140
|
+
requirements:
|
124
141
|
- - ~>
|
125
|
-
- !ruby/object:Gem::Version
|
126
|
-
segments:
|
127
|
-
- 1
|
128
|
-
- 4
|
129
|
-
- 6
|
142
|
+
- !ruby/object:Gem::Version
|
130
143
|
version: 1.4.6
|
131
144
|
type: :runtime
|
132
145
|
prerelease: false
|
133
|
-
version_requirements: *
|
134
|
-
description: Soulmate is a tool to help solve the common problem of developing a fast
|
146
|
+
version_requirements: *2164803800
|
147
|
+
description: Soulmate is a tool to help solve the common problem of developing a fast
|
148
|
+
autocomplete feature. It uses Redis's sorted sets to build an index of partial words
|
149
|
+
and corresponding top matches, and provides a simple sinatra app to query them.
|
150
|
+
Soulmate finishes your sentences.
|
135
151
|
email: eric@seatgeek.com
|
136
|
-
executables:
|
152
|
+
executables:
|
137
153
|
- soulmate
|
138
154
|
- soulmate-web
|
139
155
|
extensions: []
|
140
|
-
|
141
|
-
extra_rdoc_files:
|
156
|
+
extra_rdoc_files:
|
142
157
|
- LICENSE.txt
|
143
158
|
- README.markdown
|
144
|
-
files:
|
159
|
+
files:
|
145
160
|
- .document
|
146
161
|
- Gemfile
|
147
162
|
- Gemfile.lock
|
@@ -158,41 +173,40 @@ files:
|
|
158
173
|
- lib/soulmate/server.rb
|
159
174
|
- lib/soulmate/version.rb
|
160
175
|
- soulmate.gemspec
|
176
|
+
- test/db/.gitkeep
|
161
177
|
- test/helper.rb
|
178
|
+
- test/samples/venues.json
|
179
|
+
- test/test.conf
|
162
180
|
- test/test_soulmate.rb
|
163
181
|
has_rdoc: true
|
164
182
|
homepage: http://github.com/seatgeek/soulmate
|
165
|
-
licenses:
|
183
|
+
licenses:
|
166
184
|
- MIT
|
167
185
|
post_install_message:
|
168
186
|
rdoc_options: []
|
169
|
-
|
170
|
-
require_paths:
|
187
|
+
require_paths:
|
171
188
|
- lib
|
172
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
189
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
173
190
|
none: false
|
174
|
-
requirements:
|
175
|
-
- -
|
176
|
-
- !ruby/object:Gem::Version
|
177
|
-
|
178
|
-
segments:
|
191
|
+
requirements:
|
192
|
+
- - ! '>='
|
193
|
+
- !ruby/object:Gem::Version
|
194
|
+
version: '0'
|
195
|
+
segments:
|
179
196
|
- 0
|
180
|
-
|
181
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
197
|
+
hash: 1504170323034549202
|
198
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
182
199
|
none: false
|
183
|
-
requirements:
|
184
|
-
- -
|
185
|
-
- !ruby/object:Gem::Version
|
186
|
-
|
187
|
-
- 0
|
188
|
-
version: "0"
|
200
|
+
requirements:
|
201
|
+
- - ! '>='
|
202
|
+
- !ruby/object:Gem::Version
|
203
|
+
version: '0'
|
189
204
|
requirements: []
|
190
|
-
|
191
205
|
rubyforge_project:
|
192
|
-
rubygems_version: 1.
|
206
|
+
rubygems_version: 1.6.2
|
193
207
|
signing_key:
|
194
208
|
specification_version: 3
|
195
209
|
summary: Redis-backed service for fast autocompleting - extracted from SeatGeek
|
196
|
-
test_files:
|
210
|
+
test_files:
|
197
211
|
- test/helper.rb
|
198
212
|
- test/test_soulmate.rb
|